9bb0f9a684
Each NVMe drive's Inventory entry now shows its negotiated PCIe link (e.g.
'· PCIe Gen4 x4') from sysfs (current/max link speed+width), and flags drives
running below their capability ('Gen3 x4 (capable of Gen4 x4)') — so you can
confirm a Gen4 SSD is in a Gen4 slot. SATA disks show no PCIe link. Renders in
the GUI Inventory, CLI, and the Markdown/JSON export automatically. +tests.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
59 lines
2.1 KiB
Python
59 lines
2.1 KiB
Python
"""Tests for the M5 system inventory (render + dict round-trip; collect on real system)."""
|
|
|
|
import tempfile
|
|
import unittest
|
|
from pathlib import Path
|
|
|
|
from rigdoctor.core import inventory
|
|
from rigdoctor.core.inventory import Section
|
|
|
|
|
|
class InventoryTests(unittest.TestCase):
|
|
def test_collect_returns_sections(self):
|
|
sections = inventory.collect()
|
|
self.assertTrue(sections)
|
|
titles = {s.title for s in sections}
|
|
self.assertIn("System", titles)
|
|
self.assertIn("CPU", titles)
|
|
|
|
def test_dict_round_trip(self):
|
|
sections = [Section("System", [("Kernel", "7.0.0"), ("Distro", "Ubuntu")])]
|
|
restored = inventory.from_dict(inventory.to_dict(sections))
|
|
self.assertEqual(restored[0].title, "System")
|
|
self.assertEqual(restored[0].items, [("Kernel", "7.0.0"), ("Distro", "Ubuntu")])
|
|
|
|
def test_render_markdown(self):
|
|
md = inventory.render_markdown([Section("CPU", [("Model", "Test CPU")])])
|
|
self.assertIn("## CPU", md)
|
|
self.assertIn("- **Model:** Test CPU", md)
|
|
|
|
|
|
class PcieLinkTests(unittest.TestCase):
|
|
def test_gen_mapping(self):
|
|
self.assertEqual(inventory._gen("16.0 GT/s PCIe"), 4)
|
|
self.assertEqual(inventory._gen("8.0 GT/s PCIe"), 3)
|
|
self.assertIsNone(inventory._gen(""))
|
|
|
|
def _fake_dev(self, cur_s, cur_w, max_s, max_w) -> Path:
|
|
d = Path(tempfile.mkdtemp())
|
|
(d / "current_link_speed").write_text(cur_s)
|
|
(d / "current_link_width").write_text(cur_w)
|
|
(d / "max_link_speed").write_text(max_s)
|
|
(d / "max_link_width").write_text(max_w)
|
|
return d
|
|
|
|
def test_link_at_full_speed(self):
|
|
dev = self._fake_dev("16.0 GT/s PCIe", "4", "16.0 GT/s PCIe", "4")
|
|
self.assertEqual(inventory._link_desc(dev), "PCIe Gen4 x4")
|
|
|
|
def test_link_downtrained_flags_capability(self):
|
|
dev = self._fake_dev("8.0 GT/s PCIe", "4", "16.0 GT/s PCIe", "4")
|
|
self.assertEqual(inventory._link_desc(dev), "PCIe Gen3 x4 (capable of Gen4 x4)")
|
|
|
|
def test_non_nvme_has_no_link(self):
|
|
self.assertEqual(inventory._nvme_link("sda"), "")
|
|
|
|
|
|
if __name__ == "__main__":
|
|
unittest.main()
|