[CI] (P13 W1): skip census baseline from run 37425662897, deduped name sets and a quiet self-test

This commit is contained in:
2026-10-06 04:04:39 -04:00
parent 5ff33cbb77
commit c6cb5dea68
2 changed files with 24319 additions and 9 deletions
+42 -9
View File
@@ -67,8 +67,29 @@ def collect(root):
def to_baseline(lanes):
return {lane: {'names': sorted(entries), 'skipped': sorted(n for n, s in entries.items() if s == 'skip')}
for lane, entries in sorted(lanes.items())}
"""Lanes whose name set equals an earlier lane's say so (`names_from`) instead of repeating
it: most gtest lanes run the same few thousand names, and the baseline stays reviewable."""
out, seen = {}, {}
for lane, entries in sorted(lanes.items()):
names = sorted(entries)
key = tuple(names)
row = {'skipped': sorted(n for n, s in entries.items() if s == 'skip')}
if key in seen:
row['names_from'] = seen[key]
else:
row['names'] = names
seen[key] = lane
out[lane] = row
return out
def resolve_baseline(baseline):
"""The inverse of to_baseline's dedupe: every lane gets its own `names`."""
resolved = {}
for lane, row in baseline.items():
names = row['names'] if 'names' in row else baseline[row['names_from']]['names']
resolved[lane] = {'names': names, 'skipped': row['skipped']}
return resolved
def compare(lanes, baseline):
@@ -123,7 +144,7 @@ def run(argv):
if not args.baseline.exists():
print(f'::error::skip census: no baseline at {args.baseline}; write one from a full run')
return 1
red, info = compare(lanes, json.loads(args.baseline.read_text()))
red, info = compare(lanes, resolve_baseline(json.loads(args.baseline.read_text())))
for line in info:
print(f'note: {line}')
for line in red:
@@ -133,6 +154,15 @@ def run(argv):
def self_test():
import contextlib
import io
def quiet(argv):
# The negative controls print ::error:: lines on purpose; on a runner those would show
# as error annotations on a GREEN self-test, so their output is swallowed here.
with contextlib.redirect_stdout(io.StringIO()):
return run(argv)
def junit(path, cases):
path.parent.mkdir(parents=True, exist_ok=True)
body = ''.join(
@@ -145,8 +175,8 @@ def self_test():
base = tmp / 'base.json'
good = tmp / 'good'
junit(good / 'junit-unit' / 'unit.xml', [('A', 'pass'), ('B', 'skip'), ('C', 'pass')])
assert run(['write', str(good), '--baseline', str(base)]) == 0
assert run(['check', str(good), '--baseline', str(base)]) == 0, 'identical run must be green'
assert quiet(['write', str(good), '--baseline', str(base)]) == 0
assert quiet(['check', str(good), '--baseline', str(base)]) == 0, 'identical run must be green'
cases = {
'pass -> skip': ([('A', 'skip'), ('B', 'skip'), ('C', 'pass')], 1),
'new skipped case': ([('A', 'pass'), ('B', 'skip'), ('C', 'pass'), ('D', 'skip')], 1),
@@ -158,13 +188,16 @@ def self_test():
for label, (run_cases, expected) in cases.items():
d = tmp / label.replace(' ', '_').replace('>', '')
junit(d / 'junit-unit' / 'unit.xml', run_cases)
got = run(['check', str(d), '--baseline', str(base)])
got = quiet(['check', str(d), '--baseline', str(base)])
assert got == expected, f'{label}: exit {got}, expected {expected}'
lost = tmp / 'lost'
junit(lost / 'junit-other' / 'other.xml', [('A', 'pass')])
assert run(['check', str(lost), '--baseline', str(base)]) == 1, 'a lane that vanished must be red'
assert run(['check', str(tmp / 'empty'), '--baseline', str(base)]) == 1, 'no JUnit must be red'
assert run(['check', str(good), '--baseline', str(tmp / 'none.json')]) == 1, 'no baseline must be red'
assert quiet(['check', str(lost), '--baseline', str(base)]) == 1, 'a lane that vanished must be red'
assert quiet(['check', str(tmp / 'empty'), '--baseline', str(base)]) == 1, 'no JUnit must be red'
assert quiet(['check', str(good), '--baseline', str(tmp / 'none.json')]) == 1, 'no baseline must be red'
twins = {'a/x': {'p': 'pass', 'q': 'skip'}, 'b/x': {'p': 'pass', 'q': 'pass'}}
packed = to_baseline(twins)
assert 'names_from' in packed['b/x'] and resolve_baseline(packed)['b/x']['names'] == ['p', 'q']
print('skip_census self-test: ok')
return 0
File diff suppressed because it is too large Load Diff