From ceb6677274f04b5d312966870390405a62e55bdc Mon Sep 17 00:00:00 2001 From: muendelezaji Date: Tue, 10 May 2016 12:07:41 +0100 Subject: [PATCH] Initial commit for Google Slides Includes functionality to create a document from template or plain PPT or Slides Also helper functions for edge swipe and adb commands (not quite working) --- wlauto/workloads/googleslides/__init__.py | 94 +++++++++++ .../com.arm.wlauto.uiauto.googleslides.jar | Bin 0 -> 10747 bytes wlauto/workloads/googleslides/uiauto/build.sh | 39 +++++ .../workloads/googleslides/uiauto/build.xml | 92 +++++++++++ .../googleslides/uiauto/project.properties | 14 ++ .../com/arm/wlauto/uiauto/UiAutomation.java | 155 ++++++++++++++++++ 6 files changed, 394 insertions(+) create mode 100644 wlauto/workloads/googleslides/__init__.py create mode 100644 wlauto/workloads/googleslides/com.arm.wlauto.uiauto.googleslides.jar create mode 100755 wlauto/workloads/googleslides/uiauto/build.sh create mode 100644 wlauto/workloads/googleslides/uiauto/build.xml create mode 100644 wlauto/workloads/googleslides/uiauto/project.properties create mode 100644 wlauto/workloads/googleslides/uiauto/src/com/arm/wlauto/uiauto/UiAutomation.java diff --git a/wlauto/workloads/googleslides/__init__.py b/wlauto/workloads/googleslides/__init__.py new file mode 100644 index 00000000..7c04549a --- /dev/null +++ b/wlauto/workloads/googleslides/__init__.py @@ -0,0 +1,94 @@ +# Copyright 2014-2016 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.path as op +import re +import time + +from wlauto import AndroidUiAutoBenchmark, Parameter + + +def not_implemented(workload, text): + workload.logger.info('## ++ NOT IMPLEMENTED ++ ##\n## {}\n## -- NOT IMPLEMENTED -- ##'.format(text)) + + +class GoogleSlides(AndroidUiAutoBenchmark): + + name = 'googleslides' + package = 'com.google.android.apps.docs.editors.slides' + description = 'Creates a Google Slides presentation with some commonly used features' + activity = '' + # com.google.android.apps.docs.editors.slides/com.google.android.apps.docs.app.DocListActivity + # com.google.android.apps.docs.editors.slides/com.google.android.apps.docs.welcome.warmwelcome.TrackingWelcomeActivity + + instrumentation_log = '{}_instrumentation.log'.format(name) + + parameters = [ + Parameter('dumpsys_enabled', kind=bool, default=True, + description=''' + If ``True``, dumpsys captures will be carried out during the test run. + The output is piped to log files which are then pulled from the phone. + '''), + ] + + def __init__(self, device, **kwargs): + super(GoogleSlides, self).__init__(device, **kwargs) + self.output_file = op.join(self.device.working_directory, self.instrumentation_log) + self.run_timeout = 60 + + def validate(self): + self.logger.info('===== validate() ======') + super(GoogleSlides, self).validate() + self.uiauto_params['dumpsys_enabled'] = self.dumpsys_enabled + self.uiauto_params['output_dir'] = self.device.working_directory + self.uiauto_params['results_file'] = self.output_file + + def setup(self, context): + self.logger.info('===== setup() ======') + super(GoogleSlides, self).setup(context) + + def run(self, context): + self.logger.info('===== run() ======') + super(GoogleSlides, self).run(context) + + def update_result(self, context): + self.logger.info('===== update_result() ======') + super(GoogleSlides, self).update_result(context) + if self.dumpsys_enabled: + not_implemented(self, 'get_metrics(context)') + + def teardown(self, context): + self.logger.info('===== teardown() ======') + super(GoogleSlides, self).teardown(context) + not_implemented(self, 'pull_logs(context)') + + def get_metrics(self, context): + self.device.pull_file(self.output_file, context.output_directory) + metrics_file = op.join(context.output_directory, self.instrumentation_log) + with open(metrics_file, 'r') as wfh: + regex = re.compile(r'(\w+)\s+(\d+)\s+(\d+)\s+(\d+)') + for line in wfh: + match = regex.search(line) + if match: + context.result.add_metric((match.group(1) + '_start'), match.group(2)) + context.result.add_metric((match.group(1) + '_finish'), match.group(3)) + context.result.add_metric((match.group(1) + '_duration'), match.group(4)) + + def pull_logs(self, context): + wd = self.device.working_directory + for entry in self.device.listdir(wd): + if entry.startswith(self.name) and entry.endswith('.log'): + self.device.pull_file(op.join(wd, entry), context.output_directory) + self.device.delete_file(op.join(wd, entry)) diff --git a/wlauto/workloads/googleslides/com.arm.wlauto.uiauto.googleslides.jar b/wlauto/workloads/googleslides/com.arm.wlauto.uiauto.googleslides.jar new file mode 100644 index 0000000000000000000000000000000000000000..3a2191510093674f3c8e1ca7ce0071bdaeebb687 GIT binary patch literal 10747 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 literal 0 HcmV?d00001 diff --git a/wlauto/workloads/googleslides/uiauto/build.sh b/wlauto/workloads/googleslides/uiauto/build.sh new file mode 100755 index 00000000..58407ee5 --- /dev/null +++ b/wlauto/workloads/googleslides/uiauto/build.sh @@ -0,0 +1,39 @@ +#!/bin/bash + +# 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 build.xml exists before starting +if [[ ! -f build.xml ]]; then + echo 'Ant build.xml file not found! Check that you are in the right directory.' + exit 9 +fi + +# Copy base classes from wlauto dist +class_dir=bin/classes/com/arm/wlauto/uiauto +base_classes=`python -c "import os, wlauto; print os.path.join(os.path.dirname(wlauto.__file__), 'common', 'android', '*.class')"` +mkdir -p $class_dir +cp $base_classes $class_dir + +# Build and return appropriate exit code if failed +ant build +exit_code=$? +if [[ $exit_code -ne 0 ]]; then + echo "ERROR: 'ant build' exited with code $exit_code" + exit $exit_code +fi + +# If successful move JAR file to workload folder (remove previous) +package=com.arm.wlauto.uiauto.googleslides.jar +rm -f ../$package +if [[ -f bin/$package ]]; then + cp bin/$package .. +else + echo 'ERROR: UiAutomator JAR could not be found!' + exit 9 +fi diff --git a/wlauto/workloads/googleslides/uiauto/build.xml b/wlauto/workloads/googleslides/uiauto/build.xml new file mode 100644 index 00000000..259eaa6e --- /dev/null +++ b/wlauto/workloads/googleslides/uiauto/build.xml @@ -0,0 +1,92 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/wlauto/workloads/googleslides/uiauto/project.properties b/wlauto/workloads/googleslides/uiauto/project.properties new file mode 100644 index 00000000..ce39f2d0 --- /dev/null +++ b/wlauto/workloads/googleslides/uiauto/project.properties @@ -0,0 +1,14 @@ +# This file is automatically generated by Android Tools. +# Do not modify this file -- YOUR CHANGES WILL BE ERASED! +# +# This file must be checked in Version Control Systems. +# +# To customize properties used by the Ant build system edit +# "ant.properties", and override values to adapt the script to your +# project structure. +# +# To enable ProGuard to shrink and obfuscate your code, uncomment this (available properties: sdk.dir, user.home): +#proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt + +# Project target. +target=android-18 diff --git a/wlauto/workloads/googleslides/uiauto/src/com/arm/wlauto/uiauto/UiAutomation.java b/wlauto/workloads/googleslides/uiauto/src/com/arm/wlauto/uiauto/UiAutomation.java new file mode 100644 index 00000000..1e10758c --- /dev/null +++ b/wlauto/workloads/googleslides/uiauto/src/com/arm/wlauto/uiauto/UiAutomation.java @@ -0,0 +1,155 @@ +package com.arm.wlauto.uiauto.googleslides; + +import java.io.File; +import java.util.LinkedHashMap; +import java.util.Map; + +import android.app.Activity; +import android.content.Context; +import android.net.wifi.WifiManager; +import android.os.Bundle; +import android.util.Log; +import android.view.KeyEvent; + +// Import the uiautomator libraries +import com.android.uiautomator.core.UiObject; +import com.android.uiautomator.core.UiObjectNotFoundException; +import com.android.uiautomator.core.UiScrollable; +import com.android.uiautomator.core.UiSelector; +import com.android.uiautomator.testrunner.UiAutomatorTestCase; + +import com.arm.wlauto.uiauto.UxPerfUiAutomation; + +public class UiAutomation extends UxPerfUiAutomation { + + public static String TAG = "googleslides"; + public static final String PACKAGE = "com.google.android.apps.docs.editors.slides"; + public static final String PACKAGE_ID = PACKAGE + ":id/"; + + public static final String CLASS_TEXT_VIEW = "android.widget.TextView"; + public static final String CLASS_IMAGE_VIEW = "android.widget.ImageView"; + public static final String CLASS_BUTTON = "android.widget.Button"; + public static final String CLASS_IMAGE_BUTTON = "android.widget.ImageButton"; + public static final String CLASS_TABLE_ROW = "android.widget.TableRow"; + + public Bundle parameters; + private Map results = new LinkedHashMap(); + private boolean dumpsysEnabled; + private String outputDir; + + public static final int DOCTYPE_TEMPLATE = 1; + public static final int DOCTYPE_PPT = 2; + public static final int DOCTYPE_SLIDES = 3; + + public void runUiAutomation() throws Exception { + parameters = getParams(); + parseParams(parameters); + skipWelcomeScreen(); + enablePowerpointCompat(); + if (false) { // TODO currently unused + openFromStorage(); + } + createNewDoc(DOCTYPE_TEMPLATE); + setWifiStatus(false); + tapDisplayNormalised(0.99, 0.99); + sleep(5); + if (false) { // TODO currently unused + writeResultsToFile(results, parameters.getString("results_file")); + } + } + + public void parseParams(Bundle parameters) throws Exception { + dumpsysEnabled = Boolean.parseBoolean(parameters.getString("dumpsys_enabled")); + outputDir = parameters.getString("output_dir", "/sdcard/wa-working"); + } + + private void skipWelcomeScreen() throws Exception { + UiObject skipButton = getUiObjectByText("Skip", CLASS_BUTTON); + skipButton.clickAndWaitForNewWindow(); + sleep(1); + } + + private void enablePowerpointCompat() throws Exception { + uiDeviceEdgeSwipeFromLeft(10); + UiObject settings = getUiObjectByText("Settings", CLASS_TEXT_VIEW); + settings.clickAndWaitForNewWindow(); + UiObject checkboxRow = getUiObjectByText("Create PowerPoint", CLASS_TEXT_VIEW); + checkboxRow.click(); + getUiDevice().pressBack(); + sleep(1); + } + + private void openFromStorage() throws Exception { + // UiObject newButton = getUiObjectByResourceId(PACKAGE_ID + "menu_open_with_picker", CLASS_TEXT_VIEW); + UiObject openButton = getUiObjectByDescription("Open presentation", CLASS_TEXT_VIEW); + openButton.click(); + openButton = getUiObjectByText("Device storage", CLASS_TEXT_VIEW); + openButton.clickAndWaitForNewWindow(); + getUiDevice().pressBack(); + sleep(1); + } + + private void createNewDoc(int docType) throws Exception { + // UiObject newButton = getUiObjectByResourceId(PACKAGE_ID + "fab_base_button", CLASS_IMAGE_BUTTON); + UiObject newButton = getUiObjectByDescription("New presentation", CLASS_IMAGE_BUTTON); + newButton.click(); + + UiObject newPowerpoint = getUiObjectByDescription("New PowerPoint", CLASS_IMAGE_BUTTON); + UiObject newSlidesFile = getUiObjectByDescription("New Slides", CLASS_IMAGE_BUTTON); + UiObject fromTemplate = getUiObjectByDescription("Choose template", CLASS_IMAGE_BUTTON); + // UiObject newPowerpoint = getUiObjectByText("New PowerPoint", CLASS_TEXT_VIEW); + // UiObject newSlidesFile = getUiObjectByText("New Slides", CLASS_TEXT_VIEW); + // UiObject fromTemplate = getUiObjectByText("Choose template", CLASS_TEXT_VIEW); + + switch (docType) { + case DOCTYPE_TEMPLATE: + fromTemplate.clickAndWaitForNewWindow(); + break; + case DOCTYPE_PPT: + newPowerpoint.clickAndWaitForNewWindow(); + break; + case DOCTYPE_SLIDES: + default: + newSlidesFile.clickAndWaitForNewWindow(); + break; + } + sleep(1); + getUiDevice().pressBack(); + } + + public void uiDeviceEdgeSwipeFromLeft(int steps) { + int height = getDisplayHeight(); + int width = getDisplayWidth(); + getUiDevice().swipe(0, height/2, width/2, height/2, steps); + } + + public void tapDisplayNormalised(double percentX, double percentY) { + double x = Math.max(0, Math.min(1, percentX)); + double y = Math.max(0, Math.min(1, percentY)); + int tapX = (int) Math.floor(x * getDisplayWidth()); + int tapY = (int) Math.floor(y * getDisplayHeight()); + getUiDevice().click(tapX, tapY); + } + + public void setWifiStatus(boolean flag) throws Exception { + // To enable, check for "UninitializedState" + String checkFor = flag ? "UninitializedState" : "ConnectedState"; + String adbCommand = + "dumpsys wifi | grep curState=" + checkFor + ";" + + "exit_code=$?;" + + "if [ $exit_code = 0 ]; then" + + " am start -a android.intent.action.MAIN -n com.android.settings/.wifi.WifiSettings;" + + " input keyevent 20;" + + " input keyevent 23;" + + " sleep 1;" + + " input keyevent 4;" + + "fi"; + // runShellCommand(adbCommand); + runShellCommand("dumpsys wifi | grep curState=ConnectedState"); + sleep(1); + } + + public void runShellCommand(String command) throws Exception { + Process proc = Runtime.getRuntime().exec(command); + } +}