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