Skip to content

Commit 3c08efc

Browse files
authored
Merge pull request #150 from optimizely/master
Merge master onto 2.0.x for beta2 release
2 parents 61f3832 + 96ae369 commit 3c08efc

File tree

6 files changed

+120
-15
lines changed

6 files changed

+120
-15
lines changed

.travis.yml

+1-1
Original file line numberDiff line numberDiff line change
@@ -21,4 +21,4 @@ cache:
2121
branches:
2222
only:
2323
- master
24-
- /^\d+\.\d+\.\d+(-SNAPSHOT|-alpha|-beta)?$/ # trigger builds on tags which are semantically versioned to ship the SDK.
24+
- /^\d+\.\d+\.\d+(-SNAPSHOT|-alpha|-beta)?\d*$/ # trigger builds on tags which are semantically versioned to ship the SDK.

CHANGELOG.md

+9
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,13 @@
11
# Optimizely Java X SDK Changelog
2+
3+
## 2.0.0 Beta 2
4+
October 5, 2017
5+
6+
This release is a second beta release supporting feature flags and rollouts. It includes all the same new features and breaking changes as the last beta release.
7+
8+
### Bug Fixes
9+
Fall back to default feature variable value when there is no variable usage in the variation a user is bucketed into. For more information see [PR #149](https://github.com/optimizely/java-sdk/pull/149).
10+
211
## 2.0.0 Beta
312
September 29, 2017
413

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

+6-1
Original file line numberDiff line numberDiff line change
@@ -556,7 +556,12 @@ else if (!variable.getType().equals(variableType)) {
556556
if (variation != null) {
557557
LiveVariableUsageInstance liveVariableUsageInstance =
558558
variation.getVariableIdToLiveVariableUsageInstanceMap().get(variable.getId());
559-
variableValue = liveVariableUsageInstance.getValue();
559+
if (liveVariableUsageInstance != null) {
560+
variableValue = liveVariableUsageInstance.getValue();
561+
}
562+
else {
563+
variableValue = variable.getDefaultValue();
564+
}
560565
}
561566
else {
562567
logger.info("User \"" + userId +

core-api/src/test/java/com/optimizely/ab/OptimizelyTest.java

+33
Original file line numberDiff line numberDiff line change
@@ -80,16 +80,19 @@
8080
import static com.optimizely.ab.config.ValidProjectConfigV4.EXPERIMENT_PAUSED_EXPERIMENT_KEY;
8181
import static com.optimizely.ab.config.ValidProjectConfigV4.FEATURE_FLAG_MULTI_VARIATE_FEATURE;
8282
import static com.optimizely.ab.config.ValidProjectConfigV4.FEATURE_FLAG_SINGLE_VARIABLE_DOUBLE;
83+
import static com.optimizely.ab.config.ValidProjectConfigV4.FEATURE_FLAG_SINGLE_VARIABLE_INTEGER;
8384
import static com.optimizely.ab.config.ValidProjectConfigV4.FEATURE_MULTI_VARIATE_FEATURE_KEY;
8485
import static com.optimizely.ab.config.ValidProjectConfigV4.FEATURE_SINGLE_VARIABLE_BOOLEAN_KEY;
8586
import static com.optimizely.ab.config.ValidProjectConfigV4.FEATURE_SINGLE_VARIABLE_DOUBLE_KEY;
87+
import static com.optimizely.ab.config.ValidProjectConfigV4.FEATURE_SINGLE_VARIABLE_INTEGER_KEY;
8688
import static com.optimizely.ab.config.ValidProjectConfigV4.MULTIVARIATE_EXPERIMENT_FORCED_VARIATION_USER_ID_GRED;
8789
import static com.optimizely.ab.config.ValidProjectConfigV4.PAUSED_EXPERIMENT_FORCED_VARIATION_USER_ID_CONTROL;
8890
import static com.optimizely.ab.config.ValidProjectConfigV4.VARIABLE_BOOLEAN_VARIABLE_DEFAULT_VALUE;
8991
import static com.optimizely.ab.config.ValidProjectConfigV4.VARIABLE_BOOLEAN_VARIABLE_KEY;
9092
import static com.optimizely.ab.config.ValidProjectConfigV4.VARIABLE_DOUBLE_DEFAULT_VALUE;
9193
import static com.optimizely.ab.config.ValidProjectConfigV4.VARIABLE_DOUBLE_VARIABLE_KEY;
9294
import static com.optimizely.ab.config.ValidProjectConfigV4.VARIABLE_FIRST_LETTER_KEY;
95+
import static com.optimizely.ab.config.ValidProjectConfigV4.VARIABLE_INTEGER_VARIABLE_KEY;
9396
import static com.optimizely.ab.config.ValidProjectConfigV4.VARIATION_MULTIVARIATE_EXPERIMENT_GRED;
9497
import static com.optimizely.ab.config.ValidProjectConfigV4.VARIATION_MULTIVARIATE_EXPERIMENT_GRED_KEY;
9598
import static com.optimizely.ab.event.LogEvent.RequestMethod;
@@ -2631,6 +2634,36 @@ public void getFeatureVariableValueReturnsVariationValueWhenUserGetsBucketedToVa
26312634
assertEquals(expectedValue, value);
26322635
}
26332636

2637+
/**
2638+
* Verify {@link Optimizely#getFeatureVariableValueForType(String, String, String, Map, LiveVariable.VariableType)}
2639+
* returns the default value for the feature variable
2640+
* when there is no variable usage present for the variation the user is bucketed into.
2641+
* @throws ConfigParseException
2642+
*/
2643+
@Test
2644+
public void getFeatureVariableValueReturnsDefaultValueWhenNoVariationUsageIsPresent() throws ConfigParseException {
2645+
assumeTrue(datafileVersion >= Integer.parseInt(ProjectConfig.Version.V4.toString()));
2646+
2647+
String validFeatureKey = FEATURE_SINGLE_VARIABLE_INTEGER_KEY;
2648+
String validVariableKey = VARIABLE_INTEGER_VARIABLE_KEY;
2649+
LiveVariable variable = FEATURE_FLAG_SINGLE_VARIABLE_INTEGER.getVariableKeyToLiveVariableMap().get(validVariableKey);
2650+
String expectedValue = variable.getDefaultValue();
2651+
2652+
Optimizely optimizely = Optimizely.builder(validDatafile, mockEventHandler)
2653+
.withConfig(validProjectConfig)
2654+
.build();
2655+
2656+
String value = optimizely.getFeatureVariableValueForType(
2657+
validFeatureKey,
2658+
validVariableKey,
2659+
genericUserId,
2660+
Collections.<String, String>emptyMap(),
2661+
LiveVariable.VariableType.INTEGER
2662+
);
2663+
2664+
assertEquals(expectedValue, value);
2665+
}
2666+
26342667
/**
26352668
* Verify {@link Optimizely#isFeatureEnabled(String, String)} calls into
26362669
* {@link Optimizely#isFeatureEnabled(String, String, Map)} and they both

core-api/src/test/java/com/optimizely/ab/config/ValidProjectConfigV4.java

+44-12
Original file line numberDiff line numberDiff line change
@@ -107,9 +107,9 @@ public class ValidProjectConfigV4 {
107107
LiveVariable.VariableType.DOUBLE
108108
);
109109
private static final String FEATURE_SINGLE_VARIABLE_INTEGER_ID = "3281420120";
110-
private static final String FEATURE_SINGLE_VARIABLE_INTEGER_KEY = "integer_single_variable_feature";
110+
public static final String FEATURE_SINGLE_VARIABLE_INTEGER_KEY = "integer_single_variable_feature";
111111
private static final String VARIABLE_INTEGER_VARIABLE_ID = "593964691";
112-
private static final String VARIABLE_INTEGER_VARIABLE_KEY = "integer_variable";
112+
public static final String VARIABLE_INTEGER_VARIABLE_KEY = "integer_variable";
113113
private static final String VARIABLE_INTEGER_DEFAULT_VALUE = "7";
114114
private static final LiveVariable VARIABLE_INTEGER_VARIABLE = new LiveVariable(
115115
VARIABLE_INTEGER_VARIABLE_ID,
@@ -118,15 +118,6 @@ public class ValidProjectConfigV4 {
118118
null,
119119
LiveVariable.VariableType.INTEGER
120120
);
121-
private static final FeatureFlag FEATURE_FLAG_SINGLE_VARIABLE_INTEGER = new FeatureFlag(
122-
FEATURE_SINGLE_VARIABLE_INTEGER_ID,
123-
FEATURE_SINGLE_VARIABLE_INTEGER_KEY,
124-
"",
125-
Collections.<String>emptyList(),
126-
Collections.singletonList(
127-
VARIABLE_INTEGER_VARIABLE
128-
)
129-
);
130121
private static final String FEATURE_SINGLE_VARIABLE_BOOLEAN_ID = "2591051011";
131122
public static final String FEATURE_SINGLE_VARIABLE_BOOLEAN_KEY = "boolean_single_variable_feature";
132123
private static final String VARIABLE_BOOLEAN_VARIABLE_ID = "3974680341";
@@ -206,6 +197,38 @@ public class ValidProjectConfigV4 {
206197
VARIABLE_STRING_VARIABLE
207198
)
208199
);
200+
private static final String ROLLOUT_3_ID = "2048875663";
201+
private static final String ROLLOUT_3_EVERYONE_ELSE_EXPERIMENT_ID = "3794675122";
202+
private static final String ROLLOUT_3_EVERYONE_ELSE_RULE_ENABLED_VARIATION_ID = "589640735";
203+
private static final Variation ROLLOUT_3_EVERYONE_ELSE_RULE_ENABLED_VARIATION = new Variation(
204+
ROLLOUT_3_EVERYONE_ELSE_RULE_ENABLED_VARIATION_ID,
205+
ROLLOUT_3_EVERYONE_ELSE_RULE_ENABLED_VARIATION_ID,
206+
Collections.<LiveVariableUsageInstance>emptyList()
207+
);
208+
private static final Experiment ROLLOUT_3_EVERYONE_ELSE_RULE = new Experiment(
209+
ROLLOUT_3_EVERYONE_ELSE_EXPERIMENT_ID,
210+
ROLLOUT_3_EVERYONE_ELSE_EXPERIMENT_ID,
211+
Experiment.ExperimentStatus.RUNNING.toString(),
212+
ROLLOUT_3_ID,
213+
Collections.<String>emptyList(),
214+
Collections.singletonList(
215+
ROLLOUT_3_EVERYONE_ELSE_RULE_ENABLED_VARIATION
216+
),
217+
Collections.<String, String>emptyMap(),
218+
Collections.singletonList(
219+
new TrafficAllocation(
220+
ROLLOUT_3_EVERYONE_ELSE_RULE_ENABLED_VARIATION_ID,
221+
10000
222+
)
223+
)
224+
);
225+
public static final Rollout ROLLOUT_3 = new Rollout(
226+
ROLLOUT_3_ID,
227+
Collections.singletonList(
228+
ROLLOUT_3_EVERYONE_ELSE_RULE
229+
)
230+
);
231+
209232
private static final String FEATURE_MULTI_VARIATE_FEATURE_ID = "3263342226";
210233
public static final String FEATURE_MULTI_VARIATE_FEATURE_KEY = "multi_variate_feature";
211234
private static final String VARIABLE_FIRST_LETTER_ID = "675244127";
@@ -917,7 +940,15 @@ public class ValidProjectConfigV4 {
917940
VARIABLE_DOUBLE_VARIABLE
918941
)
919942
);
920-
943+
public static final FeatureFlag FEATURE_FLAG_SINGLE_VARIABLE_INTEGER = new FeatureFlag(
944+
FEATURE_SINGLE_VARIABLE_INTEGER_ID,
945+
FEATURE_SINGLE_VARIABLE_INTEGER_KEY,
946+
ROLLOUT_3_ID,
947+
Collections.<String>emptyList(),
948+
Collections.singletonList(
949+
VARIABLE_INTEGER_VARIABLE
950+
)
951+
);
921952

922953
public static ProjectConfig generateValidProjectConfigV4() {
923954

@@ -964,6 +995,7 @@ public static ProjectConfig generateValidProjectConfigV4() {
964995
List<Rollout> rollouts = new ArrayList<Rollout>();
965996
rollouts.add(ROLLOUT_1);
966997
rollouts.add(ROLLOUT_2);
998+
rollouts.add(ROLLOUT_3);
967999

9681000
return new ProjectConfig(
9691001
ACCOUNT_ID,

core-api/src/test/resources/config/valid-project-config-v4.json

+27-1
Original file line numberDiff line numberDiff line change
@@ -449,7 +449,7 @@
449449
{
450450
"id": "3281420120",
451451
"key": "integer_single_variable_feature",
452-
"rolloutId": "",
452+
"rolloutId": "2048875663",
453453
"experimentIds": [],
454454
"variables": [
455455
{
@@ -679,6 +679,32 @@
679679
]
680680
}
681681
]
682+
},
683+
{
684+
"id": "2048875663",
685+
"experiments": [
686+
{
687+
"id": "3794675122",
688+
"key": "3794675122",
689+
"status": "Running",
690+
"layerId": "2048875663",
691+
"audienceIds": [],
692+
"forcedVariations": {},
693+
"variations": [
694+
{
695+
"id": "589640735",
696+
"key": "589640735",
697+
"variables": []
698+
}
699+
],
700+
"trafficAllocation": [
701+
{
702+
"entityId": "589640735",
703+
"endOfRange": 10000
704+
}
705+
]
706+
}
707+
]
682708
}
683709
],
684710
"variables": []

0 commit comments

Comments
 (0)