"""T2 硬件档位检测单测(封闭,纯逻辑 + 注入 runner)。""" import subprocess import pytest from runtime.hw_profile import ( TIER_SPECS, detect, nvidia_vram_gb, pick_tier, tier_spec, vulkan_present, ) class _FakeRun: """注入 subprocess runner:按命令返回预置输出。""" def __init__(self, mapping): self.mapping = mapping # {关键子串: CompletedProcess} def __call__(self, cmd, timeout): joined = " ".join(cmd) for key, cp in self.mapping.items(): if key in joined: return cp raise FileNotFoundError(cmd) def _cp(stdout="", rc=0): return subprocess.CompletedProcess(args=[], returncode=rc, stdout=stdout, stderr="") def test_pick_tier_thresholds(): assert pick_tier(None) == "cpu" assert pick_tier(6.0) == "cpu" assert pick_tier(8.0) == "gpu8" assert pick_tier(11.9) == "gpu8" assert pick_tier(12.0) == "gpu12" assert pick_tier(24.0) == "gpu12" def test_tier_specs_have_required_fields(): for tier, spec in TIER_SPECS.items(): assert spec["tier"] == tier assert "ngl" in spec and "ctx" in spec and "kv_quant" in spec # gpu12 ngl 全量卸载,cpu ngl 0 assert TIER_SPECS["gpu12"]["ngl"] == 99 assert TIER_SPECS["cpu"]["ngl"] == 0 def test_tier_spec_unknown_raises(): with pytest.raises(ValueError): tier_spec("nonexistent") def test_nvidia_vram_gb_parses(): fake = _FakeRun({"nvidia-smi": _cp("24576\n")}) assert nvidia_vram_gb(runner=fake) == 24.0 def test_nvidia_vram_gb_multi_gpu_takes_max(): fake = _FakeRun({"nvidia-smi": _cp("8192\n12288\n")}) assert nvidia_vram_gb(runner=fake) == 12.0 def test_nvidia_vram_gb_missing_tool_returns_none(monkeypatch): import shutil monkeypatch.setattr(shutil, "which", lambda name: None) assert nvidia_vram_gb() is None def test_vulkan_present_true(): fake = _FakeRun({"vulkaninfo": _cp("deviceName : NVIDIA GeForce RTX 4090")}) assert vulkan_present(runner=fake) is True def test_vulkan_present_software_false(): fake = _FakeRun({"vulkaninfo": _cp("deviceName : llvmpipe (LLVM)")}) assert vulkan_present(runner=fake) is False def test_detect_nvidia_gpu12(monkeypatch): # 让 shutil.which 只对 nvidia-smi 生效 real_which = __import__("shutil").which def fake_which(name): return "C:/x/nvidia-smi.exe" if name == "nvidia-smi" else None monkeypatch.setattr(__import__("shutil"), "which", fake_which) fake = _FakeRun({"nvidia-smi": _cp("24576\n")}) spec = detect(runner=fake) assert spec["tier"] == "gpu12" assert spec["ngl"] == 99 and spec["ctx"] == 32768 assert spec["probe"] == "nvidia" def test_detect_cpu_fallback(monkeypatch): monkeypatch.setattr(__import__("shutil"), "which", lambda name: None) spec = detect() assert spec["tier"] == "cpu" assert spec["ngl"] == 0 assert spec["probe"] == "cpu" def test_detect_override_tier(): spec = detect(override={"tier": "gpu8"}) assert spec["tier"] == "gpu8" assert spec["ngl"] == 14 and spec["ctx"] == 16384 assert spec["probe"] == "override" def test_detect_override_field(): spec = detect(override={"tier": "cpu", "ctx": 16384}) assert spec["ctx"] == 16384 assert spec["tier"] == "cpu"