File size: 1,597 Bytes
981aa5d
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
from types import SimpleNamespace

from codex_dashboard.processes import format_uptime, scan_processes


def test_scan_processes_filters_codex_lines():
    output = "\n".join(
        [
            "smlflg 101 0.0 0.1 1000 2048 ? S 10:00 0:00 codex",
            "smlflg 102 0.0 0.1 1000 2048 ? S 10:00 0:00 bash",
            "smlflg 103 1.5 0.2 1000 4096 pts/1 S 10:00 0:00 node mcp-server",
        ]
    )

    processes = scan_processes(ps_output=output)

    assert [process.pid for process in processes] == [103, 101]
    assert processes[0].name in {"MCP Server", "node/mcp-server"}


def test_scan_processes_reads_proc_metadata_for_live_ps(monkeypatch):
    import codex_dashboard.processes as processes_module

    output = "smlflg 4242 0.0 0.1 1000 2048 ? S 10:00 0:00 codex"

    monkeypatch.setattr(
        processes_module.subprocess,
        "run",
        lambda *_, **__: SimpleNamespace(returncode=0, stdout=output),
    )
    monkeypatch.setattr(processes_module.os, "getpid", lambda: 9999)
    monkeypatch.setattr(processes_module, "_read_cwd", lambda pid: f"/work/{pid}")
    monkeypatch.setattr(processes_module, "_read_uptime_seconds", lambda pid, now=None: 25 * 3600)

    result = scan_processes()

    assert len(result) == 1
    assert result[0].pid == 4242
    assert result[0].cwd == "/work/4242"
    assert result[0].uptime_seconds == 25 * 3600
    assert result[0].stale is True


def test_format_uptime():
    assert format_uptime(30) == "<1m"
    assert format_uptime(600) == "10m"
    assert format_uptime(7200) == "2h"
    assert format_uptime(172800) == "2d"