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"