Merge "Adding startUser tests without removing user at the end"
This commit is contained in:
committed by
Android (Google) Code Review
commit
9a0c93a4d3
@@ -271,33 +271,109 @@ public class UserLifecycleTests {
|
||||
|
||||
/**
|
||||
* Tests starting an uninitialized user, with wait times in between iterations.
|
||||
* Measures the time until the ProgressListener callback.
|
||||
*
|
||||
* The first iteration will take longer due to the process of setting policy permissions for
|
||||
* a new user.
|
||||
*/
|
||||
@Test(timeout = TIMEOUT_MAX_TEST_TIME_MS)
|
||||
public void startUser_realistic() throws RemoteException {
|
||||
public void startUser_uninitializedUser() throws RemoteException {
|
||||
startUser_measuresAfterFirstIterations(/* numberOfIterationsToSkip */0);
|
||||
}
|
||||
|
||||
/**
|
||||
* Tests the second iteration of start user that has a problem that it takes too long to run, a
|
||||
* bug has been created (b/266574680) and after investigating or fix this problem,
|
||||
* this test can be removed.
|
||||
*/
|
||||
@Test(timeout = TIMEOUT_MAX_TEST_TIME_MS)
|
||||
public void startUser_startOnceBefore() throws RemoteException {
|
||||
startUser_measuresAfterFirstIterations(/* numberOfIterationsToSkip */1);
|
||||
}
|
||||
|
||||
/**
|
||||
* Tests a specific iteration of the start user process.
|
||||
* Measures the time until ACTION_USER_STARTED is received.
|
||||
* @param numberOfIterationsToSkip number of iterations that must be skipped in the preStartUser
|
||||
* method.
|
||||
*/
|
||||
private void startUser_measuresAfterFirstIterations(int numberOfIterationsToSkip)
|
||||
throws RemoteException {
|
||||
/**
|
||||
* Run start user and stop for the next iteration, measures time while mRunner.keepRunning()
|
||||
* return true.
|
||||
*/
|
||||
while (mRunner.keepRunning()) {
|
||||
mRunner.pauseTiming();
|
||||
|
||||
final int userId = createUserNoFlags();
|
||||
final ProgressWaiter waiter = new ProgressWaiter();
|
||||
|
||||
preStartUser(userId, numberOfIterationsToSkip);
|
||||
|
||||
waitForBroadcastIdle();
|
||||
mRunner.resumeTiming();
|
||||
Log.i(TAG, "Starting timer");
|
||||
waitCoolDownPeriod();
|
||||
|
||||
final boolean success = mIam.startUserInBackgroundWithListener(userId, waiter)
|
||||
&& waiter.waitForFinish(TIMEOUT_IN_SECOND * 1000);
|
||||
runThenWaitForBroadcasts(userId, () -> {
|
||||
mRunner.resumeTiming();
|
||||
Log.i(TAG, "Starting timer");
|
||||
|
||||
mIam.startUserInBackground(userId);
|
||||
}, Intent.ACTION_USER_STARTED);
|
||||
|
||||
mRunner.pauseTiming();
|
||||
Log.i(TAG, "Stopping timer");
|
||||
|
||||
assertTrue("Error: could not start user " + userId, success);
|
||||
|
||||
removeUser(userId);
|
||||
waitCoolDownPeriod();
|
||||
mRunner.resumeTimingForNextIteration();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Tests starting an initialized user, with wait times in between iterations stopping between
|
||||
* iterations,this test will skip the first two iterations and only measure the next ones.
|
||||
*
|
||||
* The first iteration will take longer due to the process of setting policy permissions for
|
||||
* a new user.
|
||||
*
|
||||
* The second iteration takes longer than expected and has a bug (b/266574680) to investigate
|
||||
* it.
|
||||
*
|
||||
* The next iterations take the expected time to start a user.
|
||||
*/
|
||||
@Test(timeout = TIMEOUT_MAX_TEST_TIME_MS)
|
||||
public void startUser_startTwiceBefore() throws RemoteException {
|
||||
final int userId = createUserNoFlags();
|
||||
|
||||
//TODO(b/266681181) Reduce iteration number by 1 after investigation and possible fix.
|
||||
preStartUser(userId, /* numberOfIterations */2);
|
||||
|
||||
/**
|
||||
* Run start user and stop for the next iteration, measures time while mRunner.keepRunning()
|
||||
* return true.
|
||||
*/
|
||||
while (mRunner.keepRunning()) {
|
||||
mRunner.pauseTiming();
|
||||
|
||||
waitForBroadcastIdle();
|
||||
waitCoolDownPeriod();
|
||||
|
||||
runThenWaitForBroadcasts(userId, () -> {
|
||||
mRunner.resumeTiming();
|
||||
Log.i(TAG, "Starting timer");
|
||||
|
||||
mIam.startUserInBackground(userId);
|
||||
}, Intent.ACTION_USER_STARTED);
|
||||
|
||||
mRunner.pauseTiming();
|
||||
Log.i(TAG, "Stopping timer");
|
||||
|
||||
stopUser(userId, /* force */true);
|
||||
mRunner.resumeTimingForNextIteration();
|
||||
}
|
||||
|
||||
removeUser(userId);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Tests starting & unlocking an uninitialized user.
|
||||
* Measures the time until unlock listener is triggered and user is unlocked.
|
||||
@@ -320,6 +396,46 @@ public class UserLifecycleTests {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Tests starting & unlocking an initialized user, stopping the user at the end simulating real
|
||||
* usage where the user is not removed after created and initialized.
|
||||
* Measures the time until unlock listener is triggered and user is unlocked.
|
||||
* This test will skip the first two iterations and only measure the next ones.
|
||||
*
|
||||
* The first iteration will take longer due to the process of setting policy permissions for a
|
||||
* new user.
|
||||
*
|
||||
* The second iteration takes longer than expected and has a bug (b/266574680) to investigate
|
||||
* it.
|
||||
*
|
||||
* The next iterations take the expected time to start a user.
|
||||
*/
|
||||
@Test(timeout = TIMEOUT_MAX_TEST_TIME_MS)
|
||||
public void startAndUnlockUser_startTwiceBefore() throws RemoteException {
|
||||
final int userId = createUserNoFlags();
|
||||
|
||||
//TODO(b/266681181) Reduce iteration number by 1 after investigation and possible fix.
|
||||
preStartUser(userId, /* numberOfIterations */2);
|
||||
|
||||
while (mRunner.keepRunning()) {
|
||||
mRunner.pauseTiming();
|
||||
|
||||
waitCoolDownPeriod();
|
||||
mRunner.resumeTiming();
|
||||
Log.i(TAG, "Starting timer");
|
||||
|
||||
// Waits for UserState.mUnlockProgress.finish().
|
||||
startUserInBackgroundAndWaitForUnlock(userId);
|
||||
|
||||
mRunner.pauseTiming();
|
||||
Log.i(TAG, "Stopping timer");
|
||||
stopUser(userId, /* force */true);
|
||||
mRunner.resumeTimingForNextIteration();
|
||||
}
|
||||
|
||||
removeUser(userId);
|
||||
}
|
||||
|
||||
/**
|
||||
* Tests starting & unlocking an uninitialized user.
|
||||
* Measures the time until unlock listener is triggered and user is unlocked.
|
||||
@@ -404,28 +520,36 @@ public class UserLifecycleTests {
|
||||
}
|
||||
}
|
||||
|
||||
/** Tests switching to a previously-started, but no-longer-running, user with wait
|
||||
* times between iterations */
|
||||
/**
|
||||
* Tests switching to a previously-started, but no-longer-running, user with wait
|
||||
* times between iterations
|
||||
**/
|
||||
@Test(timeout = TIMEOUT_MAX_TEST_TIME_MS)
|
||||
public void switchUser_stopped_realistic() throws RemoteException {
|
||||
final int startUser = ActivityManager.getCurrentUser();
|
||||
final int testUser = initializeNewUserAndSwitchBack(/* stopNewUser */ true);
|
||||
final int currentUserId = ActivityManager.getCurrentUser();
|
||||
final int userId = initializeNewUserAndSwitchBack(/* stopNewUser */ true);
|
||||
|
||||
/**
|
||||
* Skip the second iteration of start user process that is taking a long time to finish.
|
||||
*/
|
||||
preStartUser(userId, /* numberOfIterations */1);
|
||||
|
||||
while (mRunner.keepRunning()) {
|
||||
mRunner.pauseTiming();
|
||||
waitCoolDownPeriod();
|
||||
Log.d(TAG, "Starting timer");
|
||||
mRunner.resumeTiming();
|
||||
|
||||
switchUser(testUser);
|
||||
switchUser(userId);
|
||||
|
||||
mRunner.pauseTiming();
|
||||
Log.d(TAG, "Stopping timer");
|
||||
switchUserNoCheck(startUser);
|
||||
stopUserAfterWaitingForBroadcastIdle(testUser, true);
|
||||
attestFalse("Failed to stop user " + testUser, mAm.isUserRunning(testUser));
|
||||
switchUserNoCheck(currentUserId);
|
||||
stopUserAfterWaitingForBroadcastIdle(userId, /* force */true);
|
||||
attestFalse("Failed to stop user " + userId, mAm.isUserRunning(userId));
|
||||
mRunner.resumeTimingForNextIteration();
|
||||
}
|
||||
removeUser(testUser);
|
||||
removeUser(userId);
|
||||
}
|
||||
|
||||
/** Tests switching to a previously-started, but no-longer-running, user with wait
|
||||
@@ -1378,6 +1502,24 @@ public class UserLifecycleTests {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Start the user and stop after that, will repeat numberOfIterations times.
|
||||
* Make sure the user is started before proceeding with the test.
|
||||
* @param userId identifier of the user that will be started.
|
||||
* @param numberOfIterations number of iterations that must be skipped.
|
||||
*/
|
||||
private void preStartUser(int userId, int numberOfIterations) throws RemoteException {
|
||||
for (int i = 0; i < numberOfIterations; i++) {
|
||||
final ProgressWaiter preWaiter = new ProgressWaiter();
|
||||
|
||||
final boolean preStartComplete = mIam.startUserInBackgroundWithListener(userId,
|
||||
preWaiter) && preWaiter.waitForFinish(TIMEOUT_IN_SECOND * 1000);
|
||||
stopUserAfterWaitingForBroadcastIdle(userId, /* force */true);
|
||||
|
||||
assertTrue("Pre start was not performed for user" + userId, preStartComplete);
|
||||
}
|
||||
}
|
||||
|
||||
private void fail(@NonNull String message) {
|
||||
Log.e(TAG, "Test failed on iteration #" + mRunner.getIteration() + ": " + message);
|
||||
mRunner.markAsFailed(new AssertionError(message));
|
||||
|
||||
Reference in New Issue
Block a user