Mads Ager | 418d1ca | 2017-05-22 09:35:49 +0200 | [diff] [blame] | 1 | #!/usr/bin/env python |
| 2 | # Copyright (c) 2016, 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 | # Convenience script for running tests. If no argument is given run all tests, |
| 7 | # if an argument is given, run only tests with that pattern. This script will |
| 8 | # force the tests to run, even if no input changed. |
| 9 | |
Jean-Marie Henaff | 7b424e9 | 2017-06-15 11:02:56 +0200 | [diff] [blame] | 10 | import os |
Mads Ager | 418d1ca | 2017-05-22 09:35:49 +0200 | [diff] [blame] | 11 | import gradle |
| 12 | import optparse |
Rico Wind | f65a1d6 | 2017-06-30 09:41:56 +0200 | [diff] [blame] | 13 | import subprocess |
Mads Ager | 418d1ca | 2017-05-22 09:35:49 +0200 | [diff] [blame] | 14 | import sys |
Rico Wind | a94f01c | 2017-06-27 10:32:34 +0200 | [diff] [blame] | 15 | import utils |
| 16 | import uuid |
Stephan Herhut | d24b1b7 | 2017-08-24 15:09:36 +0200 | [diff] [blame] | 17 | import notify |
Jean-Marie Henaff | 7a64eec | 2018-05-31 15:30:35 +0200 | [diff] [blame] | 18 | import upload_to_x20 |
Mads Ager | 418d1ca | 2017-05-22 09:35:49 +0200 | [diff] [blame] | 19 | |
Jean-Marie Henaff | ce162f3 | 2017-10-04 10:39:27 +0200 | [diff] [blame] | 20 | |
Stephan Herhut | 02f0f9d | 2018-01-04 10:27:31 +0100 | [diff] [blame] | 21 | ALL_ART_VMS = ["default", "7.0.0", "6.0.1", "5.1.1", "4.4.4", "4.0.4"] |
Rico Wind | a94f01c | 2017-06-27 10:32:34 +0200 | [diff] [blame] | 22 | BUCKET = 'r8-test-results' |
Mads Ager | 418d1ca | 2017-05-22 09:35:49 +0200 | [diff] [blame] | 23 | |
| 24 | def ParseOptions(): |
| 25 | result = optparse.OptionParser() |
Søren Gjesse | 7752798 | 2018-10-05 12:58:49 +0200 | [diff] [blame] | 26 | result.add_option('--no-internal', '--no_internal', |
Mads Ager | 418d1ca | 2017-05-22 09:35:49 +0200 | [diff] [blame] | 27 | help='Do not run Google internal tests.', |
| 28 | default=False, action='store_true') |
Søren Gjesse | 7752798 | 2018-10-05 12:58:49 +0200 | [diff] [blame] | 29 | result.add_option('--archive-failures', '--archive_failures', |
Rico Wind | a94f01c | 2017-06-27 10:32:34 +0200 | [diff] [blame] | 30 | help='Upload test results to cloud storage on failure.', |
| 31 | default=False, action='store_true') |
Søren Gjesse | 7752798 | 2018-10-05 12:58:49 +0200 | [diff] [blame] | 32 | result.add_option('--only-internal', '--only_internal', |
Mads Ager | 418d1ca | 2017-05-22 09:35:49 +0200 | [diff] [blame] | 33 | help='Only run Google internal tests.', |
| 34 | default=False, action='store_true') |
Søren Gjesse | 7752798 | 2018-10-05 12:58:49 +0200 | [diff] [blame] | 35 | result.add_option('--all-tests', '--all_tests', |
Mads Ager | 418d1ca | 2017-05-22 09:35:49 +0200 | [diff] [blame] | 36 | help='Run tests in all configurations.', |
| 37 | default=False, action='store_true') |
| 38 | result.add_option('-v', '--verbose', |
| 39 | help='Print test stdout to, well, stdout.', |
| 40 | default=False, action='store_true') |
Søren Gjesse | 7752798 | 2018-10-05 12:58:49 +0200 | [diff] [blame] | 41 | result.add_option('--dex-vm', '--dex_vm', |
Mads Ager | 418d1ca | 2017-05-22 09:35:49 +0200 | [diff] [blame] | 42 | help='The android version of the vm to use. "all" will run the tests on ' |
| 43 | 'all art vm versions (stopping after first failed execution)', |
| 44 | default="default", |
| 45 | choices=ALL_ART_VMS + ["all"]) |
Søren Gjesse | 7752798 | 2018-10-05 12:58:49 +0200 | [diff] [blame] | 46 | result.add_option('--dex-vm-kind', '--dex_vm_kind', |
Jean-Marie Henaff | ce162f3 | 2017-10-04 10:39:27 +0200 | [diff] [blame] | 47 | help='Whether to use host or target version of runtime', |
| 48 | default="host", |
| 49 | nargs=1, |
| 50 | choices=["host", "target"]) |
Søren Gjesse | 7752798 | 2018-10-05 12:58:49 +0200 | [diff] [blame] | 51 | result.add_option('--one-line-per-test', '--one_line_per_test', |
Mads Ager | 418d1ca | 2017-05-22 09:35:49 +0200 | [diff] [blame] | 52 | help='Print a line before a tests starts and after it ends to stdout.', |
| 53 | default=False, action='store_true') |
| 54 | result.add_option('--tool', |
Tamas Kenez | cfb2c05 | 2018-10-12 11:03:57 +0200 | [diff] [blame^] | 55 | help='Tool to run ART tests with: "r8" (default) or "d8" or "r8cf"' |
| 56 | ' (r8 w/CF-backend). Ignored if "--all_tests" enabled.', |
| 57 | default=None, choices=["r8", "d8", "r8cf"]) |
Mads Ager | 418d1ca | 2017-05-22 09:35:49 +0200 | [diff] [blame] | 58 | result.add_option('--jctf', |
Tamas Kenez | cfb2c05 | 2018-10-12 11:03:57 +0200 | [diff] [blame^] | 59 | help='Run JCTF tests with: "r8" (default) or "d8" or "r8cf".', |
Mads Ager | 418d1ca | 2017-05-22 09:35:49 +0200 | [diff] [blame] | 60 | default=False, action='store_true') |
Søren Gjesse | 7752798 | 2018-10-05 12:58:49 +0200 | [diff] [blame] | 61 | result.add_option('--only-jctf', '--only_jctf', |
Tamas Kenez | cfb2c05 | 2018-10-12 11:03:57 +0200 | [diff] [blame^] | 62 | help='Run only JCTF tests with: "r8" (default) or "d8" or "r8cf".', |
Mads Ager | 418d1ca | 2017-05-22 09:35:49 +0200 | [diff] [blame] | 63 | default=False, action='store_true') |
Søren Gjesse | 7752798 | 2018-10-05 12:58:49 +0200 | [diff] [blame] | 64 | result.add_option('--jctf-compile-only', '--jctf_compile_only', |
Mads Ager | 418d1ca | 2017-05-22 09:35:49 +0200 | [diff] [blame] | 65 | help="Don't run, only compile JCTF tests.", |
| 66 | default=False, action='store_true') |
Søren Gjesse | 7752798 | 2018-10-05 12:58:49 +0200 | [diff] [blame] | 67 | result.add_option('--aosp-jar', '--aosp_jar', |
Tamas Kenez | 0cad51c | 2017-08-21 14:42:01 +0200 | [diff] [blame] | 68 | help='Run aosp_jar test.', |
| 69 | default=False, action='store_true') |
Søren Gjesse | 7752798 | 2018-10-05 12:58:49 +0200 | [diff] [blame] | 70 | result.add_option('--disable-assertions', '--disable_assertions', |
Tamas Kenez | b77b7d8 | 2017-08-17 14:05:16 +0200 | [diff] [blame] | 71 | help='Disable assertions when running tests.', |
Søren Gjesse | af1c5e2 | 2017-06-15 12:24:03 +0200 | [diff] [blame] | 72 | default=False, action='store_true') |
Søren Gjesse | 7752798 | 2018-10-05 12:58:49 +0200 | [diff] [blame] | 73 | result.add_option('--with-code-coverage', '--with_code_coverage', |
Tamas Kenez | b77b7d8 | 2017-08-17 14:05:16 +0200 | [diff] [blame] | 74 | help='Enable code coverage with Jacoco.', |
Sebastien Hertz | e2687b6 | 2017-07-25 11:16:04 +0200 | [diff] [blame] | 75 | default=False, action='store_true') |
Søren Gjesse | 7752798 | 2018-10-05 12:58:49 +0200 | [diff] [blame] | 76 | result.add_option('--test-dir', '--test_dir', |
Tamas Kenez | b77b7d8 | 2017-08-17 14:05:16 +0200 | [diff] [blame] | 77 | help='Use a custom directory for the test artifacts instead of a' |
| 78 | ' temporary (which is automatically removed after the test).' |
| 79 | ' Note that the directory will not be cleared before the test.') |
Søren Gjesse | 7752798 | 2018-10-05 12:58:49 +0200 | [diff] [blame] | 80 | result.add_option('--java-home', '--java_home', |
Mikaël Peltier | 5c0a323 | 2017-10-18 09:14:40 +0200 | [diff] [blame] | 81 | help='Use a custom java version to run tests.') |
Søren Gjesse | 7752798 | 2018-10-05 12:58:49 +0200 | [diff] [blame] | 82 | result.add_option('--generate-golden-files-to', '--generate_golden_files_to', |
Jean-Marie Henaff | 7a64eec | 2018-05-31 15:30:35 +0200 | [diff] [blame] | 83 | help='Store dex files produced by tests in the specified directory.' |
| 84 | ' It is aimed to be read on platforms with no host runtime available' |
| 85 | ' for comparison.') |
Søren Gjesse | 7752798 | 2018-10-05 12:58:49 +0200 | [diff] [blame] | 86 | result.add_option('--use-golden-files-in', '--use_golden_files_in', |
Jean-Marie Henaff | 7a64eec | 2018-05-31 15:30:35 +0200 | [diff] [blame] | 87 | help='Download golden files hierarchy for this commit in the specified' |
| 88 | ' location and use them instead of executing on host runtime.') |
Mads Ager | 418d1ca | 2017-05-22 09:35:49 +0200 | [diff] [blame] | 89 | |
| 90 | return result.parse_args() |
| 91 | |
Rico Wind | a94f01c | 2017-06-27 10:32:34 +0200 | [diff] [blame] | 92 | def archive_failures(): |
| 93 | upload_dir = os.path.join(utils.REPO_ROOT, 'build', 'reports', 'tests') |
| 94 | u_dir = uuid.uuid4() |
| 95 | destination = 'gs://%s/%s' % (BUCKET, u_dir) |
Rico Wind | d0d88cf | 2018-02-09 09:46:11 +0100 | [diff] [blame] | 96 | utils.upload_dir_to_cloud_storage(upload_dir, destination, is_html=True) |
Rico Wind | 8c4a0a2 | 2017-08-05 07:02:07 +0200 | [diff] [blame] | 97 | url = 'http://storage.googleapis.com/%s/%s/test/index.html' % (BUCKET, u_dir) |
Rico Wind | a94f01c | 2017-06-27 10:32:34 +0200 | [diff] [blame] | 98 | print 'Test results available at: %s' % url |
Rico Wind | 1f1a71a | 2017-08-15 09:27:13 +0200 | [diff] [blame] | 99 | print '@@@STEP_LINK@Test failures@%s@@@' % url |
Rico Wind | a94f01c | 2017-06-27 10:32:34 +0200 | [diff] [blame] | 100 | |
Mads Ager | 418d1ca | 2017-05-22 09:35:49 +0200 | [diff] [blame] | 101 | def Main(): |
| 102 | (options, args) = ParseOptions() |
Rico Wind | d7c4731 | 2018-09-27 10:07:38 +0200 | [diff] [blame] | 103 | if 'BUILDBOT_BUILDERNAME' in os.environ: |
| 104 | gradle.RunGradle(['clean']) |
Sebastien Hertz | e2687b6 | 2017-07-25 11:16:04 +0200 | [diff] [blame] | 105 | |
Jean-Marie Henaff | 7a64eec | 2018-05-31 15:30:35 +0200 | [diff] [blame] | 106 | gradle_args = ['--stacktrace'] |
Sebastien Hertz | e2687b6 | 2017-07-25 11:16:04 +0200 | [diff] [blame] | 107 | # Set all necessary Gradle properties and options first. |
Mads Ager | 418d1ca | 2017-05-22 09:35:49 +0200 | [diff] [blame] | 108 | if options.verbose: |
| 109 | gradle_args.append('-Pprint_test_stdout') |
| 110 | if options.no_internal: |
| 111 | gradle_args.append('-Pno_internal') |
| 112 | if options.only_internal: |
| 113 | gradle_args.append('-Ponly_internal') |
| 114 | if options.all_tests: |
| 115 | gradle_args.append('-Pall_tests') |
| 116 | if options.tool: |
| 117 | gradle_args.append('-Ptool=%s' % options.tool) |
| 118 | if options.one_line_per_test: |
| 119 | gradle_args.append('-Pone_line_per_test') |
| 120 | if options.jctf: |
| 121 | gradle_args.append('-Pjctf') |
| 122 | if options.only_jctf: |
| 123 | gradle_args.append('-Ponly_jctf') |
| 124 | if options.jctf_compile_only: |
| 125 | gradle_args.append('-Pjctf_compile_only') |
Tamas Kenez | 0cad51c | 2017-08-21 14:42:01 +0200 | [diff] [blame] | 126 | if options.aosp_jar: |
| 127 | gradle_args.append('-Paosp_jar') |
Søren Gjesse | af1c5e2 | 2017-06-15 12:24:03 +0200 | [diff] [blame] | 128 | if options.disable_assertions: |
| 129 | gradle_args.append('-Pdisable_assertions') |
Sebastien Hertz | e2687b6 | 2017-07-25 11:16:04 +0200 | [diff] [blame] | 130 | if options.with_code_coverage: |
| 131 | gradle_args.append('-Pwith_code_coverage') |
Jean-Marie Henaff | 7b424e9 | 2017-06-15 11:02:56 +0200 | [diff] [blame] | 132 | if os.name == 'nt': |
| 133 | # temporary hack |
| 134 | gradle_args.append('-Pno_internal') |
| 135 | gradle_args.append('-x') |
| 136 | gradle_args.append('createJctfTests') |
| 137 | gradle_args.append('-x') |
| 138 | gradle_args.append('jctfCommonJar') |
| 139 | gradle_args.append('-x') |
| 140 | gradle_args.append('jctfTestsClasses') |
Tamas Kenez | b77b7d8 | 2017-08-17 14:05:16 +0200 | [diff] [blame] | 141 | if options.test_dir: |
| 142 | gradle_args.append('-Ptest_dir=' + options.test_dir) |
| 143 | if not os.path.exists(options.test_dir): |
| 144 | os.makedirs(options.test_dir) |
Mikaël Peltier | 5c0a323 | 2017-10-18 09:14:40 +0200 | [diff] [blame] | 145 | if options.java_home: |
| 146 | gradle_args.append('-Dorg.gradle.java.home=' + options.java_home) |
Jean-Marie Henaff | 7a64eec | 2018-05-31 15:30:35 +0200 | [diff] [blame] | 147 | if options.generate_golden_files_to: |
| 148 | gradle_args.append('-Pgenerate_golden_files_to=' + options.generate_golden_files_to) |
| 149 | if not os.path.exists(options.generate_golden_files_to): |
| 150 | os.makedirs(options.generate_golden_files_to) |
| 151 | gradle_args.append('-PHEAD_sha1=' + utils.get_HEAD_sha1()) |
| 152 | if options.use_golden_files_in: |
| 153 | gradle_args.append('-Puse_golden_files_in=' + options.use_golden_files_in) |
| 154 | if not os.path.exists(options.use_golden_files_in): |
| 155 | os.makedirs(options.use_golden_files_in) |
| 156 | gradle_args.append('-PHEAD_sha1=' + utils.get_HEAD_sha1()) |
Sebastien Hertz | e2687b6 | 2017-07-25 11:16:04 +0200 | [diff] [blame] | 157 | # Add Gradle tasks |
| 158 | gradle_args.append('cleanTest') |
Morten Krogh-Jespersen | e47021f | 2018-10-10 11:08:23 +0200 | [diff] [blame] | 159 | # Build R8lib with dependencies for bootstrapping tests. |
| 160 | gradle_args.append('r8libWithDeps') |
Sebastien Hertz | e2687b6 | 2017-07-25 11:16:04 +0200 | [diff] [blame] | 161 | gradle_args.append('test') |
Sebastien Hertz | 0f4e7fb | 2017-10-02 11:33:45 +0200 | [diff] [blame] | 162 | # Test filtering. Must always follow the 'test' task. |
| 163 | for testFilter in args: |
Sebastien Hertz | e2687b6 | 2017-07-25 11:16:04 +0200 | [diff] [blame] | 164 | gradle_args.append('--tests') |
Sebastien Hertz | 0f4e7fb | 2017-10-02 11:33:45 +0200 | [diff] [blame] | 165 | gradle_args.append(testFilter) |
Sebastien Hertz | e2687b6 | 2017-07-25 11:16:04 +0200 | [diff] [blame] | 166 | if options.with_code_coverage: |
| 167 | # Create Jacoco report after tests. |
| 168 | gradle_args.append('jacocoTestReport') |
| 169 | |
Jean-Marie Henaff | 7a64eec | 2018-05-31 15:30:35 +0200 | [diff] [blame] | 170 | if options.use_golden_files_in: |
| 171 | sha1 = '%s' % utils.get_HEAD_sha1() |
| 172 | with utils.ChangedWorkingDirectory(options.use_golden_files_in): |
| 173 | utils.download_file_from_cloud_storage( |
| 174 | 'gs://r8-test-results/golden-files/%s.tar.gz' % sha1, |
| 175 | '%s.tar.gz' % sha1) |
| 176 | utils.unpack_archive('%s.tar.gz' % sha1) |
| 177 | |
| 178 | |
Sebastien Hertz | e2687b6 | 2017-07-25 11:16:04 +0200 | [diff] [blame] | 179 | # Now run tests on selected runtime(s). |
Mads Ager | 418d1ca | 2017-05-22 09:35:49 +0200 | [diff] [blame] | 180 | vms_to_test = [options.dex_vm] if options.dex_vm != "all" else ALL_ART_VMS |
| 181 | for art_vm in vms_to_test: |
Jean-Marie Henaff | ce162f3 | 2017-10-04 10:39:27 +0200 | [diff] [blame] | 182 | vm_kind_to_test = "_" + options.dex_vm_kind if art_vm != "default" else "" |
| 183 | return_code = gradle.RunGradle(gradle_args + ['-Pdex_vm=%s' % (art_vm + vm_kind_to_test)], |
Rico Wind | a94f01c | 2017-06-27 10:32:34 +0200 | [diff] [blame] | 184 | throw_on_failure=False) |
Jean-Marie Henaff | 7a64eec | 2018-05-31 15:30:35 +0200 | [diff] [blame] | 185 | |
| 186 | if options.generate_golden_files_to: |
| 187 | sha1 = '%s' % utils.get_HEAD_sha1() |
| 188 | with utils.ChangedWorkingDirectory(options.generate_golden_files_to): |
| 189 | archive = utils.create_archive(sha1) |
| 190 | utils.upload_file_to_cloud_storage(archive, |
| 191 | 'gs://r8-test-results/golden-files/' + archive) |
| 192 | |
Rico Wind | a94f01c | 2017-06-27 10:32:34 +0200 | [diff] [blame] | 193 | if return_code != 0: |
Rico Wind | dce9c87 | 2017-08-14 14:49:04 +0200 | [diff] [blame] | 194 | if options.archive_failures and os.name != 'nt': |
Rico Wind | a94f01c | 2017-06-27 10:32:34 +0200 | [diff] [blame] | 195 | archive_failures() |
| 196 | return return_code |
Mads Ager | 418d1ca | 2017-05-22 09:35:49 +0200 | [diff] [blame] | 197 | |
Jinseong Jeon | 9749d17 | 2017-09-19 00:25:01 -0700 | [diff] [blame] | 198 | return 0 |
| 199 | |
Mads Ager | 418d1ca | 2017-05-22 09:35:49 +0200 | [diff] [blame] | 200 | if __name__ == '__main__': |
Stephan Herhut | d24b1b7 | 2017-08-24 15:09:36 +0200 | [diff] [blame] | 201 | return_code = Main() |
| 202 | if return_code != 0: |
| 203 | notify.notify("Tests failed.") |
| 204 | else: |
| 205 | notify.notify("Tests passed.") |
| 206 | sys.exit(return_code) |