feat: enhance service manager with manifest validation, logging rotation, and command existence checks
This commit is contained in:
@@ -75,6 +75,50 @@ class ServiceManagerTests(unittest.TestCase):
|
||||
self.assertTrue(ok)
|
||||
self.assertIn(f"127.0.0.1:{port}", detail)
|
||||
|
||||
def test_validate_manifest_reports_bad_dependencies(self) -> None:
|
||||
manifest = {
|
||||
"services": {
|
||||
"bad": {
|
||||
"enabled": True,
|
||||
"kind": "process",
|
||||
"command": ["python3", "-c", "pass"],
|
||||
"depends_on": ["missing"],
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
errors = services.validate_manifest(manifest)
|
||||
|
||||
self.assertTrue(any("depends on unknown service" in error for error in errors))
|
||||
|
||||
def test_validate_manifest_reports_missing_command_for_enabled_service(self) -> None:
|
||||
manifest = {"services": {"bad": {"enabled": True, "kind": "process"}}}
|
||||
|
||||
errors = services.validate_manifest(manifest)
|
||||
|
||||
self.assertTrue(any("non-empty command" in error for error in errors))
|
||||
|
||||
def test_command_exists_supports_relative_executable_paths(self) -> None:
|
||||
with tempfile.TemporaryDirectory() as tmp:
|
||||
root = Path(tmp)
|
||||
script = root / "bin" / "tool.sh"
|
||||
script.parent.mkdir(parents=True)
|
||||
script.write_text("#!/usr/bin/env bash\n", encoding="utf-8")
|
||||
script.chmod(0o755)
|
||||
|
||||
with patch.object(services, "ROOT", root):
|
||||
self.assertTrue(services.command_exists("bin/tool.sh"))
|
||||
|
||||
def test_rotate_log_if_needed_keeps_backups(self) -> None:
|
||||
with tempfile.TemporaryDirectory() as tmp:
|
||||
log = Path(tmp) / "service.log"
|
||||
log.write_text("old", encoding="utf-8")
|
||||
|
||||
services.rotate_log_if_needed(log, max_bytes=1, backups=2)
|
||||
|
||||
self.assertFalse(log.exists())
|
||||
self.assertEqual(log.with_suffix(".log.1").read_text(encoding="utf-8"), "old")
|
||||
|
||||
def test_read_pid_ignores_invalid_pid_file(self) -> None:
|
||||
with tempfile.TemporaryDirectory() as tmp:
|
||||
pid_dir = Path(tmp) / "pids"
|
||||
|
||||
Reference in New Issue
Block a user