Verify that new apex wins during same grade install

Bug: 149657138
Test: atest StagedInstallTest#testInstallStagedApex_SameGrade_NewOneWins
Change-Id: I9cc6768b4207964c4bafac3b1c2fead28ef75945
diff --git a/hostsidetests/stagedinstall/Android.bp b/hostsidetests/stagedinstall/Android.bp
index 8a73ab9..6cf22d2 100644
--- a/hostsidetests/stagedinstall/Android.bp
+++ b/hostsidetests/stagedinstall/Android.bp
@@ -59,6 +59,7 @@
         ":StagedInstallTestApexV2_WithPostInstallHook",
         ":StagedInstallTestApexV2_WithPreInstallHook",
         ":StagedInstallTestApexV2_WrongSha",
+        ":StagedInstallTestApexV2_WithoutApkInApex",
         ":StagedInstallTestAppSamePackageNameAsApex",
         ":StagedInstallTestApexV2_SdkTargetP",
         ":StagedInstallTestApexV2_ApkInApexSdkTargetP",
@@ -346,6 +347,26 @@
 }
 
 prebuilt_apex {
+    name: "StagedInstallTestApexV2_WithoutApkInApex",
+    arch: {
+        arm: {
+              src: "testdata/apex/arm/com.android.apex.cts.shim.v2_without_apk_in_apex.apex",
+        },
+        arm64: {
+              src: "testdata/apex/arm/com.android.apex.cts.shim.v2_without_apk_in_apex.apex",
+        },
+        x86: {
+              src: "testdata/apex/x86/com.android.apex.cts.shim.v2_without_apk_in_apex.apex",
+        },
+        x86_64: {
+              src: "testdata/apex/x86/com.android.apex.cts.shim.v2_without_apk_in_apex.apex",
+        },
+    },
+    filename: "com.android.apex.cts.shim.v2_without_apk_in_apex.apex",
+    installable: false,
+}
+
+prebuilt_apex {
     name: "StagedInstallTestApexV1_NotPreInstalled",
     arch: {
         arm: {
diff --git a/hostsidetests/stagedinstall/app/src/com/android/tests/stagedinstall/StagedInstallTest.java b/hostsidetests/stagedinstall/app/src/com/android/tests/stagedinstall/StagedInstallTest.java
index 9e68c8c..1ce2daf 100644
--- a/hostsidetests/stagedinstall/app/src/com/android/tests/stagedinstall/StagedInstallTest.java
+++ b/hostsidetests/stagedinstall/app/src/com/android/tests/stagedinstall/StagedInstallTest.java
@@ -105,6 +105,7 @@
     private static final Duration SLEEP_DURATION = Duration.ofMillis(200);
 
     private static final String SHIM_PACKAGE_NAME = "com.android.apex.cts.shim";
+    private static final String APK_SHIM_PACKAGE_NAME = "com.android.cts.ctsshim";
     private static final String NOT_PREINSTALL_APEX_PACKAGE_NAME =
             "com.android.apex.cts.shim_not_pre_installed";
     private static final String DIFFERENT_APEX_PACKAGE_NAME = "com.android.apex.cts.shim.different";
@@ -133,6 +134,9 @@
     private static final TestApp ApexWrongSha2 = new TestApp(
             "ApexWrongSha2", SHIM_PACKAGE_NAME, 2, /*isApex*/true,
             "com.android.apex.cts.shim.v2_wrong_sha.apex");
+    private static final TestApp Apex2WithoutApkInApex = new TestApp(
+            "Apex2WithoutApkInApex", SHIM_PACKAGE_NAME, 2, /*isApex*/true,
+            "com.android.apex.cts.shim.v2_without_apk_in_apex.apex");
     private static final TestApp Apex3SignedBob = new TestApp(
             "Apex3SignedBob", SHIM_PACKAGE_NAME, 3, /*isApex*/true,
             "com.android.apex.cts.shim.v3_signed_bob.apex");
@@ -558,6 +562,7 @@
         int sessionId = retrieveLastSessionId();
         assertSessionApplied(sessionId);
         assertThat(getInstalledVersion(TestApp.Apex)).isEqualTo(2);
+        assertThat(getInstalledVersion(APK_SHIM_PACKAGE_NAME)).isNotEqualTo(-1);
     }
 
     @Test
@@ -1045,6 +1050,23 @@
                 });
     }
 
+    @Test
+    public void testInstallStagedApex_SameGrade_NewOneWins_Commit() throws Exception {
+        assertThat(getInstalledVersion(TestApp.Apex)).isEqualTo(2);
+        assertThat(getInstalledVersion(APK_SHIM_PACKAGE_NAME)).isNotEqualTo(-1);
+        int sessionId = Install.single(Apex2WithoutApkInApex).setStaged().commit();
+        assertSessionReady(sessionId);
+        storeSessionId(sessionId);
+    }
+
+    @Test
+    public void testInstallStagedApex_SameGrade_NewOneWins_VerifyPostReboot() throws Exception {
+        int sessionId = retrieveLastSessionId();
+        assertSessionApplied(sessionId);
+        assertThat(getInstalledVersion(TestApp.Apex)).isEqualTo(2);
+        assertThat(getInstalledVersion(APK_SHIM_PACKAGE_NAME)).isEqualTo(-1);
+    }
+
     /**
      * Should fail to verify apex targeting older dev sdk
      */
diff --git a/hostsidetests/stagedinstall/src/com/android/tests/stagedinstall/host/StagedInstallTest.java b/hostsidetests/stagedinstall/src/com/android/tests/stagedinstall/host/StagedInstallTest.java
index 2369a2d..06bbed8 100644
--- a/hostsidetests/stagedinstall/src/com/android/tests/stagedinstall/host/StagedInstallTest.java
+++ b/hostsidetests/stagedinstall/src/com/android/tests/stagedinstall/host/StagedInstallTest.java
@@ -325,9 +325,20 @@
     @LargeTest
     public void testInstallStagedApex_SameGrade() throws Exception {
         assumeTrue("Device does not support updating APEX", isUpdatingApexSupported());
+        installV3Apex();
+        installV3Apex();
+    }
 
-        installV3Apex();
-        installV3Apex();
+    @Test
+    @LargeTest
+    public void testInstallStagedApex_SameGrade_NewOneWins() throws Exception {
+        assumeTrue("Device does not support updating APEX", isUpdatingApexSupported());
+
+        installV2Apex();
+
+        runPhase("testInstallStagedApex_SameGrade_NewOneWins_Commit");
+        getDevice().reboot();
+        runPhase("testInstallStagedApex_SameGrade_NewOneWins_VerifyPostReboot");
     }
 
     @Test