from gpu_rent.timing import ( PhaseTimes, WaitLog, clock_elapsed, clock_prefix, clock_reset, format_duration, ) def test_format_duration(): assert format_duration(5) == "5s" assert format_duration(65) == "1m 5s" assert format_duration(60) == "1m" assert format_duration(3661) == "1h 1m" def test_phase_times_summary(monkeypatch): times = iter([100.0, 110.0, 130.0, 190.0]) monkeypatch.setattr("gpu_rent.timing.time.monotonic", lambda: next(times)) clock = PhaseTimes() clock.mark("SSH") clock.mark("bootstrap") line = clock.summary_line() assert "SSH 10s" in line assert "bootstrap 20s" in line assert "всего" in line def test_phase_times_mark_logs(monkeypatch): times = iter([0.0, 45.0]) monkeypatch.setattr("gpu_rent.timing.time.monotonic", lambda: next(times)) logs: list[str] = [] clock = PhaseTimes() clock.mark("SSH", logs.append) assert logs == ["фаза SSH: 45s · всего 45s"] def test_phase_summary_lines_annotate_long_work(monkeypatch): # t0=0, mark provision at 120s times = iter([0.0, 120.0, 120.0]) monkeypatch.setattr("gpu_rent.timing.time.monotonic", lambda: next(times)) clock = PhaseTimes() clock.mark("provision") lines = clock.summary_lines() assert lines[0] == "тайминг up:" assert any("provision" in ln and "оптимизировать?" in ln for ln in lines) assert any("seed/extensions/LLM" in ln for ln in lines) def test_phase_summary_lines_annotate_wait(monkeypatch): times = iter([0.0, 40.0, 40.0]) monkeypatch.setattr("gpu_rent.timing.time.monotonic", lambda: next(times)) clock = PhaseTimes() clock.mark("SSH") lines = clock.summary_lines() assert any("SSH" in ln and "ожидание" in ln for ln in lines) def test_wait_log_throttles(monkeypatch): logs: list[str] = [] t = {"now": 0.0} monkeypatch.setattr("gpu_rent.timing.time.monotonic", lambda: t["now"]) w = WaitLog(logs.append, every=30.0) w.tick("a") t["now"] = 10.0 w.tick("b") t["now"] = 31.0 w.tick("c") assert logs == ["a", "c"] def test_clock_prefix(monkeypatch): t = {"now": 100.0} monkeypatch.setattr("gpu_rent.timing.time.monotonic", lambda: t["now"]) clock_reset() assert clock_prefix() == "[+0s] " t["now"] = 112.0 assert clock_prefix() == "[+12s] " assert clock_elapsed() == 12.0