Merge changes I4b9e6f1e,I9cfa39f1 into udc-dev
* changes: Start user in background via adb command instead of calling the API. Move runShellCommandWithTimeout from UserLifecycleTests to ShellHelper
This commit is contained in:
committed by
Android (Google) Code Review
commit
b66ce3a139
@@ -70,7 +70,6 @@ import java.util.ArrayList;
|
||||
import java.util.concurrent.CountDownLatch;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
import java.util.concurrent.TimeoutException;
|
||||
import java.util.concurrent.atomic.AtomicReference;
|
||||
|
||||
/**
|
||||
* Perf tests for user life cycle events.
|
||||
@@ -1262,15 +1261,13 @@ public class UserLifecycleTests {
|
||||
* <p> This should always be used for profiles since profiles cannot be started in foreground.
|
||||
*/
|
||||
private void startUserInBackgroundAndWaitForUnlock(int userId) {
|
||||
final ProgressWaiter waiter = new ProgressWaiter();
|
||||
boolean success = false;
|
||||
try {
|
||||
mIam.startUserInBackgroundWithListener(userId, waiter);
|
||||
success = waiter.waitForFinish(TIMEOUT_IN_SECOND);
|
||||
} catch (RemoteException e) {
|
||||
Log.e(TAG, "startUserInBackgroundAndWaitForUnlock failed", e);
|
||||
attestTrue("Failed to start user " + userId + " in background.",
|
||||
ShellHelper.runShellCommandWithTimeout("am start-user -w " + userId,
|
||||
TIMEOUT_IN_SECOND).startsWith("Success:"));
|
||||
} catch (TimeoutException e) {
|
||||
fail("Could not start user " + userId + " in " + TIMEOUT_IN_SECOND + " seconds");
|
||||
}
|
||||
attestTrue("Failed to start user " + userId + " in background.", success);
|
||||
}
|
||||
|
||||
/** Starts the given user in the foreground. */
|
||||
@@ -1472,7 +1469,8 @@ public class UserLifecycleTests {
|
||||
private void removeUser(int userId) throws RemoteException {
|
||||
stopUserAfterWaitingForBroadcastIdle(userId, true);
|
||||
try {
|
||||
runShellCommandWithTimeout("pm remove-user -w " + userId, TIMEOUT_IN_SECOND);
|
||||
ShellHelper.runShellCommandWithTimeout("pm remove-user -w " + userId,
|
||||
TIMEOUT_IN_SECOND);
|
||||
} catch (TimeoutException e) {
|
||||
Log.e(TAG, String.format("Could not remove user %d in %d seconds",
|
||||
userId, TIMEOUT_IN_SECOND), e);
|
||||
@@ -1539,7 +1537,7 @@ public class UserLifecycleTests {
|
||||
|
||||
private void waitForBroadcastIdle() {
|
||||
try {
|
||||
runShellCommandWithTimeout("am wait-for-broadcast-idle", TIMEOUT_IN_SECOND);
|
||||
ShellHelper.runShellCommandWithTimeout("am wait-for-broadcast-idle", TIMEOUT_IN_SECOND);
|
||||
} catch (TimeoutException e) {
|
||||
Log.e(TAG, "Ending waitForBroadcastIdle because it is taking too long", e);
|
||||
}
|
||||
@@ -1558,41 +1556,4 @@ public class UserLifecycleTests {
|
||||
waitForBroadcastIdle();
|
||||
sleep(tenSeconds);
|
||||
}
|
||||
|
||||
/**
|
||||
* Runs a Shell command with a timeout, returning a trimmed response.
|
||||
*/
|
||||
private String runShellCommandWithTimeout(String command, long timeoutInSecond)
|
||||
throws TimeoutException {
|
||||
AtomicReference<Exception> exception = new AtomicReference<>(null);
|
||||
AtomicReference<String> result = new AtomicReference<>(null);
|
||||
|
||||
CountDownLatch latch = new CountDownLatch(1);
|
||||
|
||||
new Thread(() -> {
|
||||
try {
|
||||
result.set(ShellHelper.runShellCommandRaw(command));
|
||||
} catch (Exception e) {
|
||||
exception.set(e);
|
||||
} finally {
|
||||
latch.countDown();
|
||||
}
|
||||
}).start();
|
||||
|
||||
try {
|
||||
if (!latch.await(timeoutInSecond, TimeUnit.SECONDS)) {
|
||||
throw new TimeoutException("Command: '" + command + "' could not run in "
|
||||
+ timeoutInSecond + " seconds");
|
||||
}
|
||||
} catch (InterruptedException e) {
|
||||
Thread.currentThread().interrupt();
|
||||
}
|
||||
|
||||
if (exception.get() != null) {
|
||||
Log.e(TAG, "Command: '" + command + "' failed.", exception.get());
|
||||
throw new RuntimeException(exception.get());
|
||||
}
|
||||
|
||||
return result.get();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -24,12 +24,53 @@ import androidx.annotation.NonNull;
|
||||
import androidx.test.InstrumentationRegistry;
|
||||
|
||||
import java.io.FileInputStream;
|
||||
import java.util.concurrent.CountDownLatch;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
import java.util.concurrent.TimeoutException;
|
||||
import java.util.concurrent.atomic.AtomicReference;
|
||||
|
||||
/**
|
||||
* Provides Shell-based utilities such as running a command.
|
||||
*/
|
||||
public final class ShellHelper {
|
||||
|
||||
/**
|
||||
* Runs a Shell command with a timeout, returning a trimmed response.
|
||||
*/
|
||||
@NonNull
|
||||
public static String runShellCommandWithTimeout(@NonNull String command, long timeoutInSecond)
|
||||
throws TimeoutException {
|
||||
AtomicReference<Exception> exception = new AtomicReference<>(null);
|
||||
AtomicReference<String> result = new AtomicReference<>(null);
|
||||
|
||||
CountDownLatch latch = new CountDownLatch(1);
|
||||
|
||||
new Thread(() -> {
|
||||
try {
|
||||
result.set(runShellCommandRaw(command));
|
||||
} catch (Exception e) {
|
||||
exception.set(e);
|
||||
} finally {
|
||||
latch.countDown();
|
||||
}
|
||||
}).start();
|
||||
|
||||
try {
|
||||
if (!latch.await(timeoutInSecond, TimeUnit.SECONDS)) {
|
||||
throw new TimeoutException("Command: '" + command + "' could not run in "
|
||||
+ timeoutInSecond + " seconds");
|
||||
}
|
||||
} catch (InterruptedException e) {
|
||||
Thread.currentThread().interrupt();
|
||||
}
|
||||
|
||||
if (exception.get() != null) {
|
||||
throw new AndroidRuntimeException(exception.get());
|
||||
}
|
||||
|
||||
return result.get();
|
||||
}
|
||||
|
||||
/**
|
||||
* Runs a Shell command, returning a trimmed response.
|
||||
*/
|
||||
|
||||
Reference in New Issue
Block a user