From eab67c993d53b88ed9168096d4de20e8ee43a374 Mon Sep 17 00:00:00 2001 From: Joseph Magly <1159087+jmagly@users.noreply.github.com> Date: Sat, 15 Aug 2026 03:22:25 -0400 Subject: [PATCH] Test local RAM probe fallbacks Cover broken psutil, Linux procfs fallback, macOS/POSIX sysconf fallback, and fail-closed behavior when every probe is unavailable. --- tests/test_local_ui_portability.py | 39 +++++++++++++++++++++++++++++- 1 file changed, 38 insertions(+), 1 deletion(-) diff --git a/tests/test_local_ui_portability.py b/tests/test_local_ui_portability.py index c42ecad..84d2420 100644 --- a/tests/test_local_ui_portability.py +++ b/tests/test_local_ui_portability.py @@ -2,7 +2,9 @@ from __future__ import annotations -from unittest.mock import Mock +import sys +from types import SimpleNamespace +from unittest.mock import Mock, mock_open from obliteratus import local_ui @@ -33,3 +35,38 @@ def test_system_info_queries_the_platform_temp_directory(monkeypatch, tmp_path): local_ui._print_system_info([]) disk_free.assert_called_once_with(str(tmp_path)) + + +def test_ram_detection_falls_back_from_broken_psutil_to_proc(monkeypatch): + broken_psutil = SimpleNamespace( + virtual_memory=Mock(side_effect=OSError("unavailable")), + ) + monkeypatch.setitem(sys.modules, "psutil", broken_psutil) + monkeypatch.setattr( + "builtins.open", + mock_open(read_data="MemTotal: 2097152 kB\n"), + ) + + assert local_ui._get_ram_gb() == 2.0 + + +def test_ram_detection_uses_posix_sysconf_without_psutil_or_proc(monkeypatch): + monkeypatch.setitem(sys.modules, "psutil", None) + monkeypatch.setattr("builtins.open", Mock(side_effect=OSError("no procfs"))) + values = {"SC_PHYS_PAGES": 1_048_576, "SC_PAGE_SIZE": 4096} + sysconf = Mock(side_effect=values.__getitem__) + monkeypatch.setattr(local_ui.os, "sysconf", sysconf) + + assert local_ui._get_ram_gb() == 4.0 + assert [call.args[0] for call in sysconf.call_args_list] == [ + "SC_PHYS_PAGES", + "SC_PAGE_SIZE", + ] + + +def test_ram_detection_fails_closed_when_all_probes_are_unavailable(monkeypatch): + monkeypatch.setitem(sys.modules, "psutil", None) + monkeypatch.setattr("builtins.open", Mock(side_effect=OSError("no procfs"))) + monkeypatch.setattr(local_ui.os, "sysconf", Mock(side_effect=OSError("unsupported"))) + + assert local_ui._get_ram_gb() == 0.0