47 lines
3.2 KiB
Python
47 lines
3.2 KiB
Python
#!/usr/bin/env python3
|
|
"""Assemble run3 evidence from complete logs without running tests."""
|
|
import hashlib, json, re
|
|
from pathlib import Path
|
|
HERE=Path(__file__).resolve().parent
|
|
RUN=HERE/'run3'
|
|
def main():
|
|
sections={n:json.loads((RUN/n/'results.json').read_text()) for n in ['syntax','red','focused','changes','whole']}
|
|
for n in ['syntax','focused','whole']:
|
|
assert all(s['code']==0 and not s['timeout'] for s in sections[n]['steps']), n
|
|
assert len(sections['whole']['steps'])==12
|
|
assert all(s['code']!=0 and not s['timeout'] for s in sections['red']['steps'])
|
|
changes=sections['changes']['changes']
|
|
assert len(changes)==6 and all(s['outcome']=='killed' and not s['timeout'] for s in changes)
|
|
limits=json.loads((HERE/'SHELL-LIMITS.json').read_text())['scripts']
|
|
shells=[]
|
|
for s in sections['whole']['steps'][2:]:
|
|
command=json.loads(Path(s['log']).with_suffix('.command.json').read_text())
|
|
script=command[-1]
|
|
assert command==['timeout','-k','10',str(limits[script]['limit_seconds']),'bash',script]
|
|
raw=Path(s['log']).read_text(errors='replace')
|
|
matches=re.findall(r'([^\n]*?: (\d+) passed, (\d+) failed)',raw)
|
|
assert matches, script
|
|
line, passed, failed=matches[-1]
|
|
assert int(failed)==0
|
|
shells.append(dict(script=script,pass_count=int(passed),fail_count=int(failed),seconds=s['seconds'],limit_seconds=limits[script]['limit_seconds'],summary_line=line,command=command))
|
|
webui=Path(sections['whole']['steps'][1]['log']).read_text(errors='replace')
|
|
skips=[line for line in webui.splitlines() if '# SKIP' in line]
|
|
direct=[]
|
|
for p in RUN.rglob('*.command.json'):
|
|
cmd=json.loads(p.read_text())
|
|
if 'node' in cmd and '--test' in cmd:
|
|
assert cmd[:5]==['timeout','-k','10','300','node']
|
|
direct.append(str(p))
|
|
expected=json.loads((HERE/'CANDIDATE-SHAS.json').read_text())
|
|
repo=HERE.parents[3]
|
|
assert all(hashlib.sha256((repo/n).read_bytes()).hexdigest()==v for n,v in expected.items())
|
|
assert all(hashlib.sha256((repo/n).read_bytes()).hexdigest()==v['script_sha256'] for n,v in limits.items())
|
|
result=dict(status='GREEN',grant='sage-2648',candidate='3e4c77ac6056e8efa887eecdbc4001d249b880f6',source='9696d1fcb78d6082cae8dcb61913225e98c9c138',manifest=hashlib.sha256((HERE/'MANIFEST.sha256').read_bytes()).hexdigest(),sections=sections,shells=shells,named_skips=skips,killed=len(changes),survived=0,timeouts=0,timeout_wrapped_direct_test_commands=direct,all_candidate_and_script_hashes_match=True)
|
|
(RUN/'SUMMARY.json').write_text(json.dumps(result,indent=2)+'\n')
|
|
defs={d['id']:d for d in json.loads((HERE/'changes.json').read_text())}
|
|
lines=['# Run3 kill table','','All six bases passed; no timeout. Every change restored exact bytes and tracked git status.','','| Check | Named killer | Base seconds | Changed seconds | Result |','|---|---|---:|---:|---|']
|
|
lines += [f"| {s['id']} | {defs[s['id']]['pattern']} | {s['base_seconds']} | {s['seconds']} | {s['outcome']} |" for s in changes]
|
|
(RUN/'KILL-TABLE.md').write_text('\n'.join(lines)+'\n')
|
|
print(json.dumps(dict(shells=shells,named_skips=skips,killed=len(changes)),indent=2))
|
|
if __name__=='__main__': main()
|