mirror of
https://github.com/ARM-software/workload-automation.git
synced 2025-01-31 10:11:17 +00:00
Adding ChromeOS power_LoadTest
This commit is contained in:
parent
5daa9014a8
commit
cbd2c6727f
119
wlauto/workloads/power_loadtest/__init__.py
Normal file
119
wlauto/workloads/power_loadtest/__init__.py
Normal file
@ -0,0 +1,119 @@
|
||||
# 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 PowerLoadtest(Workload):
|
||||
|
||||
name = 'power_loadtest'
|
||||
description = '''
|
||||
power_LoadTest (part of ChromeOS autotest suite) continuously cycles through a set of
|
||||
browser-based activities and monitors battery drain on a device.
|
||||
|
||||
.. note:: This workload *must* be run inside a CromeOS SDK chroot.
|
||||
|
||||
See: https://www.chromium.org/chromium-os/testing/power-testing
|
||||
|
||||
'''
|
||||
|
||||
parameters = [
|
||||
Parameter('board', default=os.getenv('BOARD'),
|
||||
description='''
|
||||
The name of the board to be used for the test. If this is not specified,
|
||||
BOARD environment variable will be used.
|
||||
'''),
|
||||
Parameter('variant',
|
||||
description='''
|
||||
The variant of the test to run; If not specified, the full power_LoadTest will
|
||||
run (until the device battery is drained). The only other variant available in the
|
||||
vanilla test is "1hour", but further variants may be added by providing custom
|
||||
control files.
|
||||
'''),
|
||||
Parameter('test_that_args', kind=arguments, default='',
|
||||
description='''
|
||||
Extra arguments to be passed to test_that_invocation.
|
||||
'''),
|
||||
Parameter('run_timeout', kind=int, default=24 * 60 * 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
|
||||
|
||||
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, 'power_loadtest.raw')
|
||||
with open(raw_outfile, 'w') as wfh:
|
||||
wfh.write(self.raw_output)
|
||||
context.add_artifact('power_LoadTest_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):
|
||||
test_name = 'power_LoadTest'
|
||||
if self.variant:
|
||||
test_name += '.' + self.variant
|
||||
parts = [self.test_that, self.device.host, test_name]
|
||||
if self.board:
|
||||
parts.append('-b {}'.format(self.board))
|
||||
parts.append(str(self.test_that_args))
|
||||
return ' '.join(parts)
|
||||
|
Loading…
x
Reference in New Issue
Block a user