diff --git a/wa/workloads/vellamo/__init__.py b/wa/workloads/vellamo/__init__.py new file mode 100644 index 00000000..5e766561 --- /dev/null +++ b/wa/workloads/vellamo/__init__.py @@ -0,0 +1,236 @@ +# Copyright 2014-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. +# + +import os +import logging +import json +import re + +from HTMLParser import HTMLParser +from collections import defaultdict, OrderedDict +from distutils.version import StrictVersion + +from wa import ApkUiautoWorkload, Parameter +from wa.utils.types import list_of_strs, numeric +from wa.framework.exception import WorkloadError + + +class Vellamo(ApkUiautoWorkload): + + name = 'vellamo' + description = """ + Android benchmark designed by Qualcomm. + + Vellamo began as a mobile web benchmarking tool that today has expanded + to include three primary chapters. The Browser Chapter evaluates mobile + web browser performance, the Multicore chapter measures the synergy of + multiple CPU cores, and the Metal Chapter measures the CPU subsystem + performance of mobile processors. Through click-and-go test suites, + organized by chapter, Vellamo is designed to evaluate: UX, 3D graphics, + and memory read/write and peak bandwidth performance, and much more! + + Note: Vellamo v3.0 fails to run on Juno + + """ + package_names = ['com.quicinc.vellamo'] + run_timeout = 15 * 60 + benchmark_types = { + '2.0.3': ['html5', 'metal'], + '3.0': ['Browser', 'Metal', 'Multi'], + '3.2.4': ['Browser', 'Metal', 'Multi'], + } + valid_versions = benchmark_types.keys() + summary_metrics = None + + parameters = [ + Parameter('version', kind=str, allowed_values=valid_versions, default=sorted(benchmark_types, reverse=True)[0], override=True, + description=('Specify the version of Vellamo to be run. ' + 'If not specified, the latest available version will be used.')), + Parameter('benchmarks', kind=list_of_strs, allowed_values=benchmark_types['3.0'], default=benchmark_types['3.0'], + description=('Specify which benchmark sections of Vellamo to be run. Only valid on version 3.0 and newer.' + '\nNOTE: Browser benchmark can be problematic and seem to hang,' + 'just wait and it will progress after ~5 minutes')), + Parameter('browser', kind=int, default=1, + description=('Specify which of the installed browsers will be used for the tests. The number refers to ' + 'the order in which browsers are listed by Vellamo. E.g. ``1`` will select the first browser ' + 'listed, ``2`` -- the second, etc. Only valid for version ``3.0``.')) + ] + + + def setup(self, context): + self.gui.uiauto_params['version'] = self.version + self.gui.uiauto_params['browserToUse'] = self.browser + self.gui.uiauto_params['metal'] = 'Metal' in self.benchmarks + self.gui.uiauto_params['browser'] = 'Browser' in self.benchmarks + self.gui.uiauto_params['multicore'] = 'Multi' in self.benchmarks + super(Vellamo, self).setup(context) + + def validate(self): + super(Vellamo, self).validate() + if self.version == '2.0.3' or not self.benchmarks: # pylint: disable=access-member-before-definition + self.benchmarks = self.benchmark_types[self.version] # pylint: disable=attribute-defined-outside-init + else: + for benchmark in self.benchmarks: + if benchmark not in self.benchmark_types[self.version]: + raise WorkloadError('Version {} does not support {} benchmarks'.format(self.version, benchmark)) + + def update_output(self, context): + super(Vellamo, self).update_output(context) + + # Get total scores from logcat + self.non_root_update_result(context) + + if not self.target.is_rooted: + return + elif self.version == '3.0.0': + self.update_output_v3(context) + elif self.version == '3.2.4': + self.update_output_v3_2(context) + + def update_output_v3(self, context): + for test in self.benchmarks: # Get all scores from HTML files + filename = None + if test == "Browser": + result_folder = self.target.path.join(self.target.package_data_directory, + self.apk.apk_info.package, 'files') + for result_file in self.target.listdir(result_folder, as_root=True): + if result_file.startswith("Browser"): + filename = result_file + else: + filename = '{}_results.html'.format(test) + + device_file = self.target.path.join(self.target.package_data_directory, + self.apk.apk_info.package, 'files', filename) + host_file = os.path.join(context.output_directory, filename) + self.target.pull(device_file, host_file, as_root=True) + with open(host_file) as fh: + parser = VellamoResultParser() + parser.feed(fh.read()) + for benchmark in parser.benchmarks: + benchmark.name = benchmark.name.replace(' ', '_') + context.add_metric('{}_Total'.format(benchmark.name), + benchmark.score) + for name, score in benchmark.metrics.items(): + name = name.replace(' ', '_') + context.add_metric('{}_{}'.format(benchmark.name, + name), score) + context.add_artifact('vellamo_output', kind='raw', + path=filename) + + def update_output_v3_2(self, context): + device_file = self.target.path.join(self.target.package_data_directory, + self.apk.apk_info.package, + 'files', + 'chapterscores.json') + host_file = os.path.join(context.output_directory, 'vellamo.json') + self.target.pull(device_file, host_file, as_root=True) + context.add_artifact('vellamo_output', kind='raw', path=host_file) + # context.add_iteration_artifact('vellamo_output', kind='raw', path=host_file) + with open(host_file) as results_file: + data = json.load(results_file) + for chapter in data: + for result in chapter['benchmark_results']: + name = result['id'] + score = result['score'] + context.add_metric(name, score) + + def non_root_update_result(self, context): + failed = [] + logcat_file = context.get_artifact_path('logcat') + with open(logcat_file) as fh: + iteration_result_regex = re.compile("VELLAMO RESULT: (Browser|Metal|Multicore) (\d+)") + for line in fh: + if 'VELLAMO ERROR:' in line: + msg = "Browser crashed during benchmark, results may not be accurate" + self.logger.warning(msg) + result = iteration_result_regex.findall(line) + if result: + for (metric, score) in result: + if not score: + failed.append(metric) + else: + context.add_metric(metric, score) + if failed: + raise WorkloadError("The following benchmark groups failed: {}".format(", ".join(failed))) + + +class VellamoResult(object): + + def __init__(self, name): + self.name = name + self.score = None + self.metrics = {} + + def add_metric(self, data): + split_data = data.split(":") + name = split_data[0].strip() + score = split_data[1].strip() + + if name in self.metrics: + raise KeyError("A metric of that name is already present") + self.metrics[name] = float(score) + + +class VellamoResultParser(HTMLParser): + + class StopParsingException(Exception): + pass + + def __init__(self): + HTMLParser.__init__(self) + self.inside_div = False + self.inside_span = 0 + self.inside_li = False + self.got_data = False + self.failed = False + self.benchmarks = [] + + def feed(self, text): + try: + HTMLParser.feed(self, text) + except self.StopParsingException: + pass + + def handle_starttag(self, tag, attrs): + if tag == 'div': + self.inside_div = True + if tag == 'span': + self.inside_span += 1 + if tag == 'li': + self.inside_li = True + + def handle_endtag(self, tag): + if tag == 'div': + self.inside_div = False + self.inside_span = 0 + self.got_data = False + self.failed = False + if tag == 'li': + self.inside_li = False + + def handle_data(self, data): + if self.inside_div and not self.failed: + if "Problem" in data: + self.failed = True + elif self.inside_span == 1: + self.benchmarks.append(VellamoResult(data)) + elif self.inside_span == 3 and not self.got_data: + self.benchmarks[-1].score = int(data) + self.got_data = True + elif self.inside_li and self.got_data: + if 'failed' not in data: + self.benchmarks[-1].add_metric(data) + else: + self.failed = True diff --git a/wa/workloads/vellamo/com.arm.wa.uiauto.vellamo.apk b/wa/workloads/vellamo/com.arm.wa.uiauto.vellamo.apk new file mode 100644 index 00000000..3a1341b7 Binary files /dev/null and b/wa/workloads/vellamo/com.arm.wa.uiauto.vellamo.apk differ diff --git a/wa/workloads/vellamo/uiauto/app/build.gradle b/wa/workloads/vellamo/uiauto/app/build.gradle new file mode 100644 index 00000000..35ff6d92 --- /dev/null +++ b/wa/workloads/vellamo/uiauto/app/build.gradle @@ -0,0 +1,35 @@ +apply plugin: 'com.android.application' + +def packageName = "com.arm.wa.uiauto.vellamo" + +android { + compileSdkVersion 25 + buildToolsVersion "25.0.3" + defaultConfig { + applicationId "${packageName}" + minSdkVersion 18 + targetSdkVersion 25 + testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" + } + buildTypes { + applicationVariants.all { variant -> + 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/vellamo/uiauto/app/src/main/AndroidManifest.xml b/wa/workloads/vellamo/uiauto/app/src/main/AndroidManifest.xml new file mode 100644 index 00000000..b3d5a8a1 --- /dev/null +++ b/wa/workloads/vellamo/uiauto/app/src/main/AndroidManifest.xml @@ -0,0 +1,13 @@ + + + + + + + + diff --git a/wa/workloads/vellamo/uiauto/app/src/main/java/com/arm/wa/uiauto/vellamo/UiAutomation.java b/wa/workloads/vellamo/uiauto/app/src/main/java/com/arm/wa/uiauto/vellamo/UiAutomation.java new file mode 100644 index 00000000..19518361 --- /dev/null +++ b/wa/workloads/vellamo/uiauto/app/src/main/java/com/arm/wa/uiauto/vellamo/UiAutomation.java @@ -0,0 +1,311 @@ + +/* Copyright 2014-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.vellamo; + +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.support.test.uiautomator.UiWatcher; +import android.util.Log; + +import com.arm.wa.uiauto.BaseUiAutomation; +import com.arm.wa.uiauto.UxPerfUiAutomation; + +import org.junit.Test; +import org.junit.Before; +import org.junit.runner.RunWith; + +import java.util.ArrayList; +import java.util.concurrent.TimeUnit; + +@RunWith(AndroidJUnit4.class) +public class UiAutomation extends BaseUiAutomation { + + public static String TAG = "vellamo"; + public static ArrayList scores = new ArrayList(); + public static Boolean wasError = false; + + protected UxPerfUiAutomation uxPerf; + + Bundle parameters; + String version; + Boolean browser; + Boolean metal; + Boolean multicore; + Integer browserToUse; + + @Before + public void initialize(){ + uxPerf = new UxPerfUiAutomation(); + parameters = getParams(); + version = parameters.getString("version"); + browser = parameters.getBoolean("browser"); + metal = parameters.getBoolean("metal"); + multicore = parameters.getBoolean("multicore"); + browserToUse = parameters.getInt("browserToUse") - 1; + } + + @Test + public void setup() throws Exception { + dismissEULA(); + if (version.equals("2.0.3")) { + dissmissWelcomebanner(); + } else { + dismissLetsRoll(); + if (version.equals("3.2.4")) { + dismissArrow(); + } + } + } + + @Test + public void runWorkload() throws Exception { + if (version.equals("2.0.3")) { + startTest(); + dismissNetworkConnectionDialogIfNecessary(); + dismissExplanationDialogIfNecessary(); + waitForTestCompletion(15 * 60, "com.quicinc.vellamo:id/act_ba_results_btn_no"); + } else { + if (browser) { + startBrowserTest(browserToUse, version); + proccessTest("Browser"); + } + if (multicore) { + startTestV3(1, version); + proccessTest("Multicore"); + } + if (metal) { + startTestV3(2, version); + proccessTest("Metal"); + } + } + } + + @Test + public void extractResults() throws Exception { + for(String result : scores){ + Log.v(TAG, String.format("VELLAMO RESULT: %s", result)); + } + if (wasError) Log.v("vellamoWatcher", "VELLAMO ERROR: Something crashed while running browser benchmark"); + } + + public void startTest() throws Exception { + UiSelector selector = new UiSelector(); + UiObject runButton = mDevice.findObject(selector.textContains("Run All Chapters")); + + if (!runButton.waitForExists(TimeUnit.SECONDS.toMillis(5))) { + UiObject pager = mDevice.findObject(selector.className("android.support.v4.view.ViewPager")); + pager.swipeLeft(2); + if (!runButton.exists()) { + throw new UiObjectNotFoundException("Could not find \"Run All Chapters\" button."); + } + } + runButton.click(); + } + + public void startBrowserTest(int browserToUse, String version) throws Exception { + //Ensure chrome is selected as "browser" fails to run the benchmark + UiSelector selector = new UiSelector(); + UiObject browserToUseButton = mDevice.findObject(selector.className("android.widget.ImageButton") + .longClickable(true).instance(browserToUse)); + UiObject browserButton = mDevice.findObject(selector.className("android.widget.ImageButton") + .longClickable(true).selected(true)); + //Disable browsers + while(browserButton.exists()) browserButton.click(); + if (browserToUseButton.waitForExists(TimeUnit.SECONDS.toMillis(5))) { + if (browserToUseButton.exists()) { + browserToUseButton.click(); + } + } + + //enable a watcher to dismiss browser dialogs + UiWatcher stoppedWorkingDialogWatcher = new UiWatcher() { + @Override + public boolean checkForCondition() { + UiObject stoppedWorkingDialog = mDevice.findObject(new UiSelector().textStartsWith("Unfortunately")); + if(stoppedWorkingDialog.exists()){ + wasError = true; + UiObject okButton = mDevice.findObject(new UiSelector().className("android.widget.Button").text("OK")); + try { + okButton.click(); + } catch (UiObjectNotFoundException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + return (stoppedWorkingDialog.waitUntilGone(25000)); + } + return false; + } + }; + // Register watcher + mDevice.registerWatcher("stoppedWorkingDialogWatcher", stoppedWorkingDialogWatcher); + + // Run watcher + mDevice.runWatchers(); + + startTestV3(0, version); + } + + public void startTestV3(int run, String version) throws Exception { + UiSelector selector = new UiSelector(); + + UiObject thirdRunButton = mDevice.findObject(selector.resourceId("com.quicinc.vellamo:id/card_launcher_run_button").instance(2)); + if (!thirdRunButton.waitForExists(TimeUnit.SECONDS.toMillis(5))) { + if (!thirdRunButton.exists()) { + throw new UiObjectNotFoundException("Could not find three \"Run\" buttons."); + } + } + + //Run benchmarks + UiObject runButton = mDevice.findObject(selector.resourceId("com.quicinc.vellamo:id/card_launcher_run_button").instance(run)); + if (!runButton.waitForExists(TimeUnit.SECONDS.toMillis(5))) { + if (!runButton.exists()) { + throw new UiObjectNotFoundException("Could not find correct \"Run\" button."); + } + } + runButton.click(); + + //Skip tutorial screen + if (version.equals("3.2.4")) { + UiObject gotItButton = mDevice.findObject(selector.textContains("Got it")); + if (!gotItButton.waitForExists(TimeUnit.SECONDS.toMillis(5))) { + if (!gotItButton.exists()) { + throw new UiObjectNotFoundException("Could not find correct \"GOT IT\" button."); + } + } + gotItButton.click(); + } + + else { + UiObject swipeScreen = mDevice.findObject(selector.textContains("Swipe left to continue")); + if (!swipeScreen.waitForExists(TimeUnit.SECONDS.toMillis(5))) { + if (!swipeScreen.exists()) { + throw new UiObjectNotFoundException("Could not find \"Swipe screen\"."); + } + } + sleep(1); + swipeScreen.swipeLeft(2); + sleep(1); + swipeScreen.swipeLeft(2); + } + + } + + public void proccessTest(String metric) throws Exception{ + waitForTestCompletion(15 * 60, "com.quicinc.vellamo:id/button_no"); + + //Remove watcher + mDevice.removeWatcher("stoppedWorkingDialogWatcher"); + + getScore(metric, "com.quicinc.vellamo:id/card_score_score"); + mDevice.pressBack(); + mDevice.pressBack(); + mDevice.pressBack(); + } + + public void getScore(String metric, String resourceID) throws Exception { + UiSelector selector = new UiSelector(); + UiObject score = mDevice.findObject(selector.resourceId(resourceID)); + if (!score.waitForExists(TimeUnit.SECONDS.toMillis(5))) { + if (!score.exists()) { + throw new UiObjectNotFoundException("Could not find score on screen."); + } + } + scores.add(metric + " " + score.getText().trim()); + } + + public void waitForTestCompletion(int timeout, String resourceID) throws Exception { + UiSelector selector = new UiSelector(); + UiObject resultsNoButton = mDevice.findObject(selector.resourceId(resourceID)); + if (!resultsNoButton.waitForExists(TimeUnit.SECONDS.toMillis(timeout))) { + throw new UiObjectNotFoundException("Did not see results screen."); + } + + } + + public void dismissEULA() throws Exception { + UiSelector selector = new UiSelector(); + waitText("Vellamo EULA"); + UiObject acceptButton = mDevice.findObject(selector.textMatches("Accept|ACCEPT") + .className("android.widget.Button")); + if (acceptButton.exists()) { + acceptButton.click(); + } + } + + public void dissmissWelcomebanner() throws Exception { + UiSelector selector = new UiSelector(); + UiObject welcomeBanner = mDevice.findObject(selector.textContains("WELCOME")); + if (welcomeBanner.waitForExists(TimeUnit.SECONDS.toMillis(5))) { + UiObject pager = mDevice.findObject(selector.className("android.support.v4.view.ViewPager")); + pager.swipeLeft(2); + pager.swipeLeft(2); + } + } + + public void dismissLetsRoll() throws Exception { + UiSelector selector = new UiSelector(); + UiObject letsRollButton = mDevice.findObject(selector.className("android.widget.Button") + .textContains("LET'S ROLL")); + if (!letsRollButton.waitForExists(TimeUnit.SECONDS.toMillis(5))) { + if (!letsRollButton.exists()) { + // As a fall-back look for the old capitalization + letsRollButton = mDevice.findObject(selector.className("android.widget.Button") + .textContains("Let's Roll")); + if (!letsRollButton.exists()) { + throw new UiObjectNotFoundException("Could not find \"Let's Roll\" button."); + } + } + } + letsRollButton.click(); + } + + public void dismissArrow() throws Exception { + UiSelector selector = new UiSelector(); + UiObject cardContainer = mDevice.findObject(selector.resourceId("com.quicinc.vellamo:id/cards_container")) ; + if (!cardContainer.waitForExists(TimeUnit.SECONDS.toMillis(5))) { + if (!cardContainer.exists()) { + throw new UiObjectNotFoundException("Could not find vellamo main screen"); + } + } + } + + public void dismissNetworkConnectionDialogIfNecessary() throws Exception { + UiSelector selector = new UiSelector(); + UiObject dialog = mDevice.findObject(selector.className("android.widget.TextView") + .textContains("No Network Connection")); + if (dialog.exists()) { + UiObject yesButton = mDevice.findObject(selector.className("android.widget.Button") + .text("Yes")); + yesButton.click(); + } + } + + public void dismissExplanationDialogIfNecessary() throws Exception { + UiSelector selector = new UiSelector(); + UiObject dialog = mDevice.findObject(selector.className("android.widget.TextView") + .textContains("Benchmarks Explanation")); + if (dialog.exists()) { + UiObject noButton = mDevice.findObject(selector.className("android.widget.Button") + .text("No")); + noButton.click(); + } + } +} diff --git a/wa/workloads/vellamo/uiauto/build.gradle b/wa/workloads/vellamo/uiauto/build.gradle new file mode 100644 index 00000000..d0aa7043 --- /dev/null +++ b/wa/workloads/vellamo/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/vellamo/uiauto/build.sh b/wa/workloads/vellamo/uiauto/build.sh new file mode 100755 index 00000000..01af95e4 --- /dev/null +++ b/wa/workloads/vellamo/uiauto/build.sh @@ -0,0 +1,55 @@ +#!/bin/bash +# 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. +# +set -e + +# 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.vellamo +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/vellamo/uiauto/gradle/wrapper/gradle-wrapper.jar b/wa/workloads/vellamo/uiauto/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 00000000..13372aef Binary files /dev/null and b/wa/workloads/vellamo/uiauto/gradle/wrapper/gradle-wrapper.jar differ diff --git a/wa/workloads/vellamo/uiauto/gradle/wrapper/gradle-wrapper.properties b/wa/workloads/vellamo/uiauto/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 00000000..760fcce7 --- /dev/null +++ b/wa/workloads/vellamo/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/vellamo/uiauto/gradlew b/wa/workloads/vellamo/uiauto/gradlew new file mode 100755 index 00000000..9d82f789 --- /dev/null +++ b/wa/workloads/vellamo/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/vellamo/uiauto/gradlew.bat b/wa/workloads/vellamo/uiauto/gradlew.bat new file mode 100644 index 00000000..aec99730 --- /dev/null +++ b/wa/workloads/vellamo/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/vellamo/uiauto/settings.gradle b/wa/workloads/vellamo/uiauto/settings.gradle new file mode 100644 index 00000000..e7b4def4 --- /dev/null +++ b/wa/workloads/vellamo/uiauto/settings.gradle @@ -0,0 +1 @@ +include ':app'