Skip to content

Commit d85c839

Browse files
authored
[FSSDK-11136] add cmab support (#514)
1 parent 2f81f7e commit d85c839

File tree

19 files changed

+1978
-38
lines changed

19 files changed

+1978
-38
lines changed

android-sdk/src/androidTest/java/com/optimizely/ab/android/sdk/ODPIntegrationUpdateConfigTest.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,7 @@ public void setup() throws Exception {
117117
notificationCenter,
118118
null,
119119
odpManager,
120+
null,
120121
"test-vuid",
121122
null,
122123
null);

android-sdk/src/androidTest/java/com/optimizely/ab/android/sdk/OptimizelyClientTest.java

Lines changed: 15 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
import com.optimizely.ab.OptimizelyUserContext;
2727
import com.optimizely.ab.android.event_handler.DefaultEventHandler;
2828
import com.optimizely.ab.bucketing.Bucketer;
29+
import com.optimizely.ab.bucketing.DecisionPath;
2930
import com.optimizely.ab.bucketing.DecisionService;
3031
import com.optimizely.ab.config.Experiment;
3132
import com.optimizely.ab.config.ProjectConfig;
@@ -132,20 +133,23 @@ public OptimizelyClientTest(int datafileVersion,String datafile){
132133

133134
// set to return DecisionResponse with null variation by default (instead of null DecisionResponse)
134135
when(bucketer.bucket(any(), any(), any())).thenReturn(DecisionResponse.nullNoReasons());
136+
when(bucketer.bucket(any(), any(), any(), any())).thenReturn(DecisionResponse.nullNoReasons());
135137

136138
if(datafileVersion==3) {
137139
Variation variation = optimizely.getProjectConfig().getExperiments().get(0).getVariations().get(0);
138140
when(bucketer.bucket(
139-
optimizely.getProjectConfig().getExperiments().get(0),
140-
GENERIC_USER_ID,
141-
optimizely.getProjectConfig())
141+
eq(optimizely.getProjectConfig().getExperiments().get(0)),
142+
eq(GENERIC_USER_ID),
143+
any(ProjectConfig.class),
144+
any())
142145
).thenReturn(DecisionResponse.responseNoReasons(variation));
143146
} else {
144147
Variation variation = optimizely.getProjectConfig().getExperimentKeyMapping().get(FEATURE_MULTI_VARIATE_EXPERIMENT_KEY).getVariations().get(1);
145148
when(bucketer.bucket(
146-
optimizely.getProjectConfig().getExperimentKeyMapping().get(FEATURE_MULTI_VARIATE_EXPERIMENT_KEY),
147-
GENERIC_USER_ID,
148-
optimizely.getProjectConfig())
149+
eq(optimizely.getProjectConfig().getExperimentKeyMapping().get(FEATURE_MULTI_VARIATE_EXPERIMENT_KEY)),
150+
eq(GENERIC_USER_ID),
151+
any(ProjectConfig.class),
152+
any())
149153
).thenReturn(DecisionResponse.responseNoReasons(variation));
150154
}
151155
spyOnConfig();
@@ -385,7 +389,7 @@ public void testGoodActivationBucketingId() {
385389
Experiment experiment = optimizelyClient.getProjectConfig().getExperimentKeyMapping().get(FEATURE_ANDROID_EXPERIMENT_KEY);
386390
attributes.put(BUCKETING_ATTRIBUTE, bucketingId);
387391
Variation v = optimizelyClient.activate(FEATURE_ANDROID_EXPERIMENT_KEY, GENERIC_USER_ID, attributes);
388-
verify(bucketer).bucket(experiment, bucketingId, optimizely.getProjectConfig());
392+
verify(bucketer).bucket(eq(experiment), eq(bucketingId), eq(optimizely.getProjectConfig()), any());
389393
}
390394

