Skip to content

Commit 2d21ee2

Browse files
Add CMAB configuration and parsing tests with cmab datafile
1 parent ad048df commit 2d21ee2

File tree

4 files changed

+622
-2
lines changed

4 files changed

+622
-2
lines changed

core-api/src/main/java/com/optimizely/ab/config/parser/GsonHelpers.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -161,8 +161,9 @@ static Experiment parseExperiment(JsonObject experimentJson, String groupId, Jso
161161

162162
Cmab cmab = null;
163163
if (experimentJson.has("cmab")) {
164-
JsonObject cmabJson = experimentJson.getAsJsonObject("cmab");
165-
if (cmabJson != null) {
164+
JsonElement cmabElement = experimentJson.get("cmab");
165+
if (!cmabElement.isJsonNull()) {
166+
JsonObject cmabJson = cmabElement.getAsJsonObject();
166167
cmab = parseCmab(cmabJson, context);
167168
}
168169
}
Lines changed: 160 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,160 @@
1+
package com.optimizely.ab.cmab;
2+
3+
import java.util.Arrays;
4+
import java.util.Collections;
5+
import java.util.List;
6+
7+
import static org.junit.Assert.assertEquals;
8+
import static org.junit.Assert.assertNotEquals;
9+
import static org.junit.Assert.assertNotNull;
10+
import static org.junit.Assert.assertTrue;
11+
import org.junit.Test;
12+
13+
import com.optimizely.ab.config.Cmab;
14+
15+
/**
16+
* Tests for {@link Cmab} configuration object.
17+
*/
18+
public class CmabTest {
19+
20+
@Test
21+
public void testCmabConstructorWithValidData() {
22+
List<String> attributeIds = Arrays.asList("attr1", "attr2", "attr3");
23+
int trafficAllocation = 4000;
24+
25+
Cmab cmab = new Cmab(attributeIds, trafficAllocation);
26+
27+
assertEquals("AttributeIds should match", attributeIds, cmab.getAttributeIds());
28+
assertEquals("TrafficAllocation should match", trafficAllocation, cmab.getTrafficAllocation());
29+
}
30+
31+
@Test
32+
public void testCmabConstructorWithEmptyAttributeIds() {
33+
List<String> attributeIds = Collections.emptyList();
34+
int trafficAllocation = 2000;
35+
36+
Cmab cmab = new Cmab(attributeIds, trafficAllocation);
37+
38+
assertEquals("AttributeIds should be empty", attributeIds, cmab.getAttributeIds());
39+
assertTrue("AttributeIds should be empty list", cmab.getAttributeIds().isEmpty());
40+
assertEquals("TrafficAllocation should match", trafficAllocation, cmab.getTrafficAllocation());
41+
}
42+
43+
@Test
44+
public void testCmabConstructorWithSingleAttributeId() {
45+
List<String> attributeIds = Collections.singletonList("single_attr");
46+
int trafficAllocation = 3000;
47+
48+
Cmab cmab = new Cmab(attributeIds, trafficAllocation);
49+
50+
assertEquals("AttributeIds should match", attributeIds, cmab.getAttributeIds());
51+
assertEquals("Should have one attribute", 1, cmab.getAttributeIds().size());
52+
assertEquals("Single attribute should match", "single_attr", cmab.getAttributeIds().get(0));
53+
assertEquals("TrafficAllocation should match", trafficAllocation, cmab.getTrafficAllocation());
54+
}
55+
56+
@Test
57+
public void testCmabConstructorWithZeroTrafficAllocation() {
58+
List<String> attributeIds = Arrays.asList("attr1", "attr2");
59+
int trafficAllocation = 0;
60+
61+
Cmab cmab = new Cmab(attributeIds, trafficAllocation);
62+
63+
assertEquals("AttributeIds should match", attributeIds, cmab.getAttributeIds());
64+
assertEquals("TrafficAllocation should be zero", 0, cmab.getTrafficAllocation());
65+
}
66+
67+
@Test
68+
public void testCmabConstructorWithMaxTrafficAllocation() {
69+
List<String> attributeIds = Arrays.asList("attr1");
70+
int trafficAllocation = 10000;
71+
72+
Cmab cmab = new Cmab(attributeIds, trafficAllocation);
73+
74+
assertEquals("AttributeIds should match", attributeIds, cmab.getAttributeIds());
75+
assertEquals("TrafficAllocation should be 10000", 10000, cmab.getTrafficAllocation());
76+
}
77+
78+
@Test
79+
public void testCmabEqualsAndHashCode() {
80+
List<String> attributeIds1 = Arrays.asList("attr1", "attr2");
81+
List<String> attributeIds2 = Arrays.asList("attr1", "attr2");
82+
List<String> attributeIds3 = Arrays.asList("attr1", "attr3");
83+
84+
Cmab cmab1 = new Cmab(attributeIds1, 4000);
85+
Cmab cmab2 = new Cmab(attributeIds2, 4000);
86+
Cmab cmab3 = new Cmab(attributeIds3, 4000);
87+
Cmab cmab4 = new Cmab(attributeIds1, 5000);
88+
89+
// Test equals
90+
assertEquals("CMAB with same data should be equal", cmab1, cmab2);
91+
assertNotEquals("CMAB with different attributeIds should not be equal", cmab1, cmab3);
92+
assertNotEquals("CMAB with different trafficAllocation should not be equal", cmab1, cmab4);
93+
94+
// Test reflexivity
95+
assertEquals("CMAB should equal itself", cmab1, cmab1);
96+
97+
// Test null comparison
98+
assertNotEquals("CMAB should not equal null", cmab1, null);
99+
100+
// Test hashCode consistency
101+
assertEquals("Equal objects should have same hashCode", cmab1.hashCode(), cmab2.hashCode());
102+
}
103+
104+
@Test
105+
public void testCmabToString() {
106+
List<String> attributeIds = Arrays.asList("attr1", "attr2");
107+
int trafficAllocation = 4000;
108+
109+
Cmab cmab = new Cmab(attributeIds, trafficAllocation);
110+
String result = cmab.toString();
111+
112+
assertNotNull("toString should not return null", result);
113+
assertTrue("toString should contain attributeIds", result.contains("attributeIds"));
114+
assertTrue("toString should contain trafficAllocation", result.contains("trafficAllocation"));
115+
assertTrue("toString should contain attr1", result.contains("attr1"));
116+
assertTrue("toString should contain attr2", result.contains("attr2"));
117+
assertTrue("toString should contain 4000", result.contains("4000"));
118+
}
119+
120+
@Test
121+
public void testCmabToStringWithEmptyAttributeIds() {
122+
List<String> attributeIds = Collections.emptyList();
123+
int trafficAllocation = 2000;
124+
125+
Cmab cmab = new Cmab(attributeIds, trafficAllocation);
126+
String result = cmab.toString();
127+
128+
assertNotNull("toString should not return null", result);
129+
assertTrue("toString should contain attributeIds", result.contains("attributeIds"));
130+
assertTrue("toString should contain trafficAllocation", result.contains("trafficAllocation"));
131+
assertTrue("toString should contain 2000", result.contains("2000"));
132+
}
133+
134+
@Test
135+
public void testCmabWithDuplicateAttributeIds() {
136+
List<String> attributeIds = Arrays.asList("attr1", "attr2", "attr1", "attr3");
137+
int trafficAllocation = 4000;
138+
139+
Cmab cmab = new Cmab(attributeIds, trafficAllocation);
140+
141+
assertEquals("AttributeIds should match exactly (including duplicates)",
142+
attributeIds, cmab.getAttributeIds());
143+
assertEquals("Should have 4 elements (including duplicate)", 4, cmab.getAttributeIds().size());
144+
}
145+
146+
@Test
147+
public void testCmabWithRealWorldAttributeIds() {
148+
// Test with realistic attribute IDs from Optimizely
149+
List<String> attributeIds = Arrays.asList("808797688", "808797689", "10401066117");
150+
int trafficAllocation = 4000;
151+
152+
Cmab cmab = new Cmab(attributeIds, trafficAllocation);
153+
154+
assertEquals("AttributeIds should match", attributeIds, cmab.getAttributeIds());
155+
assertEquals("TrafficAllocation should match", trafficAllocation, cmab.getTrafficAllocation());
156+
assertTrue("Should contain first attribute ID", cmab.getAttributeIds().contains("808797688"));
157+
assertTrue("Should contain second attribute ID", cmab.getAttributeIds().contains("808797689"));
158+
assertTrue("Should contain third attribute ID", cmab.getAttributeIds().contains("10401066117"));
159+
}
160+
}

0 commit comments

Comments
 (0)