xref: /aosp_15_r20/external/cronet/components/cronet/tools/cr_cronet.py (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
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