Merge changes I5dcaabaa,I998cf688 am: 8dddad53d5 am: c1b51c398b
Original change: https://android-review.googlesource.com/c/platform/frameworks/base/+/1433440 Change-Id: I18aa4a6180cea3565b9f92f0033d50aafb28cc64
This commit is contained in:
@@ -456,9 +456,20 @@ class PackageManagerShellCommand extends ShellCommand {
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
private int runRollbackApp() {
|
private int runRollbackApp() throws RemoteException {
|
||||||
final PrintWriter pw = getOutPrintWriter();
|
final PrintWriter pw = getOutPrintWriter();
|
||||||
|
|
||||||
|
String opt;
|
||||||
|
long stagedReadyTimeoutMs = DEFAULT_STAGED_READY_TIMEOUT_MS;
|
||||||
|
while ((opt = getNextOption()) != null) {
|
||||||
|
switch (opt) {
|
||||||
|
case "--staged-ready-timeout":
|
||||||
|
stagedReadyTimeoutMs = Long.parseLong(getNextArgRequired());
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
throw new IllegalArgumentException("Unknown option: " + opt);
|
||||||
|
}
|
||||||
|
}
|
||||||
final String packageName = getNextArgRequired();
|
final String packageName = getNextArgRequired();
|
||||||
if (packageName == null) {
|
if (packageName == null) {
|
||||||
pw.println("Error: package name not specified");
|
pw.println("Error: package name not specified");
|
||||||
@@ -466,11 +477,10 @@ class PackageManagerShellCommand extends ShellCommand {
|
|||||||
}
|
}
|
||||||
|
|
||||||
final LocalIntentReceiver receiver = new LocalIntentReceiver();
|
final LocalIntentReceiver receiver = new LocalIntentReceiver();
|
||||||
|
RollbackInfo rollback = null;
|
||||||
try {
|
try {
|
||||||
IRollbackManager rm = IRollbackManager.Stub.asInterface(
|
IRollbackManager rm = IRollbackManager.Stub.asInterface(
|
||||||
ServiceManager.getService(Context.ROLLBACK_SERVICE));
|
ServiceManager.getService(Context.ROLLBACK_SERVICE));
|
||||||
|
|
||||||
RollbackInfo rollback = null;
|
|
||||||
for (RollbackInfo r : (List<RollbackInfo>) rm.getAvailableRollbacks().getList()) {
|
for (RollbackInfo r : (List<RollbackInfo>) rm.getAvailableRollbacks().getList()) {
|
||||||
for (PackageRollbackInfo info : r.getPackages()) {
|
for (PackageRollbackInfo info : r.getPackages()) {
|
||||||
if (packageName.equals(info.getPackageName())) {
|
if (packageName.equals(info.getPackageName())) {
|
||||||
@@ -495,14 +505,21 @@ class PackageManagerShellCommand extends ShellCommand {
|
|||||||
final Intent result = receiver.getResult();
|
final Intent result = receiver.getResult();
|
||||||
final int status = result.getIntExtra(RollbackManager.EXTRA_STATUS,
|
final int status = result.getIntExtra(RollbackManager.EXTRA_STATUS,
|
||||||
RollbackManager.STATUS_FAILURE);
|
RollbackManager.STATUS_FAILURE);
|
||||||
if (status == RollbackManager.STATUS_SUCCESS) {
|
|
||||||
pw.println("Success");
|
if (status != RollbackManager.STATUS_SUCCESS) {
|
||||||
return 0;
|
|
||||||
} else {
|
|
||||||
pw.println("Failure ["
|
pw.println("Failure ["
|
||||||
+ result.getStringExtra(RollbackManager.EXTRA_STATUS_MESSAGE) + "]");
|
+ result.getStringExtra(RollbackManager.EXTRA_STATUS_MESSAGE) + "]");
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (rollback.isStaged() && stagedReadyTimeoutMs > 0) {
|
||||||
|
final int committedSessionId = rollback.getCommittedSessionId();
|
||||||
|
return doWaitForStagedSessionReady(committedSessionId, stagedReadyTimeoutMs, pw);
|
||||||
|
}
|
||||||
|
|
||||||
|
pw.println("Success");
|
||||||
|
return 0;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void setParamsSize(InstallParams params, List<String> inPaths) {
|
private void setParamsSize(InstallParams params, List<String> inPaths) {
|
||||||
@@ -1306,7 +1323,7 @@ class PackageManagerShellCommand extends ShellCommand {
|
|||||||
abandonSession = false;
|
abandonSession = false;
|
||||||
|
|
||||||
if (params.sessionParams.isStaged && params.stagedReadyTimeoutMs > 0) {
|
if (params.sessionParams.isStaged && params.stagedReadyTimeoutMs > 0) {
|
||||||
return doWaitForStagedSessionRead(sessionId, params.stagedReadyTimeoutMs, pw);
|
return doWaitForStagedSessionReady(sessionId, params.stagedReadyTimeoutMs, pw);
|
||||||
}
|
}
|
||||||
|
|
||||||
pw.println("Success");
|
pw.println("Success");
|
||||||
@@ -1321,7 +1338,7 @@ class PackageManagerShellCommand extends ShellCommand {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private int doWaitForStagedSessionRead(int sessionId, long timeoutMs, PrintWriter pw)
|
private int doWaitForStagedSessionReady(int sessionId, long timeoutMs, PrintWriter pw)
|
||||||
throws RemoteException {
|
throws RemoteException {
|
||||||
Preconditions.checkArgument(timeoutMs > 0);
|
Preconditions.checkArgument(timeoutMs > 0);
|
||||||
PackageInstaller.SessionInfo si = mInterface.getPackageInstaller()
|
PackageInstaller.SessionInfo si = mInterface.getPackageInstaller()
|
||||||
@@ -1390,7 +1407,7 @@ class PackageManagerShellCommand extends ShellCommand {
|
|||||||
final PackageInstaller.SessionInfo si = mInterface.getPackageInstaller()
|
final PackageInstaller.SessionInfo si = mInterface.getPackageInstaller()
|
||||||
.getSessionInfo(sessionId);
|
.getSessionInfo(sessionId);
|
||||||
if (si != null && si.isStaged() && stagedReadyTimeoutMs > 0) {
|
if (si != null && si.isStaged() && stagedReadyTimeoutMs > 0) {
|
||||||
return doWaitForStagedSessionRead(sessionId, stagedReadyTimeoutMs, pw);
|
return doWaitForStagedSessionReady(sessionId, stagedReadyTimeoutMs, pw);
|
||||||
}
|
}
|
||||||
pw.println("Success");
|
pw.println("Success");
|
||||||
return 0;
|
return 0;
|
||||||
|
|||||||
@@ -23,7 +23,7 @@ android_test_helper_app {
|
|||||||
java_test_host {
|
java_test_host {
|
||||||
name: "StagedInstallInternalTest",
|
name: "StagedInstallInternalTest",
|
||||||
srcs: ["src/**/*.java"],
|
srcs: ["src/**/*.java"],
|
||||||
libs: ["tradefed"],
|
libs: ["tradefed", "cts-shim-host-lib"],
|
||||||
static_libs: [
|
static_libs: [
|
||||||
"testng",
|
"testng",
|
||||||
"compatibility-tradefed",
|
"compatibility-tradefed",
|
||||||
|
|||||||
@@ -16,6 +16,8 @@
|
|||||||
|
|
||||||
package com.android.tests.stagedinstallinternal.host;
|
package com.android.tests.stagedinstallinternal.host;
|
||||||
|
|
||||||
|
import static com.android.cts.shim.lib.ShimPackage.SHIM_APEX_PACKAGE_NAME;
|
||||||
|
|
||||||
import static com.google.common.truth.Truth.assertThat;
|
import static com.google.common.truth.Truth.assertThat;
|
||||||
|
|
||||||
import static org.junit.Assert.assertTrue;
|
import static org.junit.Assert.assertTrue;
|
||||||
@@ -139,6 +141,24 @@ public class StagedInstallInternalTest extends BaseHostJUnit4Test {
|
|||||||
assertThat(sessionId).isEmpty();
|
assertThat(sessionId).isEmpty();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Test rollback-app command waits for staged sessions to be ready
|
||||||
|
@Test
|
||||||
|
public void testAdbRollbackAppWaitsForStagedReady() throws Exception {
|
||||||
|
assumeTrue("Device does not support updating APEX",
|
||||||
|
mHostUtils.isApexUpdateSupported());
|
||||||
|
|
||||||
|
final File apexFile = mTestUtils.getTestFile(SHIM_V2);
|
||||||
|
String output = getDevice().executeAdbCommand("install", "--staged",
|
||||||
|
"--enable-rollback", apexFile.getAbsolutePath());
|
||||||
|
assertThat(output).contains("Reboot device to apply staged session");
|
||||||
|
getDevice().reboot();
|
||||||
|
output = getDevice().executeShellCommand("pm rollback-app " + SHIM_APEX_PACKAGE_NAME);
|
||||||
|
assertThat(output).contains("Reboot device to apply staged session");
|
||||||
|
final String sessionId = getDevice().executeShellCommand(
|
||||||
|
"pm get-stagedsessions --only-ready --only-parent --only-sessionid").trim();
|
||||||
|
assertThat(sessionId).isNotEmpty();
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testAdbInstallMultiPackageCommandWorks() throws Exception {
|
public void testAdbInstallMultiPackageCommandWorks() throws Exception {
|
||||||
assumeTrue("Device does not support updating APEX",
|
assumeTrue("Device does not support updating APEX",
|
||||||
|
|||||||
Reference in New Issue
Block a user