Merge lp:~adeuring/launchpad/bug-458029-kernel-package-name-for-udev-submissions into lp:launchpad
- bug-458029-kernel-package-name-for-udev-submissions
- Merge into devel
Proposed by
Abel Deuring
Status: | Merged |
---|---|
Approved by: | Muharem Hrnjadovic |
Approved revision: | no longer in the source branch. |
Merged at revision: | not available |
Proposed branch: | lp:~adeuring/launchpad/bug-458029-kernel-package-name-for-udev-submissions |
Merge into: | lp:launchpad |
Diff against target: |
429 lines 3 files modified
lib/canonical/launchpad/scripts/hwdbsubmissions.py (+22/-10) lib/canonical/launchpad/scripts/tests/test_hwdb_submission_parser.py (+3/-0) lib/canonical/launchpad/scripts/tests/test_hwdb_submission_processing.py (+194/-36) |
To merge this branch: | bzr merge lp:~adeuring/launchpad/bug-458029-kernel-package-name-for-udev-submissions |
Related bugs: |
Reviewer | Review Type | Date Requested | Status |
---|---|---|---|
Muharem Hrnjadovic (community) | Approve | ||
Review via email: mp+13781@code.launchpad.net |
Commit message
Description of the change
To post a comment you must log in.
Revision history for this message
Abel Deuring (adeuring) wrote : | # |
Revision history for this message
Muharem Hrnjadovic (al-maisan) wrote : | # |
Hello Abel!
This looks good. Thanks!
review:
Approve
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-21 10:06:31 +0000 | |||
3 | +++ lib/canonical/launchpad/scripts/hwdbsubmissions.py 2009-10-22 11:50:26 +0000 | |||
4 | @@ -33,6 +33,7 @@ | |||
5 | 33 | 33 | ||
6 | 34 | from canonical.lazr.xml import RelaxNGValidator | 34 | from canonical.lazr.xml import RelaxNGValidator |
7 | 35 | 35 | ||
8 | 36 | from canonical.cachedproperty import cachedproperty | ||
9 | 36 | from canonical.config import config | 37 | from canonical.config import config |
10 | 37 | from canonical.librarian.interfaces import LibrarianServerError | 38 | from canonical.librarian.interfaces import LibrarianServerError |
11 | 38 | from canonical.launchpad.interfaces.hwdb import ( | 39 | from canonical.launchpad.interfaces.hwdb import ( |
12 | @@ -503,6 +504,7 @@ | |||
13 | 503 | devices = [] | 504 | devices = [] |
14 | 504 | device = None | 505 | device = None |
15 | 505 | line_number = 0 | 506 | line_number = 0 |
16 | 507 | device_id = 0 | ||
17 | 506 | 508 | ||
18 | 507 | for line_number, line in enumerate(udev_data): | 509 | for line_number, line in enumerate(udev_data): |
19 | 508 | if len(line) == 0: | 510 | if len(line) == 0: |
20 | @@ -518,9 +520,11 @@ | |||
21 | 518 | 520 | ||
22 | 519 | key, value = record | 521 | key, value = record |
23 | 520 | if device is None: | 522 | if device is None: |
24 | 523 | device_id += 1 | ||
25 | 521 | device = { | 524 | device = { |
26 | 522 | 'E': {}, | 525 | 'E': {}, |
27 | 523 | 'S': [], | 526 | 'S': [], |
28 | 527 | 'id': device_id, | ||
29 | 524 | } | 528 | } |
30 | 525 | devices.append(device) | 529 | devices.append(device) |
31 | 526 | # Some attribute lines have a space character after the | 530 | # Some attribute lines have a space character after the |
32 | @@ -1467,15 +1471,20 @@ | |||
33 | 1467 | del self.devices['/devices'] | 1471 | del self.devices['/devices'] |
34 | 1468 | return True | 1472 | return True |
35 | 1469 | 1473 | ||
40 | 1470 | def getKernelPackageName(self): | 1474 | @cachedproperty |
41 | 1471 | """Return the kernel package name of the submission,""" | 1475 | def kernel_package_name(self): |
42 | 1472 | root_hal_device = self.devices[ROOT_UDI] | 1476 | """The kernel package name for the submission.""" |
43 | 1473 | kernel_version = root_hal_device.getProperty('system.kernel.version') | 1477 | if ROOT_UDI in self.devices: |
44 | 1478 | root_hal_device = self.devices[ROOT_UDI] | ||
45 | 1479 | kernel_version = root_hal_device.getProperty( | ||
46 | 1480 | 'system.kernel.version') | ||
47 | 1481 | else: | ||
48 | 1482 | kernel_version = self.parsed_data['summary'].get('kernel-release') | ||
49 | 1474 | if kernel_version is None: | 1483 | if kernel_version is None: |
50 | 1475 | self._logWarning( | 1484 | self._logWarning( |
51 | 1476 | 'Submission does not provide property system.kernel.version ' | 1485 | 'Submission does not provide property system.kernel.version ' |
54 | 1477 | 'for /org/freedesktop/Hal/devices/computer.', | 1486 | 'for /org/freedesktop/Hal/devices/computer or a summary ' |
55 | 1478 | WARNING_NO_HAL_KERNEL_VERSION) | 1487 | 'sub-node <kernel-release>.') |
56 | 1479 | return None | 1488 | return None |
57 | 1480 | kernel_package_name = 'linux-image-' + kernel_version | 1489 | kernel_package_name = 'linux-image-' + kernel_version |
58 | 1481 | packages = self.parsed_data['software']['packages'] | 1490 | packages = self.parsed_data['software']['packages'] |
59 | @@ -1487,8 +1496,7 @@ | |||
60 | 1487 | 'Inconsistent kernel version data: According to HAL the ' | 1496 | 'Inconsistent kernel version data: According to HAL the ' |
61 | 1488 | 'kernel is %s, but the submission does not know about a ' | 1497 | 'kernel is %s, but the submission does not know about a ' |
62 | 1489 | 'kernel package %s' | 1498 | 'kernel package %s' |
65 | 1490 | % (kernel_version, kernel_package_name), | 1499 | % (kernel_version, kernel_package_name)) |
64 | 1491 | WARNING_NO_HAL_KERNEL_VERSION) | ||
66 | 1492 | return None | 1500 | return None |
67 | 1493 | return kernel_package_name | 1501 | return kernel_package_name |
68 | 1494 | 1502 | ||
69 | @@ -2182,10 +2190,9 @@ | |||
70 | 2182 | # drivers, so there is currently no need to search for | 2190 | # drivers, so there is currently no need to search for |
71 | 2183 | # for user space printer drivers, for example. | 2191 | # for user space printer drivers, for example. |
72 | 2184 | if self.driver_name is not None: | 2192 | if self.driver_name is not None: |
73 | 2185 | kernel_package_name = self.parser.getKernelPackageName() | ||
74 | 2186 | db_driver_set = getUtility(IHWDriverSet) | 2193 | db_driver_set = getUtility(IHWDriverSet) |
75 | 2187 | return db_driver_set.getOrCreate( | 2194 | return db_driver_set.getOrCreate( |
77 | 2188 | kernel_package_name, self.driver_name) | 2195 | self.parser.kernel_package_name, self.driver_name) |
78 | 2189 | else: | 2196 | else: |
79 | 2190 | return None | 2197 | return None |
80 | 2191 | 2198 | ||
81 | @@ -2776,6 +2783,11 @@ | |||
82 | 2776 | return None | 2783 | return None |
83 | 2777 | return controller | 2784 | return controller |
84 | 2778 | 2785 | ||
85 | 2786 | @property | ||
86 | 2787 | def id(self): | ||
87 | 2788 | return self.udev['id'] | ||
88 | 2789 | |||
89 | 2790 | |||
90 | 2779 | class ProcessingLoop(object): | 2791 | class ProcessingLoop(object): |
91 | 2780 | """An `ITunableLoop` for processing HWDB submissions.""" | 2792 | """An `ITunableLoop` for processing HWDB submissions.""" |
92 | 2781 | 2793 | ||
93 | 2782 | 2794 | ||
94 | === modified file 'lib/canonical/launchpad/scripts/tests/test_hwdb_submission_parser.py' | |||
95 | --- lib/canonical/launchpad/scripts/tests/test_hwdb_submission_parser.py 2009-10-12 14:50:22 +0000 | |||
96 | +++ lib/canonical/launchpad/scripts/tests/test_hwdb_submission_parser.py 2009-10-22 11:50:26 +0000 | |||
97 | @@ -635,6 +635,7 @@ | |||
98 | 635 | 'MODALIAS': 'acpi:LNXSYSTM:', | 635 | 'MODALIAS': 'acpi:LNXSYSTM:', |
99 | 636 | }, | 636 | }, |
100 | 637 | 'S': [], | 637 | 'S': [], |
101 | 638 | 'id': 1, | ||
102 | 638 | }, | 639 | }, |
103 | 639 | { | 640 | { |
104 | 640 | 'P': '/devices/pci0000:00/0000:00:1a.0', | 641 | 'P': '/devices/pci0000:00/0000:00:1a.0', |
105 | @@ -643,6 +644,7 @@ | |||
106 | 643 | 'DEVPATH': '/devices/pci0000:00/0000:00:1a.0', | 644 | 'DEVPATH': '/devices/pci0000:00/0000:00:1a.0', |
107 | 644 | }, | 645 | }, |
108 | 645 | 'S': ['char/189:256'], | 646 | 'S': ['char/189:256'], |
109 | 647 | 'id': 2, | ||
110 | 646 | }, | 648 | }, |
111 | 647 | ], | 649 | ], |
112 | 648 | result, | 650 | result, |
113 | @@ -704,6 +706,7 @@ | |||
114 | 704 | 'E': {}, | 706 | 'E': {}, |
115 | 705 | 'S': [], | 707 | 'S': [], |
116 | 706 | 'W': '2', | 708 | 'W': '2', |
117 | 709 | 'id': 1, | ||
118 | 707 | }, | 710 | }, |
119 | 708 | ], | 711 | ], |
120 | 709 | result, | 712 | result, |
121 | 710 | 713 | ||
122 | === modified file 'lib/canonical/launchpad/scripts/tests/test_hwdb_submission_processing.py' | |||
123 | --- lib/canonical/launchpad/scripts/tests/test_hwdb_submission_processing.py 2009-10-21 10:06:31 +0000 | |||
124 | +++ lib/canonical/launchpad/scripts/tests/test_hwdb_submission_processing.py 2009-10-22 11:50:26 +0000 | |||
125 | @@ -360,8 +360,8 @@ | |||
126 | 360 | self.assertErrorMessage( | 360 | self.assertErrorMessage( |
127 | 361 | parser.submission_key, "No udev root device defined") | 361 | parser.submission_key, "No udev root device defined") |
128 | 362 | 362 | ||
131 | 363 | def testKernelPackageName(self): | 363 | def test_kernel_package_name_hal_data(self): |
132 | 364 | """Test of SubmissionParser.getKernelPackageName. | 364 | """Test of SubmissionParser.kernel_package_name. |
133 | 365 | 365 | ||
134 | 366 | Regular case. | 366 | Regular case. |
135 | 367 | """ | 367 | """ |
136 | @@ -388,17 +388,19 @@ | |||
137 | 388 | }, | 388 | }, |
138 | 389 | } | 389 | } |
139 | 390 | parser.buildDeviceList(parser.parsed_data) | 390 | parser.buildDeviceList(parser.parsed_data) |
143 | 391 | kernel_package = parser.getKernelPackageName() | 391 | kernel_package = parser.kernel_package_name |
144 | 392 | self.assertEqual(kernel_package, self.KERNEL_PACKAGE, | 392 | self.assertEqual( |
145 | 393 | 'Unexpected result of SubmissionParser.getKernelPackageName. ' | 393 | self.KERNEL_PACKAGE, kernel_package, |
146 | 394 | 'Unexpected value of SubmissionParser.kernel_package_name. ' | ||
147 | 394 | 'Expected linux-image-2.6.24-19-generic, got %r' % kernel_package) | 395 | 'Expected linux-image-2.6.24-19-generic, got %r' % kernel_package) |
148 | 395 | 396 | ||
150 | 396 | self.assertEqual(len(self.handler.records), 0, | 397 | self.assertEqual( |
151 | 398 | 0, len(self.handler.records), | ||
152 | 397 | 'One or more warning messages were logged by ' | 399 | 'One or more warning messages were logged by ' |
154 | 398 | 'getKernelPackageName, where zero was expected.') | 400 | 'SubmissionParser.kernel_package_name, where zero was expected.') |
155 | 399 | 401 | ||
158 | 400 | def testKernelPackageNameInconsistent(self): | 402 | def test_kernel_package_hal_data_name_inconsistent(self): |
159 | 401 | """Test of SubmissionParser.getKernelPackageName. | 403 | """Test of SubmissionParser.kernel_package_name. |
160 | 402 | 404 | ||
161 | 403 | Test a name inconsistency. | 405 | Test a name inconsistency. |
162 | 404 | """ | 406 | """ |
163 | @@ -426,24 +428,24 @@ | |||
164 | 426 | } | 428 | } |
165 | 427 | parser.submission_key = 'Test of inconsistent kernel package name' | 429 | parser.submission_key = 'Test of inconsistent kernel package name' |
166 | 428 | parser.buildDeviceList(parser.parsed_data) | 430 | parser.buildDeviceList(parser.parsed_data) |
172 | 429 | kernel_package = parser.getKernelPackageName() | 431 | kernel_package = parser.kernel_package_name |
173 | 430 | self.assertEqual(kernel_package, None, | 432 | self.assertIs(None, kernel_package) |
174 | 431 | 'Unexpected result of SubmissionParser.getKernelPackageName. ' | 433 | self.assertWarningMessage( |
175 | 432 | 'Expected None, got %r' % kernel_package) | 434 | parser.submission_key, |
171 | 433 | self.assertWarningMessage(parser.submission_key, | ||
176 | 434 | 'Inconsistent kernel version data: According to HAL the ' | 435 | 'Inconsistent kernel version data: According to HAL the ' |
177 | 435 | 'kernel is 2.6.24-19-generic, but the submission does not ' | 436 | 'kernel is 2.6.24-19-generic, but the submission does not ' |
178 | 436 | 'know about a kernel package linux-image-2.6.24-19-generic') | 437 | 'know about a kernel package linux-image-2.6.24-19-generic') |
179 | 437 | # The warning appears only once per submission, even if the | 438 | # The warning appears only once per submission, even if the |
181 | 438 | # SubmissionParser.getKernelPackageName is called more than once. | 439 | # property kernel_package_name is accessed more than once. |
182 | 439 | num_warnings = len(self.handler.records) | 440 | num_warnings = len(self.handler.records) |
185 | 440 | parser.getKernelPackageName() | 441 | test = parser.kernel_package_name |
186 | 441 | self.assertEqual(num_warnings, len(self.handler.records), | 442 | self.assertEqual( |
187 | 443 | num_warnings, len(self.handler.records), | ||
188 | 442 | 'Warning for missing HAL property system.kernel.version ' | 444 | 'Warning for missing HAL property system.kernel.version ' |
189 | 443 | 'repeated.') | 445 | 'repeated.') |
190 | 444 | 446 | ||
193 | 445 | def testKernelPackageNameNoHALData(self): | 447 | def test_kernel_package_name_hal_data_no_kernel_version_in_hal_data(self): |
194 | 446 | """Test of SubmissionParser.getKernelPackageName. | 448 | """Test of SubmissionParser.kernel_package_name. |
195 | 447 | 449 | ||
196 | 448 | Test without HAL property system.kernel.version. | 450 | Test without HAL property system.kernel.version. |
197 | 449 | """ | 451 | """ |
198 | @@ -469,26 +471,28 @@ | |||
199 | 469 | } | 471 | } |
200 | 470 | parser.submission_key = 'Test: missing property system.kernel.version' | 472 | parser.submission_key = 'Test: missing property system.kernel.version' |
201 | 471 | parser.buildDeviceList(parser.parsed_data) | 473 | parser.buildDeviceList(parser.parsed_data) |
207 | 472 | kernel_package = parser.getKernelPackageName() | 474 | self.assertIs(None, parser.kernel_package_name) |
208 | 473 | self.assertEqual(kernel_package, None, | 475 | self.assertWarningMessage( |
209 | 474 | 'Unexpected result of SubmissionParser.getKernelPackageName. ' | 476 | parser.submission_key, |
205 | 475 | 'Expected None, got %r' % kernel_package) | ||
206 | 476 | self.assertWarningMessage(parser.submission_key, | ||
210 | 477 | 'Submission does not provide property system.kernel.version ' | 477 | 'Submission does not provide property system.kernel.version ' |
212 | 478 | 'for /org/freedesktop/Hal/devices/computer.') | 478 | 'for /org/freedesktop/Hal/devices/computer or a summary ' |
213 | 479 | 'sub-node <kernel-release>.') | ||
214 | 479 | # The warning appears only once per submission, even if the | 480 | # The warning appears only once per submission, even if the |
216 | 480 | # SubmissionParser.getKernelPackageName is called more than once. | 481 | # property kernel_package_name is accessed more than once. |
217 | 481 | num_warnings = len(self.handler.records) | 482 | num_warnings = len(self.handler.records) |
220 | 482 | parser.getKernelPackageName() | 483 | test = parser.kernel_package_name |
221 | 483 | self.assertEqual(num_warnings, len(self.handler.records), | 484 | self.assertEqual( |
222 | 485 | num_warnings, len(self.handler.records), | ||
223 | 484 | 'Warning for missing HAL property system.kernel.version ' | 486 | 'Warning for missing HAL property system.kernel.version ' |
224 | 485 | 'repeated.') | 487 | 'repeated.') |
225 | 486 | 488 | ||
228 | 487 | def testKernelPackageNameNoPackageData(self): | 489 | def test_kernel_package_name_hal_data_no_package_data(self): |
229 | 488 | """Test of SubmissionParser.getKernelPackageName. | 490 | """Test of SubmissionParser.kernel_package_name. |
230 | 489 | 491 | ||
233 | 490 | Test without any package data. getKernelPackageName returns | 492 | Test without any package data. In this case, |
234 | 491 | the property system.kernel.version without any further checking. | 493 | SubmissionParser.kernel_package_name is the value of the property |
235 | 494 | system.kernel.version if the root HAL device. No further checks | ||
236 | 495 | are done. | ||
237 | 492 | """ | 496 | """ |
238 | 493 | parser = SubmissionParser(self.log) | 497 | parser = SubmissionParser(self.log) |
239 | 494 | devices = [ | 498 | devices = [ |
240 | @@ -512,8 +516,156 @@ | |||
241 | 512 | } | 516 | } |
242 | 513 | parser.submission_key = 'Test: missing property system.kernel.version' | 517 | parser.submission_key = 'Test: missing property system.kernel.version' |
243 | 514 | parser.buildDeviceList(parser.parsed_data) | 518 | parser.buildDeviceList(parser.parsed_data) |
246 | 515 | kernel_package = parser.getKernelPackageName() | 519 | kernel_package = parser.kernel_package_name |
247 | 516 | self.assertEqual(kernel_package, self.KERNEL_PACKAGE, | 520 | self.assertEqual( |
248 | 521 | self.KERNEL_PACKAGE, kernel_package, | ||
249 | 522 | 'Unexpected result of SubmissionParser.getKernelPackageName, ' | ||
250 | 523 | 'test without any package data. Expected None, got %r' | ||
251 | 524 | % kernel_package) | ||
252 | 525 | |||
253 | 526 | def test_kernel_package_name_udev_data(self): | ||
254 | 527 | """Test of SubmissionParser.kernel_package_name for udev data. | ||
255 | 528 | |||
256 | 529 | Variant for udev data, regular case. | ||
257 | 530 | """ | ||
258 | 531 | parser = SubmissionParser(self.log) | ||
259 | 532 | parser.parsed_data = { | ||
260 | 533 | 'hardware': { | ||
261 | 534 | 'udev': [ | ||
262 | 535 | {'P': '/devices/LNXSYSTM:00'} | ||
263 | 536 | ], | ||
264 | 537 | 'sysfs-attributes': {}, | ||
265 | 538 | 'dmi': {}, | ||
266 | 539 | }, | ||
267 | 540 | 'software': { | ||
268 | 541 | 'packages': { | ||
269 | 542 | self.KERNEL_PACKAGE: {}, | ||
270 | 543 | }, | ||
271 | 544 | }, | ||
272 | 545 | 'summary': { | ||
273 | 546 | 'kernel-release': self.KERNEL_VERSION, | ||
274 | 547 | }, | ||
275 | 548 | } | ||
276 | 549 | parser.buildDeviceList(parser.parsed_data) | ||
277 | 550 | kernel_package = parser.kernel_package_name | ||
278 | 551 | self.assertEqual( | ||
279 | 552 | self.KERNEL_PACKAGE, kernel_package, | ||
280 | 553 | 'Unexpected value of SubmissionParser.kernel_package_name. ' | ||
281 | 554 | 'Expected linux-image-2.6.24-19-generic, got %r' % kernel_package) | ||
282 | 555 | |||
283 | 556 | self.assertEqual( | ||
284 | 557 | 0, len(self.handler.records), | ||
285 | 558 | 'One or more warning messages were logged by ' | ||
286 | 559 | 'SubmissionParser.kernel_package_name, where zero was expected.') | ||
287 | 560 | |||
288 | 561 | def test_kernel_package_udev_data_name_inconsistent(self): | ||
289 | 562 | """Test of SubmissionParser.kernel_package_name. | ||
290 | 563 | |||
291 | 564 | Variant for udev data, name inconsistency. | ||
292 | 565 | """ | ||
293 | 566 | parser = SubmissionParser(self.log) | ||
294 | 567 | parser.parsed_data = { | ||
295 | 568 | 'hardware': { | ||
296 | 569 | 'udev': [ | ||
297 | 570 | {'P': '/devices/LNXSYSTM:00'} | ||
298 | 571 | ], | ||
299 | 572 | 'sysfs-attributes': {}, | ||
300 | 573 | 'dmi': {}, | ||
301 | 574 | }, | ||
302 | 575 | 'software': { | ||
303 | 576 | 'packages': { | ||
304 | 577 | 'linux-image-from-obscure-external-source': {}, | ||
305 | 578 | }, | ||
306 | 579 | }, | ||
307 | 580 | 'summary': { | ||
308 | 581 | 'kernel-release': self.KERNEL_VERSION, | ||
309 | 582 | }, | ||
310 | 583 | } | ||
311 | 584 | parser.submission_key = 'Test of inconsistent kernel package name' | ||
312 | 585 | parser.buildDeviceList(parser.parsed_data) | ||
313 | 586 | kernel_package = parser.kernel_package_name | ||
314 | 587 | self.assertIs(None, kernel_package) | ||
315 | 588 | self.assertWarningMessage( | ||
316 | 589 | parser.submission_key, | ||
317 | 590 | 'Inconsistent kernel version data: According to HAL the ' | ||
318 | 591 | 'kernel is 2.6.24-19-generic, but the submission does not ' | ||
319 | 592 | 'know about a kernel package linux-image-2.6.24-19-generic') | ||
320 | 593 | # The warning appears only once per submission, even if the | ||
321 | 594 | # property kernel_package_name is accessed more than once. | ||
322 | 595 | num_warnings = len(self.handler.records) | ||
323 | 596 | test = parser.kernel_package_name | ||
324 | 597 | self.assertEqual( | ||
325 | 598 | num_warnings, len(self.handler.records), | ||
326 | 599 | 'Warning for missing HAL property system.kernel.version ' | ||
327 | 600 | 'repeated.') | ||
328 | 601 | |||
329 | 602 | def test_kernel_package_name_udev_data_no_kernel_version_in_summary(self): | ||
330 | 603 | """Test of SubmissionParser.kernel_package_name. | ||
331 | 604 | |||
332 | 605 | Test without the summary sub-node <kernel-release>. | ||
333 | 606 | """ | ||
334 | 607 | parser = SubmissionParser(self.log) | ||
335 | 608 | parser.parsed_data = { | ||
336 | 609 | 'hardware': { | ||
337 | 610 | 'udev': [ | ||
338 | 611 | {'P': '/devices/LNXSYSTM:00'} | ||
339 | 612 | ], | ||
340 | 613 | 'sysfs-attributes': {}, | ||
341 | 614 | 'dmi': {}, | ||
342 | 615 | }, | ||
343 | 616 | 'software': { | ||
344 | 617 | 'packages': { | ||
345 | 618 | self.KERNEL_PACKAGE: {}, | ||
346 | 619 | }, | ||
347 | 620 | }, | ||
348 | 621 | 'summary': {}, | ||
349 | 622 | } | ||
350 | 623 | parser.submission_key = 'Test: missing property system.kernel.version' | ||
351 | 624 | parser.buildDeviceList(parser.parsed_data) | ||
352 | 625 | self.assertIs(None, parser.kernel_package_name) | ||
353 | 626 | self.assertWarningMessage( | ||
354 | 627 | parser.submission_key, | ||
355 | 628 | 'Submission does not provide property system.kernel.version ' | ||
356 | 629 | 'for /org/freedesktop/Hal/devices/computer or a summary ' | ||
357 | 630 | 'sub-node <kernel-release>.') | ||
358 | 631 | # The warning appears only once per submission, even if the | ||
359 | 632 | # property kernel_package_name is accessed more than once. | ||
360 | 633 | num_warnings = len(self.handler.records) | ||
361 | 634 | test = parser.kernel_package_name | ||
362 | 635 | self.assertEqual( | ||
363 | 636 | num_warnings, len(self.handler.records), | ||
364 | 637 | 'Warning for missing HAL property system.kernel.version ' | ||
365 | 638 | 'repeated.') | ||
366 | 639 | |||
367 | 640 | def test_kernel_package_name_udev_data_no_package_data(self): | ||
368 | 641 | """Test of SubmissionParser.kernel_package_name. | ||
369 | 642 | |||
370 | 643 | Variant for udev data, test without any package data. In this case, | ||
371 | 644 | SubmissionParser.kernel_package_name is the value of the property | ||
372 | 645 | system.kernel.version if the root HAL device. No further checks | ||
373 | 646 | are done. | ||
374 | 647 | """ | ||
375 | 648 | parser = SubmissionParser(self.log) | ||
376 | 649 | parser.parsed_data = { | ||
377 | 650 | 'hardware': { | ||
378 | 651 | 'udev': [ | ||
379 | 652 | {'P': '/devices/LNXSYSTM:00'}, | ||
380 | 653 | ], | ||
381 | 654 | 'sysfs-attributes': {}, | ||
382 | 655 | 'dmi': {}, | ||
383 | 656 | }, | ||
384 | 657 | 'software': { | ||
385 | 658 | 'packages': {}, | ||
386 | 659 | }, | ||
387 | 660 | 'summary': { | ||
388 | 661 | 'kernel-release': self.KERNEL_VERSION, | ||
389 | 662 | }, | ||
390 | 663 | } | ||
391 | 664 | parser.submission_key = 'Test: missing property system.kernel.version' | ||
392 | 665 | parser.buildDeviceList(parser.parsed_data) | ||
393 | 666 | kernel_package = parser.kernel_package_name | ||
394 | 667 | self.assertEqual( | ||
395 | 668 | self.KERNEL_PACKAGE, kernel_package, | ||
396 | 517 | 'Unexpected result of SubmissionParser.getKernelPackageName, ' | 669 | 'Unexpected result of SubmissionParser.getKernelPackageName, ' |
397 | 518 | 'test without any package data. Expected None, got %r' | 670 | 'test without any package data. Expected None, got %r' |
398 | 519 | % kernel_package) | 671 | % kernel_package) |
399 | @@ -3036,7 +3188,8 @@ | |||
400 | 3036 | 'DEVPATH': '/devices/LNXSYSTM:00', | 3188 | 'DEVPATH': '/devices/LNXSYSTM:00', |
401 | 3037 | 'MODALIAS': 'acpi:LNXSYSTM:', | 3189 | 'MODALIAS': 'acpi:LNXSYSTM:', |
402 | 3038 | 'SUBSYSTEM': 'acpi', | 3190 | 'SUBSYSTEM': 'acpi', |
404 | 3039 | } | 3191 | }, |
405 | 3192 | 'id': 1, | ||
406 | 3040 | } | 3193 | } |
407 | 3041 | 3194 | ||
408 | 3042 | self.root_device_dmi_data = { | 3195 | self.root_device_dmi_data = { |
409 | @@ -3520,7 +3673,7 @@ | |||
410 | 3520 | }, | 3673 | }, |
411 | 3521 | } | 3674 | } |
412 | 3522 | 3675 | ||
414 | 3523 | def test_device_id(self): | 3676 | def test_device_device_id(self): |
415 | 3524 | """Test of UdevDevice.device_id.""" | 3677 | """Test of UdevDevice.device_id.""" |
416 | 3525 | device = UdevDevice(None, self.pci_sata_controller) | 3678 | device = UdevDevice(None, self.pci_sata_controller) |
417 | 3526 | self.assertEqual( | 3679 | self.assertEqual( |
418 | @@ -4185,6 +4338,11 @@ | |||
419 | 4185 | 'provide bus, vendor ID, product ID or product name: None None ' | 4338 | 'provide bus, vendor ID, product ID or product name: None None ' |
420 | 4186 | 'None None /devices/pci0000:00/0000:00:1d.7/usb1/1-1/1-1:1.0') | 4339 | 'None None /devices/pci0000:00/0000:00:1d.7/usb1/1-1/1-1:1.0') |
421 | 4187 | 4340 | ||
422 | 4341 | def test_device_id(self): | ||
423 | 4342 | """Each UdevDevice has a property 'id'.""" | ||
424 | 4343 | device = UdevDevice(None, self.root_device) | ||
425 | 4344 | self.assertEqual(1, device.id) | ||
426 | 4345 | |||
427 | 4188 | 4346 | ||
428 | 4189 | class TestHWDBSubmissionTablePopulation(TestCaseHWDB): | 4347 | class TestHWDBSubmissionTablePopulation(TestCaseHWDB): |
429 | 4190 | """Tests of the HWDB popoluation with submitted data.""" | 4348 | """Tests of the HWDB popoluation with submitted data.""" |
This branch changes the method SubmissionParse r.getKernelPack ageName( ) into a property and makes it "aware" of submissions containig udev data instaed of HAL data.
One detail of the data about a device we store in the HWDB is a driver used to control a given device and the deb package of this driver. For kernel drivers, the package name is 'linux- image'+ <kernel- version> .
Most submissions have two sources for the kernel version and the package name:
- The submitted data may contain the set of installed packages kernel. version' ; submissions with udev data have an XML node <summary> <kernel- release>
- Submissions with HAL data, the root HAL device has a property 'system.
Two source for this data mean that sone inconcistencies are possible; the method/proerty has some checks for these inconsistencies.
A problem with early versions of the processing was that getKernelPackag eName is called for nearly each device of a submission (typically more 50), which led to a log file cluttered with 50 or more identical warnings, if there was a name inconsistency.
In a later version of the script, I introduced the optional parameter warning_id, which allow to suppress the repeated logging of warning with the same ID. The tests of getKernelPackag eName/kernel_ package_ name ensure that a warning appears only once, even if the method/property is used more than once.
We have the nice feature of cached properties, so I declared the property as cachable, allowing to omit the warning_id parameter from the _logWarning call, and having the additional benefit of being a bit faster.
This branch is based on the reviewed but not yet merged branch lp:~adeuring/launchpad/bug-457475-udev-device-id; a diff of the changes in this branch is below.
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: /launchpad/ scripts/ hwdbsubmissions .py /launchpad/ scripts/ tests/test_ hwdb_submission _processing. py
lib/canonical
lib/canonical
== Pyflakes notices ==
lib/canonical/ launchpad/ scripts/ hwdbsubmissions .py
22: redefinition of unused 'etree' from line 20
== Pylint notices ==
lib/canonical/ launchpad/ scripts/ hwdbsubmissions .py cElementTree' (No module named etree)
20: [F0401] Unable to import 'xml.etree.
These complaints are not related to my changes.
=== modified file 'lib/canonical/ launchpad/ scripts/ hwdbsubmissions .py' launchpad/ scripts/ hwdbsubmissions .py 2009-10-21 16:49:03 +0000 launchpad/ scripts/ hwdbsubmissions .py 2009-10-22 11:04:03 +0000
--- lib/canonical/
+++ lib/canonical/
@@ -33,6 +33,7 @@
from canonical.lazr.xml import RelaxNGValidator
+from canonical. cachedproperty import cachedproperty librarian. interfaces import LibrarianServer Error launchpad. interfaces. hwdb import ( '/devices' ]
from canonical.config import config
from canonical.
from canonical.
@@ -1470,15 +1471,20 @@
del self.devices[
return True
- def getKernelPackag eName(self) : ROOT_UDI]
- """Return the kernel package name of the submission,"""
- root_hal_device = self.devices[
- kern...