from __future__ import annotations import subprocess import unittest from vpn_egressctl.errors import CommandError, UnsupportedVersionError from vpn_egressctl.version import parse_version_output, probe_version, require_supported from tests.helpers import FakeRunner, VERSION_OUTPUT class VersionTests(unittest.TestCase): def test_parse_and_require(self) -> None: version = parse_version_output(VERSION_OUTPUT) self.assertEqual(version.version, "1.13.19") self.assertIn("with_quic", version.tags) require_supported(version) def test_other_versions_are_rejected(self) -> None: for value in ("1.13.12", "1.13.20", "1.14.0", "1.13.19-rc.1"): text = VERSION_OUTPUT.replace("1.13.19", value, 1) with self.subTest(value=value), self.assertRaises(UnsupportedVersionError): require_supported(parse_version_output(text)) def test_non_linux_rejected(self) -> None: version = parse_version_output(VERSION_OUTPUT.replace("linux/amd64", "windows/amd64")) with self.assertRaises(UnsupportedVersionError): require_supported(version) def test_missing_quic_rejected(self) -> None: version = parse_version_output(VERSION_OUTPUT.replace("with_quic,", "")) with self.assertRaises(UnsupportedVersionError): require_supported(version) def test_missing_gvisor_rejected(self) -> None: version = parse_version_output(VERSION_OUTPUT.replace("with_gvisor,", "")) with self.assertRaises(UnsupportedVersionError): require_supported(version) def test_command_failure(self) -> None: runner = FakeRunner() runner.version = "garbage" with self.assertRaises(UnsupportedVersionError): probe_version("sing-box", runner) if __name__ == "__main__": unittest.main()