test: parallelize test-without-async-context-frame correctly

It previously re-einvented the pattern matching that's already
supported by test.py, and was running the tests one by one,
which can lead to time out on slower machines.
This move it to sequential and use wildcard
support in test.py to correctly parallelize the tests.

PR-URL: https://github.com/nodejs/node/pull/60273
Fixes: https://github.com/nodejs/node/issues/60268
Reviewed-By: Luigi Pinca <luigipinca@gmail.com>
Reviewed-By: Yagiz Nizipli <yagiz@nizipli.com>
Reviewed-By: Chemi Atlow <chemi@atlow.co.il>
This commit is contained in:
Joyee Cheung 2025-10-18 00:40:34 +02:00 committed by GitHub
parent 8429d9a40b
commit 70c04c7fd8
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 24 additions and 64 deletions

View File

@ -1,64 +0,0 @@
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,
`--mode=${process.features.debug ? 'debug' : 'release'}`,
`--shell=${process.execPath}`,
'--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}`);
});
}
});

View File

@ -0,0 +1,24 @@
import { isWindows } from '../common/index.mjs';
import { spawn } from 'node:child_process';
import { once } from 'node:events';
import { fileURLToPath } from 'node:url';
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 proc = spawn(python, [
testRunner,
`--mode=${process.features.debug ? 'debug' : 'release'}`,
`--shell=${process.execPath}`,
'--node-args=--no-async-context-frame',
'*/test-async-local-storage-*',
], {
stdio: ['inherit', 'inherit', 'inherit'],
});
const [code] = await once(proc, 'exit');
strictEqual(code, 0);