test: do not set concurrency on parallelized runs

Our CI already run test files in parallel, having `node:test` spawns
child processes concurrently could lead to oversubscribing the CI
machine. This commit sets the `concurrency` depending
on the presence of `TEST_PARALLEL` in the env, so running the test
file individually still spawns child processes concurrently, and
running the whole test suite does not oversubscribe the machine.

PR-URL: https://github.com/nodejs/node/pull/52177
Reviewed-By: Vinícius Lourenço Claro Cardoso <contact@viniciusl.com.br>
Reviewed-By: Luigi Pinca <luigipinca@gmail.com>
Reviewed-By: Marco Ippolito <marcoippolito54@gmail.com>
This commit is contained in:
Antoine du Hamel 2024-03-23 22:11:28 +01:00 committed by GitHub
parent f6996ee150
commit bae14b7914
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
47 changed files with 79 additions and 67 deletions

View File

@ -15,7 +15,7 @@ const pjson = path.resolve(
); );
describe('CJS ↔︎ ESM interop warnings', { concurrency: true }, () => { describe('CJS ↔︎ ESM interop warnings', { concurrency: !process.env.TEST_PARALLEL }, () => {
it(async () => { it(async () => {
const required = path.resolve( const required = path.resolve(

View File

@ -7,7 +7,7 @@ const { execPath } = require('node:process');
const { describe, it } = require('node:test'); const { describe, it } = require('node:test');
describe('ESM: importing CJS', { concurrency: true }, () => { describe('ESM: importing CJS', { concurrency: !process.env.TEST_PARALLEL }, () => {
it('should support valid CJS exports', async () => { it('should support valid CJS exports', async () => {
const validEntry = fixtures.path('/es-modules/cjs-exports.mjs'); const validEntry = fixtures.path('/es-modules/cjs-exports.mjs');
const { code, signal, stdout } = await spawnPromisified(execPath, [validEntry]); const { code, signal, stdout } = await spawnPromisified(execPath, [validEntry]);

View File

@ -19,7 +19,7 @@ const mustNotIncludeMessage = {
includeNote: false, includeNote: false,
}; };
describe('ESM: Errors for unexpected exports', { concurrency: true }, () => { describe('ESM: Errors for unexpected exports', { concurrency: !process.env.TEST_PARALLEL }, () => {
for ( for (
const { errorNeedle, filePath, getMessage, includeNote } const { errorNeedle, filePath, getMessage, includeNote }
of [ of [

View File

@ -4,8 +4,8 @@ import { spawn } from 'node:child_process';
import { describe, it } from 'node:test'; import { describe, it } from 'node:test';
import { strictEqual, match } from 'node:assert'; import { strictEqual, match } from 'node:assert';
describe('--experimental-detect-module', { concurrency: true }, () => { describe('--experimental-detect-module', { concurrency: !process.env.TEST_PARALLEL }, () => {
describe('string input', { concurrency: true }, () => { describe('string input', { concurrency: !process.env.TEST_PARALLEL }, () => {
it('permits ESM syntax in --eval input without requiring --input-type=module', async () => { it('permits ESM syntax in --eval input without requiring --input-type=module', async () => {
const { stdout, stderr, code, signal } = await spawnPromisified(process.execPath, [ const { stdout, stderr, code, signal } = await spawnPromisified(process.execPath, [
'--experimental-detect-module', '--experimental-detect-module',
@ -72,7 +72,7 @@ describe('--experimental-detect-module', { concurrency: true }, () => {
}); });
}); });
describe('.js file input in a typeless package', { concurrency: true }, () => { describe('.js file input in a typeless package', { concurrency: !process.env.TEST_PARALLEL }, () => {
for (const { testName, entryPath } of [ for (const { testName, entryPath } of [
{ {
testName: 'permits CommonJS syntax in a .js entry point', testName: 'permits CommonJS syntax in a .js entry point',
@ -114,7 +114,7 @@ describe('--experimental-detect-module', { concurrency: true }, () => {
} }
}); });
describe('extensionless file input in a typeless package', { concurrency: true }, () => { describe('extensionless file input in a typeless package', { concurrency: !process.env.TEST_PARALLEL }, () => {
for (const { testName, entryPath } of [ for (const { testName, entryPath } of [
{ {
testName: 'permits CommonJS syntax in an extensionless entry point', testName: 'permits CommonJS syntax in an extensionless entry point',
@ -179,7 +179,7 @@ describe('--experimental-detect-module', { concurrency: true }, () => {
}); });
}); });
describe('file input in a "type": "commonjs" package', { concurrency: true }, () => { describe('file input in a "type": "commonjs" package', { concurrency: !process.env.TEST_PARALLEL }, () => {
for (const { testName, entryPath } of [ for (const { testName, entryPath } of [
{ {
testName: 'disallows ESM syntax in a .js entry point', testName: 'disallows ESM syntax in a .js entry point',
@ -208,7 +208,7 @@ describe('--experimental-detect-module', { concurrency: true }, () => {
} }
}); });
describe('file input in a "type": "module" package', { concurrency: true }, () => { describe('file input in a "type": "module" package', { concurrency: !process.env.TEST_PARALLEL }, () => {
for (const { testName, entryPath } of [ for (const { testName, entryPath } of [
{ {
testName: 'disallows CommonJS syntax in a .js entry point', testName: 'disallows CommonJS syntax in a .js entry point',
@ -238,7 +238,7 @@ describe('--experimental-detect-module', { concurrency: true }, () => {
}); });
// https://github.com/nodejs/node/issues/50917 // https://github.com/nodejs/node/issues/50917
describe('syntax that errors in CommonJS but works in ESM', { concurrency: true }, () => { describe('syntax that errors in CommonJS but works in ESM', { concurrency: !process.env.TEST_PARALLEL }, () => {
it('permits top-level `await`', async () => { it('permits top-level `await`', async () => {
const { stdout, stderr, code, signal } = await spawnPromisified(process.execPath, [ const { stdout, stderr, code, signal } = await spawnPromisified(process.execPath, [
'--experimental-detect-module', '--experimental-detect-module',

View File

@ -5,7 +5,7 @@ import { execPath } from 'node:process';
import { describe, it } from 'node:test'; import { describe, it } from 'node:test';
describe('ESM: warn for obsolete hooks provided', { concurrency: true }, () => { describe('ESM: warn for obsolete hooks provided', { concurrency: !process.env.TEST_PARALLEL }, () => {
it('should not print warnings when no experimental features are enabled or used', async () => { it('should not print warnings when no experimental features are enabled or used', async () => {
const { code, signal, stderr } = await spawnPromisified(execPath, [ const { code, signal, stderr } = await spawnPromisified(execPath, [
'--input-type=module', '--input-type=module',

View File

@ -12,7 +12,7 @@ const importStatementMultiline = `import {
} from './module-named-exports.mjs'; } from './module-named-exports.mjs';
`; `;
describe('ESM: nonexistent exports', { concurrency: true }, () => { describe('ESM: nonexistent exports', { concurrency: !process.env.TEST_PARALLEL }, () => {
for ( for (
const { name, input } const { name, input }
of [ of [

View File

@ -7,7 +7,7 @@ import * as path from 'node:path';
import { execPath } from 'node:process'; import { execPath } from 'node:process';
import { describe, it, before } from 'node:test'; import { describe, it, before } from 'node:test';
describe('ESM in main field', { concurrency: true }, () => { describe('ESM in main field', { concurrency: !process.env.TEST_PARALLEL }, () => {
before(() => tmpdir.refresh()); before(() => tmpdir.refresh());
it('should handle fully-specified relative path without any warning', async () => { it('should handle fully-specified relative path without any warning', async () => {

View File

@ -4,7 +4,9 @@ import * as fixtures from '../common/fixtures.mjs';
import { describe, it } from 'node:test'; import { describe, it } from 'node:test';
import { match, ok, strictEqual } from 'node:assert'; import { match, ok, strictEqual } from 'node:assert';
describe('extensionless ES modules within a "type": "module" package scope', { concurrency: true }, () => { describe('extensionless ES modules within a "type": "module" package scope', {
concurrency: !process.env.TEST_PARALLEL,
}, () => {
it('should run as the entry point', async () => { it('should run as the entry point', async () => {
const { code, signal, stdout, stderr } = await spawnPromisified(process.execPath, [ const { code, signal, stdout, stderr } = await spawnPromisified(process.execPath, [
fixtures.path('es-modules/package-type-module/noext-esm'), fixtures.path('es-modules/package-type-module/noext-esm'),
@ -29,7 +31,9 @@ describe('extensionless ES modules within a "type": "module" package scope', { c
strictEqual(defaultExport, 'module'); strictEqual(defaultExport, 'module');
}); });
}); });
describe('extensionless Wasm modules within a "type": "module" package scope', { concurrency: true }, () => { describe('extensionless Wasm modules within a "type": "module" package scope', {
concurrency: !process.env.TEST_PARALLEL,
}, () => {
it('should run as the entry point', async () => { it('should run as the entry point', async () => {
const { code, signal, stdout, stderr } = await spawnPromisified(process.execPath, [ const { code, signal, stdout, stderr } = await spawnPromisified(process.execPath, [
'--experimental-wasm-modules', '--experimental-wasm-modules',
@ -55,7 +59,7 @@ describe('extensionless Wasm modules within a "type": "module" package scope', {
}); });
}); });
describe('extensionless ES modules within no package scope', { concurrency: true }, () => { describe('extensionless ES modules within no package scope', { concurrency: !process.env.TEST_PARALLEL }, () => {
// This succeeds with `--experimental-default-type=module` // This succeeds with `--experimental-default-type=module`
it('should error as the entry point', async () => { it('should error as the entry point', async () => {
const { code, signal, stdout, stderr } = await spawnPromisified(process.execPath, [ const { code, signal, stdout, stderr } = await spawnPromisified(process.execPath, [
@ -79,7 +83,7 @@ describe('extensionless ES modules within no package scope', { concurrency: true
}); });
}); });
describe('extensionless Wasm within no package scope', { concurrency: true }, () => { describe('extensionless Wasm within no package scope', { concurrency: !process.env.TEST_PARALLEL }, () => {
// This succeeds with `--experimental-default-type=module` // This succeeds with `--experimental-default-type=module`
it('should error as the entry point', async () => { it('should error as the entry point', async () => {
const { code, signal, stdout, stderr } = await spawnPromisified(process.execPath, [ const { code, signal, stdout, stderr } = await spawnPromisified(process.execPath, [

View File

@ -10,7 +10,7 @@ const mjsEntry = fixtures.path('es-modules', 'mjs-file.mjs');
const mjsImport = fixtures.fileURL('es-modules', 'mjs-file.mjs'); const mjsImport = fixtures.fileURL('es-modules', 'mjs-file.mjs');
describe('import modules using --import', { concurrency: true }, () => { describe('import modules using --import', { concurrency: !process.env.TEST_PARALLEL }, () => {
it('should import when using --eval', async () => { it('should import when using --eval', async () => {
const { code, signal, stderr, stdout } = await spawnPromisified( const { code, signal, stderr, stdout } = await spawnPromisified(
execPath, execPath,

View File

@ -5,7 +5,7 @@ import { execPath } from 'node:process';
import { describe, it } from 'node:test'; import { describe, it } from 'node:test';
describe('ESM: named JSON exports', { concurrency: true }, () => { describe('ESM: named JSON exports', { concurrency: !process.env.TEST_PARALLEL }, () => {
it('should throw, citing named import', async () => { it('should throw, citing named import', async () => {
const { code, stderr } = await spawnPromisified(execPath, [ const { code, stderr } = await spawnPromisified(execPath, [
fixtures.path('es-modules', 'import-json-named-export.mjs'), fixtures.path('es-modules', 'import-json-named-export.mjs'),

View File

@ -5,7 +5,7 @@ import { execPath } from 'node:process';
import { describe, it } from 'node:test'; import { describe, it } from 'node:test';
describe('ESM: ensure initialization happens only once', { concurrency: true }, () => { describe('ESM: ensure initialization happens only once', { concurrency: !process.env.TEST_PARALLEL }, () => {
it(async () => { it(async () => {
const { code, stderr, stdout } = await spawnPromisified(execPath, [ const { code, stderr, stdout } = await spawnPromisified(execPath, [
'--experimental-import-meta-resolve', '--experimental-import-meta-resolve',

View File

@ -7,7 +7,7 @@ const { execPath } = require('node:process');
const { describe, it } = require('node:test'); const { describe, it } = require('node:test');
describe('ESM: Package.json', { concurrency: true }, () => { describe('ESM: Package.json', { concurrency: !process.env.TEST_PARALLEL }, () => {
it('should throw on invalid pson', async () => { it('should throw on invalid pson', async () => {
const entry = fixtures.path('/es-modules/import-invalid-pjson.mjs'); const entry = fixtures.path('/es-modules/import-invalid-pjson.mjs');
const invalidJson = fixtures.path('/node_modules/invalid-pjson/package.json'); const invalidJson = fixtures.path('/node_modules/invalid-pjson/package.json');

View File

@ -15,7 +15,7 @@ const commonArgs = [
commonInput, commonInput,
]; ];
describe('ESM: loader chaining', { concurrency: true }, () => { describe('ESM: loader chaining', { concurrency: !process.env.TEST_PARALLEL }, () => {
it('should load unadulterated source when there are no loaders', async () => { it('should load unadulterated source when there are no loaders', async () => {
const { code, stderr, stdout } = await spawnPromisified( const { code, stderr, stdout } = await spawnPromisified(
execPath, execPath,

View File

@ -4,7 +4,7 @@ import assert from 'node:assert';
import { execPath } from 'node:process'; import { execPath } from 'node:process';
import { describe, it } from 'node:test'; import { describe, it } from 'node:test';
describe('Loader hooks', { concurrency: true }, () => { describe('Loader hooks', { concurrency: !process.env.TEST_PARALLEL }, () => {
it('are called with all expected arguments', async () => { it('are called with all expected arguments', async () => {
const { code, signal, stdout, stderr } = await spawnPromisified(execPath, [ const { code, signal, stdout, stderr } = await spawnPromisified(execPath, [
'--no-warnings', '--no-warnings',
@ -50,7 +50,7 @@ describe('Loader hooks', { concurrency: true }, () => {
assert.strictEqual(lines.length, 5); assert.strictEqual(lines.length, 5);
}); });
describe('should handle never-settling hooks in ESM files', { concurrency: true }, () => { describe('should handle never-settling hooks in ESM files', { concurrency: !process.env.TEST_PARALLEL }, () => {
it('top-level await of a never-settling resolve without warning', async () => { it('top-level await of a never-settling resolve without warning', async () => {
const { code, signal, stdout, stderr } = await spawnPromisified(execPath, [ const { code, signal, stdout, stderr } = await spawnPromisified(execPath, [
'--no-warnings', '--no-warnings',
@ -134,7 +134,7 @@ describe('Loader hooks', { concurrency: true }, () => {
}); });
}); });
describe('should handle never-settling hooks in CJS files', { concurrency: true }, () => { describe('should handle never-settling hooks in CJS files', { concurrency: !process.env.TEST_PARALLEL }, () => {
it('never-settling resolve', async () => { it('never-settling resolve', async () => {
const { code, signal, stdout, stderr } = await spawnPromisified(execPath, [ const { code, signal, stdout, stderr } = await spawnPromisified(execPath, [
'--no-warnings', '--no-warnings',

View File

@ -46,7 +46,7 @@ const {
port, port,
} = server.address(); } = server.address();
describe('ESM: http import via loader', { concurrency: true }, () => { describe('ESM: http import via loader', { concurrency: !process.env.TEST_PARALLEL }, () => {
it('should load using --import flag', async () => { it('should load using --import flag', async () => {
// ! MUST NOT use spawnSync to avoid blocking the event loop // ! MUST NOT use spawnSync to avoid blocking the event loop
const { code, signal, stderr, stdout } = await spawnPromisified( const { code, signal, stderr, stdout } = await spawnPromisified(

View File

@ -20,7 +20,7 @@ const commonEvals = {
staticImport: (module) => `import ${JSON.stringify(`data:text/javascript,${encodeURIComponent(module)}`)};`, staticImport: (module) => `import ${JSON.stringify(`data:text/javascript,${encodeURIComponent(module)}`)};`,
}; };
describe('ESM: programmatically register loaders', { concurrency: true }, () => { describe('ESM: programmatically register loaders', { concurrency: !process.env.TEST_PARALLEL }, () => {
it('works with only a dummy CLI argument', async () => { it('works with only a dummy CLI argument', async () => {
const parentURL = fixtures.fileURL('es-module-loaders', 'loader-resolve-passthru.mjs'); const parentURL = fixtures.fileURL('es-module-loaders', 'loader-resolve-passthru.mjs');
const { code, signal, stdout, stderr } = await spawnPromisified(execPath, [ const { code, signal, stdout, stderr } = await spawnPromisified(execPath, [
@ -49,7 +49,7 @@ describe('ESM: programmatically register loaders', { concurrency: true }, () =>
assert.strictEqual(lines[5], ''); assert.strictEqual(lines[5], '');
}); });
describe('registering via --import', { concurrency: true }, () => { describe('registering via --import', { concurrency: !process.env.TEST_PARALLEL }, () => {
for (const moduleType of ['mjs', 'cjs']) { for (const moduleType of ['mjs', 'cjs']) {
it(`should programmatically register a loader from a ${moduleType.toUpperCase()} file`, async () => { it(`should programmatically register a loader from a ${moduleType.toUpperCase()} file`, async () => {
const { code, signal, stdout, stderr } = await spawnPromisified(execPath, [ const { code, signal, stdout, stderr } = await spawnPromisified(execPath, [

View File

@ -4,7 +4,7 @@ import assert from 'node:assert';
import { execPath } from 'node:process'; import { execPath } from 'node:process';
import { describe, it } from 'node:test'; import { describe, it } from 'node:test';
describe('Loader hooks throwing errors', { concurrency: true }, () => { describe('Loader hooks throwing errors', { concurrency: !process.env.TEST_PARALLEL }, () => {
it('throws on nonexistent modules', async () => { it('throws on nonexistent modules', async () => {
const { code, signal, stdout, stderr } = await spawnPromisified(execPath, [ const { code, signal, stdout, stderr } = await spawnPromisified(execPath, [
'--no-warnings', '--no-warnings',
@ -161,7 +161,7 @@ describe('Loader hooks throwing errors', { concurrency: true }, () => {
}); });
}); });
describe('Loader hooks parsing modules', { concurrency: true }, () => { describe('Loader hooks parsing modules', { concurrency: !process.env.TEST_PARALLEL }, () => {
it('can parse .js files as ESM', async () => { it('can parse .js files as ESM', async () => {
const { code, signal, stdout, stderr } = await spawnPromisified(execPath, [ const { code, signal, stdout, stderr } = await spawnPromisified(execPath, [
'--no-warnings', '--no-warnings',

View File

@ -5,7 +5,7 @@ import { execPath } from 'node:process';
import { describe, it } from 'node:test'; import { describe, it } from 'node:test';
describe('ESM: thenable loader hooks', { concurrency: true }, () => { describe('ESM: thenable loader hooks', { concurrency: !process.env.TEST_PARALLEL }, () => {
it('should behave as a normal promise resolution', async () => { it('should behave as a normal promise resolution', async () => {
const { code, stderr } = await spawnPromisified(execPath, [ const { code, stderr } = await spawnPromisified(execPath, [
'--experimental-loader', '--experimental-loader',

View File

@ -5,7 +5,7 @@ import { execPath } from 'node:process';
import { describe, it } from 'node:test'; import { describe, it } from 'node:test';
describe('ESM: loader with syntax error', { concurrency: true }, () => { describe('ESM: loader with syntax error', { concurrency: !process.env.TEST_PARALLEL }, () => {
it('should crash the node process', async () => { it('should crash the node process', async () => {
const { code, stderr } = await spawnPromisified(execPath, [ const { code, stderr } = await spawnPromisified(execPath, [
'--experimental-loader', '--experimental-loader',

View File

@ -5,7 +5,7 @@ import { execPath } from 'node:process';
import { describe, it } from 'node:test'; import { describe, it } from 'node:test';
describe('ESM: module not found hint', { concurrency: true }, () => { describe('ESM: module not found hint', { concurrency: !process.env.TEST_PARALLEL }, () => {
for ( for (
const { input, expected, cwd = fixturesDir } const { input, expected, cwd = fixturesDir }
of [ of [

View File

@ -5,7 +5,7 @@ import { execPath } from 'node:process';
import { describe, it } from 'node:test'; import { describe, it } from 'node:test';
describe('ESM: non-js extensions fail', { concurrency: true }, () => { describe('ESM: non-js extensions fail', { concurrency: !process.env.TEST_PARALLEL }, () => {
it(async () => { it(async () => {
const { code, stderr, signal } = await spawnPromisified(execPath, [ const { code, stderr, signal } = await spawnPromisified(execPath, [
'--input-type=module', '--input-type=module',

View File

@ -5,7 +5,7 @@ import { execPath } from 'node:process';
import { describe, it } from 'node:test'; import { describe, it } from 'node:test';
describe('ESM: experiemental warning for import.meta.resolve', { concurrency: true }, () => { describe('ESM: experiemental warning for import.meta.resolve', { concurrency: !process.env.TEST_PARALLEL }, () => {
it('should not warn when caught', async () => { it('should not warn when caught', async () => {
const { code, signal, stderr } = await spawnPromisified(execPath, [ const { code, signal, stderr } = await spawnPromisified(execPath, [
'--experimental-import-meta-resolve', '--experimental-import-meta-resolve',

View File

@ -41,7 +41,7 @@ try {
skip('insufficient privileges for symlinks'); skip('insufficient privileges for symlinks');
} }
describe('Invoke the main file via a symlink.', { concurrency: true }, () => { describe('Invoke the main file via a symlink.', { concurrency: !process.env.TEST_PARALLEL }, () => {
it('should resolve relative imports in the main file', async () => { it('should resolve relative imports in the main file', async () => {
const { code } = await spawnPromisified(execPath, [ const { code } = await spawnPromisified(execPath, [
'--preserve-symlinks', '--preserve-symlinks',

View File

@ -8,7 +8,7 @@ const { execPath } = require('node:process');
const { describe, it } = require('node:test'); const { describe, it } = require('node:test');
describe('ESM: REPL runs', { concurrency: true }, () => { describe('ESM: REPL runs', { concurrency: !process.env.TEST_PARALLEL }, () => {
it((t, done) => { it((t, done) => {
const child = spawn(execPath, [ const child = spawn(execPath, [
'--interactive', '--interactive',

View File

@ -4,7 +4,7 @@ import assert from 'node:assert';
import { execPath } from 'node:process'; import { execPath } from 'node:process';
import { describe, it } from 'node:test'; import { describe, it } from 'node:test';
describe('esm source-map', { concurrency: true }, () => { describe('esm source-map', { concurrency: !process.env.TEST_PARALLEL }, () => {
// Issue: https://github.com/nodejs/node/issues/51522 // Issue: https://github.com/nodejs/node/issues/51522
[ [

View File

@ -5,7 +5,7 @@ import { execPath } from 'node:process';
import { describe, it } from 'node:test'; import { describe, it } from 'node:test';
describe('ESM: importing a module with syntax error(s)', { concurrency: true }, () => { describe('ESM: importing a module with syntax error(s)', { concurrency: !process.env.TEST_PARALLEL }, () => {
it('should throw', async () => { it('should throw', async () => {
const { code, stderr } = await spawnPromisified(execPath, [ const { code, stderr } = await spawnPromisified(execPath, [
path('es-module-loaders', 'syntax-error.mjs'), path('es-module-loaders', 'syntax-error.mjs'),

View File

@ -10,7 +10,7 @@ const commonArgs = [
'--eval', '--eval',
]; ];
describe('ESM: unsettled and rejected promises', { concurrency: true }, () => { describe('ESM: unsettled and rejected promises', { concurrency: !process.env.TEST_PARALLEL }, () => {
it('should exit for an unsettled TLA promise via --eval with a warning', async () => { it('should exit for an unsettled TLA promise via --eval with a warning', async () => {
const { code, stderr, stdout } = await spawnPromisified(execPath, [ const { code, stderr, stdout } = await spawnPromisified(execPath, [
...commonArgs, ...commonArgs,

View File

@ -3,7 +3,9 @@ import * as fixtures from '../common/fixtures.mjs';
import { describe, it } from 'node:test'; import { describe, it } from 'node:test';
import { match, strictEqual } from 'node:assert'; import { match, strictEqual } from 'node:assert';
describe('--experimental-default-type=module should not support extension searching', { concurrency: true }, () => { describe('--experimental-default-type=module should not support extension searching', {
concurrency: !process.env.TEST_PARALLEL,
}, () => {
it('should support extension searching under --experimental-default-type=commonjs', async () => { it('should support extension searching under --experimental-default-type=commonjs', async () => {
const { code, signal, stdout, stderr } = await spawnPromisified(process.execPath, [ const { code, signal, stdout, stderr } = await spawnPromisified(process.execPath, [
'--experimental-default-type=commonjs', '--experimental-default-type=commonjs',
@ -33,7 +35,9 @@ describe('--experimental-default-type=module should not support extension search
}); });
}); });
describe('--experimental-default-type=module should not parse paths as URLs', { concurrency: true }, () => { describe('--experimental-default-type=module should not parse paths as URLs', {
concurrency: !process.env.TEST_PARALLEL,
}, () => {
it('should not parse a `?` in a filename as starting a query string', async () => { it('should not parse a `?` in a filename as starting a query string', async () => {
const { code, signal, stdout, stderr } = await spawnPromisified(process.execPath, [ const { code, signal, stdout, stderr } = await spawnPromisified(process.execPath, [
'--experimental-default-type=module', '--experimental-default-type=module',

View File

@ -3,8 +3,10 @@ import * as fixtures from '../common/fixtures.mjs';
import { describe, it } from 'node:test'; import { describe, it } from 'node:test';
import { deepStrictEqual, match, strictEqual } from 'node:assert'; import { deepStrictEqual, match, strictEqual } from 'node:assert';
describe('--experimental-default-type=module', { concurrency: true }, () => { describe('--experimental-default-type=module', { concurrency: !process.env.TEST_PARALLEL }, () => {
describe('should not affect the interpretation of files with unknown extensions', { concurrency: true }, () => { describe('should not affect the interpretation of files with unknown extensions', {
concurrency: !process.env.TEST_PARALLEL,
}, () => {
it('should error on an entry point with an unknown extension', async () => { it('should error on an entry point with an unknown extension', async () => {
const { code, signal, stdout, stderr } = await spawnPromisified(process.execPath, [ const { code, signal, stdout, stderr } = await spawnPromisified(process.execPath, [
'--experimental-default-type=module', '--experimental-default-type=module',

View File

@ -5,7 +5,7 @@ import { describe, it } from 'node:test';
import { strictEqual } from 'node:assert'; import { strictEqual } from 'node:assert';
describe('the type flag should change the interpretation of certain files outside of any package scope', describe('the type flag should change the interpretation of certain files outside of any package scope',
{ concurrency: true }, () => { { concurrency: !process.env.TEST_PARALLEL }, () => {
it('should run as ESM a .js file that is outside of any package scope', async () => { it('should run as ESM a .js file that is outside of any package scope', async () => {
const { code, signal, stdout, stderr } = await spawnPromisified(process.execPath, [ const { code, signal, stdout, stderr } = await spawnPromisified(process.execPath, [
'--experimental-default-type=module', '--experimental-default-type=module',

View File

@ -5,7 +5,7 @@ import { describe, it } from 'node:test';
import { strictEqual } from 'node:assert'; import { strictEqual } from 'node:assert';
describe('the type flag should change the interpretation of certain files within a "type": "module" package scope', describe('the type flag should change the interpretation of certain files within a "type": "module" package scope',
{ concurrency: true }, () => { { concurrency: !process.env.TEST_PARALLEL }, () => {
it('should run as ESM an extensionless JavaScript file within a "type": "module" scope', async () => { it('should run as ESM an extensionless JavaScript file within a "type": "module" scope', async () => {
const { code, signal, stdout, stderr } = await spawnPromisified(process.execPath, [ const { code, signal, stdout, stderr } = await spawnPromisified(process.execPath, [
'--experimental-default-type=module', '--experimental-default-type=module',
@ -60,7 +60,7 @@ describe('the type flag should change the interpretation of certain files within
}); });
describe(`the type flag should change the interpretation of certain files within a package scope that lacks a describe(`the type flag should change the interpretation of certain files within a package scope that lacks a
"type" field and is not under node_modules`, { concurrency: true }, () => { "type" field and is not under node_modules`, { concurrency: !process.env.TEST_PARALLEL }, () => {
it('should run as ESM a .js file within package scope that has no defined "type" and is not under node_modules', it('should run as ESM a .js file within package scope that has no defined "type" and is not under node_modules',
async () => { async () => {
const { code, signal, stdout, stderr } = await spawnPromisified(process.execPath, [ const { code, signal, stdout, stderr } = await spawnPromisified(process.execPath, [
@ -122,7 +122,7 @@ under node_modules`, async () => {
}); });
describe(`the type flag should NOT change the interpretation of certain files within a package scope that lacks a describe(`the type flag should NOT change the interpretation of certain files within a package scope that lacks a
"type" field and is under node_modules`, { concurrency: true }, () => { "type" field and is under node_modules`, { concurrency: !process.env.TEST_PARALLEL }, () => {
it('should run as CommonJS a .js file within package scope that has no defined "type" and is under node_modules', it('should run as CommonJS a .js file within package scope that has no defined "type" and is under node_modules',
async () => { async () => {
const { code, signal, stdout, stderr } = await spawnPromisified(process.execPath, [ const { code, signal, stdout, stderr } = await spawnPromisified(process.execPath, [

View File

@ -3,7 +3,9 @@ import { spawn } from 'node:child_process';
import { describe, it } from 'node:test'; import { describe, it } from 'node:test';
import { strictEqual, match } from 'node:assert'; import { strictEqual, match } from 'node:assert';
describe('the type flag should change the interpretation of string input', { concurrency: true }, () => { describe('the type flag should change the interpretation of string input', {
concurrency: !process.env.TEST_PARALLEL,
}, () => {
it('should run as ESM input passed via --eval', async () => { it('should run as ESM input passed via --eval', async () => {
const { code, signal, stdout, stderr } = await spawnPromisified(process.execPath, [ const { code, signal, stdout, stderr } = await spawnPromisified(process.execPath, [
'--experimental-default-type=module', '--experimental-default-type=module',

View File

@ -9,7 +9,7 @@ const { describe, it } = require('node:test');
// In a "type": "module" package scope, files with unknown extensions should throw; // In a "type": "module" package scope, files with unknown extensions should throw;
// both when used as a main entry point and also when referenced via `import`. // both when used as a main entry point and also when referenced via `import`.
describe('ESM: unknown specifiers', { concurrency: true }, () => { describe('ESM: unknown specifiers', { concurrency: !process.env.TEST_PARALLEL }, () => {
for ( for (
const fixturePath of [ const fixturePath of [
'/es-modules/package-type-module/extension.unknown', '/es-modules/package-type-module/extension.unknown',

View File

@ -5,7 +5,7 @@ import { execPath } from 'node:process';
import { describe, it } from 'node:test'; import { describe, it } from 'node:test';
describe('ESM: WASM modules', { concurrency: true }, () => { describe('ESM: WASM modules', { concurrency: !process.env.TEST_PARALLEL }, () => {
it('should load exports', async () => { it('should load exports', async () => {
const { code, stderr, stdout } = await spawnPromisified(execPath, [ const { code, stderr, stdout } = await spawnPromisified(execPath, [
'--no-warnings', '--no-warnings',

View File

@ -5,7 +5,7 @@ import { execPath } from 'node:process';
import { describe, it } from 'node:test'; import { describe, it } from 'node:test';
describe('ESM: http import via CLI', { concurrency: true }, () => { describe('ESM: http import via CLI', { concurrency: !process.env.TEST_PARALLEL }, () => {
const disallowedSpecifier = 'http://example.com'; const disallowedSpecifier = 'http://example.com';
it('should throw disallowed error for insecure protocol', async () => { it('should throw disallowed error for insecure protocol', async () => {

View File

@ -4,7 +4,7 @@ import assert from 'node:assert';
import { execPath } from 'node:process'; import { execPath } from 'node:process';
import { describe, it } from 'node:test'; import { describe, it } from 'node:test';
describe('Worker threads do not spawn infinitely', { concurrency: true }, () => { describe('Worker threads do not spawn infinitely', { concurrency: !process.env.TEST_PARALLEL }, () => {
it('should not trigger an infinite loop when using a loader exports no recognized hooks', async () => { it('should not trigger an infinite loop when using a loader exports no recognized hooks', async () => {
const { code, signal, stdout, stderr } = await spawnPromisified(execPath, [ const { code, signal, stdout, stderr } = await spawnPromisified(execPath, [
'--no-warnings', '--no-warnings',

View File

@ -3,7 +3,7 @@ import { describe, it } from 'node:test';
import { once } from 'node:events'; import { once } from 'node:events';
import assert from 'node:assert'; import assert from 'node:assert';
describe('AbortSignal.any()', { concurrency: true }, () => { describe('AbortSignal.any()', { concurrency: !process.env.TEST_PARALLEL }, () => {
it('should throw when not receiving an array', () => { it('should throw when not receiving an array', () => {
const expectedError = { code: 'ERR_INVALID_ARG_TYPE' }; const expectedError = { code: 'ERR_INVALID_ARG_TYPE' };
assert.throws(() => AbortSignal.any(), expectedError); assert.throws(() => AbortSignal.any(), expectedError);

View File

@ -4,7 +4,7 @@ const assert = require('assert');
const { describe, it } = require('node:test'); const { describe, it } = require('node:test');
describe('assert.CallTracker.getCalls()', { concurrency: true }, () => { describe('assert.CallTracker.getCalls()', { concurrency: !process.env.TEST_PARALLEL }, () => {
const tracker = new assert.CallTracker(); const tracker = new assert.CallTracker();
it('should return empty list when no calls', () => { it('should return empty list when no calls', () => {

View File

@ -4,7 +4,7 @@ import { execPath } from 'node:process';
import { describe, it } from 'node:test'; import { describe, it } from 'node:test';
describe('--print with a promise', { concurrency: true }, () => { describe('--print with a promise', { concurrency: !process.env.TEST_PARALLEL }, () => {
it('should handle directly-fulfilled promises', async () => { it('should handle directly-fulfilled promises', async () => {
const result = await spawnPromisified(execPath, [ const result = await spawnPromisified(execPath, [
'--print', '--print',

View File

@ -11,7 +11,7 @@ const errorWithEAGAIN = (fd, buffer, offset, length, position, callback) => {
callback(Object.assign(new Error(), { code: 'EAGAIN' }), 0, buffer); callback(Object.assign(new Error(), { code: 'EAGAIN' }), 0, buffer);
}; };
describe('WriteStream EAGAIN', { concurrency: true }, () => { describe('WriteStream EAGAIN', { concurrency: !process.env.TEST_PARALLEL }, () => {
it('_write', async () => { it('_write', async () => {
const mockWrite = mock.fn(fs.write); const mockWrite = mock.fn(fs.write);
mockWrite.mock.mockImplementationOnce(errorWithEAGAIN); mockWrite.mock.mockImplementationOnce(errorWithEAGAIN);

View File

@ -11,7 +11,7 @@ function replaceStackTrace(str) {
return snapshot.replaceStackTrace(str, '$1at *$7\n'); return snapshot.replaceStackTrace(str, '$1at *$7\n');
} }
describe('console output', { concurrency: true }, () => { describe('console output', { concurrency: !process.env.TEST_PARALLEL }, () => {
function normalize(str) { function normalize(str) {
return str.replaceAll(snapshot.replaceWindowsPaths(process.cwd()), '').replaceAll('/', '*').replaceAll(process.version, '*').replaceAll(/\d+/g, '*'); return str.replaceAll(snapshot.replaceWindowsPaths(process.cwd()), '').replaceAll('/', '*').replaceAll(process.version, '*').replaceAll(/\d+/g, '*');
} }

View File

@ -20,7 +20,7 @@ function replaceForceColorsStackTrace(str) {
return str.replaceAll(/(\[90m\W+)at .*node:.*/g, '$1at *'); return str.replaceAll(/(\[90m\W+)at .*node:.*/g, '$1at *');
} }
describe('errors output', { concurrency: true }, () => { describe('errors output', { concurrency: !process.env.TEST_PARALLEL }, () => {
function normalize(str) { function normalize(str) {
return str.replaceAll(snapshot.replaceWindowsPaths(process.cwd()), '') return str.replaceAll(snapshot.replaceWindowsPaths(process.cwd()), '')
.replaceAll(pathToFileURL(process.cwd()).pathname, '') .replaceAll(pathToFileURL(process.cwd()).pathname, '')

View File

@ -4,7 +4,7 @@ import * as snapshot from '../common/assertSnapshot.js';
import * as path from 'node:path'; import * as path from 'node:path';
import { describe, it } from 'node:test'; import { describe, it } from 'node:test';
describe('sourcemaps output', { concurrency: true }, () => { describe('sourcemaps output', { concurrency: !process.env.TEST_PARALLEL }, () => {
function normalize(str) { function normalize(str) {
const result = str const result = str
.replaceAll(snapshot.replaceWindowsPaths(process.cwd()), '') .replaceAll(snapshot.replaceWindowsPaths(process.cwd()), '')

View File

@ -7,7 +7,7 @@ function replaceNodeVersion(str) {
return str.replaceAll(process.version, '*'); return str.replaceAll(process.version, '*');
} }
describe('v8 output', { concurrency: true }, () => { describe('v8 output', { concurrency: !process.env.TEST_PARALLEL }, () => {
function normalize(str) { function normalize(str) {
return str.replaceAll(snapshot.replaceWindowsPaths(process.cwd()), '') return str.replaceAll(snapshot.replaceWindowsPaths(process.cwd()), '')
.replaceAll(/:\d+/g, ':*') .replaceAll(/:\d+/g, ':*')

View File

@ -7,7 +7,7 @@ function replaceNodeVersion(str) {
return str.replaceAll(process.version, '*'); return str.replaceAll(process.version, '*');
} }
describe('vm output', { concurrency: true }, () => { describe('vm output', { concurrency: !process.env.TEST_PARALLEL }, () => {
function normalize(str) { function normalize(str) {
return str.replaceAll(snapshot.replaceWindowsPaths(process.cwd()), '').replaceAll('//', '*').replaceAll(/\/(\w)/g, '*$1').replaceAll('*test*', '*').replaceAll(/node:vm:\d+:\d+/g, 'node:vm:*'); return str.replaceAll(snapshot.replaceWindowsPaths(process.cwd()), '').replaceAll('//', '*').replaceAll(/\/(\w)/g, '*$1').replaceAll('*test*', '*').replaceAll(/node:vm:\d+:\d+/g, 'node:vm:*');
} }

View File

@ -9,7 +9,7 @@ const dep1Message = /\(node:\d+\) \[DEP1\] DeprecationWarning/;
const dep2Message = /\(node:\d+\) \[DEP2\] DeprecationWarning/; const dep2Message = /\(node:\d+\) \[DEP2\] DeprecationWarning/;
const experimentalWarningMessage = /\(node:\d+\) ExperimentalWarning/; const experimentalWarningMessage = /\(node:\d+\) ExperimentalWarning/;
describe('process warnings', { concurrency: true }, () => { describe('process warnings', { concurrency: !process.env.TEST_PARALLEL }, () => {
it('should emit all warnings by default', async () => { it('should emit all warnings by default', async () => {
const { stdout, stderr, code, signal } = await spawnPromisified(process.execPath, [ const { stdout, stderr, code, signal } = await spawnPromisified(process.execPath, [
@ -24,7 +24,7 @@ describe('process warnings', { concurrency: true }, () => {
assert.strictEqual(signal, null); assert.strictEqual(signal, null);
}); });
describe('--no-warnings', { concurrency: true }, () => { describe('--no-warnings', { concurrency: !process.env.TEST_PARALLEL }, () => {
it('should silence all warnings by default', async () => { it('should silence all warnings by default', async () => {
const { stdout, stderr, code, signal } = await spawnPromisified(process.execPath, [ const { stdout, stderr, code, signal } = await spawnPromisified(process.execPath, [
'--no-warnings', '--no-warnings',
@ -40,7 +40,7 @@ describe('process warnings', { concurrency: true }, () => {
}); });
}); });
describe('--no-deprecation', { concurrency: true }, () => { describe('--no-deprecation', { concurrency: !process.env.TEST_PARALLEL }, () => {
it('should silence all deprecation warnings', async () => { it('should silence all deprecation warnings', async () => {
const { stdout, stderr, code, signal } = await spawnPromisified(process.execPath, [ const { stdout, stderr, code, signal } = await spawnPromisified(process.execPath, [
'--no-deprecation', '--no-deprecation',
@ -56,7 +56,7 @@ describe('process warnings', { concurrency: true }, () => {
}); });
}); });
describe('--disable-warning', { concurrency: true }, () => { describe('--disable-warning', { concurrency: !process.env.TEST_PARALLEL }, () => {
it('should silence deprecation warning DEP1', async () => { it('should silence deprecation warning DEP1', async () => {
const { stdout, stderr, code, signal } = await spawnPromisified(process.execPath, [ const { stdout, stderr, code, signal } = await spawnPromisified(process.execPath, [
'--disable-warning=DEP1', '--disable-warning=DEP1',

View File

@ -87,7 +87,7 @@ async function failWriteSucceed({ file, watchedFile }) {
tmpdir.refresh(); tmpdir.refresh();
describe('watch mode', { concurrency: true, timeout: 60_000 }, () => { describe('watch mode', { concurrency: !process.env.TEST_PARALLEL, timeout: 60_000 }, () => {
it('should watch changes to a file', async () => { it('should watch changes to a file', async () => {
const file = createTmpFile(); const file = createTmpFile();
const { stderr, stdout } = await runWriteSucceed({ file, watchedFile: file, watchFlag: '--watch=true', options: { const { stderr, stdout } = await runWriteSucceed({ file, watchedFile: file, watchFlag: '--watch=true', options: {