"""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')