test: use unusual chars in the path to ensure our tests are robust

PR-URL: https://github.com/nodejs/node/pull/48409
Reviewed-By: Jacob Smith <jacob@frende.me>
This commit is contained in:
Antoine du Hamel 2024-12-30 01:17:44 +01:00 committed by GitHub
parent ecc9fb2f8e
commit d2af881997
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
12 changed files with 82 additions and 39 deletions

View file

@ -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?'åß∂ƒ©∆¬…`

View file

@ -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?'åß∂ƒ©∆¬…`

View file

@ -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));

View file

@ -26,6 +26,7 @@ const {
isDumbTerminal,
isFreeBSD,
isIBMi,
isInsideDirWithUnusualChars,
isLinux,
isLinuxPPCBE,
isMainThread,
@ -81,6 +82,7 @@ export {
isDumbTerminal,
isFreeBSD,
isIBMi,
isInsideDirWithUnusualChars,
isLinux,
isLinuxPPCBE,
isMainThread,

View file

@ -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
);

View file

@ -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' });
}

View file

@ -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();

View file

@ -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();

View file

@ -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;

View file

@ -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) {

View file

@ -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 = '';

View file

@ -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["$'"], '');
}