Sprinter: добавить отладку C-исходников и интеграцию VS Code
This commit is contained in:
@@ -0,0 +1,71 @@
|
||||
"""Контракт файлового канала: владение, атомарный ответ и неизвестный итог."""
|
||||
import json
|
||||
import os
|
||||
from pathlib import Path
|
||||
import sys
|
||||
import tempfile
|
||||
import threading
|
||||
import time
|
||||
import unittest
|
||||
|
||||
ROOT = Path(__file__).resolve().parents[2]
|
||||
sys.path.insert(0, str(ROOT / 'toolchain'))
|
||||
from sdbg.build import write_json
|
||||
from sdbg.transport import BridgeError, FileBridge
|
||||
|
||||
|
||||
class TransportTests(unittest.TestCase):
|
||||
def test_owner_lock(self):
|
||||
with tempfile.TemporaryDirectory() as directory:
|
||||
first = FileBridge(directory, 'one')
|
||||
try:
|
||||
with self.assertRaisesRegex(BridgeError, 'управляющая'):
|
||||
FileBridge(directory, 'one')
|
||||
finally:
|
||||
first.close()
|
||||
with self.assertRaisesRegex(BridgeError, 'закрыт'):
|
||||
first.request('continue')
|
||||
second = FileBridge(directory, 'one')
|
||||
second.close()
|
||||
|
||||
def test_response_generation_and_session(self):
|
||||
with tempfile.TemporaryDirectory() as directory:
|
||||
bridge = FileBridge(directory, 'session', timeout=1)
|
||||
def backend():
|
||||
deadline = time.monotonic() + 1
|
||||
while time.monotonic() < deadline:
|
||||
requests = list(Path(directory).glob('req_*.json'))
|
||||
if requests:
|
||||
request = requests[0]
|
||||
data = json.loads(request.read_text())
|
||||
response = request.with_name(request.name.replace('req_', 'resp_'))
|
||||
write_json(response, {'session': data['session'], 'generation': 7,
|
||||
'ok': True, 'result': {'state': 'stopped'}})
|
||||
request.unlink()
|
||||
return
|
||||
time.sleep(.001)
|
||||
thread = threading.Thread(target=backend)
|
||||
thread.start()
|
||||
try:
|
||||
self.assertEqual(bridge.request('snapshot')['state'], 'stopped')
|
||||
self.assertEqual(bridge.generation, 7)
|
||||
finally:
|
||||
thread.join()
|
||||
bridge.close()
|
||||
|
||||
def test_timeout_never_retries_mutation(self):
|
||||
with tempfile.TemporaryDirectory() as directory:
|
||||
bridge = FileBridge(directory, 'session', timeout=.025)
|
||||
try:
|
||||
with self.assertRaisesRegex(BridgeError, 'Timeout'):
|
||||
bridge.request('continue')
|
||||
self.assertTrue(bridge.invalid)
|
||||
with self.assertRaisesRegex(BridgeError, 'инвалидирован'):
|
||||
bridge.request('continue')
|
||||
self.assertFalse(list(Path(directory).glob('req_*.json')))
|
||||
finally:
|
||||
bridge.close()
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
unittest.main()
|
||||
Reference in New Issue
Block a user