96 lines
3.3 KiB
Python
96 lines
3.3 KiB
Python
from typing import List
|
|
from unittest import TestCase
|
|
from unittest.mock import MagicMock, call, patch
|
|
|
|
from pylspci.device import Device
|
|
from pylspci.parsers import VerboseParser
|
|
|
|
SAMPLE_DEVICE: str = """
|
|
Slot: 00:1c.3
|
|
Class: PCI bridge [0604]
|
|
Vendor: Intel Corporation [8086]
|
|
Device: 82801 PCI Bridge [244e]
|
|
SVendor: Intel Corporation [8086]
|
|
SDevice: 82801 PCI Bridge [244e]
|
|
Rev: d5
|
|
ProgIf: 01
|
|
Driver: pcieport
|
|
Module: nouveau
|
|
Module: nvidia
|
|
NUMANode: 0
|
|
IOMMUGroup: 1
|
|
PhySlot: 4
|
|
"""
|
|
|
|
|
|
class TestVerboseParser(TestCase):
|
|
|
|
parser: VerboseParser
|
|
|
|
@classmethod
|
|
def setUpClass(cls) -> None:
|
|
super().setUpClass()
|
|
cls.parser = VerboseParser()
|
|
|
|
def _check_device(self, dev: Device) -> None:
|
|
self.assertIsInstance(dev, Device)
|
|
self.assertEqual(dev.slot.domain, 0x0000)
|
|
self.assertEqual(dev.slot.bus, 0x00)
|
|
self.assertEqual(dev.slot.device, 0x1c)
|
|
self.assertEqual(dev.slot.function, 0x3)
|
|
self.assertEqual(dev.cls.id, 0x0604)
|
|
self.assertEqual(dev.cls.name, 'PCI bridge')
|
|
self.assertEqual(dev.vendor.id, 0x8086)
|
|
self.assertEqual(dev.vendor.name, 'Intel Corporation')
|
|
self.assertEqual(dev.device.id, 0x244e)
|
|
self.assertEqual(dev.device.name, '82801 PCI Bridge')
|
|
assert dev.subsystem_vendor is not None
|
|
self.assertEqual(dev.subsystem_vendor.id, 0x8086)
|
|
self.assertEqual(dev.subsystem_vendor.name, 'Intel Corporation')
|
|
assert dev.subsystem_device is not None
|
|
self.assertEqual(dev.subsystem_device.id, 0x244e)
|
|
self.assertEqual(dev.subsystem_device.name, '82801 PCI Bridge')
|
|
self.assertEqual(dev.revision, 0xd5)
|
|
self.assertEqual(dev.progif, 0x01)
|
|
self.assertEqual(dev.driver, 'pcieport')
|
|
self.assertListEqual(dev.kernel_modules, ['nouveau', 'nvidia'])
|
|
self.assertEqual(dev.numa_node, 0)
|
|
self.assertEqual(dev.iommu_group, 1)
|
|
self.assertEqual(dev.physical_slot, '4')
|
|
|
|
def test_parse_str(self) -> None:
|
|
devices: List[Device] = self.parser.parse(SAMPLE_DEVICE)
|
|
self.assertEqual(len(devices), 1)
|
|
self._check_device(devices[0])
|
|
|
|
def test_parse_list(self) -> None:
|
|
devices: List[Device] = self.parser.parse([SAMPLE_DEVICE, ])
|
|
self.assertEqual(len(devices), 1)
|
|
self._check_device(devices[0])
|
|
|
|
@patch('pylspci.command.lspci')
|
|
def test_command(self, cmd_mock: MagicMock) -> None:
|
|
cmd_mock.return_value = '{0}\n\n{0}'.format(SAMPLE_DEVICE)
|
|
|
|
devices: List[Device] = self.parser.run()
|
|
self.assertEqual(len(devices), 2)
|
|
self._check_device(devices[0])
|
|
self._check_device(devices[1])
|
|
|
|
self.assertEqual(cmd_mock.call_count, 1)
|
|
self.assertEqual(cmd_mock.call_args,
|
|
call(verbose=True, kernel_drivers=True))
|
|
|
|
def test_unknown_field(self) -> None:
|
|
with self.assertWarns(
|
|
UserWarning,
|
|
msg="Unsupported device field 'NewField' with value 'Value'\n"
|
|
"Please report this, along with the output of"
|
|
"`lspci -mmnnvvvk`, at "
|
|
"https://tildegit.org/lucidiot/pylspci/issues/new"):
|
|
devices: List[Device] = \
|
|
self.parser.parse(SAMPLE_DEVICE + 'NewField\tValue')
|
|
|
|
self.assertEqual(len(devices), 1)
|
|
self._check_device(devices[0])
|