391395
@Test
@@ -910,7 +914,7 @@ public void testGoodGetVariationBucketingId() {
910914
Map<String, String> attributes = new HashMap<>();
911915
attributes.put(BUCKETING_ATTRIBUTE, bucketingId);
912916
Variation v = optimizelyClient.getVariation("android_experiment_key", "userId", attributes);
913-
verify(bucketer).bucket(experiment, bucketingId, optimizely.getProjectConfig());
917+
verify(bucketer).bucket(eq(experiment), eq(bucketingId), eq(optimizely.getProjectConfig()), any());
914918
}
915919

916920
@Test
@@ -2249,7 +2253,9 @@ public void testDecide() {
22492253
assertEquals(decision.getVariables().toMap(), variablesExpected.toMap());
22502254
assertEquals(decision.getRuleKey(), FEATURE_MULTI_VARIATE_EXPERIMENT_KEY);
22512255
assertEquals(decision.getFlagKey(), flagKey);
2252-
assertEquals(decision.getUserContext(), userContext);
2256+
OptimizelyUserContext decisionUserContext = decision.getUserContext();
2257+
assertEquals(decisionUserContext.getUserId(), userContext.getUserId());
2258+
assertEquals(decisionUserContext.getAttributes(), userContext.getAttributes());
22532259
assertTrue(decision.getReasons().isEmpty());
22542260
}
22552261

