Skip to content

Commit 1e29a82

Browse files
authored
[ch65352] Expose LDValue rather than Gson types (#158)
1 parent 059dd08 commit 1e29a82

33 files changed

+2627
-220
lines changed

launchdarkly-android-client-sdk/src/androidTest/java/com/launchdarkly/android/DefaultUserManagerTest.java

Lines changed: 25 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -90,8 +90,8 @@ public void testBasicRetrieval() throws ExecutionException {
9090

9191
FlagStore flagStore = userManager.getCurrentUserFlagStore();
9292
assertEquals(2, flagStore.getAllFlags().size());
93-
assertEquals(true, flagStore.getFlag("boolFlag1").getValue().getAsBoolean());
94-
assertEquals(expectedStringFlagValue, flagStore.getFlag("stringFlag1").getValue().getAsString());
93+
assertEquals(true, flagStore.getFlag("boolFlag1").getValue().booleanValue());
94+
assertEquals(expectedStringFlagValue, flagStore.getFlag("stringFlag1").getValue().stringValue());
9595
}
9696

9797
@Test
@@ -182,14 +182,14 @@ public void testDeleteFlag() throws ExecutionException {
182182

183183
FlagStore flagStore = userManager.getCurrentUserFlagStore();
184184
assertEquals(2, flagStore.getAllFlags().size());
185-
assertEquals(true, flagStore.getFlag("boolFlag1").getValue().getAsBoolean());
186-
assertEquals(expectedStringFlagValue, flagStore.getFlag("stringFlag1").getValue().getAsString());
185+
assertEquals(true, flagStore.getFlag("boolFlag1").getValue().booleanValue());
186+
assertEquals(expectedStringFlagValue, flagStore.getFlag("stringFlag1").getValue().stringValue());
187187

188188
AwaitableCallback<Void> deleteAwait = new AwaitableCallback<>();
189189
userManager.deleteCurrentUserFlag("{\"key\":\"stringFlag1\",\"version\":16}", deleteAwait);
190190
deleteAwait.await();
191191
assertNull(flagStore.getFlag("stringFlag1"));
192-
assertEquals(true, flagStore.getFlag("boolFlag1").getValue().getAsBoolean());
192+
assertEquals(true, flagStore.getFlag("boolFlag1").getValue().booleanValue());
193193

194194
deleteAwait.reset();
195195
userManager.deleteCurrentUserFlag("{\"key\":\"nonExistentFlag\",\"version\":16,\"value\":false}", deleteAwait);
@@ -262,7 +262,7 @@ public void testDeleteWithVersion() throws ExecutionException {
262262
awaitableCallback.await();
263263
awaitableCallback.reset();
264264
FlagStore flagStore = userManager.getCurrentUserFlagStore();
265-
assertEquals("string1", flagStore.getFlag("stringFlag1").getValue().getAsString());
265+
assertEquals("string1", flagStore.getFlag("stringFlag1").getValue().stringValue());
266266

267267
userManager.deleteCurrentUserFlag("{\"key\":\"stringFlag1\",\"version\":127}", awaitableCallback);
268268
awaitableCallback.await();
@@ -289,24 +289,24 @@ public void testPatchForAddAndReplaceFlags() throws ExecutionException {
289289
awaitableCallback.reset();
290290

291291
FlagStore flagStore = userManager.getCurrentUserFlagStore();
292-
assertEquals(false, flagStore.getFlag("new-flag").getValue().getAsBoolean());
292+
assertEquals(false, flagStore.getFlag("new-flag").getValue().booleanValue());
293293

294294

295295
userManager.patchCurrentUserFlags("{\"key\":\"stringFlag1\",\"version\":16,\"value\":\"string2\"}", awaitableCallback);
296296
awaitableCallback.await();
297297
awaitableCallback.reset();
298-
assertEquals("string2", flagStore.getFlag("stringFlag1").getValue().getAsString());
298+
assertEquals("string2", flagStore.getFlag("stringFlag1").getValue().stringValue());
299299

300300
userManager.patchCurrentUserFlags("{\"key\":\"boolFlag1\",\"version\":16,\"value\":false}", awaitableCallback);
301301
awaitableCallback.await();
302302
awaitableCallback.reset();
303-
assertEquals(false, flagStore.getFlag("boolFlag1").getValue().getAsBoolean());
303+
assertEquals(false, flagStore.getFlag("boolFlag1").getValue().booleanValue());
304304

305-
assertEquals(3.0f, flagStore.getFlag("floatFlag1").getValue().getAsFloat());
305+
assertEquals(3.0f, flagStore.getFlag("floatFlag1").getValue().floatValue());
306306

307307
userManager.patchCurrentUserFlags("{\"key\":\"floatFlag2\",\"version\":16,\"value\":8.0}", awaitableCallback);
308308
awaitableCallback.await();
309-
assertEquals(8.0f, flagStore.getFlag("floatFlag2").getValue().getAsFloat());
309+
assertEquals(8.0f, flagStore.getFlag("floatFlag2").getValue().floatValue());
310310
}
311311

312312
@Test
@@ -323,7 +323,7 @@ public void testPatchSucceedsForMissingVersionInPatch() throws ExecutionExceptio
323323
awaitableCallback.await();
324324
awaitableCallback.reset();
325325
Flag flag1 = flagStore.getFlag("flag1");
326-
assertEquals("value-from-patch", flag1.getValue().getAsString());
326+
assertEquals("value-from-patch", flag1.getValue().stringValue());
327327
assertNull(flag1.getVersion());
328328

329329
//// case 2: value exists in shared preferences without version.
@@ -332,7 +332,7 @@ public void testPatchSucceedsForMissingVersionInPatch() throws ExecutionExceptio
332332
awaitableCallback.await();
333333
awaitableCallback.reset();
334334
flag1 = flagStore.getFlag("flag1");
335-
assertEquals("value-from-patch", flag1.getValue().getAsString());
335+
assertEquals("value-from-patch", flag1.getValue().stringValue());
336336
assertNull(flag1.getVersion());
337337

338338
// version does not exist in shared preferences but exists in patch.
@@ -342,7 +342,7 @@ public void testPatchSucceedsForMissingVersionInPatch() throws ExecutionExceptio
342342
awaitableCallback.await();
343343
awaitableCallback.reset();
344344
flag1 = flagStore.getFlag("flag1");
345-
assertEquals("value-from-patch", flag1.getValue().getAsString());
345+
assertEquals("value-from-patch", flag1.getValue().stringValue());
346346
assertEquals(558, (int) flag1.getVersion());
347347
assertEquals(3, (int) flag1.getFlagVersion());
348348
assertEquals(3, flag1.getVersionForEvents());
@@ -353,7 +353,7 @@ public void testPatchSucceedsForMissingVersionInPatch() throws ExecutionExceptio
353353
awaitableCallback.await();
354354
awaitableCallback.reset();
355355
flag1 = flagStore.getFlag("flag1");
356-
assertEquals("value-from-patch", flag1.getValue().getAsString());
356+
assertEquals("value-from-patch", flag1.getValue().stringValue());
357357
assertEquals(558, (int) flag1.getVersion());
358358
assertEquals(3, (int) flag1.getFlagVersion());
359359
assertEquals(3, flag1.getVersionForEvents());
@@ -365,7 +365,7 @@ public void testPatchSucceedsForMissingVersionInPatch() throws ExecutionExceptio
365365
awaitableCallback.await();
366366
awaitableCallback.reset();
367367
flag1 = flagStore.getFlag("flag1");
368-
assertEquals("value-from-patch", flag1.getValue().getAsString());
368+
assertEquals("value-from-patch", flag1.getValue().stringValue());
369369
assertNull(flag1.getVersion());
370370
assertNull(flag1.getFlagVersion());
371371
assertEquals(-1, flag1.getVersionForEvents());
@@ -376,7 +376,7 @@ public void testPatchSucceedsForMissingVersionInPatch() throws ExecutionExceptio
376376
userManager.patchCurrentUserFlags("{\"key\":\"flag1\",\"version\":559,\"flagVersion\":3,\"value\":\"value-from-patch\",\"variation\":1,\"trackEvents\":false}", awaitableCallback);
377377
awaitableCallback.await();
378378
flag1 = flagStore.getFlag("flag1");
379-
assertEquals("value-from-patch", flag1.getValue().getAsString());
379+
assertEquals("value-from-patch", flag1.getValue().stringValue());
380380
assertEquals(559, (int) flag1.getVersion());
381381
assertEquals(3, (int) flag1.getFlagVersion());
382382
assertEquals(3, flag1.getVersionForEvents());
@@ -404,15 +404,15 @@ public void testPatchWithVersion() throws ExecutionException {
404404
awaitableCallback.reset();
405405
FlagStore flagStore = userManager.getCurrentUserFlagStore();
406406
Flag stringFlag1 = flagStore.getFlag("stringFlag1");
407-
assertEquals("string1", stringFlag1.getValue().getAsString());
407+
assertEquals("string1", stringFlag1.getValue().stringValue());
408408
assertNull(stringFlag1.getFlagVersion());
409409
assertEquals(125, stringFlag1.getVersionForEvents());
410410

411411
userManager.patchCurrentUserFlags("{\"key\":\"stringFlag1\",\"version\":126,\"value\":\"string2\"}", awaitableCallback);
412412
awaitableCallback.await();
413413
awaitableCallback.reset();
414414
stringFlag1 = flagStore.getFlag("stringFlag1");
415-
assertEquals("string2", stringFlag1.getValue().getAsString());
415+
assertEquals("string2", stringFlag1.getValue().stringValue());
416416
assertEquals(126, (int) stringFlag1.getVersion());
417417
assertNull(stringFlag1.getFlagVersion());
418418
assertEquals(126, stringFlag1.getVersionForEvents());
@@ -421,15 +421,15 @@ public void testPatchWithVersion() throws ExecutionException {
421421
awaitableCallback.await();
422422
awaitableCallback.reset();
423423
stringFlag1 = flagStore.getFlag("stringFlag1");
424-
assertEquals("string3", stringFlag1.getValue().getAsString());
424+
assertEquals("string3", stringFlag1.getValue().stringValue());
425425
assertEquals(127, (int) stringFlag1.getVersion());
426426
assertEquals(3, (int) stringFlag1.getFlagVersion());
427427
assertEquals(3, stringFlag1.getVersionForEvents());
428428

429429
userManager.patchCurrentUserFlags("{\"key\":\"stringFlag20\",\"version\":1,\"value\":\"stringValue\"}", awaitableCallback);
430430
awaitableCallback.await();
431431
Flag stringFlag20 = flagStore.getFlag("stringFlag20");
432-
assertEquals("stringValue", stringFlag20.getValue().getAsString());
432+
assertEquals("stringValue", stringFlag20.getValue().stringValue());
433433
}
434434

435435
@Test
@@ -511,13 +511,13 @@ public void testPutForReplaceFlags() throws ExecutionException {
511511

512512
FlagStore flagStore = userManager.getCurrentUserFlagStore();
513513

514-
assertEquals("string2", flagStore.getFlag("stringFlag1").getValue().getAsString());
515-
assertEquals(false, flagStore.getFlag("boolFlag1").getValue().getAsBoolean());
514+
assertEquals("string2", flagStore.getFlag("stringFlag1").getValue().stringValue());
515+
assertEquals(false, flagStore.getFlag("boolFlag1").getValue().booleanValue());
516516

517517
// Should no exist as was deleted by PUT.
518518
assertNull(flagStore.getFlag("floatFlag1"));
519519

520-
assertEquals(8.0f, flagStore.getFlag("floatFlag2").getValue().getAsFloat());
520+
assertEquals(8.0f, flagStore.getFlag("floatFlag2").getValue().floatValue());
521521
}
522522

523523
@Test
@@ -635,7 +635,7 @@ public Void answer() {
635635

636636
private void assertFlagValue(String flagKey, String expectedValue) {
637637
FlagStore flagStore = userManager.getCurrentUserFlagStore();
638-
assertEquals(expectedValue, flagStore.getFlag(flagKey).getValue().getAsString());
638+
assertEquals(expectedValue, flagStore.getFlag(flagKey).getValue().stringValue());
639639
}
640640

641641
}

launchdarkly-android-client-sdk/src/androidTest/java/com/launchdarkly/android/EventTest.java

Lines changed: 30 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,10 @@
55
import com.google.gson.Gson;
66
import com.google.gson.JsonArray;
77
import com.google.gson.JsonElement;
8-
import com.google.gson.JsonNull;
98
import com.google.gson.JsonObject;
109
import com.google.gson.JsonPrimitive;
10+
import com.launchdarkly.android.value.LDValue;
11+
import com.launchdarkly.android.value.ObjectBuilder;
1112

1213
import org.junit.Test;
1314
import org.junit.runner.RunWith;
@@ -194,7 +195,7 @@ public void testUserObjectRemovedFromFeatureEvent() {
194195

195196
LDUser user = builder.build();
196197

197-
final FeatureRequestEvent event = new FeatureRequestEvent("key1", user.getKey(), JsonNull.INSTANCE, JsonNull.INSTANCE, -1, -1, null);
198+
final FeatureRequestEvent event = new FeatureRequestEvent("key1", user.getKey(), LDValue.ofNull(), LDValue.ofNull(), -1, -1, null);
198199

199200
assertNull(event.user);
200201
assertEquals(user.getKey(), event.userKey);
@@ -207,7 +208,7 @@ public void testFullUserObjectIncludedInFeatureEvent() {
207208

208209
LDUser user = builder.build();
209210

210-
final FeatureRequestEvent event = new FeatureRequestEvent("key1", user, JsonNull.INSTANCE, JsonNull.INSTANCE, -1, -1, null);
211+
final FeatureRequestEvent event = new FeatureRequestEvent("key1", user, LDValue.ofNull(), LDValue.ofNull(), -1, -1, null);
211212

212213
assertEquals(user, event.user);
213214
assertNull(event.userKey);
@@ -254,9 +255,24 @@ public void testCustomEventWithoutDataSerialization() {
254255
assertEquals(event.creationDate, eventObject.getAsJsonPrimitive("creationDate").getAsLong(), 0);
255256
}
256257

258+
@Test
259+
public void testCustomEventWithNullValueDataSerialization() {
260+
final CustomEvent event = new CustomEvent("key1", "userkey", LDValue.ofNull(), null);
261+
262+
LDConfig config = new LDConfig.Builder().build();
263+
JsonElement jsonElement = config.getFilteredEventGson().toJsonTree(event);
264+
JsonObject eventObject = jsonElement.getAsJsonObject();
265+
266+
assertEquals(4, eventObject.size());
267+
assertEquals("custom", eventObject.getAsJsonPrimitive("kind").getAsString());
268+
assertEquals("key1", eventObject.getAsJsonPrimitive("key").getAsString());
269+
assertEquals("userkey", eventObject.getAsJsonPrimitive("userKey").getAsString());
270+
assertEquals(event.creationDate, eventObject.getAsJsonPrimitive("creationDate").getAsLong(), 0);
271+
}
272+
257273
@Test
258274
public void testCustomEventWithDataSerialization() {
259-
final CustomEvent event = new CustomEvent("key1", "userkey", new JsonPrimitive("abc"), null);
275+
final CustomEvent event = new CustomEvent("key1", "userkey", LDValue.of("abc"), null);
260276

261277
LDConfig config = new LDConfig.Builder().build();
262278
JsonElement jsonElement = config.getFilteredEventGson().toJsonTree(event);
@@ -286,11 +302,13 @@ public void testCustomEventWithMetricSerialization() {
286302
assertEquals(event.creationDate, eventObject.getAsJsonPrimitive("creationDate").getAsLong(), 0);
287303
}
288304

305+
@SuppressWarnings("deprecation")
289306
@Test
290307
public void testCustomEventWithDataAndMetricSerialization() {
291-
JsonObject eventData = new JsonObject();
292-
eventData.add("data", new JsonPrimitive(10));
293-
final CustomEvent event = new CustomEvent("key1", "userkey", eventData, -10.0);
308+
LDValue objVal = new ObjectBuilder()
309+
.put("data", LDValue.of(10))
310+
.build();
311+
final CustomEvent event = new CustomEvent("key1", "userkey", objVal, -10.0);
294312

295313
LDConfig config = new LDConfig.Builder().build();
296314
JsonElement jsonElement = config.getFilteredEventGson().toJsonTree(event);
@@ -301,7 +319,7 @@ public void testCustomEventWithDataAndMetricSerialization() {
301319
assertEquals("key1", eventObject.getAsJsonPrimitive("key").getAsString());
302320
assertEquals("userkey", eventObject.getAsJsonPrimitive("userKey").getAsString());
303321
assertEquals(-10, eventObject.getAsJsonPrimitive("metricValue").getAsDouble(), 0);
304-
assertEquals(eventData, eventObject.getAsJsonObject("data"));
322+
assertEquals(objVal.asJsonElement(), eventObject.getAsJsonObject("data"));
305323
assertEquals(event.creationDate, eventObject.getAsJsonPrimitive("creationDate").getAsLong(), 0);
306324
}
307325

@@ -314,9 +332,9 @@ public void testOptionalFieldsAreExcludedAppropriately() {
314332

315333
final EvaluationReason reason = EvaluationReason.fallthrough();
316334

317-
final FeatureRequestEvent hasVersionEvent = new FeatureRequestEvent("key1", user, JsonNull.INSTANCE, JsonNull.INSTANCE, 5, null, null);
318-
final FeatureRequestEvent hasVariationEvent = new FeatureRequestEvent("key1", user, JsonNull.INSTANCE, JsonNull.INSTANCE, -1, 20, null);
319-
final FeatureRequestEvent hasReasonEvent = new FeatureRequestEvent("key1", user, JsonNull.INSTANCE, JsonNull.INSTANCE, 5, 20, reason);
335+
final FeatureRequestEvent hasVersionEvent = new FeatureRequestEvent("key1", user, LDValue.ofNull(), LDValue.ofNull(), 5, null, null);
336+
final FeatureRequestEvent hasVariationEvent = new FeatureRequestEvent("key1", user, LDValue.ofNull(), LDValue.ofNull(), -1, 20, null);
337+
final FeatureRequestEvent hasReasonEvent = new FeatureRequestEvent("key1", user, LDValue.ofNull(), LDValue.ofNull(), 5, 20, reason);
320338

321339
assertEquals(5, hasVersionEvent.version, 0.0f);
322340
assertNull(hasVersionEvent.variation);
@@ -338,7 +356,7 @@ public void reasonIsSerialized() {
338356
LDUser user = builder.build();
339357
final EvaluationReason reason = EvaluationReason.fallthrough();
340358

341-
final FeatureRequestEvent hasReasonEvent = new FeatureRequestEvent("key1", user, JsonNull.INSTANCE, JsonNull.INSTANCE, 5, 20, reason);
359+
final FeatureRequestEvent hasReasonEvent = new FeatureRequestEvent("key1", user, LDValue.ofNull(), LDValue.ofNull(), 5, 20, reason);
342360

343361
LDConfig config = new LDConfig.Builder()
344362
.build();

launchdarkly-android-client-sdk/src/androidTest/java/com/launchdarkly/android/FlagBuilder.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,13 @@
22

33
import android.support.annotation.NonNull;
44

5-
import com.google.gson.JsonElement;
5+
import com.launchdarkly.android.value.LDValue;
66

77
public class FlagBuilder {
88

99
@NonNull
1010
private String key;
11-
private JsonElement value = null;
11+
private LDValue value = null;
1212
private Integer version = null;
1313
private Integer flagVersion = null;
1414
private Integer variation = null;
@@ -21,7 +21,7 @@ public FlagBuilder(@NonNull String key) {
2121
this.key = key;
2222
}
2323

24-
public FlagBuilder value(JsonElement value) {
24+
public FlagBuilder value(LDValue value) {
2525
this.value = value;
2626
return this;
2727
}

launchdarkly-android-client-sdk/src/androidTest/java/com/launchdarkly/android/FlagStoreTest.java

Lines changed: 13 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,9 @@
22

33
import android.util.Pair;
44

5-
import com.google.gson.JsonArray;
6-
import com.google.gson.JsonObject;
7-
import com.google.gson.JsonPrimitive;
5+
import com.launchdarkly.android.value.ArrayBuilder;
6+
import com.launchdarkly.android.value.LDValue;
7+
import com.launchdarkly.android.value.ObjectBuilder;
88

99
import org.easymock.EasyMockSupport;
1010
import org.easymock.IArgumentMatcher;
@@ -88,24 +88,25 @@ private List<Flag> makeTestFlags() {
8888
// UserFlagResponse. Therefore, the other variants of EvaluationReason are tested by
8989
// FlagTest.
9090
final EvaluationReason reason = EvaluationReason.ruleMatch(1, "id");
91-
final JsonObject jsonObj = new JsonObject();
92-
jsonObj.add("bool", new JsonPrimitive(true));
93-
jsonObj.add("num", new JsonPrimitive(3.4));
94-
jsonObj.add("string", new JsonPrimitive("string"));
95-
jsonObj.add("array", new JsonArray());
96-
jsonObj.add("obj", new JsonObject());
91+
final LDValue objectVal = new ObjectBuilder()
92+
.put("bool", true)
93+
.put("num", 3.4)
94+
.put("string", "string")
95+
.put("array", new ArrayBuilder().build())
96+
.put("obj", new ObjectBuilder().build())
97+
.build();
9798
final Flag testFlag1 = new FlagBuilder("testFlag1").build();
9899
final Flag testFlag2 = new FlagBuilder("testFlag2")
99-
.value(new JsonArray())
100+
.value(new ArrayBuilder().build())
100101
.version(2)
101102
.debugEventsUntilDate(123456789L)
102103
.trackEvents(true)
103104
.trackReason(true)
104105
.build();
105-
final Flag testFlag3 = new Flag("testFlag3", jsonObj, 250, 102, 3,
106+
final Flag testFlag3 = new Flag("testFlag3", objectVal, 250, 102, 3,
106107
false, false, 2500000000L, reason);
107108
final Flag testFlag4 = new FlagBuilder("_flag-with-very-long-key-name-as-well-as-period.-and-underscore_.")
108-
.value(new JsonPrimitive("String value"))
109+
.value(LDValue.of("String value"))
109110
.flagVersion(4)
110111
.build();
111112
return Arrays.asList(testFlag1, testFlag2, testFlag3, testFlag4);

0 commit comments

Comments
 (0)