aboutsummaryrefslogtreecommitdiff
path: root/app/tests/test_backends_servers.py
diff options
context:
space:
mode:
Diffstat (limited to 'app/tests/test_backends_servers.py')
-rw-r--r--app/tests/test_backends_servers.py41
1 files changed, 38 insertions, 3 deletions
diff --git a/app/tests/test_backends_servers.py b/app/tests/test_backends_servers.py
index ab05eed..61897d4 100644
--- a/app/tests/test_backends_servers.py
+++ b/app/tests/test_backends_servers.py
@@ -65,10 +65,45 @@ class StartTests(unittest.TestCase):
ok = servers.start(self.spec)
self.assertTrue(ok)
mk.assert_called_once()
- # Pid file written.
+ # Pid file written (first field is the pid; the optional second
+ # field is the start-time ownership token, absent on this platform).
self.assertEqual(
- (self.dir / "test-server.pid").read_text(encoding="utf-8"),
- "4242")
+ (self.dir / "test-server.pid").read_text(encoding="utf-8")
+ .split()[0], "4242")
+
+ def test_pid_file_records_a_start_time_token_where_available(self):
+ proc = MagicMock()
+ proc.pid = 5150
+ proc.poll.return_value = None
+ with patch.object(servers, "LOG_DIR", self.dir), \
+ patch("subprocess.Popen", return_value=proc), \
+ patch.object(servers, "_process_start_token",
+ return_value="12345"), \
+ patch("backends.common.server_running",
+ side_effect=[False, True]), \
+ patch("time.sleep"):
+ self.assertTrue(servers.start(self.spec))
+ fields = (self.dir / "test-server.pid") \
+ .read_text(encoding="utf-8").split()
+ self.assertEqual(fields, ["5150", "12345"])
+
+ def test_recycled_pid_with_mismatched_token_is_not_ours(self):
+ # The pid is alive but its start time differs from the recorded
+ # token: an unrelated process now owns this pid, so manages/alive
+ # must report not-ours (and never kill it).
+ pid_file = self.dir / "test-server.pid"
+ pid_file.write_text("4242 111\n", encoding="utf-8")
+ with patch.object(servers, "LOG_DIR", self.dir), \
+ patch.object(servers, "_pid_alive", return_value=True), \
+ patch.object(servers, "_process_start_token",
+ return_value="999"):
+ self.assertFalse(servers.alive("test"))
+ self.assertFalse(servers.manages([self.spec]))
+ with patch.object(servers, "LOG_DIR", self.dir), \
+ patch.object(servers, "_pid_alive", return_value=True), \
+ patch.object(servers, "_process_start_token",
+ return_value="111"):
+ self.assertTrue(servers.alive("test"))
def test_returns_false_when_process_exits_early(self):
proc = MagicMock()