Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 9a66531f authored by Mohammad Samiul Islam's avatar Mohammad Samiul Islam Committed by Automerger Merge Worker
Browse files

Merge "Update the session object with the error msg from ApexSessionInfo" into...

Merge "Update the session object with the error msg from ApexSessionInfo" into sc-dev am: d8244c55

Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/14840459

Change-Id: Id13d6a6930ee5a4042db63093b2ba6c9a31ab6bc
parents 89db9cf6 d8244c55
Loading
Loading
Loading
Loading
+1 −2
Original line number Diff line number Diff line
@@ -955,8 +955,7 @@ public class StagingManager {
                continue;
            } else if (isApexSessionFailed(apexSession)) {
                hasFailedApexSession = true;
                String errorMsg = "APEX activation failed. Check logcat messages from apexd "
                        + "for more information.";
                String errorMsg = "APEX activation failed. " + apexSession.errorMessage;
                if (!TextUtils.isEmpty(apexSession.crashingNativeProcess)) {
                    prepareForLoggingApexdRevert(session, apexSession.crashingNativeProcess);
                    errorMsg = "Session reverted due to crashing native process: "
+3 −2
Original line number Diff line number Diff line
@@ -286,6 +286,7 @@ public class StagingManagerTest {
        ApexSessionInfo activationFailed = new ApexSessionInfo();
        activationFailed.sessionId = 1543;
        activationFailed.isActivationFailed = true;
        activationFailed.errorMessage = "Failed for test";

        ApexSessionInfo staged = new ApexSessionInfo();
        staged.sessionId = 101;
@@ -309,8 +310,8 @@ public class StagingManagerTest {

        assertThat(apexSession1.getErrorCode())
                .isEqualTo(SessionInfo.STAGED_SESSION_ACTIVATION_FAILED);
        assertThat(apexSession1.getErrorMessage()).isEqualTo("APEX activation failed. Check logcat "
                + "messages from apexd for more information.");
        assertThat(apexSession1.getErrorMessage()).isEqualTo("APEX activation failed. "
                + "Failed for test");

        assertThat(apexSession2.getErrorCode())
                .isEqualTo(SessionInfo.STAGED_SESSION_ACTIVATION_FAILED);
+1 −0
Original line number Diff line number Diff line
@@ -52,6 +52,7 @@ java_test_host {
    data: [
        ":com.android.apex.apkrollback.test_v1",
        ":com.android.apex.cts.shim.v2_prebuilt",
        ":StagedInstallTestApexV2_WrongSha",
        ":TestAppAv1",
    ],
    test_suites: ["general-tests"],
+20 −0
Original line number Diff line number Diff line
@@ -179,6 +179,26 @@ public class StagedInstallInternalTest {
        assertThat(info.isStagedSessionFailed()).isTrue();
    }

    @Test
    public void testApexActivationFailureIsCapturedInSession_Commit() throws Exception {
        int sessionId = Install.single(TestApp.Apex1).setStaged().commit();
        assertSessionReady(sessionId);
        storeSessionId(sessionId);
    }

    @Test
    public void testApexActivationFailureIsCapturedInSession_Verify() throws Exception {
        int sessionId = retrieveLastSessionId();
        assertSessionFailedWithMessage(sessionId, "has unexpected SHA512 hash");
    }

    private static void assertSessionFailedWithMessage(int sessionId, String msg) {
        assertSessionState(sessionId, (session) -> {
            assertThat(session.isStagedSessionFailed()).isTrue();
            assertThat(session.getStagedSessionErrorMessage()).contains(msg);
        });
    }

    private static void assertSessionReady(int sessionId) {
        assertSessionState(sessionId,
                (session) -> assertThat(session.isStagedSessionReady()).isTrue());
+22 −0
Original line number Diff line number Diff line
@@ -56,6 +56,7 @@ public class StagedInstallInternalTest extends BaseHostJUnit4Test {
    @Rule
    public AbandonSessionsRule mHostTestRule = new AbandonSessionsRule(this);
    private static final String SHIM_V2 = "com.android.apex.cts.shim.v2.apex";
    private static final String APEX_WRONG_SHA = "com.android.apex.cts.shim.v2_wrong_sha.apex";
    private static final String APK_A = "TestAppAv1.apk";
    private static final String APK_IN_APEX_TESTAPEX_NAME = "com.android.apex.apkrollback.test";

@@ -322,6 +323,27 @@ public class StagedInstallInternalTest extends BaseHostJUnit4Test {
        runPhase("testFailStagedSessionIfStagingDirectoryDeleted_Verify");
    }

    @Test
    public void testApexActivationFailureIsCapturedInSession() throws Exception {
        // We initiate staging a normal apex update which passes pre-reboot verification.
        // Then we replace the valid apex waiting in /data/app-staging with something
        // that cannot be activated and reboot. The apex should fail to activate, which
        // is what we want for this test.
        runPhase("testApexActivationFailureIsCapturedInSession_Commit");
        final String sessionId = getDevice().executeShellCommand(
                "pm get-stagedsessions --only-ready --only-parent --only-sessionid").trim();
        assertThat(sessionId).isNotEmpty();
        // Now replace the valid staged apex with something invalid
        getDevice().enableAdbRoot();
        getDevice().executeShellCommand("rm /data/app-staging/session_" + sessionId + "/*");
        final File invalidApexFile = mHostUtils.getTestFile(APEX_WRONG_SHA);
        getDevice().pushFile(invalidApexFile,
                "/data/app-staging/session_" + sessionId + "/base.apex");
        getDevice().reboot();

        runPhase("testApexActivationFailureIsCapturedInSession_Verify");
    }

    private List<String> getStagingDirectories() throws DeviceNotAvailableException {
        String baseDir = "/data/app-staging";
        try {