import contextlib
import glob
import json
import os
from pathlib import Path
import subprocess
import sys
import unittest

os.umask(0o077)
root = Path('/evidence')
os.environ['REDIS_STREAMS_ENABLED'] = 'false'
os.environ['TMPDIR'] = '/evidence'
assert not glob.glob('/dev/nvidia*')
mode = sys.argv[1] if len(sys.argv) > 1 else 'first'
patterns = ['test_metadata_connection.py', 'test_det_result_path.py', 'test_metadata_publisher.py',
            'test_metadata_samples.py', 'test_async_restart.py', 'test_native_metadata.py']
if mode == 'final':
    patterns += ['test_metadata_build_context.py', 'test_composition_architecture.py',
                 'test_stream_apply.py', 'test_stream_manager_lifecycle.py']
if mode in ('finish', 'sdk-fix'):
    patterns = ['test_metadata_connection.py', 'test_metadata_build_context.py']
if mode == 'sdk-diagnostic':
    patterns = []
with (root/(mode+'-tests.log')).open('w') as log, contextlib.redirect_stdout(log), contextlib.redirect_stderr(log):
    suite = unittest.TestSuite()
    for pattern in patterns:
        suite.addTests(unittest.defaultTestLoader.discover('/source/tests', pattern=pattern))
    result = unittest.TextTestRunner(stream=log, verbosity=2).run(suite)
    sdk = (subprocess.run(['python3', 'tests/sdk_frame_identity_probe.py', '/fixture.so'],
                         stdout=log, stderr=log, timeout=40).returncode if mode in ('first', 'finish', 'sdk-diagnostic', 'sdk-fix') else 0)
assert not glob.glob('/dev/nvidia*')
summary = dict(status='PASS' if result.wasSuccessful() and sdk == 0 else 'FAIL',
               tests=result.testsRun, failures=len(result.failures), errors=len(result.errors),
               sdk=sdk if mode in ('first', 'finish', 'sdk-diagnostic', 'sdk-fix') else 'prior_pass', gpu_nodes=0)
(root/(mode+'-verify.json')).write_text(json.dumps(summary))
print(json.dumps(summary))
raise SystemExit(summary['status'] != 'PASS')
