import { isWindows } from '../common/index.mjs'; import { spawn } from 'node:child_process'; import { once } from 'node:events'; import { opendir } from 'node:fs/promises'; import { fileURLToPath } from 'node:url'; import { describe, it } from 'node:test'; import { sep } from 'node:path'; import { strictEqual } from 'node:assert'; const python = process.env.PYTHON || (isWindows ? 'python' : 'python3'); const testRunner = fileURLToPath( new URL('../../tools/test.py', import.meta.url) ); const setNames = ['async-hooks', 'parallel']; // Get all test names for each set const testSets = await Promise.all(setNames.map(async (name) => { const path = fileURLToPath(new URL(`../${name}`, import.meta.url)); const dir = await opendir(path); const tests = []; for await (const entry of dir) { if (entry.name.startsWith('test-async-local-storage-')) { tests.push(entry.name); } } return { name, tests }; })); // Merge test sets with set name prefix const tests = testSets.reduce((m, v) => { for (const test of v.tests) { m.push(`${v.name}${sep}${test}`); } return m; }, []); describe('without AsyncContextFrame', { // TODO(qard): I think high concurrency causes memory problems on Windows // concurrency: tests.length }, () => { for (const test of tests) { it(test, async () => { const proc = spawn(python, [ testRunner, '--node-args=--no-async-context-frame', test, ], { stdio: ['ignore', 'ignore', 'inherit'], }); const [code] = await once(proc, 'exit'); strictEqual(code, 0, `Test ${test} failed with exit code ${code}`); }); } });