blob: 988c684ae0e4a005ed8cbc1811e9c7dc5798a9b0 [file] [log] [blame]
Ian Zernydcb172e2022-02-22 15:36:45 +01001#!/usr/bin/env python3
Morten Krogh-Jespersencd55f812020-11-04 09:13:31 +01002# Copyright (c) 2020, the R8 project authors. Please see the AUTHORS file
3# for details. All rights reserved. Use of this source code is governed by a
4# BSD-style license that can be found in the LICENSE file.
5
6import subprocess
7import time
8import utils
9
Christoffer Quist Adamsen2434a4d2023-10-16 11:29:03 +020010
Morten Krogh-Jespersencd55f812020-11-04 09:13:31 +010011def install_apk_on_emulator(apk, emulator_id, quiet=False):
Christoffer Quist Adamsen2434a4d2023-10-16 11:29:03 +020012 cmd = ['adb', '-s', emulator_id, 'install', '-r', '-d', apk]
13 if quiet:
14 subprocess.check_output(cmd)
15 else:
16 subprocess.check_call(cmd)
Morten Krogh-Jespersencd55f812020-11-04 09:13:31 +010017
18
19def uninstall_apk_on_emulator(app_id, emulator_id):
Christoffer Quist Adamsen2434a4d2023-10-16 11:29:03 +020020 process = subprocess.Popen(['adb', '-s', emulator_id, 'uninstall', app_id],
21 stdout=subprocess.PIPE,
22 stderr=subprocess.PIPE)
23 stdout, stderr = process.communicate()
24 stdout = stdout.decode('UTF-8')
25 stderr = stderr.decode('UTF-8')
Morten Krogh-Jespersencd55f812020-11-04 09:13:31 +010026
Christoffer Quist Adamsen2434a4d2023-10-16 11:29:03 +020027 if stdout.strip() == 'Success':
28 # Successfully uninstalled
29 return
Morten Krogh-Jespersencd55f812020-11-04 09:13:31 +010030
Christoffer Quist Adamsen2434a4d2023-10-16 11:29:03 +020031 if 'Unknown package: {}'.format(app_id) in stderr:
32 # Application not installed
33 return
Morten Krogh-Jespersencd55f812020-11-04 09:13:31 +010034
Christoffer Quist Adamsen2434a4d2023-10-16 11:29:03 +020035 # Check if the app is listed in packages
36 packages = subprocess.check_output(
37 ['adb', 'shell', 'pm', 'list', 'packages'])
38 if not 'package:' + app_id in packages:
39 return
Morten Krogh-Jespersencd55f812020-11-04 09:13:31 +010040
Christoffer Quist Adamsen2434a4d2023-10-16 11:29:03 +020041 raise Exception(
42 'Unexpected result from `adb uninstall {}\nStdout: {}\nStderr: {}'.
43 format(app_id, stdout, stderr))
Morten Krogh-Jespersencd55f812020-11-04 09:13:31 +010044
45
46def wait_for_emulator(emulator_id):
Morten Krogh-Jespersen235d7542021-03-02 15:30:44 +010047 stdout = subprocess.check_output(['adb', 'devices']).decode('UTF-8')
Christoffer Quist Adamsen2434a4d2023-10-16 11:29:03 +020048 if '{}\tdevice'.format(emulator_id) in stdout:
49 return True
50
51 print('Emulator \'{}\' not connected; waiting for connection'.format(
52 emulator_id))
53
54 time_waited = 0
55 while True:
56 time.sleep(10)
57 time_waited += 10
58 stdout = subprocess.check_output(['adb', 'devices']).decode('UTF-8')
59 if '{}\tdevice'.format(emulator_id) not in stdout:
60 print('... still waiting for connection')
61 if time_waited >= 5 * 60:
62 return False
63 else:
64 return True
Morten Krogh-Jespersencd55f812020-11-04 09:13:31 +010065
66
67def run_monkey(app_id, emulator_id, apk, monkey_events, quiet, enable_logging):
Christoffer Quist Adamsen2434a4d2023-10-16 11:29:03 +020068 if not wait_for_emulator(emulator_id):
69 return False
Morten Krogh-Jespersencd55f812020-11-04 09:13:31 +010070
Christoffer Quist Adamsen2434a4d2023-10-16 11:29:03 +020071 install_apk_on_emulator(apk, emulator_id, quiet)
Morten Krogh-Jespersencd55f812020-11-04 09:13:31 +010072
Christoffer Quist Adamsen2434a4d2023-10-16 11:29:03 +020073 # Intentionally using a constant seed such that the monkey generates the same
74 # event sequence for each shrinker.
75 random_seed = 42
Morten Krogh-Jespersencd55f812020-11-04 09:13:31 +010076
Christoffer Quist Adamsen2434a4d2023-10-16 11:29:03 +020077 cmd = [
78 'adb', '-s', emulator_id, 'shell', 'monkey', '-p', app_id, '-s',
79 str(random_seed),
80 str(monkey_events)
81 ]
Morten Krogh-Jespersencd55f812020-11-04 09:13:31 +010082
Christoffer Quist Adamsen2434a4d2023-10-16 11:29:03 +020083 try:
84 stdout = utils.RunCmd(cmd, quiet=quiet, logging=enable_logging)
85 succeeded = ('Events injected: {}'.format(monkey_events) in stdout)
86 except subprocess.CalledProcessError as e:
87 succeeded = False
Morten Krogh-Jespersencd55f812020-11-04 09:13:31 +010088
Christoffer Quist Adamsen2434a4d2023-10-16 11:29:03 +020089 uninstall_apk_on_emulator(app_id, emulator_id)
Morten Krogh-Jespersencd55f812020-11-04 09:13:31 +010090
Christoffer Quist Adamsen2434a4d2023-10-16 11:29:03 +020091 return succeeded
Morten Krogh-Jespersen51a16352020-11-04 09:31:15 +010092
93
Christoffer Quist Adamsen2434a4d2023-10-16 11:29:03 +020094def run_instrumented(app_id,
95 test_id,
96 emulator_id,
97 apk,
98 test_apk,
99 quiet,
Morten Krogh-Jespersen51a16352020-11-04 09:31:15 +0100100 enable_logging,
101 test_runner='androidx.test.runner.AndroidJUnitRunner'):
Christoffer Quist Adamsen2434a4d2023-10-16 11:29:03 +0200102 if not wait_for_emulator(emulator_id):
103 return None
Morten Krogh-Jespersen51a16352020-11-04 09:31:15 +0100104
Christoffer Quist Adamsen2434a4d2023-10-16 11:29:03 +0200105 install_apk_on_emulator(apk, emulator_id, quiet)
106 install_apk_on_emulator(test_apk, emulator_id, quiet)
Morten Krogh-Jespersen51a16352020-11-04 09:31:15 +0100107
Christoffer Quist Adamsen2434a4d2023-10-16 11:29:03 +0200108 cmd = [
109 'adb', '-s', emulator_id, 'shell', 'am', 'instrument', '-w',
110 '{}/{}'.format(test_id, test_runner)
111 ]
Morten Krogh-Jespersen51a16352020-11-04 09:31:15 +0100112
Christoffer Quist Adamsen2434a4d2023-10-16 11:29:03 +0200113 try:
114 stdout = utils.RunCmd(cmd, quiet=quiet, logging=enable_logging)
115 # The runner will print OK (X tests) if completed succesfully
116 succeeded = any("OK (" in s for s in stdout)
117 except subprocess.CalledProcessError as e:
118 succeeded = False
Morten Krogh-Jespersen51a16352020-11-04 09:31:15 +0100119
Christoffer Quist Adamsen2434a4d2023-10-16 11:29:03 +0200120 uninstall_apk_on_emulator(test_id, emulator_id)
121 uninstall_apk_on_emulator(app_id, emulator_id)
Morten Krogh-Jespersen51a16352020-11-04 09:31:15 +0100122
Christoffer Quist Adamsen2434a4d2023-10-16 11:29:03 +0200123 return succeeded