From d825a35e18c6abaf7c45b03cf805461e94a37da6 Mon Sep 17 00:00:00 2001 From: bholmesdev Date: Tue, 12 Jul 2022 12:33:00 -0400 Subject: [PATCH] Revert "wip: what if we just... didn't have a memory test" This reverts commit 173729dbdc685e52881fc3333487b8f744add55f. --- scripts/memory/index.js | 79 +++++++++++++++++++++++ scripts/memory/mk.js | 21 ++++++ scripts/memory/project/.gitkeep | 0 scripts/memory/project/src/pages/.gitkeep | 0 4 files changed, 100 insertions(+) create mode 100644 scripts/memory/index.js create mode 100644 scripts/memory/mk.js create mode 100644 scripts/memory/project/.gitkeep create mode 100644 scripts/memory/project/src/pages/.gitkeep diff --git a/scripts/memory/index.js b/scripts/memory/index.js new file mode 100644 index 0000000000..30cc1c0f2a --- /dev/null +++ b/scripts/memory/index.js @@ -0,0 +1,79 @@ +import { fileURLToPath } from 'url'; +import v8 from 'v8'; +import dev from '../../packages/astro/dist/core/dev/index.js'; +import { loadConfig } from '../../packages/astro/dist/core/config.js'; +import prettyBytes from 'pretty-bytes'; + +if (!global.gc) { + console.error('ERROR: Node must be run with --expose-gc'); + process.exit(1); +} + +const isCI = process.argv.includes('--ci'); + +/** URL directory containing the entire project. */ +const projDir = new URL('./project/', import.meta.url); + +let config = await loadConfig({ + cwd: fileURLToPath(projDir), +}); + +const telemetry = { + record() { + return Promise.resolve(); + }, +}; +const server = await dev(config, { logging: { level: 'error' }, telemetry }); + +// Prime the server so initial memory is created +await fetch(`http://localhost:3000/page-0`); + +async function run() { + for (let i = 0; i < 100; i++) { + let path = `/page-${i}`; + await fetch(`http://localhost:3000${path}`); + } +} + +global.gc(); +const startSize = v8.getHeapStatistics().used_heap_size; + +// HUMAN mode: Runs forever. Optimized for accurate results on each snapshot Slower than CI. +if (!isCI) { + console.log( + `Greetings, human. This test will run forever. Run with the "--ci" flag to finish with a result.` + ); + let i = 1; + while (i++) { + await run(); + global.gc(); + const checkpoint = v8.getHeapStatistics().used_heap_size; + console.log(`Snapshot ${String(i).padStart(3, '0')}: ${(checkpoint / startSize) * 100}%`); + } +} + +// CI mode: Runs 100 times. Optimized for speed with an accurate final result. +for (let i = 0; i < 100; i++) { + await run(); + const checkpoint = v8.getHeapStatistics().used_heap_size; + console.log(`Estimate ${String(i).padStart(3, '0')}/100: ${(checkpoint / startSize) * 100}%`); +} + +console.log(`Test complete. Running final garbage collection...`); +global.gc(); +const endSize = v8.getHeapStatistics().used_heap_size; + +// If the trailing average is higher than the median, see if it's more than 5% higher +let percentage = endSize / startSize; +const TEST_THRESHOLD = 1.5; +const isPass = percentage < TEST_THRESHOLD; +console.log(``); +console.log(`Result: ${isPass ? 'PASS' : 'FAIL'} (${percentage * 100}%)`); +console.log( + `Memory usage began at ${prettyBytes(startSize)} and finished at ${prettyBytes(endSize)}.` +); +console.log(`The threshold for a probable memory leak is ${TEST_THRESHOLD * 100}%`); +console.log(``); +console.log(`Exiting...`); +await server.stop(); +process.exit(isPass ? 0 : 1); diff --git a/scripts/memory/mk.js b/scripts/memory/mk.js new file mode 100644 index 0000000000..44cbe52778 --- /dev/null +++ b/scripts/memory/mk.js @@ -0,0 +1,21 @@ +import fs from 'fs'; + +const base = new URL('./project/', import.meta.url); +const pages = new URL('./src/pages/', base); + +await fs.promises.writeFile(new URL('./package.json', base), `{ + "name": "@test/smoke", + "version": "0.0.0", + "private": true, + "dependencies": { + "astro": "workspace:*" + } +}`); + +for (let i = 0; i < 100; i++) { + let content = `--- +const i = ${i}; +--- +{i}`; + await fs.promises.writeFile(new URL(`./page-${i}.astro`, pages), content, 'utf-8'); +} diff --git a/scripts/memory/project/.gitkeep b/scripts/memory/project/.gitkeep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/scripts/memory/project/src/pages/.gitkeep b/scripts/memory/project/src/pages/.gitkeep new file mode 100644 index 0000000000..e69de29bb2