1 /*
2  * Copyright (C) 2023 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.server.pm;
18 
19 import static com.android.server.pm.UserJourneyLogger.ERROR_CODE_ABORTED;
20 import static com.android.server.pm.UserJourneyLogger.ERROR_CODE_INCOMPLETE_OR_TIMEOUT;
21 import static com.android.server.pm.UserJourneyLogger.ERROR_CODE_NULL_USER_INFO;
22 import static com.android.server.pm.UserJourneyLogger.ERROR_CODE_UNSPECIFIED;
23 import static com.android.server.pm.UserJourneyLogger.EVENT_STATE_BEGIN;
24 import static com.android.server.pm.UserJourneyLogger.EVENT_STATE_CANCEL;
25 import static com.android.server.pm.UserJourneyLogger.EVENT_STATE_ERROR;
26 import static com.android.server.pm.UserJourneyLogger.EVENT_STATE_FINISH;
27 import static com.android.server.pm.UserJourneyLogger.EVENT_STATE_NONE;
28 import static com.android.server.pm.UserJourneyLogger.USER_JOURNEY_GRANT_ADMIN;
29 import static com.android.server.pm.UserJourneyLogger.USER_JOURNEY_USER_CREATE;
30 import static com.android.server.pm.UserJourneyLogger.USER_JOURNEY_USER_LIFECYCLE;
31 import static com.android.server.pm.UserJourneyLogger.USER_JOURNEY_USER_REMOVE;
32 import static com.android.server.pm.UserJourneyLogger.USER_JOURNEY_USER_START;
33 import static com.android.server.pm.UserJourneyLogger.USER_JOURNEY_USER_STOP;
34 import static com.android.server.pm.UserJourneyLogger.USER_LIFECYCLE_EVENT_CREATE_USER;
35 import static com.android.server.pm.UserJourneyLogger.USER_LIFECYCLE_EVENT_REMOVE_USER;
36 import static com.android.server.pm.UserJourneyLogger.USER_LIFECYCLE_EVENT_REVOKE_ADMIN;
37 import static com.android.server.pm.UserJourneyLogger.USER_LIFECYCLE_EVENT_START_USER;
38 import static com.android.server.pm.UserJourneyLogger.USER_LIFECYCLE_EVENT_STOP_USER;
39 import static com.android.server.pm.UserJourneyLogger.USER_LIFECYCLE_EVENT_USER_RUNNING_LOCKED;
40 
41 import static com.google.common.truth.Truth.assertThat;
42 
43 import static org.mockito.Mockito.spy;
44 import static org.mockito.Mockito.times;
45 import static org.mockito.Mockito.verify;
46 
47 import android.content.pm.UserInfo;
48 import android.platform.test.annotations.Presubmit;
49 
50 import androidx.test.runner.AndroidJUnit4;
51 
52 import com.android.internal.util.FrameworkStatsLog;
53 
54 import org.junit.Before;
55 import org.junit.Test;
56 import org.junit.runner.RunWith;
57 import org.mockito.ArgumentCaptor;
58 
59 @Presubmit
60 @RunWith(AndroidJUnit4.class)
61 public class UserJourneyLoggerTest {
62 
63     public static final int FULL_USER_ADMIN_FLAG = 0x00000402;
64     private UserJourneyLogger mUserJourneyLogger;
65 
66     @Before
setup()67     public void setup() throws Exception {
68         mUserJourneyLogger = spy(new UserJourneyLogger());
69     }
70 
71     @Test
testUserStartLifecycleJourneyReported()72     public void testUserStartLifecycleJourneyReported() {
73         final UserLifecycleJourneyReportedCaptor report1 = new UserLifecycleJourneyReportedCaptor();
74         final UserJourneyLogger.UserJourneySession session = new UserJourneyLogger
75                 .UserJourneySession(10, USER_JOURNEY_USER_START);
76 
77         report1.captureLogAndAssert(mUserJourneyLogger, session,
78                 USER_JOURNEY_USER_START, 0, 10,
79                 FrameworkStatsLog.USER_LIFECYCLE_JOURNEY_REPORTED__USER_TYPE__FULL_SECONDARY, 1,
80                 ERROR_CODE_UNSPECIFIED);
81     }
82 
83 
84     @Test
testUserLifecycleEventOccurred()85     public void testUserLifecycleEventOccurred() {
86         final UserLifecycleEventOccurredCaptor report1 = new UserLifecycleEventOccurredCaptor();
87         final UserJourneyLogger.UserJourneySession session = new UserJourneyLogger
88                 .UserJourneySession(10, USER_JOURNEY_USER_START);
89 
90         report1.captureLogAndAssert(mUserJourneyLogger, session, 0,
91                 USER_LIFECYCLE_EVENT_START_USER, EVENT_STATE_BEGIN, ERROR_CODE_UNSPECIFIED);
92     }
93 
94     @Test
testLogUserLifecycleEvent()95     public void testLogUserLifecycleEvent() {
96         final UserLifecycleEventOccurredCaptor report1 = new UserLifecycleEventOccurredCaptor();
97         final UserJourneyLogger.UserJourneySession session = mUserJourneyLogger
98                 .logUserJourneyBegin(10, USER_JOURNEY_USER_START);
99 
100         report1.captureAndAssert(mUserJourneyLogger, session.mSessionId, 10,
101                 USER_LIFECYCLE_EVENT_START_USER, EVENT_STATE_BEGIN, ERROR_CODE_UNSPECIFIED, 1);
102 
103         mUserJourneyLogger.logUserLifecycleEvent(10, USER_LIFECYCLE_EVENT_USER_RUNNING_LOCKED,
104                 EVENT_STATE_NONE);
105 
106         report1.captureAndAssert(mUserJourneyLogger, session.mSessionId, 10,
107                 USER_LIFECYCLE_EVENT_USER_RUNNING_LOCKED,
108                 EVENT_STATE_NONE, ERROR_CODE_UNSPECIFIED, 2);
109     }
110 
111 
112     @Test
testCreateUserJourney()113     public void testCreateUserJourney() {
114         final UserLifecycleEventOccurredCaptor report1 = new UserLifecycleEventOccurredCaptor();
115         final UserJourneyLogger.UserJourneySession session = mUserJourneyLogger
116                 .logUserJourneyBegin(-1, USER_JOURNEY_USER_CREATE);
117 
118         report1.captureAndAssert(mUserJourneyLogger, session.mSessionId, -1,
119                 USER_LIFECYCLE_EVENT_CREATE_USER,
120                 EVENT_STATE_BEGIN, ERROR_CODE_UNSPECIFIED, 1);
121 
122         final UserLifecycleJourneyReportedCaptor report2 = new UserLifecycleJourneyReportedCaptor();
123         UserInfo targetUser = new UserInfo(10, "test target user",
124                 UserInfo.FLAG_ADMIN | UserInfo.FLAG_FULL);
125         mUserJourneyLogger.logUserCreateJourneyFinish(0, targetUser);
126 
127         report1.captureAndAssert(mUserJourneyLogger, session.mSessionId, 10,
128                 USER_LIFECYCLE_EVENT_CREATE_USER,
129                 EVENT_STATE_FINISH, ERROR_CODE_UNSPECIFIED, 2);
130 
131         report2.captureAndAssert(mUserJourneyLogger, session.mSessionId,
132                 USER_JOURNEY_USER_CREATE, 0, 10,
133                 FrameworkStatsLog.USER_LIFECYCLE_JOURNEY_REPORTED__USER_TYPE__FULL_SECONDARY,
134                 0x00000402, ERROR_CODE_UNSPECIFIED, 1);
135     }
136 
137     @Test
testRemoveUserJourney()138     public void testRemoveUserJourney() {
139         final UserLifecycleEventOccurredCaptor report1 = new UserLifecycleEventOccurredCaptor();
140         final UserJourneyLogger.UserJourneySession session = mUserJourneyLogger
141                 .logUserJourneyBegin(10, USER_JOURNEY_USER_REMOVE);
142 
143         report1.captureAndAssert(mUserJourneyLogger, session.mSessionId, 10,
144                 USER_LIFECYCLE_EVENT_REMOVE_USER,
145                 EVENT_STATE_BEGIN, ERROR_CODE_UNSPECIFIED, 1);
146 
147         final UserLifecycleJourneyReportedCaptor report2 = new UserLifecycleJourneyReportedCaptor();
148         final UserInfo targetUser = new UserInfo(10, "test target user",
149                 UserInfo.FLAG_ADMIN | UserInfo.FLAG_FULL);
150         mUserJourneyLogger.logUserJourneyFinish(0, targetUser,
151                 USER_JOURNEY_USER_REMOVE);
152 
153         report1.captureAndAssert(mUserJourneyLogger, session.mSessionId, 10,
154                 USER_LIFECYCLE_EVENT_REMOVE_USER,
155                 EVENT_STATE_FINISH, ERROR_CODE_UNSPECIFIED, 2);
156 
157         report2.captureAndAssert(mUserJourneyLogger, session.mSessionId,
158                 USER_JOURNEY_USER_REMOVE, 0, 10,
159                 FrameworkStatsLog.USER_LIFECYCLE_JOURNEY_REPORTED__USER_TYPE__FULL_SECONDARY,
160                 0x00000402, ERROR_CODE_UNSPECIFIED, 1);
161     }
162 
163     @Test
testStartUserJourney()164     public void testStartUserJourney() {
165         final UserLifecycleEventOccurredCaptor report1 = new UserLifecycleEventOccurredCaptor();
166         final UserJourneyLogger.UserJourneySession session = mUserJourneyLogger
167                 .logUserJourneyBegin(10, USER_JOURNEY_USER_START);
168 
169         report1.captureAndAssert(mUserJourneyLogger, session.mSessionId, 10,
170                 USER_LIFECYCLE_EVENT_START_USER,
171                 EVENT_STATE_BEGIN, ERROR_CODE_UNSPECIFIED, 1);
172 
173         final UserLifecycleJourneyReportedCaptor report2 = new UserLifecycleJourneyReportedCaptor();
174         final UserInfo targetUser = new UserInfo(10, "test target user",
175                 UserInfo.FLAG_ADMIN | UserInfo.FLAG_FULL);
176         mUserJourneyLogger.logUserJourneyFinish(0, targetUser,
177                 USER_JOURNEY_USER_START);
178 
179         report1.captureAndAssert(mUserJourneyLogger, session.mSessionId, 10,
180                 USER_LIFECYCLE_EVENT_START_USER,
181                 EVENT_STATE_FINISH, ERROR_CODE_UNSPECIFIED, 2);
182 
183         report2.captureAndAssert(mUserJourneyLogger, session.mSessionId,
184                 USER_JOURNEY_USER_START, 0, 10,
185                 FrameworkStatsLog.USER_LIFECYCLE_JOURNEY_REPORTED__USER_TYPE__FULL_SECONDARY,
186                 0x00000402, ERROR_CODE_UNSPECIFIED, 1);
187     }
188 
189     @Test
testStopUserJourney()190     public void testStopUserJourney() {
191         final UserLifecycleEventOccurredCaptor report1 = new UserLifecycleEventOccurredCaptor();
192         final UserJourneyLogger.UserJourneySession session = mUserJourneyLogger
193                 .logUserJourneyBegin(10, USER_JOURNEY_USER_STOP);
194 
195         report1.captureAndAssert(mUserJourneyLogger, session.mSessionId, 10,
196                 USER_LIFECYCLE_EVENT_STOP_USER, EVENT_STATE_BEGIN, ERROR_CODE_UNSPECIFIED, 1);
197 
198         final UserLifecycleJourneyReportedCaptor report2 = new UserLifecycleJourneyReportedCaptor();
199         final UserInfo targetUser = new UserInfo(10, "test target user",
200                 UserInfo.FLAG_ADMIN | UserInfo.FLAG_FULL);
201         mUserJourneyLogger.logUserJourneyFinish(0, targetUser,
202                 USER_JOURNEY_USER_STOP);
203 
204         report1.captureAndAssert(mUserJourneyLogger, session.mSessionId, 10,
205                 USER_LIFECYCLE_EVENT_STOP_USER, EVENT_STATE_FINISH, ERROR_CODE_UNSPECIFIED, 2);
206 
207         report2.captureAndAssert(mUserJourneyLogger, session.mSessionId,
208                 USER_JOURNEY_USER_STOP, 0, 10,
209                 FrameworkStatsLog.USER_LIFECYCLE_JOURNEY_REPORTED__USER_TYPE__FULL_SECONDARY,
210                 0x00000402, ERROR_CODE_UNSPECIFIED, 1);
211     }
212 
213     @Test
testAbortStopUserJourney()214     public void testAbortStopUserJourney() {
215         final UserLifecycleEventOccurredCaptor report1 = new UserLifecycleEventOccurredCaptor();
216         final UserJourneyLogger.UserJourneySession session = mUserJourneyLogger
217                 .logUserJourneyBegin(10, USER_JOURNEY_USER_STOP);
218 
219         report1.captureAndAssert(mUserJourneyLogger, session.mSessionId, 10,
220                 USER_LIFECYCLE_EVENT_STOP_USER, EVENT_STATE_BEGIN, ERROR_CODE_UNSPECIFIED, 1);
221 
222         final UserLifecycleJourneyReportedCaptor report2 = new UserLifecycleJourneyReportedCaptor();
223         final UserInfo targetUser = new UserInfo(10, "test target user",
224                 UserInfo.FLAG_ADMIN | UserInfo.FLAG_FULL);
225 
226         mUserJourneyLogger.logUserJourneyFinishWithError(-1, targetUser,
227                 USER_JOURNEY_USER_STOP, ERROR_CODE_ABORTED);
228         report1.captureAndAssert(mUserJourneyLogger, session.mSessionId, 10,
229                 USER_LIFECYCLE_EVENT_STOP_USER,
230                 EVENT_STATE_CANCEL, ERROR_CODE_ABORTED, 2);
231 
232         report2.captureAndAssert(mUserJourneyLogger, session.mSessionId,
233                 USER_JOURNEY_USER_STOP, -1, 10,
234                 FrameworkStatsLog.USER_LIFECYCLE_JOURNEY_REPORTED__USER_TYPE__FULL_SECONDARY,
235                 0x00000402, ERROR_CODE_ABORTED, 1);
236     }
237 
238     @Test
testIncompleteStopUserJourney()239     public void testIncompleteStopUserJourney() {
240         final UserLifecycleEventOccurredCaptor report1 = new UserLifecycleEventOccurredCaptor();
241         final UserLifecycleJourneyReportedCaptor report2 = new UserLifecycleJourneyReportedCaptor();
242 
243         final UserJourneyLogger.UserJourneySession session = mUserJourneyLogger
244                 .logUserJourneyBegin(10, USER_JOURNEY_USER_STOP);
245         report1.captureAndAssert(mUserJourneyLogger, session.mSessionId, 10,
246                 USER_LIFECYCLE_EVENT_STOP_USER,
247                 EVENT_STATE_BEGIN, ERROR_CODE_UNSPECIFIED, 1);
248 
249         mUserJourneyLogger.finishAndClearIncompleteUserJourney(10, USER_JOURNEY_USER_STOP);
250         report1.captureAndAssert(mUserJourneyLogger, session.mSessionId, 10,
251                 USER_LIFECYCLE_EVENT_STOP_USER,
252                 EVENT_STATE_ERROR,
253                 ERROR_CODE_INCOMPLETE_OR_TIMEOUT, 2);
254 
255         report2.captureAndAssert(mUserJourneyLogger, session.mSessionId,
256                 USER_JOURNEY_USER_STOP, -1, 10,
257                 FrameworkStatsLog.USER_LIFECYCLE_JOURNEY_REPORTED__USER_TYPE__TYPE_UNKNOWN,
258                 -1, // information about user are incomplete
259                 ERROR_CODE_INCOMPLETE_OR_TIMEOUT, 1);
260     }
261 
262     @Test
testGrantAdminUserJourney()263     public void testGrantAdminUserJourney() {
264         final UserLifecycleEventOccurredCaptor report1 = new UserLifecycleEventOccurredCaptor();
265         final UserJourneyLogger.UserJourneySession session = mUserJourneyLogger
266                 .logUserJourneyBegin(10, USER_JOURNEY_GRANT_ADMIN);
267 
268         report1.captureAndAssert(mUserJourneyLogger, session.mSessionId, 10,
269                 UserJourneyLogger.USER_LIFECYCLE_EVENT_GRANT_ADMIN,
270                 EVENT_STATE_BEGIN, ERROR_CODE_UNSPECIFIED, 1);
271 
272         final UserLifecycleJourneyReportedCaptor report2 = new UserLifecycleJourneyReportedCaptor();
273         final UserInfo targetUser = new UserInfo(10, "test target user",
274                 UserInfo.FLAG_ADMIN | UserInfo.FLAG_FULL);
275         mUserJourneyLogger.logUserJourneyFinish(0, targetUser,
276                 USER_JOURNEY_GRANT_ADMIN);
277 
278         report1.captureAndAssert(mUserJourneyLogger, session.mSessionId, 10,
279                 UserJourneyLogger.USER_LIFECYCLE_EVENT_GRANT_ADMIN,
280                 EVENT_STATE_FINISH, ERROR_CODE_UNSPECIFIED, 2);
281 
282         report2.captureAndAssert(mUserJourneyLogger, session.mSessionId,
283                 USER_JOURNEY_GRANT_ADMIN, 0, 10,
284                 FrameworkStatsLog.USER_LIFECYCLE_JOURNEY_REPORTED__USER_TYPE__FULL_SECONDARY,
285                 0x00000402, ERROR_CODE_UNSPECIFIED, 1);
286     }
287 
288     @Test
testNullUserErrorGrantAdminUserJourney()289     public void testNullUserErrorGrantAdminUserJourney() {
290         final UserLifecycleEventOccurredCaptor report1 = new UserLifecycleEventOccurredCaptor();
291         final UserLifecycleJourneyReportedCaptor report2 = new UserLifecycleJourneyReportedCaptor();
292 
293         UserJourneyLogger.UserJourneySession session = mUserJourneyLogger
294                 .logUserJourneyBegin(10, USER_JOURNEY_GRANT_ADMIN);
295 
296         report1.captureAndAssert(mUserJourneyLogger, session.mSessionId, 10,
297                 UserJourneyLogger.USER_LIFECYCLE_EVENT_GRANT_ADMIN,
298                 EVENT_STATE_BEGIN, ERROR_CODE_UNSPECIFIED, 1);
299 
300         mUserJourneyLogger.logNullUserJourneyError(USER_JOURNEY_GRANT_ADMIN,
301                 0, 10, "", -1);
302 
303         report1.captureAndAssert(mUserJourneyLogger, session.mSessionId, 10,
304                 UserJourneyLogger.USER_LIFECYCLE_EVENT_GRANT_ADMIN,
305                 EVENT_STATE_ERROR, ERROR_CODE_NULL_USER_INFO, 2);
306 
307         report2.captureAndAssert(mUserJourneyLogger, session.mSessionId,
308                 USER_JOURNEY_GRANT_ADMIN, 0, 10,
309                 FrameworkStatsLog.USER_LIFECYCLE_EVENT_OCCURRED__EVENT__UNKNOWN,
310                 -1, ERROR_CODE_NULL_USER_INFO, 1);
311     }
312 
313     @Test
testRevokeAdminUserJourney()314     public void testRevokeAdminUserJourney() {
315         final UserLifecycleEventOccurredCaptor report1 = new UserLifecycleEventOccurredCaptor();
316         final UserJourneyLogger.UserJourneySession session = mUserJourneyLogger
317                 .logUserJourneyBegin(10, UserJourneyLogger.USER_JOURNEY_REVOKE_ADMIN);
318 
319         report1.captureAndAssert(mUserJourneyLogger, session.mSessionId, 10,
320                 USER_LIFECYCLE_EVENT_REVOKE_ADMIN,
321                 EVENT_STATE_BEGIN, ERROR_CODE_UNSPECIFIED, 1);
322 
323         final UserLifecycleJourneyReportedCaptor report2 = new UserLifecycleJourneyReportedCaptor();
324         final UserInfo targetUser = new UserInfo(10, "test target user", UserInfo.FLAG_FULL);
325         mUserJourneyLogger.logUserJourneyFinish(0, targetUser,
326                 UserJourneyLogger.USER_JOURNEY_REVOKE_ADMIN);
327 
328         report1.captureAndAssert(mUserJourneyLogger, session.mSessionId, 10,
329                 USER_LIFECYCLE_EVENT_REVOKE_ADMIN,
330                 EVENT_STATE_FINISH, ERROR_CODE_UNSPECIFIED, 2);
331 
332         report2.captureAndAssert(mUserJourneyLogger, session.mSessionId,
333                 UserJourneyLogger.USER_JOURNEY_REVOKE_ADMIN, 0, 10,
334                 FrameworkStatsLog.USER_LIFECYCLE_JOURNEY_REPORTED__USER_TYPE__FULL_SECONDARY,
335                 0x00000400, ERROR_CODE_UNSPECIFIED, 1);
336     }
337 
338     @Test
testSwitchFGUserJourney()339     public void testSwitchFGUserJourney() {
340         final UserLifecycleEventOccurredCaptor report1 = new UserLifecycleEventOccurredCaptor();
341         final UserJourneyLogger.UserJourneySession session = mUserJourneyLogger
342                 .logUserJourneyBegin(11, UserJourneyLogger.USER_JOURNEY_USER_SWITCH_FG);
343 
344         report1.captureAndAssert(mUserJourneyLogger, session.mSessionId, 11,
345                 UserJourneyLogger.USER_LIFECYCLE_EVENT_SWITCH_USER,
346                 EVENT_STATE_BEGIN, ERROR_CODE_UNSPECIFIED, 1);
347 
348         final UserJourneyLogger.UserJourneySession session2 = mUserJourneyLogger
349                 .logUserJourneyBegin(11, USER_JOURNEY_USER_START);
350 
351         report1.captureAndAssert(mUserJourneyLogger, session2.mSessionId, 11,
352                 USER_LIFECYCLE_EVENT_START_USER,
353                 EVENT_STATE_BEGIN, ERROR_CODE_UNSPECIFIED, 2);
354 
355         final UserLifecycleJourneyReportedCaptor report2 = new UserLifecycleJourneyReportedCaptor();
356         final UserInfo targetUser = new UserInfo(11, "test target user",
357                 UserInfo.FLAG_ADMIN | UserInfo.FLAG_FULL);
358         mUserJourneyLogger.logUserJourneyFinish(10, targetUser,
359                 USER_JOURNEY_USER_START);
360 
361         report1.captureAndAssert(mUserJourneyLogger, session2.mSessionId, 11,
362                 USER_LIFECYCLE_EVENT_START_USER,
363                 EVENT_STATE_FINISH, ERROR_CODE_UNSPECIFIED, 3);
364 
365         report2.captureAndAssert(mUserJourneyLogger, session2.mSessionId,
366                 USER_JOURNEY_USER_START, 10, 11,
367                 FrameworkStatsLog.USER_LIFECYCLE_JOURNEY_REPORTED__USER_TYPE__FULL_SECONDARY,
368                 0x00000402, ERROR_CODE_UNSPECIFIED, 1);
369 
370         mUserJourneyLogger.logUserSwitchJourneyFinish(10, targetUser);
371 
372         report1.captureAndAssert(mUserJourneyLogger, session.mSessionId, 11,
373                 UserJourneyLogger.USER_LIFECYCLE_EVENT_SWITCH_USER,
374                 EVENT_STATE_FINISH, ERROR_CODE_UNSPECIFIED, 4);
375 
376         report2.captureAndAssert(mUserJourneyLogger, session.mSessionId,
377                 UserJourneyLogger.USER_JOURNEY_USER_SWITCH_FG, 10, 11,
378                 FrameworkStatsLog.USER_LIFECYCLE_JOURNEY_REPORTED__USER_TYPE__FULL_SECONDARY,
379                 0x00000402, ERROR_CODE_UNSPECIFIED, 2);
380     }
381 
382 
383     @Test
testSwitchUIUserJourney()384     public void testSwitchUIUserJourney() {
385         final UserLifecycleEventOccurredCaptor report1 = new UserLifecycleEventOccurredCaptor();
386         final UserJourneyLogger.UserJourneySession session = mUserJourneyLogger
387                 .logUserJourneyBegin(11, UserJourneyLogger.USER_JOURNEY_USER_SWITCH_UI);
388 
389         report1.captureAndAssert(mUserJourneyLogger, session.mSessionId, 11,
390                 UserJourneyLogger.USER_LIFECYCLE_EVENT_SWITCH_USER,
391                 EVENT_STATE_BEGIN, ERROR_CODE_UNSPECIFIED, 1);
392 
393         final UserJourneyLogger.UserJourneySession session2 = mUserJourneyLogger
394                 .logUserJourneyBegin(11, USER_JOURNEY_USER_START);
395 
396         report1.captureAndAssert(mUserJourneyLogger, session2.mSessionId, 11,
397                 USER_LIFECYCLE_EVENT_START_USER,
398                 EVENT_STATE_BEGIN, ERROR_CODE_UNSPECIFIED, 2);
399 
400         final UserLifecycleJourneyReportedCaptor report2 = new UserLifecycleJourneyReportedCaptor();
401         UserInfo targetUser = new UserInfo(11, "test target user",
402                 UserInfo.FLAG_ADMIN | UserInfo.FLAG_FULL);
403         mUserJourneyLogger.logUserJourneyFinish(10, targetUser,
404                 USER_JOURNEY_USER_START);
405 
406         report1.captureAndAssert(mUserJourneyLogger, session2.mSessionId, 11,
407                 USER_LIFECYCLE_EVENT_START_USER,
408                 EVENT_STATE_FINISH, ERROR_CODE_UNSPECIFIED, 3);
409 
410         report2.captureAndAssert(mUserJourneyLogger, session2.mSessionId,
411                 USER_JOURNEY_USER_START, 10, 11,
412                 FrameworkStatsLog.USER_LIFECYCLE_JOURNEY_REPORTED__USER_TYPE__FULL_SECONDARY,
413                 0x00000402, ERROR_CODE_UNSPECIFIED, 1);
414 
415         mUserJourneyLogger.logUserSwitchJourneyFinish(10, targetUser);
416 
417         report1.captureAndAssert(mUserJourneyLogger, session.mSessionId, 11,
418                 UserJourneyLogger.USER_LIFECYCLE_EVENT_SWITCH_USER,
419                 EVENT_STATE_FINISH,
420                 ERROR_CODE_UNSPECIFIED, 4);
421 
422         report2.captureAndAssert(mUserJourneyLogger, session.mSessionId,
423                 UserJourneyLogger.USER_JOURNEY_USER_SWITCH_UI, 10, 11,
424                 FrameworkStatsLog.USER_LIFECYCLE_JOURNEY_REPORTED__USER_TYPE__FULL_SECONDARY,
425                 0x00000402, ERROR_CODE_UNSPECIFIED, 2);
426     }
427 
428 
429     @Test
testSwitchWithStopUIUserJourney()430     public void testSwitchWithStopUIUserJourney() {
431         final UserLifecycleEventOccurredCaptor report1 = new UserLifecycleEventOccurredCaptor();
432 
433         // BEGIN USER SWITCH
434         final UserJourneyLogger.UserJourneySession session = mUserJourneyLogger
435                 .logUserJourneyBegin(11, UserJourneyLogger.USER_JOURNEY_USER_SWITCH_UI);
436 
437         report1.captureAndAssert(mUserJourneyLogger, session.mSessionId, 11,
438                 UserJourneyLogger.USER_LIFECYCLE_EVENT_SWITCH_USER,
439                 EVENT_STATE_BEGIN, ERROR_CODE_UNSPECIFIED, 1);
440 
441         // BEGIN USER STOP
442         final  UserJourneyLogger.UserJourneySession session2 = mUserJourneyLogger
443                 .logUserJourneyBegin(10, USER_JOURNEY_USER_STOP);
444 
445         report1.captureAndAssert(mUserJourneyLogger, session2.mSessionId, 10,
446                 USER_LIFECYCLE_EVENT_STOP_USER,
447                 EVENT_STATE_BEGIN, ERROR_CODE_UNSPECIFIED, 2);
448 
449         // BEGIN USER START
450         UserJourneyLogger.UserJourneySession session3 = mUserJourneyLogger
451                 .logUserJourneyBegin(11, USER_JOURNEY_USER_START);
452 
453         report1.captureAndAssert(mUserJourneyLogger, session3.mSessionId, 11,
454                 USER_LIFECYCLE_EVENT_START_USER,
455                 EVENT_STATE_BEGIN, ERROR_CODE_UNSPECIFIED, 3);
456 
457 
458         // FINISH USER STOP
459         final UserLifecycleJourneyReportedCaptor report2 = new UserLifecycleJourneyReportedCaptor();
460         final UserInfo targetUser = new UserInfo(10, "test target user",
461                 UserInfo.FLAG_ADMIN | UserInfo.FLAG_FULL);
462         mUserJourneyLogger.logUserJourneyFinish(-1, targetUser,
463                 USER_JOURNEY_USER_STOP);
464 
465         report1.captureAndAssert(mUserJourneyLogger, session2.mSessionId, 10,
466                 USER_LIFECYCLE_EVENT_STOP_USER,
467                 EVENT_STATE_FINISH, ERROR_CODE_UNSPECIFIED, 4);
468 
469         report2.captureAndAssert(mUserJourneyLogger, session2.mSessionId,
470                 USER_JOURNEY_USER_STOP, -1, 10,
471                 FrameworkStatsLog.USER_LIFECYCLE_JOURNEY_REPORTED__USER_TYPE__FULL_SECONDARY,
472                 FULL_USER_ADMIN_FLAG, ERROR_CODE_UNSPECIFIED, 1);
473 
474         // FINISH USER START
475         final UserInfo targetUser2 = new UserInfo(11, "test target user",
476                 UserInfo.FLAG_ADMIN | UserInfo.FLAG_FULL);
477         mUserJourneyLogger.logUserJourneyFinish(10, targetUser2,
478                 USER_JOURNEY_USER_START);
479 
480         report1.captureAndAssert(mUserJourneyLogger, session3.mSessionId, 11,
481                 USER_LIFECYCLE_EVENT_START_USER,
482                 EVENT_STATE_FINISH, ERROR_CODE_UNSPECIFIED, 5);
483 
484         report2.captureAndAssert(mUserJourneyLogger, session3.mSessionId,
485                 USER_JOURNEY_USER_START, 10, 11,
486                 FrameworkStatsLog.USER_LIFECYCLE_JOURNEY_REPORTED__USER_TYPE__FULL_SECONDARY,
487                 FULL_USER_ADMIN_FLAG, ERROR_CODE_UNSPECIFIED, 2);
488 
489 
490         // FINISH USER SWITCH
491         mUserJourneyLogger.logUserSwitchJourneyFinish(10, targetUser2);
492 
493         report1.captureAndAssert(mUserJourneyLogger, session.mSessionId, 11,
494                 UserJourneyLogger.USER_LIFECYCLE_EVENT_SWITCH_USER,
495                 EVENT_STATE_FINISH, ERROR_CODE_UNSPECIFIED, 6);
496 
497         report2.captureAndAssert(mUserJourneyLogger, session.mSessionId,
498                 UserJourneyLogger.USER_JOURNEY_USER_SWITCH_UI, 10, 11,
499                 FrameworkStatsLog.USER_LIFECYCLE_JOURNEY_REPORTED__USER_TYPE__FULL_SECONDARY,
500                 0x00000402, ERROR_CODE_UNSPECIFIED, 3);
501     }
502 
503     @Test
testUserLifecycleJourney()504     public void testUserLifecycleJourney() {
505         final long startTime = System.currentTimeMillis();
506         final UserJourneyLogger.UserJourneySession session = mUserJourneyLogger
507                 .startSessionForDelayedJourney(10, USER_JOURNEY_USER_LIFECYCLE, startTime);
508 
509 
510         final UserLifecycleJourneyReportedCaptor report = new UserLifecycleJourneyReportedCaptor();
511         final UserInfo targetUser = new UserInfo(10, "test target user",
512                 UserInfo.FLAG_ADMIN | UserInfo.FLAG_FULL);
513         mUserJourneyLogger.logDelayedUserJourneyFinishWithError(0, targetUser,
514                 USER_JOURNEY_USER_LIFECYCLE, ERROR_CODE_UNSPECIFIED);
515 
516 
517         report.captureAndAssert(mUserJourneyLogger, session.mSessionId,
518                 USER_JOURNEY_USER_LIFECYCLE, 0, 10,
519                 FrameworkStatsLog.USER_LIFECYCLE_JOURNEY_REPORTED__USER_TYPE__FULL_SECONDARY,
520                 0x00000402, ERROR_CODE_UNSPECIFIED, 1);
521         assertThat(report.mElapsedTime.getValue() > 0L).isTrue();
522     }
523 
524     static class UserLifecycleJourneyReportedCaptor {
525         ArgumentCaptor<Long> mSessionId = ArgumentCaptor.forClass(Long.class);
526         ArgumentCaptor<Integer> mJourney = ArgumentCaptor.forClass(Integer.class);
527         ArgumentCaptor<Integer> mOriginalUserId = ArgumentCaptor.forClass(Integer.class);
528         ArgumentCaptor<Integer> mTargetUserId = ArgumentCaptor.forClass(Integer.class);
529         ArgumentCaptor<Integer> mUserType = ArgumentCaptor.forClass(Integer.class);
530         ArgumentCaptor<Integer> mUserFlags = ArgumentCaptor.forClass(Integer.class);
531         ArgumentCaptor<Integer> mErrorCode = ArgumentCaptor.forClass(Integer.class);
532         ArgumentCaptor<Long> mElapsedTime = ArgumentCaptor.forClass(Long.class);
533 
captureAndAssert(UserJourneyLogger mUserJourneyLogger, long sessionId, int journey, int originalUserId, int targetUserId, int userType, int userFlags, int errorCode, int times)534         public void captureAndAssert(UserJourneyLogger mUserJourneyLogger,
535                 long sessionId, int journey, int originalUserId,
536                 int targetUserId, int userType, int userFlags, int errorCode, int times) {
537             verify(mUserJourneyLogger, times(times))
538                     .writeUserLifecycleJourneyReported(mSessionId.capture(),
539                             mJourney.capture(),
540                             mOriginalUserId.capture(),
541                             mTargetUserId.capture(),
542                             mUserType.capture(),
543                             mUserFlags.capture(),
544                             mErrorCode.capture(),
545                             mElapsedTime.capture());
546 
547             assertThat(mSessionId.getValue()).isEqualTo(sessionId);
548             assertThat(mJourney.getValue()).isEqualTo(journey);
549             assertThat(mOriginalUserId.getValue()).isEqualTo(originalUserId);
550             assertThat(mTargetUserId.getValue()).isEqualTo(targetUserId);
551             assertThat(mUserType.getValue()).isEqualTo(userType);
552             assertThat(mUserFlags.getValue()).isEqualTo(userFlags);
553             assertThat(mErrorCode.getValue()).isEqualTo(errorCode);
554         }
555 
556 
captureLogAndAssert(UserJourneyLogger mUserJourneyLogger, UserJourneyLogger.UserJourneySession session, int journey, int originalUserId, int targetUserId, int userType, int userFlags, int errorCode)557         public void captureLogAndAssert(UserJourneyLogger mUserJourneyLogger,
558                 UserJourneyLogger.UserJourneySession session, int journey, int originalUserId,
559                 int targetUserId, int userType, int userFlags, int errorCode) {
560             mUserJourneyLogger.logUserLifecycleJourneyReported(session, journey, originalUserId,
561                     targetUserId, userType, userFlags, errorCode);
562 
563             captureAndAssert(mUserJourneyLogger, session.mSessionId, journey, originalUserId,
564                     targetUserId, userType, userFlags, errorCode, 1);
565         }
566     }
567 
568 
569     static class UserLifecycleEventOccurredCaptor {
570         ArgumentCaptor<Long> mSessionId = ArgumentCaptor.forClass(Long.class);
571         ArgumentCaptor<Integer> mTargetUserId = ArgumentCaptor.forClass(Integer.class);
572         ArgumentCaptor<Integer> mEvent = ArgumentCaptor.forClass(Integer.class);
573         ArgumentCaptor<Integer> mStste = ArgumentCaptor.forClass(Integer.class);
574         ArgumentCaptor<Integer> mErrorCode = ArgumentCaptor.forClass(Integer.class);
575 
576 
captureAndAssert(UserJourneyLogger mUserJourneyLogger, long sessionId, int targetUserId, int event, int state, int errorCode, int times)577         public void captureAndAssert(UserJourneyLogger mUserJourneyLogger,
578                 long sessionId, int targetUserId, int event, int state, int errorCode, int times) {
579             verify(mUserJourneyLogger, times(times))
580                     .writeUserLifecycleEventOccurred(mSessionId.capture(),
581                             mTargetUserId.capture(),
582                             mEvent.capture(),
583                             mStste.capture(),
584                             mErrorCode.capture());
585 
586             assertThat(mSessionId.getValue()).isEqualTo(sessionId);
587             assertThat(mTargetUserId.getValue()).isEqualTo(targetUserId);
588             assertThat(mEvent.getValue()).isEqualTo(event);
589             assertThat(mStste.getValue()).isEqualTo(state);
590             assertThat(mErrorCode.getValue()).isEqualTo(errorCode);
591         }
592 
593 
captureLogAndAssert(UserJourneyLogger mUserJourneyLogger, UserJourneyLogger.UserJourneySession session, int targetUserId, int event, int state, int errorCode)594         public void captureLogAndAssert(UserJourneyLogger mUserJourneyLogger,
595                 UserJourneyLogger.UserJourneySession session, int targetUserId, int event,
596                 int state, int errorCode) {
597             mUserJourneyLogger.logUserLifecycleEventOccurred(session, targetUserId, event,
598                     state, errorCode);
599 
600             captureAndAssert(mUserJourneyLogger, session.mSessionId, targetUserId, event,
601                     state, errorCode, 1);
602         }
603     }
604 }