Files
ARCADIA-Studio/harness/scenario-selection-evidence-20260924/native/verify.py
T

46 lines
2.7 KiB
Python

"""Verify archived bytes and source-delta claims; does not execute the app."""
from pathlib import Path
import hashlib, json, zipfile
root = Path(__file__).resolve().parent
def pin(data): return {'bytes':len(data), 'sha256':hashlib.sha256(data).hexdigest()}
manifest = json.loads((root/'manifest.json').read_text(encoding='utf-8'))
assert pin((root/'native.zip').read_bytes()) == manifest['archive']
with zipfile.ZipFile(root/'native.zip') as archive:
assert len(archive.namelist()) == len(set(archive.namelist()))
assert set(archive.namelist()) == set(manifest['members'])
files = {name:archive.read(name) for name in archive.namelist()}
for name, data in files.items(): assert pin(data) == manifest['members'][name], name
start = json.loads(files['started.json'])
finish = json.loads(files['finished.json'])
build = json.loads(files['build/result.json'])
proof = json.loads(files['build/source-proof.json'])
assert start['source'] == manifest['source'] == build['head'] == proof['commit']
assert start['gate'] == manifest['buildRun'] == proof['run']
assert pin(files['build/result.json']) == start['receipt'] == proof['result']
assert pin(files['build/source-proof.json']) == start['proof']
assert pin(files['helpers/native.py']) == start['helper']
assert build['exitCode'] == 0 and build['inputsUnchanged'] is True
artifacts = [a for a in build['artifacts'] if a['cargo']['target']['name'] == 'arcadia-studio' and not a['cargo']['profile']['test']]
assert len(artifacts) == 1 and artifacts[0]['readback'] == start['binary']
assert finish['exitCode'] == 0 and finish['binaryUnchanged'] and finish['fixtureUnchanged']
baseline = files['baseline.arcadia']
assert pin(baseline) == start['fixture']
for name in ['selection-only-saved.arcadia', 'undo-saved.arcadia', 'working.arcadia']:
assert files[name] == baseline, name
assert pin(files['working.arcadia']) == finish['working']
begin = baseline.index(b' diagram incident_readable ')
end = baseline.index(b' diagram incident_wide ', begin)
old = b'{ address { references []; occurrence @updated_report; }; send_y 252; }'
new = b'{ address { references []; occurrence @updated_report; }; send_y 281.8841247558594; }'
assert baseline[begin:end].count(old) == 1
assert files['spacing-saved.arcadia'] == baseline[:begin]+baseline[begin:end].replace(old,new,1)+baseline[end:]
for stream in ['stdout','stderr']:
data = files['app.'+stream+'.log']
assert data == b'' and pin(data) == finish[stream]
for name, data in files.items():
if name.startswith('captures/') and name.endswith('.json'):
for item in json.loads(data)['images']:
assert 'captures/'+item['file'] in files
print('PASS native archive integrity, build/source linkage, exact source deltas and clean close; visual interpretation remains manual')