Files
OBLITERATUS/tests/test_local_ui_contracts.py
T

133 lines
4.5 KiB
Python

"""Local launcher behavior, auth, dependency, and hardware contracts."""
from __future__ import annotations
import sys
from types import SimpleNamespace
from unittest.mock import Mock
import pytest
from obliteratus import local_ui
@pytest.mark.parametrize(
("vram", "expected"),
[([], "cpu"), ([0], "mps"), ([4], "small"), ([8], "medium"), ([24], "large"), ([80], "frontier")],
)
def test_compute_tier_boundaries(vram, expected):
gpus = [{"vram_gb": amount} for amount in vram]
assert local_ui._compute_tier(gpus) == expected
def test_gpu_detection_enumerates_cuda_devices(monkeypatch):
cuda = SimpleNamespace(
is_available=lambda: True,
device_count=lambda: 2,
get_device_properties=lambda index: SimpleNamespace(
name=f"GPU {index}",
total_memory=(index + 8) * 1024**3,
major=9,
minor=index,
),
)
torch = SimpleNamespace(
cuda=cuda,
backends=SimpleNamespace(mps=SimpleNamespace(is_available=lambda: False)),
)
monkeypatch.setitem(sys.modules, "torch", torch)
assert local_ui._detect_gpu() == [
{"index": 0, "name": "GPU 0", "vram_gb": 8.0, "compute": "9.0"},
{"index": 1, "name": "GPU 1", "vram_gb": 9.0, "compute": "9.1"},
]
def test_gpu_detection_degrades_to_cpu_when_runtime_probe_fails(monkeypatch):
torch = SimpleNamespace(
cuda=SimpleNamespace(is_available=Mock(side_effect=RuntimeError("driver unavailable"))),
)
monkeypatch.setitem(sys.modules, "torch", torch)
assert local_ui._detect_gpu() == []
def test_launch_info_masks_password_and_reports_network_listener(monkeypatch):
console = Mock()
monkeypatch.setattr(local_ui, "console", console)
local_ui._print_launch_info("0.0.0.0", 9000, True, ("operator", "secret"))
rendered = console.print.call_args.args[0].renderable
assert "http://localhost:9000" in rendered
assert "http://<your-ip>:9000" in rendered
assert "operator:******" in rendered
assert "secret" not in rendered
def test_missing_gradio_exits_before_app_import(monkeypatch):
console = Mock()
monkeypatch.setattr(local_ui, "console", console)
monkeypatch.setitem(sys.modules, "gradio", None)
monkeypatch.delitem(sys.modules, "app", raising=False)
with pytest.raises(SystemExit) as exc_info:
local_ui.launch_local_ui(quiet=True)
assert exc_info.value.code == 1
assert "Gradio is not installed" in console.print.call_args.args[0]
assert "app" not in sys.modules
def test_quiet_launch_skips_hardware_probes_and_forwards_server_contract(monkeypatch):
launch = Mock()
monkeypatch.setitem(sys.modules, "gradio", SimpleNamespace())
monkeypatch.setitem(sys.modules, "app", SimpleNamespace(launch=launch))
monkeypatch.setattr(local_ui, "_detect_gpu", Mock(side_effect=AssertionError("must not run")))
monkeypatch.setattr(local_ui.sys, "path", ["/sentinel"])
kwargs = {
"host": "127.0.0.1",
"port": 9999,
"share": True,
"open_browser": False,
"auth": ("user", "password"),
"quiet": True,
}
local_ui.launch_local_ui(**kwargs)
local_ui.launch_local_ui(**kwargs)
expected_root = str(local_ui.pathlib.Path(local_ui.__file__).resolve().parent.parent)
assert local_ui.sys.path == [expected_root, "/sentinel"]
assert launch.call_count == 2
launch.assert_called_with(
server_name="127.0.0.1",
server_port=9999,
share=True,
inbrowser=False,
auth=("user", "password"),
quiet=True,
)
def test_nonquiet_launch_reports_hardware_before_starting_app(monkeypatch):
launch = Mock()
gpus = [{"index": 0, "name": "GPU", "vram_gb": 24, "compute": "9.0"}]
monkeypatch.setitem(sys.modules, "gradio", SimpleNamespace())
monkeypatch.setitem(sys.modules, "app", SimpleNamespace(launch=launch))
monkeypatch.setattr(local_ui, "console", Mock())
monkeypatch.setattr(local_ui, "_detect_gpu", Mock(return_value=gpus))
system_info = Mock()
recommendations = Mock()
launch_info = Mock()
monkeypatch.setattr(local_ui, "_print_system_info", system_info)
monkeypatch.setattr(local_ui, "_print_recommendations", recommendations)
monkeypatch.setattr(local_ui, "_print_launch_info", launch_info)
local_ui.launch_local_ui(host="localhost", port=7861, quiet=False)
system_info.assert_called_once_with(gpus)
recommendations.assert_called_once_with("large")
launch_info.assert_called_once_with("localhost", 7861, False, None)
launch.assert_called_once()