From e5f13076ac917e93f60ae4d712fe4195a9539032 Mon Sep 17 00:00:00 2001 From: Brendan Jackman Date: Mon, 2 Oct 2017 16:12:49 +0100 Subject: [PATCH 1/3] BaseUiAutomation: Port uiDeviceSwipe methods from WA2 --- .../com/arm/wa/uiauto/BaseUiAutomation.java | 75 ++++++++++++++++++ wa/framework/uiauto/uiauto.aar | Bin 9427 -> 9674 bytes 2 files changed, 75 insertions(+) diff --git a/wa/framework/uiauto/app/src/main/java/com/arm/wa/uiauto/BaseUiAutomation.java b/wa/framework/uiauto/app/src/main/java/com/arm/wa/uiauto/BaseUiAutomation.java index ed8138d4..8024f309 100644 --- a/wa/framework/uiauto/app/src/main/java/com/arm/wa/uiauto/BaseUiAutomation.java +++ b/wa/framework/uiauto/app/src/main/java/com/arm/wa/uiauto/BaseUiAutomation.java @@ -43,6 +43,8 @@ public class BaseUiAutomation { // Time in milliseconds public long uiAutoTimeout = 4 * 1000; + public enum Direction { UP, DOWN, LEFT, RIGHT, NULL }; + public static final int CLICK_REPEAT_INTERVAL_MINIMUM = 5; public static final int CLICK_REPEAT_INTERVAL_DEFAULT = 50; @@ -149,6 +151,79 @@ public class BaseUiAutomation { } } + public int getDisplayHeight() { + return mDevice.getDisplayHeight(); + } + + public int getDisplayWidth() { + return mDevice.getDisplayWidth(); + } + + public int getDisplayCentreWidth() { + return getDisplayWidth() / 2; + } + + public int getDisplayCentreHeight() { + return getDisplayHeight() / 2; + } + + public void uiDeviceSwipeUp(int steps) { + mDevice.swipe( + getDisplayCentreWidth(), + (getDisplayCentreHeight() + (getDisplayCentreHeight() / 2)), + getDisplayCentreWidth(), + (getDisplayCentreHeight() / 2), + steps); + } + + public void uiDeviceSwipeDown(int steps) { + mDevice.swipe( + getDisplayCentreWidth(), + (getDisplayCentreHeight() / 2), + getDisplayCentreWidth(), + (getDisplayCentreHeight() + (getDisplayCentreHeight() / 2)), + steps); + } + + public void uiDeviceSwipeLeft(int steps) { + mDevice.swipe( + (getDisplayCentreWidth() + (getDisplayCentreWidth() / 2)), + getDisplayCentreHeight(), + (getDisplayCentreWidth() / 2), + getDisplayCentreHeight(), + steps); + } + + public void uiDeviceSwipeRight(int steps) { + mDevice.swipe( + (getDisplayCentreWidth() / 2), + getDisplayCentreHeight(), + (getDisplayCentreWidth() + (getDisplayCentreWidth() / 2)), + getDisplayCentreHeight(), + steps); + } + + public void uiDeviceSwipe(Direction direction, int steps) throws Exception { + switch (direction) { + case UP: + uiDeviceSwipeUp(steps); + break; + case DOWN: + uiDeviceSwipeDown(steps); + break; + case LEFT: + uiDeviceSwipeLeft(steps); + break; + case RIGHT: + uiDeviceSwipeRight(steps); + break; + case NULL: + throw new Exception("No direction specified"); + default: + break; + } + } + public void repeatClickUiObject(UiObject view, int repeatCount, int intervalInMillis) throws Exception { int repeatInterval = intervalInMillis > CLICK_REPEAT_INTERVAL_MINIMUM ? intervalInMillis : CLICK_REPEAT_INTERVAL_DEFAULT; diff --git a/wa/framework/uiauto/uiauto.aar b/wa/framework/uiauto/uiauto.aar index d3719af1b421757c6a544d430b1e81d926b252df..7a1a125b40022cb59938986ba0bba063e270aa40 100644 GIT binary patch delta 9151 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 delta 8876 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 Date: Thu, 28 Sep 2017 16:03:35 +0100 Subject: [PATCH 2/3] geekbench: Port Geekbench workload from WA2 Differences from original: - Standard renaming and rearrangement of imports - UiAutomation.java now uses the setup() and runWorkload() phases which weren't present before. --- wa/workloads/geekbench/__init__.py | 412 ++++++++++++++++++ .../geekbench/com.arm.wa.uiauto.geekbench.apk | Bin 0 -> 261114 bytes .../geekbench/uiauto/app/build.gradle | 35 ++ .../uiauto/app/src/main/AndroidManifest.xml | 13 + .../arm/wa/uiauto/geekbench/UiAutomation.java | 187 ++++++++ wa/workloads/geekbench/uiauto/build.gradle | 23 + wa/workloads/geekbench/uiauto/build.sh | 43 ++ .../uiauto/gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 53636 bytes .../gradle/wrapper/gradle-wrapper.properties | 6 + wa/workloads/geekbench/uiauto/gradlew | 160 +++++++ wa/workloads/geekbench/uiauto/gradlew.bat | 90 ++++ wa/workloads/geekbench/uiauto/settings.gradle | 1 + 12 files changed, 970 insertions(+) create mode 100644 wa/workloads/geekbench/__init__.py create mode 100644 wa/workloads/geekbench/com.arm.wa.uiauto.geekbench.apk create mode 100644 wa/workloads/geekbench/uiauto/app/build.gradle create mode 100644 wa/workloads/geekbench/uiauto/app/src/main/AndroidManifest.xml create mode 100644 wa/workloads/geekbench/uiauto/app/src/main/java/com/arm/wa/uiauto/geekbench/UiAutomation.java create mode 100644 wa/workloads/geekbench/uiauto/build.gradle create mode 100755 wa/workloads/geekbench/uiauto/build.sh create mode 100644 wa/workloads/geekbench/uiauto/gradle/wrapper/gradle-wrapper.jar create mode 100644 wa/workloads/geekbench/uiauto/gradle/wrapper/gradle-wrapper.properties create mode 100755 wa/workloads/geekbench/uiauto/gradlew create mode 100644 wa/workloads/geekbench/uiauto/gradlew.bat create mode 100644 wa/workloads/geekbench/uiauto/settings.gradle diff --git a/wa/workloads/geekbench/__init__.py b/wa/workloads/geekbench/__init__.py new file mode 100644 index 00000000..a412d60e --- /dev/null +++ b/wa/workloads/geekbench/__init__.py @@ -0,0 +1,412 @@ +# Copyright 2013-2017 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=E1101 +import os +import re +import tempfile +import json + +from wa import ApkUiautoWorkload, Parameter +from wa.framework.exception import ConfigError, WorkloadError +from wa.framework.plugin import Artifact +from wa.utils.misc import capitalize + +class Geekbench(ApkUiautoWorkload): + + name = 'geekbench' + description = """ + Geekbench provides a comprehensive set of benchmarks engineered to quickly + and accurately measure processor and memory performance. + + http://www.primatelabs.com/geekbench/ + + From the website: + + Designed to make benchmarks easy to run and easy to understand, Geekbench + takes the guesswork out of producing robust and reliable benchmark results. + + Geekbench scores are calibrated against a baseline score of 1,000 (which is + the score of a single-processor Power Mac G5 @ 1.6GHz). Higher scores are + better, with double the score indicating double the performance. + + The benchmarks fall into one of four categories: + + - integer performance. + - floating point performance. + - memory performance. + - stream performance. + + Geekbench benchmarks: http://www.primatelabs.com/geekbench/doc/benchmarks.html + + Geekbench scoring methedology: + http://support.primatelabs.com/kb/geekbench/interpreting-geekbench-scores + + """ + summary_metrics = ['score', 'multicore_score'] + versions = { + '4.0.1': { + 'package': 'com.primatelabs.geekbench', + 'activity': '.HomeActivity', + }, + # Version 3.4.1 was the final version 3 variant + '3.4.1': { + 'package': 'com.primatelabs.geekbench', + 'activity': '.HomeActivity', + }, + '3.0.0': { + 'package': 'com.primatelabs.geekbench3', + 'activity': '.HomeActivity', + }, + '2': { + 'package': 'ca.primatelabs.geekbench2', + 'activity': '.HomeActivity', + }, + } + begin_regex = re.compile(r'^\s*D/WebViewClassic.loadDataWithBaseURL\(\s*\d+\s*\)' + r'\s*:\s*(?P\<.*)\s*$') + replace_regex = re.compile(r'<[^>]*>') + + parameters = [ + Parameter('version', default=sorted(versions.keys())[-1], allowed_values=sorted(versions.keys()), + description='Specifies which version of the workload should be run.', + override=True), + Parameter('times', kind=int, default=1, + description=('Specfies the number of times the benchmark will be run in a "tight ' + 'loop", i.e. without performaing setup/teardown inbetween.')), + Parameter('timeout', kind=int, default=900, + description=('Timeout for a single iteration of the benchmark. This value is ' + 'multiplied by ``times`` to calculate the overall run timeout. ')), + Parameter('disable_update_result', kind=bool, default=False, + description=('If ``True`` the results file will not be pulled from the targets ' + '/data/data/com.primatelabs.geekbench folder. This allows the ' + 'workload to be run on unrooted targets and the results extracted ' + 'manually later.')), + ] + + is_corporate = False + + @property + def activity(self): + return self.versions[self.version]['activity'] + + @property + def package(self): + return self.versions[self.version]['package'] + + def __init__(self, *args, **kwargs): + super(Geekbench, self).__init__(*args, **kwargs) + self.gui.uiauto_params['version'] = self.version + self.gui.uiauto_params['times'] = self.times + self.gui.uiauto_params['is_corporate'] = self.is_corporate + + def setup(self, context): + super(Geekbench, self).setup(context) + self.run_timeout = self.timeout * self.times + self.exact_apk_version = self.version + + def update_output(self, context): + super(Geekbench, self).update_output(context) + if not self.disable_update_result: + major_version = versiontuple(self.version)[0] + update_method = getattr(self, 'update_result_{}'.format(major_version)) + update_method(context) + + def validate(self): + if (self.times > 1) and (self.version == '2'): + raise ConfigError('times parameter is not supported for version 2 of Geekbench.') + + def update_result_2(self, context): + score_calculator = GBScoreCalculator() + score_calculator.parse(self.logcat_log) + score_calculator.update_results(context) + + def update_result_3(self, context): + outfile_glob = self.target.path.join(self.target.package_data_directory, self.package, 'files', '*gb3') + on_target_output_files = [f.strip() for f in self.target.execute('ls {}'.format(outfile_glob), + as_root=True).split('\n') if f] + for i, on_target_output_file in enumerate(on_target_output_files): + host_temp_file = tempfile.mktemp() + self.target.pull(on_target_output_file, host_temp_file) + host_output_file = os.path.join(context.output_directory, os.path.basename(on_target_output_file)) + with open(host_temp_file) as fh: + data = json.load(fh) + os.remove(host_temp_file) + with open(host_output_file, 'w') as wfh: + json.dump(data, wfh, indent=4) + context.iteration_artifacts.append(Artifact('geekout', path=os.path.basename(on_target_output_file), + kind='data', + description='Geekbench 3 output from target.')) + context.result.add_metric(namemify('score', i), data['score']) + context.result.add_metric(namemify('multicore_score', i), data['multicore_score']) + for section in data['sections']: + context.result.add_metric(namemify(section['name'] + '_score', i), section['score']) + context.result.add_metric(namemify(section['name'] + '_multicore_score', i), + section['multicore_score']) + + def update_result_4(self, context): + outfile_glob = self.target.path.join(self.target.package_data_directory, self.package, 'files', '*gb4') + on_target_output_files = [f.strip() for f in self.target.execute('ls {}'.format(outfile_glob), + as_root=True).split('\n') if f] + for i, on_target_output_file in enumerate(on_target_output_files): + host_temp_file = tempfile.mktemp() + self.target.pull(on_target_output_file, host_temp_file) + host_output_file = os.path.join(context.output_directory, os.path.basename(on_target_output_file)) + with open(host_temp_file) as fh: + data = json.load(fh) + os.remove(host_temp_file) + with open(host_output_file, 'w') as wfh: + json.dump(data, wfh, indent=4) + context.add_artifact('geekout', host_output_file, kind='data', + description='Geekbench 4 output from target.') + context.add_metric(namemify('score', i), data['score']) + context.add_metric(namemify('multicore_score', i), data['multicore_score']) + for section in data['sections']: + context.add_metric(namemify(section['name'] + '_score', i), section['score']) + for workloads in section['workloads']: + workload_name = workloads['name'].replace(" ", "-") + context.add_metric(namemify(section['name'] + '_' + workload_name + '_score', i), + workloads['score']) + + +class GBWorkload(object): + """ + Geekbench workload (not to be confused with WA's workloads). This is a single test run by + geek bench, such as preforming compression or generating Madelbrot. + + """ + + # Index maps onto the hundreds digit of the ID. + categories = [None, 'integer', 'float', 'memory', 'stream'] + + # 2003 entry-level Power Mac G5 is considered to have a baseline score of + # 1000 for every category. + pmac_g5_base_score = 1000 + + units_conversion_map = { + 'K': 1, + 'M': 1000, + 'G': 1000000, + } + + def __init__(self, wlid, name, pmac_g5_st_score, pmac_g5_mt_score): + """ + :param wlid: A three-digit workload ID. Uniquely identifies a workload and also + determines the category a workload belongs to. + :param name: The name of the workload. + :param pmac_g5_st_score: Score achieved for this workload on 2003 entry-level + Power Mac G5 running in a single thread. + :param pmac_g5_mt_score: Score achieved for this workload on 2003 entry-level + Power Mac G5 running in multiple threads. + + """ + self.wlid = wlid + self.name = name + self.pmac_g5_st_score = pmac_g5_st_score + self.pmac_g5_mt_score = pmac_g5_mt_score + self.category = self.categories[int(wlid) // 100] + self.collected_results = [] + + def add_result(self, value, units): + self.collected_results.append(self.convert_to_kilo(value, units)) + + def convert_to_kilo(self, value, units): + return value * self.units_conversion_map[units[0]] + + def clear(self): + self.collected_results = [] + + def get_scores(self): + """ + Returns a tuple (single-thraded score, multi-threaded score) for this workload. + Some workloads only have a single-threaded score, in which case multi-threaded + score will be ``None``. + + Geekbench will perform four iterations of each workload in single-threaded and, + for some workloads, multi-threaded configurations. Thus there should always be + either four or eight scores collected for each workload. Single-threaded iterations + are always done before multi-threaded, so the ordering of the scores can be used + to determine which configuration they belong to. + + This method should not be called before score collection has finished. + + """ + no_of_results = len(self.collected_results) + if no_of_results == 4: + return (self._calculate(self.collected_results[:4], self.pmac_g5_st_score), None) + if no_of_results == 8: + return (self._calculate(self.collected_results[:4], self.pmac_g5_st_score), + self._calculate(self.collected_results[4:], self.pmac_g5_mt_score)) + else: + msg = 'Collected {} results for Geekbench {} workload;'.format(no_of_results, self.name) + msg += ' expecting either 4 or 8.' + raise WorkloadError(msg) + + def _calculate(self, values, scale_factor): + return max(values) * self.pmac_g5_base_score / scale_factor + + def __str__(self): + return self.name + + __repr__ = __str__ + + +class GBScoreCalculator(object): + """ + Parses logcat output to extract raw Geekbench workload values and converts them into + category and overall scores. + + """ + + result_regex = re.compile(r'workload (?P\d+) (?P[0-9.]+) ' + r'(?P[a-zA-Z/]+) (?P#=D!8wV>%Q;iCt+x;*#zp!hs> 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 + variant.outputs.each { output -> + output.outputFile = file("$project.buildDir/apk/${packageName}.apk") + } + } + } +} + +dependencies { + compile fileTree(dir: 'libs', include: ['*.jar']) + compile 'com.android.support.test:runner:0.5' + compile 'com.android.support.test:rules:0.5' + compile 'com.android.support.test.uiautomator:uiautomator-v18:2.1.2' + compile(name: 'uiauto', ext:'aar') +} + +repositories { + flatDir { + dirs 'libs' + } +} diff --git a/wa/workloads/geekbench/uiauto/app/src/main/AndroidManifest.xml b/wa/workloads/geekbench/uiauto/app/src/main/AndroidManifest.xml new file mode 100644 index 00000000..561d3644 --- /dev/null +++ b/wa/workloads/geekbench/uiauto/app/src/main/AndroidManifest.xml @@ -0,0 +1,13 @@ + + + + + + + + diff --git a/wa/workloads/geekbench/uiauto/app/src/main/java/com/arm/wa/uiauto/geekbench/UiAutomation.java b/wa/workloads/geekbench/uiauto/app/src/main/java/com/arm/wa/uiauto/geekbench/UiAutomation.java new file mode 100644 index 00000000..604a8bb0 --- /dev/null +++ b/wa/workloads/geekbench/uiauto/app/src/main/java/com/arm/wa/uiauto/geekbench/UiAutomation.java @@ -0,0 +1,187 @@ +/* Copyright 2013-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. +*/ + + +package com.arm.wa.uiauto.geekbench; + +import android.app.Activity; +import android.os.Bundle; +import android.support.test.runner.AndroidJUnit4; +import android.support.test.uiautomator.UiObject; +import android.support.test.uiautomator.UiObjectNotFoundException; +import android.support.test.uiautomator.UiSelector; +import android.view.KeyEvent; + +import com.arm.wa.uiauto.BaseUiAutomation; +// import com.arm.wa.uiauto.UxPerfUiAutomation; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; + +import java.util.concurrent.TimeUnit; + +@RunWith(AndroidJUnit4.class) +public class UiAutomation extends BaseUiAutomation { + + public static String TAG = "geekbench"; + public static final long WAIT_TIMEOUT_5SEC = TimeUnit.SECONDS.toMillis(5); + public static final long WAIT_TIMEOUT_20MIN = TimeUnit.SECONDS.toMillis(20 * 60); + + Bundle params; + String[] version; + Integer majorVersion; + Integer minorVersion; + Boolean isCorporate; + Integer times; + + @Before + public void initialize() { + params = getParams(); + version = params.getString("version").split("\\."); + majorVersion = Integer.parseInt(version[0]); + minorVersion = Integer.parseInt(version[1]); + isCorporate = params.getBoolean("is_corporate"); + times = params.getInt("times"); + } + + @Test + @Override + public void setup() throws Exception { + initialize_instrumentation(); + + if (!isCorporate) + dismissEula(); + } + + @Test + @Override + public void runWorkload() throws Exception { + for (int i = 0; i < times; i++) { + switch (majorVersion) { + case 2: + // In version 2, we scroll through the results WebView to make sure + // all results appear on the screen, which causes them to be dumped into + // logcat by the Linaro hacks. + runBenchmarks(); + waitForResultsv2(); + scrollThroughResults(); + break; + case 3: + runBenchmarks(); + waitForResultsv3onwards(); + if (minorVersion < 4) { + // Attempting to share the results will generate the .gb3 file with + // results that can then be pulled from the device. This is not possible + // in verison 2 of Geekbench (Share option was added later). + // Sharing is not necessary from 3.4.1 onwards as the .gb3 files are always + // created. + shareResults(); + } + break; + case 4: + runCpuBenchmarks(isCorporate); + waitForResultsv3onwards(); + break; + default : + throw new RuntimeException("Invalid version of Geekbench requested"); + } + + if (i < (times - 1)) { + mDevice.pressBack(); + if (majorVersion < 4) + mDevice.pressBack(); // twice + } + } + + Bundle status = new Bundle(); + mInstrumentation.sendStatus(Activity.RESULT_OK, status); + } + + public void dismissEula() throws Exception { + UiObject acceptButton = + //mDevice.findObject(new UiSelector().textContains("Accept") + mDevice.findObject(new UiSelector().resourceId("android:id/button1") + .className("android.widget.Button")); + if (!acceptButton.waitForExists(WAIT_TIMEOUT_5SEC)) { + throw new UiObjectNotFoundException("Could not find Accept button"); + } + acceptButton.click(); + } + + public void runBenchmarks() throws Exception { + UiObject runButton = + mDevice.findObject(new UiSelector().textContains("Run Benchmarks") + .className("android.widget.Button")); + if (!runButton.waitForExists(WAIT_TIMEOUT_5SEC)) { + throw new UiObjectNotFoundException("Could not find Run button"); + } + runButton.click(); + } + + public void runCpuBenchmarks(boolean isCorporate) throws Exception { + // The run button is at the bottom of the view and may be off the screen so swipe to be sure + uiDeviceSwipe(Direction.DOWN, 50); + + String packageName = isCorporate ? "com.primatelabs.geekbench4.corporate" + : "com.primatelabs.geekbench"; + UiObject runButton = + mDevice.findObject(new UiSelector().resourceId(packageName + ":id/runCpuBenchmarks") + .className("android.widget.Button")); + if (!runButton.waitForExists(WAIT_TIMEOUT_5SEC)) { + throw new UiObjectNotFoundException("Could not find Run button"); + } + runButton.click(); + } + + public void waitForResultsv2() throws Exception { + UiSelector selector = new UiSelector(); + UiObject resultsWebview = mDevice.findObject(selector.className("android.webkit.WebView")); + if (!resultsWebview.waitForExists(WAIT_TIMEOUT_20MIN)) { + throw new UiObjectNotFoundException("Did not see Geekbench results screen."); + } + } + + public void waitForResultsv3onwards() throws Exception { + UiSelector selector = new UiSelector(); + UiObject runningTextView = mDevice.findObject(selector.textContains("Running") + .className("android.widget.TextView")); + + if (!runningTextView.waitUntilGone(WAIT_TIMEOUT_20MIN)) { + throw new UiObjectNotFoundException("Did not get to Geekbench results screen."); + } + } + + public void scrollThroughResults() throws Exception { + UiSelector selector = new UiSelector(); + mDevice.pressKeyCode(KeyEvent.KEYCODE_PAGE_DOWN); + sleep(1); + mDevice.pressKeyCode(KeyEvent.KEYCODE_PAGE_DOWN); + sleep(1); + mDevice.pressKeyCode(KeyEvent.KEYCODE_PAGE_DOWN); + sleep(1); + mDevice.pressKeyCode(KeyEvent.KEYCODE_PAGE_DOWN); + } + + public void shareResults() throws Exception { + sleep(2); // transition + UiSelector selector = new UiSelector(); + mDevice.pressMenu(); + UiObject shareButton = mDevice.findObject(selector.text("Share") + .className("android.widget.TextView")); + shareButton.waitForExists(WAIT_TIMEOUT_5SEC); + shareButton.click(); + } +} diff --git a/wa/workloads/geekbench/uiauto/build.gradle b/wa/workloads/geekbench/uiauto/build.gradle new file mode 100644 index 00000000..d0aa7043 --- /dev/null +++ b/wa/workloads/geekbench/uiauto/build.gradle @@ -0,0 +1,23 @@ +// Top-level build file where you can add configuration options common to all sub-projects/modules. + +buildscript { + repositories { + jcenter() + } + dependencies { + classpath 'com.android.tools.build:gradle:2.3.2' + + // NOTE: Do not place your application dependencies here; they belong + // in the individual module build.gradle files + } +} + +allprojects { + repositories { + jcenter() + } +} + +task clean(type: Delete) { + delete rootProject.buildDir +} diff --git a/wa/workloads/geekbench/uiauto/build.sh b/wa/workloads/geekbench/uiauto/build.sh new file mode 100755 index 00000000..4a7ce38b --- /dev/null +++ b/wa/workloads/geekbench/uiauto/build.sh @@ -0,0 +1,43 @@ +#!/bin/bash + + +set -eux + +# CD into build dir if possible - allows building from any directory +script_path='.' +if `readlink -f $0 &>/dev/null`; then + script_path=`readlink -f $0 2>/dev/null` +fi +script_dir=`dirname $script_path` +cd $script_dir + +# Ensure gradelw exists before starting +if [[ ! -f gradlew ]]; then + echo 'gradlew file not found! Check that you are in the right directory.' + exit 9 +fi + +# Copy base class library from wa dist +libs_dir=app/libs +base_class=`python -c "import os, wa; print os.path.join(os.path.dirname(wa.__file__), 'framework', 'uiauto', 'uiauto.aar')"` +mkdir -p $libs_dir +cp $base_class $libs_dir + +# Build and return appropriate exit code if failed +# gradle build +./gradlew clean :app:assembleDebug +exit_code=$? +if [[ $exit_code -ne 0 ]]; then + echo "ERROR: 'gradle build' exited with code $exit_code" + exit $exit_code +fi + +# If successful move APK file to workload folder (overwrite previous) +package=com.arm.wa.uiauto.geekbench +rm -f ../$package +if [[ -f app/build/apk/$package.apk ]]; then + cp app/build/apk/$package.apk ../$package.apk +else + echo 'ERROR: UiAutomator apk could not be found!' + exit 9 +fi diff --git a/wa/workloads/geekbench/uiauto/gradle/wrapper/gradle-wrapper.jar b/wa/workloads/geekbench/uiauto/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..13372aef5e24af05341d49695ee84e5f9b594659 GIT binary patch literal 53636 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ⅅ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 H-+%o-(+5aQ literal 0 HcmV?d00001 diff --git a/wa/workloads/geekbench/uiauto/gradle/wrapper/gradle-wrapper.properties b/wa/workloads/geekbench/uiauto/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 00000000..760fcce7 --- /dev/null +++ b/wa/workloads/geekbench/uiauto/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,6 @@ +#Wed May 03 15:42:44 BST 2017 +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-3.3-all.zip diff --git a/wa/workloads/geekbench/uiauto/gradlew b/wa/workloads/geekbench/uiauto/gradlew new file mode 100755 index 00000000..9d82f789 --- /dev/null +++ b/wa/workloads/geekbench/uiauto/gradlew @@ -0,0 +1,160 @@ +#!/usr/bin/env bash + +############################################################################## +## +## Gradle start up script for UN*X +## +############################################################################## + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS="" + +APP_NAME="Gradle" +APP_BASE_NAME=`basename "$0"` + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD="maximum" + +warn ( ) { + echo "$*" +} + +die ( ) { + echo + echo "$*" + echo + exit 1 +} + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +case "`uname`" in + CYGWIN* ) + cygwin=true + ;; + Darwin* ) + darwin=true + ;; + MINGW* ) + msys=true + ;; +esac + +# Attempt to set APP_HOME +# Resolve links: $0 may be a link +PRG="$0" +# Need this for relative symlinks. +while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi +done +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >/dev/null +APP_HOME="`pwd -P`" +cd "$SAVED" >/dev/null + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD="java" + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then + MAX_FD_LIMIT=`ulimit -H -n` + if [ $? -eq 0 ] ; then + if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then + MAX_FD="$MAX_FD_LIMIT" + fi + ulimit -n $MAX_FD + if [ $? -ne 0 ] ; then + warn "Could not set maximum file descriptor limit: $MAX_FD" + fi + else + warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" + fi +fi + +# For Darwin, add options to specify how the application appears in the dock +if $darwin; then + GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" +fi + +# For Cygwin, switch paths to Windows format before running java +if $cygwin ; then + APP_HOME=`cygpath --path --mixed "$APP_HOME"` + CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + JAVACMD=`cygpath --unix "$JAVACMD"` + + # We build the pattern for arguments to be converted via cygpath + ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` + SEP="" + for dir in $ROOTDIRSRAW ; do + ROOTDIRS="$ROOTDIRS$SEP$dir" + SEP="|" + done + OURCYGPATTERN="(^($ROOTDIRS))" + # Add a user-defined pattern to the cygpath arguments + if [ "$GRADLE_CYGPATTERN" != "" ] ; then + OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" + fi + # Now convert the arguments - kludge to limit ourselves to /bin/sh + i=0 + for arg in "$@" ; do + CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` + CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option + + if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition + eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` + else + eval `echo args$i`="\"$arg\"" + fi + i=$((i+1)) + done + case $i in + (0) set -- ;; + (1) set -- "$args0" ;; + (2) set -- "$args0" "$args1" ;; + (3) set -- "$args0" "$args1" "$args2" ;; + (4) set -- "$args0" "$args1" "$args2" "$args3" ;; + (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + esac +fi + +# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules +function splitJvmOpts() { + JVM_OPTS=("$@") +} +eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS +JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME" + +exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@" diff --git a/wa/workloads/geekbench/uiauto/gradlew.bat b/wa/workloads/geekbench/uiauto/gradlew.bat new file mode 100644 index 00000000..aec99730 --- /dev/null +++ b/wa/workloads/geekbench/uiauto/gradlew.bat @@ -0,0 +1,90 @@ +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS= + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto init + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto init + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:init +@rem Get command-line arguments, handling Windowz variants + +if not "%OS%" == "Windows_NT" goto win9xME_args +if "%@eval[2+2]" == "4" goto 4NT_args + +:win9xME_args +@rem Slurp the command line arguments. +set CMD_LINE_ARGS= +set _SKIP=2 + +:win9xME_args_slurp +if "x%~1" == "x" goto execute + +set CMD_LINE_ARGS=%* +goto execute + +:4NT_args +@rem Get arguments from the 4NT Shell from JP Software +set CMD_LINE_ARGS=%$ + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/wa/workloads/geekbench/uiauto/settings.gradle b/wa/workloads/geekbench/uiauto/settings.gradle new file mode 100644 index 00000000..e7b4def4 --- /dev/null +++ b/wa/workloads/geekbench/uiauto/settings.gradle @@ -0,0 +1 @@ +include ':app' From e4965096e6075cc4d6c28335d362849da28f5bb1 Mon Sep 17 00:00:00 2001 From: Brendan Jackman Date: Mon, 2 Oct 2017 16:22:42 +0100 Subject: [PATCH 3/3] geekbench: Error early if target isn't rooted --- wa/workloads/geekbench/__init__.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/wa/workloads/geekbench/__init__.py b/wa/workloads/geekbench/__init__.py index a412d60e..ddddcec7 100644 --- a/wa/workloads/geekbench/__init__.py +++ b/wa/workloads/geekbench/__init__.py @@ -112,6 +112,12 @@ class Geekbench(ApkUiautoWorkload): self.gui.uiauto_params['times'] = self.times self.gui.uiauto_params['is_corporate'] = self.is_corporate + def initialize(self, context): + super(Geekbench, self).initialize(context) + if not self.target.is_rooted: + raise WorkloadError( + 'Geekbench workload requires root to collect results') + def setup(self, context): super(Geekbench, self).setup(context) self.run_timeout = self.timeout * self.times