diff --git a/wlauto/workloads/autotest/__init__.py b/wlauto/workloads/autotest/__init__.py new file mode 100644 index 00000000..930789db --- /dev/null +++ b/wlauto/workloads/autotest/__init__.py @@ -0,0 +1,108 @@ +# Copyright 2015 ARM Limited +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# pylint: disable=attribute-defined-outside-init + +import os +import re + +from wlauto import Workload, Parameter +from wlauto.exceptions import WorkloadError +from wlauto.utils.misc import which, check_output +from wlauto.utils.types import arguments, numeric + + +# Location of the power_LoadTest under the chroot +#POWER_LOADTEST_DIR = '/mnt/host/source/src/third_party/autotest/files/client/site_tests/power_LoadTest' +MARKER = '---------------------------' +STATUS_REGEX = re.compile(r'^\S+\s+\[\s*(\S+)\s*\]') +METRIC_REGEX = re.compile(r'^\S+\s+(\S+)\s*(\S+)') + + +class ChromeAutotest(Workload): + + name = 'autotest' + description = ''' + Executes tests from ChromeOS autotest suite + + .. note:: This workload *must* be run inside a CromeOS SDK chroot. + + See: https://www.chromium.org/chromium-os/testing/power-testing + + ''' + supported_platforms = ['chromeos'] + + parameters = [ + Parameter('test', mandatory=True, + description=''' + The test to be run + '''), + Parameter('test_that_args', kind=arguments, default='', + description=''' + Extra arguments to be passed to test_that_invocation. + '''), + Parameter('run_timeout', kind=int, default=30 * 60, + description=''' + Timeout, in seconds, for the test execution. + '''), + ] + + def setup(self, context): + if self.device.platform != 'chromeos': + raise WorkloadError('{} only supports ChromeOS devices'.format(self.name)) + self.test_that = which('test_that') + if not self.test_that: + message = ('Could not find "test_that"; {} must be running in a ChromeOS SDK chroot ' + '(did you execute "cros_sdk"?)') + raise WorkloadError(message.format(self.name)) + self.command = self._build_command() + self.raw_output = None + # make sure no other test is running + self.device.execute('killall -9 autotest', check_exit_code=False) + + def run(self, context): + self.logger.debug(self.command) + self.raw_output, _ = check_output(self.command, timeout=self.run_timeout, shell=True) + + def update_result(self, context): + if not self.raw_output: + self.logger.warning('No power_LoadTest output detected; run failed?') + return + raw_outfile = os.path.join(context.output_directory, 'autotest-output.raw') + with open(raw_outfile, 'w') as wfh: + wfh.write(self.raw_output) + context.add_artifact('autotest_raw', raw_outfile, kind='raw') + lines = iter(self.raw_output.split('\n')) + # Results are delimitted from the rest of the output by MARKER + for line in lines: + if MARKER in line: + break + for line in lines: + match = STATUS_REGEX.search(line) + if match: + status = match.group(1) + if status != 'PASSED': + self.logger.warning(line) + match = METRIC_REGEX.search(line) + if match: + try: + context.result.add_metric(match.group(1), numeric(match.group(2)), lower_is_better=True) + except ValueError: + pass # non-numeric metrics aren't supported + + def _build_command(self): + parts = [self.test_that, self.device.host, self.test] + parts.append(str(self.test_that_args)) + return ' '.join(parts) +