From 4c5e0086097c946561d02b5d77be774b4e8fd523 Mon Sep 17 00:00:00 2001 From: Michael McGeagh Date: Tue, 27 Sep 2016 15:46:05 +0100 Subject: [PATCH] Reader Workload: The Adobe Reader workflow carries out typical productivity tasks. Conform to code style of other workloads. Changed search strings to be a list. Allows user the ability to search for 1 or more search terms. Renamed Reader to AdobeReader. Removed sleep and now detect and wait for searchicon --- wlauto/workloads/adobereader/__init__.py | 92 +++++++ .../com.arm.wlauto.uiauto.adobereader.jar | Bin 0 -> 13322 bytes wlauto/workloads/adobereader/uiauto/build.sh | 39 +++ wlauto/workloads/adobereader/uiauto/build.xml | 92 +++++++ .../adobereader/uiauto/project.properties | 14 + .../com/arm/wlauto/uiauto/UiAutomation.java | 246 ++++++++++++++++++ 6 files changed, 483 insertions(+) create mode 100755 wlauto/workloads/adobereader/__init__.py create mode 100644 wlauto/workloads/adobereader/com.arm.wlauto.uiauto.adobereader.jar create mode 100755 wlauto/workloads/adobereader/uiauto/build.sh create mode 100755 wlauto/workloads/adobereader/uiauto/build.xml create mode 100644 wlauto/workloads/adobereader/uiauto/project.properties create mode 100755 wlauto/workloads/adobereader/uiauto/src/com/arm/wlauto/uiauto/UiAutomation.java diff --git a/wlauto/workloads/adobereader/__init__.py b/wlauto/workloads/adobereader/__init__.py new file mode 100755 index 00000000..98f7c0c1 --- /dev/null +++ b/wlauto/workloads/adobereader/__init__.py @@ -0,0 +1,92 @@ +# 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 +from wlauto.utils.types import list_of_strings + + +class AdobeReader(AndroidUxPerfWorkload): + + name = 'adobereader' + package = 'com.adobe.reader' + min_apk_verson = '16.1.1' + activity = 'com.adobe.reader.AdobeReader' + view = [package + '/com.adobe.reader.help.AROnboardingHelpActivity', + package + '/com.adobe.reader.viewer.ARSplitPaneActivity', + package + '/com.adobe.reader.viewer.ARViewerActivity'] + description = ''' + The Adobe Reader workflow carries out the following typical productivity tasks. + + Test description: + 1. Open a local file on the device + 2. Gestures test: + 2.1. Swipe down across the central 50% of the screen in 200 x 5ms steps + 2.2. Swipe up across the central 50% of the screen in 200 x 5ms steps + 2.3. Swipe right from the edge of the screen in 50 x 5ms steps + 2.4. Swipe left from the edge of the screen in 50 x 5ms steps + 2.5. Pinch out 50% in 100 x 5ms steps + 2.6. Pinch In 50% in 100 x 5ms steps + 3. Search test: + Search ``document_name`` for each string in the ``search_string_list`` + 4. Close the document + ''' + + default_search_strings = [ + 'The quick brown fox jumps over the lazy dog', + 'TEST_SEARCH_STRING', + ] + + parameters = [ + Parameter('document_name', kind=str, default="uxperf_test_doc.pdf", + description=''' + The document name to use for the Gesture and Search test. + '''), + Parameter('search_string_list', kind=list_of_strings, default=default_search_strings, + constraint=lambda x: len(x) > 0, + description=''' + For each string in the list, a document search is performed + using the string as the search term. At least one must be + provided. + '''), + ] + + def __init__(self, device, **kwargs): + super(AdobeReader, self).__init__(device, **kwargs) + self.deployable_assets = [self.document_name] + # Adobe only looks for local files in a specific path + self.adobe_path = self.device.path.join(self.device.external_storage_directory, + 'Android', 'data', 'com.adobe.reader', 'files') + + def validate(self): + super(AdobeReader, self).validate() + self.uiauto_params['filename'] = self.document_name.replace(' ', '0space0') + self.uiauto_params['search_string_list'] = '0newline0'.join([x.replace(' ', '0space0') for x in self.search_string_list]) + # Only accept certain file formats + if os.path.splitext(self.document_name.lower())[1] not in ['.pdf']: + raise ValidationError('{} must be a PDF file'.format(self.document_name)) + + def setup(self, context): + super(AdobeReader, self).setup(context) + # Create the adobe path if it doesnt exist yet, and move the asset to this location + self.device.execute('mkdir -p {}'.format(self.adobe_path)) + self.device.execute('mv {0}/{1} {2}/{1}'.format(self.device.working_directory, self.document_name, self.adobe_path)) + + def teardown(self, context): + super(AdobeReader, self).teardown(context) + # Remove the asset from the adobe location + self.device.execute('rm -rf {0}/{1}'.format(self.adobe_path, self.document_name)) diff --git a/wlauto/workloads/adobereader/com.arm.wlauto.uiauto.adobereader.jar b/wlauto/workloads/adobereader/com.arm.wlauto.uiauto.adobereader.jar new file mode 100644 index 0000000000000000000000000000000000000000..f9f395ec75981b11a7f19f86a9440307d42623e0 GIT binary patch literal 13322 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 EFN3Nl7ytkO literal 0 HcmV?d00001 diff --git a/wlauto/workloads/adobereader/uiauto/build.sh b/wlauto/workloads/adobereader/uiauto/build.sh new file mode 100755 index 00000000..2c282fd8 --- /dev/null +++ b/wlauto/workloads/adobereader/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.adobereader.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/adobereader/uiauto/build.xml b/wlauto/workloads/adobereader/uiauto/build.xml new file mode 100755 index 00000000..30b09298 --- /dev/null +++ b/wlauto/workloads/adobereader/uiauto/build.xml @@ -0,0 +1,92 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/wlauto/workloads/adobereader/uiauto/project.properties b/wlauto/workloads/adobereader/uiauto/project.properties new file mode 100644 index 00000000..ce39f2d0 --- /dev/null +++ b/wlauto/workloads/adobereader/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/adobereader/uiauto/src/com/arm/wlauto/uiauto/UiAutomation.java b/wlauto/workloads/adobereader/uiauto/src/com/arm/wlauto/uiauto/UiAutomation.java new file mode 100755 index 00000000..509c3f19 --- /dev/null +++ b/wlauto/workloads/adobereader/uiauto/src/com/arm/wlauto/uiauto/UiAutomation.java @@ -0,0 +1,246 @@ +/* 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.adobereader; + +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 static com.arm.wlauto.uiauto.BaseUiAutomation.FindByCriteria.BY_ID; +import static com.arm.wlauto.uiauto.BaseUiAutomation.FindByCriteria.BY_TEXT; +import static com.arm.wlauto.uiauto.BaseUiAutomation.FindByCriteria.BY_DESC; + +import java.util.concurrent.TimeUnit; +import java.util.Iterator; +import java.util.LinkedHashMap; +import java.util.Map; +import java.util.Map.Entry; + +public class UiAutomation extends UxPerfUiAutomation { + + protected Bundle parameters; + protected String packageName; + protected String packageID; + + private long networkTimeout = TimeUnit.SECONDS.toMillis(20); + private long searchTimeout = TimeUnit.SECONDS.toMillis(20); + + public void runUiAutomation() throws Exception { + parameters = getParams(); + packageName = parameters.getString("package"); + packageID = packageName + ":id/"; + + String filename = parameters.getString("filename").replace("0space0", " "); + String[] searchStrings = + parameters.getString("search_string_list").replace("0space0", " ").split("0newline0"); + + setScreenOrientation(ScreenOrientation.NATURAL); + + dismissWelcomeView(); + openFile(filename); + gesturesTest(); + searchPdfTest(searchStrings); + exitDocument(); + + unsetScreenOrientation(); + } + + private void dismissWelcomeView() throws Exception { + UiObject welcomeView = getUiObjectByResourceId("android:id/content", + "android.widget.FrameLayout"); + welcomeView.swipeLeft(10); + welcomeView.swipeLeft(10); + + clickUiObject(BY_ID, packageID + "onboarding_finish_button", "android.widget.Button"); + + // Deal with popup dialog message promoting Dropbox access + UiObject dropBoxDialog = + new UiObject(new UiSelector().text("Now you can access your Dropbox files.") + .className("android.widget.TextView")); + if (dropBoxDialog.exists()) { + clickUiObject(BY_TEXT, "Remind Me Later", "android.widget.Button"); + } + + // Also deal with the Dropbox CoachMark blue hint popup + UiObject dropBoxcoachMark = + new UiObject(new UiSelector().description("CoachMark") + .className("android.widget.LinearLayout")); + if (dropBoxcoachMark.exists()) { + tapDisplayCentre(); + } + + UiObject actionBarTitle = getUiObjectByDescription("My Documents", + "android.widget.LinearLayout"); + actionBarTitle.waitForExists(uiAutoTimeout); + } + + private void openFile(final String filename) throws Exception { + String testTag = "open_document"; + ActionLogger logger = new ActionLogger(testTag, parameters); + + // Select the local files list from the My Documents view + clickUiObject(BY_TEXT, "LOCAL", "android.widget.TextView"); + UiObject directoryPath = + new UiObject(new UiSelector().resourceId(packageID + "directoryPath")); + if (!directoryPath.waitForExists(TimeUnit.SECONDS.toMillis(60))) { + throw new UiObjectNotFoundException("Could not find any local files"); + } + + // Click the button to search from the present file list view + UiObject searchButton = getUiObjectByResourceId(packageID + "split_pane_search", + "android.widget.TextView", + TimeUnit.SECONDS.toMillis(10)); + searchButton.click(); + + // Enter search text into the file searchBox. This will automatically filter the list. + UiObject searchBox = getUiObjectByResourceId("android:id/search_src_text", + "android.widget.EditText"); + searchBox.setText(filename); + + // Open a file from a file list view by searching for UiObjects containing the doc title. + UiObject fileObject = getUiObjectByText(filename, "android.widget.TextView"); + + logger.start(); + + fileObject.clickAndWaitForNewWindow(uiAutoTimeout); + // Wait for the doc to open by waiting for the viewPager UiObject to exist + UiObject viewPager = + new UiObject(new UiSelector().resourceId(packageID + "viewPager")); + if (!viewPager.waitForExists(uiAutoTimeout)) { + throw new UiObjectNotFoundException("Could not find \"viewPager\"."); + }; + + logger.stop(); + } + + private void gesturesTest() throws Exception { + String testTag = "gesture"; + + // Perform a range of swipe tests at different speeds and on different views + LinkedHashMap testParams = new LinkedHashMap(); + testParams.put("swipe_down", new GestureTestParams(GestureType.UIDEVICE_SWIPE, Direction.DOWN, 100)); + testParams.put("swipe_up", new GestureTestParams(GestureType.UIDEVICE_SWIPE, Direction.UP, 100)); + testParams.put("swipe_right", new GestureTestParams(GestureType.UIOBJECT_SWIPE, Direction.RIGHT, 50)); + testParams.put("swipe_left", new GestureTestParams(GestureType.UIOBJECT_SWIPE, Direction.LEFT, 50)); + testParams.put("pinch_out", new GestureTestParams(GestureType.PINCH, PinchType.OUT, 100, 50)); + testParams.put("pinch_in", new GestureTestParams(GestureType.PINCH, PinchType.IN, 100, 50)); + + Iterator> it = testParams.entrySet().iterator(); + + // On some devices the first device swipe is ignored so perform it here + // to prevent the first test gesture from being incorrectly logged + uiDeviceSwipe(Direction.DOWN, 200); + + UiObject view = + new UiObject(new UiSelector().resourceId(packageID + "pageView")); + if (!view.waitForExists(TimeUnit.SECONDS.toMillis(10))) { + throw new UiObjectNotFoundException("Could not find page view"); + } + + while (it.hasNext()) { + Map.Entry pair = it.next(); + GestureType type = pair.getValue().gestureType; + Direction dir = pair.getValue().gestureDirection; + PinchType pinch = pair.getValue().pinchType; + int steps = pair.getValue().steps; + int percent = pair.getValue().percent; + + String runName = String.format(testTag + "_" + pair.getKey()); + ActionLogger logger = new ActionLogger(runName, parameters); + logger.start(); + + switch (type) { + case UIDEVICE_SWIPE: + uiDeviceSwipe(dir, steps); + break; + case UIOBJECT_SWIPE: + uiObjectSwipe(view, dir, steps); + break; + case PINCH: + uiObjectVertPinch(view, pinch, steps, percent); + break; + default: + break; + } + + logger.stop(); + } + } + + private void searchPdfTest(final String[] searchStrings) throws Exception { + String testTag = "search"; + + // Tap the centre to bring up the menu gui + // Sometimes the first tap wont register, so check if search appears + // and if not, tap again before continuing + tapDisplayCentre(); + UiObject searchIcon = + new UiObject(new UiSelector().resourceId(packageID + "document_view_search_icon") + .className("android.widget.TextView")); + if (!searchIcon.waitForExists(uiAutoTimeout)) { + tapDisplayCentre(); + } + + for (int i = 0; i < searchStrings.length; i++) { + String runName = String.format(testTag + "_string" + i); + ActionLogger logger = new ActionLogger(runName, parameters); + + // Click on the search button icon and enter text in the box. This closes the keyboard + // so click the box again and press Enter to start the search. + searchIcon.clickAndWaitForNewWindow(); + + UiObject searchBox = getUiObjectByResourceId("android:id/search_src_text", + "android.widget.EditText"); + searchBox.setText(searchStrings[i]); + + logger.start(); + + getUiDevice().getInstance().pressSearch(); + pressEnter(); + + // Check the progress bar icon. When this disappears the search is complete. + UiObject progressBar = + new UiObject(new UiSelector().resourceId(packageID + "searchProgress") + .className("android.widget.ProgressBar")); + progressBar.waitForExists(uiAutoTimeout); + progressBar.waitUntilGone(searchTimeout); + + logger.stop(); + + // Get back to the main document view by clicking twice on the close button + UiObject searchCloseButton = clickUiObject(BY_ID, "android:id/search_close_btn", "android.widget.ImageView", true); + searchCloseButton.clickAndWaitForNewWindow(); + } + } + + private void exitDocument() throws Exception { + // Return from the document view to the file list view by pressing home and my documents. + UiObject homeButton = + new UiObject(new UiSelector().resourceId("android:id/home") + .className("android.widget.ImageView")); + if (!homeButton.waitForExists(uiAutoTimeout)) { + tapDisplayCentre(); + } + homeButton.clickAndWaitForNewWindow(); + clickUiObject(BY_DESC, "My Documents", "android.widget.LinearLayout", true); + clickUiObject(BY_ID, "android:id/up", "android.widget.ImageView", true); + } +}