Loading services/core/java/com/android/server/pm/UserManagerService.java +14 −2 Original line number Diff line number Diff line Loading @@ -53,6 +53,7 @@ import android.accounts.Account; import android.accounts.AccountManager; import android.annotation.ColorRes; import android.annotation.DrawableRes; import android.annotation.IntDef; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.RequiresPermission; Loading Loading @@ -196,6 +197,8 @@ import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.io.PrintWriter; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; Loading Loading @@ -350,8 +353,17 @@ public class UserManagerService extends IUserManager.Stub { private static final String TRON_DEMO_CREATED = "users_demo_created"; // The boot user strategy for HSUM. private static final int BOOT_TO_PREVIOUS_OR_FIRST_SWITCHABLE_USER = 0; private static final int BOOT_TO_HSU_FOR_PROVISIONED_DEVICE = 1; @VisibleForTesting static final int BOOT_TO_PREVIOUS_OR_FIRST_SWITCHABLE_USER = 0; @VisibleForTesting static final int BOOT_TO_HSU_FOR_PROVISIONED_DEVICE = 1; @Retention(RetentionPolicy.SOURCE) @IntDef(flag = false, prefix = { "BOOT_TO_" }, value = { BOOT_TO_PREVIOUS_OR_FIRST_SWITCHABLE_USER, BOOT_TO_HSU_FOR_PROVISIONED_DEVICE}) @VisibleForTesting @interface BootStrategy {} private final Context mContext; private final PackageManagerService mPm; Loading services/tests/mockingservicestests/src/com/android/server/pm/UserManagerServiceMockedTest.java +24 −15 Original line number Diff line number Diff line Loading @@ -34,6 +34,8 @@ import static android.os.UserManager.USER_TYPE_PROFILE_SUPERVISING; import static com.android.dx.mockito.inline.extended.ExtendedMockito.doNothing; import static com.android.dx.mockito.inline.extended.ExtendedMockito.doReturn; import static com.android.dx.mockito.inline.extended.ExtendedMockito.verify; import static com.android.server.pm.UserManagerService.BOOT_TO_HSU_FOR_PROVISIONED_DEVICE; import static com.android.server.pm.UserManagerService.BOOT_TO_PREVIOUS_OR_FIRST_SWITCHABLE_USER; import static com.google.common.truth.Truth.assertThat; import static com.google.common.truth.Truth.assertWithMessage; Loading Loading @@ -85,6 +87,7 @@ import com.android.modules.utils.testing.ExtendedMockitoRule; import com.android.server.LocalServices; import com.android.server.am.UserState; import com.android.server.locksettings.LockSettingsInternal; import com.android.server.pm.UserManagerService.BootStrategy; import com.android.server.pm.UserManagerService.UserData; import com.android.server.storage.DeviceStorageMonitorInternal; Loading @@ -96,7 +99,6 @@ import org.junit.Rule; import org.junit.Test; import org.mockito.Mock; import org.mockito.Mockito; import org.mockito.MockitoAnnotations; import org.xmlpull.v1.XmlPullParser; import org.xmlpull.v1.XmlPullParserException; Loading Loading @@ -199,7 +201,6 @@ public final class UserManagerServiceMockedTest { @Before @UiThreadTest // Needed to initialize main handler public void setFixtures() { MockitoAnnotations.initMocks(this); mSpiedContext = spy(mRealContext); // Disable binder caches in this process. Loading @@ -220,10 +221,9 @@ public final class UserManagerServiceMockedTest { // Called when getting boot user. config_hsumBootStrategy is 0 by default. mSpyResources = spy(mSpiedContext.getResources()); when(mSpiedContext.getResources()).thenReturn(mSpyResources); doReturn(0) .when(mSpyResources) .getInteger(com.android.internal.R.integer.config_hsumBootStrategy); doReturn(mSpyResources).when(() -> Resources.getSystem()); mockHsumBootStrategy(BOOT_TO_PREVIOUS_OR_FIRST_SWITCHABLE_USER); doReturn(mSpyResources).when(Resources::getSystem); // Must construct UserManagerService in the UiThread mTestDir = new File(mRealContext.getDataDir(), "umstest"); Loading Loading @@ -942,9 +942,7 @@ public final class UserManagerServiceMockedTest { addUser(USER_ID); addUser(OTHER_USER_ID); mockProvisionedDevice(true); doReturn(1) .when(mSpyResources) .getInteger(com.android.internal.R.integer.config_hsumBootStrategy); mockHsumBootStrategy(BOOT_TO_HSU_FOR_PROVISIONED_DEVICE); assertThat(mUms.getBootUser()).isEqualTo(UserHandle.USER_SYSTEM); } Loading @@ -955,9 +953,7 @@ public final class UserManagerServiceMockedTest { addUser(USER_ID); addUser(OTHER_USER_ID); mockProvisionedDevice(false); doReturn(1) .when(mSpyResources) .getInteger(com.android.internal.R.integer.config_hsumBootStrategy); mockHsumBootStrategy(BOOT_TO_HSU_FOR_PROVISIONED_DEVICE); // Even if the headless system user switchable flag is true, the boot user should be the // first switchable full user. mockCanSwitchToHeadlessSystemUser(true); Loading @@ -971,9 +967,7 @@ public final class UserManagerServiceMockedTest { setSystemUserHeadless(true); removeNonSystemUsers(); mockProvisionedDevice(false); doReturn(1) .when(mSpyResources) .getInteger(com.android.internal.R.integer.config_hsumBootStrategy); mockHsumBootStrategy(BOOT_TO_HSU_FOR_PROVISIONED_DEVICE); assertThrows(ServiceSpecificException.class, () -> mUms.getBootUser()); Loading Loading @@ -1376,11 +1370,26 @@ public final class UserManagerServiceMockedTest { } private void mockCanSwitchToHeadlessSystemUser(boolean canSwitch) { boolean previousValue = mSpyResources .getBoolean(com.android.internal.R.bool.config_canSwitchToHeadlessSystemUser); Log.d(TAG, "mockCanSwitchToHeadlessSystemUser(): will return " + canSwitch + " instad of " + previousValue); doReturn(canSwitch) .when(mSpyResources) .getBoolean(com.android.internal.R.bool.config_canSwitchToHeadlessSystemUser); } private void mockHsumBootStrategy(@BootStrategy int strategy) { int previousValue = mSpyResources .getInteger(com.android.internal.R.integer.config_hsumBootStrategy); Log.d(TAG, "mockHsumBootStrategy(): will return " + strategy + " instead of " + previousValue); doReturn(strategy) .when(mSpyResources) .getInteger(com.android.internal.R.integer.config_hsumBootStrategy); } private void mockUserIsInCall(boolean isInCall) { when(mTelecomManager.isInCall()).thenReturn(isInCall); } Loading Loading
services/core/java/com/android/server/pm/UserManagerService.java +14 −2 Original line number Diff line number Diff line Loading @@ -53,6 +53,7 @@ import android.accounts.Account; import android.accounts.AccountManager; import android.annotation.ColorRes; import android.annotation.DrawableRes; import android.annotation.IntDef; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.RequiresPermission; Loading Loading @@ -196,6 +197,8 @@ import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.io.PrintWriter; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; Loading Loading @@ -350,8 +353,17 @@ public class UserManagerService extends IUserManager.Stub { private static final String TRON_DEMO_CREATED = "users_demo_created"; // The boot user strategy for HSUM. private static final int BOOT_TO_PREVIOUS_OR_FIRST_SWITCHABLE_USER = 0; private static final int BOOT_TO_HSU_FOR_PROVISIONED_DEVICE = 1; @VisibleForTesting static final int BOOT_TO_PREVIOUS_OR_FIRST_SWITCHABLE_USER = 0; @VisibleForTesting static final int BOOT_TO_HSU_FOR_PROVISIONED_DEVICE = 1; @Retention(RetentionPolicy.SOURCE) @IntDef(flag = false, prefix = { "BOOT_TO_" }, value = { BOOT_TO_PREVIOUS_OR_FIRST_SWITCHABLE_USER, BOOT_TO_HSU_FOR_PROVISIONED_DEVICE}) @VisibleForTesting @interface BootStrategy {} private final Context mContext; private final PackageManagerService mPm; Loading
services/tests/mockingservicestests/src/com/android/server/pm/UserManagerServiceMockedTest.java +24 −15 Original line number Diff line number Diff line Loading @@ -34,6 +34,8 @@ import static android.os.UserManager.USER_TYPE_PROFILE_SUPERVISING; import static com.android.dx.mockito.inline.extended.ExtendedMockito.doNothing; import static com.android.dx.mockito.inline.extended.ExtendedMockito.doReturn; import static com.android.dx.mockito.inline.extended.ExtendedMockito.verify; import static com.android.server.pm.UserManagerService.BOOT_TO_HSU_FOR_PROVISIONED_DEVICE; import static com.android.server.pm.UserManagerService.BOOT_TO_PREVIOUS_OR_FIRST_SWITCHABLE_USER; import static com.google.common.truth.Truth.assertThat; import static com.google.common.truth.Truth.assertWithMessage; Loading Loading @@ -85,6 +87,7 @@ import com.android.modules.utils.testing.ExtendedMockitoRule; import com.android.server.LocalServices; import com.android.server.am.UserState; import com.android.server.locksettings.LockSettingsInternal; import com.android.server.pm.UserManagerService.BootStrategy; import com.android.server.pm.UserManagerService.UserData; import com.android.server.storage.DeviceStorageMonitorInternal; Loading @@ -96,7 +99,6 @@ import org.junit.Rule; import org.junit.Test; import org.mockito.Mock; import org.mockito.Mockito; import org.mockito.MockitoAnnotations; import org.xmlpull.v1.XmlPullParser; import org.xmlpull.v1.XmlPullParserException; Loading Loading @@ -199,7 +201,6 @@ public final class UserManagerServiceMockedTest { @Before @UiThreadTest // Needed to initialize main handler public void setFixtures() { MockitoAnnotations.initMocks(this); mSpiedContext = spy(mRealContext); // Disable binder caches in this process. Loading @@ -220,10 +221,9 @@ public final class UserManagerServiceMockedTest { // Called when getting boot user. config_hsumBootStrategy is 0 by default. mSpyResources = spy(mSpiedContext.getResources()); when(mSpiedContext.getResources()).thenReturn(mSpyResources); doReturn(0) .when(mSpyResources) .getInteger(com.android.internal.R.integer.config_hsumBootStrategy); doReturn(mSpyResources).when(() -> Resources.getSystem()); mockHsumBootStrategy(BOOT_TO_PREVIOUS_OR_FIRST_SWITCHABLE_USER); doReturn(mSpyResources).when(Resources::getSystem); // Must construct UserManagerService in the UiThread mTestDir = new File(mRealContext.getDataDir(), "umstest"); Loading Loading @@ -942,9 +942,7 @@ public final class UserManagerServiceMockedTest { addUser(USER_ID); addUser(OTHER_USER_ID); mockProvisionedDevice(true); doReturn(1) .when(mSpyResources) .getInteger(com.android.internal.R.integer.config_hsumBootStrategy); mockHsumBootStrategy(BOOT_TO_HSU_FOR_PROVISIONED_DEVICE); assertThat(mUms.getBootUser()).isEqualTo(UserHandle.USER_SYSTEM); } Loading @@ -955,9 +953,7 @@ public final class UserManagerServiceMockedTest { addUser(USER_ID); addUser(OTHER_USER_ID); mockProvisionedDevice(false); doReturn(1) .when(mSpyResources) .getInteger(com.android.internal.R.integer.config_hsumBootStrategy); mockHsumBootStrategy(BOOT_TO_HSU_FOR_PROVISIONED_DEVICE); // Even if the headless system user switchable flag is true, the boot user should be the // first switchable full user. mockCanSwitchToHeadlessSystemUser(true); Loading @@ -971,9 +967,7 @@ public final class UserManagerServiceMockedTest { setSystemUserHeadless(true); removeNonSystemUsers(); mockProvisionedDevice(false); doReturn(1) .when(mSpyResources) .getInteger(com.android.internal.R.integer.config_hsumBootStrategy); mockHsumBootStrategy(BOOT_TO_HSU_FOR_PROVISIONED_DEVICE); assertThrows(ServiceSpecificException.class, () -> mUms.getBootUser()); Loading Loading @@ -1376,11 +1370,26 @@ public final class UserManagerServiceMockedTest { } private void mockCanSwitchToHeadlessSystemUser(boolean canSwitch) { boolean previousValue = mSpyResources .getBoolean(com.android.internal.R.bool.config_canSwitchToHeadlessSystemUser); Log.d(TAG, "mockCanSwitchToHeadlessSystemUser(): will return " + canSwitch + " instad of " + previousValue); doReturn(canSwitch) .when(mSpyResources) .getBoolean(com.android.internal.R.bool.config_canSwitchToHeadlessSystemUser); } private void mockHsumBootStrategy(@BootStrategy int strategy) { int previousValue = mSpyResources .getInteger(com.android.internal.R.integer.config_hsumBootStrategy); Log.d(TAG, "mockHsumBootStrategy(): will return " + strategy + " instead of " + previousValue); doReturn(strategy) .when(mSpyResources) .getInteger(com.android.internal.R.integer.config_hsumBootStrategy); } private void mockUserIsInCall(boolean isInCall) { when(mTelecomManager.isInCall()).thenReturn(isInCall); } Loading