Refactor radar system

This commit is contained in:
Ayzen
2026-10-05 16:46:28 +03:00
parent 515049d2ed
commit 8f097dfa2e
179 changed files with 8212 additions and 6676 deletions
+66
View File
@@ -0,0 +1,66 @@
"""Exercise updates and launch guards using isolated files and command stubs."""
import os
from pathlib import Path
import subprocess
import tarfile
import tempfile
import unittest
PROJECT = Path(__file__).resolve().parents[2]
class DeploymentTest(unittest.TestCase):
def test_update_preserves_state_and_an_independent_rollback_environment(self) -> None:
with tempfile.TemporaryDirectory() as directory:
root = Path(directory)
target = root / 'radar_system'
release = root / 'release/radar_system'
for tree in (target, release):
(tree / 'python_app').mkdir(parents=True)
(tree / 'run_config_examples').mkdir(parents=True)
(tree / 'run_config_examples/device.json').write_text(tree.name)
(tree / 'run_config.json').write_text(str(tree))
(release / 'start.sh').write_text('#!/bin/bash\n')
(target / 'run_config_examples/device.json').write_text('device settings')
(target / 'loose_recording.bin').write_bytes(b'original data')
(target / 'python_app/data/calibration').mkdir(parents=True)
(target / 'python_app/data/calibration/set.npz').write_bytes(b'calibration')
(target / 'python_app/runtime/logs').mkdir(parents=True)
(target / 'python_app/runtime/gui_session_state.json').write_text('session')
(target / 'python_app/runtime/logs/old.log').write_text('log')
(target / '.venv/bin').mkdir(parents=True)
(target / '.venv/state').write_text('old environment')
interpreter = target / '.venv/bin/python'
interpreter.write_text('''#!/bin/bash
if [[ "$1" == --version ]]; then echo Python-test; exit; fi
printf 'updated environment' > "$(dirname -- "$0")/../state"
''')
interpreter.chmod(0o755)
commands = root / 'commands'
commands.mkdir()
for name, text in {'systemctl': 'exit 3', 'make': 'printf "%s\\n" "$@" > "$RADAR_TEST_BUILD_LOG"'}.items():
path = commands / name
path.write_text('#!/bin/bash\n' + text + '\n')
path.chmod(0o755)
archive = root / 'release.tar.gz'
with tarfile.open(archive, 'w:gz') as handle:
handle.add(release, arcname='radar_system')
log = root / 'build.log'
completed = subprocess.run(
['bash', str(PROJECT / 'deploy/update.sh'), archive.name], cwd=root,
env={**os.environ, 'RADAR_DIR': str(target), 'PATH': f'{commands}:{os.environ["PATH"]}',
'RADAR_TEST_BUILD_LOG': str(log)}, capture_output=True, text=True, timeout=10,
)
self.assertEqual(completed.returncode, 0, completed.stdout + completed.stderr)
backup = root / 'radar_system1'
self.assertEqual((target / '.venv/state').read_text(), 'updated environment')
self.assertEqual((backup / '.venv/state').read_text(), 'old environment')
self.assertEqual((target / 'loose_recording.bin').read_bytes(), b'original data')
self.assertEqual((target / 'python_app/data/calibration/set.npz').read_bytes(), b'calibration')
self.assertEqual((target / 'run_config.json').read_text(), str(target))
self.assertEqual((target / 'run_config_examples/device.json').read_text(), 'device settings')
self.assertTrue((target / 'run_config_examples/device.json.new').exists())
self.assertEqual((target / 'python_app/runtime/gui_session_state.json').read_text(), 'session')
self.assertFalse((target / 'python_app/runtime/logs').exists())
self.assertIn('kamil_adc_collector', log.read_text().splitlines())