android-sdk/src/androidTest/java/com/optimizely/ab/android/sdk/OptimizelyManagerTest.java

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -163,7 +163,7 @@ public void initializeSyncWithEnvironment() {
163163
EventHandler eventHandler = mock(DefaultEventHandler.class);
164164
EventProcessor eventProcessor = mock(EventProcessor.class);
165165
OptimizelyManager optimizelyManager = new OptimizelyManager(testProjectId, testSdkKey, null, logger, 3600L, datafileHandler, null, 3600L,
166-
eventHandler, eventProcessor, null, null, null, null, null, null, null);
166+
eventHandler, eventProcessor, null, null, null, null, null, null, null, null);
167167
/*
168168
* Scenario#1: when datafile is not Empty
169169
* Scenario#2: when datafile is Empty
@@ -222,7 +222,7 @@ public void initializeAsyncWithEnvironment() {
222222
EventHandler eventHandler = mock(DefaultEventHandler.class);
223223
EventProcessor eventProcessor = mock(EventProcessor.class);
224224
final OptimizelyManager optimizelyManager = new OptimizelyManager(testProjectId, testSdkKey, null, logger, 3600L, datafileHandler, null, 3600L,
225-
eventHandler, eventProcessor, null, null, null, null, null, null, null);
225+
eventHandler, eventProcessor, null, null, null, null, null, null, null, null);
226226

227227
/*
228228
* Scenario#1: when datafile is not Empty
@@ -494,7 +494,7 @@ public void initializeSyncWithUpdateOnNewDatafileDisabled() {
494494
Context context = InstrumentationRegistry.getInstrumentation().getTargetContext();
495495

496496
OptimizelyManager manager = new OptimizelyManager(testProjectId, testSdkKey, null, logger, pollingInterval, datafileHandler, null, 0,
497-
null, null, null, null, null, null, null, null, null);
497+
null, null, null, null, null, null, null, null, null, null);
498498

499499
ArgumentCaptor<Context> contextCaptor = ArgumentCaptor.forClass(Context.class);
500500
ArgumentCaptor<DatafileConfig> configCaptor = ArgumentCaptor.forClass(DatafileConfig.class);
@@ -533,7 +533,7 @@ public void initializeSyncWithUpdateOnNewDatafileEnabled() {
533533
Context context = InstrumentationRegistry.getInstrumentation().getTargetContext();
534534

535535
OptimizelyManager manager = new OptimizelyManager(testProjectId, testSdkKey, null, logger, pollingInterval, datafileHandler, null, 0,
536-
null, null, null, null, null, null, null, null, null);
536+
null, null, null, null, null, null, null, null, null, null);
537537

538538
ArgumentCaptor<Context> contextCaptor = ArgumentCaptor.forClass(Context.class);
539539
ArgumentCaptor<DatafileConfig> configCaptor = ArgumentCaptor.forClass(DatafileConfig.class);
@@ -572,7 +572,7 @@ public void initializeSyncWithDownloadToCacheDisabled() {
572572
Context context = InstrumentationRegistry.getInstrumentation().getTargetContext();
573573

574574
OptimizelyManager manager = new OptimizelyManager(testProjectId, testSdkKey, null, logger, pollingInterval, datafileHandler, null, 0,
575-
null, null, null, null, null, null, null, null, null);
575+
null, null, null, null, null, null, null, null, null, null);
576576

577577
ArgumentCaptor<Context> contextCaptor = ArgumentCaptor.forClass(Context.class);
578578
ArgumentCaptor<DatafileConfig> configCaptor = ArgumentCaptor.forClass(DatafileConfig.class);
@@ -611,7 +611,7 @@ public void initializeSyncWithUpdateOnNewDatafileDisabledWithPeriodicPollingEnab
611611
Context context = InstrumentationRegistry.getInstrumentation().getTargetContext();
612612

613613
OptimizelyManager manager = new OptimizelyManager(testProjectId, testSdkKey, null, logger, pollingInterval, datafileHandler, null, 0,
614-
null, null, null, null, null, null, null, null, null);
614+
null, null, null, null, null, null, null, null, null, null);
615615

616616
ArgumentCaptor<Context> contextCaptor = ArgumentCaptor.forClass(Context.class);
617617
ArgumentCaptor<DatafileConfig> configCaptor = ArgumentCaptor.forClass(DatafileConfig.class);
@@ -651,7 +651,7 @@ public void initializeSyncWithUpdateOnNewDatafileEnabledWithPeriodicPollingEnabl
651651
Context context = InstrumentationRegistry.getInstrumentation().getTargetContext();
652652

653653
OptimizelyManager manager = new OptimizelyManager(testProjectId, testSdkKey, null, logger, pollingInterval, datafileHandler, null, 0,
654-
null, null, null, null, null, null, null, null, null);
654+
null, null, null, null, null, null, null, null, null, null);
655655

656656
ArgumentCaptor<Context> contextCaptor = ArgumentCaptor.forClass(Context.class);
657657
ArgumentCaptor<DatafileConfig> configCaptor = ArgumentCaptor.forClass(DatafileConfig.class);
@@ -690,7 +690,7 @@ public void initializeSyncWithUpdateOnNewDatafileDisabledWithPeriodicPollingDisa
690690
Context context = InstrumentationRegistry.getInstrumentation().getTargetContext();
691691

692692
OptimizelyManager manager = new OptimizelyManager(testProjectId, testSdkKey, null, logger, pollingInterval, datafileHandler, null, 0,
693-
null, null, null, null, null, null, null, null, null);
693+
null, null, null, null, null, null, null, null, null, null);
694694

695695
ArgumentCaptor<Context> contextCaptor = ArgumentCaptor.forClass(Context.class);
696696
ArgumentCaptor<DatafileConfig> configCaptor = ArgumentCaptor.forClass(DatafileConfig.class);
@@ -706,7 +706,7 @@ public void initializeSyncWithUpdateOnNewDatafileDisabledWithPeriodicPollingDisa
706706

707707
return datafileHandler;
708708
}).when(manager.getDatafileHandler()).downloadDatafile(contextCaptor.capture(), configCaptor.capture(), listenerCaptor.capture());
709-
709+
710710
OptimizelyClient client = manager.initialize(context, defaultDatafile, downloadToCache, updateConfigOnNewDatafile);
711711

712712
try {
@@ -730,7 +730,7 @@ public void initializeSyncWithUpdateOnNewDatafileEnabledWithPeriodicPollingDisab
730730
Context context = InstrumentationRegistry.getInstrumentation().getTargetContext();
731731

732732
OptimizelyManager manager = new OptimizelyManager(testProjectId, testSdkKey, null, logger, pollingInterval, datafileHandler, null, 0,
733-
null, null, null, null, null, null, null, null, null);
733+
null, null, null, null, null, null, null, null, null, null);
734734

735735
ArgumentCaptor<Context> contextCaptor = ArgumentCaptor.forClass(Context.class);
736736
ArgumentCaptor<DatafileConfig> configCaptor = ArgumentCaptor.forClass(DatafileConfig.class);
@@ -769,7 +769,7 @@ public void initializeSyncWithResourceDatafileNoCache() {
769769
Context context = InstrumentationRegistry.getInstrumentation().getTargetContext();
770770

771771
OptimizelyManager manager = spy(new OptimizelyManager(testProjectId, testSdkKey, null, logger, pollingInterval, datafileHandler, null, 0,
772-
null, null, null, null, null, null, null, null, null));
772+
null, null, null, null, null, null, null, null, null, null));
773773

774774
datafileHandler.removeSavedDatafile(context, manager.getDatafileConfig());
775775
OptimizelyClient client = manager.initialize(context, R.raw.datafile, downloadToCache, updateConfigOnNewDatafile);
@@ -786,7 +786,7 @@ public void initializeSyncWithResourceDatafileNoCacheWithDefaultParams() {
786786
Context context = InstrumentationRegistry.getInstrumentation().getTargetContext();
787787

788788
OptimizelyManager manager = spy(new OptimizelyManager(testProjectId, testSdkKey, null, logger, pollingInterval, datafileHandler, null, 0,
789-
null, null, null, null, null, null, null, null, null));
789+
null, null, null, null, null, null, null, null, null, null));
790790

791791
datafileHandler.removeSavedDatafile(context, manager.getDatafileConfig());
792792
OptimizelyClient client = manager.initialize(context, R.raw.datafile);

android-sdk/src/main/java/com/optimizely/ab/android/sdk/OptimizelyClient.java

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -816,28 +816,33 @@ public OptimizelyConfig getOptimizelyConfig() {
816816
* @return An OptimizelyUserContext associated with this OptimizelyClient.
817817
*/
818818
@Nullable
819-
public OptimizelyUserContext createUserContext(@NonNull String userId,
820-
@NonNull Map<String, Object> attributes) {
821-
if (optimizely != null) {
822-
return optimizely.createUserContext(userId, attributes);
823-
} else {
819+
public OptimizelyUserContextAndroid createUserContext(@NonNull String userId,
820+
@NonNull Map<String, Object> attributes) {
821+
if (optimizely == null) {
824822
logger.warn("Optimizely is not initialized, could not create a user context");
825823
return null;
826824
}
825+
826+
if (userId == null) {
827+
logger.warn("The userId parameter must be nonnull.");
828+
return null;
829+
}
830+
831+
return new OptimizelyUserContextAndroid(optimizely, userId, attributes);
827832
}
828833

829834
@Nullable
830-
public OptimizelyUserContext createUserContext(@NonNull String userId) {
835+
public OptimizelyUserContextAndroid createUserContext(@NonNull String userId) {
831836
return createUserContext(userId, Collections.emptyMap());
832837
}
833838

834839
@Nullable
835-
public OptimizelyUserContext createUserContext() {
840+
public OptimizelyUserContextAndroid createUserContext() {
836841
return createUserContext(Collections.emptyMap());
837842
}
838843

839844
@Nullable
840-
public OptimizelyUserContext createUserContext(@NonNull Map<String, Object> attributes) {
845+
public OptimizelyUserContextAndroid createUserContext(@NonNull Map<String, Object> attributes) {
841846
if (vuid == null) {
842847
logger.warn("Optimizely vuid is not available. A userId is required to create a user context.");
843848
return null;

0 commit comments

Comments
 (0)