| # Copyright (c) 2013 The Chromium OS Authors. All rights reserved. |
| # Use of this source code is governed by a BSD-style license that can be |
| # found in the LICENSE file. |
| |
| import re, errno, logging, utils |
| from autotest_lib.client.bin import test |
| from autotest_lib.client.common_lib import error |
| |
| class platform_Mosys(test.test): |
| version = 1 |
| |
| def __TestAllLeafCommands(self): |
| """Tests all "leaf" sub-commands return non-error. |
| |
| Commands that return ENOSYS or EINVAL are not counted as error. |
| Return value are not check for correctness. |
| |
| Raises: |
| error.TestFail Raised for commands that return non-zero exit code. |
| """ |
| |
| # Find all leaf commands by 'mosys -tv'. |
| # Old mosys keeps track root:branch:node numbers; the output for one |
| # command may look like, for example, |
| # [leaf 5:5] mosys platform variant |
| # Latest mosys removes these numbers: |
| # [leaf] mosys platform variant |
| cmd_re = re.compile('\[leaf[^\]]*\] (.+)') |
| bad_cmd_list = [] |
| cmd_list = utils.system_output('mosys -tv') |
| for line in cmd_list.splitlines(): |
| m = cmd_re.search(line) |
| if m and not self.__TestOneCommand(m.group(1)): |
| bad_cmd_list.append(m.group(1)) |
| |
| if len(bad_cmd_list) == 1: |
| raise error.TestFail('Command not properly implemented: ' + |
| bad_cmd_list[0]) |
| elif len(bad_cmd_list) > 1: |
| raise error.TestFail('Commands not properly implemented: ' + |
| ','.join(bad_cmd_list)) |
| |
| def __TestOneCommand(self, cmd): |
| """ Tests one "leaf" sub-command. |
| |
| Returns |
| True if the command returns 0, ENOSYS or EINVAL; False otherwise. |
| """ |
| |
| # Note that 'mosys eeprom map' takes about 30 sec to complete on Snow. |
| # We set timeout=40 to accommodate that. |
| result = utils.run(cmd, timeout=40, ignore_status=True) |
| rc = result.exit_status |
| if rc and rc not in [errno.ENOSYS, errno.EINVAL]: |
| # older mosys does not return useful exit code but instead, prints |
| # 'Command not supported on this platform' on stderr or prints |
| # usage info on stdout when the command needs arguments. These are |
| # not considered as error. |
| stderr = result.stderr |
| stdout = result.stdout |
| not_supported = (stderr and |
| stderr.startswith('Command not supported on this platform')) |
| need_argument = stdout and stdout.startswith('usage:') |
| unable_to_determine = (stderr and |
| stderr.startswith('Unable to determine')) |
| if not_supported: |
| logging.info('cmd not supported: "%s"', cmd); |
| elif need_argument: |
| logging.info('cmd needs argument: "%s"', cmd); |
| elif unable_to_determine: |
| logging.info('Unable to determine: "%s"', cmd); |
| else: |
| logging.error('failed to execute "%s"; exit code=%d', cmd, rc); |
| return False |
| |
| return True |
| |
| def run_once(self): |
| self.__TestAllLeafCommands() |