Skip to content

Commit a4419a4

Browse files
update: add cmabUUID parameter to impression event methods and related classes
1 parent 9a12d72 commit a4419a4

File tree

5 files changed

+165
-29
lines changed

5 files changed

+165
-29
lines changed

core-api/src/main/java/com/optimizely/ab/Optimizely.java

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -311,7 +311,7 @@ private void sendImpression(@Nonnull ProjectConfig projectConfig,
311311
@Nonnull Map<String, ?> filteredAttributes,
312312
@Nonnull Variation variation,
313313
@Nonnull String ruleType) {
314-
sendImpression(projectConfig, experiment, userId, filteredAttributes, variation, "", ruleType, true);
314+
sendImpression(projectConfig, experiment, userId, filteredAttributes, variation, "", ruleType, true, null);
315315
}
316316

317317
/**
@@ -324,6 +324,7 @@ private void sendImpression(@Nonnull ProjectConfig projectConfig,
324324
* @param variation the variation that was returned from activate.
325325
* @param flagKey It can either be empty if ruleType is experiment or it's feature key in case ruleType is feature-test or rollout
326326
* @param ruleType It can either be experiment in case impression event is sent from activate or it's feature-test or rollout
327+
* @param cmabUUID The cmabUUID if the experiment is a cmab experiment.
327328
*/
328329
private boolean sendImpression(@Nonnull ProjectConfig projectConfig,
329330
@Nullable ExperimentCore experiment,
@@ -332,7 +333,8 @@ private boolean sendImpression(@Nonnull ProjectConfig projectConfig,
332333
@Nullable Variation variation,
333334
@Nonnull String flagKey,
334335
@Nonnull String ruleType,
335-
@Nonnull boolean enabled) {
336+
@Nonnull boolean enabled,
337+
@Nullable String cmabUUID) {
336338

337339
UserEvent userEvent = UserEventFactory.createImpressionEvent(
338340
projectConfig,
@@ -342,7 +344,8 @@ private boolean sendImpression(@Nonnull ProjectConfig projectConfig,
342344
filteredAttributes,
343345
flagKey,
344346
ruleType,
345-
enabled);
347+
enabled,
348+
cmabUUID);
346349

347350
if (userEvent == null) {
348351
return false;
@@ -504,7 +507,7 @@ private Boolean isFeatureEnabled(@Nonnull ProjectConfig projectConfig,
504507
if (featureDecision.decisionSource != null) {
505508
decisionSource = featureDecision.decisionSource;
506509
}
507-
510+
String cmabUUID = featureDecision.cmabUUID;
508511
if (featureDecision.variation != null) {
509512
// This information is only necessary for feature tests.
510513
// For rollouts experiments and variations are an implementation detail only.
@@ -526,7 +529,8 @@ private Boolean isFeatureEnabled(@Nonnull ProjectConfig projectConfig,
526529
featureDecision.variation,
527530
featureKey,
528531
decisionSource.toString(),
529-
featureEnabled);
532+
featureEnabled,
533+
cmabUUID);
530534

531535
DecisionNotification decisionNotification = DecisionNotification.newFeatureDecisionNotificationBuilder()
532536
.withUserId(userId)
@@ -1355,6 +1359,8 @@ private OptimizelyDecision createOptimizelyDecision(
13551359
Map<String, Object> attributes = user.getAttributes();
13561360
Map<String, ?> copiedAttributes = new HashMap<>(attributes);
13571361

1362+
String cmabUUID = flagDecision.cmabUUID;
1363+
13581364
if (!allOptions.contains(OptimizelyDecideOption.DISABLE_DECISION_EVENT)) {
13591365
decisionEventDispatched = sendImpression(
13601366
projectConfig,
@@ -1364,7 +1370,8 @@ private OptimizelyDecision createOptimizelyDecision(
13641370
flagDecision.variation,
13651371
flagKey,
13661372
decisionSource.toString(),
1367-
flagEnabled);
1373+
flagEnabled,
1374+
cmabUUID);
13681375
}
13691376

13701377
DecisionNotification decisionNotification = DecisionNotification.newFlagDecisionNotificationBuilder()

core-api/src/main/java/com/optimizely/ab/event/internal/UserEventFactory.java

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,8 @@ public static ImpressionEvent createImpressionEvent(@Nonnull ProjectConfig proje
4141
@Nonnull Map<String, ?> attributes,
4242
@Nonnull String flagKey,
4343
@Nonnull String ruleType,
44-
@Nonnull boolean enabled) {
44+
@Nonnull boolean enabled,
45+
@Nullable String cmabUUID) {
4546

4647
if ((FeatureDecision.DecisionSource.ROLLOUT.toString().equals(ruleType) || variation == null) && !projectConfig.getSendFlagDecisions())
4748
{
@@ -68,13 +69,18 @@ public static ImpressionEvent createImpressionEvent(@Nonnull ProjectConfig proje
6869
.withProjectConfig(projectConfig)
6970
.build();
7071

71-
DecisionMetadata metadata = new DecisionMetadata.Builder()
72+
DecisionMetadata.Builder metadataBuilder = new DecisionMetadata.Builder()
7273
.setFlagKey(flagKey)
7374
.setRuleKey(experimentKey)
7475
.setRuleType(ruleType)
7576
.setVariationKey(variationKey)
76-
.setEnabled(enabled)
77-
.build();
77+
.setEnabled(enabled);
78+
79+
if (cmabUUID != null) {
80+
metadataBuilder.setCmabUUID(cmabUUID);
81+
}
82+
83+
DecisionMetadata metadata = metadataBuilder.build();
7884

7985
return new ImpressionEvent.Builder()
8086
.withUserContext(userContext)

core-api/src/main/java/com/optimizely/ab/event/internal/payload/DecisionMetadata.java

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,11 @@
1616
*/
1717
package com.optimizely.ab.event.internal.payload;
1818

19+
import java.util.StringJoiner;
20+
1921
import com.fasterxml.jackson.annotation.JsonProperty;
2022
import com.optimizely.ab.annotations.VisibleForTesting;
2123

22-
import java.util.StringJoiner;
23-
2424
public class DecisionMetadata {
2525

2626
@JsonProperty("flag_key")
@@ -33,17 +33,20 @@ public class DecisionMetadata {
3333
String variationKey;
3434
@JsonProperty("enabled")
3535
boolean enabled;
36+
@JsonProperty("cmab_uuid")
37+
String cmabUUID;
3638

3739
@VisibleForTesting
3840
public DecisionMetadata() {
3941
}
4042

41-
public DecisionMetadata(String flagKey, String ruleKey, String ruleType, String variationKey, boolean enabled) {
43+
public DecisionMetadata(String flagKey, String ruleKey, String ruleType, String variationKey, boolean enabled, String cmabUUID) {
4244
this.flagKey = flagKey;
4345
this.ruleKey = ruleKey;
4446
this.ruleType = ruleType;
4547
this.variationKey = variationKey;
4648
this.enabled = enabled;
49+
this.cmabUUID = cmabUUID;
4750
}
4851

4952
public String getRuleType() {
@@ -66,6 +69,10 @@ public String getVariationKey() {
6669
return variationKey;
6770
}
6871

72+
public String getCmabUUID() {
73+
return cmabUUID;
74+
}
75+
6976
@Override
7077
public boolean equals(Object o) {
7178
if (this == o) return true;
@@ -77,6 +84,7 @@ public boolean equals(Object o) {
7784
if (!ruleKey.equals(that.ruleKey)) return false;
7885
if (!flagKey.equals(that.flagKey)) return false;
7986
if (enabled != that.enabled) return false;
87+
if (!java.util.Objects.equals(cmabUUID, that.cmabUUID)) return false;
8088
return variationKey.equals(that.variationKey);
8189
}
8290

@@ -86,6 +94,7 @@ public int hashCode() {
8694
result = 31 * result + flagKey.hashCode();
8795
result = 31 * result + ruleKey.hashCode();
8896
result = 31 * result + variationKey.hashCode();
97+
result = 31 * result + (cmabUUID != null ? cmabUUID.hashCode() : 0);
8998
return result;
9099
}
91100

@@ -97,6 +106,7 @@ public String toString() {
97106
.add("ruleType='" + ruleType + "'")
98107
.add("variationKey='" + variationKey + "'")
99108
.add("enabled=" + enabled)
109+
.add("cmabUUID='" + cmabUUID + "'")
100110
.toString();
101111
}
102112

@@ -108,6 +118,7 @@ public static class Builder {
108118
private String flagKey;
109119
private String variationKey;
110120
private boolean enabled;
121+
private String cmabUUID;
111122

112123
public Builder setEnabled(boolean enabled) {
113124
this.enabled = enabled;
@@ -134,8 +145,13 @@ public Builder setVariationKey(String variationKey) {
134145
return this;
135146
}
136147

148+
public Builder setCmabUUID(String cmabUUID){
149+
this.cmabUUID = cmabUUID;
150+
return this;
151+
}
152+
137153
public DecisionMetadata build() {
138-
return new DecisionMetadata(flagKey, ruleKey, ruleType, variationKey, enabled);
154+
return new DecisionMetadata(flagKey, ruleKey, ruleType, variationKey, enabled, cmabUUID);
139155
}
140156
}
141157
}

core-api/src/test/java/com/optimizely/ab/event/internal/EventFactoryTest.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,7 @@ public void createImpressionEventPassingUserAgentAttribute() throws Exception {
104104
Map<String, String> attributeMap = new HashMap<String, String>();
105105
attributeMap.put(attribute.getKey(), "value");
106106
attributeMap.put(ControlAttribute.USER_AGENT_ATTRIBUTE.toString(), "Chrome");
107-
DecisionMetadata metadata = new DecisionMetadata(activatedExperiment.getKey(), activatedExperiment.getKey(), ruleType, "variationKey", true);
107+
DecisionMetadata metadata = new DecisionMetadata(activatedExperiment.getKey(), activatedExperiment.getKey(), ruleType, "variationKey", true, null);
108108
Decision expectedDecision = new Decision.Builder()
109109
.setCampaignId(activatedExperiment.getLayerId())
110110
.setExperimentId(activatedExperiment.getId())
@@ -1064,7 +1064,8 @@ public static LogEvent createImpressionEvent(ProjectConfig projectConfig,
10641064
attributes,
10651065
activatedExperiment.getKey(),
10661066
"experiment",
1067-
true);
1067+
true,
1068+
null);
10681069

10691070
return EventFactory.createLogEvent(userEvent);
10701071

core-api/src/test/java/com/optimizely/ab/event/internal/UserEventFactoryTest.java

Lines changed: 119 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -16,22 +16,28 @@
1616
*/
1717
package com.optimizely.ab.event.internal;
1818

19-
import com.google.common.collect.ImmutableMap;
20-
import com.optimizely.ab.config.Experiment;
21-
import com.optimizely.ab.config.ProjectConfig;
22-
import com.optimizely.ab.config.Variation;
23-
import com.optimizely.ab.event.internal.payload.DecisionMetadata;
24-
import com.optimizely.ab.internal.ReservedEventKey;
19+
import java.util.Collections;
20+
import java.util.Map;
21+
22+
import static org.junit.Assert.assertEquals;
23+
import static org.junit.Assert.assertNotNull;
24+
import static org.junit.Assert.assertNull;
25+
import static org.junit.Assert.assertSame;
26+
import static org.junit.Assert.assertTrue;
2527
import org.junit.Before;
2628
import org.junit.Test;
2729
import org.junit.runner.RunWith;
2830
import org.mockito.Mock;
31+
import static org.mockito.Mockito.mock;
32+
import static org.mockito.Mockito.when;
2933
import org.mockito.runners.MockitoJUnitRunner;
3034

31-
import java.util.Collections;
32-
import java.util.Map;
33-
34-
import static org.junit.Assert.*;
35+
import com.google.common.collect.ImmutableMap;
36+
import com.optimizely.ab.config.Experiment;
37+
import com.optimizely.ab.config.ProjectConfig;
38+
import com.optimizely.ab.config.Variation;
39+
import com.optimizely.ab.event.internal.payload.DecisionMetadata;
40+
import com.optimizely.ab.internal.ReservedEventKey;
3541

3642

3743
@RunWith(MockitoJUnitRunner.class)
@@ -67,7 +73,7 @@ public class UserEventFactoryTest {
6773
public void setUp() {
6874
experiment = new Experiment(EXPERIMENT_ID, EXPERIMENT_KEY, LAYER_ID);
6975
variation = new Variation(VARIATION_ID, VARIATION_KEY);
70-
decisionMetadata = new DecisionMetadata("", EXPERIMENT_KEY, "experiment", VARIATION_KEY, true);
76+
decisionMetadata = new DecisionMetadata("", EXPERIMENT_KEY, "experiment", VARIATION_KEY, true, null);
7177
}
7278

7379
@Test
@@ -81,7 +87,8 @@ public void createImpressionEventNull() {
8187
ATTRIBUTES,
8288
EXPERIMENT_KEY,
8389
"rollout",
84-
false
90+
false,
91+
null
8592
);
8693
assertNull(actual);
8794
}
@@ -96,7 +103,8 @@ public void createImpressionEvent() {
96103
ATTRIBUTES,
97104
"",
98105
"experiment",
99-
true
106+
true,
107+
null
100108
);
101109

102110
assertTrue(actual.getTimestamp() > 0);
@@ -140,4 +148,102 @@ public void createConversionEvent() {
140148
assertEquals(VALUE, actual.getValue());
141149
assertEquals(TAGS, actual.getTags());
142150
}
151+
@Test
152+
public void createImpressionEventWithCmabUuid() {
153+
// Arrange
154+
String userId = "testUser";
155+
String flagKey = "testFlag";
156+
String ruleType = "experiment";
157+
boolean enabled = true;
158+
String cmabUUID = "test-cmab-uuid-123";
159+
Map<String, Object> attributes = Collections.emptyMap();
160+
161+
// Create mock objects
162+
ProjectConfig mockProjectConfig = mock(ProjectConfig.class);
163+
Experiment mockExperiment = mock(Experiment.class);
164+
Variation mockVariation = mock(Variation.class);
165+
166+
// Setup mock behavior
167+
when(mockProjectConfig.getSendFlagDecisions()).thenReturn(true);
168+
when(mockExperiment.getLayerId()).thenReturn("layer123");
169+
when(mockExperiment.getId()).thenReturn("experiment123");
170+
when(mockExperiment.getKey()).thenReturn("experimentKey");
171+
when(mockVariation.getKey()).thenReturn("variationKey");
172+
when(mockVariation.getId()).thenReturn("variation123");
173+
174+
// Act
175+
ImpressionEvent result = UserEventFactory.createImpressionEvent(
176+
mockProjectConfig,
177+
mockExperiment,
178+
mockVariation,
179+
userId,
180+
attributes,
181+
flagKey,
182+
ruleType,
183+
enabled,
184+
cmabUUID
185+
);
186+
187+
// Assert
188+
assertNotNull(result);
189+
190+
// Verify DecisionMetadata contains cmabUUID
191+
DecisionMetadata metadata = result.getMetadata();
192+
assertNotNull(metadata);
193+
assertEquals(cmabUUID, metadata.getCmabUUID());
194+
assertEquals(flagKey, metadata.getFlagKey());
195+
assertEquals("experimentKey", metadata.getRuleKey());
196+
assertEquals(ruleType, metadata.getRuleType());
197+
assertEquals("variationKey", metadata.getVariationKey());
198+
assertEquals(enabled, metadata.getEnabled());
199+
200+
// Verify other fields
201+
assertEquals("layer123", result.getLayerId());
202+
assertEquals("experiment123", result.getExperimentId());
203+
assertEquals("experimentKey", result.getExperimentKey());
204+
assertEquals("variation123", result.getVariationId());
205+
assertEquals("variationKey", result.getVariationKey());
206+
}
207+
208+
@Test
209+
public void createImpressionEventWithNullCmabUuid() {
210+
// Arrange
211+
String userId = "testUser";
212+
String flagKey = "testFlag";
213+
String ruleType = "experiment";
214+
boolean enabled = true;
215+
String cmabUUID = null;
216+
Map<String, Object> attributes = Collections.emptyMap();
217+
218+
// Create mock objects (same setup as above)
219+
ProjectConfig mockProjectConfig = mock(ProjectConfig.class);
220+
Experiment mockExperiment = mock(Experiment.class);
221+
Variation mockVariation = mock(Variation.class);
222+
223+
when(mockProjectConfig.getSendFlagDecisions()).thenReturn(true);
224+
when(mockExperiment.getLayerId()).thenReturn("layer123");
225+
when(mockExperiment.getId()).thenReturn("experiment123");
226+
when(mockExperiment.getKey()).thenReturn("experimentKey");
227+
when(mockVariation.getKey()).thenReturn("variationKey");
228+
when(mockVariation.getId()).thenReturn("variation123");
229+
230+
// Act
231+
ImpressionEvent result = UserEventFactory.createImpressionEvent(
232+
mockProjectConfig,
233+
mockExperiment,
234+
mockVariation,
235+
userId,
236+
attributes,
237+
flagKey,
238+
ruleType,
239+
enabled,
240+
cmabUUID
241+
);
242+
243+
// Assert
244+
assertNotNull(result);
245+
DecisionMetadata metadata = result.getMetadata();
246+
assertNotNull(metadata);
247+
assertNull(metadata.getCmabUUID());
248+
}
143249
}

0 commit comments

Comments
 (0)