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