import contextlib,glob,json,os,shlex,subprocess,unittest
from pathlib import Path
os.umask(0o077)
R=Path('/evidence');summary={};ds='/opt/nvidia/deepstream/deepstream'
assert not glob.glob('/dev/nvidia*')
assert ds+'/lib' not in os.environ.get('LD_LIBRARY_PATH','')
def run(args):subprocess.run(args,check=True,stdout=log,stderr=log,timeout=45)
with (R/'image-verify-sequence.log').open('x') as log,contextlib.redirect_stdout(log),contextlib.redirect_stderr(log):
    flags=shlex.split(subprocess.check_output(['pkg-config','--cflags','--libs','gstreamer-1.0'],text=True))
    run(['g++','-std=c++14','-shared','-fPIC','/source/tests/native_metadata_fixture.cpp','-I'+ds+'/sources/includes','-L'+ds+'/lib','-lnvds_meta','-lnvdsgst_meta','-Wl,-rpath,'+ds+'/lib','-o','/evidence/fixture.so',*flags])
    so='/opt/contextra/native/libcontextra_nvinferserver_rfdetr.so'
    if not Path(so).exists(): so=str(next(Path('/opt/contextra').rglob('libcontextra_nvinferserver_rfdetr.so')))
    run(['ldd',so])
    run(['g++','-std=c++14','-I'+ds+'/sources/includes/nvdsinferserver','-I'+ds+'/sources/includes','-I/usr/local/cuda/include','/evidence/factory.cpp','-ldl','-o','/evidence/factory'])
    run(['/evidence/factory',so]);summary['factories']=3
    for model,c in [('RFDETRMedium',0),('RFDETRFireSmoke',0),('RFDETRFireSmoke',1)]:
        run(['python3','/source/tests/sdk_frame_identity_probe.py','/evidence/fixture.so',model,str(c)])
    summary['sdk']=0
    result=unittest.TextTestRunner(stream=log,verbosity=2).run(unittest.defaultTestLoader.discover('/source/tests',pattern='test_fire_path.py'))
    summary.update(tests=result.testsRun,errors=len(result.errors),failures=len(result.failures))
(R/'image-verify.json').write_text(json.dumps(summary,indent=2));print(json.dumps(summary))
assert summary['errors']==summary['failures']==0
