Merge "AndroidPackageParsingTestBase: Re-throw failures in setUpPackages in individual tests" into rvc-dev
diff --git a/services/tests/servicestests/src/com/android/server/pm/parsing/AndroidPackageParsingTestBase.kt b/services/tests/servicestests/src/com/android/server/pm/parsing/AndroidPackageParsingTestBase.kt
index d7b02f4..19bf9b6 100644
--- a/services/tests/servicestests/src/com/android/server/pm/parsing/AndroidPackageParsingTestBase.kt
+++ b/services/tests/servicestests/src/com/android/server/pm/parsing/AndroidPackageParsingTestBase.kt
@@ -91,24 +91,35 @@
 
         lateinit var newPackages: List<AndroidPackage>
 
+        var failureInBeforeClass: Throwable? = null
+
         @Suppress("ConstantConditionIf")
         @JvmStatic
         @BeforeClass
         fun setUpPackages() {
-            this.oldPackages = apks.map {
-                packageParser.parsePackage(it, PackageParser.PARSE_IS_SYSTEM_DIR, false)
-            }
+            failureInBeforeClass = null
+            try {
+                this.oldPackages = apks.map {
+                    packageParser.parsePackage(it, PackageParser.PARSE_IS_SYSTEM_DIR, false)
+                }
 
-            this.newPackages = apks.map {
-                packageParser2.parsePackage(it, PackageParser.PARSE_IS_SYSTEM_DIR, false)
-            }
+                this.newPackages = apks.map {
+                    packageParser2.parsePackage(it, PackageParser.PARSE_IS_SYSTEM_DIR, false)
+                }
 
-            if (DUMP_HPROF_TO_EXTERNAL) {
-                System.gc()
-                Environment.getExternalStorageDirectory()
-                        .resolve("${AndroidPackageParsingTestBase::class.java.simpleName}.hprof")
-                        .absolutePath
-                        .run(Debug::dumpHprofData)
+                if (DUMP_HPROF_TO_EXTERNAL) {
+                    System.gc()
+                    Environment.getExternalStorageDirectory()
+                            .resolve(
+                                    "${AndroidPackageParsingTestBase::class.java.simpleName}.hprof")
+                            .absolutePath
+                            .run(Debug::dumpHprofData)
+                }
+            } catch (t: Throwable) {
+                // If we crash here we cause a tool failure (because we don't run any of the tests
+                // in the subclasses, leading to a difference between expected and actual test
+                // result counts).
+                failureInBeforeClass = t
             }
         }
 
@@ -137,6 +148,13 @@
         }
     }
 
+    @org.junit.Before
+    fun verifySetUpPackages() {
+        failureInBeforeClass?.let {
+            throw AssertionError("setUpPackages failed:", it)
+        }
+    }
+
     // The following methods dump an exact set of fields from the object to compare, because
     // 1. comprehensive equals/toStrings do not exist on all of the Info objects, and
     // 2. the test must only verify fields that [PackageParser.Package] can actually fill, as