# 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.

        Commands that return ENOSYS or EINVAL are not counted as error.

        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:')
            if not_supported or need_argument:
                if not_supported:
                    logging.debug('cmd not supported: "%s"', cmd);
                else:
                    logging.debug('cmd needs argument: "%s"', cmd);
            else:
                logging.error('failed to execute "%s"; exit code=%d', cmd, rc);
                return False

        return True

    def run_once(self):
        self.__TestAllLeafCommands()
