- Split DSH_COVERAGE_MAX_WORKERS between the two parallel gates (instrumented gets ~2/3, exempt gets ~1/3, both at least 1) so the lane never exceeds the budget the failover pool's 8 x 6-instance bound assumes; a budget of 1 pairs with DSH_GATE_CONCURRENCY=1 on the serial reference lanes, which already prevents gate overlap. - Fail loud on a set-but-not-'1' DSH_COVERAGE_EXEMPT_HEAVY value in vitest.config.ts instead of silently ignoring it. - Add coverage-exempt.spec.ts: each roster entry's filter and exclude must select the same non-empty spec set and entries must not overlap, so a renamed suite breaks the gate instead of silently returning to the instrumented run with a stale roster.
56 lines
2.1 KiB
TypeScript
56 lines
2.1 KiB
TypeScript
/**
|
|
* Mechanical guard for the coverage-exempt roster: each entry's positional
|
|
* filter and exclude glob must select the same non-empty file set out of the
|
|
* repository's spec inventory, so a renamed suite cannot silently fall out of
|
|
* the uninstrumented gate while its exclude goes stale.
|
|
*/
|
|
|
|
import { globSync } from 'node:fs'
|
|
import { resolve } from 'node:path'
|
|
import { describe, expect, it } from 'vitest'
|
|
import { coverageExemptHeavySuites } from './coverage-exempt.ts'
|
|
|
|
const root = resolve(import.meta.dirname, '..')
|
|
|
|
/** The spec inventory mirrored from vitest.config.ts testIncludes. */
|
|
const allSpecs = new Set([
|
|
...globSync('packages/*/*/tests/**/*.spec.ts', { cwd: root }),
|
|
...globSync('packages/*/*/tests/**/*.spec.tsx', { cwd: root }),
|
|
...globSync('apps/*/tests/**/*.spec.ts', { cwd: root }),
|
|
...globSync('examples/*/tests/**/*.spec.ts', { cwd: root }),
|
|
...globSync('scripts/**/*.spec.ts', { cwd: root }),
|
|
].map(path => path.replaceAll('\\', '/')))
|
|
|
|
function excludeMatches(exclude: string): string[] {
|
|
return globSync(exclude, { cwd: root })
|
|
.map(path => path.replaceAll('\\', '/'))
|
|
.filter(path => allSpecs.has(path))
|
|
.sort()
|
|
}
|
|
|
|
function filterMatches(filter: string): string[] {
|
|
return [...allSpecs].filter(spec => spec.startsWith(filter)).sort()
|
|
}
|
|
|
|
describe('coverage-exempt roster', () => {
|
|
it.each(coverageExemptHeavySuites.map(suite => [suite.filter, suite] as const))(
|
|
'filter and exclude select the same non-empty spec set for %s',
|
|
(_filter, suite) => {
|
|
const fromExclude = excludeMatches(suite.exclude)
|
|
const fromFilter = filterMatches(suite.filter)
|
|
expect(fromExclude.length).toBeGreaterThan(0)
|
|
expect(fromFilter).toEqual(fromExclude)
|
|
},
|
|
)
|
|
|
|
it('entries never overlap, so no suite is double-run or double-excluded', () => {
|
|
const seen = new Map<string, string>()
|
|
for (const suite of coverageExemptHeavySuites) {
|
|
for (const spec of excludeMatches(suite.exclude)) {
|
|
expect(seen.get(spec), `${spec} matched by ${seen.get(spec) ?? ''} and ${suite.exclude}`).toBeUndefined()
|
|
seen.set(spec, suite.exclude)
|
|
}
|
|
}
|
|
})
|
|
})
|