Skip to content

Commit 10daf06

Browse files
committed
Check cache for choice ID and add more asserts in tests.
1 parent 3fdff9f commit 10daf06

File tree

2 files changed

+72
-33
lines changed

2 files changed

+72
-33
lines changed

firebase-config/src/main/java/com/google/firebase/remoteconfig/internal/Personalization.java

Lines changed: 22 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -25,29 +25,31 @@
2525
public class Personalization {
2626
public static final String ANALYTICS_ORIGIN_PERSONALIZATION = "fp";
2727

28+
// Constants with LOG_KEY suffix are how the corresponding ones without it are identified on
29+
// Google Analytics.
2830
public static final String ANALYTICS_PULL_EVENT = "personalization_assignment";
2931
public static final String ARM_KEY = "arm_key";
3032
public static final String ARM_VALUE = "arm_value";
3133
public static final String PERSONALIZATION_ID = "personalizationId";
32-
public static final String PERSONALIZATION_ID_KEY = "personalization_id";
34+
public static final String PERSONALIZATION_ID_LOG_KEY = "personalization_id";
3335
public static final String ARM_INDEX = "armIndex";
34-
public static final String ARM_INDEX_KEY = "arm_index";
36+
public static final String ARM_INDEX_LOG_KEY = "arm_index";
3537
public static final String GROUP = "group";
3638

3739
public static final String ANALYTICS_PULL_EVENT_INTERNAL = "_fpc";
3840
public static final String CHOICE_ID = "choiceId";
39-
public static final String CHOICE_ID_KEY = "_fpid";
41+
public static final String CHOICE_ID_LOG_KEY = "_fpid";
4042

4143
/** The app's Firebase Analytics client. */
4244
private final AnalyticsConnector analyticsConnector;
4345

44-
/** A map of Remote Config parameter key to Personalization ID. */
45-
private final Map<String, String> armsCache;
46+
/** A map of Remote Config parameter key to choice ID. */
47+
private final Map<String, String> armsCache =
48+
Collections.synchronizedMap(new HashMap<String, String>());
4649

4750
/** Creates an instance of {@code Personalization}. */
4851
public Personalization(@NonNull AnalyticsConnector analyticsConnector) {
4952
this.analyticsConnector = analyticsConnector;
50-
armsCache = Collections.synchronizedMap(new HashMap<String, String>());
5153
}
5254

5355
/**
@@ -74,29 +76,29 @@ public void logArmActive(@NonNull String key, @NonNull ConfigContainer configCon
7476
return;
7577
}
7678

77-
String personalizationId = metadata.optString(PERSONALIZATION_ID);
78-
if (personalizationId.isEmpty()) {
79+
String choiceId = metadata.optString(CHOICE_ID);
80+
if (choiceId.isEmpty()) {
7981
return;
8082
}
8183

8284
synchronized (armsCache) {
83-
if (armsCache.get(key) == personalizationId) {
85+
if (choiceId.equals(armsCache.get(key))) {
8486
return;
8587
}
86-
armsCache.put(key, personalizationId);
88+
armsCache.put(key, choiceId);
8789
}
8890

89-
Bundle params = new Bundle();
90-
params.putString(ARM_KEY, key);
91-
params.putString(ARM_VALUE, values.optString(key));
92-
params.putString(PERSONALIZATION_ID_KEY, personalizationId);
93-
params.putInt(ARM_INDEX_KEY, metadata.optInt(ARM_INDEX, -1));
94-
params.putString(GROUP, metadata.optString(GROUP));
95-
analyticsConnector.logEvent(ANALYTICS_ORIGIN_PERSONALIZATION, ANALYTICS_PULL_EVENT, params);
91+
Bundle logParams = new Bundle();
92+
logParams.putString(ARM_KEY, key);
93+
logParams.putString(ARM_VALUE, values.optString(key));
94+
logParams.putString(PERSONALIZATION_ID_LOG_KEY, metadata.optString(PERSONALIZATION_ID));
95+
logParams.putInt(ARM_INDEX_LOG_KEY, metadata.optInt(ARM_INDEX, -1));
96+
logParams.putString(GROUP, metadata.optString(GROUP));
97+
analyticsConnector.logEvent(ANALYTICS_ORIGIN_PERSONALIZATION, ANALYTICS_PULL_EVENT, logParams);
9698

97-
Bundle paramsInternal = new Bundle();
98-
paramsInternal.putString(CHOICE_ID_KEY, metadata.optString(CHOICE_ID));
99+
Bundle internalLogParams = new Bundle();
100+
internalLogParams.putString(CHOICE_ID_LOG_KEY, choiceId);
99101
analyticsConnector.logEvent(
100-
ANALYTICS_ORIGIN_PERSONALIZATION, ANALYTICS_PULL_EVENT_INTERNAL, paramsInternal);
102+
ANALYTICS_ORIGIN_PERSONALIZATION, ANALYTICS_PULL_EVENT_INTERNAL, internalLogParams);
101103
}
102104
}

firebase-config/src/test/java/com/google/firebase/remoteconfig/internal/PersonalizationTest.java

Lines changed: 50 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,14 @@
1818
import static com.google.firebase.remoteconfig.internal.Personalization.ANALYTICS_ORIGIN_PERSONALIZATION;
1919
import static com.google.firebase.remoteconfig.internal.Personalization.ANALYTICS_PULL_EVENT;
2020
import static com.google.firebase.remoteconfig.internal.Personalization.ANALYTICS_PULL_EVENT_INTERNAL;
21-
import static com.google.firebase.remoteconfig.internal.Personalization.CHOICE_ID_KEY;
21+
import static com.google.firebase.remoteconfig.internal.Personalization.ARM_INDEX_LOG_KEY;
22+
import static com.google.firebase.remoteconfig.internal.Personalization.ARM_KEY;
23+
import static com.google.firebase.remoteconfig.internal.Personalization.ARM_VALUE;
24+
import static com.google.firebase.remoteconfig.internal.Personalization.CHOICE_ID_LOG_KEY;
25+
import static com.google.firebase.remoteconfig.internal.Personalization.GROUP;
26+
import static com.google.firebase.remoteconfig.internal.Personalization.PERSONALIZATION_ID_LOG_KEY;
27+
import static org.mockito.AdditionalMatchers.or;
2228
import static org.mockito.ArgumentMatchers.any;
23-
import static org.mockito.ArgumentMatchers.anyString;
2429
import static org.mockito.ArgumentMatchers.eq;
2530
import static org.mockito.Mockito.doAnswer;
2631
import static org.mockito.Mockito.times;
@@ -82,7 +87,10 @@ public void setUp() {
8287

8388
doAnswer(invocation -> FAKE_LOGS.add(invocation.getArgument(2)))
8489
.when(mockAnalyticsConnector)
85-
.logEvent(eq(ANALYTICS_ORIGIN_PERSONALIZATION), anyString(), any(Bundle.class));
90+
.logEvent(
91+
eq(ANALYTICS_ORIGIN_PERSONALIZATION),
92+
or(eq(ANALYTICS_PULL_EVENT), eq(ANALYTICS_PULL_EVENT_INTERNAL)),
93+
any(Bundle.class));
8694

8795
personalization = new Personalization(mockAnalyticsConnector);
8896

@@ -94,12 +102,15 @@ public void logArmActive_nonPersonalizationKey_notLogged() {
94102
personalization.logArmActive("key3", CONFIG_CONTAINER);
95103

96104
verify(mockAnalyticsConnector, times(0))
97-
.logEvent(eq(ANALYTICS_ORIGIN_PERSONALIZATION), anyString(), any(Bundle.class));
105+
.logEvent(
106+
eq(ANALYTICS_ORIGIN_PERSONALIZATION),
107+
or(eq(ANALYTICS_PULL_EVENT), eq(ANALYTICS_PULL_EVENT_INTERNAL)),
108+
any(Bundle.class));
98109
assertThat(FAKE_LOGS).isEmpty();
99110
}
100111

101112
@Test
102-
public void logArmActive_singlePersonalizationKey_loggedOnce() {
113+
public void logArmActive_singlePersonalizationKey_loggedInternallyAndExternally() {
103114
personalization.logArmActive("key1", CONFIG_CONTAINER);
104115

105116
verify(mockAnalyticsConnector, times(1))
@@ -112,15 +123,24 @@ public void logArmActive_singlePersonalizationKey_loggedOnce() {
112123
any(Bundle.class));
113124
assertThat(FAKE_LOGS).hasSize(2);
114125

115-
Bundle params = new Bundle();
116-
params.putString(CHOICE_ID_KEY, "id1");
117-
assertThat(FAKE_LOGS).comparingElementsUsing(TO_STRING).contains(params.toString());
126+
Bundle logParams = new Bundle();
127+
logParams.putString(ARM_KEY, "key1");
128+
logParams.putString(ARM_VALUE, "value1");
129+
logParams.putString(PERSONALIZATION_ID_LOG_KEY, "p13n1");
130+
logParams.putInt(ARM_INDEX_LOG_KEY, 0);
131+
logParams.putString(GROUP, "BASELINE");
132+
Bundle internalLogParams = new Bundle();
133+
internalLogParams.putString(CHOICE_ID_LOG_KEY, "id1");
134+
assertThat(FAKE_LOGS)
135+
.comparingElementsUsing(TO_STRING)
136+
.containsExactly(logParams.toString(), internalLogParams.toString());
118137
}
119138

120139
@Test
121140
public void logArmActive_multiplePersonalizationKeys_loggedMultiple() {
122141
personalization.logArmActive("key1", CONFIG_CONTAINER);
123142
personalization.logArmActive("key2", CONFIG_CONTAINER);
143+
personalization.logArmActive("key1", CONFIG_CONTAINER);
124144

125145
verify(mockAnalyticsConnector, times(2))
126146
.logEvent(
@@ -132,13 +152,30 @@ public void logArmActive_multiplePersonalizationKeys_loggedMultiple() {
132152
any(Bundle.class));
133153
assertThat(FAKE_LOGS).hasSize(4);
134154

135-
Bundle params1 = new Bundle();
136-
params1.putString(CHOICE_ID_KEY, "id1");
137-
Bundle params2 = new Bundle();
138-
params2.putString(CHOICE_ID_KEY, "id2");
155+
Bundle logParams1 = new Bundle();
156+
logParams1.putString(ARM_KEY, "key1");
157+
logParams1.putString(ARM_VALUE, "value1");
158+
logParams1.putString(PERSONALIZATION_ID_LOG_KEY, "p13n1");
159+
logParams1.putInt(ARM_INDEX_LOG_KEY, 0);
160+
logParams1.putString(GROUP, "BASELINE");
161+
Bundle logParams2 = new Bundle();
162+
logParams2.putString(ARM_KEY, "key2");
163+
logParams2.putString(ARM_VALUE, "value2");
164+
logParams2.putString(PERSONALIZATION_ID_LOG_KEY, "p13n2");
165+
logParams2.putInt(ARM_INDEX_LOG_KEY, 1);
166+
logParams2.putString(GROUP, "P13N");
167+
assertThat(FAKE_LOGS)
168+
.comparingElementsUsing(TO_STRING)
169+
.containsAtLeast(logParams1.toString(), logParams2.toString())
170+
.inOrder();
171+
172+
Bundle internalLogParams1 = new Bundle();
173+
internalLogParams1.putString(CHOICE_ID_LOG_KEY, "id1");
174+
Bundle internalLogParams2 = new Bundle();
175+
internalLogParams2.putString(CHOICE_ID_LOG_KEY, "id2");
139176
assertThat(FAKE_LOGS)
140177
.comparingElementsUsing(TO_STRING)
141-
.containsAtLeast(params1.toString(), params2.toString())
178+
.containsAtLeast(internalLogParams1.toString(), internalLogParams2.toString())
142179
.inOrder();
143180
}
144181
}

0 commit comments

Comments
 (0)