Ian Zerny | dcb172e | 2022-02-22 15:36:45 +0100 | [diff] [blame] | 1 | #!/usr/bin/env python3 |
Morten Krogh-Jespersen | cd55f81 | 2020-11-04 09:13:31 +0100 | [diff] [blame] | 2 | # 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 | |
| 6 | import subprocess |
| 7 | import time |
| 8 | import utils |
| 9 | |
Christoffer Quist Adamsen | 2434a4d | 2023-10-16 11:29:03 +0200 | [diff] [blame] | 10 | |
Morten Krogh-Jespersen | cd55f81 | 2020-11-04 09:13:31 +0100 | [diff] [blame] | 11 | def install_apk_on_emulator(apk, emulator_id, quiet=False): |
Christoffer Quist Adamsen | 2434a4d | 2023-10-16 11:29:03 +0200 | [diff] [blame] | 12 | 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-Jespersen | cd55f81 | 2020-11-04 09:13:31 +0100 | [diff] [blame] | 17 | |
| 18 | |
| 19 | def uninstall_apk_on_emulator(app_id, emulator_id): |
Christoffer Quist Adamsen | 2434a4d | 2023-10-16 11:29:03 +0200 | [diff] [blame] | 20 | 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-Jespersen | cd55f81 | 2020-11-04 09:13:31 +0100 | [diff] [blame] | 26 | |
Christoffer Quist Adamsen | 2434a4d | 2023-10-16 11:29:03 +0200 | [diff] [blame] | 27 | if stdout.strip() == 'Success': |
| 28 | # Successfully uninstalled |
| 29 | return |
Morten Krogh-Jespersen | cd55f81 | 2020-11-04 09:13:31 +0100 | [diff] [blame] | 30 | |
Christoffer Quist Adamsen | 2434a4d | 2023-10-16 11:29:03 +0200 | [diff] [blame] | 31 | if 'Unknown package: {}'.format(app_id) in stderr: |
| 32 | # Application not installed |
| 33 | return |
Morten Krogh-Jespersen | cd55f81 | 2020-11-04 09:13:31 +0100 | [diff] [blame] | 34 | |
Christoffer Quist Adamsen | 2434a4d | 2023-10-16 11:29:03 +0200 | [diff] [blame] | 35 | # 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-Jespersen | cd55f81 | 2020-11-04 09:13:31 +0100 | [diff] [blame] | 40 | |
Christoffer Quist Adamsen | 2434a4d | 2023-10-16 11:29:03 +0200 | [diff] [blame] | 41 | raise Exception( |
| 42 | 'Unexpected result from `adb uninstall {}\nStdout: {}\nStderr: {}'. |
| 43 | format(app_id, stdout, stderr)) |
Morten Krogh-Jespersen | cd55f81 | 2020-11-04 09:13:31 +0100 | [diff] [blame] | 44 | |
| 45 | |
| 46 | def wait_for_emulator(emulator_id): |
Morten Krogh-Jespersen | 235d754 | 2021-03-02 15:30:44 +0100 | [diff] [blame] | 47 | stdout = subprocess.check_output(['adb', 'devices']).decode('UTF-8') |
Christoffer Quist Adamsen | 2434a4d | 2023-10-16 11:29:03 +0200 | [diff] [blame] | 48 | 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-Jespersen | cd55f81 | 2020-11-04 09:13:31 +0100 | [diff] [blame] | 65 | |
| 66 | |
| 67 | def run_monkey(app_id, emulator_id, apk, monkey_events, quiet, enable_logging): |
Christoffer Quist Adamsen | 2434a4d | 2023-10-16 11:29:03 +0200 | [diff] [blame] | 68 | if not wait_for_emulator(emulator_id): |
| 69 | return False |
Morten Krogh-Jespersen | cd55f81 | 2020-11-04 09:13:31 +0100 | [diff] [blame] | 70 | |
Christoffer Quist Adamsen | 2434a4d | 2023-10-16 11:29:03 +0200 | [diff] [blame] | 71 | install_apk_on_emulator(apk, emulator_id, quiet) |
Morten Krogh-Jespersen | cd55f81 | 2020-11-04 09:13:31 +0100 | [diff] [blame] | 72 | |
Christoffer Quist Adamsen | 2434a4d | 2023-10-16 11:29:03 +0200 | [diff] [blame] | 73 | # Intentionally using a constant seed such that the monkey generates the same |
| 74 | # event sequence for each shrinker. |
| 75 | random_seed = 42 |
Morten Krogh-Jespersen | cd55f81 | 2020-11-04 09:13:31 +0100 | [diff] [blame] | 76 | |
Christoffer Quist Adamsen | 2434a4d | 2023-10-16 11:29:03 +0200 | [diff] [blame] | 77 | cmd = [ |
| 78 | 'adb', '-s', emulator_id, 'shell', 'monkey', '-p', app_id, '-s', |
| 79 | str(random_seed), |
| 80 | str(monkey_events) |
| 81 | ] |
Morten Krogh-Jespersen | cd55f81 | 2020-11-04 09:13:31 +0100 | [diff] [blame] | 82 | |
Christoffer Quist Adamsen | 2434a4d | 2023-10-16 11:29:03 +0200 | [diff] [blame] | 83 | 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-Jespersen | cd55f81 | 2020-11-04 09:13:31 +0100 | [diff] [blame] | 88 | |
Christoffer Quist Adamsen | 2434a4d | 2023-10-16 11:29:03 +0200 | [diff] [blame] | 89 | uninstall_apk_on_emulator(app_id, emulator_id) |
Morten Krogh-Jespersen | cd55f81 | 2020-11-04 09:13:31 +0100 | [diff] [blame] | 90 | |
Christoffer Quist Adamsen | 2434a4d | 2023-10-16 11:29:03 +0200 | [diff] [blame] | 91 | return succeeded |
Morten Krogh-Jespersen | 51a1635 | 2020-11-04 09:31:15 +0100 | [diff] [blame] | 92 | |
| 93 | |
Christoffer Quist Adamsen | 2434a4d | 2023-10-16 11:29:03 +0200 | [diff] [blame] | 94 | def run_instrumented(app_id, |
| 95 | test_id, |
| 96 | emulator_id, |
| 97 | apk, |
| 98 | test_apk, |
| 99 | quiet, |
Morten Krogh-Jespersen | 51a1635 | 2020-11-04 09:31:15 +0100 | [diff] [blame] | 100 | enable_logging, |
| 101 | test_runner='androidx.test.runner.AndroidJUnitRunner'): |
Christoffer Quist Adamsen | 2434a4d | 2023-10-16 11:29:03 +0200 | [diff] [blame] | 102 | if not wait_for_emulator(emulator_id): |
| 103 | return None |
Morten Krogh-Jespersen | 51a1635 | 2020-11-04 09:31:15 +0100 | [diff] [blame] | 104 | |
Christoffer Quist Adamsen | 2434a4d | 2023-10-16 11:29:03 +0200 | [diff] [blame] | 105 | install_apk_on_emulator(apk, emulator_id, quiet) |
| 106 | install_apk_on_emulator(test_apk, emulator_id, quiet) |
Morten Krogh-Jespersen | 51a1635 | 2020-11-04 09:31:15 +0100 | [diff] [blame] | 107 | |
Christoffer Quist Adamsen | 2434a4d | 2023-10-16 11:29:03 +0200 | [diff] [blame] | 108 | cmd = [ |
| 109 | 'adb', '-s', emulator_id, 'shell', 'am', 'instrument', '-w', |
| 110 | '{}/{}'.format(test_id, test_runner) |
| 111 | ] |
Morten Krogh-Jespersen | 51a1635 | 2020-11-04 09:31:15 +0100 | [diff] [blame] | 112 | |
Christoffer Quist Adamsen | 2434a4d | 2023-10-16 11:29:03 +0200 | [diff] [blame] | 113 | 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-Jespersen | 51a1635 | 2020-11-04 09:31:15 +0100 | [diff] [blame] | 119 | |
Christoffer Quist Adamsen | 2434a4d | 2023-10-16 11:29:03 +0200 | [diff] [blame] | 120 | uninstall_apk_on_emulator(test_id, emulator_id) |
| 121 | uninstall_apk_on_emulator(app_id, emulator_id) |
Morten Krogh-Jespersen | 51a1635 | 2020-11-04 09:31:15 +0100 | [diff] [blame] | 122 | |
Christoffer Quist Adamsen | 2434a4d | 2023-10-16 11:29:03 +0200 | [diff] [blame] | 123 | return succeeded |