50 lines
2.4 KiB
Python
50 lines
2.4 KiB
Python
#!/usr/bin/env python3
|
|
"""Runner rejects unsafe fixture reuse before any native/audio initialization."""
|
|
from pathlib import Path
|
|
import subprocess
|
|
import sys
|
|
import tempfile
|
|
import unittest
|
|
ROOT=Path(__file__).resolve().parents[1]
|
|
CASES=('native-end-active','native-end-preparing')
|
|
FILES=('erri-native-end-round.json','erri-native-end-round.json.tmp','erri-native-end-round.json.bak')
|
|
class NativeEndRunnerTests(unittest.TestCase):
|
|
def invoke(self,profile,case,*extra):
|
|
return subprocess.run([sys.executable,str(ROOT/'tools/headless_workbench.py'),'--compat',str(profile/'absent-prefix'),'--profile',str(profile),'--smoke',case,'--project','core','--rounds','2','--timeout','120',*extra],text=True,capture_output=True)
|
|
def test_scope_rejected_before_launch(self):
|
|
with tempfile.TemporaryDirectory() as tmp:
|
|
for case in CASES:
|
|
for args in [('--project','chat'),('--rounds','1'),('--rounds','3'),('--timeout','119')]:
|
|
with self.subTest(case=case,args=args):
|
|
r=self.invoke(Path(tmp),case,*args)
|
|
self.assertNotEqual(r.returncode,0)
|
|
self.assertIn('native-end fixtures require Core',r.stderr)
|
|
self.assertEqual(list(Path(tmp).iterdir()),[])
|
|
def test_existing_files_and_broken_links_are_preserved(self):
|
|
for case in CASES:
|
|
for name in FILES:
|
|
for linked in (False,True):
|
|
with self.subTest(case=case,name=name,linked=linked),tempfile.TemporaryDirectory() as tmp:
|
|
root=Path(tmp);p=root/name
|
|
if linked:p.symlink_to(root/'missing')
|
|
else:p.write_bytes(b'prior evidence')
|
|
r=self.invoke(root,case)
|
|
self.assertNotEqual(r.returncode,0)
|
|
self.assertIn('native-end fixture paths must not preexist',r.stderr)
|
|
if linked:self.assertTrue(p.is_symlink())
|
|
else:self.assertEqual(p.read_bytes(),b'prior evidence')
|
|
self.assertEqual(list(root.iterdir()),[p])
|
|
def test_valid_scope_reaches_prefix_guard_without_writes(self):
|
|
with tempfile.TemporaryDirectory() as tmp:
|
|
for case in CASES:
|
|
r=self.invoke(Path(tmp),case)
|
|
self.assertIn('must be a disposable cloned prefix',r.stderr)
|
|
self.assertEqual(list(Path(tmp).iterdir()),[])
|
|
def test_unrelated_outcome_keeps_prior_marker_untouched(self):
|
|
with tempfile.TemporaryDirectory() as tmp:
|
|
p=Path(tmp)/FILES[0];p.write_text('existing')
|
|
r=self.invoke(Path(tmp),'victory')
|
|
self.assertIn('must be a disposable cloned prefix',r.stderr)
|
|
self.assertEqual(p.read_text(),'existing')
|
|
if __name__=='__main__':unittest.main()
|