diff options
author | Rett Berg <rett@google.com> | 2019-06-10 15:16:23 -0700 |
---|---|---|
committer | Rett Berg <rett@google.com> | 2019-07-25 11:12:41 -0700 |
commit | 8d30e3146ce773d66a5b3130818f4af0292fcb1f (patch) | |
tree | 0f146305894e18b0ea1a572a72328516430fc984 | |
parent | 0e8212313a0fc7b659ad06586c14d2d9d58e7f25 (diff) | |
download | tradefederation-8d30e3146ce773d66a5b3130818f4af0292fcb1f.tar.gz |
add support for guest user
Bug: 135057192
Bug: 130661989
Test: tapas tradefed-all && make && \
tools/tradefederation/core/tradefed.sh run singleCommand host -n \
--class com.android.tradefed.UnitTests
Change-Id: I2b9469dfd4d2634df4f00784537e9e67f2174ac3
Merged-In: I2b9469dfd4d2634df4f00784537e9e67f2174ac3
4 files changed, 93 insertions, 6 deletions
diff --git a/src/com/android/tradefed/device/UserInfo.java b/src/com/android/tradefed/device/UserInfo.java index b37ef1b05..4cccbbb9d 100644 --- a/src/com/android/tradefed/device/UserInfo.java +++ b/src/com/android/tradefed/device/UserInfo.java @@ -42,12 +42,36 @@ public final class UserInfo { public enum UserType { /** current foreground user of the device */ CURRENT, + /** + * guest user. Only one can exist at a time, may be ephemeral and have more restrictions. + */ + GUEST, /** user flagged as primary on the device; most often primary = system user = user 0 */ PRIMARY, /** system user = user 0 */ SYSTEM, /** secondary user, i.e. non-primary and non-system. */ SECONDARY; + + public boolean isCurrent() { + return this == CURRENT; + } + + public boolean isGuest() { + return this == GUEST; + } + + public boolean isPrimary() { + return this == PRIMARY; + } + + public boolean isSystem() { + return this == SYSTEM; + } + + public boolean isSecondary() { + return this == SECONDARY; + } } public UserInfo(int userId, String userName, int flag, boolean isRunning) { @@ -73,6 +97,10 @@ public final class UserInfo { return mIsRunning; } + public boolean isGuest() { + return (mFlag & FLAG_GUEST) == FLAG_GUEST; + } + public boolean isPrimary() { return (mFlag & FLAG_PRIMARY) == FLAG_PRIMARY; } @@ -90,6 +118,8 @@ public final class UserInfo { switch (userType) { case CURRENT: return mUserId == currentUserId; + case GUEST: + return isGuest(); case PRIMARY: return isPrimary(); case SYSTEM: diff --git a/src/com/android/tradefed/suite/checker/UserChecker.java b/src/com/android/tradefed/suite/checker/UserChecker.java index bca52d5a7..92b12dd2e 100644 --- a/src/com/android/tradefed/suite/checker/UserChecker.java +++ b/src/com/android/tradefed/suite/checker/UserChecker.java @@ -65,7 +65,7 @@ public class UserChecker implements ISystemStatusChecker { mSwitchedToUserId = device.createUser( /* name= */ "Tf" + mUserToSwitchTo.toString().toLowerCase(), - /* guest= */ false, + /* guest= */ mUserToSwitchTo.isGuest(), /* ephemeral= */ false); CLog.i( "No user of type %s found, created user %d", diff --git a/tests/src/com/android/tradefed/suite/checker/UserCheckerTest.java b/tests/src/com/android/tradefed/suite/checker/UserCheckerTest.java index 6d36c6c3b..d4fece268 100644 --- a/tests/src/com/android/tradefed/suite/checker/UserCheckerTest.java +++ b/tests/src/com/android/tradefed/suite/checker/UserCheckerTest.java @@ -185,6 +185,26 @@ public class UserCheckerTest { } @Test + public void testSwitchToGuest() throws Exception { + UserChecker checker = new UserChecker(); + OptionSetter mOptionSetter = new OptionSetter(checker); + mOptionSetter.setOptionValue("user-type", "guest"); + ITestDevice device = + mockDeviceUserState( + /* currentUser= */ 0, + /* userIds= */ new Integer[] {0, 10}, + /* flags= */ new Integer[] {0, UserInfo.FLAG_GUEST}, + /* isRunning= */ new Boolean[] {true, false}); + + when(device.switchUser(10)).thenReturn(true); + + StatusCheckerResult result = checker.preExecutionCheck(device); + assertEquals(CheckStatus.SUCCESS, result.getStatus()); + verify(device, never()).createUser(any(), anyBoolean(), anyBoolean()); + verify(device, times(1)).switchUser(10); + } + + @Test public void testCreateSecondary() throws Exception { UserChecker checker = new UserChecker(); OptionSetter mOptionSetter = new OptionSetter(checker); @@ -201,6 +221,24 @@ public class UserCheckerTest { verify(device, times(1)).switchUser(10); } + @Test + public void testCreateGuest() throws Exception { + UserChecker checker = new UserChecker(); + OptionSetter mOptionSetter = new OptionSetter(checker); + mOptionSetter.setOptionValue("user-type", "guest"); + ITestDevice device = + mockDeviceUserState(/* currentUser= */ 0, /* userIds= */ new Integer[] {0}); + + when(device.createUser("Tfguest", /* guest= */ true, /* ephemeral= */ false)) + .thenReturn(10); + when(device.switchUser(10)).thenReturn(true); + + StatusCheckerResult result = checker.preExecutionCheck(device); + assertEquals(CheckStatus.SUCCESS, result.getStatus()); + verify(device, times(1)).createUser("Tfguest", /* guest= */ true, /* ephemeral= */ false); + verify(device, times(1)).switchUser(10); + } + // // TEST HELPERS /** Return a device with the user state calls mocked. */ diff --git a/tests/src/com/android/tradefed/targetprep/SwitchUserTargetPreparerTest.java b/tests/src/com/android/tradefed/targetprep/SwitchUserTargetPreparerTest.java index d18c55196..c5bbb067e 100644 --- a/tests/src/com/android/tradefed/targetprep/SwitchUserTargetPreparerTest.java +++ b/tests/src/com/android/tradefed/targetprep/SwitchUserTargetPreparerTest.java @@ -57,7 +57,7 @@ public class SwitchUserTargetPreparerTest { } @Test - public void testSetUpRunAsPrimary_ifAlreadyInPrimary() + public void testSetUpRunAsPrimary_ifAlreadyInPrimary_noSwitch() throws DeviceNotAvailableException, TargetSetupError, ConfigurationException { mOptionSetter.setOptionValue("user-type", "primary"); @@ -77,23 +77,22 @@ public class SwitchUserTargetPreparerTest { } @Test - public void testSetUpRunAsSystem_ifAlreadyInSystem_switchToSystem() + public void testSetUpRunAsSystem_ifAlreadyInSystem_noSwitch() throws DeviceNotAvailableException, TargetSetupError, ConfigurationException { mOptionSetter.setOptionValue("user-type", "system"); // setup - when(mMockDevice.getCurrentUser()).thenReturn(11); + when(mMockDevice.getCurrentUser()).thenReturn(0); mockListUsersInfo( mMockDevice, /* userIds= */ new Integer[] {0, 11}, /* flags= */ new Integer[] {0, UserInfo.FLAG_PRIMARY}); - when(mMockDevice.switchUser(0)).thenReturn(true); // act mSwitchUserTargetPreparer.setUp(mMockDevice, /* buildInfo= */ null); // assert - verify(mMockDevice, times(1)).switchUser(0); + verify(mMockDevice, never()).switchUser(0); } @Test @@ -117,6 +116,26 @@ public class SwitchUserTargetPreparerTest { } @Test + public void testSetUpRunAsGuest_ifNotInGuest_switchToGuest() + throws DeviceNotAvailableException, TargetSetupError, ConfigurationException { + mOptionSetter.setOptionValue("user-type", "guest"); + + // setup + when(mMockDevice.getCurrentUser()).thenReturn(11); + mockListUsersInfo( + mMockDevice, + /* userIds= */ new Integer[] {0, 10, 11}, + /* flags= */ new Integer[] {0, UserInfo.FLAG_GUEST, 0}); + when(mMockDevice.switchUser(10)).thenReturn(true); + + // act + mSwitchUserTargetPreparer.setUp(mMockDevice, /* buildInfo= */ null); + + // assert + verify(mMockDevice, times(1)).switchUser(10); + } + + @Test public void testSetUpRunAsSystem_ifNotInSystem_switchToSystem() throws DeviceNotAvailableException, TargetSetupError, ConfigurationException { mOptionSetter.setOptionValue("user-type", "system"); |