Skip to content

Commit

Permalink
[workloads] Add JetNews jank tests workload
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
luis-machado-arm committed Jul 16, 2024
1 parent 18d9f94 commit b38e64a
Show file tree
Hide file tree
Showing 13 changed files with 876 additions and 0 deletions.
93 changes: 93 additions & 0 deletions wa/workloads/jetnews/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,93 @@
# 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})
Binary file not shown.
51 changes: 51 additions & 0 deletions wa/workloads/jetnews/uiauto/app/build.gradle
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
plugins {
id 'com.android.application'
id "org.jetbrains.kotlin.android" version "2.0.20-Beta1"
}

kotlin {
// Standardize on the same jvm version for compatibility reasons.
jvmToolchain(17)
}

//apply plugin: 'com.android.application'
def packageName = "com.arm.wa.uiauto.jetnews"

android {
namespace = "com.arm.wa.uiauto.jetnews"

compileSdkVersion 34
defaultConfig {
applicationId "${packageName}"
minSdkVersion 23
targetSdkVersion 28
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
buildTypes {
applicationVariants.all { variant ->
variant.outputs.each { output ->
output.outputFileName = "${packageName}.apk"
}
}
}
useLibrary 'android.test.base'
}

dependencies {
implementation fileTree(include: ['*.jar'], dir: 'libs')
implementation 'androidx.test.uiautomator:uiautomator:2.4.0-alpha01'
implementation 'androidx.test.janktesthelper:janktesthelper:1.0.1'
implementation 'androidx.test.espresso:espresso-core:3.5.1'

implementation(name: 'uiauto', ext: 'aar')
}

repositories {
flatDir {
dirs 'libs'
}
}

tasks.withType(JavaCompile) {
options.compilerArgs += ['-Xlint:deprecation']
}
11 changes: 11 additions & 0 deletions wa/workloads/jetnews/uiauto/app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
android:versionCode="1"
android:versionName="1.0">


<instrumentation
android:name="androidx.test.runner.AndroidJUnitRunner"
android:targetPackage="${applicationId}"/>

</manifest>
Original file line number Diff line number Diff line change
@@ -0,0 +1,81 @@
/* Copyright 2014-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.
*/

package com.arm.wa.uiauto.jetnews;

import androidx.test.uiautomator.UiObject;
import androidx.test.uiautomator.UiSelector;

import android.os.Bundle;

import com.arm.wa.uiauto.ApplaunchInterface;
import com.arm.wa.uiauto.BaseUiAutomation;
import com.arm.wa.uiauto.UiAutoUtils;

import org.junit.Test;

// Dummy workload for jetnews. We need to use JankTestBasem but we
// can't inherit from that class as we already inherit BaseUiAutomation.
// Therefore we have another class (UiAutomationJankTests) that uses
// this class instead.

public class UiAutomation extends BaseUiAutomation implements ApplaunchInterface {

protected Bundle parameters;
protected String packageID;

public void initialize() {
parameters = getParams();
packageID = getPackageID(parameters);
}

@Test
public void setup() throws Exception {
setScreenOrientation(ScreenOrientation.NATURAL);
}

@Test
public void runWorkload() {
// Intentionally empty, not used.
}

@Test
public void teardown() throws Exception {
unsetScreenOrientation();
}

public void runApplicationSetup() throws Exception {
// Intentionally empty, not used.
}

// Sets the UiObject that marks the end of the application launch.
public UiObject getLaunchEndObject() {
// Intentionally empty, not used.
return null;
}

// Returns the launch command for the application.
public String getLaunchCommand() {
// Intentionally empty, not used.
return "";
}

// Pass the workload parameters, used for applaunch
public void setWorkloadParameters(Bundle workload_parameters) {
// Intentionally empty, not used.
}
}


Loading

0 comments on commit b38e64a

Please sign in to comment.