fix(producer): propagate --exclude-tags to Dockerfile.test ENTRYPOINT

Follow-up on Miga's review of #2512. The regression fixture
`escape-hatch-fatal-fallback` is tagged `field-signal-reproducer` and
`known-broken` so it's skipped from the default sweep via
`--exclude-tags transparency,field-signal-reproducer` in the
`test:regression*` scripts in packages/producer/package.json. But
`Dockerfile.test`'s ENTRYPOINT invoked the harness directly (`bunx tsx
src/regression-harness.ts -- --sequential`), bypassing those scripts —
so `bun run docker:test*` and the aws-lambda smoke tests would still
try to run the known-broken fixture and fail. CI's own regression sweep
was insulated only because it hardcodes per-shard positional test names
that don't include this fixture, but that's incidental, not by design.

Bake the exclude-tags into the Dockerfile.test ENTRYPOINT itself so
every user of the image (local `docker:test*`, aws-lambda smoke, any
adopter running the reference image) picks up the same skip contract.
Docker CMD args appended after the entrypoint (e.g. matrix shard
positional test names in .github/workflows/regression.yml, or
`--mode=distributed-simulated`) still parse correctly — the harness
applies excludeTags after testNames-filtering (see discoverTestSuites
in regression-harness.ts).

Also exports `parseArgs()` from regression-harness.ts and adds
regression-harness-parse.test.ts to pin the `--exclude-tags` comma-parse
contract, so any future change to the parser or the values baked into
the Dockerfile / package.json will trip a red test rather than silently
diverging.

Verification A (harness comma-parses `--exclude-tags transparency,
field-signal-reproducer`) already worked pre-fix; the new test file
codifies it. Verification B (Docker ENTRYPOINT propagates the same
skip) is what this commit fixes.

Signed-off-by: Via
This commit is contained in:
Via
2026-07-16 00:33:33 +00:00
parent e6cdf4abb1
commit 1c46eadceb
3 changed files with 69 additions and 2 deletions
@@ -0,0 +1,54 @@
// Pure-function tests for `parseArgs()` in the regression harness. Pins the
// `--exclude-tags` comma-parsing contract that the values baked into
// `Dockerfile.test` and `packages/producer/package.json` test scripts depend
// on. When someone changes the parser (e.g. to space-separated or repeated
// flags) these tests + the invocation strings in the Dockerfile / package.json
// must move together.
import { describe, expect, it } from "bun:test";
import { parseArgs } from "./regression-harness.js";
// parseArgs reads from index 2 onwards (node + script name are argv[0..1]).
const withProgram = (rest: string[]): string[] => ["node", "regression-harness.ts", ...rest];
describe("parseArgs() — --exclude-tags", () => {
it("splits a single --exclude-tags argument on commas", () => {
const opts = parseArgs(withProgram(["--exclude-tags", "transparency,field-signal-reproducer"]));
expect(opts.excludeTags).toEqual(["transparency", "field-signal-reproducer"]);
});
it("accepts a single tag with no comma", () => {
const opts = parseArgs(withProgram(["--exclude-tags", "transparency"]));
expect(opts.excludeTags).toEqual(["transparency"]);
});
it("supports repeated --exclude-tags flags (accumulating)", () => {
const opts = parseArgs(
withProgram(["--exclude-tags", "transparency", "--exclude-tags", "field-signal-reproducer"]),
);
expect(opts.excludeTags).toEqual(["transparency", "field-signal-reproducer"]);
});
it("matches the values baked into Dockerfile.test ENTRYPOINT and package.json scripts", () => {
// Pins the exact string the Dockerfile.test ENTRYPOINT + package.json
// `test:regression*` scripts pass. If either invocation site changes to
// whitespace-separated or another delimiter, this test fails and forces
// an audit of the parser at the same time.
const opts = parseArgs(
withProgram([
"--sequential",
"--exclude-tags",
"transparency,field-signal-reproducer",
"hdr-regression",
]),
);
expect(opts.sequential).toBe(true);
expect(opts.excludeTags).toEqual(["transparency", "field-signal-reproducer"]);
expect(opts.testNames).toEqual(["hdr-regression"]);
});
it("defaults excludeTags to an empty array when the flag is absent", () => {
const opts = parseArgs(withProgram([]));
expect(opts.excludeTags).toEqual([]);
});
});
+4 -1
View File
@@ -241,7 +241,10 @@ function formatResidualSuffix(residualRmsDb: number | null, error: string | unde
return `, residualRMS: ${residualRmsDb.toFixed(2)} dBFS`;
}
function parseArgs(argv: string[]): CliOptions {
// Exported for unit testing (pinning `--exclude-tags` comma-parsing so the
// values baked into `Dockerfile.test` and `packages/producer/package.json`
// scripts keep matching the parser's contract).
export function parseArgs(argv: string[]): CliOptions {
const testNames: string[] = [];
const excludeTags: string[] = [];
let update = false;