from pathlib import Path from hashlib import sha256 import subprocess, json, os, tempfile, re, signal, time out=Path(__file__).resolve().parent root=Path('/mnt/storage/src/mosaic-stack-rocko-129-r2') rows=json.loads((out/'mutants/results.json').read_text()) assert len(rows)==68 and all(r['result']=='KILLED' for r in rows) paths=(out/'changed-paths.txt').read_text().splitlines() expected={p:h for h,p in (line.split(' ',1) for line in (out/'candidate-manifest.sha256').read_text().splitlines())} assert set(paths)==set(expected) for p,h in expected.items(): assert sha256((root/p).read_bytes()).hexdigest()==h,p assert sha256(subprocess.check_output(['git','show',':'+p],cwd=root)).hexdigest()==h,p fd,index=tempfile.mkstemp(prefix='rocko-129-index-',dir='/mnt/storage/scratch/rocko-129-r2/tmp');os.close(fd) try: env={**os.environ,'GIT_INDEX_FILE':index} base=(out/'base.txt').read_text().strip() subprocess.run(['git','read-tree',base],cwd=root,env=env,check=True) subprocess.run(['git','apply','--cached',str(out/'build.patch')],cwd=root,env=env,check=True) actual=subprocess.check_output(['git','diff','--cached','--name-only',base],cwd=root,env=env,text=True).splitlines() assert set(actual)==set(paths) for p,h in expected.items():assert sha256(subprocess.check_output(['git','show',':'+p],cwd=root,env=env)).hexdigest()==h,p finally:Path(index).unlink(missing_ok=True) markers=['/mnt/storage/src/mosaic-stack-rocko-129','/mnt/storage/scratch/rocko-129'] def own(): found=[] for p in Path('/proc').glob('[0-9]*'): try: cwd=os.readlink(p/'cwd');args=(p/'cmdline').read_bytes().split(b'\0');exe=Path(args[0].decode()).name if not (exe=='node' or 'chrom' in exe):continue if any(cwd.startswith(m) or any(m.encode() in a for a in args) for m in markers):found.append({'pid':int(p.name),'exe':exe,'cwd':cwd}) except (OSError,UnicodeError):pass return found before=own() for p in before: try:os.kill(p['pid'],signal.SIGTERM) except ProcessLookupError:pass if before:time.sleep(1) for p in own(): try:os.kill(p['pid'],signal.SIGKILL) except ProcessLookupError:pass if before:time.sleep(.2) after=own();assert not after,after stamp=subprocess.check_output(['date','-u','+%Y-%m-%dT%H:%M:%SZ'],text=True).strip() verification={'at':stamp,'targeted_suites':json.loads((out/'suite-counts.json').read_text()),'mutants_killed':68,'candidate_files_restored':len(paths),'staged_blobs_restored':True,'reconstructed_files':len(paths),'process_sweep_before':before,'process_sweep_after':after,'Docker':'not used; dead DOCKER_HOST','TMPDIR':'/mnt/storage/scratch/rocko-129-r2/tmp','live_actions':False} (out/'verification.json').write_text(json.dumps(verification,indent=2)+'\n') print(json.dumps({'stamp':stamp,'reconstruction':len(paths),'process_sweep':after,'mutants':len(rows)}))