Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@

<groupId>com.featureprobe</groupId>
<artifactId>server-sdk-java</artifactId>
<version>2.2.2</version>
<version>2.3.0</version>
<name>server-sdk-java</name>
<description>FeatureProbe Server Side SDK for Java</description>

Expand Down
21 changes: 11 additions & 10 deletions src/main/java/com/featureprobe/sdk/server/model/Toggle.java
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@
import java.util.Objects;
import java.util.Optional;

public final class Toggle {
public class Toggle {

private String key;

Expand All @@ -53,7 +53,7 @@ public final class Toggle {

public EvaluationResult eval(FPUser user, Map<String, Toggle> toggles, Map<String, Segment> segments,
Object defaultValue, int deep) {
EvaluationResult result = createDefaultResult(user, key, defaultValue, "");
EvaluationResult result = createDisabledResult(user, key, defaultValue);
try {
return doEval(user, toggles, segments, defaultValue, deep);
} catch (PrerequisiteException e) {
Expand All @@ -66,23 +66,23 @@ public EvaluationResult eval(FPUser user, Map<String, Toggle> toggles, Map<Strin
}

public EvaluationResult doEval(FPUser user, Map<String, Toggle> toggles, Map<String, Segment> segments,
Object defaultValue, int deep) {
Object defaultValue, int depth) {

String warning = "";

if (!enabled) {
return createDisabledResult(user, this.key, defaultValue);
}

if (deep <= 0) {
throw new PrerequisiteException("prerequisite deep overflow");
if (depth <= 0) {
throw new PrerequisiteException("prerequisite depth overflow");
}

if (!prerequisite(user, toggles, segments, deep)) {
return createDefaultResult(user, key, defaultValue, warning);
if (!meetPrerequisite(user, toggles, segments, depth)) {
return createDisabledResult(user, key, defaultValue);
}

if (rules != null && rules.size() > 0) {
if (rules != null && !rules.isEmpty()) {
for (int i = 0; i < rules.size(); i++) {
Rule rule = rules.get(i);
HitResult hitResult = rule.hit(user, segments, this.key);
Expand Down Expand Up @@ -110,15 +110,16 @@ private EvaluationResult createDefaultResult(FPUser user, String toggleKey, Obje
return defaultResult;
}

private boolean prerequisite(FPUser user, Map<String, Toggle> toggles, Map<String, Segment> segments, int deep) {
protected boolean meetPrerequisite(FPUser user, Map<String, Toggle> toggles, Map<String, Segment> segments,
int depth) {
if (Objects.isNull(prerequisites) || prerequisites.isEmpty()) {
return true;
}
for (Prerequisite prerequisite : prerequisites) {
Toggle toggle = toggles.get(prerequisite.getKey());
if (Objects.isNull(toggle))
throw new PrerequisiteException("prerequisite not exist: " + this.key);
EvaluationResult eval = toggle.doEval(user, toggles, segments, null, deep - 1);
EvaluationResult eval = toggle.doEval(user, toggles, segments, null, depth - 1);
if (Objects.isNull(eval.getValue()))
return false;
if (!eval.getValue().equals(prerequisite.getValue()))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -46,9 +46,11 @@ class FeatureProbeSpec extends Specification {
}


def "FeatureProbe case test"() {
def "FeatureProbe Server Side Java SDK specification test"() {
when:
def tests = testCase.get("tests").asList()

then:
for (int i = 0; i < tests.size(); i++) {
def scenario = tests.get(i)
def name = scenario.get("scenario").asText()
Expand Down Expand Up @@ -118,19 +120,13 @@ class FeatureProbeSpec extends Specification {
def stringDetailRes = featureProbe.stringDetail(toggleKey, user,
defaultValue.asText())
assert stringDetailRes.value == expectValue.asText()
if (expectResult.get("reason") != null) {
assert stringDetailRes.reason.containsIgnoreCase(expectResult.get("reason").asText())
}
break
}
}
}
then:
with(FeatureProbe) {

}
}


def "FeatureProbe repository uninitialized"() {

}

}
Expand Down
83 changes: 83 additions & 0 deletions src/test/groovy/com/featureprobe/sdk/server/ToggleTest.groovy
Original file line number Diff line number Diff line change
@@ -0,0 +1,83 @@
package com.featureprobe.sdk.server

import com.featureprobe.sdk.server.model.Serve
import com.featureprobe.sdk.server.model.Toggle
import spock.lang.Specification

class ToggleTest extends Specification {
def toggle = new Toggle()
def user = new FPUser();

def setup() {
toggle.setEnabled(Boolean.TRUE);
toggle.setVariations([0,1])
toggle.setDisabledServe(new Serve(0))
toggle.setDefaultServe(new Serve(1))
}

def "If toggle is disabled serve disabled variation"() {
given:
toggle.setEnabled(Boolean.FALSE)

when:
def result = toggle.doEval(user, null, null, null, 1)

then:
0 == result.variationIndex.get()
}

def "If toggle is enabled serve default variation"() {
given:
toggle.setEnabled(Boolean.TRUE)

when:
def result = toggle.doEval(user, null, null, null, 1)

then:
1 == result.variationIndex.get()
}

def "When meetPrerequisite returns false should act like disabled"() {
setup:
Toggle toggleSpy = Spy()
toggleSpy.enabled = true

final DEFAULT_VARIATION = 1
final DISABLED_VARIATION = 0

toggleSpy.variations = [DEFAULT_VARIATION, DISABLED_VARIATION]
toggleSpy.defaultServe = new Serve(DEFAULT_VARIATION)
toggleSpy.disabledServe = new Serve(DISABLED_VARIATION)

// Make meetPrerequisite return false
toggleSpy.meetPrerequisite(user, null, null, 1) >> false

when:
def result = toggleSpy.doEval(user, null, null, null, 1)

then:
DISABLED_VARIATION == result.variationIndex.get()
}

def "When meetPrerequisite returns true should not act like disabled"() {
setup:
Toggle toggleSpy = Spy()
toggleSpy.enabled = true
final DEFAULT_VARIATION = 1
final DISABLED_VARIATION = 0

toggleSpy.variations = [DEFAULT_VARIATION, DISABLED_VARIATION]
toggleSpy.defaultServe = new Serve(DEFAULT_VARIATION)
toggleSpy.disabledServe = new Serve(DISABLED_VARIATION)

// Make meetPrerequisite return false
toggleSpy.meetPrerequisite(user, null, null, 1) >> true

when:
def result = toggleSpy.doEval(user, null, null, null, 1)

then:
DISABLED_VARIATION != result.variationIndex.get()
}

}
2 changes: 1 addition & 1 deletion src/test/resources/test