Adding more granular startUser perf benchmarks.

Fixes: 146154399
Test: atest UserLifecycleTests
Change-Id: Ie781edc70a8a2fc0635e74350c139b5c09441dca
This commit is contained in:
jovanak
2019-12-17 17:25:26 -08:00
parent 1e0398dc47
commit 288a18ff21

View File

@@ -146,7 +146,8 @@ public class UserLifecycleTests {
final CountDownLatch latch = new CountDownLatch(1);
registerBroadcastReceiver(Intent.ACTION_USER_STARTED, latch, userId);
// Don't use this.startUserInBackground() since only waiting until ACTION_USER_STARTED.
// Don't use this.startUserInBackgroundAndWaitForUnlock() since only waiting until
// ACTION_USER_STARTED.
mIam.startUserInBackground(userId);
latch.await(TIMEOUT_IN_SECOND, TimeUnit.SECONDS);
@@ -156,6 +157,48 @@ public class UserLifecycleTests {
}
}
/**
* Measures the time until ACTION_USER_STARTED is received.
*/
@Test
public void startUser() throws Exception {
while (mRunner.keepRunning()) {
mRunner.pauseTiming();
final int userId = createUserNoFlags();
final CountDownLatch latch = new CountDownLatch(1);
registerBroadcastReceiver(Intent.ACTION_USER_STARTED, latch, userId);
mRunner.resumeTiming();
mIam.startUserInBackground(userId);
latch.await(TIMEOUT_IN_SECOND, TimeUnit.SECONDS);
mRunner.pauseTiming();
removeUser(userId);
mRunner.resumeTiming();
}
}
/**
* Measures the time until unlock listener is triggered and user is unlocked.
*/
@Test
public void startAndUnlockUser() throws Exception {
while (mRunner.keepRunning()) {
mRunner.pauseTiming();
final int userId = createUserNoFlags();
mRunner.resumeTiming();
// Waits for UserState.mUnlockProgress.finish().
startUserInBackgroundAndWaitForUnlock(userId);
mRunner.pauseTiming();
removeUser(userId);
mRunner.resumeTiming();
}
}
@Test
public void switchUser() throws Exception {
while (mRunner.keepRunning()) {
@@ -309,7 +352,7 @@ public class UserLifecycleTests {
final int userId = createManagedProfile();
mRunner.resumeTiming();
startUserInBackground(userId);
startUserInBackgroundAndWaitForUnlock(userId);
mRunner.pauseTiming();
removeUser(userId);
@@ -326,11 +369,11 @@ public class UserLifecycleTests {
mRunner.pauseTiming();
final int userId = createManagedProfile();
// Start the profile initially, then stop it. Similar to setQuietModeEnabled.
startUserInBackground(userId);
startUserInBackgroundAndWaitForUnlock(userId);
stopUser(userId, true);
mRunner.resumeTiming();
startUserInBackground(userId);
startUserInBackgroundAndWaitForUnlock(userId);
mRunner.pauseTiming();
removeUser(userId);
@@ -352,7 +395,7 @@ public class UserLifecycleTests {
installPreexistingApp(userId, DUMMY_PACKAGE_NAME);
mRunner.resumeTiming();
startUserInBackground(userId);
startUserInBackgroundAndWaitForUnlock(userId);
startApp(userId, DUMMY_PACKAGE_NAME);
mRunner.pauseTiming();
@@ -376,13 +419,13 @@ public class UserLifecycleTests {
final int userId = createManagedProfile();
WindowManagerGlobal.getWindowManagerService().dismissKeyguard(null, null);
installPreexistingApp(userId, DUMMY_PACKAGE_NAME);
startUserInBackground(userId);
startUserInBackgroundAndWaitForUnlock(userId);
startApp(userId, DUMMY_PACKAGE_NAME);
stopUser(userId, true);
TimeUnit.SECONDS.sleep(1); // Brief cool-down before re-starting profile.
mRunner.resumeTiming();
startUserInBackground(userId);
startUserInBackgroundAndWaitForUnlock(userId);
startApp(userId, DUMMY_PACKAGE_NAME);
mRunner.pauseTiming();
@@ -423,7 +466,7 @@ public class UserLifecycleTests {
mRunner.resumeTiming();
final int userId = createManagedProfile();
startUserInBackground(userId);
startUserInBackgroundAndWaitForUnlock(userId);
installPreexistingApp(userId, DUMMY_PACKAGE_NAME);
startApp(userId, DUMMY_PACKAGE_NAME);
@@ -441,7 +484,7 @@ public class UserLifecycleTests {
while (mRunner.keepRunning()) {
mRunner.pauseTiming();
final int userId = createManagedProfile();
startUserInBackground(userId);
startUserInBackgroundAndWaitForUnlock(userId);
mRunner.resumeTiming();
stopUser(userId, true);
@@ -467,7 +510,7 @@ public class UserLifecycleTests {
final int userId = createManagedProfile();
mRunner.resumeTiming();
startUserInBackground(userId);
startUserInBackgroundAndWaitForUnlock(userId);
mRunner.pauseTiming();
removeUser(userId);
@@ -490,7 +533,7 @@ public class UserLifecycleTests {
final int userId = createManagedProfile();
mRunner.resumeTiming();
startUserInBackground(userId);
startUserInBackgroundAndWaitForUnlock(userId);
mRunner.pauseTiming();
removeUser(userId);
@@ -526,18 +569,19 @@ public class UserLifecycleTests {
}
/**
* Start user in background and wait for it to unlock (equivalent to ACTION_USER_UNLOCKED).
* To start in foreground instead, see {@link #switchUser(int)}.
* This should always be used for profiles since profiles cannot be started in foreground.
* Start user in background and wait for it to unlock by waiting for
* UserState.mUnlockProgress.finish().
* <p> To start in foreground instead, see {@link #switchUser(int)}.
* <p> This should always be used for profiles since profiles cannot be started in foreground.
*/
private void startUserInBackground(int userId) {
private void startUserInBackgroundAndWaitForUnlock(int userId) {
final ProgressWaiter waiter = new ProgressWaiter();
try {
mIam.startUserInBackgroundWithListener(userId, waiter);
boolean success = waiter.waitForFinish(TIMEOUT_IN_SECOND);
attestTrue("Failed to start user " + userId + " in background.", success);
} catch (RemoteException e) {
Log.e(TAG, "startUserInBackground failed", e);
Log.e(TAG, "startUserInBackgroundAndWaitForUnlock failed", e);
}
}