# 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 os
import re
from autotest_lib.client.bin import test, utils
from autotest_lib.client.common_lib import error, site_utils

#  Parse the score result lines, e.g. output of regression tests for mario
#
#  | mario/base_click   |          |  success (1.0000)  |         |
#  | mario/base_tap     |          |  failure           |         |
#
#  We would like to retrieve the test name and its score if it is a success
#  pattern and give the score of 0.0 if it is a failure pattern.
SUCCESS_PATTERN = '\|\s*([\w\d.]*/\w+)\s*\|\s*\|\s*success\s\((\d.\d+\))\s*\|'
SUCCESS_RE = re.compile(SUCCESS_PATTERN)
FAILURE_PATTERN = '\|\s*([\w\d.]*/\w+)\s*\|\s*\|\s*failure\s*\|'
FAILURE_RE = re.compile(FAILURE_PATTERN)
TOUCHPAD_TEST = os.path.join('touchpad-tests', 'touchtests')


class platform_GesturesRegressionTest(test.test):
    """ Wrapper of regression test of gestures library.

    This test takes advantage of autotest framework to execute the touchtests,
    i.e. regression test of gestures library, and store results of the test
    per build(as one of BVTs) for us to keep track of patches of gestures
    library and regression tests, and their score changes accordingly.
    """
    version = 1

    def setup(self):
        self.job.setup_dep(['touchpad-tests'])

    def run_once(self):
        """ Run the regression test and collect the results.
        """
        # decide what tests to be executed, strip out prefix 'x86-' if exists
        board = site_utils.get_current_board().replace('x86-', '')
        if board == 'daisy':
            board = 'snow'

        touchtests = os.path.join(self.autodir, 'deps', TOUCHPAD_TEST)
        cmd = '%s %s*/*' % (touchtests, board)
        output = utils.system_output(cmd)
        if not output:
            raise error.TestError('Can not run the touchtests')

        self.test_results = {}
        for line in output.splitlines():
            result = SUCCESS_RE.search(line)
            score = ''
            if result:
                score = result.group(2)
            else:
                result = FAILURE_RE.search(line)
                if result:
                    # set the score of failure test to 0.0
                    score = '0.0'
            if score:
                # '/' is not a valid character for a key name
                self.test_results[result.group(1).replace('/', '-')] = score
        # write converted test results out
        if self.test_results:
            self.write_perf_keyval(self.test_results)
