final String userId = UserIdContext.getInstance().getUserId(); post(new Runnable() {
/** * {@link #setUserId(String)} implementation at instance level. */ private synchronized void setInstanceUserId(String userId) { if (!mConfiguredFromApp) { AppCenterLog.error(LOG_TAG, "AppCenter must be configured from application, libraries cannot use call setUserId."); return; } if (mAppSecret == null && mTransmissionTargetToken == null) { AppCenterLog.error(LOG_TAG, "AppCenter must be configured with a secret from application to call setUserId."); return; } if (userId != null) { if (mAppSecret != null && !UserIdContext.checkUserIdValidForAppCenter(userId)) { return; } if (mTransmissionTargetToken != null && !UserIdContext.checkUserIdValidForOneCollector(userId)) { return; } } UserIdContext.getInstance().setUserId(userId); }
@After public void resetUserId() { UserIdContext.unsetInstance(); }
@Test public void trackEventWithUserIdWhenConfiguredForTarget() { UserIdContext.getInstance().setUserId("c:alice"); Analytics analytics = Analytics.getInstance(); Channel channel = mock(Channel.class); analytics.onStarting(mAppCenterHandler); analytics.onStarted(mock(Context.class), channel, null, "target", true); Analytics.trackEvent("eventName1"); ArgumentCaptor<EventLog> eventLogArgumentCaptor = ArgumentCaptor.forClass(EventLog.class); verify(channel).enqueue(eventLogArgumentCaptor.capture(), anyString(), eq(DEFAULTS)); assertEquals("c:alice", eventLogArgumentCaptor.getValue().getUserId()); }
@Override public void run() { mUserId = UserIdContext.getPrefixedUserId(userId); } });
/** * Set the user identifier. * The user identifier needs to start with the c: prefix or must not have a prefix. * If the prefix is missing, the c: prefix will be automatically added. * The userId cannot be empty or just "c:". * * @param userId user identifier. */ @SuppressWarnings("WeakerAccess") public void setUserId(final String userId) { if (UserIdContext.checkUserIdValidForOneCollector(userId)) { Analytics.getInstance().postCommandEvenIfDisabled(new Runnable() { @Override public void run() { mUserId = UserIdContext.getPrefixedUserId(userId); } }); } }
@Test public void userIdInvalidForAppCenter() { StringBuilder userId = new StringBuilder(); for (int i = 0; i <= UserIdContext.USER_ID_APP_CENTER_MAX_LENGTH; i++) { userId.append("x"); } assertFalse(UserIdContext.checkUserIdValidForAppCenter(userId.toString())); }
@Test public void trackEventWithoutUserIdWhenConfiguredForAppSecretOnly() { UserIdContext.getInstance().setUserId("alice"); Analytics analytics = Analytics.getInstance(); Channel channel = mock(Channel.class); analytics.onStarting(mAppCenterHandler); analytics.onStarted(mock(Context.class), channel, "appSecret", null, true); Analytics.trackEvent("eventName1"); ArgumentCaptor<EventLog> eventLogArgumentCaptor = ArgumentCaptor.forClass(EventLog.class); verify(channel).enqueue(eventLogArgumentCaptor.capture(), anyString(), eq(DEFAULTS)); assertNull(eventLogArgumentCaptor.getValue().getUserId()); }
@Test public void prefixedInvalidUserId() { assertNull(UserIdContext.getPrefixedUserId(null)); assertEquals("c:alice", UserIdContext.getPrefixedUserId("alice")); assertEquals(":", UserIdContext.getPrefixedUserId(":")); }
@Test public void userIdInvalidForOneCollector() { assertFalse(UserIdContext.checkUserIdValidForOneCollector("")); assertFalse(UserIdContext.checkUserIdValidForOneCollector(":alice")); assertFalse(UserIdContext.checkUserIdValidForOneCollector("c:")); assertFalse(UserIdContext.checkUserIdValidForOneCollector("x:")); assertFalse(UserIdContext.checkUserIdValidForOneCollector("x:alice")); }
@Test public void userIdValidForAppCenter() { assertTrue(UserIdContext.checkUserIdValidForAppCenter("alice")); assertTrue(UserIdContext.checkUserIdValidForAppCenter(null)); }
/** * Enqueue a push installation log. * * @param pushToken the push token value */ private void enqueuePushInstallationLog(@NonNull String pushToken) { PushInstallationLog log = new PushInstallationLog(); log.setPushToken(pushToken); log.setUserId(UserIdContext.getInstance().getUserId()); mChannel.enqueue(log, PUSH_GROUP, Flags.DEFAULTS); }
@Test public void trackEventWithoutUserIdWhenConfiguredForBothSecrets() { UserIdContext.getInstance().setUserId("c:alice"); Analytics analytics = Analytics.getInstance(); Channel channel = mock(Channel.class); analytics.onStarting(mAppCenterHandler); analytics.onStarted(mock(Context.class), channel, "appSecret", "target", true); Analytics.trackEvent("eventName1"); ArgumentCaptor<EventLog> eventLogArgumentCaptor = ArgumentCaptor.forClass(EventLog.class); verify(channel).enqueue(eventLogArgumentCaptor.capture(), anyString(), eq(DEFAULTS)); assertEquals("c:alice", eventLogArgumentCaptor.getValue().getUserId()); }
@After public void tearDown() { UserIdContext.unsetInstance(); }
@Test public void prefixedValidUserId() { assertEquals("c:alice", UserIdContext.getPrefixedUserId("c:alice")); } }
@Test public void userIdValidForOneCollector() { assertTrue(UserIdContext.checkUserIdValidForOneCollector(null)); assertTrue(UserIdContext.checkUserIdValidForOneCollector("c:alice")); assertTrue(UserIdContext.checkUserIdValidForOneCollector("alice")); }
@Override public void run() { HandledErrorLog errorLog = new HandledErrorLog(); errorLog.setId(UUID.randomUUID()); errorLog.setUserId(UserIdContext.getInstance().getUserId()); errorLog.setException(exceptionModelBuilder.buildExceptionModel()); errorLog.setProperties(properties); mChannel.enqueue(errorLog, ERROR_GROUP, Flags.DEFAULTS); } });
@Test public void trackExceptionWithUserId() { UserIdContext.getInstance().setUserId("charlie"); /* Track exception test. */ Crashes crashes = Crashes.getInstance(); Channel mockChannel = mock(Channel.class); crashes.onStarting(mAppCenterHandler); crashes.onStarted(mock(Context.class), mockChannel, "", null, true); Crashes.trackException(EXCEPTION); ArgumentCaptor<HandledErrorLog> log = ArgumentCaptor.forClass(HandledErrorLog.class); verify(mockChannel).enqueue(log.capture(), eq(crashes.getGroupName()), eq(DEFAULTS)); assertNotNull(log.getValue()); assertEquals(EXCEPTION.getMessage(), log.getValue().getException().getMessage()); assertEquals("charlie", log.getValue().getUserId()); }
@After public void resetUserId() { UserIdContext.unsetInstance(); }
dest.getExt().getUser().setLocalId(UserIdContext.getPrefixedUserId(src.getUserId())); dest.getExt().getUser().setLocale(device.getLocale().replace("_", "-"));