From 441ba974b79bbf4bc815153e48cf08c44924263b Mon Sep 17 00:00:00 2001 From: muendelezaji <muendelezaji@users.noreply.github.com> Date: Wed, 24 Aug 2016 10:20:21 +0100 Subject: [PATCH] Youtube workload --- wlauto/workloads/youtube/__init__.py | 90 +++++++ .../youtube/com.arm.wlauto.uiauto.youtube.jar | Bin 0 -> 13046 bytes wlauto/workloads/youtube/uiauto/build.sh | 39 +++ wlauto/workloads/youtube/uiauto/build.xml | 92 +++++++ .../youtube/uiauto/project.properties | 14 + .../com/arm/wlauto/uiauto/UiAutomation.java | 239 ++++++++++++++++++ 6 files changed, 474 insertions(+) create mode 100755 wlauto/workloads/youtube/__init__.py create mode 100644 wlauto/workloads/youtube/com.arm.wlauto.uiauto.youtube.jar create mode 100755 wlauto/workloads/youtube/uiauto/build.sh create mode 100644 wlauto/workloads/youtube/uiauto/build.xml create mode 100644 wlauto/workloads/youtube/uiauto/project.properties create mode 100644 wlauto/workloads/youtube/uiauto/src/com/arm/wlauto/uiauto/UiAutomation.java diff --git a/wlauto/workloads/youtube/__init__.py b/wlauto/workloads/youtube/__init__.py new file mode 100755 index 00000000..bef245df --- /dev/null +++ b/wlauto/workloads/youtube/__init__.py @@ -0,0 +1,90 @@ +# 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. +# + +from wlauto import AndroidUxPerfWorkload, Parameter +from wlauto.exceptions import WorkloadError + + +class Youtube(AndroidUxPerfWorkload): + + name = 'youtube' + package = 'com.google.android.youtube' + min_apk_version = '11.19.56' + max_apk_version = None # works with latest (11.33.58) at time of publishing this + activity = '' + description = ''' + A workload to perform standard productivity tasks within YouTube. + + The workload plays a video from the app, determined by the ``video_source`` parameter. + While the video is playing, a some common actions are done such as video seeking, pausing + playback and navigating the comments section. + + Test description: + The ``video_source`` parameter determines where the video to be played will be found + in the app. Possible values are ``search``, ``home``, ``my_videos``, and ``trending``. + -A. search - Goes to the search view, does a search for the given term, and plays the + first video in the results. The parameter ``search_term`` must also be provided + in the agenda for this to work. This is the default mode. + -B. home - Scrolls down once on the app's home page to avoid ads (if present, would be + first video), then select and plays the video that appears at the top of the list. + -C. my_videos - Goes to the 'My Videos' section of the user's account page and plays a + video from there. The user must have at least one uploaded video for this to work. + -D. trending - Goes to the 'Trending Videos' section of the app, and plays the first + video in the trending videos list. + + For the selected video source, the following test steps are performed: + 1. Navigate to the general app settings page to disable autoplay. This improves test + stability and predictability by preventing screen transition to load a new video + while in the middle of the test. + 2. Select the video from the source specified above, and dismiss any potential embedded + advert that may pop-up before the actual video. + 3. Let the video play for a few seconds, pause it, then resume. + 4. Expand the info card that shows video metadata, then collapse it again. + 5. Scroll down to the end of related videos and comments under the info card, and then + back up to the start. A maximum of 5 swipe actions is performed in either direction. + ''' + + parameters = [ + Parameter('video_source', kind=str, default='search', + allowed_values=['home', 'my_videos', 'search', 'trending'], + description=''' + Determines where to play the video from. This can either be from the + YouTube home, my videos section, trending videos or found in search. + '''), + Parameter('search_term', kind=str, + default='Big Buck Bunny 60fps 4K - Official Blender Foundation Short Film', + description=''' + The search term to use when ``video_source`` is set to ``search``. Ignored otherwise. + '''), + ] + + view = [ + package + '/com.google.android.apps.youtube.app.WatchWhileActivity', + package + '/com.google.android.apps.youtube.app.honeycomb.SettingsActivity', + ] + + requires_network = True + + def __init__(self, device, **kwargs): + super(Youtube, self).__init__(device, **kwargs) + self.run_timeout = 300 + + def validate(self): + if self.video_source == 'search' and not self.search_term: + raise WorkloadError("Param 'search_term' must be specified when video source is 'search'") + + self.uiauto_params['package'] = self.package + self.uiauto_params['video_source'] = self.video_source + self.uiauto_params['search_term'] = self.search_term.replace(' ', '0space0') diff --git a/wlauto/workloads/youtube/com.arm.wlauto.uiauto.youtube.jar b/wlauto/workloads/youtube/com.arm.wlauto.uiauto.youtube.jar new file mode 100644 index 0000000000000000000000000000000000000000..218135c5468c9c5554e0ad86b01402375abae1c4 GIT binary patch literal 13046 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 literal 0 HcmV?d00001 diff --git a/wlauto/workloads/youtube/uiauto/build.sh b/wlauto/workloads/youtube/uiauto/build.sh new file mode 100755 index 00000000..c7d05cfc --- /dev/null +++ b/wlauto/workloads/youtube/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.youtube.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/youtube/uiauto/build.xml b/wlauto/workloads/youtube/uiauto/build.xml new file mode 100644 index 00000000..b0e91680 --- /dev/null +++ b/wlauto/workloads/youtube/uiauto/build.xml @@ -0,0 +1,92 @@ +<?xml version="1.0" encoding="UTF-8"?> +<project name="com.arm.wlauto.uiauto.youtube" default="help"> + + <!-- The local.properties file is created and updated by the 'android' tool. + It contains the path to the SDK. It should *NOT* be checked into + Version Control Systems. --> + <property file="local.properties" /> + + <!-- The ant.properties file can be created by you. It is only edited by the + 'android' tool to add properties to it. + This is the place to change some Ant specific build properties. + Here are some properties you may want to change/update: + + source.dir + The name of the source directory. Default is 'src'. + out.dir + The name of the output directory. Default is 'bin'. + + For other overridable properties, look at the beginning of the rules + files in the SDK, at tools/ant/build.xml + + Properties related to the SDK location or the project target should + be updated using the 'android' tool with the 'update' action. + + This file is an integral part of the build system for your + application and should be checked into Version Control Systems. + + --> + <property file="ant.properties" /> + + <!-- if sdk.dir was not set from one of the property file, then + get it from the ANDROID_HOME env var. + This must be done before we load project.properties since + the proguard config can use sdk.dir --> + <property environment="env" /> + <condition property="sdk.dir" value="${env.ANDROID_HOME}"> + <isset property="env.ANDROID_HOME" /> + </condition> + + <!-- The project.properties file is created and updated by the 'android' + tool, as well as ADT. + + This contains project specific properties such as project target, and library + dependencies. Lower level build properties are stored in ant.properties + (or in .classpath for Eclipse projects). + + This file is an integral part of the build system for your + application and should be checked into Version Control Systems. --> + <loadproperties srcFile="project.properties" /> + + <!-- quick check on sdk.dir --> + <fail + message="sdk.dir is missing. Make sure to generate local.properties using 'android update project' or to inject it through the ANDROID_HOME environment variable." + unless="sdk.dir" + /> + + <!-- + Import per project custom build rules if present at the root of the project. + This is the place to put custom intermediary targets such as: + -pre-build + -pre-compile + -post-compile (This is typically used for code obfuscation. + Compiled code location: ${out.classes.absolute.dir} + If this is not done in place, override ${out.dex.input.absolute.dir}) + -post-package + -post-build + -pre-clean + --> + <import file="custom_rules.xml" optional="true" /> + + <!-- Import the actual build file. + + To customize existing targets, there are two options: + - Customize only one target: + - copy/paste the target into this file, *before* the + <import> task. + - customize it to your needs. + - Customize the whole content of build.xml + - copy/paste the content of the rules files (minus the top node) + into this file, replacing the <import> task. + - customize to your needs. + + *********************** + ****** IMPORTANT ****** + *********************** + In all cases you must update the value of version-tag below to read 'custom' instead of an integer, + in order to avoid having your file be overridden by tools such as "android update project" + --> + <!-- version-tag: VERSION_TAG --> + <import file="${sdk.dir}/tools/ant/uibuild.xml" /> + +</project> diff --git a/wlauto/workloads/youtube/uiauto/project.properties b/wlauto/workloads/youtube/uiauto/project.properties new file mode 100644 index 00000000..ce39f2d0 --- /dev/null +++ b/wlauto/workloads/youtube/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/youtube/uiauto/src/com/arm/wlauto/uiauto/UiAutomation.java b/wlauto/workloads/youtube/uiauto/src/com/arm/wlauto/uiauto/UiAutomation.java new file mode 100644 index 00000000..339bd0bf --- /dev/null +++ b/wlauto/workloads/youtube/uiauto/src/com/arm/wlauto/uiauto/UiAutomation.java @@ -0,0 +1,239 @@ +/* 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.youtube; + +import android.os.Bundle; +import android.os.SystemClock; +import android.util.Log; + +// Import the uiautomator libraries +import com.android.uiautomator.core.UiObject; +import com.android.uiautomator.core.UiScrollable; +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; + +public class UiAutomation extends UxPerfUiAutomation { + + public static final String CLASS_BUTTON = "android.widget.Button"; + public static final String CLASS_TEXT_VIEW = "android.widget.TextView"; + + public static final int WAIT_TIMEOUT_1SEC = 1000; + public static final int WAIT_TIMEOUT_5SEC = 5000; + public static final int VIDEO_SLEEP_SECONDS = 3; + public static final int LIST_SWIPE_COUNT = 5; + public static final String SOURCE_MY_VIDEOS = "my_videos"; + public static final String SOURCE_SEARCH = "search"; + public static final String SOURCE_TRENDING = "trending"; + + protected ActionLogger logger; + protected Bundle parameters; + protected String packageName; + protected String packageID; + protected String searchTerm; + + public void runUiAutomation() throws Exception { + parameters = getParams(); + packageName = parameters.getString("package"); + packageID = packageName + ":id/"; + searchTerm = parameters.getString("search_term"); + if (searchTerm != null) { + searchTerm = searchTerm.replaceAll("0space0", " "); + } + + setScreenOrientation(ScreenOrientation.NATURAL); + clearFirstRunDialogues(); + disableAutoplay(); + testPlayVideo(parameters.getString("video_source"), searchTerm); + unsetScreenOrientation(); + } + + public void clearFirstRunDialogues() throws Exception { + UiObject laterButton = new UiObject(new UiSelector().textContains("Later").className(CLASS_TEXT_VIEW)); + if (laterButton.waitForExists(WAIT_TIMEOUT_1SEC)) { + laterButton.click(); + } + UiObject cancelButton = new UiObject(new UiSelector().textContains("Cancel").className(CLASS_BUTTON)); + if (cancelButton.waitForExists(WAIT_TIMEOUT_1SEC)) { + cancelButton.click(); + } + UiObject skipButton = new UiObject(new UiSelector().textContains("Skip").className(CLASS_TEXT_VIEW)); + if (skipButton.waitForExists(WAIT_TIMEOUT_1SEC)) { + skipButton.click(); + } + UiObject gotItButton = new UiObject(new UiSelector().textContains("Got it").className(CLASS_BUTTON)); + if (gotItButton.waitForExists(WAIT_TIMEOUT_1SEC)) { + gotItButton.click(); + } + } + + public void disableAutoplay() throws Exception { + clickUiObject(BY_DESC, "More options"); + startMeasurements("goto_settings"); + clickUiObject(BY_TEXT, "Settings", true); + endMeasurements("goto_settings"); + startMeasurements("goto_settings_general"); + clickUiObject(BY_TEXT, "General", true); + endMeasurements("goto_settings_general"); + + // Don't fail fatally if autoplay toggle cannot be found + UiObject autoplayToggle = new UiObject(new UiSelector().textContains("Autoplay")); + if (autoplayToggle.waitForExists(WAIT_TIMEOUT_1SEC)) { + autoplayToggle.click(); + } + getUiDevice().pressBack(); + + // Tablet devices use a split with General in the left pane and Autoplay in the right so no + // need to click back twice + UiObject generalButton = new UiObject(new UiSelector().textContains("General").className(CLASS_TEXT_VIEW)); + if (generalButton.exists()) { + getUiDevice().pressBack(); + } + } + + public void testPlayVideo(String source, String searchTerm) throws Exception { + if (SOURCE_MY_VIDEOS.equalsIgnoreCase(source)) { + startMeasurements("goto_account"); + clickUiObject(BY_DESC, "Account"); + endMeasurements("goto_account"); + startMeasurements("goto_my_videos"); + clickUiObject(BY_TEXT, "My Videos", true); + endMeasurements("goto_my_videos"); + + startMeasurements("play_from_my_videos"); + clickUiObject(BY_ID, packageID + "thumbnail", true); + endMeasurements("play_from_my_videos"); + + } else if (SOURCE_SEARCH.equalsIgnoreCase(source)) { + startMeasurements("goto_search"); + clickUiObject(BY_DESC, "Search"); + endMeasurements("goto_search"); + + startMeasurements("search_video"); + UiObject textField = getUiObjectByResourceId(packageID + "search_edit_text"); + textField.setText(searchTerm); + endMeasurements("search_video"); + + getUiDevice().pressEnter(); + startMeasurements("play_from_search"); + // If a video exists whose title contains the exact search term, then play it + // Otherwise click the first video in the search results + UiObject thumbnail = new UiObject(new UiSelector().resourceId(packageID + "thumbnail")); + UiObject matchedVideo = thumbnail.getFromParent(new UiSelector().textContains(searchTerm)); + if (matchedVideo.exists()) { + matchedVideo.clickAndWaitForNewWindow(); + } else { + thumbnail.clickAndWaitForNewWindow(); + } + endMeasurements("play_from_search"); + + } else if (SOURCE_TRENDING.equalsIgnoreCase(source)) { + startMeasurements("goto_trending"); + clickUiObject(BY_DESC, "Trending"); + endMeasurements("goto_trending"); + + startMeasurements("play_from_trending"); + clickUiObject(BY_ID, packageID + "thumbnail", true); + endMeasurements("play_from_trending"); + + } else { // homepage videos + UiScrollable list = new UiScrollable(new UiSelector().resourceId(packageID + "results")); + if (list.exists()) { + list.scrollForward(); + } + startMeasurements("play_from_home"); + clickUiObject(BY_ID, packageID + "thumbnail", true); + endMeasurements("play_from_home"); + } + + dismissAdvert(); + checkPlayerError(); + pausePlayVideo(); + checkVideoInfo(); + scrollRelated(); + } + + public void dismissAdvert() throws Exception { + UiObject advert = new UiObject(new UiSelector().textContains("Visit advertiser")); + if (advert.exists()) { + UiObject skip = new UiObject(new UiSelector().textContains("Skip ad")); + if (skip.waitForExists(WAIT_TIMEOUT_5SEC)) { + skip.click(); + sleep(VIDEO_SLEEP_SECONDS); + } + } + } + + public void checkPlayerError() throws Exception { + UiObject playerError = new UiObject(new UiSelector().resourceId(packageID + "player_error_view")); + UiObject tapToRetry = new UiObject(new UiSelector().textContains("Tap to retry")); + if (playerError.waitForExists(WAIT_TIMEOUT_1SEC) || tapToRetry.waitForExists(WAIT_TIMEOUT_1SEC)) { + throw new RuntimeException("Video player encountered an error and cannot continue."); + } + } + + public void pausePlayVideo() throws Exception { + UiObject player = getUiObjectByResourceId(packageID + "player_fragment_container"); + sleep(VIDEO_SLEEP_SECONDS); + repeatClickUiObject(player, 2, 100); + sleep(1); // pause the video momentarily + player.click(); + startMeasurements("player_video_windowed"); + sleep(VIDEO_SLEEP_SECONDS); + endMeasurements("player_video_windowed"); + } + + public void checkVideoInfo() throws Exception { + UiObject expandButton = new UiObject(new UiSelector().resourceId(packageID + "expand_button")); + if (!expandButton.waitForExists(WAIT_TIMEOUT_1SEC)) { + return; + } + // Expand video info + expandButton.click(); + SystemClock.sleep(500); // short delay to simulate user action + expandButton.click(); + } + + public void scrollRelated() throws Exception { + // ListView of related videos and (maybe) comments + UiScrollable list = new UiScrollable(new UiSelector().resourceId(packageID + "watch_list")); + if (list.isScrollable()) { + startMeasurements("watch_list_fling_down"); + list.flingToEnd(LIST_SWIPE_COUNT); + endMeasurements("watch_list_fling_down"); + + startMeasurements("watch_list_fling_up"); + list.flingToBeginning(LIST_SWIPE_COUNT); + endMeasurements("watch_list_fling_up"); + } + // After flinging, give the window enough time to settle down before + // the next step, or else UiAutomator fails to find views in time + sleep(VIDEO_SLEEP_SECONDS); + } + + protected void startMeasurements(String testTag) throws Exception { + logger = new ActionLogger(testTag, parameters); + logger.start(); + } + + protected void endMeasurements(String testTag) throws Exception { + logger.stop(); + } +}