import contextlib
import io
import json
import os
from pathlib import Path
import unittest
import sys
import types

os.umask(0o077)
os.environ['DATABASE_URL'] = 'postgresql://unit:unit' + chr(64) + 'localhost:1/disabled'
# GPU-free unit boundary: any accidental media execution fails immediately.
sdk = types.ModuleType('pyservicemaker')
class NoRuntime:
    def __init__(self, *args, **kwargs):
        raise AssertionError('Native media execution is forbidden in unit verification')
for name in ('BufferOperator', 'BufferRetriever', 'Flow', 'Pipeline', 'Probe'):
    setattr(sdk, name, NoRuntime)
sys.modules['pyservicemaker'] = sdk
import hashlib
import ctypes
import stat
import subprocess
expected=json.loads(Path('/evidence/source_hashes.json').read_text())
for name, digest in expected.items():
    assert hashlib.sha256(Path('/opt/contextra',name).read_bytes()).hexdigest()==digest, name
assert os.environ['PYTHONPATH'].split(':')[0]=='/opt/contextra'
library=Path('/opt/contextra/lib/libcontextra_nvinferserver_rfdetr.so')
assert stat.S_IMODE(library.stat().st_mode)==0o555
assert library.read_bytes()[:4]==bytes((127, 69, 76, 70))
symbols=subprocess.check_output(['nm','-D','--defined-only',str(library)],text=True)
assert sum(line.split()[-1]=='CreateContextraRfDetrProcessor' for line in symbols.splitlines())==1
assert 'not found' not in subprocess.check_output(['ldd',str(library)],text=True)
handle=ctypes.CDLL(str(library))
getattr(handle,'CreateContextraRfDetrProcessor')
subprocess.run(['python3','-m','pip','check'],check=True,stdout=subprocess.PIPE)
subprocess.run(['python3','-m','compileall','-q','app','tests'],
    env={**os.environ,'PYTHONPYCACHEPREFIX':'/tmp/pycache'},check=True)
output = io.StringIO()
with contextlib.redirect_stdout(output), contextlib.redirect_stderr(output):
    suite = unittest.defaultTestLoader.discover('/opt/contextra/tests')
    result = unittest.TextTestRunner(stream=output, verbosity=2).run(suite)
Path('/evidence/tests.log').write_text(output.getvalue())
summary = {'tests': result.testsRun,
           'failures': [str(t) for t, _ in result.failures],
           'errors': [str(t) for t, _ in result.errors],
           'skipped': len(result.skipped)}
Path('/evidence/summary.json').write_text(json.dumps(summary, indent=2))
print(json.dumps(summary))
raise SystemExit(not result.wasSuccessful())
