Merge lp:~adeuring/launchpad/hwdb-class-udev-device-4 into lp:launchpad/db-devel

Proposed by Abel Deuring
Status: Merged
Approved by: Brad Crittenden
Approved revision: no longer in the source branch.
Merged at revision: not available
Proposed branch: lp:~adeuring/launchpad/hwdb-class-udev-device-4
Merge into: lp:launchpad/db-devel
Diff against target: 664 lines
2 files modified
lib/canonical/launchpad/scripts/hwdbsubmissions.py (+157/-16)
lib/canonical/launchpad/scripts/tests/test_hwdb_submission_processing.py (+207/-58)
To merge this branch: bzr merge lp:~adeuring/launchpad/hwdb-class-udev-device-4
Reviewer Review Type Date Requested Status
Brad Crittenden (community) code Approve
Canonical Launchpad Engineering Pending
Review via email: mp+13300@code.launchpad.net
To post a comment you must log in.
Revision history for this message
Abel Deuring (adeuring) wrote :

This branch adds the properties pci_ids, raw_bus, vendor, vendor_id, product, product_id to class UdevDevice.

The HWDB client in Karmic will no longer send data gathered from HAL, but gathered from udev, supplemented by sysfs and DMI data.

The HWDB submission processing script represents devices found in the submission data in a class derived from BaseDevice; this branch is another step to complete the implementation of class UdevDevice.

I forgot in earlier branches to specify the DMI data as a parameter of the UdevDevice constructor, so this branch contains also a number of purely formal changes in the tests, where class UdevDevice is instantiated.

I also noticed that I forgot a "raise NotImplemented" for a property of class BaseDevice.

test:
./bin/test --test=test_hwdb_submission_processing

= Launchpad lint =

Checking for conflicts. and issues in doctests and templates.
Running jslint, xmllint, pyflakes, and pylint.
Using normal rules.

Linting changed files:
  lib/canonical/launchpad/scripts/hwdbsubmissions.py
  lib/canonical/launchpad/scripts/tests/test_hwdb_submission_processing.py

== Pyflakes notices ==

lib/canonical/launchpad/scripts/hwdbsubmissions.py
    22: redefinition of unused 'etree' from line 20

== Pylint notices ==

lib/canonical/launchpad/scripts/hwdbsubmissions.py
    20: [F0401] Unable to import 'xml.etree.cElementTree' (No module named etree)

The complaints about etree are not related to my changes.

Revision history for this message
Brad Crittenden (bac) wrote :
Download full text (8.8 KiB)

Hi Abel,

Thanks for the changes. We discussed some of my suggestions on IRC already. Please post an incremental diff when you've made these changes.

--Brad

