46 lines
2.7 KiB
Python
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')
|