From cb53fe9ec8e16089ba2a8abb2fb7a49238959d30 Mon Sep 17 00:00:00 2001 From: Michael McGeagh Date: Mon, 26 Sep 2016 16:37:59 +0100 Subject: [PATCH] Gmail: A workload to perform standard productivity tasks within Gmail. The workload carries out various tasks, such as creating new emails, attaching images and sending them. Moved broadcast to super. Mandatory and Default are XOR Added a longer wait for sync to finish. Increases reliability on certain phones Changed recipient to not mandatory and a default set Wait for sync when launching gmail from the sharing feature Fix: cornercase where image viewer already points to working directory. Refactored code due to duplication Added new function to BaseUiAutomation class to find a folder in the gallery --- wlauto/common/android/BaseUiAutomation.class | Bin 16894 -> 17621 bytes wlauto/common/android/workload.py | 2 + .../arm/wlauto/uiauto/BaseUiAutomation.java | 41 ++++ wlauto/workloads/gmail/__init__.py | 71 ++++++ .../gmail/com.arm.wlauto.uiauto.gmail.jar | Bin 0 -> 12822 bytes wlauto/workloads/gmail/uiauto/build.sh | 39 ++++ wlauto/workloads/gmail/uiauto/build.xml | 92 ++++++++ .../workloads/gmail/uiauto/project.properties | 14 ++ .../com/arm/wlauto/uiauto/UiAutomation.java | 211 ++++++++++++++++++ 9 files changed, 470 insertions(+) mode change 100644 => 100755 wlauto/common/android/workload.py mode change 100644 => 100755 wlauto/external/uiauto/src/com/arm/wlauto/uiauto/BaseUiAutomation.java 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 100755 wlauto/workloads/gmail/uiauto/src/com/arm/wlauto/uiauto/UiAutomation.java diff --git a/wlauto/common/android/BaseUiAutomation.class b/wlauto/common/android/BaseUiAutomation.class index 1f6f8cdd24cbb603b1057fdc8ab3310e172646d9..835672fb2560cf7ee7025ca42f7a09582c122594 100644 GIT binary patch delta 6798 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 S?fl%z&pY^eCqDxf3I7GTroX)a delta 6131 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 V6)mv{M<-=9Dfjv!{|lZr7rX!f diff --git a/wlauto/common/android/workload.py b/wlauto/common/android/workload.py old mode 100644 new mode 100755 index 53ac75fb..1d48796e --- a/wlauto/common/android/workload.py +++ b/wlauto/common/android/workload.py @@ -621,10 +621,12 @@ class AndroidUxPerfWorkload(AndroidUiAutoBenchmark): device_path = self._path_on_device(fpath) if self.force_push_assets or not self.device.file_exists(device_path): self.device.push_file(fpath, device_path, timeout=300) + self.device.broadcast_media_mounted(self.device.working_directory) def delete_assets(self): for f in self.deployable_assets: self.device.delete_file(self._path_on_device(f)) + self.device.broadcast_media_mounted(self.device.working_directory) def __init__(self, device, **kwargs): super(AndroidUxPerfWorkload, self).__init__(device, **kwargs) diff --git a/wlauto/external/uiauto/src/com/arm/wlauto/uiauto/BaseUiAutomation.java b/wlauto/external/uiauto/src/com/arm/wlauto/uiauto/BaseUiAutomation.java old mode 100644 new mode 100755 index 772cea5a..7e9e7fa2 --- a/wlauto/external/uiauto/src/com/arm/wlauto/uiauto/BaseUiAutomation.java +++ b/wlauto/external/uiauto/src/com/arm/wlauto/uiauto/BaseUiAutomation.java @@ -574,4 +574,45 @@ public class BaseUiAutomation extends UiAutomatorTestCase { } return object; } + + // Helper to select a folder in the gallery + public void selectGalleryFolder(String directory) throws Exception { + UiObject workdir = + new UiObject(new UiSelector().text(directory) + .className("android.widget.TextView")); + UiScrollable scrollView = + new UiScrollable(new UiSelector().scrollable(true)); + + // If the folder is not present wait for a short time for + // the media server to refresh its index. + boolean discovered = workdir.waitForExists(TimeUnit.SECONDS.toMillis(10)); + if (!discovered && scrollView.exists()) { + // First check if the directory is visible on the first + // screen and if not scroll to the bottom of the screen to look for it. + discovered = scrollView.scrollIntoView(workdir); + + // If still not discovered scroll back to the top of the screen and + // wait for a longer amount of time for the media server to refresh + // its index. + if (!discovered) { + // scrollView.scrollToBeggining() doesn't work for this + // particular scrollable view so use device method instead + for (int i = 0; i < 10; i++) { + uiDeviceSwipeUp(20); + } + discovered = workdir.waitForExists(TimeUnit.SECONDS.toMillis(60)); + + // Scroll to the bottom of the screen one last time + if (!discovered) { + discovered = scrollView.scrollIntoView(workdir); + } + } + } + + if (discovered) { + workdir.clickAndWaitForNewWindow(); + } else { + throw new UiObjectNotFoundException("Could not find folder : " + directory); + } + } } diff --git a/wlauto/workloads/gmail/__init__.py b/wlauto/workloads/gmail/__init__.py new file mode 100755 index 00000000..f0fb5d18 --- /dev/null +++ b/wlauto/workloads/gmail/__init__.py @@ -0,0 +1,71 @@ +# 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 + +from wlauto import AndroidUxPerfWorkload, Parameter +from wlauto.exceptions import ValidationError + + +class Gmail(AndroidUxPerfWorkload): + + name = 'gmail' + package = 'com.google.android.gm' + min_apk_version = '6.7.128801648' + 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 creating new emails, attaching images and sending them. + + Test description: + 1. Open Gmail application + 2. Click to create New mail + 3. Attach an image from the local images folder to the email + 4. Enter recipient details in the To field + 5. Enter text in the Subject field + 6. Enter text in the Compose field + 7. Click the Send mail button + ''' + + parameters = [ + Parameter('recipient', kind=str, default='wa-devnull@mailinator.com', + description=''' + The email address of the recipient. Setting a void address + will stop any mesage failures clogging up your device inbox + '''), + Parameter('test_image', kind=str, default='uxperf_1600x1200.jpg', + description=''' + An image to be copied onto the device that will be attached + to the email + '''), + ] + + # This workload relies on the internet so check that there is a working + # internet connection + requires_network = True + + def __init__(self, device, **kwargs): + super(Gmail, self).__init__(device, **kwargs) + self.deployable_assets = [self.test_image] + self.clean_assets = True + + def validate(self): + super(Gmail, self).validate() + self.uiauto_params['recipient'] = self.recipient + # Only accept certain image formats + if os.path.splitext(self.test_image.lower())[1] not in ['.jpg', '.jpeg', '.png']: + raise ValidationError('{} must be a JPEG or PNG file'.format(self.test_image)) 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..d21cfab36d2bba3506e9c4a4ed1d4d03cd1d907b GIT binary patch literal 12822 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 aUj8pWgsK7p;(s~;@45B8mgo4-)Bgcco=Xe> 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..aada0dcf --- /dev/null +++ b/wlauto/workloads/gmail/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 (overwrite previous) +package=com.arm.wlauto.uiauto.gmail.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/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 100755 index 00000000..d24f2757 --- /dev/null +++ b/wlauto/workloads/gmail/uiauto/src/com/arm/wlauto/uiauto/UiAutomation.java @@ -0,0 +1,211 @@ +/* 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. + */ + +package com.arm.wlauto.uiauto.gmail; + +import android.os.Bundle; + +// Import the uiautomator libraries +import com.android.uiautomator.core.UiObject; +import com.android.uiautomator.core.UiObjectNotFoundException; +import com.android.uiautomator.core.UiSelector; + +import com.arm.wlauto.uiauto.UxPerfUiAutomation; + +import java.util.concurrent.TimeUnit; + +public class UiAutomation extends UxPerfUiAutomation { + + public Bundle parameters; + public String packageName; + public String packageID; + + private int networkTimeoutSecs = 30; + private long networkTimeout = TimeUnit.SECONDS.toMillis(networkTimeoutSecs); + + public void runUiAutomation() throws Exception { + parameters = getParams(); + packageName = parameters.getString("package"); + packageID = packageName + ":id/"; + + String recipient = parameters.getString("recipient"); + + setScreenOrientation(ScreenOrientation.NATURAL); + + clearFirstRunDialogues(); + clickNewMail(); + attachImage(); + setToField(recipient); + setSubjectField(); + setComposeField(); + clickSendButton(); + + unsetScreenOrientation(); + } + + public void clearFirstRunDialogues() throws Exception { + // The first run dialogues vary on different devices so check if they are there and dismiss + UiObject gotItBox = + new UiObject(new UiSelector().resourceId(packageID + "welcome_tour_got_it") + .className("android.widget.TextView")); + if (gotItBox.exists()) { + gotItBox.clickAndWaitForNewWindow(uiAutoTimeout); + } + + UiObject takeMeToBox = + new UiObject(new UiSelector().textContains("Take me to Gmail") + .className("android.widget.TextView")); + if (takeMeToBox.exists()) { + takeMeToBox.clickAndWaitForNewWindow(uiAutoTimeout); + } + + UiObject syncNowButton = + new UiObject(new UiSelector().textContains("Sync now") + .className("android.widget.Button")); + if (syncNowButton.exists()) { + syncNowButton.clickAndWaitForNewWindow(uiAutoTimeout); + // On some devices we need to wait for a sync to occur after clearing the data + // We also need to sleep here since waiting for a new window is not enough + sleep(10); + } + + // Wait an obnoxiously long period of time for the sync operation to finish + // If it still fails, then there is a problem with the app obtaining the data it needs + // Recommend restarting the phone and/or clearing the app data + UiObject gettingMessages = + new UiObject(new UiSelector().textContains("Getting your messages") + .className("android.widget.TextView")); + UiObject waitingSync = + new UiObject(new UiSelector().textContains("Waiting for sync") + .className("android.widget.TextView")); + if (!waitUntilNoObject(gettingMessages, networkTimeoutSecs*4) || + !waitUntilNoObject(waitingSync, networkTimeoutSecs*4)) { + throw new UiObjectNotFoundException("Device cannot sync! Try rebooting or clearing app data"); + } + } + + public void clickNewMail() throws Exception { + String testTag = "click_new"; + ActionLogger logger = new ActionLogger(testTag, parameters); + + UiObject conversationView = + new UiObject(new UiSelector().resourceId(packageID + "conversation_list_view") + .className("android.widget.ListView")); + if (!conversationView.waitForExists(networkTimeout)) { + throw new UiObjectNotFoundException("Could not find \"conversationView\"."); + } + + UiObject newMailButton = + getUiObjectByDescription("Compose", "android.widget.ImageButton"); + logger.start(); + newMailButton.clickAndWaitForNewWindow(uiAutoTimeout); + logger.stop(); + } + + public void attachImage() throws Exception { + String testTag = "attach_img"; + ActionLogger logger = new ActionLogger(testTag, parameters); + + UiObject attachIcon = + getUiObjectByResourceId(packageID + "add_attachment", "android.widget.TextView"); + + logger.start(); + + attachIcon.click(); + UiObject attachFile = + getUiObjectByText("Attach file", "android.widget.TextView"); + attachFile.clickAndWaitForNewWindow(uiAutoTimeout); + + UiObject waFolder = + new UiObject(new UiSelector().textContains("wa-working") + .className("android.widget.TextView")); + // Some devices use a FrameLayout as oppoised to a view Group so treat them differently + if (!waFolder.waitForExists(uiAutoTimeout)) { + UiObject rootMenu = + new UiObject(new UiSelector().descriptionContains("Show roots") + .className("android.widget.ImageButton")); + // Portrait devices will roll the menu up so click the root menu icon + if (rootMenu.exists()) { + rootMenu.click(); + } + + UiObject imagesEntry = + new UiObject(new UiSelector().textContains("Images") + .className("android.widget.TextView")); + // Go to the 'Images' section + if (imagesEntry.waitForExists(uiAutoTimeout)) { + imagesEntry.click(); + } + // Find and select the folder + selectGalleryFolder("wa-working"); + } + + UiObject imageFileButton = + new UiObject(new UiSelector().resourceId("com.android.documentsui:id/grid") + .className("android.widget.GridView") + .childSelector(new UiSelector().index(0) + .className("android.widget.FrameLayout"))); + imageFileButton.click(); + imageFileButton.waitUntilGone(uiAutoTimeout); + + logger.stop(); + } + + public void setToField(String recipient) throws Exception { + String testTag = "text_to"; + ActionLogger logger = new ActionLogger(testTag, parameters); + + UiObject toField = getUiObjectByText("To", "android.widget.TextView"); + logger.start(); + toField.setText(recipient); + getUiDevice().getInstance().pressEnter(); + logger.stop(); + } + + public void setSubjectField() throws Exception { + String testTag = "text_subject"; + ActionLogger logger = new ActionLogger(testTag, parameters); + + UiObject subjectField = getUiObjectByText("Subject", "android.widget.EditText"); + logger.start(); + // Click on the subject field is required on some platforms to exit the To box cleanly + subjectField.click(); + subjectField.setText("This is a test message"); + getUiDevice().getInstance().pressEnter(); + logger.stop(); + } + + public void setComposeField() throws Exception { + String testTag = "text_body"; + ActionLogger logger = new ActionLogger(testTag, parameters); + + UiObject composeField = getUiObjectByText("Compose email", "android.widget.EditText"); + logger.start(); + composeField.setText("This is a test composition"); + getUiDevice().getInstance().pressEnter(); + logger.stop(); + } + + public void clickSendButton() throws Exception { + String testTag = "click_send"; + ActionLogger logger = new ActionLogger(testTag, parameters); + + UiObject sendButton = getUiObjectByDescription("Send", "android.widget.TextView"); + logger.start(); + sendButton.clickAndWaitForNewWindow(uiAutoTimeout); + logger.stop(); + sendButton.waitUntilGone(networkTimeoutSecs); + } +}