Fix test failures on sargo. am: 16b9c0b1ab am: bd10c39787

Original change: https://android-review.googlesource.com/c/platform/art/+/2968599

Change-Id: I2d2362c798a9d927e59876fb4981f905e6c9f9ed
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
diff --git a/libnativeloader/test/Android.bp b/libnativeloader/test/Android.bp
index 268e93a..6166725 100644
--- a/libnativeloader/test/Android.bp
+++ b/libnativeloader/test/Android.bp
@@ -102,11 +102,12 @@
 
 java_library {
     name: "loadlibrarytest_testlib",
-    sdk_version: "31",
+    sdk_version: "system_31",
     static_libs: [
         "androidx.test.ext.junit",
         "androidx.test.ext.truth",
         "androidx.test.rules",
+        "modules-utils-build_system",
     ],
     libs: [
         "libnativeloader_system_shared_lib",
diff --git a/libnativeloader/test/src/android/test/app/ProductAppTest.java b/libnativeloader/test/src/android/test/app/ProductAppTest.java
index bfa648b..4cf379c 100644
--- a/libnativeloader/test/src/android/test/app/ProductAppTest.java
+++ b/libnativeloader/test/src/android/test/app/ProductAppTest.java
@@ -16,8 +16,6 @@
 
 package android.test.app;
 
-import android.os.Build;
-import android.os.SystemProperties;
 import android.test.lib.AppTestCommon;
 import android.test.lib.TestUtils;
 import android.test.productsharedlib.ProductSharedLib;
@@ -36,13 +34,6 @@
         return AppLocation.PRODUCT;
     }
 
-    // True if apps in product partitions get shared library namespaces, so we
-    // cannot test that libs in system and system_ext get blocked.
-    private static boolean productAppsAreShared() {
-        return Build.VERSION.SDK_INT <= 34 && // UPSIDE_DOWN_CAKE
-                SystemProperties.get("ro.product.vndk.version").isEmpty();
-    }
-
     @Test
     public void testPrivateLibsExist() {
         TestUtils.testPrivateLibsExist("/product", "product_private");
@@ -53,7 +44,7 @@
         System.loadLibrary("system_extpub.oem1");
         System.loadLibrary("system_extpub.oem2");
         System.loadLibrary("system_extpub1.oem1");
-        if (!productAppsAreShared()) {
+        if (!TestUtils.productAppsAreShared()) {
             TestUtils.assertLibraryInaccessible( // Missing <uses-native-library>.
                     () -> System.loadLibrary("system_extpub_nouses.oem2"));
         }
@@ -63,7 +54,7 @@
 
     @Test
     public void testLoadPrivateLibraries() {
-        if (!productAppsAreShared()) {
+        if (!TestUtils.productAppsAreShared()) {
             TestUtils.assertLibraryInaccessible(() -> System.loadLibrary("system_private1"));
             TestUtils.assertLibraryInaccessible(() -> System.loadLibrary("systemext_private1"));
         }
@@ -81,13 +72,14 @@
 
     @Test
     public void testLoadPrivateLibrariesViaSystemSharedLib() {
-        // TODO(b/237577392): Loading a private native system library via a shared system library
-        // ought to work.
-        TestUtils.assertLibraryInaccessible(() -> SystemSharedLib.loadLibrary("system_private2"));
-        TestUtils.assertLibraryInaccessible(
-                () -> SystemSharedLib.loadLibrary("systemext_private2"));
+        if (!TestUtils.productAppsAreShared()) {
+            // TODO(b/237577392): Loading a private native system library via a shared system
+            // library ought to work.
+            TestUtils.assertLibraryInaccessible(
+                    () -> SystemSharedLib.loadLibrary("system_private2"));
+            TestUtils.assertLibraryInaccessible(
+                    () -> SystemSharedLib.loadLibrary("systemext_private2"));
 
-        if (!productAppsAreShared()) {
             TestUtils.assertLibraryInaccessible(
                     () -> SystemSharedLib.loadLibrary("product_private2"));
         }
@@ -97,14 +89,14 @@
 
     @Test
     public void testLoadPrivateLibrariesViaSystemExtSharedLib() {
-        // TODO(b/237577392): Loading a private native system library via a shared system library
-        // ought to work.
-        TestUtils.assertLibraryInaccessible(
-                () -> SystemExtSharedLib.loadLibrary("system_private3"));
-        TestUtils.assertLibraryInaccessible(
-                () -> SystemExtSharedLib.loadLibrary("systemext_private3"));
+        if (!TestUtils.productAppsAreShared()) {
+            // TODO(b/237577392): Loading a private native system library via a shared system
+            // library ought to work.
+            TestUtils.assertLibraryInaccessible(
+                    () -> SystemExtSharedLib.loadLibrary("system_private3"));
+            TestUtils.assertLibraryInaccessible(
+                    () -> SystemExtSharedLib.loadLibrary("systemext_private3"));
 
-        if (!productAppsAreShared()) {
             TestUtils.assertLibraryInaccessible(
                     () -> SystemExtSharedLib.loadLibrary("product_private3"));
         }
@@ -115,7 +107,7 @@
 
     @Test
     public void testLoadPrivateLibrariesViaProductSharedLib() {
-        if (!productAppsAreShared()) {
+        if (!TestUtils.productAppsAreShared()) {
             TestUtils.assertLibraryInaccessible(
                     () -> ProductSharedLib.loadLibrary("system_private4"));
             TestUtils.assertLibraryInaccessible(
@@ -130,7 +122,7 @@
 
     @Test
     public void testLoadPrivateLibrariesViaVendorSharedLib() {
-        if (!productAppsAreShared()) {
+        if (!TestUtils.productAppsAreShared()) {
             TestUtils.assertLibraryInaccessible(
                     () -> VendorSharedLib.loadLibrary("system_private5"));
             TestUtils.assertLibraryInaccessible(
@@ -155,7 +147,7 @@
 
     @Test
     public void testLoadPrivateLibrariesWithAbsolutePaths() {
-        if (!productAppsAreShared()) {
+        if (!TestUtils.productAppsAreShared()) {
             TestUtils.assertLibraryInaccessible(
                     () -> System.load(TestUtils.libPath("/system", "system_private6")));
             TestUtils.assertLibraryInaccessible(
diff --git a/libnativeloader/test/src/android/test/lib/AppTestCommon.java b/libnativeloader/test/src/android/test/lib/AppTestCommon.java
index 36ef3dc..51f4655 100644
--- a/libnativeloader/test/src/android/test/lib/AppTestCommon.java
+++ b/libnativeloader/test/src/android/test/lib/AppTestCommon.java
@@ -32,31 +32,50 @@
 
     public abstract AppLocation getAppLocation();
 
-    // Loading private libs using absolute paths through shared libs should only
-    // depend on the location of the shared lib, so these tests are shared for
-    // all apps, regardless of location.
+    // Loading private libs using absolute paths through shared libs should
+    // normally only depend on the location of the shared lib, so these tests
+    // are shared for all apps, regardless of location.
 
-    // There's an exception for system apps. For them LibraryNamespaces::Create
-    // gets called with is_shared=true. That means they don't set up separate
-    // "unbundled" namespaces for the shared libs in product and vendor, so
-    // ProductSharedLib and VendorSharedLib can still load private system libs
-    // through their classloader namespaces, but not the private libs in the
-    // same partition as themselves.
-    private boolean isSharedSystemApp() {
-        return getAppLocation() == AppLocation.SYSTEM;
+    // Returns true when system private native libs are accessible directly from
+    // the app classloader namespace.
+    private boolean systemPrivateLibsAccessibleFromAppNamespace() {
+        // Currently it only works from system apps. It also works from product
+        // apps on old versions where they were treated like system apps.
+        // TODO(b/237577392): Fix this to work from system shared libs.
+        return getAppLocation() == AppLocation.SYSTEM
+                || (getAppLocation() == AppLocation.PRODUCT && TestUtils.productAppsAreShared());
+    }
+
+    // Detect exception when product private libs are accessible directly from
+    // the app classloader namespace even when they shouldn't be.
+    private boolean productPrivateLibsAccessibleFromAppNamespace() {
+        // In old versions where product apps were treated like system apps, the
+        // product private libs were included in the system namespace, so
+        // they're accessible both from system and product apps.
+        // TODO(b/237577392): Fix this to work from product shared libs.
+        return (getAppLocation() == AppLocation.SYSTEM || getAppLocation() == AppLocation.PRODUCT)
+                && TestUtils.productAppsAreShared();
+    }
+
+    // Detect exception where we don't switch from a shared system namespace to
+    // a product or vendor "unbundled" namespace when calling into
+    // ProductSharedLib and VendorSharedLib. That means they still can load
+    // private system libs but not private libs in their own partition.
+    // TODO(mast): Stop propagating the shared property (isBundledApp in
+    // LoadedApk.java) down to public and vendor shared java libs?
+    private boolean noSwitchToVendorOrProductNamespace() {
+        // System apps get shared namespaces, and also product apps on old
+        // versions where they were treated like system apps.
+        return getAppLocation() == AppLocation.SYSTEM
+                || (getAppLocation() == AppLocation.PRODUCT && TestUtils.productAppsAreShared());
     }
 
     @Test
     public void testLoadPrivateLibrariesViaSystemSharedLibWithAbsolutePaths() {
-        if (getAppLocation() == AppLocation.SYSTEM) {
+        if (systemPrivateLibsAccessibleFromAppNamespace()) {
             SystemSharedLib.load(TestUtils.libPath("/system", "system_private7"));
             SystemSharedLib.load(TestUtils.libPath("/system_ext", "systemext_private7"));
         } else {
-            // Cannot load private system libs because there is no provision in
-            // LibraryNamespaces::Create to create an "unbundled system apk" for
-            // shared system libs based on their location. Hence SystemSharedLib
-            // gets a classloader namespace as an "other apk", with the same
-            // library_path as the app.
             TestUtils.assertLibraryInaccessible(() -> {
                 SystemSharedLib.load(TestUtils.libPath("/system", "system_private7"));
             });
@@ -65,8 +84,13 @@
             });
         }
 
-        TestUtils.assertLibraryInaccessible(
-                () -> { SystemSharedLib.load(TestUtils.libPath("/product", "product_private7")); });
+        if (productPrivateLibsAccessibleFromAppNamespace()) {
+            SystemSharedLib.load(TestUtils.libPath("/product", "product_private7"));
+        } else {
+            TestUtils.assertLibraryInaccessible(() -> {
+                SystemSharedLib.load(TestUtils.libPath("/product", "product_private7"));
+            });
+        }
 
         TestUtils.assertLibraryInaccessible(
                 () -> { SystemSharedLib.load(TestUtils.libPath("/vendor", "vendor_private7")); });
@@ -74,11 +98,10 @@
 
     @Test
     public void testLoadPrivateLibrariesViaSystemExtSharedLibWithAbsolutePaths() {
-        if (getAppLocation() == AppLocation.SYSTEM) {
+        if (systemPrivateLibsAccessibleFromAppNamespace()) {
             SystemExtSharedLib.load(TestUtils.libPath("/system", "system_private8"));
             SystemExtSharedLib.load(TestUtils.libPath("/system_ext", "systemext_private8"));
         } else {
-            // See comment in the corresponding test for SystemSharedLib above.
             TestUtils.assertLibraryInaccessible(() -> {
                 SystemExtSharedLib.load(TestUtils.libPath("/system", "system_private8"));
             });
@@ -87,9 +110,13 @@
             });
         }
 
-        TestUtils.assertLibraryInaccessible(() -> {
+        if (productPrivateLibsAccessibleFromAppNamespace()) {
             SystemExtSharedLib.load(TestUtils.libPath("/product", "product_private8"));
-        });
+        } else {
+            TestUtils.assertLibraryInaccessible(() -> {
+                SystemExtSharedLib.load(TestUtils.libPath("/product", "product_private8"));
+            });
+        }
 
         TestUtils.assertLibraryInaccessible(() -> {
             SystemExtSharedLib.load(TestUtils.libPath("/vendor", "vendor_private8"));
@@ -98,7 +125,7 @@
 
     @Test
     public void testLoadPrivateLibrariesViaProductSharedLibWithAbsolutePaths() {
-        if (isSharedSystemApp()) {
+        if (systemPrivateLibsAccessibleFromAppNamespace() || noSwitchToVendorOrProductNamespace()) {
             ProductSharedLib.load(TestUtils.libPath("/system", "system_private9"));
             ProductSharedLib.load(TestUtils.libPath("/system_ext", "systemext_private9"));
         } else {
@@ -110,7 +137,17 @@
             });
         }
 
-        if (!isSharedSystemApp()) {
+        boolean loadPrivateProductLib;
+        if (TestUtils.productAppsAreShared()) {
+            // The library is accessible if the app is in either system or
+            // product, because both are loaded as system apps and private product
+            // libs are available for both.
+            loadPrivateProductLib = getAppLocation() == AppLocation.SYSTEM
+                    || getAppLocation() == AppLocation.PRODUCT;
+        } else {
+            loadPrivateProductLib = !noSwitchToVendorOrProductNamespace();
+        }
+        if (loadPrivateProductLib) {
             ProductSharedLib.load(TestUtils.libPath("/product", "product_private9"));
         } else {
             TestUtils.assertLibraryInaccessible(() -> {
@@ -124,7 +161,7 @@
 
     @Test
     public void testLoadPrivateLibrariesViaVendorSharedLibWithAbsolutePaths() {
-        if (isSharedSystemApp()) {
+        if (systemPrivateLibsAccessibleFromAppNamespace() || noSwitchToVendorOrProductNamespace()) {
             VendorSharedLib.load(TestUtils.libPath("/system", "system_private10"));
             VendorSharedLib.load(TestUtils.libPath("/system_ext", "systemext_private10"));
         } else {
@@ -136,11 +173,15 @@
             });
         }
 
-        TestUtils.assertLibraryInaccessible(() -> {
+        if (productPrivateLibsAccessibleFromAppNamespace()) {
             VendorSharedLib.load(TestUtils.libPath("/product", "product_private10"));
-        });
+        } else {
+            TestUtils.assertLibraryInaccessible(() -> {
+                VendorSharedLib.load(TestUtils.libPath("/product", "product_private10"));
+            });
+        }
 
-        if (!isSharedSystemApp()) {
+        if (!noSwitchToVendorOrProductNamespace()) {
             VendorSharedLib.load(TestUtils.libPath("/vendor", "vendor_private10"));
         } else {
             TestUtils.assertLibraryInaccessible(() -> {
diff --git a/libnativeloader/test/src/android/test/lib/TestUtils.java b/libnativeloader/test/src/android/test/lib/TestUtils.java
index 6d2a9db..5f5cd91 100644
--- a/libnativeloader/test/src/android/test/lib/TestUtils.java
+++ b/libnativeloader/test/src/android/test/lib/TestUtils.java
@@ -21,10 +21,12 @@
 
 import static org.junit.Assert.assertThrows;
 
-import android.os.Build;
+import android.os.SystemProperties;
 
 import androidx.test.platform.app.InstrumentationRegistry;
 
+import com.android.modules.utils.build.SdkLevel;
+
 import org.junit.function.ThrowingRunnable;
 
 import java.io.File;
@@ -44,7 +46,13 @@
     // True if we have to skip testing public libraries in the product
     // partition, which got supported in T.
     public static boolean skipPublicProductLibTests() {
-        return Build.VERSION.SDK_INT < 33; // TIRAMISU
+        return !SdkLevel.isAtLeastT();
+    }
+
+    // True if apps in product partitions get shared library namespaces, so we
+    // cannot test that libs in system and system_ext get blocked.
+    public static boolean productAppsAreShared() {
+        return !SdkLevel.isAtLeastU() && SystemProperties.get("ro.product.vndk.version").isEmpty();
     }
 
     // Test that private libs are present, as a safeguard so that the dlopen