def test_with_default_parser(self) -> None: builder = CommandBuilder() self.assertIsNone(builder._parser) builder = CommandBuilder().with_default_parser() self.assertIsInstance(builder._parser, SimpleParser) builder = CommandBuilder().verbose().with_default_parser() self.assertIsInstance(builder._parser, VerboseParser)
def test_with_pcilib_params_dict(self, lspci_mock: MagicMock) -> None: with self.assertRaisesRegex(AssertionError, 'dict or keyword'): CommandBuilder().with_pcilib_params({'a': 'b'}, c='d') with self.assertRaisesRegex(AssertionError, 'Only one positional'): CommandBuilder().with_pcilib_params({'a': 'b'}, {'c': 'd'}) lspci_mock.return_value = ['a', 'b'] builder = CommandBuilder().with_pcilib_params({'a': 'b'}) self.assertListEqual(list(builder), ['a', 'b']) self.assertEqual(lspci_mock.call_count, 1) self.assertEqual(lspci_mock.call_args, call(pcilib_params={'a': 'b'}))
def test_with_names(self, lspci_mock: MagicMock) -> None: lspci_mock.return_value = ['a', 'b'] builder = CommandBuilder().with_names(False) self.assertListEqual(list(builder), ['a', 'b']) self.assertEqual(lspci_mock.call_count, 1) self.assertEqual(lspci_mock.call_args, call(id_resolve_option=IDResolveOption.IDOnly, )) lspci_mock.reset_mock() builder = builder.with_names() self.assertListEqual(list(builder), ['a', 'b']) self.assertEqual(lspci_mock.call_count, 1) self.assertEqual(lspci_mock.call_args, call(id_resolve_option=IDResolveOption.Both, ))
def test_device_filter_str(self, lspci_mock: MagicMock, filter_mock: MagicMock) -> None: with self.assertRaisesRegex(AssertionError, 'Only one positional'): CommandBuilder().device_filter('something', 'something else') with self.assertRaisesRegex(AssertionError, 'Use either'): CommandBuilder().device_filter('something', vendor=0xb) filter_mock.parse.return_value = 'lefilter' lspci_mock.return_value = ['a', 'b'] builder = CommandBuilder().device_filter('something') self.assertListEqual(list(builder), ['a', 'b']) self.assertEqual(lspci_mock.call_count, 1) self.assertEqual(lspci_mock.call_args, call(device_filter='lefilter')) self.assertEqual(filter_mock.parse.call_count, 1) self.assertEqual(filter_mock.parse.call_args, call('something'))
def test_use_pcimap_check(self, lspci_mock: MagicMock, isfile_mock: MagicMock) -> None: lspci_mock.return_value = ['a', 'b'] isfile_mock.return_value = False with self.assertRaisesRegex(AssertionError, 'not found'): CommandBuilder().use_pcimap('somefile') self.assertEqual(isfile_mock.call_count, 1)
def test_list_pcilib_params_raw(self, list_mock: MagicMock) -> None: list_mock.return_value = ['a', 'b'] builder = CommandBuilder() \ .list_access_methods() \ .list_pcilib_params(raw=True) self.assertListEqual(list(builder), ['a', 'b']) self.assertEqual(list_mock.call_count, 1) self.assertEqual(list_mock.call_args, call())
def test_use_access_method(self, lspci_mock: MagicMock) -> None: lspci_mock.return_value = ['a', 'b'] builder = CommandBuilder() \ .use_access_method('one') \ .use_access_method('two') self.assertListEqual(list(builder), ['a', 'b']) self.assertEqual(lspci_mock.call_count, 1) self.assertEqual(lspci_mock.call_args, call(access_method='two'))
def test_with_parser(self, lspci_mock: MagicMock) -> None: lspci_mock.return_value = ['a', 'b'] parser_mock = MagicMock(spec=SimpleParser) parser_mock.parse.return_value = ('parsed_a', 'parsed_b') builder = CommandBuilder().with_parser(parser_mock) self.assertListEqual(list(builder), ['parsed_a', 'parsed_b']) self.assertEqual(parser_mock.parse.call_count, 1) self.assertEqual(parser_mock.parse.call_args, call(['a', 'b']))
def test_include_bridge_paths(self, lspci_mock: MagicMock) -> None: lspci_mock.return_value = ['a', 'b'] builder = CommandBuilder() \ .include_bridge_paths(False) \ .include_bridge_paths() self.assertListEqual(list(builder), ['a', 'b']) self.assertEqual(lspci_mock.call_count, 1) self.assertEqual(lspci_mock.call_args, call(bridge_paths=True, ))
def test_use_pcimap_no_check(self, lspci_mock: MagicMock, isfile_mock: MagicMock) -> None: lspci_mock.return_value = ['a', 'b'] isfile_mock.return_value = False builder = CommandBuilder().use_pcimap('somefile', check=False) self.assertListEqual(list(builder), ['a', 'b']) self.assertEqual(lspci_mock.call_count, 1) self.assertEqual(lspci_mock.call_args, call(pcimap=Path('somefile'))) self.assertFalse(isfile_mock.called)
def test_use_pciids(self, lspci_mock: MagicMock, isfile_mock: MagicMock) -> None: lspci_mock.return_value = ['a', 'b'] isfile_mock.return_value = True builder = CommandBuilder().use_pciids('somefile') self.assertListEqual(list(builder), ['a', 'b']) self.assertEqual(lspci_mock.call_count, 1) self.assertEqual(lspci_mock.call_args, call(pciids=Path('somefile'))) self.assertEqual(isfile_mock.call_count, 1)
def test_iter_str(self, lspci_mock: MagicMock) -> None: """ Test iterating the CommandBuilder when lspci returns a single string returns an iterator for a list made of a single string, not an iterator for each character of the string """ lspci_mock.return_value = 'a\nb' self.assertListEqual(list(CommandBuilder()), [ 'a\nb', ]) self.assertEqual(lspci_mock.call_count, 1) self.assertEqual(lspci_mock.call_args, call())
def test_include_kernel_drivers(self, lspci_mock: MagicMock) -> None: lspci_mock.return_value = ['a', 'b'] builder = CommandBuilder() \ .include_kernel_drivers(False) \ .include_kernel_drivers() self.assertListEqual(list(builder), ['a', 'b']) self.assertEqual(lspci_mock.call_count, 1) self.assertEqual(lspci_mock.call_args, call( verbose=True, kernel_drivers=True, ))
def test_with_pcilib_params_kwargs(self, lspci_mock: MagicMock) -> None: lspci_mock.return_value = ['a', 'b'] builder = CommandBuilder() \ .with_pcilib_params(a='1', b='2') \ .with_pcilib_params(b='3', c='4') self.assertListEqual(list(builder), ['a', 'b']) self.assertEqual(lspci_mock.call_count, 1) self.assertEqual(lspci_mock.call_args, call(pcilib_params={ 'a': '1', 'b': '3', 'c': '4', }))
def main() -> None: parser: argparse.ArgumentParser = get_parser() args: Dict[str, Any] = vars(parser.parse_args()) # Specific parsing required use_parser: bool = args.pop('json', True) kernel_modules: bool = args.pop('kernel_modules', False) access_method: Optional[str] = args.pop('access_method', None) pcilib_params = args.pop('pcilib_params', []) or [] builder: CommandBuilder = CommandBuilder(**args) if kernel_modules: builder = builder.include_kernel_drivers() if access_method: if access_method.strip().lower() == 'help': builder = builder.list_access_methods() else: builder = builder.use_access_method(access_method) for param in pcilib_params: if param.strip().lower() == 'help': builder = builder.list_pcilib_params(raw=not use_parser) break if '=' not in param: parser.error( 'Invalid PCI access parameter syntax for {!r}'.format(param)) key, value = map(str.strip, param.split('=', 2)) builder = builder.with_pcilib_params(**{key: value}) if use_parser: builder = builder.with_default_parser() result = list(builder) if not use_parser: # Raw mode for item in result: print(item) return def _item_handler(item: Any) -> Any: if hasattr(item, '_asdict'): return item._asdict() return item print(json.dumps( list(map(_item_handler, result)), default=vars, ))
def test_device_filter_kwargs(self, lspci_mock: MagicMock, filter_mock: MagicMock) -> None: filter_mock.return_value = 'lefilter' lspci_mock.return_value = ['a', 'b'] builder = CommandBuilder().device_filter( cls=0xa, vendor=0xb, device=0xc, ) self.assertListEqual(list(builder), ['a', 'b']) self.assertEqual(lspci_mock.call_count, 1) self.assertEqual(lspci_mock.call_args, call(device_filter='lefilter')) self.assertEqual(filter_mock.call_count, 1) self.assertEqual(filter_mock.call_args, call( cls=0xa, vendor=0xb, device=0xc, ))
def test_slot_filter_kwargs(self, lspci_mock: MagicMock, filter_mock: MagicMock) -> None: filter_mock.return_value = 'lefilter' lspci_mock.return_value = ['a', 'b'] builder = CommandBuilder().slot_filter( domain=0xa, bus=0xb, device=0xc, function=0xd, ) self.assertListEqual(list(builder), ['a', 'b']) self.assertEqual(lspci_mock.call_count, 1) self.assertEqual(lspci_mock.call_args, call(slot_filter='lefilter')) self.assertEqual(filter_mock.call_count, 1) self.assertEqual(filter_mock.call_args, call( domain=0xa, bus=0xb, device=0xc, function=0xd, ))
def test_verbose(self, lspci_mock: MagicMock) -> None: lspci_mock.return_value = ['a', 'b'] builder = CommandBuilder().verbose() self.assertListEqual(list(builder), ['a', 'b']) self.assertEqual(lspci_mock.call_count, 1) self.assertEqual(lspci_mock.call_args, call(verbose=True))
def test_default(self, lspci_mock: MagicMock) -> None: lspci_mock.return_value = ['a', 'b'] self.assertListEqual(list(CommandBuilder()), ['a', 'b']) self.assertEqual(lspci_mock.call_count, 1) self.assertEqual(lspci_mock.call_args, call())
def test_hide_single_domain(self, lspci_mock: MagicMock) -> None: lspci_mock.return_value = ['a', 'b'] builder = CommandBuilder().hide_single_domain() self.assertListEqual(list(builder), ['a', 'b']) self.assertEqual(lspci_mock.call_count, 1) self.assertEqual(lspci_mock.call_args, call(hide_single_domain=True))