From dcc0002c9f325de3c3ccc0f3562a08eb5d4ddb29 Mon Sep 17 00:00:00 2001 From: novalisdenahi Date: Mon, 12 Oct 2026 16:30:37 +0200 Subject: [PATCH 1/2] Fix config change hook initialization and add test --- src/main/java/com/configcat/ConfigService.java | 6 +++++- src/test/java/com/configcat/ConfigCatClientTest.java | 4 ++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/configcat/ConfigService.java b/src/main/java/com/configcat/ConfigService.java index f026cab..955e0a4 100644 --- a/src/main/java/com/configcat/ConfigService.java +++ b/src/main/java/com/configcat/ConfigService.java @@ -68,7 +68,11 @@ public ConfigService(String sdkKey, } else { // Sync up with cache before reporting ready state - cachedEntry.set(readCache()); + Entry fromCache = readCache(); + if (!fromCache.isEmpty() && !fromCache.getETag().equals(cachedEntry.get().getETag())){ + cachedEntry.set(fromCache); + configCatHooks.invokeOnConfigChanged(fromCache.getConfig().getEntries()); + } setInitialized(); } } diff --git a/src/test/java/com/configcat/ConfigCatClientTest.java b/src/test/java/com/configcat/ConfigCatClientTest.java index 462d3af..a03feac 100644 --- a/src/test/java/com/configcat/ConfigCatClientTest.java +++ b/src/test/java/com/configcat/ConfigCatClientTest.java @@ -910,14 +910,18 @@ void testHooksSub() throws IOException { void testReadyHookManualPollWithCache() throws IOException { AtomicReference ready = new AtomicReference<>(null); + AtomicBoolean changed = new AtomicBoolean(false); + ConfigCache cache = new SingleValueCache(Helpers.cacheValueFromConfigJson(String.format(TEST_JSON, "test"))); ConfigCatClient cl = ConfigCatClient.get(Helpers.SDK_KEY, options -> { options.pollingMode(PollingModes.manualPoll()); options.cache(cache); + options.hooks().addOnConfigChanged(map -> changed.set(true)); options.hooks().addOnClientReady(ready::set); }); + assertTrue(changed.get()); assertEquals(ClientCacheState.HAS_CACHED_FLAG_DATA_ONLY, ready.get()); cl.close(); From 5204d1fe71ea03ee383fe52f2170a0f39ef3a021 Mon Sep 17 00:00:00 2001 From: novalisdenahi Date: Mon, 12 Oct 2026 17:27:03 +0200 Subject: [PATCH 2/2] Extend UserAttributeConvertTest with String Array/List contains null value. --- src/test/java/com/configcat/UserAttributeConvertTest.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/test/java/com/configcat/UserAttributeConvertTest.java b/src/test/java/com/configcat/UserAttributeConvertTest.java index 8c5f151..d5278fa 100644 --- a/src/test/java/com/configcat/UserAttributeConvertTest.java +++ b/src/test/java/com/configcat/UserAttributeConvertTest.java @@ -29,8 +29,10 @@ private static Stream testDataForUserTest() { //String Array data Arguments.of("configcat-sdk-1/JcPbCGl_1E-K9M-fJOyKyQ/OfQqcTjfFUGBwMKqtyEOrQ", "stringArrayContainsAnyOfDogDefaultCat", String.class, new String[]{"x", "read"}, "Dog"), Arguments.of("configcat-sdk-1/JcPbCGl_1E-K9M-fJOyKyQ/OfQqcTjfFUGBwMKqtyEOrQ", "stringArrayContainsAnyOfDogDefaultCat", String.class, new String[]{"x", "Read"}, "Cat"), + Arguments.of("configcat-sdk-1/JcPbCGl_1E-K9M-fJOyKyQ/OfQqcTjfFUGBwMKqtyEOrQ", "stringArrayContainsAnyOfDogDefaultCat", String.class, new String[]{"x", "read", null}, "Cat"), Arguments.of("configcat-sdk-1/JcPbCGl_1E-K9M-fJOyKyQ/OfQqcTjfFUGBwMKqtyEOrQ", "stringArrayContainsAnyOfDogDefaultCat", String.class, Arrays.asList("x", "read"), "Dog"), Arguments.of("configcat-sdk-1/JcPbCGl_1E-K9M-fJOyKyQ/OfQqcTjfFUGBwMKqtyEOrQ", "stringArrayContainsAnyOfDogDefaultCat", String.class, Arrays.asList("x", "Read"), "Cat"), + Arguments.of("configcat-sdk-1/JcPbCGl_1E-K9M-fJOyKyQ/OfQqcTjfFUGBwMKqtyEOrQ", "stringArrayContainsAnyOfDogDefaultCat", String.class, Arrays.asList("x", "read", null), "Cat"), Arguments.of("configcat-sdk-1/JcPbCGl_1E-K9M-fJOyKyQ/OfQqcTjfFUGBwMKqtyEOrQ", "stringArrayContainsAnyOfDogDefaultCat", String.class, "[\"x\", \"read\"]", "Dog"), Arguments.of("configcat-sdk-1/JcPbCGl_1E-K9M-fJOyKyQ/OfQqcTjfFUGBwMKqtyEOrQ", "stringArrayContainsAnyOfDogDefaultCat", String.class, "[\"x\", \"Read\"]", "Cat"), Arguments.of("configcat-sdk-1/JcPbCGl_1E-K9M-fJOyKyQ/OfQqcTjfFUGBwMKqtyEOrQ", "stringArrayContainsAnyOfDogDefaultCat", String.class, "x, read", "Cat"),