mirror of
https://github.com/ARM-software/workload-automation.git
synced 2025-03-28 05:28:42 +00:00
This patch adds the JetNews jank-testing workload. This is accomplished through the uiauto helper library and the jank test classes. This workload requires a JetNews app APK to be available. We plan to make it available through the workload-automation-assets repo. At the end of the run, users should end up with a json file containing all the frame/jank metrics. There are 3 parameters for this workload: - tests: Specifies which of the 3 available tests to run (default is to run all of them) - flingspeed: The speed of the fling interactions. - repeat: How many times each of the selected tests is to be executed in a single measuring session.
94 lines
3.9 KiB
Python
Executable File
94 lines
3.9 KiB
Python
Executable File
# Copyright 2024 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.
|
|
#
|
|
|
|
from wa import ApkUiautoWorkload, Parameter, TestPackageHandler
|
|
from wa.utils.types import list_of_strs
|
|
import re
|
|
|
|
class Jetnews(ApkUiautoWorkload):
|
|
|
|
name = 'jetnews'
|
|
package_names = ['com.example.jetnews']
|
|
description = '''
|
|
JetNews
|
|
'''
|
|
|
|
default_test_strings = [
|
|
'PortraitVerticalTest',
|
|
'PortraitHorizontalTest',
|
|
'LandscapeVerticalTest',
|
|
]
|
|
|
|
parameters = [
|
|
Parameter('tests', kind=list_of_strs,
|
|
description="""
|
|
List of tests to be executed. The available
|
|
tests are PortraitVerticalTest, LandscapeVerticalTest and
|
|
PortraitHorizontalTest. If none are specified, the default
|
|
is to run all of them.
|
|
""", default=default_test_strings),
|
|
Parameter('flingspeed', kind=int,
|
|
description="""
|
|
Default fling speed for the tests. The default is 5000 and
|
|
the minimum value is 1000.
|
|
""", default=5000),
|
|
Parameter('repeat', kind=int,
|
|
description="""
|
|
The number of times the tests should be repeated. The default
|
|
is 1.
|
|
""", default=1)
|
|
]
|
|
|
|
_OUTPUT_SECTION_REGEX = re.compile(
|
|
r'(\s*INSTRUMENTATION_STATUS: gfx-[\w-]+=[-+\d.]+\n)+'
|
|
r'\s*INSTRUMENTATION_STATUS_CODE: (?P<code>[-+\d]+)\n?', re.M)
|
|
_OUTPUT_GFXINFO_REGEX = re.compile(
|
|
r'INSTRUMENTATION_STATUS: (?P<name>[\w-]+)=(?P<value>[-+\d.]+)')
|
|
|
|
def __init__(self, target, **kwargs):
|
|
super(Jetnews, self).__init__(target, **kwargs)
|
|
# This test uses the androidx library.
|
|
self.gui.uiauto_runner = 'androidx.test.runner.AndroidJUnitRunner'
|
|
# Class for the regular instrumented tests.
|
|
self.gui.uiauto_class = 'UiAutomation'
|
|
# Class containing the jank tests.
|
|
self.gui.uiauto_jank_class = 'UiAutomationJankTests'
|
|
# A list of all the individual jank tests contained in the jetnews
|
|
# uiauto apk.
|
|
self.gui.jank_stages = ['test1']
|
|
self.gui.uiauto_params['tests'] = self.tests
|
|
self.gui.uiauto_params['flingspeed'] = self.flingspeed
|
|
self.gui.uiauto_params['repeat'] = self.repeat
|
|
# Declared here so we can hold the test output for later processing.
|
|
self.output = {}
|
|
|
|
def run(self, context):
|
|
# Run the jank tests and capture the output so we can parse it
|
|
# into the output result file.
|
|
self.output['test1'] = self.gui._execute('test1', self.gui.timeout)
|
|
|
|
def update_output(self, context):
|
|
super(Jetnews, self).update_output(context)
|
|
# Parse the test result and filter out the results so we can output
|
|
# a meaningful result file.
|
|
for test, test_output in self.output.items():
|
|
for section in self._OUTPUT_SECTION_REGEX.finditer(test_output):
|
|
if int(section.group('code')) != -1:
|
|
msg = 'Run failed (INSTRUMENTATION_STATUS_CODE: {}). See log.'
|
|
raise RuntimeError(msg.format(section.group('code')))
|
|
for metric in self._OUTPUT_GFXINFO_REGEX.finditer(section.group()):
|
|
context.add_metric(metric.group('name'), metric.group('value'),
|
|
classifiers={'test_name': test})
|