44 lines
1.6 KiB
Python
44 lines
1.6 KiB
Python
import importlib.util
|
|
import json
|
|
import sys
|
|
import types
|
|
import unittest
|
|
from pathlib import Path
|
|
from unittest.mock import patch
|
|
|
|
|
|
SCRIPT = Path(__file__).parents[1] / "scripts" / "spike_meerk40t_mock_mopa.py"
|
|
FIXTURE = Path(__file__).parent / "fixtures" / "meerk40t-mock-mopa-trace.json"
|
|
SPEC = importlib.util.spec_from_file_location("spike_meerk40t_mock_mopa", SCRIPT)
|
|
MODULE = importlib.util.module_from_spec(SPEC)
|
|
assert SPEC.loader is not None
|
|
SPEC.loader.exec_module(MODULE)
|
|
|
|
|
|
class MockSpikeSafetyTests(unittest.TestCase):
|
|
def test_golden_trace_records_pin_mock_and_mopa_values(self):
|
|
result = json.loads(FIXTURE.read_text(encoding="utf-8"))
|
|
trace = "\n".join(result["trace"])
|
|
self.assertEqual(MODULE.PINNED_COMMIT, result["commit"])
|
|
self.assertEqual("MockConnection", result["transport"])
|
|
self.assertEqual("trapped; none attempted", result["usb_access"])
|
|
self.assertIn("801b:01f4", trace)
|
|
self.assertIn("8026:00c8", trace)
|
|
self.assertEqual(4, trace.count("listMarkTo"))
|
|
|
|
def test_usb_trap_rejects_enumeration(self):
|
|
with patch.dict(sys.modules, clear=False):
|
|
MODULE._install_usb_trap()
|
|
import usb.core
|
|
|
|
with self.assertRaisesRegex(AssertionError, "real USB access"):
|
|
usb.core.find(idVendor=0x9588, idProduct=0x9899)
|
|
|
|
def test_rejects_unpinned_checkout(self):
|
|
with patch.object(MODULE, "_commit_of", return_value="wrong"):
|
|
with self.assertRaisesRegex(RuntimeError, "expected MeerK40t"):
|
|
MODULE.run(Path("unused"))
|
|
|
|
|
|
if __name__ == "__main__":
|
|
unittest.main()
|