76 lines
3.1 KiB
Python
76 lines
3.1 KiB
Python
from __future__ import annotations
|
|
|
|
import os
|
|
import subprocess
|
|
import unittest
|
|
from pathlib import Path
|
|
|
|
|
|
ROOT = Path(__file__).resolve().parents[1]
|
|
|
|
|
|
class PackagingTests(unittest.TestCase):
|
|
def test_makefile_supports_src_layout(self) -> None:
|
|
makefile = (ROOT / "Makefile").read_text(encoding="utf-8")
|
|
self.assertIn("PYTHONPATH=src:.", makefile)
|
|
|
|
def test_release_metadata_is_mpl_2_and_version_0_2(self) -> None:
|
|
pyproject = (ROOT / "pyproject.toml").read_text(encoding="utf-8")
|
|
self.assertIn('version = "0.2.0"', pyproject)
|
|
self.assertIn('license = "MPL-2.0"', pyproject)
|
|
license_text = (ROOT / "LICENSE").read_text(encoding="utf-8")
|
|
self.assertIn("Mozilla Public License Version 2.0", license_text)
|
|
debian_copyright = (ROOT / "debian/copyright").read_text(encoding="utf-8")
|
|
self.assertIn("License: MPL-2.0", debian_copyright)
|
|
|
|
def test_debian_dependency_is_exactly_1_14_0(self) -> None:
|
|
control = (ROOT / "debian/control").read_text(encoding="utf-8")
|
|
self.assertIn("sing-box (= 1.14.0)", control)
|
|
|
|
def test_cross_release_upgrade_is_rejected_and_same_release_reinstall_allowed(self) -> None:
|
|
preinst = (ROOT / "debian/preinst").read_text(encoding="utf-8")
|
|
self.assertIn('[ "$1" = upgrade ] && [ "${2:-}" != "0.2.0" ]', preinst)
|
|
self.assertIn("in-place upgrades from another release", preinst)
|
|
self.assertIn("exit 1", preinst)
|
|
|
|
@unittest.skipUnless(os.name == "posix", "Debian maintainer scripts require POSIX sh")
|
|
def test_preinst_lifecycle_exit_codes(self) -> None:
|
|
preinst = ROOT / "debian/preinst"
|
|
cases = (
|
|
(("install",), 0),
|
|
(("upgrade", "0.2.0", "0.2.0"), 0),
|
|
(("upgrade", "0.1.0", "0.2.0"), 1),
|
|
(("upgrade", "0.2.1", "0.2.0"), 1),
|
|
)
|
|
for arguments, expected in cases:
|
|
with self.subTest(arguments=arguments):
|
|
result = subprocess.run(
|
|
["/bin/sh", str(preinst), *arguments],
|
|
capture_output=True,
|
|
text=True,
|
|
check=False,
|
|
)
|
|
self.assertEqual(result.returncode, expected, result.stderr)
|
|
|
|
def test_postinst_checks_for_legacy_state(self) -> None:
|
|
postinst = (ROOT / "debian/postinst").read_text(encoding="utf-8")
|
|
self.assertIn("vpn_egressctl.installcheck", postinst)
|
|
|
|
def test_sing_box_drop_in_requires_guard(self) -> None:
|
|
drop_in = ROOT / "packaging/systemd/sing-box.service.d/10-vpn-egress-guard.conf"
|
|
text = drop_in.read_text(encoding="utf-8")
|
|
self.assertIn("Requires=vpn-egress-guard.service", text)
|
|
self.assertIn("After=vpn-egress-guard.service", text)
|
|
|
|
def test_debian_package_installs_sing_box_drop_in(self) -> None:
|
|
install = (ROOT / "debian/install").read_text(encoding="utf-8")
|
|
self.assertIn(
|
|
"packaging/systemd/sing-box.service.d/10-vpn-egress-guard.conf "
|
|
"usr/lib/systemd/system/sing-box.service.d",
|
|
install,
|
|
)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
unittest.main()
|