From d9938b879d369eefada8ec15177d775e8f77a26e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Victor=20Mendes=20Freire?= Date: Thu, 12 Jan 2023 18:21:11 +0000 Subject: [PATCH] Add test with static wallpaper for switchUser Current test implementations depend on the test device default wallpaper. Some devices use LiveWallpapers and some use ImageWallpapers, so this test aims to make it easier to identify if a regression occured because of the switchUser operation or due to a slower wallpaper on certain devices. Bug: 265011565 Test: atest UserLifecycleTests Change-Id: Ia587b97cd672f76f9a20481124f47840de9fd331 --- .../perftests/multiuser/AndroidManifest.xml | 5 +- .../android/multiuser/UserLifecycleTests.java | 79 ++++++++++++++++++- 2 files changed, 80 insertions(+), 4 deletions(-) diff --git a/apct-tests/perftests/multiuser/AndroidManifest.xml b/apct-tests/perftests/multiuser/AndroidManifest.xml index 5befa1f1d4d4d..424d784d6ec10 100644 --- a/apct-tests/perftests/multiuser/AndroidManifest.xml +++ b/apct-tests/perftests/multiuser/AndroidManifest.xml @@ -15,8 +15,7 @@ --> - + package="com.android.perftests.multiuser"> @@ -27,6 +26,7 @@ + @@ -38,5 +38,4 @@ - diff --git a/apct-tests/perftests/multiuser/src/android/multiuser/UserLifecycleTests.java b/apct-tests/perftests/multiuser/src/android/multiuser/UserLifecycleTests.java index b24076af4a17a..92574691eb9f8 100644 --- a/apct-tests/perftests/multiuser/src/android/multiuser/UserLifecycleTests.java +++ b/apct-tests/perftests/multiuser/src/android/multiuser/UserLifecycleTests.java @@ -15,7 +15,11 @@ */ package android.multiuser; +import static android.app.WallpaperManager.FLAG_LOCK; +import static android.app.WallpaperManager.FLAG_SYSTEM; + import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; import static org.junit.Assume.assumeTrue; import android.annotation.NonNull; @@ -25,6 +29,7 @@ import android.app.AppGlobals; import android.app.IActivityManager; import android.app.IStopUserCallback; import android.app.WaitResult; +import android.app.WallpaperManager; import android.content.BroadcastReceiver; import android.content.Context; import android.content.IIntentReceiver; @@ -34,6 +39,7 @@ import android.content.IntentSender; import android.content.pm.IPackageInstaller; import android.content.pm.PackageManager; import android.content.pm.UserInfo; +import android.graphics.Bitmap; import android.os.Bundle; import android.os.IBinder; import android.os.IProgressListener; @@ -59,6 +65,7 @@ import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; +import java.io.IOException; import java.util.ArrayList; import java.util.concurrent.CountDownLatch; import java.util.concurrent.TimeUnit; @@ -114,6 +121,7 @@ public class UserLifecycleTests { private ActivityManager mAm; private IActivityManager mIam; private PackageManager mPm; + private WallpaperManager mWm; private ArrayList mUsersToRemove; private boolean mHasManagedUserFeature; private BroadcastWaiter mBroadcastWaiter; @@ -132,6 +140,7 @@ public class UserLifecycleTests { mIam = ActivityManager.getService(); mUsersToRemove = new ArrayList<>(); mPm = context.getPackageManager(); + mWm = WallpaperManager.getInstance(context); mHasManagedUserFeature = mPm.hasSystemFeature(PackageManager.FEATURE_MANAGED_USERS); mBroadcastWaiter = new BroadcastWaiter(context, TAG, TIMEOUT_IN_SECOND, Intent.ACTION_USER_STARTED, @@ -372,6 +381,32 @@ public class UserLifecycleTests { removeUser(testUser); } + /** Tests switching to a previously-started, but no-longer-running, user with wait + * times between iterations and using a static wallpaper */ + @Test(timeout = TIMEOUT_MAX_TEST_TIME_MS) + public void switchUser_stopped_staticWallpaper() throws RemoteException { + assumeTrue(mWm.isWallpaperSupported() && mWm.isSetWallpaperAllowed()); + final int startUser = ActivityManager.getCurrentUser(); + final int testUser = initializeNewUserAndSwitchBack(/* stopNewUser */ true, + /* useStaticWallpaper */true); + while (mRunner.keepRunning()) { + mRunner.pauseTiming(); + waitCoolDownPeriod(); + Log.d(TAG, "Starting timer"); + mRunner.resumeTiming(); + + switchUser(testUser); + + mRunner.pauseTiming(); + Log.d(TAG, "Stopping timer"); + switchUserNoCheck(startUser); + stopUserAfterWaitingForBroadcastIdle(testUser, true); + attestFalse("Failed to stop user " + testUser, mAm.isUserRunning(testUser)); + mRunner.resumeTimingForNextIteration(); + } + removeUser(testUser); + } + /** Tests switching to an already-created already-running non-owner background user. */ @Test(timeout = TIMEOUT_MAX_TEST_TIME_MS) public void switchUser_running() throws RemoteException { @@ -415,6 +450,31 @@ public class UserLifecycleTests { removeUser(testUser); } + /** Tests switching to an already-created already-running non-owner background user, with wait + * times between iterations and using a default static wallpaper */ + @Test(timeout = TIMEOUT_MAX_TEST_TIME_MS) + public void switchUser_running_staticWallpaper() throws RemoteException { + assumeTrue(mWm.isWallpaperSupported() && mWm.isSetWallpaperAllowed()); + final int startUser = ActivityManager.getCurrentUser(); + final int testUser = initializeNewUserAndSwitchBack(/* stopNewUser */ false, + /* useStaticWallpaper */ true); + while (mRunner.keepRunning()) { + mRunner.pauseTiming(); + waitCoolDownPeriod(); + Log.d(TAG, "Starting timer"); + mRunner.resumeTiming(); + + switchUser(testUser); + + mRunner.pauseTiming(); + Log.d(TAG, "Stopping timer"); + waitForBroadcastIdle(); + switchUserNoCheck(startUser); + mRunner.resumeTimingForNextIteration(); + } + removeUser(testUser); + } + /** Tests stopping a background user. */ @Test(timeout = TIMEOUT_MAX_TEST_TIME_MS) public void stopUser() throws RemoteException { @@ -843,14 +903,20 @@ public class UserLifecycleTests { waitForLatch("Failed to properly stop user " + userId, latch); } + private int initializeNewUserAndSwitchBack(boolean stopNewUser) throws RemoteException { + return initializeNewUserAndSwitchBack(stopNewUser, /* useStaticWallpaper */ false); + } + /** * Creates a user and waits for its ACTION_USER_UNLOCKED. * Then switches to back to the original user and waits for its switchUser() to finish. * * @param stopNewUser whether to stop the new user after switching to otherUser. + * @param useStaticWallpaper whether to switch the wallpaper of the default user to a static. * @return userId of the newly created user. */ - private int initializeNewUserAndSwitchBack(boolean stopNewUser) throws RemoteException { + private int initializeNewUserAndSwitchBack(boolean stopNewUser, boolean useStaticWallpaper) + throws RemoteException { final int origUser = mAm.getCurrentUser(); // First, create and switch to testUser, waiting for its ACTION_USER_UNLOCKED final int testUser = createUserNoFlags(); @@ -858,6 +924,17 @@ public class UserLifecycleTests { mAm.switchUser(testUser); }, Intent.ACTION_USER_UNLOCKED, Intent.ACTION_MEDIA_MOUNTED); + if (useStaticWallpaper) { + assertTrue(mWm.isWallpaperSupported() && mWm.isSetWallpaperAllowed()); + try { + Bitmap blank = Bitmap.createBitmap(1, 1, Bitmap.Config.ALPHA_8); + mWm.setBitmap(blank, /* visibleCropHint */ null, /* allowBackup */ true, + /* which */ FLAG_SYSTEM | FLAG_LOCK, testUser); + } catch (IOException exception) { + fail("Unable to set static wallpaper."); + } + } + // Second, switch back to origUser, waiting merely for switchUser() to finish switchUser(origUser); attestTrue("Didn't switch back to user, " + origUser, origUser == mAm.getCurrentUser());