1 /*
2  * Copyright (C) 2021 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package com.android.bedstead.nene.users;
18 
19 import static com.google.common.truth.Truth.assertThat;
20 
21 import static org.testng.Assert.assertThrows;
22 
23 import com.android.bedstead.nene.TestApis;
24 
25 import org.junit.Ignore;
26 import org.junit.Test;
27 import org.junit.runner.RunWith;
28 import org.junit.runners.JUnit4;
29 
30 @RunWith(JUnit4.class)
31 public class UserTest {
32 
33     private static final int NON_EXISTING_USER_ID = 10000;
34     private static final int USER_ID = NON_EXISTING_USER_ID;
35     private static final int SERIAL_NO = 1000;
36     private static final UserType USER_TYPE = new UserType(new UserType.MutableUserType());
37     private static final String USER_NAME = "userName";
38 
39     private final TestApis mTestApis = new TestApis();
40 
41     @Test
id_returnsId()42     public void id_returnsId() {
43         User.MutableUser mutableUser = createValidMutableUser();
44         mutableUser.mId = USER_ID;
45         User user = new User(mTestApis, mutableUser);
46 
47         assertThat(user.id()).isEqualTo(USER_ID);
48     }
49 
50     @Test
construct_idNotSet_throwsNullPointerException()51     public void construct_idNotSet_throwsNullPointerException() {
52         User.MutableUser mutableUser = createValidMutableUser();
53         mutableUser.mId = null;
54 
55         assertThrows(NullPointerException.class, () -> new User(mTestApis, mutableUser));
56     }
57 
58     @Test
serialNo_returnsSerialNo()59     public void serialNo_returnsSerialNo() {
60         User.MutableUser mutableUser = createValidMutableUser();
61         mutableUser.mSerialNo = SERIAL_NO;
62         User user = new User(mTestApis, mutableUser);
63 
64         assertThat(user.serialNo()).isEqualTo(SERIAL_NO);
65     }
66 
67     @Test
serialNo_notSet_returnsNull()68     public void serialNo_notSet_returnsNull() {
69         User.MutableUser mutableUser = createValidMutableUser();
70         User user = new User(mTestApis, mutableUser);
71 
72         assertThat(user.serialNo()).isNull();
73     }
74 
75     @Test
name_returnsName()76     public void name_returnsName() {
77         User.MutableUser mutableUser = createValidMutableUser();
78         mutableUser.mName = USER_NAME;
79         User user = new User(mTestApis, mutableUser);
80 
81         assertThat(user.name()).isEqualTo(USER_NAME);
82     }
83 
84     @Test
name_notSet_returnsNull()85     public void name_notSet_returnsNull() {
86         User.MutableUser mutableUser = createValidMutableUser();
87         User user = new User(mTestApis, mutableUser);
88 
89         assertThat(user.name()).isNull();
90     }
91 
92     @Test
type_returnsName()93     public void type_returnsName() {
94         User.MutableUser mutableUser = createValidMutableUser();
95         mutableUser.mType = USER_TYPE;
96         User user = new User(mTestApis, mutableUser);
97 
98         assertThat(user.type()).isEqualTo(USER_TYPE);
99     }
100 
101     @Test
type_notSet_returnsNull()102     public void type_notSet_returnsNull() {
103         User.MutableUser mutableUser = createValidMutableUser();
104         User user = new User(mTestApis, mutableUser);
105 
106         assertThat(user.type()).isNull();
107     }
108 
109     @Test
hasProfileOwner_returnsHasProfileOwner()110     public void hasProfileOwner_returnsHasProfileOwner() {
111         User.MutableUser mutableUser = createValidMutableUser();
112         mutableUser.mHasProfileOwner = true;
113         User user = new User(mTestApis, mutableUser);
114 
115         assertThat(user.hasProfileOwner()).isTrue();
116     }
117 
118     @Test
hasProfileOwner_notSet_returnsNull()119     public void hasProfileOwner_notSet_returnsNull() {
120         User.MutableUser mutableUser = createValidMutableUser();
121         User user = new User(mTestApis, mutableUser);
122 
123         assertThat(user.hasProfileOwner()).isNull();
124     }
125 
126     @Test
isPrimary_returnsIsPrimary()127     public void isPrimary_returnsIsPrimary() {
128         User.MutableUser mutableUser = createValidMutableUser();
129         mutableUser.mIsPrimary = true;
130         User user = new User(mTestApis, mutableUser);
131 
132         assertThat(user.isPrimary()).isTrue();
133     }
134 
135     @Test
isPrimary_notSet_returnsNull()136     public void isPrimary_notSet_returnsNull() {
137         User.MutableUser mutableUser = createValidMutableUser();
138         User user = new User(mTestApis, mutableUser);
139 
140         assertThat(user.isPrimary()).isNull();
141     }
142 
143     @Test
state_userNotStarted_returnsState()144     public void state_userNotStarted_returnsState() {
145         UserReference user = mTestApis.users().createUser().create();
146         user.stop();
147 
148         try {
149             assertThat(user.resolve().state()).isEqualTo(User.UserState.NOT_RUNNING);
150         } finally {
151             user.remove();
152         }
153     }
154 
155     @Test
156     @Ignore("TODO: Ensure we can enter the user locked state")
state_userLocked_returnsState()157     public void state_userLocked_returnsState() {
158         UserReference user = mTestApis.users().createUser().createAndStart();
159 
160         try {
161             assertThat(user.resolve().state()).isEqualTo(User.UserState.RUNNING_LOCKED);
162         } finally {
163             user.remove();
164         }
165     }
166 
167     @Test
state_userUnlocked_returnsState()168     public void state_userUnlocked_returnsState() {
169         UserReference user = mTestApis.users().createUser().createAndStart();
170 
171         try {
172             assertThat(user.resolve().state()).isEqualTo(User.UserState.RUNNING_UNLOCKED);
173         } finally {
174             user.remove();
175         }
176     }
177 
178     @Test
parent_returnsParent()179     public void parent_returnsParent() {
180         UserReference parentUser = new User(mTestApis, createValidMutableUser());
181         User.MutableUser mutableUser = createValidMutableUser();
182         mutableUser.mParent = parentUser;
183         User user = new User(mTestApis, mutableUser);
184 
185         assertThat(user.parent()).isEqualTo(parentUser);
186     }
187 
188     @Test
autoclose_removesUser()189     public void autoclose_removesUser() {
190         int numUsers = mTestApis.users().all().size();
191 
192         try (UserReference user = mTestApis.users().createUser().create()) {
193             // We intentionally don't do anything here, just rely on the auto-close behaviour
194         }
195 
196         assertThat(mTestApis.users().all()).hasSize(numUsers);
197     }
198 
createValidMutableUser()199     private User.MutableUser createValidMutableUser() {
200         User.MutableUser mutableUser = new User.MutableUser();
201         mutableUser.mId = 1;
202         return mutableUser;
203     }
204 }
205