From d4b2d873f017e309046fdd851a43b3905b0d2cbc Mon Sep 17 00:00:00 2001 From: John Richardson Date: Thu, 12 May 2016 11:37:54 +0100 Subject: [PATCH] Google Play Books workload A new workload for productivity tasks within Google Play Books --- .../common/android/BaseUiAutomation$1.class | Bin 1311 -> 1311 bytes wlauto/common/android/BaseUiAutomation.class | Bin 12090 -> 12186 bytes .../arm/wlauto/uiauto/BaseUiAutomation.java | 12 +- wlauto/workloads/googleplaybooks/__init__.py | 120 ++++++ .../com.arm.wlauto.uiauto.googleplaybooks.jar | Bin 0 -> 14506 bytes .../workloads/googleplaybooks/uiauto/build.sh | 39 ++ .../googleplaybooks/uiauto/build.xml | 92 ++++ .../googleplaybooks/uiauto/project.properties | 14 + .../com/arm/wlauto/uiauto/UiAutomation.java | 408 ++++++++++++++++++ 9 files changed, 681 insertions(+), 4 deletions(-) create mode 100644 wlauto/workloads/googleplaybooks/__init__.py create mode 100644 wlauto/workloads/googleplaybooks/com.arm.wlauto.uiauto.googleplaybooks.jar create mode 100755 wlauto/workloads/googleplaybooks/uiauto/build.sh create mode 100644 wlauto/workloads/googleplaybooks/uiauto/build.xml create mode 100644 wlauto/workloads/googleplaybooks/uiauto/project.properties create mode 100644 wlauto/workloads/googleplaybooks/uiauto/src/com/arm/wlauto/uiauto/UiAutomation.java diff --git a/wlauto/common/android/BaseUiAutomation$1.class b/wlauto/common/android/BaseUiAutomation$1.class index 5f94fdc208c89a11adf127138369f8c1acf9dc3d..14a9cc7b6b73bf8cd5c9d7fbba23622cff875075 100644 GIT binary patch delta 17 YcmbQwHJ@w4Jr-6s1~W#U$&XoV05U!WDF6Tf delta 17 YcmbQwHJ@w4Jr-6c1~W#E$&XoV05S#zApigX diff --git a/wlauto/common/android/BaseUiAutomation.class b/wlauto/common/android/BaseUiAutomation.class index d8831cb5cb06f6dfb1060dee20533f7fbf9febb5..5e89288eb2f2c4d3cfc58c0c9f2975c7402df1e1 100644 GIT binary patch literal 12186 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 diff --git a/wlauto/external/uiauto/src/com/arm/wlauto/uiauto/BaseUiAutomation.java b/wlauto/external/uiauto/src/com/arm/wlauto/uiauto/BaseUiAutomation.java index 7218d2a0..fae8f5a0 100644 --- a/wlauto/external/uiauto/src/com/arm/wlauto/uiauto/BaseUiAutomation.java +++ b/wlauto/external/uiauto/src/com/arm/wlauto/uiauto/BaseUiAutomation.java @@ -152,6 +152,14 @@ public class BaseUiAutomation extends UiAutomatorTestCase { return object; } + public void pressEnter() { + getUiDevice().getInstance().pressEnter(); + } + + public void pressBack() { + getUiDevice().getInstance().pressBack(); + } + public int getDisplayHeight () { return getUiDevice().getInstance().getDisplayHeight(); } @@ -176,10 +184,6 @@ public class BaseUiAutomation extends UiAutomatorTestCase { getUiDevice().getInstance().click(x, y); } - public void pressBack() { - getUiDevice().getInstance().pressBack(); - } - public void uiDeviceSwipeUp (int steps) { getUiDevice().getInstance().swipe( getDisplayCentreWidth(), diff --git a/wlauto/workloads/googleplaybooks/__init__.py b/wlauto/workloads/googleplaybooks/__init__.py new file mode 100644 index 00000000..3b1c44e5 --- /dev/null +++ b/wlauto/workloads/googleplaybooks/__init__.py @@ -0,0 +1,120 @@ +# 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 +import re + +from wlauto import AndroidUiAutoBenchmark, Parameter +from wlauto.exceptions import DeviceError + +__version__ = '0.1.0' + + +class Googleplaybooks(AndroidUiAutoBenchmark): + + name = 'googleplaybooks' + package = 'com.google.android.apps.books' + activity = 'com.google.android.apps.books.app.BooksActivity' + view = [package + '/com.google.android.apps.books.app.HomeActivity', + package + '/com.android.vending/com.google.android.finsky.activities.MainActivity', + package + '/com.google.android.apps.books.app.ReadingActivity', + package + '/com.google.android.apps.books.app.TableOfContentsActivityLight'] + description = """ + A workload to perform standard productivity tasks with googleplaybooks. + This workload performs various tasks, such as searching for a book title + online, browsing through a book, adding and removing notes, word searching, + and querying information about the book. + + Test description: + 1. Open Google Play Books application + 2. Dismisses sync operation (if applicable) + 3. Searches for a book title + 4. Gestures are performed to swipe between pages and pinch zoom in and out of a page + 5. Selects a random chapter from the navigation view + 6. Selects a word in the centre of screen and adds a test note to the page + 7. Removes the test note from the page (clean up) + 8. Searches for the number of occurrences of a common word throughout the book + 9. Uses the 'About this book' facility on the currently selected book + + NOTE: This workload requires a network connection (ideally, wifi) to run. + """ + + parameters = [ + Parameter('search_book_title', kind=str, mandatory=False, default='Shakespeare', + description=""" + The book title to search for within Google Play Books archive. + Note: spaces must be replaced with underscores in the book title. + """), + Parameter('search_word', kind=str, mandatory=False, default='the', + description=""" + The word to search for within a selected book. + Note: Accepts single words only. + """), + 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(Googleplaybooks, self).__init__(device, **kwargs) + self.output_file = os.path.join(self.device.working_directory, self.instrumentation_log) + + def validate(self): + super(Googleplaybooks, self).validate() + 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 + self.uiauto_params['book_title'] = self.search_book_title + self.uiauto_params['search_word'] = self.search_word + + def initialize(self, context): + super(Googleplaybooks, self).initialize(context) + + if not self.device.is_wifi_connected(): + raise DeviceError('Wifi is not connected for device {}'.format(self.device.name)) + + def update_result(self, context): + super(Googleplaybooks, self).update_result(context) + + 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: + pattern = r'(?P\w+)\s+(?P\d+)\s+(?P\d+)\s+(?P\d+)' + regex = re.compile(pattern) + for line in wfh: + match = regex.search(line) + if match: + context.result.add_metric((match.group('key') + "_start"), + match.group('value1'), units='ms') + context.result.add_metric((match.group('key') + "_finish"), + match.group('value2'), units='ms') + context.result.add_metric((match.group('key') + "_duration"), + match.group('value3'), units='ms') + + def teardown(self, context): + super(Googleplaybooks, self).teardown(context) + + for entry in self.device.listdir(self.device.working_directory): + if entry.endswith(".log"): + self.device.pull_file(os.path.join(self.device.working_directory, entry), + context.output_directory) + self.device.delete_file(os.path.join(self.device.working_directory, entry)) diff --git a/wlauto/workloads/googleplaybooks/com.arm.wlauto.uiauto.googleplaybooks.jar b/wlauto/workloads/googleplaybooks/com.arm.wlauto.uiauto.googleplaybooks.jar new file mode 100644 index 0000000000000000000000000000000000000000..6200afd8a4a890a9221ce2a799f37aa5be40e9bb GIT binary patch literal 14506 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 Bmtz0` literal 0 HcmV?d00001 diff --git a/wlauto/workloads/googleplaybooks/uiauto/build.sh b/wlauto/workloads/googleplaybooks/uiauto/build.sh new file mode 100755 index 00000000..468663cf --- /dev/null +++ b/wlauto/workloads/googleplaybooks/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.googleplaybooks.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/googleplaybooks/uiauto/build.xml b/wlauto/workloads/googleplaybooks/uiauto/build.xml new file mode 100644 index 00000000..8771d5ab --- /dev/null +++ b/wlauto/workloads/googleplaybooks/uiauto/build.xml @@ -0,0 +1,92 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/wlauto/workloads/googleplaybooks/uiauto/project.properties b/wlauto/workloads/googleplaybooks/uiauto/project.properties new file mode 100644 index 00000000..ce39f2d0 --- /dev/null +++ b/wlauto/workloads/googleplaybooks/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/googleplaybooks/uiauto/src/com/arm/wlauto/uiauto/UiAutomation.java b/wlauto/workloads/googleplaybooks/uiauto/src/com/arm/wlauto/uiauto/UiAutomation.java new file mode 100644 index 00000000..7086b762 --- /dev/null +++ b/wlauto/workloads/googleplaybooks/uiauto/src/com/arm/wlauto/uiauto/UiAutomation.java @@ -0,0 +1,408 @@ +/* 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.googleplaybooks; + +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; +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_googleplaybooks"; + + public Bundle parameters; + private int viewTimeoutSecs = 10; + private long viewTimeout = TimeUnit.SECONDS.toMillis(viewTimeoutSecs); + private LinkedHashMap timingResults = new LinkedHashMap(); + + public void runUiAutomation() throws Exception { + this.timeout = TimeUnit.SECONDS.toMillis(8); + + parameters = getParams(); + + String bookTitle = parameters.getString("book_title").replace("_", " "); + String searchWord = parameters.getString("search_word"); + String noteText = "This is a test note"; + + setScreenOrientation(ScreenOrientation.NATURAL); + clearFirstRunDialogues(); + dismissSync(); + + openMyLibrary(); + searchForBook(bookTitle); + + selectBook(0); // Select the first book + gesturesTest(); + selectRandomChapter(); + addNote(noteText); + removeNote(); + searchForWord(searchWord); + switchPageStyles(); + aboutBook(); + + pressBack(); + unsetScreenOrientation(); + + writeResultsToFile(timingResults, parameters.getString("output_file")); + } + + private void dismissSync() throws Exception { + UiObject keepSyncOff = + new UiObject(new UiSelector().textContains("Keep sync off") + .className("android.widget.Button")); + if (keepSyncOff.exists()) { + keepSyncOff.click(); + } + } + + // If there is no sample book in My library we must choose a book the first + // time application is run + private void clearFirstRunDialogues() throws Exception { + UiObject endButton = + new UiObject(new UiSelector().resourceId("com.google.android.apps.books:id/end_button")); + + // Click next button if it exists + if (endButton.exists()) { + endButton.click(); + + // Select a random sample book to add to My library + sleep(1); + tapDisplayCentre(); + sleep(1); + + // Click done button (uses same resource-id) + endButton.click(); + } + } + + private void openMyLibrary() throws Exception { + Timer result = new Timer(); + result.start(); + + UiObject openDrawer = getUiObjectByDescription("Show navigation drawer", + "android.widget.ImageButton"); + openDrawer.click(); + + // To correctly find the UiObject we need to specify the index also here + UiObject myLibrary = + new UiObject(new UiSelector().className("android.widget.TextView") + .text("My library").index(3)); + myLibrary.clickAndWaitForNewWindow(timeout); + + result.end(); + + timingResults.put("open_library", result); + } + + private void searchForBook(final String text) throws Exception { + Timer result = new Timer(); + result.start(); + UiObject search = + new UiObject(new UiSelector().resourceId("com.google.android.apps.books:id/menu_search")); + search.click(); + + UiObject searchText = + getUiObjectByResourceId("com.google.android.apps.books:id/search_src_text", + "android.widget.EditText"); + + searchText.setText(text); + pressEnter(); + + UiObject resultList = + new UiObject(new UiSelector().resourceId("com.android.vending:id/search_results_list")); + + if (!resultList.waitForExists(viewTimeout)) { + throw new UiObjectNotFoundException("Could not find \"search results list view\"."); + } + + result.end(); + timingResults.put("search_for_book", result); + pressBack(); + } + + + private void gesturesTest() throws Exception { + String testTag = "gestures"; + + // Perform a range of swipe tests while browsing home photoplaybooks gallery + LinkedHashMap testParams = new LinkedHashMap(); + testParams.put("swipe_left", new GestureTestParams(GestureType.UIDEVICE_SWIPE, Direction.LEFT, 10)); + testParams.put("swipe_right", new GestureTestParams(GestureType.UIDEVICE_SWIPE, Direction.RIGHT, 10)); + 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(); + + 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()); + String gfxInfologName = String.format(runName + "_gfxInfo.log"); + String surfFlingerlogName = String.format(runName + "_surfFlinger.log"); + + UiObject pageView = getPageView(); + + if (!pageView.waitForExists(viewTimeout)) { + throw new UiObjectNotFoundException("Could not find \"page view\"."); + } + + startDumpsysGfxInfo(parameters); + startDumpsysSurfaceFlinger(parameters); + + Timer result = new Timer(); + + switch (type) { + case UIDEVICE_SWIPE: + result = uiDeviceSwipeTest(dir, steps); + break; + case UIOBJECT_SWIPE: + result = uiObjectSwipeTest(pageView, dir, steps); + break; + case PINCH: + result = uiObjectVertPinchTest(pageView, pinch, steps, percent); + break; + default: + break; + } + + stopDumpsysSurfaceFlinger(parameters, surfFlingerlogName); + stopDumpsysGfxInfo(parameters, gfxInfologName); + + timingResults.put(runName, result); + } + + if (!getPageView().waitForExists(viewTimeout)) { + throw new UiObjectNotFoundException("Could not find \"page view\"."); + } + } + + private void selectRandomChapter() throws Exception { + String testTag = "select_random_chapter"; + String gfxInfologName = String.format(testTag + "_gfxInfo.log"); + String surfFlingerlogName = String.format(testTag + "_surfFlinger.log"); + + getDropdownMenu(); + + Timer result = new Timer(); + result.start(); + UiObject contents = getUiObjectByResourceId("com.google.android.apps.books:id/menu_reader_toc", + "android.widget.TextView"); + contents.clickAndWaitForNewWindow(timeout); + + UiObject toChapterView = getUiObjectByResourceId("com.google.android.apps.books:id/toc_list_view", + "android.widget.ExpandableListView"); + + startDumpsysGfxInfo(parameters); + startDumpsysSurfaceFlinger(parameters); + toChapterView.swipeUp(100); + tapDisplayCentre(); + + stopDumpsysSurfaceFlinger(parameters, surfFlingerlogName); + stopDumpsysGfxInfo(parameters, gfxInfologName); + + waitForPage(); + + result.end(); + timingResults.put(testTag, result); + } + + private void addNote(final String text) throws Exception { + Timer result = new Timer(); + result.start(); + + UiObject clickable = new UiObject(new UiSelector().longClickable(true)); + uiDevicePerformLongClick(clickable, 100); + UiObject addNoteButton = getUiObjectByResourceId("com.google.android.apps.books:id/add_note_button", + "android.widget.ImageButton"); + addNoteButton.click(); + + UiObject noteEditText = getUiObjectByResourceId("com.google.android.apps.books:id/note_edit_text", + "android.widget.EditText"); + noteEditText.setText(text); + + UiObject noteMenuButton = getUiObjectByResourceId("com.google.android.apps.books:id/note_menu_button", + "android.widget.ImageButton"); + noteMenuButton.click(); + + UiObject saveButton = getUiObjectByText("Save", "android.widget.TextView"); + saveButton.click(); + + waitForPage(); + + result.end(); + timingResults.put("add_note", result); + } + + private void removeNote() throws Exception { + Timer result = new Timer(); + result.start(); + UiObject clickable = new UiObject(new UiSelector().longClickable(true)); + uiDevicePerformLongClick(clickable, 100); + + UiObject removeButton = getUiObjectByResourceId("com.google.android.apps.books:id/remove_highlight_button", + "android.widget.ImageButton"); + removeButton.click(); + + UiObject confirmRemove = getUiObjectByText("Remove", "android.widget.Button"); + confirmRemove.click(); + + waitForPage(); + + result.end(); + timingResults.put("remove_note", result); + } + + private void searchForWord(final String text) throws Exception { + getDropdownMenu(); + Timer result = new Timer(); + result.start(); + UiObject search = new UiObject( + new UiSelector().resourceId("com.google.android.apps.books:id/menu_search")); + search.click(); + + + + UiObject searchText = new UiObject( + new UiSelector().resourceId("com.google.android.apps.books:id/search_src_text")); + searchText.setText(text); + pressEnter(); + + UiObject resultList = new UiObject( + new UiSelector().resourceId("com.google.android.apps.books:id/search_results_list")); + + if (!resultList.waitForExists(viewTimeout)) { + throw new UiObjectNotFoundException("Could not find \"search results list view\"."); + } + + UiObject searchWeb = + new UiObject(new UiSelector().text("Search web") + .className("android.widget.TextView")); + + if (!searchWeb.waitForExists(viewTimeout)) { + throw new UiObjectNotFoundException("Could not find \"Search web view\"."); + } + + result.end(); + timingResults.put("search_for_word", result); + + pressBack(); + } + + private void switchPageStyles() throws Exception { + + String testTag = "switch_page_style"; + String gfxInfologName = String.format(testTag + "_gfxInfo.log"); + + getDropdownMenu(); + UiObject readerSettings = getUiObjectByResourceId("com.google.android.apps.books:id/menu_reader_settings", + "android.widget.TextView"); + readerSettings.click(); + + String[] styles = {"Night", "Sepia", "Day"}; + + startDumpsysGfxInfo(parameters); + + for (String style : styles) { + Timer result = new Timer(); + result.start(); + UiObject pageStyle = getUiObjectByDescription(style, "android.widget.TextView"); + pageStyle.clickAndWaitForNewWindow(viewTimeout); + result.end(); + timingResults.put(String.format(testTag + "_" + style), result); + } + + stopDumpsysGfxInfo(parameters, gfxInfologName); + pressBack(); + } + + private void aboutBook() throws Exception { + getDropdownMenu(); + Timer result = new Timer(); + result.start(); + + UiObject moreOptions = getUiObjectByDescription("More options", "android.widget.ImageView"); + moreOptions.click(); + + UiObject bookInfo = getUiObjectByText("About this book", "android.widget.TextView"); + bookInfo.clickAndWaitForNewWindow(timeout); + + UiObject detailsPanel = + new UiObject(new UiSelector().resourceId("com.android.vending:id/item_details_panel")); + waitObject(detailsPanel, viewTimeoutSecs); + result.end(); + + timingResults.put("about_book", result); + pressBack(); + } + + // Helper to click on an individual book based on index in My library gallery. + private void selectBook(final int index) throws Exception { + + UiObject book = + new UiObject(new UiSelector().resourceId("com.google.android.apps.books:id/cards_grid") + .childSelector(new UiSelector() + .index(index + 1) // adjust for zero index + .className("android.widget.FrameLayout") + .clickable(true))); + book.clickAndWaitForNewWindow(); + + if (!getPageView().waitForExists(viewTimeout)) { + throw new UiObjectNotFoundException("Could not find \"page view\"."); + } + } + + // Helper for accessing the drop down menu + private void getDropdownMenu() throws Exception { + sleep(1); // Allow previous views to settle + int height = getDisplayHeight(); + int width = getDisplayCentreWidth(); + getUiDevice().swipe(width, 5, width, height / 10, 20); + } + + // Helper for returning common UiObject page view + private UiObject getPageView() { + return new UiObject(new UiSelector().resourceId("com.google.android.apps.books:id/book_view") + .childSelector(new UiSelector() + .focusable(true))); + } + + // Helper for waiting on a page between actions + private void waitForPage() throws Exception { + UiObject activityReader = + new UiObject(new UiSelector().resourceId("com.google.android.apps.books:id/activity_reader") + .childSelector(new UiSelector().focusable(true))); + + if (!activityReader.waitForExists(viewTimeout)) { + throw new UiObjectNotFoundException("Could not find \"activity reader view\"."); + } + } +}