Merge "Test that updatable APEXex are sorted on *CLASSPATH vars." am: 622ec08c90 am: 943bea4098 am: d6141dc1db

Original change: https://android-review.googlesource.com/c/platform/packages/modules/SdkExtensions/+/1699204

Change-Id: I2f1cb1829f7e2dac0ecf5105ada8d6bde15c14e0
diff --git a/tests/cts/Classpaths/src/android/os/ext/classpath/cts/ClasspathsTest.java b/tests/cts/Classpaths/src/android/os/ext/classpath/cts/ClasspathsTest.java
index ce87aad..4c4447c 100644
--- a/tests/cts/Classpaths/src/android/os/ext/classpath/cts/ClasspathsTest.java
+++ b/tests/cts/Classpaths/src/android/os/ext/classpath/cts/ClasspathsTest.java
@@ -40,6 +40,8 @@
 import org.junit.Test;
 import org.junit.runner.RunWith;
 
+import java.nio.file.Paths;
+
 /**
  * Tests for the contents of *CLASSPATH environ variables on a device.
  */
@@ -80,6 +82,8 @@
         assertThat(jars)
                 .prefixesMatch(expectedPrefixes)
                 .inOrder();
+
+        assertThat(getUpdatableApexes(jars)).isInOrder();
     }
 
     @Test
@@ -89,7 +93,7 @@
 
         assertThat(jars).containsNoDuplicates();
 
-        // DEX2OATBOOTCLASSPATH should only contain ART, core-icu4j, and platform system jars
+        // DEX2OATBOOTCLASSPATH must only contain ART, core-icu4j, and platform system jars
         assertThat(jars)
                 .containsAtLeast(LIBART_JAR, FRAMEWORK_JAR, ICU4J_JAR)
                 .inOrder();
@@ -101,6 +105,9 @@
         assertThat(jars)
                 .prefixesMatch(expectedPrefixes)
                 .inOrder();
+
+        // No updatable jars on DEX2OATBOOTCLASSPATH
+        assertThat(getUpdatableApexes(jars)).isEmpty();
     }
 
     @Test
@@ -118,6 +125,24 @@
         assertThat(jars)
                 .prefixesMatch(expectedPrefixes)
                 .inOrder();
+
+        assertThat(getUpdatableApexes(jars)).isInOrder();
+    }
+
+    /**
+     * Returns a derived subject with names of the updatable APEXes preserving the original
+     * order.
+     */
+    private static ImmutableList<String> getUpdatableApexes(ImmutableList<String> jars) {
+        return jars.stream()
+                .filter(jar -> jar.startsWith("/apex"))
+                // ICU4J_JAR is the last non-updatable APEX jar, i.e. everything after is
+                // considered to be an updatable APEX jar
+                .dropWhile(jar -> !jar.equals(ICU4J_JAR))
+                .skip(1)
+                // Map to APEX name from "/apex/<name>/javalibs/foo.jar"
+                .map(jar -> Paths.get(jar).getName(1).toString())
+                .collect(ImmutableList.toImmutableList());
     }
 
     final static class ClasspathSubject extends IterableSubject {
@@ -194,5 +219,6 @@
             }
             return -1;
         }
+
     }
 }