1#!/usr/bin/env python3 2# Copyright 2014 The Chromium Authors 3# Use of this source code is governed by a BSD-style license that can be 4# found in the LICENSE file. 5""" 6cr_cronet.py - cr - like helper tool for cronet developers 7""" 8 9import argparse 10import sys 11import os 12import shlex 13from datetime import datetime 14 15REPOSITORY_ROOT = os.path.abspath( 16 os.path.join(os.path.dirname(__file__), os.pardir, os.pardir, os.pardir)) 17 18sys.path.insert(0, REPOSITORY_ROOT) 19from components.cronet.tools.utils import run, run_shell, android_gn_gen, build # pylint: disable=wrong-import-position 20 21 22def install(out_dir): 23 cmd = ['build/android/adb_install_apk.py'] 24 # Propagate PATH to avoid issues with missing tools http://crbug/1217979 25 env = { 26 'BUILDTYPE': out_dir[4:], 27 'PATH': os.environ.get('PATH', ''), 28 'HOME': os.environ.get('HOME', '') 29 } 30 return run(cmd + ['CronetTestInstrumentation.apk'], env=env) 31 32 33def test(out_dir, extra_options): 34 # Ideally we would fetch this path from somewhere. Though, that's not trivial 35 # and very unlikely to change. This being "best effort test code", it should 36 # be fine just to hardcode it. 37 remote_netlog_dir = '/data/data/org.chromium.net.tests/app_cronet_test/NetLog' 38 run(['adb', 'shell', 'rm', '-rf', remote_netlog_dir]) 39 run([out_dir + '/bin/run_cronet_test_instrumentation_apk'] + extra_options) 40 local_netlog_dir = out_dir + '/netlogs_for-' + datetime.now().strftime( 41 "%y_%m_%d-%H_%M_%S") 42 return run(['adb', 'pull', remote_netlog_dir, local_netlog_dir]) 43 44 45def unittest(out_dir, extra_options): 46 return run([out_dir + '/bin/run_cronet_unittests_android'] + extra_options) 47 48 49def debug(extra_options): 50 return run([ 51 'build/android/adb_gdb', '--start', '--activity=.CronetTestActivity', 52 '--program-name=CronetTest', '--package-name=org.chromium.net' 53 ] + extra_options) 54 55 56def stack(out_dir): 57 return run_shell('adb logcat -d | CHROMIUM_OUTPUT_DIR=' + 58 shlex.quote(out_dir) + 59 ' third_party/android_platform/development/scripts/stack') 60 61 62def main(): 63 parser = argparse.ArgumentParser() 64 parser.add_argument('command', 65 choices=[ 66 'gn', 'sync', 'build', 'install', 'proguard', 'test', 67 'build-test', 'unit', 'build-unit', 'stack', 'debug', 68 'build-debug' 69 ]) 70 parser.add_argument('-d', 71 '--out_dir', 72 action='store', 73 help='name of the build directory') 74 parser.add_argument('-x', 75 '--x86', 76 action='store_true', 77 help='build for Intel x86 architecture') 78 parser.add_argument('--x64', 79 action='store_true', 80 help='build for Intel x86_64 architecture') 81 parser.add_argument('-R', 82 '--riscv64', 83 action='store_true', 84 help='build for riscv64 architecture') 85 parser.add_argument('-r', 86 '--release', 87 action='store_true', 88 help='use release configuration') 89 parser.add_argument('-a', 90 '--asan', 91 action='store_true', 92 help='use address sanitizer') 93 94 options, extra_options = parser.parse_known_args() 95 print("Options:", options) 96 print("Extra options:", extra_options) 97 98 test_target = 'cronet_test_instrumentation_apk' 99 unit_target = 'cronet_unittests_android' 100 if options.x86: 101 target_cpu = 'x86' 102 out_dir_suffix = '-x86' 103 elif options.x64: 104 target_cpu = 'x64' 105 out_dir_suffix = '-x64' 106 elif options.riscv64: 107 target_cpu = 'riscv64' 108 out_dir_suffix = '-riscv64' 109 else: 110 target_cpu = 'arm64' 111 out_dir_suffix = '-arm64' 112 113 if options.asan: 114 # ASAN on Android requires one-time setup described here: 115 # https://www.chromium.org/developers/testing/addresssanitizer 116 out_dir_suffix += '-asan' 117 118 if options.out_dir: 119 out_dir = options.out_dir 120 else: 121 if options.release: 122 out_dir = 'out/Release' + out_dir_suffix 123 else: 124 out_dir = 'out/Debug' + out_dir_suffix 125 126 if (options.command == 'gn'): 127 return android_gn_gen(options.release, target_cpu, out_dir) 128 if (options.command == 'sync'): 129 return run(['git', 'pull', '--rebase']) or run(['gclient', 'sync']) 130 if (options.command == 'build'): 131 return build(out_dir, test_target, extra_options) 132 if (options.command == 'install'): 133 return install(out_dir) 134 if (options.command == 'proguard'): 135 return build(out_dir, 'cronet_sample_proguard_apk') 136 if (options.command == 'test'): 137 return install(out_dir) or test(out_dir, extra_options) 138 if (options.command == 'build-test'): 139 return build(out_dir, test_target) or install(out_dir) or \ 140 test(out_dir, extra_options) 141 if (options.command == 'stack'): 142 return stack(out_dir) 143 if (options.command == 'debug'): 144 return install(out_dir) or debug(extra_options) 145 if (options.command == 'build-debug'): 146 return build(out_dir, test_target) or install(out_dir) or \ 147 debug(extra_options) 148 if (options.command == 'unit'): 149 return unittest(out_dir, extra_options) 150 if (options.command == 'build-unit'): 151 return build(out_dir, unit_target) or unittest(out_dir, extra_options) 152 153 parser.print_help() 154 return 1 155 156 157if __name__ == '__main__': 158 sys.exit(main()) 159