From 3af44d2737a90345b53f25b5b1b48282b722d724 Mon Sep 17 00:00:00 2001 From: Patrick Kaeding Date: Tue, 30 Jun 2015 13:50:03 -0700 Subject: [PATCH] fixed logic for rules written using non-string values --- .../java/com/launchdarkly/client/LDUser.java | 11 ++++ .../com/launchdarkly/client/Variation.java | 10 +++- .../launchdarkly/client/FeatureRepTest.java | 57 +++++++++++++++++++ 3 files changed, 77 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/launchdarkly/client/LDUser.java b/src/main/java/com/launchdarkly/client/LDUser.java index a371ed4c8..73634dce9 100644 --- a/src/main/java/com/launchdarkly/client/LDUser.java +++ b/src/main/java/com/launchdarkly/client/LDUser.java @@ -269,6 +269,17 @@ public Builder custom(String k, Number n) { return this; } + /** + * Add a {@link java.lang.Boolean}-valued custom attribute + * @param k the key for the custom attribute + * @param b the value for the custom attribute + * @return the builder + */ + public Builder custom(String k, Boolean b) { + custom.put(k, new JsonPrimitive(b)); + return this; + } + /** * Add a list of {@link java.lang.String}-valued custom attributes * @param k the key for the list diff --git a/src/main/java/com/launchdarkly/client/Variation.java b/src/main/java/com/launchdarkly/client/Variation.java index a79217035..b7ff95ba3 100644 --- a/src/main/java/com/launchdarkly/client/Variation.java +++ b/src/main/java/com/launchdarkly/client/Variation.java @@ -3,6 +3,7 @@ import com.google.gson.JsonArray; import com.google.gson.JsonElement; +import com.google.gson.JsonPrimitive; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -158,7 +159,14 @@ else if (values.contains(elt.getAsString())) { return false; } else if (custom.isJsonPrimitive()) { - return values.contains(custom.getAsString()); + JsonPrimitive prim = custom.getAsJsonPrimitive(); + if (prim.isNumber()) { + return values.contains(custom.getAsDouble()); + } else if (prim.isBoolean()) { + return values.contains(custom.getAsBoolean()); + } else { + return values.contains(custom.getAsString()); + } } } return false; diff --git a/src/test/java/com/launchdarkly/client/FeatureRepTest.java b/src/test/java/com/launchdarkly/client/FeatureRepTest.java index 7628187fb..21b0baa4f 100644 --- a/src/test/java/com/launchdarkly/client/FeatureRepTest.java +++ b/src/test/java/com/launchdarkly/client/FeatureRepTest.java @@ -12,21 +12,34 @@ public class FeatureRepTest { private final Variation.TargetRule targetGroupOn = new Variation.TargetRule("groups", Arrays.asList("google", "microsoft")); + // GSON will deserialize numbers as decimals + private final Variation.TargetRule targetFavoriteNumberOn = new Variation.TargetRule("favorite_number", Arrays.asList(42.0)); + + private final Variation.TargetRule targetLikesCatsOn = new Variation.TargetRule("likes_cats", Arrays.asList(true)); + private final Variation.TargetRule targetUserOff = new Variation.TargetRule("key", Collections.singletonList("targetOff@test.com")); private final Variation.TargetRule targetGroupOff = new Variation.TargetRule("groups", Arrays.asList("oracle")); + private final Variation.TargetRule targetFavoriteNumberOff = new Variation.TargetRule("favorite_number", Arrays.asList(33.0)); + + private final Variation.TargetRule targetLikesDogsOff = new Variation.TargetRule("likes_dogs", Arrays.asList(false)); + private final Variation.TargetRule targetAnonymousOn = new Variation.TargetRule("anonymous", Collections.singletonList(true)); private final Variation trueVariation = new Variation.Builder(true, 80) .target(targetUserOn) .target(targetGroupOn) .target(targetAnonymousOn) + .target(targetLikesCatsOn) + .target(targetFavoriteNumberOn) .build(); private final Variation falseVariation = new Variation.Builder(false, 20) .target(targetUserOff) .target(targetGroupOff) + .target(targetFavoriteNumberOff) + .target(targetLikesDogsOff) .build(); private final FeatureRep simpleFlag = new FeatureRep.Builder("Sample flag", "sample.flag") @@ -95,6 +108,28 @@ public void testFlagForTargetGroupOn() { assertEquals(true, b); } + @Test + public void testFlagForTargetNumericTestOn() { + LDUser user = new LDUser.Builder("targetOther@test.com") + .custom("favorite_number", 42.0) + .build(); + + Boolean b = simpleFlag.evaluate(user); + + assertEquals(true, b); + } + + @Test + public void testFlagForTargetBooleanTestOn() { + LDUser user = new LDUser.Builder("targetOther@test.com") + .custom("likes_cats", true) + .build(); + + Boolean b = simpleFlag.evaluate(user); + + assertEquals(true, b); + } + @Test public void testFlagForTargetGroupOff() { LDUser user = new LDUser.Builder("targetOther@test.com") @@ -106,6 +141,28 @@ public void testFlagForTargetGroupOff() { assertEquals(false, b); } + @Test + public void testFlagForTargetNumericTestOff() { + LDUser user = new LDUser.Builder("targetOther@test.com") + .custom("favorite_number", 33.0) + .build(); + + Boolean b = simpleFlag.evaluate(user); + + assertEquals(false, b); + } + + @Test + public void testFlagForTargetBooleanTestOff() { + LDUser user = new LDUser.Builder("targetOther@test.com") + .custom("likes_dogs", false) + .build(); + + Boolean b = simpleFlag.evaluate(user); + + assertEquals(false, b); + } + @Test public void testDisabledFlagAlwaysOff() { LDUser user = new LDUser("targetOn@test.com");