feat: add PID file utilities and tunnel status detection
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
97
tests/unit/test_process.py
Normal file
97
tests/unit/test_process.py
Normal file
@@ -0,0 +1,97 @@
|
||||
import os
|
||||
import pytest
|
||||
from datetime import datetime, timezone, timedelta
|
||||
from unittest.mock import patch
|
||||
from autossh_mgr.process import (
|
||||
write_pid_file, read_pid_file, delete_pid_file,
|
||||
is_process_alive, check_stale, get_status, format_uptime,
|
||||
TunnelStatus,
|
||||
)
|
||||
|
||||
|
||||
def test_write_and_read_pid_file(config_dir):
|
||||
started = datetime(2026, 5, 20, 10, 0, 0, tzinfo=timezone.utc)
|
||||
write_pid_file(config_dir, "web-service", 12345, started)
|
||||
pid, ts = read_pid_file(config_dir, "web-service")
|
||||
assert pid == 12345
|
||||
assert ts == started
|
||||
|
||||
|
||||
def test_read_pid_file_missing(config_dir):
|
||||
assert read_pid_file(config_dir, "missing") is None
|
||||
|
||||
|
||||
def test_delete_pid_file(config_dir):
|
||||
started = datetime.now(timezone.utc)
|
||||
write_pid_file(config_dir, "web-service", 12345, started)
|
||||
delete_pid_file(config_dir, "web-service")
|
||||
assert read_pid_file(config_dir, "web-service") is None
|
||||
|
||||
|
||||
def test_delete_pid_file_missing_is_noop(config_dir):
|
||||
delete_pid_file(config_dir, "missing") # must not raise
|
||||
|
||||
|
||||
def test_is_process_alive_running():
|
||||
# os.getpid() is always alive
|
||||
assert is_process_alive(os.getpid()) is True
|
||||
|
||||
|
||||
def test_is_process_alive_dead():
|
||||
assert is_process_alive(9999999) is False
|
||||
|
||||
|
||||
def test_check_stale_no_pid_file(config_dir):
|
||||
assert check_stale(config_dir, "web-service") is False
|
||||
|
||||
|
||||
def test_check_stale_running_process(config_dir):
|
||||
write_pid_file(config_dir, "web-service", os.getpid(), datetime.now(timezone.utc))
|
||||
assert check_stale(config_dir, "web-service") is False
|
||||
|
||||
|
||||
def test_check_stale_dead_process(config_dir):
|
||||
write_pid_file(config_dir, "web-service", 9999999, datetime.now(timezone.utc))
|
||||
assert check_stale(config_dir, "web-service") is True
|
||||
|
||||
|
||||
def test_get_status_stopped(config_dir):
|
||||
status = get_status(config_dir, "web-service")
|
||||
assert status.state == "stopped"
|
||||
assert status.pid is None
|
||||
assert status.uptime is None
|
||||
|
||||
|
||||
def test_get_status_running(config_dir):
|
||||
write_pid_file(config_dir, "web-service", os.getpid(), datetime.now(timezone.utc))
|
||||
status = get_status(config_dir, "web-service")
|
||||
assert status.state == "running"
|
||||
assert status.pid == os.getpid()
|
||||
assert status.uptime is not None
|
||||
|
||||
|
||||
def test_get_status_stale(config_dir):
|
||||
write_pid_file(config_dir, "web-service", 9999999, datetime.now(timezone.utc))
|
||||
status = get_status(config_dir, "web-service")
|
||||
assert status.state == "stale"
|
||||
assert status.pid == 9999999
|
||||
|
||||
|
||||
def test_format_uptime_seconds():
|
||||
started = datetime.now(timezone.utc) - timedelta(seconds=45)
|
||||
assert format_uptime(started) == "45s"
|
||||
|
||||
|
||||
def test_format_uptime_minutes():
|
||||
started = datetime.now(timezone.utc) - timedelta(minutes=3, seconds=15)
|
||||
assert format_uptime(started) == "3m"
|
||||
|
||||
|
||||
def test_format_uptime_hours():
|
||||
started = datetime.now(timezone.utc) - timedelta(hours=2, minutes=30)
|
||||
assert format_uptime(started) == "2h 30m"
|
||||
|
||||
|
||||
def test_format_uptime_days():
|
||||
started = datetime.now(timezone.utc) - timedelta(days=1, hours=5)
|
||||
assert format_uptime(started) == "1d 5h"
|
||||
Reference in New Issue
Block a user