From 055da519d264c4e28d0a100d031a7b094fcea9d7 Mon Sep 17 00:00:00 2001 From: muendelezaji Date: Tue, 3 May 2016 14:35:44 +0100 Subject: [PATCH] Add Skype workload - Makes a video or voice call - actions and accounts to use have to be specified in agenda. See template-agenda - Instrumentation to follow soon --- wlauto/workloads/.gitignore | 3 + wlauto/workloads/skypeecho/__init__.py | 100 +++++++++++++++++ .../arm/wlauto/uiauto/BaseUiAutomation.class | Bin 0 -> 6482 bytes .../com.arm.wlauto.uiauto.skypeecho.jar | Bin 0 -> 4883 bytes .../skypeecho/template-agenda.mustache | 12 ++ wlauto/workloads/skypeecho/uiauto/build.sh | 17 +++ wlauto/workloads/skypeecho/uiauto/build.xml | 92 +++++++++++++++ .../skypeecho/uiauto/project.properties | 14 +++ .../com/arm/wlauto/uiauto/UiAutomation.java | 105 ++++++++++++++++++ 9 files changed, 343 insertions(+) create mode 100644 wlauto/workloads/.gitignore create mode 100644 wlauto/workloads/skypeecho/__init__.py create mode 100644 wlauto/workloads/skypeecho/bin/classes/com/arm/wlauto/uiauto/BaseUiAutomation.class create mode 100644 wlauto/workloads/skypeecho/com.arm.wlauto.uiauto.skypeecho.jar create mode 100644 wlauto/workloads/skypeecho/template-agenda.mustache create mode 100755 wlauto/workloads/skypeecho/uiauto/build.sh create mode 100644 wlauto/workloads/skypeecho/uiauto/build.xml create mode 100644 wlauto/workloads/skypeecho/uiauto/project.properties create mode 100644 wlauto/workloads/skypeecho/uiauto/src/com/arm/wlauto/uiauto/UiAutomation.java diff --git a/wlauto/workloads/.gitignore b/wlauto/workloads/.gitignore new file mode 100644 index 00000000..3048cd49 --- /dev/null +++ b/wlauto/workloads/.gitignore @@ -0,0 +1,3 @@ +*.yaml +*.apk +*.json diff --git a/wlauto/workloads/skypeecho/__init__.py b/wlauto/workloads/skypeecho/__init__.py new file mode 100644 index 00000000..5421b7b7 --- /dev/null +++ b/wlauto/workloads/skypeecho/__init__.py @@ -0,0 +1,100 @@ +# 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 time + +from wlauto import AndroidUiAutoBenchmark, Parameter + + +SKYPE_ACTION_URIS = { + 'call': 'call', + 'video': 'call&video=true', +} + + +class SkypeEcho(AndroidUiAutoBenchmark): + + name = 'skypeecho' + description = 'Workload that makes a Skype test call' + package = 'com.skype.raider' + activity = '' + # Skype has no default 'main' activity + launch_main = False # overrides extended class + + parameters = [ + # Workload parameters go here e.g. + # Parameter('example_parameter', kind=int, allowed_values=[1,2,3], default=1, override=True, mandatory=False, + # description='This is an example parameter') + Parameter('login_name', kind=str, mandatory=True, + description=''' + Account to use when logging into the device from which the call will be made + '''), + Parameter('login_pass', kind=str, mandatory=True, + description='Password associated with the account to log into the device'), + Parameter('contact_skypeid', kind=str, mandatory=True, + description='This is the Skype ID of the contact to call from the device'), + Parameter('contact_name', kind=str, mandatory=True, + description='This is the contact display name as it appears in the people list'), + Parameter('duration', kind=int, default=60, + description='This is the duration of the call in seconds'), + Parameter('action', kind=str, allowed_values=['voice', 'video'], default='voice', + description='Action to take - either voice (default) or video call'), + Parameter('use_gui', kind=bool, default=True, + description='Specifies whether to use GUI or direct Skype URI'), + ] + + def __init__(self, device, **kwargs): + super(SkypeEcho, self).__init__(device, **kwargs) + if self.use_gui: + self.uiauto_params['my_id'] = self.login_name + self.uiauto_params['my_pwd'] = self.login_pass + self.uiauto_params['skypeid'] = self.contact_skypeid + self.uiauto_params['name'] = self.contact_name.replace(' ', '_') + self.uiauto_params['duration'] = self.duration + self.uiauto_params['action'] = self.action + self.run_timeout = self.duration + 30 + + def setup(self, context): + self.logger.info('===== setup() ======') + if self.use_gui: + super(SkypeEcho, self).setup(context) + self.device.execute('am force-stop {}'.format(self.package)) + self.device.execute('am start -W -a android.intent.action.VIEW -d skype:dummy?dummy') + time.sleep(1) + else: + self.device.execute('am force-stop {}'.format(self.package)) + + def run(self, context): + self.logger.info('===== run() ======') + if self.use_gui: + super(SkypeEcho, self).run(context) + else: + data_uri = 'skype:{}?{}'.format(self.contact_skypeid, SKYPE_ACTION_URIS[self.action]) + command = 'am start -W -a android.intent.action.VIEW -d "{}"'.format(data_uri) + self.logger.debug(self.device.execute(command)) + self.logger.debug('Call started; waiting for {} seconds...'.format(self.duration)) + time.sleep(self.duration) + self.device.execute('am force-stop {}'.format(self.package)) + + def update_result(self, context): + pass + # super(SkypeEcho, self).update_result(context) + # process results and add them using + # context.result.add_metric + + def teardown(self, context): + self.logger.info('===== teardown() ======') + super(SkypeEcho, self).teardown(context) + # self.device.execute('am force-stop {}'.format(self.package)) diff --git a/wlauto/workloads/skypeecho/bin/classes/com/arm/wlauto/uiauto/BaseUiAutomation.class b/wlauto/workloads/skypeecho/bin/classes/com/arm/wlauto/uiauto/BaseUiAutomation.class new file mode 100644 index 0000000000000000000000000000000000000000..3f507bb68625f4978761febd44e3f753b4bdc569 GIT binary patch literal 6482 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 JChgz5{{rj2GXVeq literal 0 HcmV?d00001 diff --git a/wlauto/workloads/skypeecho/template-agenda.mustache b/wlauto/workloads/skypeecho/template-agenda.mustache new file mode 100644 index 00000000..d861d194 --- /dev/null +++ b/wlauto/workloads/skypeecho/template-agenda.mustache @@ -0,0 +1,12 @@ +global: + iterations: 1 +workloads: + - id: {{workload_id}} + name: skypeecho + params: + login_name: {{login_name}} + login_pass: {{login_pass}} + contact_skypeid: {{contact_skypeid}} + contact_name: {{contact_name}} + duration: {{duration}} + action: {{action}} diff --git a/wlauto/workloads/skypeecho/uiauto/build.sh b/wlauto/workloads/skypeecho/uiauto/build.sh new file mode 100755 index 00000000..776bd5b8 --- /dev/null +++ b/wlauto/workloads/skypeecho/uiauto/build.sh @@ -0,0 +1,17 @@ +#!/bin/bash + +class_dir=bin/classes/com/arm/wlauto/uiauto +base_class=`python -c "import os, wlauto; print os.path.join(os.path.dirname(wlauto.__file__), 'common', 'android', '*.class')"` +mkdir -p $class_dir +cp $base_class $class_dir + +ant build + +exit_code=$? +if [[ $exit_code -ne 0 ]]; then + echo "ERROR: ant build exited with code $exit_code" && exit $exit_code +fi + +if [[ -f bin/com.arm.wlauto.uiauto.skypeecho.jar ]]; then + cp bin/com.arm.wlauto.uiauto.skypeecho.jar .. +fi diff --git a/wlauto/workloads/skypeecho/uiauto/build.xml b/wlauto/workloads/skypeecho/uiauto/build.xml new file mode 100644 index 00000000..77c86082 --- /dev/null +++ b/wlauto/workloads/skypeecho/uiauto/build.xml @@ -0,0 +1,92 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/wlauto/workloads/skypeecho/uiauto/project.properties b/wlauto/workloads/skypeecho/uiauto/project.properties new file mode 100644 index 00000000..6e18427a --- /dev/null +++ b/wlauto/workloads/skypeecho/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-21 diff --git a/wlauto/workloads/skypeecho/uiauto/src/com/arm/wlauto/uiauto/UiAutomation.java b/wlauto/workloads/skypeecho/uiauto/src/com/arm/wlauto/uiauto/UiAutomation.java new file mode 100644 index 00000000..60253868 --- /dev/null +++ b/wlauto/workloads/skypeecho/uiauto/src/com/arm/wlauto/uiauto/UiAutomation.java @@ -0,0 +1,105 @@ +package com.arm.wlauto.uiauto.skypeecho; + +import java.lang.Runnable; + +import android.app.Activity; +import android.os.Bundle; +import android.os.Handler; +import android.os.Looper; +import android.util.Log; +import android.view.KeyEvent; + +// 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.BaseUiAutomation; + +public class UiAutomation extends BaseUiAutomation { + + public static String TAG = "uxperf_skypeecho"; + + public static String PACKAGE = "com.skype.raider"; + + public static String sendSmsButtonResourceId = "com.skype.raider:id/chat_menu_item_send_sms"; + public static String voiceCallButtonResourceId = "com.skype.raider:id/chat_menu_item_call_voice"; + public static String videoCallButtonResourceId = "com.skype.raider:id/chat_menu_item_call_video"; + public static String endCallButtonResourceId = "com.skype.raider:id/call_end_button"; + public static String noContactMessage = "Could not find contact \"%s\" in the contacts list."; + + public void runUiAutomation() throws Exception { + Bundle parameters = getParams(); + String loginName = parameters.getString("my_id"); + String loginPass = parameters.getString("my_pwd"); + String contactSkypeid = parameters.getString("skypeid"); + String contactName = parameters.getString("name").replace("_", " "); + int callDuration = Integer.parseInt(parameters.getString("duration")); + boolean isVideo = "video".equals(parameters.getString("action")); + + handleLoginScreen(loginName, loginPass); + selectContact(contactName, contactSkypeid); + makeCall(callDuration, isVideo); + } + + public void selectContact(String name, String id) throws Exception { + // UiObject peopleTab = new UiObject(selector.text("People")); + UiObject peopleTab = getUiObjectByDescription("People", "android.widget.TextView"); + peopleTab.click(); + + // On first startup, the app may take a while to load the display name, so try twice + // before declaring failure + UiObject contactCard; + try { + contactCard = getUiObjectByText(name, "android.widget.TextView"); + } catch (UiObjectNotFoundException e) { + contactCard = getUiObjectByText(name, "android.widget.TextView"); + // contactCard = getUiObjectByText(id, "android.widget.TextView"); + } + contactCard.clickAndWaitForNewWindow(); + } + + public void makeCall(int duration, boolean video) throws Exception { + // String resource = video ? videoCallButtonResourceId : voiceCallButtonResourceId; + // UiObject callButton = new UiObject(new UiSelector().resourceId(resource)); + String description = video ? "Video call" : "Call options"; + UiObject callButton = new UiObject(new UiSelector().descriptionContains(description)); + callButton.click(); + sleep(duration); + // TODO Needs to be run on UI thread after sleep + /* + final UiObject endButton = getUiObjectByResourceId(endCallButtonResourceId, "android.widget.ImageView"); + new Handler(Looper.getMainLooper()).postDelayed(new Runnable() { + @Override + public void run() { + try { + endButton.click(); + } catch (UiObjectNotFoundException e) { + // Do nothing + } + } + }, 10000); + */ + } + + public void handleLoginScreen(String username, String password) throws Exception { + String useridResoureId = "com.skype.raider:id/sign_in_userid"; + String nextButtonResourceId = "com.skype.raider:id/sign_in_next_btn"; + UiObject useridField = new UiObject(new UiSelector().resourceId(useridResoureId)); + UiObject nextButton = new UiObject(new UiSelector().resourceId(nextButtonResourceId)); + useridField.setText(username); + nextButton.clickAndWaitForNewWindow(); + + String skypenameResoureId = "com.skype.raider:id/signin_skypename"; + String passwordResoureId = "com.skype.raider:id/signin_password"; + String signinButtonResourceId = "com.skype.raider:id/sign_in_btn"; + // UiObject skypenameField = new UiObject(new UiSelector().resourceId(skypenameResoureId)); + UiObject passwordField = new UiObject(new UiSelector().resourceId(passwordResoureId)); + UiObject signinButton = new UiObject(new UiSelector().resourceId(signinButtonResourceId)); + // skypenameField.setText(username); + passwordField.setText(password); + signinButton.clickAndWaitForNewWindow(); + } +}