diff --git a/.github/workflows/test-linux.yml b/.github/workflows/test-linux.yml index 24cf47f9b376bd..bfe9885afb7b46 100644 --- a/.github/workflows/test-linux.yml +++ b/.github/workflows/test-linux.yml @@ -40,6 +40,7 @@ jobs: - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 with: persist-credentials: false + path: node - name: Set up Python ${{ env.PYTHON_VERSION }} uses: actions/setup-python@0b93645e9fea7318ecaed2b359559ac225c90a2b # v5.3.0 with: @@ -51,6 +52,13 @@ jobs: - name: Environment Information run: npx envinfo - name: Build - run: make build-ci -j4 V=1 CONFIG_FLAGS="--error-on-warn" + run: make -C node build-ci -j4 V=1 CONFIG_FLAGS="--error-on-warn" - name: Test - run: make run-ci -j4 V=1 TEST_CI_ARGS="-p actions --node-args='--test-reporter=spec' --node-args='--test-reporter-destination=stdout' --measure-flakiness 9" + run: make -C node run-ci -j4 V=1 TEST_CI_ARGS="-p actions --node-args='--test-reporter=spec' --node-args='--test-reporter-destination=stdout' --measure-flakiness 9" + - name: Re-run test in a folder whose name contains unusual chars + run: | + mv node "$DIR" + cd "$DIR" + ./tools/test.py --flaky-tests keep_retrying -p actions -j 4 + env: + DIR: dir%20with $unusual"chars?'åß∂ƒ©∆¬…` diff --git a/.github/workflows/test-macos.yml b/.github/workflows/test-macos.yml index 56e8d6fdd65999..f73c0b2e656751 100644 --- a/.github/workflows/test-macos.yml +++ b/.github/workflows/test-macos.yml @@ -51,6 +51,7 @@ jobs: - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 with: persist-credentials: false + path: node - name: Set up Python ${{ env.PYTHON_VERSION }} uses: actions/setup-python@0b93645e9fea7318ecaed2b359559ac225c90a2b # v5.3.0 with: @@ -68,7 +69,7 @@ jobs: # happen anymore running this step here first, that's also useful # information.) - name: tools/doc/node_modules workaround - run: make tools/doc/node_modules + run: make -C node tools/doc/node_modules # This is needed due to https://github.com/nodejs/build/issues/3878 - name: Cleanup run: | @@ -84,8 +85,15 @@ jobs: df -h echo "::endgroup::" - name: Build - run: make build-ci -j$(getconf _NPROCESSORS_ONLN) V=1 CONFIG_FLAGS="--error-on-warn" + run: make -C node build-ci -j$(getconf _NPROCESSORS_ONLN) V=1 CONFIG_FLAGS="--error-on-warn" - name: Free Space After Build run: df -h - name: Test - run: make run-ci -j$(getconf _NPROCESSORS_ONLN) V=1 TEST_CI_ARGS="-p actions --node-args='--test-reporter=spec' --node-args='--test-reporter-destination=stdout' --measure-flakiness 9" + run: make -C node run-ci -j$(getconf _NPROCESSORS_ONLN) V=1 TEST_CI_ARGS="-p actions --node-args='--test-reporter=spec' --node-args='--test-reporter-destination=stdout' --measure-flakiness 9" + - name: Re-run test in a folder whose name contains unusual chars + run: | + mv node "$DIR" + cd "$DIR" + ./tools/test.py --flaky-tests keep_retrying -p actions -j 4 + env: + DIR: dir%20with $unusual"chars?'åß∂ƒ©∆¬…` diff --git a/test/common/index.js b/test/common/index.js index d1eaf6e69f603b..b5592a66a081c3 100644 --- a/test/common/index.js +++ b/test/common/index.js @@ -1135,6 +1135,15 @@ const common = { get checkoutEOL() { return fs.readFileSync(__filename).includes('\r\n') ? '\r\n' : '\n'; }, + + get isInsideDirWithUnusualChars() { + return __dirname.includes('%') || + (!isWindows && __dirname.includes('\\')) || + __dirname.includes('$') || + __dirname.includes('\n') || + __dirname.includes('\r') || + __dirname.includes('\t'); + }, }; const validProperties = new Set(Object.keys(common)); diff --git a/test/common/index.mjs b/test/common/index.mjs index 748977b85f8012..b252f2dc4aac5e 100644 --- a/test/common/index.mjs +++ b/test/common/index.mjs @@ -26,6 +26,7 @@ const { isDumbTerminal, isFreeBSD, isIBMi, + isInsideDirWithUnusualChars, isLinux, isLinuxPPCBE, isMainThread, @@ -81,6 +82,7 @@ export { isDumbTerminal, isFreeBSD, isIBMi, + isInsideDirWithUnusualChars, isLinux, isLinuxPPCBE, isMainThread, diff --git a/test/es-module/test-esm-invalid-pjson.js b/test/es-module/test-esm-invalid-pjson.js index 8eb417eec3a1a5..2235aa00e90653 100644 --- a/test/es-module/test-esm-invalid-pjson.js +++ b/test/es-module/test-esm-invalid-pjson.js @@ -19,6 +19,8 @@ describe('ESM: Package.json', { concurrency: !process.env.TEST_PARALLEL }, () => assert.ok( stderr.includes( `Invalid package config ${path.toNamespacedPath(invalidJson)} while importing "invalid-pjson" from ${entry}.` + ) || stderr.includes( + `Invalid package config ${path.toNamespacedPath(invalidJson)} while importing "invalid-pjson" from ${path.toNamespacedPath(entry)}.` ), stderr ); diff --git a/test/fixtures/snapshot/child-process-sync.js b/test/fixtures/snapshot/child-process-sync.js index 5ffacb05357df6..956b027d387192 100644 --- a/test/fixtures/snapshot/child-process-sync.js +++ b/test/fixtures/snapshot/child-process-sync.js @@ -8,7 +8,8 @@ const { function spawn() { const { spawnSync, execFileSync, execSync } = require('child_process'); spawnSync(process.execPath, [ __filename, 'spawnSync' ], { stdio: 'inherit' }); - execSync(`"${process.execPath}" "${__filename}" "execSync"`, { stdio: 'inherit' }); + if (!process.env.DIRNAME_CONTAINS_SHELL_UNSAFE_CHARS) + execSync(`"${process.execPath}" "${__filename}" "execSync"`, { stdio: 'inherit' }); execFileSync(process.execPath, [ __filename, 'execFileSync' ], { stdio: 'inherit' }); } diff --git a/test/parallel/test-fs-cp.mjs b/test/parallel/test-fs-cp.mjs index 0f3274ada62975..260a1449d1a953 100644 --- a/test/parallel/test-fs-cp.mjs +++ b/test/parallel/test-fs-cp.mjs @@ -1,4 +1,4 @@ -import { mustCall, mustNotMutateObjectDeep } from '../common/index.mjs'; +import { mustCall, mustNotMutateObjectDeep, isInsideDirWithUnusualChars } from '../common/index.mjs'; import assert from 'assert'; import fs from 'fs'; @@ -264,7 +264,7 @@ function nextdir(dirname) { } // It throws error if parent directory of symlink in dest points to src. -{ +if (!isInsideDirWithUnusualChars) { const src = nextdir(); mkdirSync(join(src, 'a'), mustNotMutateObjectDeep({ recursive: true })); const dest = nextdir(); @@ -279,7 +279,7 @@ function nextdir(dirname) { } // It throws error if attempt is made to copy directory to file. -{ +if (!isInsideDirWithUnusualChars) { const src = nextdir(); mkdirSync(src, mustNotMutateObjectDeep({ recursive: true })); const dest = './test/fixtures/copy/kitchen-sink/README.md'; @@ -310,7 +310,7 @@ function nextdir(dirname) { // It throws error if attempt is made to copy file to directory. -{ +if (!isInsideDirWithUnusualChars) { const src = './test/fixtures/copy/kitchen-sink/README.md'; const dest = nextdir(); mkdirSync(dest, mustNotMutateObjectDeep({ recursive: true })); @@ -346,7 +346,7 @@ function nextdir(dirname) { // It throws error if attempt is made to copy src to dest // when src is parent directory of the parent of dest -{ +if (!isInsideDirWithUnusualChars) { const src = nextdir('a'); const destParent = nextdir('a/b'); const dest = nextdir('a/b/c'); @@ -370,7 +370,7 @@ function nextdir(dirname) { } // It throws an error if attempt is made to copy socket. -if (!isWindows) { +if (!isWindows && !isInsideDirWithUnusualChars) { const src = nextdir(); mkdirSync(src); const dest = nextdir(); @@ -738,7 +738,7 @@ if (!isWindows) { } // It returns an error if attempt is made to copy socket. -if (!isWindows) { +if (!isWindows && !isInsideDirWithUnusualChars) { const src = nextdir(); mkdirSync(src); const dest = nextdir(); diff --git a/test/parallel/test-inspector-strip-types.js b/test/parallel/test-inspector-strip-types.js index c03a58345e59f9..ff6313a6eb2b21 100644 --- a/test/parallel/test-inspector-strip-types.js +++ b/test/parallel/test-inspector-strip-types.js @@ -7,8 +7,10 @@ if (!process.config.variables.node_use_amaro) common.skip('Requires Amaro'); const { NodeInstance } = require('../common/inspector-helper.js'); const fixtures = require('../common/fixtures'); const assert = require('assert'); +const { pathToFileURL } = require('url'); const scriptPath = fixtures.path('typescript/ts/test-typescript.ts'); +const scriptURL = pathToFileURL(scriptPath); async function runTest() { const child = new NodeInstance( @@ -30,10 +32,10 @@ async function runTest() { const scriptParsed = await session.waitForNotification((notification) => { if (notification.method !== 'Debugger.scriptParsed') return false; - return notification.params.url === scriptPath; + return notification.params.url === scriptPath || notification.params.url === scriptURL.href; }); // Verify that the script has a sourceURL, hinting that it is a generated source. - assert(scriptParsed.params.hasSourceURL); + assert(scriptParsed.params.hasSourceURL || common.isInsideDirWithUnusualChars); await session.waitForPauseOnStart(); await session.runToCompletion(); diff --git a/test/parallel/test-npm-install.js b/test/parallel/test-npm-install.js index ec848339b74004..fe9dbd46d9a7e0 100644 --- a/test/parallel/test-npm-install.js +++ b/test/parallel/test-npm-install.js @@ -2,6 +2,8 @@ const common = require('../common'); if (!common.hasCrypto) common.skip('missing crypto'); +if (common.isInsideDirWithUnusualChars) + common.skip('npm does not support this install path'); const path = require('path'); const exec = require('child_process').exec; diff --git a/test/parallel/test-snapshot-child-process-sync.js b/test/parallel/test-snapshot-child-process-sync.js index f47aa321c1290f..ac11ceae54d402 100644 --- a/test/parallel/test-snapshot-child-process-sync.js +++ b/test/parallel/test-snapshot-child-process-sync.js @@ -3,7 +3,7 @@ // This tests that process.cwd() is accurate when // restoring state from a snapshot -require('../common'); +const { isInsideDirWithUnusualChars } = require('../common'); const { spawnSyncAndAssert } = require('../common/child_process'); const tmpdir = require('../common/tmpdir'); const fixtures = require('../common/fixtures'); @@ -14,7 +14,7 @@ const blobPath = tmpdir.resolve('snapshot.blob'); const file = fixtures.path('snapshot', 'child-process-sync.js'); const expected = [ 'From child process spawnSync', - 'From child process execSync', + ...(isInsideDirWithUnusualChars ? [] : ['From child process execSync']), 'From child process execFileSync', ]; @@ -27,6 +27,7 @@ const expected = [ file, ], { cwd: tmpdir.path, + env: { ...process.env, DIRNAME_CONTAINS_SHELL_UNSAFE_CHARS: isInsideDirWithUnusualChars ? 'TRUE' : '' }, }, { trim: true, stdout(output) { @@ -43,6 +44,7 @@ const expected = [ file, ], { cwd: tmpdir.path, + env: { ...process.env, DIRNAME_CONTAINS_SHELL_UNSAFE_CHARS: isInsideDirWithUnusualChars ? 'TRUE' : '' }, }, { trim: true, stdout(output) { diff --git a/test/parallel/test-startup-empty-regexp-statics.js b/test/parallel/test-startup-empty-regexp-statics.js index 5744bbc14bba21..6cb9c50a521f1d 100644 --- a/test/parallel/test-startup-empty-regexp-statics.js +++ b/test/parallel/test-startup-empty-regexp-statics.js @@ -1,6 +1,11 @@ 'use strict'; const common = require('../common'); + +if (common.isInsideDirWithUnusualChars) { + common.skip('expected failure'); +} + const assert = require('node:assert'); const { spawnSync, spawn } = require('node:child_process'); @@ -66,7 +71,7 @@ const allRegExpStatics = assert.strictEqual(child.signal, null); } -{ +if (!common.isInsideDirWithUnusualChars) { const child = spawn(process.execPath, [], { stdio: ['pipe', 'pipe', 'inherit'], encoding: 'utf8' }); let stdout = ''; diff --git a/test/parallel/test-startup-empty-regexp-statics.mjs b/test/parallel/test-startup-empty-regexp-statics.mjs index 1f3869372b9690..1771bfd6530369 100644 --- a/test/parallel/test-startup-empty-regexp-statics.mjs +++ b/test/parallel/test-startup-empty-regexp-statics.mjs @@ -1,26 +1,28 @@ // We must load the CJS version here because the ESM wrapper call `hasIPv6` // which compiles a RegEx. // eslint-disable-next-line node-core/require-common-first -import '../common/index.js'; +import common from '../common/index.js'; import assert from 'node:assert'; -assert.strictEqual(RegExp.$_, ''); -assert.strictEqual(RegExp.$0, undefined); -assert.strictEqual(RegExp.$1, ''); -assert.strictEqual(RegExp.$2, ''); -assert.strictEqual(RegExp.$3, ''); -assert.strictEqual(RegExp.$4, ''); -assert.strictEqual(RegExp.$5, ''); -assert.strictEqual(RegExp.$6, ''); -assert.strictEqual(RegExp.$7, ''); -assert.strictEqual(RegExp.$8, ''); -assert.strictEqual(RegExp.$9, ''); -assert.strictEqual(RegExp.input, ''); -assert.strictEqual(RegExp.lastMatch, ''); -assert.strictEqual(RegExp.lastParen, ''); -assert.strictEqual(RegExp.leftContext, ''); -assert.strictEqual(RegExp.rightContext, ''); -assert.strictEqual(RegExp['$&'], ''); -assert.strictEqual(RegExp['$`'], ''); -assert.strictEqual(RegExp['$+'], ''); -assert.strictEqual(RegExp["$'"], ''); +if (!common.isInsideDirWithUnusualChars) { + assert.strictEqual(RegExp.$_, ''); + assert.strictEqual(RegExp.$0, undefined); + assert.strictEqual(RegExp.$1, ''); + assert.strictEqual(RegExp.$2, ''); + assert.strictEqual(RegExp.$3, ''); + assert.strictEqual(RegExp.$4, ''); + assert.strictEqual(RegExp.$5, ''); + assert.strictEqual(RegExp.$6, ''); + assert.strictEqual(RegExp.$7, ''); + assert.strictEqual(RegExp.$8, ''); + assert.strictEqual(RegExp.$9, ''); + assert.strictEqual(RegExp.input, ''); + assert.strictEqual(RegExp.lastMatch, ''); + assert.strictEqual(RegExp.lastParen, ''); + assert.strictEqual(RegExp.leftContext, ''); + assert.strictEqual(RegExp.rightContext, ''); + assert.strictEqual(RegExp['$&'], ''); + assert.strictEqual(RegExp['$`'], ''); + assert.strictEqual(RegExp['$+'], ''); + assert.strictEqual(RegExp["$'"], ''); +}