15bbcc3861c44435f89481f80946ef5c9c49968f2Luke Drummond# Copyright (C) 2016 The Android Open Source Project 25bbcc3861c44435f89481f80946ef5c9c49968f2Luke Drummond# 35bbcc3861c44435f89481f80946ef5c9c49968f2Luke Drummond# Licensed under the Apache License, Version 2.0 (the "License"); 45bbcc3861c44435f89481f80946ef5c9c49968f2Luke Drummond# you may not use this file except in compliance with the License. 55bbcc3861c44435f89481f80946ef5c9c49968f2Luke Drummond# You may obtain a copy of the License at 65bbcc3861c44435f89481f80946ef5c9c49968f2Luke Drummond# 75bbcc3861c44435f89481f80946ef5c9c49968f2Luke Drummond# http://www.apache.org/licenses/LICENSE-2.0 85bbcc3861c44435f89481f80946ef5c9c49968f2Luke Drummond# 95bbcc3861c44435f89481f80946ef5c9c49968f2Luke Drummond# Unless required by applicable law or agreed to in writing, software 105bbcc3861c44435f89481f80946ef5c9c49968f2Luke Drummond# distributed under the License is distributed on an "AS IS" BASIS, 115bbcc3861c44435f89481f80946ef5c9c49968f2Luke Drummond# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 125bbcc3861c44435f89481f80946ef5c9c49968f2Luke Drummond# See the License for the specific language governing permissions and 135bbcc3861c44435f89481f80946ef5c9c49968f2Luke Drummond# limitations under the License. 145bbcc3861c44435f89481f80946ef5c9c49968f2Luke Drummond 15dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo'''Module that contains the class UtilBundle, representing a collection of RS 16dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leobinaries.''' 17dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo 18a3c6f62775506c95afd556e617f14d7a28839f01Luke Drummondfrom __future__ import absolute_import 19a3c6f62775506c95afd556e617f14d7a28839f01Luke Drummond 20dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leoimport os 21dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leoimport time 22dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leofrom . import util_constants 23dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leofrom . import util_log 24a3c6f62775506c95afd556e617f14d7a28839f01Luke Drummondfrom .exception import TestSuiteException 25dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo 26dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo 27dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leoclass UtilBundle(object): 28dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo '''Represents the collection of RS binaries that are debugged.''' 29dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo 30dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo # Map of binary name to package name of all Java apps debugged 31dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo _tests_apk = { 32dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo 'JavaInfiniteLoop': 'com.android.rs.infiniteloop', 33dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo 'JavaDebugWaitAttach': 'com.android.rs.waitattachdebug', 34dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo 'JavaNoDebugWaitAttach': 'com.android.rs.waitattachnodebug', 35dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo 'BranchingFunCalls': 'com.android.rs.branchingfuncalls', 36dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo 'KernelVariables': 'com.android.rs.kernelvariables', 37dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo 'Allocations': 'com.android.rs.allocations', 38a3c6f62775506c95afd556e617f14d7a28839f01Luke Drummond 'MultipleRSFiles': 'com.android.rs.multiplersfiles', 391cea94d9a1268eb8b9d0099a4c145de3f8688e07Aidan Dodds 'SingleSource': 'com.android.rs.singlesource', 404546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond 'ScriptGroup': 'com.android.rs.scriptgroup', 414546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond 'Reduction': 'com.android.rs.lldbreductiontest', 42dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo } 43dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo 44dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo _tests_jni = { 45dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo 'JNIInfiniteLoop': 'com.android.rs.jniinfiniteloop', 46dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo 'JNIDebugWaitAttach': 'com.android.rs.jnidebugwaitattach', 47dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo 'JNINoDebugWaitAttach': 'com.android.rs.jninodebugwaitattach', 48dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo 'JNIBranchingFunCalls': 'com.android.rs.jnibranchingfuncalls', 49dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo 'JNIKernelVariables': 'com.android.rs.jnikernelvariables', 50dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo 'JNIAllocations': 'com.android.rs.jniallocations', 51dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo 'JNIMultipleRSFiles': 'com.android.rs.jnimultiplersfiles' 52dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo } 53dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo 54dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo _tests_ndk = {'CppInfiniteLoop', 'CppNoDebugWaitAttach', 55dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo 'CppDebugWaitAttach', 'CppBranchingFunCalls', 56dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo 'CppKernelVariables', 'CppAllocations', 'CppMultipleRSFiles'} 57dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo 58dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo _missing_path_msg = ( 59a3c6f62775506c95afd556e617f14d7a28839f01Luke Drummond 'No product path has been provided. If using `lunch` ensure ' 60a3c6f62775506c95afd556e617f14d7a28839f01Luke Drummond 'the `ANDROID_PRODUCT_OUT` environment variable has been set correctly. ' 61a3c6f62775506c95afd556e617f14d7a28839f01Luke Drummond 'Alternatively, include it in the config file or specify it explicitly ' 62a3c6f62775506c95afd556e617f14d7a28839f01Luke Drummond 'on the command line (`--aosp-product-path`)' 63dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo ) 64dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo 65dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo def __init__(self, android, aosp_product_path): 66dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo assert android 67dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo self._android = android # Link to the android module 68dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo self._aosp_product_path = aosp_product_path 69dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo self._log = util_log.get_logger() 70dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo 71dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo def is_apk(self, name): 72dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo '''Checks if a binary of a given name is an apk. 73dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo 74dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo Checks whether the name of the apk is in the dictionary of apks. 75dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo 76dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo Args: 77dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo name: The string that is the name of the binary to check. 78dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo 79dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo Returns: 80dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo True if the binary is an apk, False if it is not. 81dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo 82dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo Raises: 83dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo TestSuiteException: The string does not match any item in the list 84dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo of APK or NDK binaries. 85dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo ''' 86dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo if name in self._tests_apk: 87dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo return True 88dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo if name not in self._tests_ndk and name not in self._tests_jni: 89dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo raise TestSuiteException('test not apk or ndk') 90dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo return False 91dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo 92dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo def uninstall_all(self): 93dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo '''Uninstall/Delete all the testsuite's apks and binaries on the device. 94dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo 95dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo Raises: 96dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo TestSuiteException: One or more apks could not be uninstalled. 97dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo ''' 98dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo self.uninstall_all_apk() 99dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo self._delete_all_ndk() 100dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo self._uninstall_all_jni() 101dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo 102dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo def uninstall_all_apk(self): 103dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo '''Uninstall all apks used by the test suite from the device. 104dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo 105dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo Raises: 106dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo TestSuiteException: An apk could not be uninstalled. 107dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo ''' 108dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo max_num_attempts = 3 109dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo timeout = 180 110dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo 111dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo for app, package in self._tests_apk.items(): 112dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo self._log.info('Uninstalling the application: %s', app) 113dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo output = self._android.adb_retry('uninstall ' + package, 114dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo max_num_attempts, timeout) 115dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo 116dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo if output is None: 117dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo raise TestSuiteException('Repeated timeouts when uninstalling ' 118dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo 'the application: ' + app) 119dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo elif 'Success' not in output: 120dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo outmsg = '\n' + output.rstrip() if output else '<empty>' 121dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo self._log.error('Cannot match the string "Success" in the ' 122dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo 'output: %s', outmsg) 123dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo raise TestSuiteException('Unable to uninstall app ' + app) 124dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo else: 125dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo self._log.debug('Application uninstalled: %r', app) 126dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo 127dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo if 'Success' not in output: 128dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo self._log.warning('unable to uninstall app ' + app) 129dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo 130dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo def _uninstall_all_jni(self): 131dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo '''Uninstall all apks used by the test suite from the device. 132dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo 133dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo Raises: 134dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo TestSuiteException: An apk could not be uninstalled. 135dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo ''' 136dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo for app, package in self._tests_jni.items(): 137dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo output = self._android.adb('uninstall ' + package) 138dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo 139dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo if 'Success' not in output: 140dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo raise TestSuiteException('unable to uninstall app ' + app) 141dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo 142dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo def _delete_all_ndk(self): 143dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo '''Delete all ndk binaries that were pushed to the device. 144dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo 145dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo Raises: 146dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo TestSuiteException: A binary could not be deleted from the device. 147dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo ''' 148dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo for app in self._tests_ndk: 149dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo output = self._android.shell('rm /data/' + app) 150dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo if 'No such file or directory' in output: 151dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo self._log.warning('unable to uninstall app ' + app) 152dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo 153dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo 154dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo def push_all(self): 155dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo '''Push all apk and ndk binaries required by the testsuite to the device 156dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo 157dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo Raises: 158dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo TestSuiteException: One or more apks could not be installed or 159dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo previously running processes thereof could not 160dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo be killed. 161dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo ''' 162dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo self._push_all_java() 163dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo self._push_all_ndk() 164dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo self._push_all_jni() 165dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo 166dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo def _install_apk(self, app, package): 167dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo '''Push an apk files to the device. 168dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo 169dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo This involves uninstalling any old installation and installing again. 170dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo 171dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo Args: 172dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo app: A string that is the name of the apk. 173dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo package: A string that is the name of the package of the apk. 174dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo 175dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo Raises: 176dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo TestSuiteException: The apk could not be installed. 177dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo ''' 178dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo self._log.info('pushing {0}'.format(app)) 179dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo 180dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo self._android.stop_app(package) 181dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo 182dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo self._android.adb('uninstall ' + package) 183dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo # Ignore the output of uninstall. 184dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo # The app may not have been installed in the first place. That's ok. 185dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo 186dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo flags = '' 187dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo 188dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo product_folder = self._aosp_product_path 189dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo if not product_folder: 190dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo raise TestSuiteException(self._missing_path_msg) 191dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo 192dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo app_folder = os.path.join(product_folder, 'data/app') 193dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo 194dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo cmd = 'install {0} {1}/{2}/{2}.apk'.format(flags, app_folder, app) 195dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo output = self._android.adb(cmd, False, True, 196dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo util_constants.PUSH_TIMEOUT) 197dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo if ('Success' not in output) or ("can't find" in output): 198f31b8e489624f9d6a013be0f2bbedffb1bd81171Arthur Eubanks raise TestSuiteException('unable to install app {}: {}'.format( 199f31b8e489624f9d6a013be0f2bbedffb1bd81171Arthur Eubanks app, output)) 200dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo 201dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo def _push_all_java(self): 202dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo '''Push all apk files to the device. 203dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo 204dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo This involves uninstalling any old installations and installing again. 205dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo 206dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo Raises: 207dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo TestSuiteException: An apk could not be installed. 208dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo ''' 209a3c6f62775506c95afd556e617f14d7a28839f01Luke Drummond for app, package in self._tests_apk.items(): 210dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo self._install_apk(app, package) 211dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo 212dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo def _push_all_ndk(self): 213dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo '''Push all ndk binaries to the device. 214dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo 215dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo Raises: 216dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo TestSuiteException: A binary could not be pushed to the device or 217dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo a previous process could not be killed. 218dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo ''' 219dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo product_folder = self._aosp_product_path 220dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo if not product_folder: 221dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo raise TestSuiteException(self._missing_path_msg) 222dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo 223dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo bin_folder = os.path.join(product_folder, 'system/bin') 224dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo 225dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo for app in self._tests_ndk: 226dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo self._log.info('pushing {0}'.format(app)) 227dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo 228dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo self._android.kill_all_processes(app) 229dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo 230dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo cmd = 'push %s/%s /data' % (bin_folder, app) 231dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo output = self._android.adb(cmd, False, True, 232dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo util_constants.PUSH_TIMEOUT) 233dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo if ('failed to copy' in output or 234dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo 'No such file or directory' in output): 235dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo raise TestSuiteException('unable to push binary ' + app) 236dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo 237dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo # be sure to set the execute bit for NDK binaries 238dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo self._android.shell('chmod 777 /data/{0}'.format(app)) 239dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo 240dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo def _push_all_jni(self): 241dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo '''Push all JNI apk files to the device. 242dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo 243dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo This involves uninstalling any old installations and installing again. 244dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo 245dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo Raises: 246dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo TestSuiteException: An apk could not be installed. 247dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo ''' 248dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo product_folder = self._aosp_product_path 249dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo if not product_folder: 250dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo raise TestSuiteException(self._missing_path_msg) 251dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo 252dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo app_folder = os.path.join(product_folder, 'system/lib') 253dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo 254dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo # Ensure the system/lib directory is writable 255dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo self._android.make_device_writeable() 256dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo 257a3c6f62775506c95afd556e617f14d7a28839f01Luke Drummond for app, package in self._tests_jni.items(): 258dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo self._install_apk(app, package) 259dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo 260dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo def delete_ndk_cache(self): 261dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo '''Deletes NDK cached scripts from the device. 262dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo 263dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo The NDK caches compiled scripts as shared libraries in 264dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo the folder specified when calling `rs->init()`. 265dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo 266dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo For all out tests this is set to '/data/rscache'. 267dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo ''' 268dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo self._android.shell('rm -r /data/rscache') 269dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo 270dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo def get_package(self, app_name): 271dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo '''From a given apk name get the name of its package. 272dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo 273dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo Args: 274dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo app_name: The string that is the name of the apk. 275dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo 276dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo Returns: 277dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo A string representing the name of the package of the app. 278dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo 279dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo Raises: 280dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo TestSuiteException: The app name is not in the list of apks. 281dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo ''' 282dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo if app_name in self._tests_apk: 283dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo return self._tests_apk[app_name] 284dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo elif app_name in self._tests_jni: 285dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo return self._tests_jni[app_name] 286dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo else: 287dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo msg = ('unknown app %s. (Do you need to add an ' 288dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo 'entry to bundle.py :: test_apps_?)' % app_name) 289dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo raise TestSuiteException(msg) 290dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo return self._tests_apk[app_name] 291dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo 292dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo def launch(self, app_name): 293dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo '''Launch an apk/ndk app on a remote device. 294dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo 295dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo Args: 296dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo app_name: The string that is the name of the APK or NDK executable. 297dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo 298dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo Returns: 299dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo The Process ID of the launched executable, otherwise None 300dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo 301dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo Raises: 302dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo TestSuiteException: Previous processes of this apk could not be 303dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo killed. 304dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo ''' 305dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo process_name = '' 306dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo success = False 307dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo if app_name in self._tests_apk: 308dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo process_name = self._tests_apk[app_name] 309dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo 310dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo self._android.kill_all_processes(process_name) 311dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo 312dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo success = self._android.launch_app(process_name, 'MainActivity') 313dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo elif app_name in self._tests_ndk: 314dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo process_name = app_name 315dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo self._android.kill_all_processes(process_name) 316dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo success = self._android.launch_elf(process_name) 317dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo elif app_name in self._tests_jni: 318dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo package = self._tests_jni[app_name] 319dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo 320dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo self._android.kill_process(package) 321dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo 322dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo success = self._android.launch_app(package, 'MainActivity') 323dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo if not success: 324dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo self._log.log_and_print(app_name + 325dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo ' is not installed. Try removing the --no-install option?') 326dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo return None 327dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo 328dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo return self._android.find_app_pid(package) 329dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo else: 330dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo self._log.error('Executable {0} neither Java nor NDK.' 331dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo .format(app_name)) 332dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo 333dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo self._log.fatal('Failed to launch test executable {0}' 334dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo .format(app_name)) 335dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo return None 336dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo 337dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo if not success: 338dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo self._log.log_and_print(app_name + 339dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo ' is not installed. Try removing the --no-install option?') 340dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo return None 341dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo 342dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo return self._android.find_app_pid(process_name) 343dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo 344dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo def check_apps_installed(self, java_only): 345dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo ''' Check whether all Java/JNI/NDK apps are installed on the device. 346dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo 347dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo Args: 348dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo java_only: Boolean to specify whether only the Java apks should be 349dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo checked (in case of --wimpy mode for example). 350dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo 351dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo Raises: 352dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo TestSuiteException: Not all apps are installed. 353dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo ''' 354dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo java_and_jni_apks = self._tests_apk.copy() 355dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo 356dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo if not java_only: 357dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo java_and_jni_apks.update(self._tests_jni) 358dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo 359dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo installed = self._android.shell('pm list packages -f') 360dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo 361a3c6f62775506c95afd556e617f14d7a28839f01Luke Drummond for app, package in java_and_jni_apks.items(): 362dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo if package not in installed: 363dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo raise TestSuiteException('apk %s is not installed.' % app) 364dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo 365dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo if not java_only: 366dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo ls_data = self._android.shell('ls /data') 367dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo for app in self._tests_ndk: 368dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo if app not in ls_data: 369dcecc0c8d22e894525e25a122ce25129b51338f2Dean De Leo raise TestSuiteException('app %s is not installed.' % app) 370