import contextlib, glob, hashlib, json, os, pathlib, shlex, subprocess, sys, unittest
os.umask(0o077)
root = pathlib.Path('/evidence')
sys.path.extend(['/tool-overlay', '/evidence/build'])
os.environ['REDIS_STREAMS_ENABLED'] = 'false'
os.environ['TMPDIR'] = '/evidence'
assert not glob.glob('/dev/nvidia*')
with (root/'verify.log').open('w') as log, contextlib.redirect_stdout(log), contextlib.redirect_stderr(log):
    subprocess.run(['make','-C','native/frame_metadata','BUILD_DIR=/evidence/build',
                    'PYBIND_INCLUDE=/headers/pybind11/include'],
                   stdout=log, stderr=log, check=True, timeout=60)
    flags = shlex.split(subprocess.check_output(['pkg-config','--cflags','--libs','gstreamer-1.0'], text=True))
    subprocess.run(['g++','-std=c++14','-shared','-fPIC','tests/native_metadata_fixture.cpp',
        '-I/opt/nvidia/deepstream/deepstream/sources/includes',
        '-L/opt/nvidia/deepstream/deepstream/lib','-lnvds_meta','-lnvdsgst_meta',
        '-o','/evidence/build/fixture.so',*flags], check=True, stdout=log, stderr=log, timeout=30)
    from app.frame_ingress import require_identity_binding
    require_identity_binding()
    import contextra_frame_meta as binding
    probe = subprocess.run(['python3','tests/sdk_frame_identity_probe.py','/evidence/build/fixture.so'],
        env=dict(os.environ, PYTHONPATH='/opt/contextra:/evidence/build:/tool-overlay'),
        stdout=log, stderr=log, timeout=40)
    result = None
    if probe.returncode == 0:
        result = unittest.TextTestRunner(stream=log, verbosity=2).run(
            unittest.defaultTestLoader.discover('tests', pattern='test_det_result_path.py'))
    assert not glob.glob('/dev/nvidia*')
summary = dict(sdk_probe_exit=probe.returncode, abi=binding.sdk_abi, gpu_nodes=0,
    tests=result.testsRun if result else 0, failures=len(result.failures) if result else 0,
    errors=len(result.errors) if result else 0,
    binary_sha256=hashlib.sha256(pathlib.Path(binding.__file__).read_bytes()).hexdigest())
(root/'verify.json').write_text(json.dumps(summary, indent=2))
print(json.dumps(summary))
sys.exit(probe.returncode != 0 or result is None or not result.wasSuccessful())
