import contextlib,glob,hashlib,json,os,unittest
from pathlib import Path
os.umask(0o077)
R=Path('/evidence');mode=os.environ['VERIFY_MODE'];root=Path('/source' if mode=='source' else '/opt/contextra')
assert Path.cwd()==root and not glob.glob('/dev/nvidia*')
plan=json.loads((R/'plan.json').read_text());result={}
with (R/(mode+'-verify.log')).open('x') as log,contextlib.redirect_stdout(log),contextlib.redirect_stderr(log):
    import app.api.streams as api
    import app.stream_settings as settings
    import app.stream_manager as manager
    paths={}
    for module,relative in [(api,'app/api/streams.py'),(settings,'app/stream_settings.py'),(manager,'app/stream_manager.py')]:
        path=Path(module.__file__).resolve();assert path==root/relative
        digest=hashlib.sha256(path.read_bytes()).hexdigest();assert digest==plan['source_hashes'][relative]
        paths[relative]=dict(path=str(path),sha256=digest)
    assert 'fire' in api.SettingsPatch.model_fields
    suite=unittest.defaultTestLoader.loadTestsFromName('test_fire_path.FireSettingsAPI')
    tested=unittest.TextTestRunner(stream=log,verbosity=2).run(suite)
    result=dict(tests=tested.testsRun,errors=len(tested.errors),failures=len(tested.failures),imports=paths,gpu_devices=0)
(R/(mode+'-verify.json')).write_text(json.dumps(result,indent=2));print(json.dumps(result));assert result['tests']==2 and result['errors']==result['failures']==0
