xref: /aosp_15_r20/art/tools/run-libcore-tests.py (revision 795d594fd825385562da6b089ea9b2033f3abf5a)
1*795d594fSAndroid Build Coastguard Worker#!/usr/bin/env python3
2*795d594fSAndroid Build Coastguard Worker#
3*795d594fSAndroid Build Coastguard Worker# [VPYTHON:BEGIN]
4*795d594fSAndroid Build Coastguard Worker# python_version: "3.8"
5*795d594fSAndroid Build Coastguard Worker# [VPYTHON:END]
6*795d594fSAndroid Build Coastguard Worker#
7*795d594fSAndroid Build Coastguard Worker# Copyright (C) 2021 The Android Open Source Project
8*795d594fSAndroid Build Coastguard Worker#
9*795d594fSAndroid Build Coastguard Worker# Licensed under the Apache License, Version 2.0 (the "License");
10*795d594fSAndroid Build Coastguard Worker# you may not use this file except in compliance with the License.
11*795d594fSAndroid Build Coastguard Worker# You may obtain a copy of the License at
12*795d594fSAndroid Build Coastguard Worker#
13*795d594fSAndroid Build Coastguard Worker#      http://www.apache.org/licenses/LICENSE-2.0
14*795d594fSAndroid Build Coastguard Worker#
15*795d594fSAndroid Build Coastguard Worker# Unless required by applicable law or agreed to in writing, software
16*795d594fSAndroid Build Coastguard Worker# distributed under the License is distributed on an "AS IS" BASIS,
17*795d594fSAndroid Build Coastguard Worker# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18*795d594fSAndroid Build Coastguard Worker# See the License for the specific language governing permissions and
19*795d594fSAndroid Build Coastguard Worker# limitations under the License.
20*795d594fSAndroid Build Coastguard Worker
21*795d594fSAndroid Build Coastguard Workerimport sys, os, argparse, subprocess, shlex, re, concurrent.futures, multiprocessing
22*795d594fSAndroid Build Coastguard Worker
23*795d594fSAndroid Build Coastguard Workerdef parse_args():
24*795d594fSAndroid Build Coastguard Worker  parser = argparse.ArgumentParser(description="Run libcore tests using the vogar testing tool.")
25*795d594fSAndroid Build Coastguard Worker  parser.add_argument('--mode', choices=['device', 'host', 'jvm'], required=True,
26*795d594fSAndroid Build Coastguard Worker                      help='Specify where tests should be run.')
27*795d594fSAndroid Build Coastguard Worker  parser.add_argument('--variant', choices=['X32', 'X64'],
28*795d594fSAndroid Build Coastguard Worker                      help='Which dalvikvm variant to execute with.')
29*795d594fSAndroid Build Coastguard Worker  parser.add_argument('-j', '--jobs', type=int,
30*795d594fSAndroid Build Coastguard Worker                      help='Number of tests to run simultaneously.')
31*795d594fSAndroid Build Coastguard Worker  parser.add_argument('--timeout', type=int,
32*795d594fSAndroid Build Coastguard Worker                      help='How long to run the test before aborting (seconds).')
33*795d594fSAndroid Build Coastguard Worker  parser.add_argument('--debug', action='store_true',
34*795d594fSAndroid Build Coastguard Worker                      help='Use debug version of ART (device|host only).')
35*795d594fSAndroid Build Coastguard Worker  parser.add_argument('--dry-run', action='store_true',
36*795d594fSAndroid Build Coastguard Worker                      help='Print vogar command-line, but do not run.')
37*795d594fSAndroid Build Coastguard Worker  parser.add_argument('--no-getrandom', action='store_false', dest='getrandom',
38*795d594fSAndroid Build Coastguard Worker                      help='Ignore failures from getrandom() (for kernel < 3.17).')
39*795d594fSAndroid Build Coastguard Worker  parser.add_argument('--no-jit', action='store_false', dest='jit',
40*795d594fSAndroid Build Coastguard Worker                      help='Disable JIT (device|host only).')
41*795d594fSAndroid Build Coastguard Worker  parser.add_argument('--gcstress', action='store_true',
42*795d594fSAndroid Build Coastguard Worker                      help='Enable GC stress configuration (device|host only).')
43*795d594fSAndroid Build Coastguard Worker  parser.add_argument('tests', nargs="*",
44*795d594fSAndroid Build Coastguard Worker                      help='Name(s) of the test(s) to run')
45*795d594fSAndroid Build Coastguard Worker  parser.add_argument('--verbose', action='store_true', help='Print verbose output from vogar.')
46*795d594fSAndroid Build Coastguard Worker  return parser.parse_args()
47*795d594fSAndroid Build Coastguard Worker
48*795d594fSAndroid Build Coastguard WorkerART_TEST_ANDROID_ROOT = os.environ.get("ART_TEST_ANDROID_ROOT", "/system")
49*795d594fSAndroid Build Coastguard WorkerART_TEST_CHROOT = os.environ.get("ART_TEST_CHROOT")
50*795d594fSAndroid Build Coastguard WorkerANDROID_PRODUCT_OUT = os.environ.get("ANDROID_PRODUCT_OUT")
51*795d594fSAndroid Build Coastguard Worker
52*795d594fSAndroid Build Coastguard WorkerLIBCORE_TEST_NAMES = [
53*795d594fSAndroid Build Coastguard Worker  ### luni tests. ###
54*795d594fSAndroid Build Coastguard Worker  # Naive critical path optimization: Run the longest tests first.
55*795d594fSAndroid Build Coastguard Worker  "org.apache.harmony.tests.java.util",  # 90min under gcstress
56*795d594fSAndroid Build Coastguard Worker  "libcore.java.lang",                   # 90min under gcstress
57*795d594fSAndroid Build Coastguard Worker  "jsr166",                              # 60min under gcstress
58*795d594fSAndroid Build Coastguard Worker  "libcore.java.util",                   # 60min under gcstress
59*795d594fSAndroid Build Coastguard Worker  "libcore.java.math",                   # 50min under gcstress
60*795d594fSAndroid Build Coastguard Worker  "org.apache.harmony.crypto",           # 30min under gcstress
61*795d594fSAndroid Build Coastguard Worker  "org.apache.harmony.tests.java.io",    # 30min under gcstress
62*795d594fSAndroid Build Coastguard Worker  "org.apache.harmony.tests.java.text",  # 30min under gcstress
63*795d594fSAndroid Build Coastguard Worker  # Split highmemorytest to individual classes since it is too big.
64*795d594fSAndroid Build Coastguard Worker  "libcore.highmemorytest.java.text.DateFormatTest",
65*795d594fSAndroid Build Coastguard Worker  "libcore.highmemorytest.java.text.DecimalFormatTest",
66*795d594fSAndroid Build Coastguard Worker  "libcore.highmemorytest.java.text.SimpleDateFormatTest",
67*795d594fSAndroid Build Coastguard Worker  "libcore.highmemorytest.java.time.format.DateTimeFormatterTest",
68*795d594fSAndroid Build Coastguard Worker  "libcore.highmemorytest.java.util.CalendarTest",
69*795d594fSAndroid Build Coastguard Worker  "libcore.highmemorytest.java.util.CurrencyTest",
70*795d594fSAndroid Build Coastguard Worker  "libcore.highmemorytest.libcore.icu.SimpleDateFormatDataTest",
71*795d594fSAndroid Build Coastguard Worker  # All other luni tests in alphabetical order.
72*795d594fSAndroid Build Coastguard Worker  "libcore.android.system",
73*795d594fSAndroid Build Coastguard Worker  "libcore.build",
74*795d594fSAndroid Build Coastguard Worker  "libcore.dalvik.system",
75*795d594fSAndroid Build Coastguard Worker  "libcore.java.awt",
76*795d594fSAndroid Build Coastguard Worker  "libcore.java.text",
77*795d594fSAndroid Build Coastguard Worker  "libcore.javax.crypto",
78*795d594fSAndroid Build Coastguard Worker  "libcore.javax.net",
79*795d594fSAndroid Build Coastguard Worker  "libcore.javax.security",
80*795d594fSAndroid Build Coastguard Worker  "libcore.javax.sql",
81*795d594fSAndroid Build Coastguard Worker  "libcore.javax.xml",
82*795d594fSAndroid Build Coastguard Worker  "libcore.libcore.icu",
83*795d594fSAndroid Build Coastguard Worker  "libcore.libcore.internal",
84*795d594fSAndroid Build Coastguard Worker  "libcore.libcore.io",
85*795d594fSAndroid Build Coastguard Worker  "libcore.libcore.net",
86*795d594fSAndroid Build Coastguard Worker  "libcore.libcore.reflect",
87*795d594fSAndroid Build Coastguard Worker  "libcore.libcore.util",
88*795d594fSAndroid Build Coastguard Worker  "libcore.sun.invoke",
89*795d594fSAndroid Build Coastguard Worker  "libcore.sun.misc",
90*795d594fSAndroid Build Coastguard Worker  "libcore.sun.net",
91*795d594fSAndroid Build Coastguard Worker  "libcore.sun.security",
92*795d594fSAndroid Build Coastguard Worker  "libcore.sun.util",
93*795d594fSAndroid Build Coastguard Worker  "libcore.xml",
94*795d594fSAndroid Build Coastguard Worker  "org.apache.harmony.annotation",
95*795d594fSAndroid Build Coastguard Worker  "org.apache.harmony.luni.tests.internal.net.www.protocol.http.HttpURLConnection",
96*795d594fSAndroid Build Coastguard Worker  "org.apache.harmony.luni.tests.internal.net.www.protocol.https.HttpsURLConnection",
97*795d594fSAndroid Build Coastguard Worker  "org.apache.harmony.luni.tests.java.io",
98*795d594fSAndroid Build Coastguard Worker  "org.apache.harmony.luni.tests.java.net",
99*795d594fSAndroid Build Coastguard Worker  "org.apache.harmony.nio",
100*795d594fSAndroid Build Coastguard Worker  "org.apache.harmony.regex",
101*795d594fSAndroid Build Coastguard Worker  "org.apache.harmony.testframework",
102*795d594fSAndroid Build Coastguard Worker  "org.apache.harmony.tests.java.lang",
103*795d594fSAndroid Build Coastguard Worker  "org.apache.harmony.tests.java.math",
104*795d594fSAndroid Build Coastguard Worker  "org.apache.harmony.tests.javax.security",
105*795d594fSAndroid Build Coastguard Worker  "tests.java.lang.String",
106*795d594fSAndroid Build Coastguard Worker  ### OpenJDK upstream tests (ojluni). ###
107*795d594fSAndroid Build Coastguard Worker  # "test.java.awt",
108*795d594fSAndroid Build Coastguard Worker  "test.java.awt",
109*795d594fSAndroid Build Coastguard Worker  # test.java.io
110*795d594fSAndroid Build Coastguard Worker  "test.java.io.ByteArrayInputStream",
111*795d594fSAndroid Build Coastguard Worker  "test.java.io.ByteArrayOutputStream",
112*795d594fSAndroid Build Coastguard Worker  "test.java.io.FileReader",
113*795d594fSAndroid Build Coastguard Worker  "test.java.io.FileWriter",
114*795d594fSAndroid Build Coastguard Worker  "test.java.io.InputStream",
115*795d594fSAndroid Build Coastguard Worker  "test.java.io.OutputStream",
116*795d594fSAndroid Build Coastguard Worker  "test.java.io.PrintStream",
117*795d594fSAndroid Build Coastguard Worker  "test.java.io.PrintWriter",
118*795d594fSAndroid Build Coastguard Worker  "test.java.io.Reader",
119*795d594fSAndroid Build Coastguard Worker  "test.java.io.Writer",
120*795d594fSAndroid Build Coastguard Worker  # test.java.lang
121*795d594fSAndroid Build Coastguard Worker  "test.java.lang.Boolean",
122*795d594fSAndroid Build Coastguard Worker  "test.java.lang.ClassLoader",
123*795d594fSAndroid Build Coastguard Worker  "test.java.lang.Double",
124*795d594fSAndroid Build Coastguard Worker  "test.java.lang.Float",
125*795d594fSAndroid Build Coastguard Worker  "test.java.lang.Integer",
126*795d594fSAndroid Build Coastguard Worker  "test.java.lang.Long",
127*795d594fSAndroid Build Coastguard Worker  # Sharded test.java.lang.StrictMath
128*795d594fSAndroid Build Coastguard Worker  "test.java.lang.StrictMath.CubeRootTests",
129*795d594fSAndroid Build Coastguard Worker  # TODO: disable the test until b/248208762 is fixed.
130*795d594fSAndroid Build Coastguard Worker  # "test.java.lang.StrictMath.ExactArithTests",
131*795d594fSAndroid Build Coastguard Worker  "test.java.lang.StrictMath.Expm1Tests",
132*795d594fSAndroid Build Coastguard Worker  "test.java.lang.StrictMath.ExpTests",
133*795d594fSAndroid Build Coastguard Worker  "test.java.lang.StrictMath.HyperbolicTests",
134*795d594fSAndroid Build Coastguard Worker  "test.java.lang.StrictMath.HypotTests#testAgainstTranslit_shard1",
135*795d594fSAndroid Build Coastguard Worker  "test.java.lang.StrictMath.HypotTests#testAgainstTranslit_shard2",
136*795d594fSAndroid Build Coastguard Worker  "test.java.lang.StrictMath.HypotTests#testAgainstTranslit_shard3",
137*795d594fSAndroid Build Coastguard Worker  "test.java.lang.StrictMath.HypotTests#testAgainstTranslit_shard4",
138*795d594fSAndroid Build Coastguard Worker  "test.java.lang.StrictMath.HypotTests#testHypot",
139*795d594fSAndroid Build Coastguard Worker  "test.java.lang.StrictMath.Log1pTests",
140*795d594fSAndroid Build Coastguard Worker  "test.java.lang.StrictMath.Log10Tests",
141*795d594fSAndroid Build Coastguard Worker  "test.java.lang.StrictMath.MultiplicationTests",
142*795d594fSAndroid Build Coastguard Worker  "test.java.lang.StrictMath.PowTests",
143*795d594fSAndroid Build Coastguard Worker  "test.java.lang.String",
144*795d594fSAndroid Build Coastguard Worker  "test.java.lang.Thread",
145*795d594fSAndroid Build Coastguard Worker  # test.java.lang.invoke
146*795d594fSAndroid Build Coastguard Worker  "test.java.lang.invoke",
147*795d594fSAndroid Build Coastguard Worker  # test.java.lang.ref
148*795d594fSAndroid Build Coastguard Worker  "test.java.lang.ref.SoftReference",
149*795d594fSAndroid Build Coastguard Worker  "test.java.lang.ref.BasicTest",
150*795d594fSAndroid Build Coastguard Worker  "test.java.lang.ref.EnqueueNullRefTest",
151*795d594fSAndroid Build Coastguard Worker  "test.java.lang.ref.EnqueuePollRaceTest",
152*795d594fSAndroid Build Coastguard Worker  "test.java.lang.ref.ReferenceCloneTest",
153*795d594fSAndroid Build Coastguard Worker  "test.java.lang.ref.ReferenceEnqueuePendingTest",
154*795d594fSAndroid Build Coastguard Worker  # test.java.math
155*795d594fSAndroid Build Coastguard Worker  "test.java.math.BigDecimal",
156*795d594fSAndroid Build Coastguard Worker  # Sharded test.java.math.BigInteger
157*795d594fSAndroid Build Coastguard Worker  "test.java.math.BigInteger#testArithmetic",
158*795d594fSAndroid Build Coastguard Worker  "test.java.math.BigInteger#testBitCount",
159*795d594fSAndroid Build Coastguard Worker  "test.java.math.BigInteger#testBitLength",
160*795d594fSAndroid Build Coastguard Worker  "test.java.math.BigInteger#testbitOps",
161*795d594fSAndroid Build Coastguard Worker  "test.java.math.BigInteger#testBitwise",
162*795d594fSAndroid Build Coastguard Worker  "test.java.math.BigInteger#testByteArrayConv",
163*795d594fSAndroid Build Coastguard Worker  "test.java.math.BigInteger#testConstructor",
164*795d594fSAndroid Build Coastguard Worker  "test.java.math.BigInteger#testDivideAndReminder",
165*795d594fSAndroid Build Coastguard Worker  "test.java.math.BigInteger#testDivideLarge",
166*795d594fSAndroid Build Coastguard Worker  "test.java.math.BigInteger#testModExp",
167*795d594fSAndroid Build Coastguard Worker  "test.java.math.BigInteger#testMultiplyLarge",
168*795d594fSAndroid Build Coastguard Worker  "test.java.math.BigInteger#testNextProbablePrime",
169*795d594fSAndroid Build Coastguard Worker  "test.java.math.BigInteger#testPow",
170*795d594fSAndroid Build Coastguard Worker  "test.java.math.BigInteger#testSerialize",
171*795d594fSAndroid Build Coastguard Worker  "test.java.math.BigInteger#testShift",
172*795d594fSAndroid Build Coastguard Worker  "test.java.math.BigInteger#testSquare",
173*795d594fSAndroid Build Coastguard Worker  "test.java.math.BigInteger#testSquareLarge",
174*795d594fSAndroid Build Coastguard Worker  "test.java.math.BigInteger#testSquareRootAndReminder",
175*795d594fSAndroid Build Coastguard Worker  "test.java.math.BigInteger#testStringConv_generic",
176*795d594fSAndroid Build Coastguard Worker  "test.java.math.RoundingMode",
177*795d594fSAndroid Build Coastguard Worker  # test.java.net
178*795d594fSAndroid Build Coastguard Worker  "test.java.net.DatagramSocket",
179*795d594fSAndroid Build Coastguard Worker  "test.java.net.Socket",
180*795d594fSAndroid Build Coastguard Worker  "test.java.net.SocketOptions",
181*795d594fSAndroid Build Coastguard Worker  "test.java.net.URLDecoder",
182*795d594fSAndroid Build Coastguard Worker  "test.java.net.URLEncoder",
183*795d594fSAndroid Build Coastguard Worker  # test.java.nio
184*795d594fSAndroid Build Coastguard Worker  "test.java.nio.channels.Channels",
185*795d594fSAndroid Build Coastguard Worker  "test.java.nio.channels.SelectionKey",
186*795d594fSAndroid Build Coastguard Worker  "test.java.nio.channels.Selector",
187*795d594fSAndroid Build Coastguard Worker  "test.java.nio.file",
188*795d594fSAndroid Build Coastguard Worker  # test.java.security
189*795d594fSAndroid Build Coastguard Worker  "test.java.security.cert",
190*795d594fSAndroid Build Coastguard Worker  # Sharded test.java.security.KeyAgreement
191*795d594fSAndroid Build Coastguard Worker  "test.java.security.KeyAgreement.KeyAgreementTest",
192*795d594fSAndroid Build Coastguard Worker  "test.java.security.KeyAgreement.KeySizeTest#testECDHKeySize",
193*795d594fSAndroid Build Coastguard Worker  "test.java.security.KeyAgreement.KeySpecTest",
194*795d594fSAndroid Build Coastguard Worker  "test.java.security.KeyAgreement.MultiThreadTest",
195*795d594fSAndroid Build Coastguard Worker  "test.java.security.KeyAgreement.NegativeTest",
196*795d594fSAndroid Build Coastguard Worker  "test.java.security.KeyStore",
197*795d594fSAndroid Build Coastguard Worker  "test.java.security.Provider",
198*795d594fSAndroid Build Coastguard Worker  # test.java.time
199*795d594fSAndroid Build Coastguard Worker  "test.java.time",
200*795d594fSAndroid Build Coastguard Worker  # test.java.util
201*795d594fSAndroid Build Coastguard Worker  "test.java.util.Arrays",
202*795d594fSAndroid Build Coastguard Worker  "test.java.util.Collection",
203*795d594fSAndroid Build Coastguard Worker  "test.java.util.Collections",
204*795d594fSAndroid Build Coastguard Worker  "test.java.util.Date",
205*795d594fSAndroid Build Coastguard Worker  "test.java.util.EnumMap",
206*795d594fSAndroid Build Coastguard Worker  "test.java.util.EnumSet",
207*795d594fSAndroid Build Coastguard Worker  "test.java.util.GregorianCalendar",
208*795d594fSAndroid Build Coastguard Worker  "test.java.util.LinkedHashMap",
209*795d594fSAndroid Build Coastguard Worker  "test.java.util.LinkedHashSet",
210*795d594fSAndroid Build Coastguard Worker  "test.java.util.List",
211*795d594fSAndroid Build Coastguard Worker  "test.java.util.Map",
212*795d594fSAndroid Build Coastguard Worker  "test.java.util.Optional",
213*795d594fSAndroid Build Coastguard Worker  "test.java.util.TestFormatter",
214*795d594fSAndroid Build Coastguard Worker  "test.java.util.TimeZone",
215*795d594fSAndroid Build Coastguard Worker  # test.java.util.concurrent
216*795d594fSAndroid Build Coastguard Worker  "test.java.util.concurrent",
217*795d594fSAndroid Build Coastguard Worker  # test.java.util.function
218*795d594fSAndroid Build Coastguard Worker  "test.java.util.function",
219*795d594fSAndroid Build Coastguard Worker  # test.java.util.stream
220*795d594fSAndroid Build Coastguard Worker  "test.java.util.stream",
221*795d594fSAndroid Build Coastguard Worker  # test.java.util.zip
222*795d594fSAndroid Build Coastguard Worker  "test.java.util.zip.ZipFile",
223*795d594fSAndroid Build Coastguard Worker  # tck.java.time
224*795d594fSAndroid Build Coastguard Worker  "tck.java.time",
225*795d594fSAndroid Build Coastguard Worker]
226*795d594fSAndroid Build Coastguard Worker# "org.apache.harmony.security",  # We don't have rights to revert changes in case of failures.
227*795d594fSAndroid Build Coastguard Worker
228*795d594fSAndroid Build Coastguard Worker# Note: This must start with the CORE_IMG_JARS in Android.common_path.mk
229*795d594fSAndroid Build Coastguard Worker# because that's what we use for compiling the boot.art image.
230*795d594fSAndroid Build Coastguard Worker# It may contain additional modules from TEST_CORE_JARS.
231*795d594fSAndroid Build Coastguard WorkerBOOT_CLASSPATH = [
232*795d594fSAndroid Build Coastguard Worker  "/apex/com.android.art/javalib/core-oj.jar",
233*795d594fSAndroid Build Coastguard Worker  "/apex/com.android.art/javalib/core-libart.jar",
234*795d594fSAndroid Build Coastguard Worker  "/apex/com.android.art/javalib/okhttp.jar",
235*795d594fSAndroid Build Coastguard Worker  "/apex/com.android.art/javalib/bouncycastle.jar",
236*795d594fSAndroid Build Coastguard Worker  "/apex/com.android.art/javalib/apache-xml.jar",
237*795d594fSAndroid Build Coastguard Worker  "/apex/com.android.i18n/javalib/core-icu4j.jar",
238*795d594fSAndroid Build Coastguard Worker  "/apex/com.android.conscrypt/javalib/conscrypt.jar",
239*795d594fSAndroid Build Coastguard Worker]
240*795d594fSAndroid Build Coastguard Worker
241*795d594fSAndroid Build Coastguard WorkerCLASSPATH = ["core-tests", "core-ojtests", "jsr166-tests", "mockito-target"]
242*795d594fSAndroid Build Coastguard Worker
243*795d594fSAndroid Build Coastguard WorkerSLOW_OJLUNI_TESTS = {
244*795d594fSAndroid Build Coastguard Worker  "test.java.awt",
245*795d594fSAndroid Build Coastguard Worker  "test.java.lang.String",
246*795d594fSAndroid Build Coastguard Worker  "test.java.lang.invoke",
247*795d594fSAndroid Build Coastguard Worker  "test.java.nio.channels.Selector",
248*795d594fSAndroid Build Coastguard Worker  "test.java.time",
249*795d594fSAndroid Build Coastguard Worker  "test.java.util.Arrays",
250*795d594fSAndroid Build Coastguard Worker  "test.java.util.Map",
251*795d594fSAndroid Build Coastguard Worker  "test.java.util.concurrent",
252*795d594fSAndroid Build Coastguard Worker  "test.java.util.stream",
253*795d594fSAndroid Build Coastguard Worker  "test.java.util.zip.ZipFile",
254*795d594fSAndroid Build Coastguard Worker  "tck.java.time",
255*795d594fSAndroid Build Coastguard Worker}
256*795d594fSAndroid Build Coastguard Worker
257*795d594fSAndroid Build Coastguard Worker# Disabled to unblock art-buildbot
258*795d594fSAndroid Build Coastguard Worker# These tests fail with "java.io.IOException: Stream closed", tracked in
259*795d594fSAndroid Build Coastguard Worker# http://b/235566533 and http://b/208639267
260*795d594fSAndroid Build Coastguard WorkerDISABLED_GCSTRESS_DEBUG_TESTS = {
261*795d594fSAndroid Build Coastguard Worker  "test.java.lang.StrictMath.HypotTests#testAgainstTranslit_shard1",
262*795d594fSAndroid Build Coastguard Worker  "test.java.lang.StrictMath.HypotTests#testAgainstTranslit_shard2",
263*795d594fSAndroid Build Coastguard Worker  "test.java.lang.StrictMath.HypotTests#testAgainstTranslit_shard3",
264*795d594fSAndroid Build Coastguard Worker  "test.java.lang.StrictMath.HypotTests#testAgainstTranslit_shard4",
265*795d594fSAndroid Build Coastguard Worker  "test.java.math.BigDecimal",
266*795d594fSAndroid Build Coastguard Worker  "test.java.math.BigInteger#testConstructor",
267*795d594fSAndroid Build Coastguard Worker  "test.java.util.TestFormatter",
268*795d594fSAndroid Build Coastguard Worker  "test.java.util.Collection",
269*795d594fSAndroid Build Coastguard Worker}
270*795d594fSAndroid Build Coastguard Worker
271*795d594fSAndroid Build Coastguard WorkerDISABLED_FUGU_TESTS = {
272*795d594fSAndroid Build Coastguard Worker  "org.apache.harmony.luni.tests.internal.net.www.protocol.http.HttpURLConnection",
273*795d594fSAndroid Build Coastguard Worker  "org.apache.harmony.luni.tests.internal.net.www.protocol.https.HttpsURLConnection",
274*795d594fSAndroid Build Coastguard Worker  "test.java.awt",
275*795d594fSAndroid Build Coastguard Worker  "test.java.io.ByteArrayInputStream",
276*795d594fSAndroid Build Coastguard Worker  "test.java.io.ByteArrayOutputStream",
277*795d594fSAndroid Build Coastguard Worker  "test.java.io.InputStream",
278*795d594fSAndroid Build Coastguard Worker  "test.java.io.OutputStream",
279*795d594fSAndroid Build Coastguard Worker  "test.java.io.PrintStream",
280*795d594fSAndroid Build Coastguard Worker  "test.java.io.PrintWriter",
281*795d594fSAndroid Build Coastguard Worker  "test.java.io.Reader",
282*795d594fSAndroid Build Coastguard Worker  "test.java.io.Writer",
283*795d594fSAndroid Build Coastguard Worker  "test.java.lang.Boolean",
284*795d594fSAndroid Build Coastguard Worker  "test.java.lang.ClassLoader",
285*795d594fSAndroid Build Coastguard Worker  "test.java.lang.Double",
286*795d594fSAndroid Build Coastguard Worker  "test.java.lang.Float",
287*795d594fSAndroid Build Coastguard Worker  "test.java.lang.Integer",
288*795d594fSAndroid Build Coastguard Worker  "test.java.lang.Long",
289*795d594fSAndroid Build Coastguard Worker  "test.java.lang.StrictMath.CubeRootTests",
290*795d594fSAndroid Build Coastguard Worker  "test.java.lang.StrictMath.Expm1Tests",
291*795d594fSAndroid Build Coastguard Worker  "test.java.lang.StrictMath.ExpTests",
292*795d594fSAndroid Build Coastguard Worker  "test.java.lang.StrictMath.HyperbolicTests",
293*795d594fSAndroid Build Coastguard Worker  "test.java.lang.StrictMath.HypotTests#testAgainstTranslit_shard1",
294*795d594fSAndroid Build Coastguard Worker  "test.java.lang.StrictMath.HypotTests#testAgainstTranslit_shard2",
295*795d594fSAndroid Build Coastguard Worker  "test.java.lang.StrictMath.HypotTests#testAgainstTranslit_shard3",
296*795d594fSAndroid Build Coastguard Worker  "test.java.lang.StrictMath.HypotTests#testAgainstTranslit_shard4",
297*795d594fSAndroid Build Coastguard Worker  "test.java.lang.StrictMath.HypotTests#testHypot",
298*795d594fSAndroid Build Coastguard Worker  "test.java.lang.StrictMath.Log1pTests",
299*795d594fSAndroid Build Coastguard Worker  "test.java.lang.StrictMath.Log10Tests",
300*795d594fSAndroid Build Coastguard Worker  "test.java.lang.StrictMath.MultiplicationTests",
301*795d594fSAndroid Build Coastguard Worker  "test.java.lang.StrictMath.PowTests",
302*795d594fSAndroid Build Coastguard Worker  "test.java.lang.String",
303*795d594fSAndroid Build Coastguard Worker  "test.java.lang.Thread",
304*795d594fSAndroid Build Coastguard Worker  "test.java.lang.invoke",
305*795d594fSAndroid Build Coastguard Worker  "test.java.lang.ref.SoftReference",
306*795d594fSAndroid Build Coastguard Worker  "test.java.lang.ref.BasicTest",
307*795d594fSAndroid Build Coastguard Worker  "test.java.lang.ref.EnqueueNullRefTest",
308*795d594fSAndroid Build Coastguard Worker  "test.java.lang.ref.EnqueuePollRaceTest",
309*795d594fSAndroid Build Coastguard Worker  "test.java.lang.ref.ReferenceCloneTest",
310*795d594fSAndroid Build Coastguard Worker  "test.java.lang.ref.ReferenceEnqueuePendingTest",
311*795d594fSAndroid Build Coastguard Worker  "test.java.math.BigDecimal",
312*795d594fSAndroid Build Coastguard Worker  "test.java.math.BigInteger#testArithmetic",
313*795d594fSAndroid Build Coastguard Worker  "test.java.math.BigInteger#testBitCount",
314*795d594fSAndroid Build Coastguard Worker  "test.java.math.BigInteger#testBitLength",
315*795d594fSAndroid Build Coastguard Worker  "test.java.math.BigInteger#testbitOps",
316*795d594fSAndroid Build Coastguard Worker  "test.java.math.BigInteger#testBitwise",
317*795d594fSAndroid Build Coastguard Worker  "test.java.math.BigInteger#testByteArrayConv",
318*795d594fSAndroid Build Coastguard Worker  "test.java.math.BigInteger#testConstructor",
319*795d594fSAndroid Build Coastguard Worker  "test.java.math.BigInteger#testDivideAndReminder",
320*795d594fSAndroid Build Coastguard Worker  "test.java.math.BigInteger#testDivideLarge",
321*795d594fSAndroid Build Coastguard Worker  "test.java.math.BigInteger#testModExp",
322*795d594fSAndroid Build Coastguard Worker  "test.java.math.BigInteger#testMultiplyLarge",
323*795d594fSAndroid Build Coastguard Worker  "test.java.math.BigInteger#testNextProbablePrime",
324*795d594fSAndroid Build Coastguard Worker  "test.java.math.BigInteger#testPow",
325*795d594fSAndroid Build Coastguard Worker  "test.java.math.BigInteger#testSerialize",
326*795d594fSAndroid Build Coastguard Worker  "test.java.math.BigInteger#testShift",
327*795d594fSAndroid Build Coastguard Worker  "test.java.math.BigInteger#testSquare",
328*795d594fSAndroid Build Coastguard Worker  "test.java.math.BigInteger#testSquareLarge",
329*795d594fSAndroid Build Coastguard Worker  "test.java.math.BigInteger#testSquareRootAndReminder",
330*795d594fSAndroid Build Coastguard Worker  "test.java.math.BigInteger#testStringConv_generic",
331*795d594fSAndroid Build Coastguard Worker  "test.java.math.RoundingMode",
332*795d594fSAndroid Build Coastguard Worker  "test.java.net.DatagramSocket",
333*795d594fSAndroid Build Coastguard Worker  "test.java.net.Socket",
334*795d594fSAndroid Build Coastguard Worker  "test.java.net.SocketOptions",
335*795d594fSAndroid Build Coastguard Worker  "test.java.net.URLDecoder",
336*795d594fSAndroid Build Coastguard Worker  "test.java.net.URLEncoder",
337*795d594fSAndroid Build Coastguard Worker  "test.java.nio.channels.Channels",
338*795d594fSAndroid Build Coastguard Worker  "test.java.nio.channels.SelectionKey",
339*795d594fSAndroid Build Coastguard Worker  "test.java.nio.channels.Selector",
340*795d594fSAndroid Build Coastguard Worker  "test.java.nio.file",
341*795d594fSAndroid Build Coastguard Worker  "test.java.security.cert",
342*795d594fSAndroid Build Coastguard Worker  "test.java.security.KeyAgreement.KeyAgreementTest",
343*795d594fSAndroid Build Coastguard Worker  "test.java.security.KeyAgreement.KeySizeTest#testECDHKeySize",
344*795d594fSAndroid Build Coastguard Worker  "test.java.security.KeyAgreement.KeySpecTest",
345*795d594fSAndroid Build Coastguard Worker  "test.java.security.KeyAgreement.MultiThreadTest",
346*795d594fSAndroid Build Coastguard Worker  "test.java.security.KeyAgreement.NegativeTest",
347*795d594fSAndroid Build Coastguard Worker  "test.java.security.KeyStore",
348*795d594fSAndroid Build Coastguard Worker  "test.java.security.Provider",
349*795d594fSAndroid Build Coastguard Worker  "test.java.time",
350*795d594fSAndroid Build Coastguard Worker  "test.java.util.Arrays",
351*795d594fSAndroid Build Coastguard Worker  "test.java.util.Collection",
352*795d594fSAndroid Build Coastguard Worker  "test.java.util.Collections",
353*795d594fSAndroid Build Coastguard Worker  "test.java.util.Date",
354*795d594fSAndroid Build Coastguard Worker  "test.java.util.EnumMap",
355*795d594fSAndroid Build Coastguard Worker  "test.java.util.EnumSet",
356*795d594fSAndroid Build Coastguard Worker  "test.java.util.GregorianCalendar",
357*795d594fSAndroid Build Coastguard Worker  "test.java.util.LinkedHashMap",
358*795d594fSAndroid Build Coastguard Worker  "test.java.util.LinkedHashSet",
359*795d594fSAndroid Build Coastguard Worker  "test.java.util.List",
360*795d594fSAndroid Build Coastguard Worker  "test.java.util.Map",
361*795d594fSAndroid Build Coastguard Worker  "test.java.util.Optional",
362*795d594fSAndroid Build Coastguard Worker  "test.java.util.TestFormatter",
363*795d594fSAndroid Build Coastguard Worker  "test.java.util.TimeZone",
364*795d594fSAndroid Build Coastguard Worker  "test.java.util.function",
365*795d594fSAndroid Build Coastguard Worker  "test.java.util.stream",
366*795d594fSAndroid Build Coastguard Worker  "tck.java.time",
367*795d594fSAndroid Build Coastguard Worker}
368*795d594fSAndroid Build Coastguard Worker
369*795d594fSAndroid Build Coastguard Workerdef get_jar_filename(classpath):
370*795d594fSAndroid Build Coastguard Worker  base_path = (ANDROID_PRODUCT_OUT + "/../..") if ANDROID_PRODUCT_OUT else "out/target"
371*795d594fSAndroid Build Coastguard Worker  base_path = os.path.normpath(base_path)  # Normalize ".." components for readability.
372*795d594fSAndroid Build Coastguard Worker  return f"{base_path}/common/obj/JAVA_LIBRARIES/{classpath}_intermediates/classes.jar"
373*795d594fSAndroid Build Coastguard Worker
374*795d594fSAndroid Build Coastguard Workerdef get_timeout_secs():
375*795d594fSAndroid Build Coastguard Worker  default_timeout_secs = 600
376*795d594fSAndroid Build Coastguard Worker  if args.gcstress:
377*795d594fSAndroid Build Coastguard Worker    default_timeout_secs = 1200
378*795d594fSAndroid Build Coastguard Worker    if args.debug:
379*795d594fSAndroid Build Coastguard Worker      default_timeout_secs = 1800
380*795d594fSAndroid Build Coastguard Worker  return args.timeout or default_timeout_secs
381*795d594fSAndroid Build Coastguard Worker
382*795d594fSAndroid Build Coastguard Workerdef get_expected_failures():
383*795d594fSAndroid Build Coastguard Worker  failures = ["art/tools/libcore_failures.txt"]
384*795d594fSAndroid Build Coastguard Worker  if args.mode != "jvm":
385*795d594fSAndroid Build Coastguard Worker    if args.gcstress:
386*795d594fSAndroid Build Coastguard Worker      failures.append("art/tools/libcore_gcstress_failures.txt")
387*795d594fSAndroid Build Coastguard Worker    if args.gcstress and args.debug:
388*795d594fSAndroid Build Coastguard Worker      failures.append("art/tools/libcore_gcstress_debug_failures.txt")
389*795d594fSAndroid Build Coastguard Worker    if args.debug and not args.gcstress and args.getrandom:
390*795d594fSAndroid Build Coastguard Worker      failures.append("art/tools/libcore_debug_failures.txt")
391*795d594fSAndroid Build Coastguard Worker    if not args.getrandom:
392*795d594fSAndroid Build Coastguard Worker      failures.append("art/tools/libcore_fugu_failures.txt")
393*795d594fSAndroid Build Coastguard Worker  return failures
394*795d594fSAndroid Build Coastguard Worker
395*795d594fSAndroid Build Coastguard Workerdef get_test_names():
396*795d594fSAndroid Build Coastguard Worker  if args.tests:
397*795d594fSAndroid Build Coastguard Worker    return args.tests
398*795d594fSAndroid Build Coastguard Worker  test_names = list(LIBCORE_TEST_NAMES)
399*795d594fSAndroid Build Coastguard Worker  # See b/78228743 and b/178351808.
400*795d594fSAndroid Build Coastguard Worker  if args.gcstress or args.debug or args.mode == "jvm":
401*795d594fSAndroid Build Coastguard Worker    test_names = list(t for t in test_names if not t.startswith("libcore.highmemorytest"))
402*795d594fSAndroid Build Coastguard Worker    test_names = list(filter(lambda x: x not in SLOW_OJLUNI_TESTS, test_names))
403*795d594fSAndroid Build Coastguard Worker  if args.gcstress and args.debug:
404*795d594fSAndroid Build Coastguard Worker    test_names = list(filter(lambda x: x not in DISABLED_GCSTRESS_DEBUG_TESTS, test_names))
405*795d594fSAndroid Build Coastguard Worker  if not args.getrandom:
406*795d594fSAndroid Build Coastguard Worker    # Disable libcore.highmemorytest due to limited ram on fugu. http://b/258173036
407*795d594fSAndroid Build Coastguard Worker    test_names = list(filter(lambda x: x not in DISABLED_FUGU_TESTS and
408*795d594fSAndroid Build Coastguard Worker                                       not x.startswith("libcore.highmemorytest"), test_names))
409*795d594fSAndroid Build Coastguard Worker  return test_names
410*795d594fSAndroid Build Coastguard Worker
411*795d594fSAndroid Build Coastguard Workerdef get_vogar_command(test_name):
412*795d594fSAndroid Build Coastguard Worker  cmd = ["vogar"]
413*795d594fSAndroid Build Coastguard Worker  if args.mode == "device":
414*795d594fSAndroid Build Coastguard Worker    cmd.append("--mode=device --vm-arg -Ximage:/system/framework/art_boot_images/boot.art")
415*795d594fSAndroid Build Coastguard Worker    cmd.append("--vm-arg -Xbootclasspath:" + ":".join(BOOT_CLASSPATH))
416*795d594fSAndroid Build Coastguard Worker
417*795d594fSAndroid Build Coastguard Worker  if args.mode == "host":
418*795d594fSAndroid Build Coastguard Worker    # We explicitly give a wrong path for the image, to ensure vogar
419*795d594fSAndroid Build Coastguard Worker    # will create a boot image with the default compiler. Note that
420*795d594fSAndroid Build Coastguard Worker    # giving an existing image on host does not work because of
421*795d594fSAndroid Build Coastguard Worker    # classpath/resources differences when compiling the boot image.
422*795d594fSAndroid Build Coastguard Worker    cmd.append("--mode=host --vm-arg -Ximage:/non/existent/vogar.art")
423*795d594fSAndroid Build Coastguard Worker  if args.mode == "jvm":
424*795d594fSAndroid Build Coastguard Worker    cmd.append("--mode=jvm")
425*795d594fSAndroid Build Coastguard Worker  if args.variant:
426*795d594fSAndroid Build Coastguard Worker    cmd.append("--variant=" + args.variant)
427*795d594fSAndroid Build Coastguard Worker  if args.gcstress:
428*795d594fSAndroid Build Coastguard Worker    cmd.append("--vm-arg -Xgc:gcstress")
429*795d594fSAndroid Build Coastguard Worker    cmd.append('--vm-arg -Djsr166.delay.factor="1.50"')
430*795d594fSAndroid Build Coastguard Worker  if args.debug:
431*795d594fSAndroid Build Coastguard Worker    cmd.append("--vm-arg -XXlib:libartd.so --vm-arg -XX:SlowDebug=true")
432*795d594fSAndroid Build Coastguard Worker
433*795d594fSAndroid Build Coastguard Worker  # The only device in go/art-buildbot without getrandom is fugu. We limit the amount of memory
434*795d594fSAndroid Build Coastguard Worker  # per runtime for fugu to avoid low memory killer, fugu has 4-cores 1GB RAM (b/258171768).
435*795d594fSAndroid Build Coastguard Worker  if not args.getrandom:
436*795d594fSAndroid Build Coastguard Worker    cmd.append("--vm-arg -Xmx128M")
437*795d594fSAndroid Build Coastguard Worker
438*795d594fSAndroid Build Coastguard Worker  if args.mode == "device":
439*795d594fSAndroid Build Coastguard Worker    if ART_TEST_CHROOT:
440*795d594fSAndroid Build Coastguard Worker      cmd.append(f"--chroot {ART_TEST_CHROOT} --device-dir=/tmp/vogar/test-{test_name}")
441*795d594fSAndroid Build Coastguard Worker    else:
442*795d594fSAndroid Build Coastguard Worker      cmd.append(f"--device-dir=/data/local/tmp/vogar/test-{test_name}")
443*795d594fSAndroid Build Coastguard Worker    cmd.append(f"--vm-command={ART_TEST_ANDROID_ROOT}/bin/art")
444*795d594fSAndroid Build Coastguard Worker  else:
445*795d594fSAndroid Build Coastguard Worker    cmd.append(f"--device-dir=/tmp/vogar/test-{test_name}")
446*795d594fSAndroid Build Coastguard Worker
447*795d594fSAndroid Build Coastguard Worker  if args.mode != "jvm":
448*795d594fSAndroid Build Coastguard Worker    cmd.append("--timeout {}".format(get_timeout_secs()))
449*795d594fSAndroid Build Coastguard Worker    cmd.append("--toolchain d8 --language CUR")
450*795d594fSAndroid Build Coastguard Worker    if args.jit:
451*795d594fSAndroid Build Coastguard Worker      cmd.append("--vm-arg -Xcompiler-option --vm-arg --compiler-filter=verify")
452*795d594fSAndroid Build Coastguard Worker    cmd.append("--vm-arg -Xusejit:{}".format(str(args.jit).lower()))
453*795d594fSAndroid Build Coastguard Worker
454*795d594fSAndroid Build Coastguard Worker  if args.verbose:
455*795d594fSAndroid Build Coastguard Worker    cmd.append("--verbose")
456*795d594fSAndroid Build Coastguard Worker
457*795d594fSAndroid Build Coastguard Worker  # Suppress color codes if not attached to a terminal
458*795d594fSAndroid Build Coastguard Worker  if not sys.stdout.isatty():
459*795d594fSAndroid Build Coastguard Worker    cmd.append("--no-color")
460*795d594fSAndroid Build Coastguard Worker
461*795d594fSAndroid Build Coastguard Worker  cmd.extend("--expectations " + f for f in get_expected_failures())
462*795d594fSAndroid Build Coastguard Worker  cmd.extend("--classpath " + get_jar_filename(cp) for cp in CLASSPATH)
463*795d594fSAndroid Build Coastguard Worker  cmd.append(test_name)
464*795d594fSAndroid Build Coastguard Worker
465*795d594fSAndroid Build Coastguard Worker  # vogar target options
466*795d594fSAndroid Build Coastguard Worker  if not os.path.exists('frameworks/base'):
467*795d594fSAndroid Build Coastguard Worker    cmd.append("--")
468*795d594fSAndroid Build Coastguard Worker    # Skip @NonMts test in thin manifest which uses prebuilt Conscrypt and ICU.
469*795d594fSAndroid Build Coastguard Worker    # It's similar to running libcore tests on the older platforms.
470*795d594fSAndroid Build Coastguard Worker    # @NonMts means that the test doesn't pass on a older platform version.
471*795d594fSAndroid Build Coastguard Worker    cmd.append("--exclude-filter libcore.test.annotation.NonMts")
472*795d594fSAndroid Build Coastguard Worker  return cmd
473*795d594fSAndroid Build Coastguard Worker
474*795d594fSAndroid Build Coastguard Workerdef get_target_cpu_count():
475*795d594fSAndroid Build Coastguard Worker  adb_command = 'adb shell cat /sys/devices/system/cpu/present'
476*795d594fSAndroid Build Coastguard Worker  with subprocess.Popen(adb_command.split(),
477*795d594fSAndroid Build Coastguard Worker                        stderr=subprocess.STDOUT,
478*795d594fSAndroid Build Coastguard Worker                        stdout=subprocess.PIPE,
479*795d594fSAndroid Build Coastguard Worker                        universal_newlines=True) as proc:
480*795d594fSAndroid Build Coastguard Worker    assert(proc.wait() == 0)  # Check the exit code.
481*795d594fSAndroid Build Coastguard Worker    match = re.match(r'\d*-(\d*)', proc.stdout.read())
482*795d594fSAndroid Build Coastguard Worker    assert(match)
483*795d594fSAndroid Build Coastguard Worker    return int(match.group(1)) + 1  # Add one to convert from "last-index" to "count"
484*795d594fSAndroid Build Coastguard Worker
485*795d594fSAndroid Build Coastguard Workerdef main():
486*795d594fSAndroid Build Coastguard Worker  global args
487*795d594fSAndroid Build Coastguard Worker  args = parse_args()
488*795d594fSAndroid Build Coastguard Worker
489*795d594fSAndroid Build Coastguard Worker  if not os.path.exists('build/envsetup.sh'):
490*795d594fSAndroid Build Coastguard Worker    raise AssertionError("Script needs to be run at the root of the android tree")
491*795d594fSAndroid Build Coastguard Worker  for jar in map(get_jar_filename, CLASSPATH):
492*795d594fSAndroid Build Coastguard Worker    if not os.path.exists(jar):
493*795d594fSAndroid Build Coastguard Worker      raise AssertionError(f"Missing {jar}. Run buildbot-build.sh first.")
494*795d594fSAndroid Build Coastguard Worker
495*795d594fSAndroid Build Coastguard Worker  if not args.jobs:
496*795d594fSAndroid Build Coastguard Worker    if args.mode == "device":
497*795d594fSAndroid Build Coastguard Worker      args.jobs = get_target_cpu_count()
498*795d594fSAndroid Build Coastguard Worker    else:
499*795d594fSAndroid Build Coastguard Worker      args.jobs = multiprocessing.cpu_count()
500*795d594fSAndroid Build Coastguard Worker      if args.gcstress:
501*795d594fSAndroid Build Coastguard Worker        # TODO: Investigate and fix the underlying issues.
502*795d594fSAndroid Build Coastguard Worker        args.jobs = args.jobs // 2
503*795d594fSAndroid Build Coastguard Worker
504*795d594fSAndroid Build Coastguard Worker  def run_test(test_name):
505*795d594fSAndroid Build Coastguard Worker    cmd = " ".join(get_vogar_command(test_name))
506*795d594fSAndroid Build Coastguard Worker    if args.dry_run:
507*795d594fSAndroid Build Coastguard Worker      return test_name, cmd, "Dry-run: skipping execution", 0
508*795d594fSAndroid Build Coastguard Worker    with subprocess.Popen(shlex.split(cmd),
509*795d594fSAndroid Build Coastguard Worker                          stderr=subprocess.STDOUT,
510*795d594fSAndroid Build Coastguard Worker                          stdout=subprocess.PIPE,
511*795d594fSAndroid Build Coastguard Worker                          universal_newlines=True) as proc:
512*795d594fSAndroid Build Coastguard Worker      return test_name, cmd, proc.communicate()[0], proc.wait()
513*795d594fSAndroid Build Coastguard Worker
514*795d594fSAndroid Build Coastguard Worker  failed_regex = re.compile(r"^.* FAIL \((?:EXEC_FAILED|ERROR)\)$", re.MULTILINE)
515*795d594fSAndroid Build Coastguard Worker  failed_tests, max_exit_code = [], 0
516*795d594fSAndroid Build Coastguard Worker  with concurrent.futures.ThreadPoolExecutor(max_workers=args.jobs) as pool:
517*795d594fSAndroid Build Coastguard Worker    futures = [pool.submit(run_test, test_name) for test_name in get_test_names()]
518*795d594fSAndroid Build Coastguard Worker    print(f"Running {len(futures)} tasks on {args.jobs} core(s)...\n")
519*795d594fSAndroid Build Coastguard Worker    for i, future in enumerate(concurrent.futures.as_completed(futures)):
520*795d594fSAndroid Build Coastguard Worker      test_name, cmd, stdout, exit_code = future.result()
521*795d594fSAndroid Build Coastguard Worker      if exit_code != 0 or args.dry_run or args.verbose:
522*795d594fSAndroid Build Coastguard Worker        print(cmd)
523*795d594fSAndroid Build Coastguard Worker        print(stdout.strip())
524*795d594fSAndroid Build Coastguard Worker      else:
525*795d594fSAndroid Build Coastguard Worker        print(stdout.strip().split("\n")[-1])  # Vogar final summary line.
526*795d594fSAndroid Build Coastguard Worker      failed_match = failed_regex.findall(stdout)
527*795d594fSAndroid Build Coastguard Worker      failed_tests.extend(failed_match)
528*795d594fSAndroid Build Coastguard Worker      max_exit_code = max(max_exit_code, exit_code)
529*795d594fSAndroid Build Coastguard Worker      result = "PASSED" if exit_code == 0 else f"FAILED ({len(failed_match)} test(s) failed)"
530*795d594fSAndroid Build Coastguard Worker      print(f"[{i+1}/{len(futures)}] Test set {test_name} {result}\n")
531*795d594fSAndroid Build Coastguard Worker  print(f"Overall, {len(failed_tests)} test(s) failed:")
532*795d594fSAndroid Build Coastguard Worker  print("\n".join(failed_tests))
533*795d594fSAndroid Build Coastguard Worker  sys.exit(max_exit_code)
534*795d594fSAndroid Build Coastguard Worker
535*795d594fSAndroid Build Coastguard Workerif __name__ == '__main__':
536*795d594fSAndroid Build Coastguard Worker  main()
537