Skip to content

Commit feada66

Browse files
authored
fix: prevent flag change listener from being invoked with null flag key (#307)
1 parent 8b7d648 commit feada66

File tree

2 files changed

+22
-10
lines changed

2 files changed

+22
-10
lines changed

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

Lines changed: 15 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package com.launchdarkly.sdk.android;
22

33
import static org.junit.Assert.assertEquals;
4+
import static org.junit.Assert.fail;
45

56
import android.app.Application;
67

@@ -88,7 +89,7 @@ public void pluginRegisterCalledForEachClientEnvironment() throws Exception {
8889
.logAdapter(logging.logAdapter);
8990
LDConfig config = builder.build();
9091

91-
try (LDClient ldClient = LDClient.init(application, config, ldContext, 1)) {
92+
try (LDClient ldClient = LDClient.init(application, config, ldContext, 10)) {
9293
ldClient.boolVariation("test-flag", false);
9394
assertEquals(2, testPlugin.getHooksCalls.size());
9495
assertEquals(2, testPlugin.registerCalls.size());
@@ -99,15 +100,19 @@ public void pluginRegisterCalledForEachClientEnvironment() throws Exception {
99100
assertEquals(2, testHook.beforeEvaluationCalls.size());
100101
assertEquals(2, testHook.afterEvaluationCalls.size());
101102

102-
EnvironmentMetadata environmentMetadata1 = (EnvironmentMetadata) testPlugin.getHooksCalls.get(1).get("environmentMetadata");
103-
assertEquals(mobileKey, environmentMetadata1.getCredential());
104-
assertEquals(environmentMetadata1, testPlugin.getHooksCalls.get(1).get("environmentMetadata"));
105-
assertEquals("AndroidClient", environmentMetadata1.getSdkMetadata().getName());
106-
107-
assertEquals(LDClient.getForMobileKey("secondaryEnvironment"), testPlugin.registerCalls.get(0).get("client"));
108-
EnvironmentMetadata environmentMetadata2 = (EnvironmentMetadata) testPlugin.registerCalls.get(0).get("environmentMetadata");
109-
assertEquals(secondaryMobileKey, environmentMetadata2.getCredential());
110-
assertEquals("AndroidClient", environmentMetadata2.getSdkMetadata().getName());
103+
for (Map<String, Object> hookCall: testPlugin.registerCalls) {
104+
LDClient instance = (LDClient) hookCall.get("client");
105+
106+
if (instance.equals(LDClient.get())) {
107+
EnvironmentMetadata environmentMetadata = (EnvironmentMetadata) hookCall.get("environmentMetadata");
108+
assertEquals(environmentMetadata.getCredential(), mobileKey);
109+
} else if (instance.equals(LDClient.getForMobileKey("secondaryEnvironment"))) {
110+
EnvironmentMetadata environmentMetadata = (EnvironmentMetadata) hookCall.get("environmentMetadata");
111+
assertEquals(environmentMetadata.getCredential(), secondaryMobileKey);
112+
} else {
113+
fail("Client instance was unexpected.");
114+
}
115+
}
111116

112117
logging.assertNoWarningsLogged();
113118
logging.assertNoErrorsLogged();

launchdarkly-android-client-sdk/src/main/java/com/launchdarkly/sdk/android/ContextDataManager.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -314,6 +314,13 @@ private void notifyFlagListeners(Collection<String> updatedFlagKeys) {
314314
}
315315
final Map<String, Set<FeatureFlagChangeListener>> listenersToCall = new HashMap<>();
316316
for (String flagKey: updatedFlagKeys) {
317+
318+
// TODO: SDK-1040. This conditional is a short term mitigation for a rare issue where a
319+
// null flag key is encountered.
320+
if (flagKey == null) {
321+
continue;
322+
}
323+
317324
Set<FeatureFlagChangeListener> flagListeners = listeners.get(flagKey);
318325
if (flagListeners != null && !flagListeners.isEmpty()) {
319326
listenersToCall.put(flagKey, flagListeners);

0 commit comments

Comments
 (0)