From cc2280a317bd8649c94e5ca0f1103e657bf144e0 Mon Sep 17 00:00:00 2001 From: James Hartley Date: Thu, 28 Apr 2016 13:03:03 +0100 Subject: [PATCH] Gmail productivity workload A new workload to perform standard productivity tasks within Gmail. Each user event/step is timed and reported back as a metric. --- wlauto/workloads/gmail/__init__.py | 78 +++++++++++ .../gmail/com.arm.wlauto.uiauto.gmail.jar | Bin 0 -> 8625 bytes wlauto/workloads/gmail/uiauto/build.sh | 12 ++ wlauto/workloads/gmail/uiauto/build.xml | 92 +++++++++++++ .../workloads/gmail/uiauto/project.properties | 14 ++ .../com/arm/wlauto/uiauto/UiAutomation.java | 123 ++++++++++++++++++ 6 files changed, 319 insertions(+) create mode 100755 wlauto/workloads/gmail/__init__.py create mode 100644 wlauto/workloads/gmail/com.arm.wlauto.uiauto.gmail.jar create mode 100755 wlauto/workloads/gmail/uiauto/build.sh create mode 100644 wlauto/workloads/gmail/uiauto/build.xml create mode 100644 wlauto/workloads/gmail/uiauto/project.properties create mode 100644 wlauto/workloads/gmail/uiauto/src/com/arm/wlauto/uiauto/UiAutomation.java diff --git a/wlauto/workloads/gmail/__init__.py b/wlauto/workloads/gmail/__init__.py new file mode 100755 index 00000000..dd8b93c6 --- /dev/null +++ b/wlauto/workloads/gmail/__init__.py @@ -0,0 +1,78 @@ +import os +import logging +import re +import time + +from wlauto import AndroidUiAutoBenchmark, Parameter + + +class Gmail(AndroidUiAutoBenchmark): + + name = 'gmail' + package = 'com.google.android.gm' + activity = '' + view = [package+'/com.google.android.gm.ConversationListActivityGmail', + package+'/com.google.android.gm.ComposeActivityGmail'] + description = """ + A workload to perform standard productivity tasks within Gmail. + + The workload carries out various tasks, such as creatign new emails and + sending them, whilst also producing metrics for action completion times. + """ + + regex = re.compile(r'uxperf_gmail.*: (?P\w+) (?P\d+)') + + parameters = [ + Parameter('recipient', default='armuxperf@gmail.com', mandatory=False, + description="""" + The email address of the recipient. Setting a void address + will stop any mesage failures clogging up your device inbox + """), + 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. + """), + ] + + instrumentation_log = ''.join([name, '_instrumentation.log']) + + def __init__(self, device, **kwargs): + super(Gmail, self).__init__(device, **kwargs) + self.uiauto_params['recipient'] = self.recipient + + def validate(self): + super(Gmail, self).validate() + self.output_file = os.path.join(self.device.working_directory, self.instrumentation_log) + self.uiauto_params['package'] = self.package + self.uiauto_params['output_dir'] = self.device.working_directory + self.uiauto_params['output_file'] = self.output_file + self.uiauto_params['dumpsys_enabled'] = self.dumpsys_enabled + + def update_result(self, context): + super(Gmail, self).update_result(context) + + if self.dumpsys_enabled: + self.device.pull_file(self.output_file, context.output_directory) + result_file = os.path.join(context.output_directory, self.instrumentation_log) + + with open(result_file, 'r') as wfh: + regex = re.compile(r'(?P\w+)\s+(?P\d+)\s+(?P\d+)\s+(?P\d+)') + for line in wfh: + match = regex.search(line) + if match: + context.result.add_metric((match.group('key') + "_start"), + match.group('value1')) + context.result.add_metric((match.group('key') + "_finish"), + match.group('value2')) + context.result.add_metric((match.group('key') + "_duration"), + match.group('value3')) + + def teardown(self, context): + super(Gmail, self).teardown(context) + + for file in self.device.listdir(self.device.working_directory): + if file.startswith (self.name) and file.endswith(".log"): + self.device.pull_file(os.path.join(self.device.working_directory, file), context.output_directory) + self.device.delete_file(os.path.join(self.device.working_directory, file)) diff --git a/wlauto/workloads/gmail/com.arm.wlauto.uiauto.gmail.jar b/wlauto/workloads/gmail/com.arm.wlauto.uiauto.gmail.jar new file mode 100644 index 0000000000000000000000000000000000000000..9e50ab70502b038bae6893933f5f92bc05ea126b GIT binary patch literal 8625 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 H{#pGOB@LK# literal 0 HcmV?d00001 diff --git a/wlauto/workloads/gmail/uiauto/build.sh b/wlauto/workloads/gmail/uiauto/build.sh new file mode 100755 index 00000000..88752a4b --- /dev/null +++ b/wlauto/workloads/gmail/uiauto/build.sh @@ -0,0 +1,12 @@ +#!/bin/bash + +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 + +ant build + +if [[ -f bin/com.arm.wlauto.uiauto.gmail.jar ]]; then + cp bin/com.arm.wlauto.uiauto.gmail.jar .. +fi diff --git a/wlauto/workloads/gmail/uiauto/build.xml b/wlauto/workloads/gmail/uiauto/build.xml new file mode 100644 index 00000000..a0c4d822 --- /dev/null +++ b/wlauto/workloads/gmail/uiauto/build.xml @@ -0,0 +1,92 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/wlauto/workloads/gmail/uiauto/project.properties b/wlauto/workloads/gmail/uiauto/project.properties new file mode 100644 index 00000000..ce39f2d0 --- /dev/null +++ b/wlauto/workloads/gmail/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/gmail/uiauto/src/com/arm/wlauto/uiauto/UiAutomation.java b/wlauto/workloads/gmail/uiauto/src/com/arm/wlauto/uiauto/UiAutomation.java new file mode 100644 index 00000000..afeafcec --- /dev/null +++ b/wlauto/workloads/gmail/uiauto/src/com/arm/wlauto/uiauto/UiAutomation.java @@ -0,0 +1,123 @@ +package com.arm.wlauto.uiauto.gmail; + +import android.os.Bundle; +import android.os.SystemClock; + +// 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; + +import java.io.BufferedWriter; +import java.io.FileWriter; +import java.util.LinkedHashMap; +import java.util.Iterator; +import java.util.Map; +import java.util.Map.Entry; + +public class UiAutomation extends UxPerfUiAutomation { + + public static String TAG = "uxperf_gmail"; + + private Bundle parameters; + private LinkedHashMap timingResults = new LinkedHashMap(); + + public void runUiAutomation() throws Exception { + parameters = getParams(); + + Timer result = new Timer(); + result.start(); + + clearFirstRunDialogues(); + + clickNewMail(); + setToField(); + setSubjectField(); + setComposeField(); + clickSendButton(); + + result.end(); + timingResults.put("Total", result); + + writeResultsToFile(timingResults, parameters.getString("output_file")); + } + + public void clearFirstRunDialogues () throws Exception { + // Enter search text into the file searchBox. This will automatically filter the list. + UiObject gotItBox = getUiObjectByResourceId("com.google.android.gm:id/welcome_tour_got_it", + "android.widget.TextView"); + gotItBox.clickAndWaitForNewWindow(); + UiObject takeMeToBox = getUiObjectByText("Take me to Gmail", "android.widget.TextView"); + takeMeToBox.clickAndWaitForNewWindow(); + } + + public void clickNewMail() throws Exception { + Timer result = new Timer(); + UiObject newMailButton = getUiObjectByDescription("Compose", "android.widget.ImageButton"); + result.start(); + newMailButton.clickAndWaitForNewWindow(timeout); + result.end(); + timingResults.put("newMail", result); + } + + public void setToField() throws Exception { + Timer result = new Timer(); + UiObject toField = getUiObjectByDescription("To", "android.widget.TextView"); + String recipient = parameters.getString("recipient").replace('_', ' '); + result.start(); + toField.setText(recipient); + getUiDevice().pressEnter(); + result.end(); + timingResults.put("To", result); + } + + public void setSubjectField() throws Exception { + Timer result = new Timer(); + UiObject subjectField = getUiObjectByText("Subject", "android.widget.EditText"); + result.start(); + subjectField.setText("This is a test message"); + getUiDevice().pressEnter(); + result.end(); + timingResults.put("Subject", result); + } + + public void setComposeField() throws Exception { + Timer result = new Timer(); + UiObject composeField = getUiObjectByText("Compose email", "android.widget.EditText"); + result.start(); + composeField.setText("This is a test composition"); + getUiDevice().pressEnter(); + result.end(); + timingResults.put("Compose", result); + } + + public void clickSendButton() throws Exception { + Timer result = new Timer(); + UiObject sendButton = getUiObjectByDescription("Send", "android.widget.TextView"); + result.start(); + sendButton.clickAndWaitForNewWindow(timeout); + result.end(); + timingResults.put("Send", result); + } + + private void writeResultsToFile(LinkedHashMap timingResults, String file) throws Exception { + // Write out the key/value pairs to the instrumentation log file + FileWriter fstream = new FileWriter(file); + BufferedWriter out = new BufferedWriter(fstream); + Iterator> it = timingResults.entrySet().iterator(); + + while (it.hasNext()) { + Map.Entry pairs = it.next(); + Timer results = pairs.getValue(); + long start = results.getStart(); + long finish = results.getFinish(); + long duration = results.getDuration(); + out.write(String.format(pairs.getKey() + " " + start + " " + finish + " " + duration + "\n")); + } + out.close(); + } +}