Update tests

This commit is contained in:
Nicolas Mowen 2026-05-04 08:51:43 -06:00
parent 286144deb4
commit 3208acfbbd

View File

@ -7,8 +7,6 @@ from frigate.util.services import get_amd_gpu_stats, get_intel_gpu_stats
class TestGpuStats(unittest.TestCase): class TestGpuStats(unittest.TestCase):
def setUp(self): def setUp(self):
self.amd_results = "Unknown Radeon card. <= R500 won't work, new cards might.\nDumping to -, line limit 1.\n1664070990.607556: bus 10, gpu 4.17%, ee 0.00%, vgt 0.00%, ta 0.00%, tc 0.00%, sx 0.00%, sh 0.00%, spi 0.83%, smx 0.00%, cr 0.00%, sc 0.00%, pa 0.00%, db 0.00%, cb 0.00%, vram 60.37% 294.04mb, gtt 0.33% 52.21mb, mclk 100.00% 1.800ghz, sclk 26.65% 0.533ghz\n" self.amd_results = "Unknown Radeon card. <= R500 won't work, new cards might.\nDumping to -, line limit 1.\n1664070990.607556: bus 10, gpu 4.17%, ee 0.00%, vgt 0.00%, ta 0.00%, tc 0.00%, sx 0.00%, sh 0.00%, spi 0.83%, smx 0.00%, cr 0.00%, sc 0.00%, pa 0.00%, db 0.00%, cb 0.00%, vram 60.37% 294.04mb, gtt 0.33% 52.21mb, mclk 100.00% 1.800ghz, sclk 26.65% 0.533ghz\n"
self.intel_results = """{"period":{"duration":1.194033,"unit":"ms"},"frequency":{"requested":0.000000,"actual":0.000000,"unit":"MHz"},"interrupts":{"count":3349.991164,"unit":"irq/s"},"rc6":{"value":47.844741,"unit":"%"},"engines":{"Render/3D/0":{"busy":0.000000,"sema":0.000000,"wait":0.000000,"unit":"%"},"Blitter/0":{"busy":0.000000,"sema":0.000000,"wait":0.000000,"unit":"%"},"Video/0":{"busy":4.533124,"sema":0.000000,"wait":0.000000,"unit":"%"},"Video/1":{"busy":6.194385,"sema":0.000000,"wait":0.000000,"unit":"%"},"VideoEnhance/0":{"busy":0.000000,"sema":0.000000,"wait":0.000000,"unit":"%"}}},{"period":{"duration":1.189291,"unit":"ms"},"frequency":{"requested":0.000000,"actual":0.000000,"unit":"MHz"},"interrupts":{"count":0.000000,"unit":"irq/s"},"rc6":{"value":100.000000,"unit":"%"},"engines":{"Render/3D/0":{"busy":0.000000,"sema":0.000000,"wait":0.000000,"unit":"%"},"Blitter/0":{"busy":0.000000,"sema":0.000000,"wait":0.000000,"unit":"%"},"Video/0":{"busy":0.000000,"sema":0.000000,"wait":0.000000,"unit":"%"},"Video/1":{"busy":0.000000,"sema":0.000000,"wait":0.000000,"unit":"%"},"VideoEnhance/0":{"busy":0.000000,"sema":0.000000,"wait":0.000000,"unit":"%"}}}"""
self.nvidia_results = "name, utilization.gpu [%], memory.used [MiB], memory.total [MiB]\nNVIDIA GeForce RTX 3050, 42 %, 5036 MiB, 8192 MiB\n"
@patch("subprocess.run") @patch("subprocess.run")
def test_amd_gpu_stats(self, sp): def test_amd_gpu_stats(self, sp):
@ -19,32 +17,73 @@ class TestGpuStats(unittest.TestCase):
amd_stats = get_amd_gpu_stats() amd_stats = get_amd_gpu_stats()
assert amd_stats == {"gpu": "4.17%", "mem": "60.37%"} assert amd_stats == {"gpu": "4.17%", "mem": "60.37%"}
# @patch("subprocess.run") @patch("frigate.util.services.time.sleep")
# def test_nvidia_gpu_stats(self, sp): @patch("frigate.util.services.time.monotonic")
# process = MagicMock() @patch("frigate.util.services._read_intel_drm_fdinfo")
# process.returncode = 0 def test_intel_gpu_stats_fdinfo(self, read_fdinfo, monotonic, sleep):
# process.stdout = self.nvidia_results # 1 second of wall clock between snapshots
# sp.return_value = process monotonic.side_effect = [0.0, 1.0]
# nvidia_stats = get_nvidia_gpu_stats()
# assert nvidia_stats == {
# "name": "NVIDIA GeForce RTX 3050",
# "gpu": "42 %",
# "mem": "61.5 %",
# }
@patch("subprocess.run") # Two i915 clients on the same iGPU. Engine values are cumulative ns;
def test_intel_gpu_stats(self, sp): # we'll arrange deltas of:
process = MagicMock() # client A (pid 100): render +200_000_000 ns (20%), video +500_000_000 ns (50%)
process.returncode = 124 # client B (pid 200): compute +100_000_000 ns (10%)
process.stdout = self.intel_results # Combined engine totals → render 20%, compute 10%, video 50%
sp.return_value = process # → "compute" = render + compute = 30%
intel_stats = get_intel_gpu_stats(False) # → "dec" = video = 50%
# rc6 values: 47.844741 and 100.0 → avg 73.92 → gpu = 100 - 73.92 = 26.08% # → "gpu" = max(30, 50, 0, 0) = 50%
# Render/3D/0: 0.0 and 0.0 → enc = 0.0% snapshot_a = {
# Video/0: 4.533124 and 0.0 → dec = 2.27% ("0000:00:02.0", "1", "100"): {
assert intel_stats == { "driver": "i915",
"gpu": "26.08%", "pid": "100",
"mem": "-%", "engines": {
"compute": "0.0%", "render": (1_000_000_000, 0),
"dec": "2.27%", "video": (5_000_000_000, 0),
"compute": (0, 0),
},
},
("0000:00:02.0", "2", "200"): {
"driver": "i915",
"pid": "200",
"engines": {
"render": (0, 0),
"compute": (2_000_000_000, 0),
},
},
} }
snapshot_b = {
("0000:00:02.0", "1", "100"): {
"driver": "i915",
"pid": "100",
"engines": {
"render": (1_200_000_000, 0),
"video": (5_500_000_000, 0),
"compute": (0, 0),
},
},
("0000:00:02.0", "2", "200"): {
"driver": "i915",
"pid": "200",
"engines": {
"render": (0, 0),
"compute": (2_100_000_000, 0),
},
},
}
read_fdinfo.side_effect = [snapshot_a, snapshot_b]
intel_stats = get_intel_gpu_stats(None)
sleep.assert_called_once()
assert intel_stats == {
"gpu": "50.0%",
"mem": "-%",
"compute": "30.0%",
"dec": "50.0%",
"clients": {"100": "70.0%", "200": "10.0%"},
}
@patch("frigate.util.services._read_intel_drm_fdinfo")
def test_intel_gpu_stats_no_clients(self, read_fdinfo):
read_fdinfo.return_value = {}
assert get_intel_gpu_stats(None) is None