| OLD | NEW |
| 1 # Copyright (c) 2010 The Chromium OS Authors. All rights reserved. | 1 # Copyright (c) 2010 The Chromium OS Authors. All rights reserved. |
| 2 # Use of this source code is governed by a BSD-style license that can be | 2 # Use of this source code is governed by a BSD-style license that can be |
| 3 # found in the LICENSE file. | 3 # found in the LICENSE file. |
| 4 | 4 |
| 5 import glob | 5 import glob |
| 6 import logging | 6 import logging |
| 7 import os | 7 import os |
| 8 import pprint | 8 import pprint |
| 9 import re | 9 import re |
| 10 from autotest_lib.client.bin import factory, test, utils | 10 from autotest_lib.client.bin import factory, test, utils |
| 11 from autotest_lib.client.common_lib import error | 11 from autotest_lib.client.common_lib import error |
| 12 from autotest_lib.client.cros import gooftools | 12 from autotest_lib.client.cros import gooftools |
| 13 | 13 |
| 14 | 14 |
| 15 class hardware_Components(test.test): | 15 class hardware_Components(test.test): |
| 16 version = 3 | 16 version = 3 |
| 17 | 17 |
| 18 def run_once(self, approved_dbs='approved_components', do_probe=True): | 18 def run_once(self, approved_dbs='approved_components', do_probe=True): |
| 19 # In probe mode, we have to find out the matching HWID, write that into |
| 20 # shared data LAST_PROBED_HWID_NAME, and then let factory_WriteGBB to |
| 21 # update system. factory_Finalize will verify if that's set correctly. |
| 22 # |
| 23 # In verify mode, we simply check if current system matches a hardware |
| 24 # configuration in the databases. |
| 19 | 25 |
| 20 last_probed_hwid = None | 26 last_probed_hwid = None |
| 21 if not do_probe: | 27 if not do_probe: |
| 22 # verify, or trust previous probed. | 28 # Verify, or trust previous probed HWID. |
| 23 try: | 29 try: |
| 24 last_probed_hwid = factory.get_shared_data('last_probed_hwid') | 30 last_probed_hwid = factory.get_shared_data( |
| 31 factory.LAST_PROBED_HWID_NAME) |
| 25 except Exception, e: | 32 except Exception, e: |
| 26 # hardware_Components may run without factory environment | 33 # hardware_Components may run without factory environment |
| 27 factory.log('Failed getting shared data, ignored: %s' % repr(e)) | 34 factory.log('Failed getting shared data, ignored: %s' % repr(e)) |
| 28 | 35 |
| 29 # If a hwid was probed, trust it. Otherwise, find best match. | 36 # If a hwid was probed, trust it. Otherwise, find best match. |
| 30 if last_probed_hwid: | 37 if last_probed_hwid: |
| 31 approved_dbs = last_probed_hwid | 38 approved_dbs = last_probed_hwid |
| 32 else: | 39 else: |
| 33 # Currently the files are expected to be inside same folder with | 40 # Currently the files are expected to be inside same folder with |
| 34 # hardware_Components test. | 41 # hardware_Components test. |
| 35 approved_dbs = os.path.join(self.bindir, approved_dbs) | 42 approved_dbs = os.path.join(self.bindir, approved_dbs) |
| 36 sample_approved_dbs = os.path.join(self.bindir, | 43 sample_approved_dbs = os.path.join(self.bindir, |
| 37 'approved_components.default') | 44 'approved_components.default') |
| 38 if (not glob.glob(approved_dbs)) and glob.glob(sample_approved_dbs): | 45 if (not glob.glob(approved_dbs)) and glob.glob(sample_approved_dbs): |
| 39 # Fallback to the default (sample) version | 46 # Fallback to the default (sample) version |
| 40 approved_dbs = sample_approved_dbs | 47 approved_dbs = sample_approved_dbs |
| 41 factory.log('Using default (sample) approved component list: %s' | 48 factory.log('Using default (sample) approved component list: %s' |
| 42 % sample_approved_dbs) | 49 % sample_approved_dbs) |
| 43 | 50 |
| 44 # approved_dbs supports shell-like filename expansion. | 51 # approved_dbs supports shell-like filename expansion. |
| 45 existing_dbs = glob.glob(approved_dbs) | 52 existing_dbs = glob.glob(approved_dbs) |
| 46 if not existing_dbs: | 53 if not existing_dbs: |
| 47 raise error.TestError('Unable to find approved db: %s' % | 54 raise error.TestError('Unable to find approved db: %s' % |
| 48 approved_dbs) | 55 approved_dbs) |
| 49 | 56 |
| 50 if do_probe: | 57 if do_probe: |
| 51 probed_hwids = gooftools.run( | 58 command = 'gooftool --probe --db_path "%s" --verbose' % approved_dbs |
| 52 'gooftool --probe --db_path "%s" --verbose' % approved_dbs) | |
| 53 pattern = 'Probed: ' | 59 pattern = 'Probed: ' |
| 54 factory.log('probe result: ' + probed_hwids) | 60 # The output format is "Probed: PATH" |
| 55 probed_hwids = [hwid.lstrip(pattern) | 61 else: |
| 56 for hwid in probed_hwids.splitlines() | 62 command = ('gooftool --verify_hwid --db_path "%s" --verbose' % |
| 57 if hwid.startswith(pattern)] | 63 approved_dbs) |
| 58 if len(probed_hwids) < 1: | 64 pattern = 'Verified: ' |
| 59 raise error.TestFail('No HWID matched.') | 65 # The output format is "Verified: PATH (HWID)", not a pure path. |
| 60 if len(probed_hwids) > 1: | 66 |
| 61 raise error.TestError('Multiple HWIDs match current system: ' + | 67 (stdout, stderr, result) = gooftools.run(command, ignore_status=True) |
| 62 ','.join(probed_hwids)) | 68 |
| 63 factory.log('Set last_probed_hwid = %s' % probed_hwids[0]) | 69 # Decode successfully matched results |
| 70 hwids = [hwid.lstrip(pattern) |
| 71 for hwid in stdout.splitlines() |
| 72 if hwid.startswith(pattern)] |
| 73 |
| 74 # Decode unmatched results |
| 75 if stderr.find('Unmatched ') < 0: |
| 76 unmatched = '' |
| 77 else: |
| 78 start = stderr.find('Unmatched ') |
| 79 end = stderr.rfind('Current System:') |
| 80 if end >= 0: |
| 81 unmatched = stderr[start:end] |
| 82 else: |
| 83 unmatched = stderr[start:] |
| 84 unmatched = '\n'.join([line for line in unmatched.splitlines() |
| 85 # 'gft_hwcome'/'probe' are debug message. |
| 86 if not (line.startswith('gft_hwcomp:') or |
| 87 line.startswith('probe:') or |
| 88 (not line))]) |
| 89 # Report the results |
| 90 if len(hwids) < 1: |
| 91 raise error.TestFail('\n'.join(('No HWID matched.', unmatched))) |
| 92 if len(hwids) > 1: |
| 93 raise error.TestError('Multiple HWIDs match current system: ' + |
| 94 ','.join(hwids)) |
| 95 if result != 0: |
| 96 raise error.TestFail('HWID matched (%s) with unknown error: %s' |
| 97 % hwids[0], result) |
| 98 |
| 99 # Set the factory state sharead data for factory_WriteGBB |
| 100 if do_probe: |
| 101 factory.log('Set factory state shared data %s = %s' % |
| 102 (factory.LAST_PROBED_HWID_NAME, hwids[0])) |
| 64 try: | 103 try: |
| 65 factory.set_shared_data('last_probed_hwid', probed_hwids[0]) | 104 factory.set_shared_data(factory.LAST_PROBED_HWID_NAME, |
| 105 hwids[0]) |
| 66 except Exception, e: | 106 except Exception, e: |
| 67 # hardware_Components may run without factory environment | 107 # hardware_Components may run without factory environment |
| 68 factory.log('Failed setting shared data, ignored: %s' % | 108 factory.log('Failed setting shared data, ignored: %s' % |
| 69 repr(e)) | 109 repr(e)) |
| 70 else: | 110 factory.log('Exact Matched: HWID=%s' % hwids[0]) |
| 71 verified_hwids = gooftools.run( | |
| 72 'gooftool --verify_hwid --db_path "%s" --verbose' % | |
| 73 approved_dbs) | |
| 74 pattern = 'Verified: ' | |
| 75 # The 'verified hwid' is in format "PATH (HWID)", so we can only use | |
| 76 # it for logging instead of using it directly like in probing. | |
| 77 verified_hwids = [hwid.lstrip(pattern) | |
| 78 for hwid in verified_hwids.splitlines() | |
| 79 if hwid.startswith(pattern)] | |
| 80 if len(probed_hwids) < 1: | |
| 81 raise error.TestFail('No HWID matched.') | |
| 82 if len(verified_hwids) > 1: | |
| 83 raise error.TestError('Multiple HWIDs match current system: ' + | |
| 84 ','.join(verified_hwids)) | |
| 85 factory.log('Verified: HWID=%s' % verified_hwids[0]) | |
| OLD | NEW |