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

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

Change-Id: I20e2d8aed90a223f44338da6a83551738b905f85
This commit is contained in:
Mohammad Samiul Islam
2021-06-24 13:18:14 +00:00
committed by Automerger Merge Worker
5 changed files with 47 additions and 4 deletions

View File

@@ -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: "

View File

@@ -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);

View File

@@ -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"],

View File

@@ -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());

View File

@@ -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 {