Include the current addon, terrain integrations, tools, regression tests and recorded development evidence.
35 lines
2.7 KiB
Python
35 lines
2.7 KiB
Python
#!/usr/bin/env python3
|
|
"""Read-only qualification/input check; never launches native or changes a package."""
|
|
from pathlib import Path
|
|
import json,hashlib,sys,zipfile
|
|
HERE=Path(__file__).resolve().parent
|
|
load=lambda p:json.loads(p.read_text())
|
|
sha=lambda p:hashlib.sha256(p.read_bytes()).hexdigest()
|
|
c=load(HERE/'config.json');f=Path(c['frozen_root']);suite=Path(c['suite_directory']);normal=Path(c['normal_evidence'])
|
|
sys.path.insert(0,str(f/'tools'));from source_bundle import inventory
|
|
source=inventory(f);result=load(suite/'suite-result.json');inputs=load(suite/'suite-inputs.json')
|
|
assert len(source)==c['expected_authored_files'] and result['regression_programs']==c['expected_regression_programs'], 'Planned snapshot changed; re-review configuration'
|
|
assert result['exit']==0 and result['inputs_unchanged'] and not result.get('resumed'),'Requires completed unchanged original full suite; reused binding checked below'
|
|
assert len(result['programs'])==result['regression_programs']==len({p['path'] for p in result['programs']})
|
|
assert all(p['exit']==0 for p in result['programs'])
|
|
from suite_binding import verify_suite_binding
|
|
suite_binding=verify_suite_binding(f, suite, source)
|
|
report=load(normal/'report.json');runner=load(normal/'runner.json.txt')
|
|
assert report['smoke_completions']==1 and not report['script_or_runtime_failures']
|
|
assert runner['cleanup_confirmed'] and runner['source_unchanged_after_run'] and runner['external_addons_unchanged_after_run']
|
|
assert sha(normal/'console.log.txt')==runner['console_sha256']
|
|
assert source==load(normal/'source-sha256.json')==load(normal/'launch-source-sha256.json')
|
|
for n in ['build','package_session','package_evidence','packed_session','packed_evidence']:
|
|
p=Path(c[n]);assert not p.exists() and not p.is_symlink(),f'Never reuse/overwrite {p}'
|
|
zip_path=Path(c['source_zip'])
|
|
if zip_path.exists():
|
|
with zipfile.ZipFile(zip_path) as z:
|
|
bm=load_manifest=json.loads(z.read('BUNDLE-MANIFEST.json'));names=z.namelist()
|
|
assert len(names)==len(set(names))==len({n.casefold() for n in names})
|
|
assert set(names)==set(bm['files'])|{'BUNDLE-MANIFEST.json'}
|
|
assert {n:h for n,h in bm['files'].items() if n.startswith('addons/')}==source
|
|
assert all(hashlib.sha256(z.read(n)).hexdigest()==h for n,h in bm['files'].items())
|
|
for n in ['package_session','packed_session']:
|
|
p=Path(c[n]);assert p.parent==Path('/tmp') and p==p.resolve(),'Native sessions must be direct canonical /tmp children'
|
|
print(json.dumps({'read_only':True,'authored_files':len(source),'regression_programs':result['regression_programs'],'normal_assertions':report['assertions_passed'],'retained_normal_engine_errors':len(report['engine_errors']),'qualified_for_next_diagnostic_step':True,'release_qualified':False},indent=2))
|