"""Tests for the run-test transport-independent polling/report core.""" import os import subprocess import tempfile import textwrap import unittest REPO_ROOT = os.path.abspath(os.path.join(os.path.dirname(__file__), "..", "..")) RUN_COMMON = os.path.join( REPO_ROOT, "scripts", "testing", "lib", "run-common.sh") VM_RUNNER = os.path.join(REPO_ROOT, "scripts", "testing", "run-test.sh") BARE_RUNNER = os.path.join( REPO_ROOT, "scripts", "testing", "run-test-baremetal.sh") def run_bash(body): return subprocess.run( ["bash", "-c", f'source "{RUN_COMMON}"\n{body}'], capture_output=True, text=True, cwd=REPO_ROOT, timeout=10, ) class SharedCoreWiring(unittest.TestCase): def test_both_runners_source_shared_core_and_avoid_ps_grep(self): for runner in (VM_RUNNER, BARE_RUNNER): with open(runner) as f: source = f.read() self.assertIn('source "$SCRIPT_DIR/lib/run-common.sh"', source) self.assertNotIn("ps aux | grep '[b]ash archsetup'", source) def test_vm_runner_adapts_the_password_taking_transport(self): with open(VM_RUNNER) as f: source = f.read() self.assertIn('vm_exec "$ROOT_PASSWORD" "$@"', source) self.assertIn("archsetup_process_running vm_transport", source) self.assertIn("wait_for_archsetup vm_transport", source) class PollArchsetup(unittest.TestCase): def test_uses_one_pgrep_liveness_probe_until_process_stops(self): proc = run_bash(textwrap.dedent("""\ checks=0 transport() { [ "$1" = "pgrep -f '[b]ash archsetup' > /dev/null" ] || { echo "bad-command:$1"; return 2; } checks=$((checks + 1)) [ "$checks" -lt 3 ] } progress() { echo "progress:$1"; } wait_for_archsetup transport 5 0 1 progress echo "rc=$? checks=$checks polls=$ARCHSETUP_POLL_COUNT" """)) self.assertEqual(proc.returncode, 0, proc.stderr) self.assertNotIn("bad-command", proc.stdout) self.assertIn("progress:1", proc.stdout) self.assertIn("progress:2", proc.stdout) self.assertIn("rc=0 checks=3 polls=2", proc.stdout) def test_returns_124_at_poll_limit(self): proc = run_bash(textwrap.dedent("""\ transport() { return 0; } set +e wait_for_archsetup transport 2 0 10 rc=$? set -e echo "rc=$rc polls=$ARCHSETUP_POLL_COUNT" """)) self.assertEqual(proc.returncode, 0, proc.stderr) self.assertIn("rc=124 polls=2", proc.stdout) class Report(unittest.TestCase): def test_writes_common_report_with_transport_specific_details(self): with tempfile.TemporaryDirectory() as d: report = os.path.join(d, "report.txt") proc = run_bash(textwrap.dedent(f"""\ write_archsetup_test_report "{report}" \ "Bare Metal ArchSetup Test Report" "stamp" \ "Bare Metal ZFS" "Target: ratio.local" \ yes true 12 1 2 "Results: {d}/" """)) self.assertEqual(proc.returncode, 0, proc.stderr) with open(report) as f: text = f.read() self.assertIn("Bare Metal ArchSetup Test Report", text) self.assertIn("Test Method: Bare Metal ZFS", text) self.assertIn("Target: ratio.local", text) self.assertIn("ArchSetup Completed: yes", text) self.assertIn("Validation: PASSED", text) self.assertIn("Passed: 12", text) self.assertIn(f"Results: {d}/", text) if __name__ == "__main__": unittest.main()