> === modified file 'lib/canonical/launchpad/scripts/hwdbsubmissions.py'
> --- lib/canonical/launchpad/scripts/hwdbsubmissions.py 2009-10-12 15:36:04 +0000
> +++ lib/canonical/launchpad/scripts/hwdbsubmissions.py 2009-10-13 17:50:28 +0000
@@ -59,6 +59,7 @@
> re.VERBOSE)
>
> ROOT_UDI = '/org/freedesktop/Hal/devices/computer'
> +UDEV_ROOT_PATH = '/devices/LNXSYSTM:00'
>
> # These UDIs appears in some submissions more than once.
> KNOWN_DUPLICATE_UDIS = set((
> @@ -1606,6 +1607,7 @@
> @property
> def driver_name(self):
> """The name of the driver contolling this device. May be None."""
> + raise NotImplementedError

Nice clean up.

> def translateScsiBus(self):
> """Return the real bus of a device where raw_bus=='scsi'.
> @@ -2358,7 +2360,7 @@
> class UdevDevice(BaseDevice):
> """The representation of a udev device node."""
>
> - def __init__(self, udev_data, sysfs_data, parser):
> + def __init__(self, udev_data, sysfs_data, dmi_data, parser):
> """HALDevice constructor.

Seeing all of your test changes that required adding another parameter
make me wonder if you don't want to have default values on some of
these, especially the new one. Also I'm surprised to see you didn't
add the new on at the end, which helps with backward compatability.

> :param udevdata: The udev data for this device
> @@ -2369,6 +2371,7 @@
> super(UdevDevice, self).__init__(parser)
> self.udev = udev_data
> self.sysfs = sysfs_data
> + self.dmi = dmi_data
>
> @property
> def device_id(self):
> @@ -2410,6 +2413,24 @@
> return self.pci_class_info[1]

As we discussed on IRC, a lot of your code would be cleaner if methods
such as this one returned a dictionary with 'vendor' and 'product' as
the keys. Take a stab at doing that throughout and see what happens.

> @property
> + def pci_ids(self):
> + """The PCI vendor and product IDs.
> +
> + :return: (vendor_id, product_id) for PCI devices
> + or (None, None) for other devices.
> + """
> + if self.is_pci:
> + # SubmissionParser.checkUdevPciProperties() ensures that
> + # each PCI device has the property PCI_ID and that is
> + # consists of two 4-digit hexadecimal numbers, separated
> + # by a ':'.
> + id_string = self.udev['E']['PCI_ID']
> + ids = id_string.split(':')
> + return [int(part, 16) for part in ids]
> + else:
> + return [None, None]
> +
> + @property
> def is_usb(self):
> """True, if this is a USB device, else False."""
> return self.udev['E'].get('SUBSYSTEM') == 'usb'
> @@ -2476,6 +2497,116 @@
> else:
> return None
>
> + @property
> + def raw_bus(self):
> + """See `BaseDevice`."""
> + # udev specifies the property SUBSYSTEM for most devices;
> + # some devices have additionally the more specific property
...

Read more...

review: Needs Fixing (code)
Revision history for this message
Abel Deuring (adeuring) wrote :
Download full text (33.5 KiB)

Hi Brad,

thanks for your review.

On 13.10.2009 21:28, Brad Crittenden wrote:
> Review: Needs Fixing code
> Hi Abel,
>
> Thanks for the changes. We discussed some of my suggestions on IRC already. Please post an incremental diff when you've made these changes.
>
> --Brad
>
>
>> === modified file 'lib/canonical/launchpad/scripts/hwdbsubmissions.py'
>> --- lib/canonical/launchpad/scripts/hwdbsubmissions.py 2009-10-12 15:36:04 +0000
>> +++ lib/canonical/launchpad/scripts/hwdbsubmissions.py 2009-10-13 17:50:28 +0000
> @@ -59,6 +59,7 @@
>> re.VERBOSE)
>>
>> ROOT_UDI = '/org/freedesktop/Hal/devices/computer'
>> +UDEV_ROOT_PATH = '/devices/LNXSYSTM:00'
>>
>> # These UDIs appears in some submissions more than once.
>> KNOWN_DUPLICATE_UDIS = set((
>> @@ -1606,6 +1607,7 @@
>> @property
>> def driver_name(self):
>> """The name of the driver contolling this device. May be None."""
>> + raise NotImplementedError
>
> Nice clean up.
>
>> def translateScsiBus(self):
>> """Return the real bus of a device where raw_bus=='scsi'.
>> @@ -2358,7 +2360,7 @@
>> class UdevDevice(BaseDevice):
>> """The representation of a udev device node."""
>>
>> - def __init__(self, udev_data, sysfs_data, parser):
>> + def __init__(self, udev_data, sysfs_data, dmi_data, parser):
>> """HALDevice constructor.
>
> Seeing all of your test changes that required adding another parameter
> make me wonder if you don't want to have default values on some of
> these, especially the new one. Also I'm surprised to see you didn't
> add the new on at the end, which helps with backward compatability.

Well, class UdevDevice is yet not used anywhere, so backward
compatibility is not an issue. But you are right, dmi_data and
sysfs_data in many cases not needed, while parser _is_ needed (in class
BaseDevice), so I shuffled the parameters again...

>
>> :param udevdata: The udev data for this device
>> @@ -2369,6 +2371,7 @@
>> super(UdevDevice, self).__init__(parser)
>> self.udev = udev_data
>> self.sysfs = sysfs_data
>> + self.dmi = dmi_data
>>
>> @property
>> def device_id(self):
>> @@ -2410,6 +2413,24 @@
>> return self.pci_class_info[1]
>
> As we discussed on IRC, a lot of your code would be cleaner if methods
> such as this one returned a dictionary with 'vendor' and 'product' as
> the keys. Take a stab at doing that throughout and see what happens.

Changed. Though this made the diff a bit larger, since it affected (via
the method getScsiVendorAnModel()) also class HALDevice...

>
>> @property
>> + def pci_ids(self):
>> + """The PCI vendor and product IDs.
>> +
>> + :return: (vendor_id, product_id) for PCI devices
>> + or (None, None) for other devices.
>> + """
>> + if self.is_pci:
>> + # SubmissionParser.checkUdevPciProperties() ensures that
>> + # each PCI device has the property PCI_ID and that is
>> + # consists of two 4-digit hexadecimal numbers, separated
>> + # by a ':'.
>> + id_string = self.udev['E']['PCI_ID']
>> + ids = id...

Revision history for this message
Brad Crittenden (bac) wrote :

Thanks for the changes Abel!

review: Approve (code)

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'lib/canonical/launchpad/scripts/hwdbsubmissions.py'
2--- lib/canonical/launchpad/scripts/hwdbsubmissions.py 2009-10-12 15:36:04 +0000
3+++ lib/canonical/launchpad/scripts/hwdbsubmissions.py 2009-10-13 21:06:13 +0000
4@@ -59,6 +59,7 @@
5 re.VERBOSE)
6
7 ROOT_UDI = '/org/freedesktop/Hal/devices/computer'
8+UDEV_ROOT_PATH = '/devices/LNXSYSTM:00'
9
10 # These UDIs appears in some submissions more than once.
11 KNOWN_DUPLICATE_UDIS = set((
12@@ -1606,6 +1607,7 @@
13 @property
14 def driver_name(self):
15 """The name of the driver contolling this device. May be None."""
16+ raise NotImplementedError
17
18 def translateScsiBus(self):
19 """Return the real bus of a device where raw_bus=='scsi'.
20@@ -2067,10 +2069,15 @@
21 # it is hard to find a better heuristic to separate
22 # the vendor name from the product name.
23 splitted_name = self.scsi_model.split(' ', 1)
24- if len(splitted_name) < 2:
25- return 'ATA', splitted_name[0]
26- return splitted_name
27- return (vendor, self.scsi_model)
28+ if len(splitted_name) == 2:
29+ return {
30+ 'vendor': splitted_name[0],
31+ 'product': splitted_name[1],
32+ }
33+ return {
34+ 'vendor': vendor,
35+ 'product': self.scsi_model,
36+ }
37
38 def getDriver(self):
39 """Return the HWDriver instance associated with this device.
40@@ -2289,11 +2296,7 @@
41 # below does not work properly.
42 return self.getProperty('system.hardware.' + type_)
43 elif bus == 'scsi':
44- vendor, product = self.getScsiVendorAndModelName()
45- if type_ == 'vendor':
46- return vendor
47- else:
48- return product
49+ return self.getScsiVendorAndModelName()[type_]
50 else:
51 result = self.getProperty('info.' + type_)
52 if result is None:
53@@ -2358,7 +2361,7 @@
54 class UdevDevice(BaseDevice):
55 """The representation of a udev device node."""
56
57- def __init__(self, udev_data, sysfs_data, parser):
58+ def __init__(self, parser, udev_data, sysfs_data=None, dmi_data=None):
59 """HALDevice constructor.
60
61 :param udevdata: The udev data for this device
62@@ -2369,6 +2372,7 @@
63 super(UdevDevice, self).__init__(parser)
64 self.udev = udev_data
65 self.sysfs = sysfs_data
66+ self.dmi = dmi_data
67
68 @property
69 def device_id(self):
70@@ -2376,6 +2380,14 @@
71 return self.udev['P']
72
73 @property
74+ def root_device_ids(self):
75+ """The vendor and product IDs of the root device."""
76+ return {
77+ 'vendor': self.dmi.get('/sys/class/dmi/id/sys_vendor'),
78+ 'product': self.dmi.get('/sys/class/dmi/id/product_name')
79+ }
80+
81+ @property
82 def is_pci(self):
83 """True, if this is a PCI device, else False."""
84 return self.udev['E'].get('SUBSYSTEM') == 'pci'
85@@ -2410,6 +2422,30 @@
86 return self.pci_class_info[1]
87
88 @property
89+ def pci_ids(self):
90+ """The PCI vendor and product IDs.
91+
92+ :return: A dictionary containing the vendor and product IDs.
93+ The IDs are set to None for Non-PCI devices.
94+ """
95+ if self.is_pci:
96+ # SubmissionParser.checkUdevPciProperties() ensures that
97+ # each PCI device has the property PCI_ID and that is
98+ # consists of two 4-digit hexadecimal numbers, separated
99+ # by a ':'.
100+ id_string = self.udev['E']['PCI_ID']
101+ ids = id_string.split(':')
102+ return {
103+ 'vendor': int(ids[0], 16),
104+ 'product': int(ids[1], 16),
105+ }
106+ else:
107+ return {
108+ 'vendor': None,
109+ 'product': None,
110+ }
111+
112+ @property
113 def is_usb(self):
114 """True, if this is a USB device, else False."""
115 return self.udev['E'].get('SUBSYSTEM') == 'usb'
116@@ -2418,8 +2454,9 @@
117 def usb_ids(self):
118 """The vendor ID, product ID, product version for USB devices.
119
120- :return: [vendor_id, product_id, version] for USB devices
121- or [None, None, None] for other devices.
122+ :return: A dictionary containing the vendor and product IDs and
123+ the product version for USB devices.
124+ The IDs are set to None for Non-USB devices.
125 """
126 if self.is_usb:
127 # udev represents USB device IDs as strings
128@@ -2428,19 +2465,27 @@
129 # SubmissionParser.checkUdevUsbProperties() ensures that
130 # the string PRODUCT is in the format required below.
131 product_info = self.udev['E']['PRODUCT'].split('/')
132- return [int(part, 16) for part in product_info]
133+ return {
134+ 'vendor': int(product_info[0], 16),
135+ 'product': int(product_info[1], 16),
136+ 'version': int(product_info[2], 16),
137+ }
138 else:
139- return [None, None, None]
140+ return {
141+ 'vendor': None,
142+ 'product': None,
143+ 'version': None,
144+ }
145
146 @property
147 def usb_vendor_id(self):
148 """See `BaseDevice`."""
149- return self.usb_ids[0]
150+ return self.usb_ids['vendor']
151
152 @property
153 def usb_product_id(self):
154 """See `BaseDevice`."""
155- return self.usb_ids[1]
156+ return self.usb_ids['product']
157
158 @property
159 def is_scsi_device(self):
160@@ -2476,6 +2521,102 @@
161 else:
162 return None
163
164+ @property
165+ def raw_bus(self):
166+ """See `BaseDevice`."""
167+ # udev specifies the property SUBSYSTEM for most devices;
168+ # some devices have additionally the more specific property
169+ # DEVTYPE. DEVTYPE is preferable.
170+ # The root device has the subsystem/bus value "acpi", which
171+ # is a bit nonsensical.
172+ if self.device_id == UDEV_ROOT_PATH:
173+ return None
174+ properties = self.udev['E']
175+ devtype = properties.get('DEVTYPE')
176+ if devtype is not None:
177+ return devtype
178+ return properties.get('SUBSYSTEM')
179+
180+ def getVendorOrProduct(self, type_):
181+ """Return the vendor or product of this device.
182+
183+ :return: The vendor or product data for this device.
184+ :param type_: 'vendor' or 'product'
185+ """
186+ assert type_ in ('vendor', 'product'), (
187+ 'Unexpected value of type_: %r' % type_)
188+
189+ bus = self.raw_bus
190+ if self.device_id == UDEV_ROOT_PATH:
191+ # udev does not known about any product information for
192+ # the root device. We use DMI data instead.
193+ return self.root_device_ids[type_]
194+ elif bus == 'scsi_device':
195+ return self.getScsiVendorAndModelName()[type_]
196+ elif bus in ('pci', 'usb_device'):
197+ # XXX Abel Deuring 2009-10-13, bug 450480: udev does not
198+ # provide human-readable vendor and product names for
199+ # USB and PCI devices. We should retrieve these from
200+ # http://www.linux-usb.org/usb.ids and
201+ # http://pciids.sourceforge.net/v2.2/pci.ids
202+ return 'Unknown'
203+ else:
204+ # We don't process yet other devices than complete systems,
205+ # PCI, USB devices and those devices that are represented
206+ # in udev as SCSI devices: real SCSI devices, and
207+ # IDE/ATA/SATA devices.
208+ return None
209+
210+ @property
211+ def vendor(self):
212+ """See `BaseDevice`."""
213+ return self.getVendorOrProduct('vendor')
214+
215+ @property
216+ def product(self):
217+ """See `BaseDevice`."""
218+ return self.getVendorOrProduct('product')
219+
220+ def getVendorOrProductID(self, type_):
221+ """Return the vendor or product ID of this device.
222+
223+ :return: The vendor or product ID for this device.
224+ :param type_: 'vendor' or 'product'
225+ """
226+ assert type_ in ('vendor', 'product'), (
227+ 'Unexpected value of type_: %r' % type_)
228+
229+ bus = self.raw_bus
230+ if self.device_id == UDEV_ROOT_PATH:
231+ # udev does not known about any product information for
232+ # the root device. We use DMI data instead.
233+ if type_ == 'vendor':
234+ return self.dmi.get('/sys/class/dmi/id/sys_vendor')
235+ else:
236+ return self.dmi.get('/sys/class/dmi/id/product_name')
237+ elif bus == 'scsi_device':
238+ return self.getScsiVendorAndModelName()[type_]
239+ elif bus == 'pci':
240+ return self.pci_ids[type_]
241+ elif bus == 'usb_device':
242+ return self.usb_ids[type_]
243+ else:
244+ # We don't process yet other devices than complete systems,
245+ # PCI, USB devices and those devices that are represented
246+ # in udev as SCSI devices: real SCSI devices, and
247+ # IDE/ATA/SATA devices.
248+ return None
249+
250+ @property
251+ def vendor_id(self):
252+ """See `BaseDevice`."""
253+ return self.getVendorOrProductID('vendor')
254+
255+ @property
256+ def product_id(self):
257+ """See `BaseDevice`."""
258+ return self.getVendorOrProductID('product')
259+
260
261 class ProcessingLoop(object):
262 """An `ITunableLoop` for processing HWDB submissions."""
263
264=== modified file 'lib/canonical/launchpad/scripts/tests/test_hwdb_submission_processing.py'
265--- lib/canonical/launchpad/scripts/tests/test_hwdb_submission_processing.py 2009-10-12 14:50:22 +0000
266+++ lib/canonical/launchpad/scripts/tests/test_hwdb_submission_processing.py 2009-10-13 21:06:13 +0000
267@@ -1598,18 +1598,16 @@
268 parser = SubmissionParser(self.log)
269 parser.buildDeviceList(parsed_data)
270 device = parser.hal_devices[self.UDI_SCSI_DISK]
271- vendor, model = device.getScsiVendorAndModelName()
272+ vendor_model = device.getScsiVendorAndModelName()
273 self.assertEqual(
274- vendor, 'SHARP',
275+ {
276+ 'vendor': 'SHARP',
277+ 'product': 'JX250 SCSI',
278+ },
279+ vendor_model,
280 'Unexpected result of HWDevice.getScsiVendorAndModelName '
281 'for a regular SCSI device. Expected vendor name SHARP, got %r.'
282- % vendor)
283- self.assertEqual(
284- model, 'JX250 SCSI',
285- 'Unexpected result of HWDevice.getScsiVendorAndModelName '
286- 'for a regular SCSI device. Expected model name JX250 SCSI , '
287- 'got %r.'
288- % model)
289+ % vendor_model)
290
291 def testHALDeviceSCSIVendorModelNameATADiskShortModelName(self):
292 """Test of HALDevice.getScsiVendorAndModelName, ATA disk (1).
293@@ -1639,18 +1637,16 @@
294 parser = SubmissionParser(self.log)
295 parser.buildDeviceList(parsed_data)
296 device = parser.hal_devices[self.UDI_SCSI_DISK]
297- vendor, model = device.getScsiVendorAndModelName()
298- self.assertEqual(
299- vendor, 'Hitachi',
300- 'Unexpected result of HWDevice.getScsiVendorAndModelName '
301- 'for an ATA SCSI device. Expected vendor name Hitachi, got %r.'
302- % vendor)
303- self.assertEqual(
304- model, 'HTS54161',
305- 'Unexpected result of HWDevice.getScsiVendorAndModelName '
306- 'for a reguale SCSI device. Expected vendor name HTS54161, '
307- 'got %r.'
308- % model)
309+ vendor_model = device.getScsiVendorAndModelName()
310+ self.assertEqual(
311+ {
312+ 'vendor': 'Hitachi',
313+ 'product': 'HTS54161',
314+ },
315+ vendor_model,
316+ 'Unexpected result of HWDevice.getScsiVendorAndModelName '
317+ 'for an ATA SCSI device: %r.'
318+ % vendor_model)
319
320 def testHALDeviceSCSIVendorModelNameATADiskLongModelName(self):
321 """Test of HALDevice.getScsiVendorAndModelName, ATA disk (2).
322@@ -1679,18 +1675,16 @@
323 parser = SubmissionParser(self.log)
324 parser.buildDeviceList(parsed_data)
325 device = parser.hal_devices[self.UDI_SCSI_DISK]
326- vendor, model = device.getScsiVendorAndModelName()
327- self.assertEqual(
328- vendor, 'ATA',
329- 'Unexpected result of HWDevice.getScsiVendorAndModelName '
330- 'for a reguale SCSI device. Expected vendor name ATA, got %r.'
331- % vendor)
332- self.assertEqual(
333- model, 'HTC426060G9AT00',
334- 'Unexpected result of HWDevice.getScsiVendorAndModelName '
335- 'for a reguale SCSI device. Expected vendor name '
336- 'HTC426060G9AT00 , got %r.'
337- % model)
338+ vendor_product = device.getScsiVendorAndModelName()
339+ self.assertEqual(
340+ {
341+ 'vendor': 'ATA',
342+ 'product': 'HTC426060G9AT00',
343+ },
344+ vendor_product,
345+ 'Unexpected result of HWDevice.getScsiVendorAndModelName '
346+ 'for a reguale SCSI device: %r.'
347+ % vendor_product)
348
349 def testHALDeviceVendorFromInfoVendor(self):
350 """Test of HALDevice.vendor, regular case.
351@@ -2606,6 +2600,11 @@
352 }
353 }
354
355+ root_device_dmi_data = {
356+ '/sys/class/dmi/id/sys_vendor': 'FUJITSU SIEMENS',
357+ '/sys/class/dmi/id/product_name': 'LIFEBOOK E8210',
358+ }
359+
360 pci_device_data = {
361 'P': '/devices/pci0000:00/0000:00:1f.2',
362 'E': {
363@@ -2641,97 +2640,149 @@
364 'type': '5',
365 }
366
367+ no_subsystem_device_data = {
368+ 'P': '/devices/pnp0/00:00',
369+ 'E': {}
370+ }
371+
372 def test_device_id(self):
373 """Test of UdevDevice.device_id."""
374- device = UdevDevice(self.pci_device_data, None, None)
375+ device = UdevDevice(None, self.pci_device_data)
376 self.assertEqual(
377 '/devices/pci0000:00/0000:00:1f.2', device.device_id,
378 'Unexpected value of UdevDevice.device_id.')
379
380+ def test_root_device_ids(self):
381+ device = UdevDevice(
382+ None, self.root_device, None, self.root_device_dmi_data)
383+ self.assertEqual(
384+ {
385+ 'vendor': 'FUJITSU SIEMENS',
386+ 'product': 'LIFEBOOK E8210',
387+ },
388+ device.root_device_ids)
389+
390+ device = UdevDevice(
391+ None, self.root_device, None, {})
392+ self.assertEqual(
393+ {
394+ 'vendor': None,
395+ 'product': None,
396+ },
397+ device.root_device_ids)
398+
399 def test_is_pci(self):
400 """Test of UdevDevice.is_pci."""
401- device = UdevDevice(self.pci_device_data, None, None)
402+ device = UdevDevice(None, self.pci_device_data)
403 self.assertTrue(device.is_pci)
404
405- device = UdevDevice(self.root_device, None, None)
406+ device = UdevDevice(None, self.root_device)
407 self.assertFalse(device.is_pci)
408
409 def test_pci_class_info(self):
410 """Test of UdevDevice.pci_class_info"""
411- device = UdevDevice(self.pci_device_data, None, None)
412+ device = UdevDevice(None, self.pci_device_data)
413 self.assertEqual(
414 (1, 6, 2), device.pci_class_info,
415 'Invalid value of UdevDevice.pci_class_info for PCI device.')
416
417- device = UdevDevice(self.root_device, None, None)
418+ device = UdevDevice(None, self.root_device)
419 self.assertEqual(
420 (None, None, None), device.pci_class_info,
421 'Invalid value of UdevDevice.pci_class_info for Non-PCI device.')
422
423 def test_pci_class(self):
424 """Test of UdevDevice.pci_class"""
425- device = UdevDevice(self.pci_device_data, None, None)
426+ device = UdevDevice(None, self.pci_device_data)
427 self.assertEqual(
428 1, device.pci_class,
429 'Invalid value of UdevDevice.pci_class for PCI device.')
430
431- device = UdevDevice(self.root_device, None, None)
432+ device = UdevDevice(None, self.root_device)
433 self.assertEqual(
434 None, device.pci_class,
435 'Invalid value of UdevDevice.pci_class for Non-PCI device.')
436
437 def test_pci_subclass(self):
438 """Test of UdevDevice.pci_subclass"""
439- device = UdevDevice(self.pci_device_data, None, None)
440+ device = UdevDevice(None, self.pci_device_data)
441 self.assertEqual(
442 6, device.pci_subclass,
443 'Invalid value of UdevDevice.pci_class for PCI device.')
444
445- device = UdevDevice(self.root_device, None, None)
446+ device = UdevDevice(None, self.root_device)
447 self.assertEqual(
448 None, device.pci_class,
449 'Invalid value of UdevDevice.pci_class for Non-PCI device.')
450
451+ def test_pci_ids(self):
452+ """Test of UdevDevice.pci_ids"""
453+ device = UdevDevice(None, self.pci_device_data)
454+ self.assertEqual(
455+ {'vendor': 0x8086,
456+ 'product': 0x27C5,
457+ },
458+ device.pci_ids,
459+ 'Invalid value of UdevDevice.pci_ids for PCI device.')
460+
461+ device = UdevDevice(None, self.usb_device_data)
462+ self.assertEqual(
463+ {'vendor': None,
464+ 'product': None,
465+ },
466+ device.pci_ids,
467+ 'Invalid value of UdevDevice.pci_ids for Non-PCI device.')
468+
469 def test_is_usb(self):
470 """Test of UdevDevice.is_usb"""
471- device = UdevDevice(self.usb_device_data, None, None)
472+ device = UdevDevice(None, self.usb_device_data)
473 self.assertTrue(device.is_usb)
474
475- device = UdevDevice(self.pci_device_data, None, None)
476+ device = UdevDevice(None, self.pci_device_data)
477 self.assertFalse(device.is_usb)
478
479 def test_usb_ids(self):
480 """Test of UdevDevice.usb_ids"""
481- device = UdevDevice(self.usb_device_data, None, None)
482+ device = UdevDevice(None, self.usb_device_data)
483 self.assertEqual(
484- [0x46d, 0xa01, 0x1013], device.usb_ids,
485+ {
486+ 'vendor': 0x46d,
487+ 'product': 0xa01,
488+ 'version': 0x1013,
489+ },
490+ device.usb_ids,
491 'Invalid value of UdevDevice.usb_ids for USB device.')
492
493- device = UdevDevice(self.root_device, None, None)
494+ device = UdevDevice(None, self.root_device)
495 self.assertEqual(
496- [None, None, None], device.usb_ids,
497+ {
498+ 'vendor': None,
499+ 'product': None,
500+ 'version': None,
501+ },
502+ device.usb_ids,
503 'Invalid value of UdevDevice.usb_ids for Non-USB device.')
504
505 def test_usb_vendor_id(self):
506 """Test of UdevDevice.usb_vendor_id"""
507- device = UdevDevice(self.usb_device_data, None, None)
508+ device = UdevDevice(None, self.usb_device_data)
509 self.assertEqual(
510 0x46d, device.usb_vendor_id,
511 'Invalid value of UdevDevice.usb_vendor_id for USB device.')
512
513- device = UdevDevice(self.root_device, None, None)
514+ device = UdevDevice(None, self.root_device)
515 self.assertEqual(
516 None, device.usb_vendor_id,
517 'Invalid value of UdevDevice.usb_vendor_id for Non-USB device.')
518
519 def test_usb_product_id(self):
520 """Test of UdevDevice.usb_product_id"""
521- device = UdevDevice(self.usb_device_data, None, None)
522+ device = UdevDevice(None, self.usb_device_data)
523 self.assertEqual(
524 0xa01, device.usb_product_id,
525 'Invalid value of UdevDevice.usb_product_id for USB device.')
526
527- device = UdevDevice(self.root_device, None, None)
528+ device = UdevDevice(None, self.root_device)
529 self.assertEqual(
530 None, device.usb_product_id,
531 'Invalid value of UdevDevice.usb_product_id for Non-USB device.')
532@@ -2739,29 +2790,127 @@
533 def test_is_scsi_device(self):
534 """Test of UdevDevice.is_scsi_device."""
535 device = UdevDevice(
536- self.scsi_device_data, self.scsi_device_sysfs_data, None)
537+ None, self.scsi_device_data, self.scsi_device_sysfs_data)
538 self.assertTrue(device.is_scsi_device)
539
540- device = UdevDevice(self.root_device, None, None)
541+ device = UdevDevice(None, self.root_device)
542 self.assertFalse(device.is_scsi_device)
543
544 def test_scsi_vendor(self):
545 """Test of UdevDevice.scsi_vendor."""
546 device = UdevDevice(
547- self.scsi_device_data, self.scsi_device_sysfs_data, None)
548+ None, self.scsi_device_data, self.scsi_device_sysfs_data, None)
549 self.assertEqual('MATSHITA', device.scsi_vendor)
550- device = UdevDevice(self.root_device, None, None)
551+ device = UdevDevice(None, self.root_device)
552 self.assertEqual(None, device.scsi_vendor)
553
554 def test_scsi_model(self):
555 """Test of UdevDevice.scsi_model."""
556 device = UdevDevice(
557- self.scsi_device_data, self.scsi_device_sysfs_data, None)
558+ None, self.scsi_device_data, self.scsi_device_sysfs_data)
559 self.assertEqual('DVD-RAM UJ-841S', device.scsi_model)
560
561- device = UdevDevice(self.root_device, None, None)
562+ device = UdevDevice(None, self.root_device)
563 self.assertEqual(None, device.scsi_model)
564
565+ def test_raw_bus(self):
566+ """Test of UdevDevice.raw_bus."""
567+ device = UdevDevice(None, self.root_device)
568+ self.assertEqual(None, device.raw_bus)
569+
570+ device = UdevDevice(None, self.pci_device_data)
571+ self.assertEqual('pci', device.raw_bus)
572+
573+ device = UdevDevice(None, self.usb_device_data)
574+ self.assertEqual('usb_device', device.raw_bus)
575+
576+ device = UdevDevice(None, self.no_subsystem_device_data)
577+ self.assertEqual(None, device.raw_bus)
578+
579+ def test_getVendorOrProduct(self):
580+ """Test of UdevDevice.getVendorOrProduct()."""
581+ device = UdevDevice(
582+ None, self.root_device, None, self.root_device_dmi_data)
583+ self.assertEqual(
584+ 'FUJITSU SIEMENS', device.getVendorOrProduct('vendor'))
585+ self.assertEqual(
586+ 'LIFEBOOK E8210', device.getVendorOrProduct('product'))
587+ self.assertRaises(
588+ AssertionError, device.getVendorOrProduct, 'nonsense')
589+
590+ device = UdevDevice(None, self.pci_device_data)
591+ self.assertEqual('Unknown', device.getVendorOrProduct('vendor'))
592+ self.assertEqual('Unknown', device.getVendorOrProduct('product'))
593+
594+ device = UdevDevice(None, self.usb_device_data)
595+ self.assertEqual('Unknown', device.getVendorOrProduct('vendor'))
596+ self.assertEqual('Unknown', device.getVendorOrProduct('product'))
597+
598+ device = UdevDevice(
599+ None, self.scsi_device_data, self.scsi_device_sysfs_data)
600+ self.assertEqual('MATSHITA', device.getVendorOrProduct('vendor'))
601+ self.assertEqual(
602+ 'DVD-RAM UJ-841S', device.getVendorOrProduct('product'))
603+
604+ device = UdevDevice(None, self.no_subsystem_device_data)
605+ self.assertEqual(None, device.getVendorOrProduct('vendor'))
606+ self.assertEqual(None, device.getVendorOrProduct('product'))
607+
608+ def test_vendor(self):
609+ """Test of UdevDevice.vendor."""
610+ device = UdevDevice(
611+ None, self.root_device, None, self.root_device_dmi_data)
612+ self.assertEqual('FUJITSU SIEMENS', device.vendor)
613+
614+ def test_product(self):
615+ """Test of UdevDevice.product."""
616+ device = UdevDevice(
617+ None, self.root_device, None, self.root_device_dmi_data)
618+ self.assertEqual('LIFEBOOK E8210', device.product)
619+
620+ def test_getVendorOrProductID(self):
621+ """Test of UdevDevice.getVendorOrProduct()."""
622+ device = UdevDevice(
623+ None, self.root_device, None, self.root_device_dmi_data)
624+ self.assertEqual(
625+ 'FUJITSU SIEMENS', device.getVendorOrProductID('vendor'))
626+ self.assertEqual(
627+ 'LIFEBOOK E8210', device.getVendorOrProductID('product'))
628+ self.assertRaises(
629+ AssertionError, device.getVendorOrProductID, 'nonsense')
630+
631+ device = UdevDevice(None, self.pci_device_data)
632+ self.assertEqual(0x8086, device.getVendorOrProductID('vendor'))
633+ self.assertEqual(0x27C5, device.getVendorOrProductID('product'))
634+
635+ device = UdevDevice(None, self.usb_device_data)
636+ self.assertEqual(0x46d, device.getVendorOrProductID('vendor'))
637+ self.assertEqual(0xa01, device.getVendorOrProductID('product'))
638+
639+ device = UdevDevice(
640+ None, self.scsi_device_data, self.scsi_device_sysfs_data)
641+ self.assertEqual('MATSHITA', device.getVendorOrProductID('vendor'))
642+ self.assertEqual(
643+ 'DVD-RAM UJ-841S', device.getVendorOrProductID('product'))
644+
645+ device = UdevDevice(
646+ None, self.no_subsystem_device_data)
647+ self.assertEqual(None, device.getVendorOrProductID('vendor'))
648+ self.assertEqual(None, device.getVendorOrProductID('product'))
649+
650+ def test_vendor_id(self):
651+ """Test of UdevDevice.vendor_id."""
652+ device = UdevDevice(
653+ None, self.root_device, None, self.root_device_dmi_data)
654+ self.assertEqual('FUJITSU SIEMENS', device.vendor_id)
655+
656+ def test_product_id(self):
657+ """Test of UdevDevice.product_id."""
658+ device = UdevDevice(
659+ None, self.root_device, None, self.root_device_dmi_data)
660+ self.assertEqual('LIFEBOOK E8210', device.product_id)
661+
662+
663 class TestHWDBSubmissionTablePopulation(TestCaseHWDB):
664 """Tests of the HWDB popoluation with submitted data."""
665

Subscribers

People subscribed via source and target branches

to status/vote changes: