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 }