test(#4520): migrate generators/doc-gates/attribution batch to named timeout constants

Batch 9 of 17 in the ad hoc timeout literal migration (epic #4445).
Replaces every bare numeric timeout/timeoutMs object-literal property in
14 files with a named constant, per eslint-rules/no-adhoc-timeout-literal.cjs.
Removes the 14 files from the rule's allowlist.

The issue's own guess ("all run a scripts/*.cjs generator or lint script
once, BUILD_TIMEOUT_MS class") needed two corrections found by reading
every site directly. First, BUILD_TIMEOUT_MS's own doc comment scopes it
specifically to scripts/build-hooks.js, which none of this batch's
generator/lint-script sites run — a new shared constant,
GENERATOR_SCRIPT_TIMEOUT_MS, covers the class instead. Second,
no-pending-3212-markers.test.cjs's single site spawns `git ls-files`
directly, not a scripts/*.cjs script at all — routed to a second new
shared constant, REAL_REPO_GIT_TIMEOUT_MS, promoted once
emitted-attribution.test.cjs's own git-plumbing sites were found sharing
the same class and value.

Isolated Standards-axis review caught a further misclassification: one
of REAL_REPO_GIT_TIMEOUT_MS's three emitted-attribution.test.cjs sites
actually builds a fresh throwaway temp repo (createTempDir + git init),
contradicting that constant's own real-repo-tree-only scope. Fixed with
a new file-local FRESH_FIXTURE_GIT_TIMEOUT_MS holding the exact
pre-existing value under an honest name, rather than reusing the shared
GIT_FIXTURE_TIMEOUT_MS (which would have doubled the bound).

emitted-attribution.test.cjs also gets two more file-local constants:
HEAVY_REAL_TREE_TEST_TIMEOUT_MS (node:test's own per-test timeout
option, not a spawn bound) and BUILD_HOOKS_UNDER_LOAD_TIMEOUT_MS (the
same build-hooks.js script as the shared norm, at 4x its bound inside
the suite's heaviest test). emitted-ack-trailer.test.cjs gets
IMPOSSIBLY_SHORT_GIT_TIMEOUT_MS — the one value in this migration that
is deliberately tiny (20ms), used to force a timeout in a negative test,
not generous headroom.

No src/bin file touched, no numeric value changed anywhere.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
sim
2026-09-10 19:22:04 -04:00
parent a1a4182bda
commit 2eef8ada4f
16 changed files with 138 additions and 35 deletions

View File

@@ -1,10 +1,7 @@
[
"tests/adr-612-bracket-coherence.test.cjs",
"tests/adr-612-bracket-read-tolerance.test.cjs",
"tests/adr-index-gate.test.cjs",
"tests/adr857-core-without-capabilities.test.cjs",
"tests/api-coverage-gate-e2e.test.cjs",
"tests/api-coverage.test.cjs",
"tests/assumption-delta-checkpoint-e2e.test.cjs",
"tests/assumption-delta.test.cjs",
"tests/capability-cli.test.cjs",
@@ -13,9 +10,7 @@
"tests/capability-trust.test.cjs",
"tests/capability-validator-task-content-resolver.test.cjs",
"tests/capability-writer.test.cjs",
"tests/changeset-new.test.cjs",
"tests/check-env.test.cjs",
"tests/check-glossary-refs.test.cjs",
"tests/check-predicate.test.cjs",
"tests/cjs-command-router-adapter.test.cjs",
"tests/code-review-pipeline-regression.test.cjs",
@@ -24,24 +19,16 @@
"tests/config-get-default.test.cjs",
"tests/dispatcher.test.cjs",
"tests/effort-surface-axis.test.cjs",
"tests/emitted-ack-trailer.test.cjs",
"tests/emitted-attribution.test.cjs",
"tests/federated-config.test.cjs",
"tests/gate-predicate-evaluator.test.cjs",
"tests/gen-context-index.test.cjs",
"tests/gen-health-docs.test.cjs",
"tests/gen-section-manifest.test.cjs",
"tests/gen-state-md-docs.test.cjs",
"tests/graphify.test.cjs",
"tests/gsd-check-update-worker-platform-gate.test.cjs",
"tests/gsd-mcp-server-bin.test.cjs",
"tests/gsd-statusline.test.cjs",
"tests/health-validation.test.cjs",
"tests/init.test.cjs",
"tests/lint-docs-command-form.test.cjs",
"tests/locking-bugs-1909-1916-1925-1927.test.cjs",
"tests/milestone-lock.test.cjs",
"tests/no-pending-3212-markers.test.cjs",
"tests/pattern.test.cjs",
"tests/perf-316-state-lock-buffer-alloc.test.cjs",
"tests/perf-317-context-monitor-fs.test.cjs",
@@ -53,7 +40,6 @@
"tests/policy-160-route0-resume.test.cjs",
"tests/prohibition-enforcement.test.cjs",
"tests/quick-batch.test.cjs",
"tests/representative-corpus.test.cjs",
"tests/review-lane-invocation.test.cjs",
"tests/reviewer-manifest-body.test.cjs",
"tests/reviewer-trust-disclosure.test.cjs",

View File

@@ -18,6 +18,7 @@ const { spawnSync } = require('node:child_process');
const { createTempDir, cleanup } = require('./helpers.cjs');
const { copyScriptWithDeps } = require('./helpers/copy-script-fixture.cjs');
const { findTableWithColumns } = require('../gsd-core/bin/lib/markdown-table.cjs');
const { GENERATOR_SCRIPT_TIMEOUT_MS } = require('./helpers/timeouts.cjs');
const REPO_ROOT = path.resolve(__dirname, '..');
const SCRIPT_REL = path.join('scripts', 'gen-adr-index.cjs');
@@ -61,7 +62,7 @@ function run(root, args = []) {
const res = spawnSync(process.execPath, [path.join(root, SCRIPT_REL), ...args], {
cwd: root,
encoding: 'utf8',
timeout: 30_000,
timeout: GENERATOR_SCRIPT_TIMEOUT_MS,
});
if (res.error) throw res.error;
return { status: res.status, stdout: res.stdout || '', stderr: res.stderr || '' };

View File

@@ -23,6 +23,7 @@ const path = require('node:path');
const { cleanup, TEST_ENV_BASE } = require('./helpers.cjs');
const { runNode, OUTCOME } = require('./helpers/process-seam.cjs');
const { LOOP_HOOK_POINT_CLI_TIMEOUT_MS } = require('./helpers/timeouts.cjs');
// In-process seam for the fail-closed read-injection tests at the bottom of this
// file (#2365 review): readPhaseScope is the pure phase-scope reader behind the
// gate. Those tests monkeypatch fs rather than drive a subprocess.
@@ -39,7 +40,7 @@ function runTools(args, cwd) {
const r = runNode([TOOLS_PATH, ...argv], {
cwd,
env: { ...process.env, ...TEST_ENV_BASE },
timeoutMs: 60000,
timeoutMs: LOOP_HOOK_POINT_CLI_TIMEOUT_MS,
});
if (r.outcome === OUTCOME.EXITED && r.exitCode === 0) {
return { success: true, output: r.stdout.trim(), exitCode: 0, error: '' };

View File

@@ -17,6 +17,7 @@ const assert = require('node:assert/strict');
const { spawnSync } = require('node:child_process');
const path = require('node:path');
const fc = require('fast-check');
const { PROBE_TIMEOUT_MS } = require('./helpers/timeouts.cjs');
const MODULE_PATH = path.join(__dirname, '..', 'gsd-core', 'bin', 'lib', 'api-coverage.cjs');
@@ -985,7 +986,7 @@ describe('api-coverage CLI — STDIN + exit codes', () => {
const r = spawnSync(process.execPath, [CLI, '--json'], {
input: stdin,
encoding: 'utf-8',
timeout: 15000,
timeout: PROBE_TIMEOUT_MS,
});
return { exitCode: r.status, stdout: r.stdout, stderr: r.stderr };
}
@@ -1016,7 +1017,6 @@ describe('api-coverage CLI — NO_INPUT / UNAVAILABLE (ADR-3889 Phase 3, #3907)'
const INJECT_STDIN_ERROR = path.join(__dirname, 'helpers', 'inject-stdin-error.cjs');
const { exitCodeFor } = require('../gsd-core/bin/lib/exit-code-registry.cjs');
const { runNode } = require('./helpers/process-seam.cjs');
const { PROBE_TIMEOUT_MS } = require('./helpers/timeouts.cjs');
function runCliJson(stdin, extraArgs = [], extraEnv = {}) {
const r = runNode([CLI, '--json', ...extraArgs], {

View File

@@ -16,6 +16,7 @@ const { generateFragmentName, scaffoldFragment, parseFragment, parseArgs } = (()
})();
const { FRAGMENT_ERROR } = require(path.join(ROOT, 'scripts', 'changeset', 'parse.cjs'));
const { cleanup } = require('./helpers.cjs');
const { QUICK_SPAWN_TIMEOUT_MS } = require('./helpers/timeouts.cjs');
const NEW_CJS = path.join(ROOT, 'scripts', 'changeset', 'new.cjs');
@@ -114,7 +115,7 @@ describe('changeset new: --pr 0 placeholder acceptance (bug #1224)', () => {
const result = spawnSync(
process.execPath,
[NEW_CJS, '--type', 'Fixed', '--pr', '0', '--body', 'placeholder for pr-zero.', '--repo', isolatedDir],
{ encoding: 'utf8', timeout: 10000 },
{ encoding: 'utf8', timeout: QUICK_SPAWN_TIMEOUT_MS },
);
// The bug: old main() did `if (!opts.pr)` → exit 2. Fixed: exit 0.

View File

@@ -17,6 +17,7 @@ const { spawnSync } = require('node:child_process');
const { createTempDir, cleanup } = require('./helpers.cjs');
const { copyScriptWithDeps } = require('./helpers/copy-script-fixture.cjs');
const { GENERATOR_SCRIPT_TIMEOUT_MS } = require('./helpers/timeouts.cjs');
const REPO_ROOT = path.resolve(__dirname, '..');
const SCRIPT_REL = path.join('scripts', 'check-glossary-refs.cjs');
@@ -67,7 +68,7 @@ function run(root, args = []) {
const res = spawnSync(process.execPath, [path.join(root, SCRIPT_REL), ...args], {
cwd: root,
encoding: 'utf8',
timeout: 30_000,
timeout: GENERATOR_SCRIPT_TIMEOUT_MS,
});
if (res.error) throw res.error;
return { status: res.status, stdout: res.stdout || '', stderr: res.stderr || '' };
@@ -227,7 +228,7 @@ test('the real script runs cleanly against the real repo without crashing', () =
const res = spawnSync(process.execPath, [path.join(REPO_ROOT, SCRIPT_REL), '--check'], {
cwd: REPO_ROOT,
encoding: 'utf8',
timeout: 30_000,
timeout: GENERATOR_SCRIPT_TIMEOUT_MS,
});
assert.equal(res.error, undefined, `spawn must not error: ${res.error}`);
assert.ok(res.status === 0 || res.status === 1, `expected exit 0 or 1, got ${res.status} (stderr: ${res.stderr})`);

View File

@@ -794,6 +794,17 @@ describe('hostile IO: uncomputable range, subprocess failure, timeout', () => {
);
});
/**
* Deliberately, impossibly tiny -- NOT a generous-headroom bound like every
* other timeout constant in this test suite. Used to FORCE a TIMED_OUT
* outcome against an artificially huge git history (see
* growHistoryFastImport above), proving "an unreadable-in-time git call
* must throw a timeout, never hang." Named and commented distinctly so a
* future reader never mistakes this for a real operation-duration budget
* and "fixes" it by raising it.
*/
const IMPOSSIBLY_SHORT_GIT_TIMEOUT_MS = 20;
test('git log is bounded by a timeout — row 24', (t) => {
const dir = makeTempRepo('gsd-ack-trailer-24-');
withCleanup(t, dir);
@@ -801,7 +812,9 @@ describe('hostile IO: uncomputable range, subprocess failure, timeout', () => {
const start = Date.now();
assert.throws(
() => readAckTrailers({ baseRef: rootSha, headRef: 'HEAD', cwd: dir, timeoutMs: 20 }),
() => readAckTrailers({
baseRef: rootSha, headRef: 'HEAD', cwd: dir, timeoutMs: IMPOSSIBLY_SHORT_GIT_TIMEOUT_MS,
}),
/time/i,
'an unreadable-in-time git call must throw a timeout, never hang',
);

View File

@@ -90,6 +90,56 @@ const {
resolveBaseline,
} = require('./helpers/emitted-baseline.cjs');
/**
* git plumbing via a scratch index against this repo's REAL object
* database (never a throwaway fixture) -- run through this file's own
* hand-rolled git-spawn helper (never the shared
* tests/helpers/git-fixture.cjs). Shares the REAL_REPO_GIT_TIMEOUT_MS class
* with tests/no-pending-3212-markers.test.cjs's `git ls-files` call --
* promoted to tests/helpers/timeouts.cjs rather than kept file-local once a
* second file was found sharing the exact same value and shape.
*/
const { REAL_REPO_GIT_TIMEOUT_MS } = require('./helpers/timeouts.cjs');
/**
* git fixture CONSTRUCTION (init/config/add/commit) against a genuinely
* fresh temp repo, via this file's own hand-rolled git-spawn helper --
* correction from an earlier pass that conflated this with
* REAL_REPO_GIT_TIMEOUT_MS's real-repo-tree class; a Standards-axis review
* caught that this site's `repo` is a throwaway mkdtemp fixture
* (createTempDir + git init), not the real repo tree. Distinct from the
* SHARED tests/helpers/git-fixture.cjs's own GIT_FIXTURE_TIMEOUT_MS
* (60000ms, a six-spawn construction sequence): this site rolls its own,
* lighter five-spawn sequence at a genuinely different pre-existing bound,
* so reusing that shared constant would silently double this site's
* budget. No fresh bench data justifies a different number, so the
* pre-existing 30000ms literal is preserved exactly under this name.
*/
const FRESH_FIXTURE_GIT_TIMEOUT_MS = 30_000;
/**
* node:test's own per-test timeout option (NOT a subprocess spawn bound) --
* bounds the whole test body for this file's two heaviest tests: a real
* worktree checkout, `npm run build:lib`, a full multi-runtime install
* pass, and real git resolution. A completely different mechanism from
* every spawnSync/execFileSync timeout in this file or in
* tests/helpers/timeouts.cjs. No fresh bench data justifies a different
* number, so the pre-existing 480000ms literal is preserved exactly.
*/
const HEAVY_REAL_TREE_TEST_TIMEOUT_MS = 480_000;
/**
* Runs the exact same script as the shared BUILD_TIMEOUT_MS constant
* (scripts/build-hooks.js) but at 4x that constant's bound. This site
* sits inside "differential attribution over the real tree", the single
* heaviest test in the suite, where elevated system load plausibly
* justifies the wider margin -- not equalized to the lighter shared norm
* without bench data. Coincides numerically with INSTALL_TIMEOUT_MS (a
* full installer run, an unrelated operation) -- kept separate. No fresh
* bench data justifies a different number, so the pre-existing 120000ms
* literal is preserved exactly.
*/
const BUILD_HOOKS_UNDER_LOAD_TIMEOUT_MS = 120_000;
const SHA_A = 'a'.repeat(40);
const SHA_B = 'b'.repeat(40);
@@ -1425,7 +1475,7 @@ test('an unreadable baseline surfaces an error', () => {
test(
'buildBaselineAtRef resolves a baseline via the in-job build even when the generator '
+ 'script is absent at the ref (#2767 regression)',
{ timeout: 480_000 },
{ timeout: HEAVY_REAL_TREE_TEST_TIMEOUT_MS },
(t) => {
// Mirrors "differential attribution over the real tree": install output is
// platform-specific on Windows, and this drives the same heavy worktree +
@@ -1476,7 +1526,7 @@ test(
// closed. Reusing the SAME helper `buildBaselineAtRef` now uses (below) rather than
// hand-rolling the flag here keeps the fix from silently diverging per call site.
const run = (...args) => execFileSync('git', [...safeDirArgs(REPO_ROOT), ...args], {
cwd: REPO_ROOT, encoding: 'utf8', timeout: 30_000, env: gitEnv, stdio: ['ignore', 'pipe', 'pipe'],
cwd: REPO_ROOT, encoding: 'utf8', timeout: REAL_REPO_GIT_TIMEOUT_MS, env: gitEnv, stdio: ['ignore', 'pipe', 'pipe'],
}).trim();
const headSha = run('rev-parse', 'HEAD');
@@ -1492,7 +1542,7 @@ test(
// otherwise this test would prove nothing.
assert.throws(
() => execFileSync('git', [...safeDirArgs(REPO_ROOT), 'cat-file', '-e', `${syntheticSha}:scripts/gen-emitted-baseline.cjs`], {
cwd: REPO_ROOT, encoding: 'utf8', timeout: 30_000, stdio: 'pipe',
cwd: REPO_ROOT, encoding: 'utf8', timeout: REAL_REPO_GIT_TIMEOUT_MS, stdio: 'pipe',
}),
/./,
'the synthetic ref must genuinely lack the generator script for this test to prove anything',
@@ -1936,7 +1986,7 @@ test('baseline families are enumerated from the ref, not from the current regist
// this same process just created with `mkdtempSync` + `git init`, so its owner is
// always the uid running the test regardless of container — it is never the
// externally-mounted repo path the dubious-ownership check reacts to.
const run = (...args) => execFileSync('git', args, { cwd: repo, encoding: 'utf8', timeout: 30_000 });
const run = (...args) => execFileSync('git', args, { cwd: repo, encoding: 'utf8', timeout: FRESH_FIXTURE_GIT_TIMEOUT_MS });
run('init', '--quiet', '-b', 'main');
run('config', 'user.email', 'test@example.invalid');
@@ -2050,7 +2100,7 @@ test('property: reported added/dropped are exactly the set differences', () => {
// the working-tree fixtures, which would be whatever this PR's author regenerated;
// comparing against those would be vacuous.
test('differential attribution over the real tree', { timeout: 480_000 }, async (t) => {
test('differential attribution over the real tree', { timeout: HEAVY_REAL_TREE_TEST_TIMEOUT_MS }, async (t) => {
if (process.platform === 'win32') {
// Mirrors the golden harness: install output is platform-specific on Windows
// (backslash paths), so parity is asserted on macOS + Linux. An explicit t.skip,
@@ -2062,7 +2112,7 @@ test('differential attribution over the real tree', { timeout: 480_000 }, async
// hooks/dist is gitignored and built (DEFECT.HOOKS-DIST-SCOPED-CI): the scoped CI
// lane does not run build:hooks, so a real install there would emit no hooks/ dir.
// Build idempotently, exactly as the golden harness does.
execFileSync(process.execPath, [BUILD_SCRIPT], { encoding: 'utf-8', stdio: 'pipe', timeout: 120_000 });
execFileSync(process.execPath, [BUILD_SCRIPT], { encoding: 'utf-8', stdio: 'pipe', timeout: BUILD_HOOKS_UNDER_LOAD_TIMEOUT_MS });
// The base ref is not universally available. The gsd-test runner shallow-clones and
// merges base+head, so no `origin/*` remote-tracking ref exists in the container —

View File

@@ -44,6 +44,7 @@ const { execFileSync } = require('node:child_process');
const { createTempDir, cleanup } = require('./helpers.cjs');
const { serializeIndex, buildFreshIndex, checkReport, REASON } = require('../scripts/gen-context-index.cjs');
const { GENERATOR_SCRIPT_TIMEOUT_MS } = require('./helpers/timeouts.cjs');
const ROOT = path.resolve(__dirname, '..');
const SCRIPT = path.join(ROOT, 'scripts', 'gen-context-index.cjs');
@@ -71,7 +72,7 @@ function runGenContextIndex(args, paths = {}) {
cwd: ROOT,
encoding: 'utf8',
stdio: ['pipe', 'pipe', 'pipe'],
timeout: 30000,
timeout: GENERATOR_SCRIPT_TIMEOUT_MS,
});
return { code: 0, stdout, stderr: '' };
} catch (err) {

View File

@@ -18,6 +18,7 @@ const path = require('node:path');
const { execFileSync } = require('node:child_process');
const { createTempDir, cleanup } = require('./helpers.cjs');
const { GENERATOR_SCRIPT_TIMEOUT_MS } = require('./helpers/timeouts.cjs');
const {
buildErrorCodeRows,
renderErrorCodesRegion,
@@ -54,7 +55,7 @@ function runGenHealthDocs(args, cwd = ROOT) {
cwd,
encoding: 'utf8',
stdio: ['pipe', 'pipe', 'pipe'],
timeout: 30000,
timeout: GENERATOR_SCRIPT_TIMEOUT_MS,
});
return { code: 0, stdout, stderr: '' };
} catch (err) {

View File

@@ -22,6 +22,7 @@ const path = require('node:path');
const { execFileSync } = require('node:child_process');
const { createTempDir, cleanup } = require('./helpers.cjs');
const { GENERATOR_SCRIPT_TIMEOUT_MS } = require('./helpers/timeouts.cjs');
const {
buildFreshManifest,
writeManifestAtomically,
@@ -90,7 +91,7 @@ function runGenSectionManifest(args, cwd = ROOT) {
cwd,
encoding: 'utf8',
stdio: ['pipe', 'pipe', 'pipe'],
timeout: 30000,
timeout: GENERATOR_SCRIPT_TIMEOUT_MS,
});
return { code: 0, stdout, stderr: '' };
} catch (err) {

View File

@@ -27,6 +27,7 @@ const path = require('node:path');
const { createTempDir, cleanup } = require('./helpers.cjs');
const { runNode } = require('./helpers/process-seam.cjs');
const { GENERATOR_SCRIPT_TIMEOUT_MS } = require('./helpers/timeouts.cjs');
const gen = require('../scripts/gen-state-md-docs.cjs');
const { splitLines, detectEol, joinLines } = require('../gsd-core/bin/lib/text-lines.cjs');
@@ -46,7 +47,7 @@ function seedCleanTree(dir) {
function runGen(args, root) {
const fullArgs = [SCRIPT, ...args];
if (root !== undefined) fullArgs.push('--root', root);
const r = runNode(fullArgs, { timeoutMs: 30000 });
const r = runNode(fullArgs, { timeoutMs: GENERATOR_SCRIPT_TIMEOUT_MS });
return { code: r.exitCode, stdout: r.stdout, stderr: r.stderr };
}

View File

@@ -224,6 +224,47 @@ const SCAN_USAGE_ERROR_TIMEOUT_MS = 5000;
*/
const MALFORMED_INPUT_HOOK_TIMEOUT_MS = 5000;
/**
* A single `scripts/*.cjs` generator or lint script (gen-adr-index.cjs,
* check-glossary-refs.cjs, gen-context-index.cjs, and siblings), spawned
* directly and once against a small temp fixture repo -- no fan-out.
*
* Deliberately NOT `BUILD_TIMEOUT_MS`, despite the coincidentally-matching
* value: that constant's own doc comment scopes it specifically to
* `scripts/build-hooks.js` ("not a full project build"), and none of this
* norm's sites run that script. Reusing a constant for its number while
* ignoring what its comment actually describes is exactly the trap this
* migration exists to avoid -- see `SEAM_DEFAULT_TIMEOUT_MS` and
* `SCAN_USAGE_ERROR_TIMEOUT_MS` for the same reasoning applied elsewhere in
* this file.
*
* Shared across 7 files in batch #4520 of the ad hoc timeout literal
* migration, epic #4445 -- every site independently arrived at this exact
* value -- that is why it lives here rather than as a file-local constant.
*/
const GENERATOR_SCRIPT_TIMEOUT_MS = 30000;
/**
* A git plumbing command (or a short scratch-index sequence of them) run
* against the REAL, current repo tree -- never a throwaway mkdtemp fixture.
* Distinct from `GIT_TIMEOUT_MS` (15000ms, plumbing reads against a small
* fixture repo) and `GIT_FIXTURE_TIMEOUT_MS` (60000ms, the shared helper's
* own multi-spawn fixture-CONSTRUCTION sequence) -- this norm's sites
* either read the real object database directly (`git ls-files`) or build a
* synthetic commit on a scratch index against it, which is heavier than a
* tiny-fixture read but not the shared helper's own six-spawn construction
* class. Explicitly NOT for fixture-repo CONSTRUCTION (init/config/add/commit
* against a throwaway mkdtemp repo) -- tests/emitted-attribution.test.cjs's
* own file-local `FRESH_FIXTURE_GIT_TIMEOUT_MS` covers that shape instead,
* after an earlier pass conflated the two and a Standards-axis review caught
* it.
*
* Shared across 2 files in batch #4520 of the ad hoc timeout literal
* migration, epic #4445 -- every site independently arrived at this exact
* value -- that is why it lives here rather than as a file-local constant.
*/
const REAL_REPO_GIT_TIMEOUT_MS = 30000;
module.exports = {
PROBE_TIMEOUT_MS,
HOOK_FANOUT_TIMEOUT_MS,
@@ -238,4 +279,6 @@ module.exports = {
LOOP_HOOK_POINT_CLI_TIMEOUT_MS,
SCAN_USAGE_ERROR_TIMEOUT_MS,
MALFORMED_INPUT_HOOK_TIMEOUT_MS,
GENERATOR_SCRIPT_TIMEOUT_MS,
REAL_REPO_GIT_TIMEOUT_MS,
};

View File

@@ -19,6 +19,7 @@ const os = require('node:os');
const path = require('node:path');
const { runNode } = require('./helpers/process-seam.cjs');
const { gitOrThrow } = require('./helpers/git-fixture.cjs');
const { GENERATOR_SCRIPT_TIMEOUT_MS } = require('./helpers/timeouts.cjs');
const GUARD_SCRIPT = path.resolve(__dirname, '..', 'scripts', 'lint-docs-command-form.cjs');
@@ -60,7 +61,7 @@ function runGuard(cwd) {
const r = runNode([GUARD_SCRIPT], {
cwd,
env: { ...process.env, GSD_LINT_DOCS_COMMAND_FORM_REPO_ROOT: cwd },
timeoutMs: 30_000,
timeoutMs: GENERATOR_SCRIPT_TIMEOUT_MS,
});
return { status: r.exitCode, stdout: r.stdout, stderr: r.stderr };
}

View File

@@ -12,6 +12,7 @@ const { test } = require('node:test');
const assert = require('node:assert/strict');
const path = require('node:path');
const { execFileSync } = require('node:child_process');
const { REAL_REPO_GIT_TIMEOUT_MS } = require('./helpers/timeouts.cjs');
const ROOT = path.resolve(__dirname, '..');
const MARKER = 'pending #3212';
@@ -38,7 +39,7 @@ function listTrackedFiles() {
const stdout = execFileSync('git', ['-c', 'safe.directory=*', 'ls-files'], {
cwd: ROOT,
encoding: 'utf8',
timeout: 30000,
timeout: REAL_REPO_GIT_TIMEOUT_MS,
});
return stdout
.split(/\r?\n/)

View File

@@ -49,6 +49,7 @@ const path = require('node:path');
const { execFileSync } = require('node:child_process');
const { cleanup, TEST_ENV_BASE } = require('./helpers.cjs');
const { LOOP_HOOK_POINT_CLI_TIMEOUT_MS } = require('./helpers/timeouts.cjs');
const TOOLS_PATH = path.join(__dirname, '..', 'gsd-core', 'bin', 'gsd-tools.cjs');
const FIXTURES_ROOT = path.join(__dirname, 'fixtures', 'representative');
@@ -59,7 +60,7 @@ function runTools(args, cwd) {
cwd,
encoding: 'utf-8',
env: { ...process.env, ...TEST_ENV_BASE },
timeout: 60000,
timeout: LOOP_HOOK_POINT_CLI_TIMEOUT_MS,
});
return { success: true, output: stdout.trim(), error: '' };
} catch (err) {