1
0
mirror of https://github.com/ARM-software/workload-automation.git synced 2024-10-06 19:01:15 +01:00
workload-automation/wlauto/workloads/autotest/__init__.py
Sebastian Goscik 001239dfe4 Fixed WA extensions for LinuxManager
Changed method calls to devlib naming
2016-02-19 15:27:18 +00:00

109 lines
4.0 KiB
Python

# 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.os != '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)