import contextlib
import ctypes
import json
import os
from pathlib import Path
import subprocess
import unittest

R=Path('/evidence');os.umask(0o077)
label=os.environ.get('VERIFY_LABEL','verify')
with (R/(label+'.log')).open('x') as log, contextlib.redirect_stdout(log), contextlib.redirect_stderr(log):
    def run(args):subprocess.run(args,check=True,stdout=log,stderr=log,timeout=150)
    run(['make','-C','/source/native/nvinferserver_rfdetr','BUILD_DIR=/evidence/native','-j2','all','check'])
    run(['g++','-std=c++14','-O2','-DFIRE_TEST_MAIN','-I/source/native/nvinferserver_rfdetr','/source/tests/fire_decode_probe.cpp','-o','/evidence/fire-test'])
    run(['/evidence/fire-test'])
    run(['g++','-std=c++14','-O2','-shared','-fPIC','-I/source/native/nvinferserver_rfdetr','/source/tests/fire_decode_probe.cpp','-o','/evidence/fire-decode.so'])
    run(['g++','-std=c++17','-O2','-I/usr/local/cuda/include','-I/source/native/nvinferserver_rfdetr',
         '/source/model_tooling/engine_probe.cpp','-L/usr/local/cuda/lib64','-lnvinfer','-lnvinfer_plugin','-lcudart','-o','/evidence/engine-probe'])
    suite=unittest.TestSuite()
    names=('test_fire_path.py',) if label=='verify-fire-final' else ('test_fire_path.py','test_model_tooling.py','test_pose_path.py','test_pose_nms.py','test_output_settings.py','test_det_result_path.py')
    for name in names:
        suite.addTests(unittest.defaultTestLoader.discover('/source/tests',pattern=name))
    result=unittest.TextTestRunner(stream=log,verbosity=2).run(suite)
    summary=dict(tests=result.testsRun,errors=len(result.errors),failures=len(result.failures))
    (R/(label+'.json')).write_text(json.dumps(summary,indent=2))
print(json.dumps(summary))
raise SystemExit(not result.wasSuccessful())
