Skip to content

Commit 9b3ce4a

Browse files
committed
ISSUE-1919 Fixed: Domain client event handlers no longer disappear
Signed-off-by: man85 <man85@yandex.ru>
1 parent ea2d573 commit 9b3ce4a

File tree

2 files changed

+46
-1
lines changed

2 files changed

+46
-1
lines changed

src/main/java/dev/openfeature/sdk/EventSupport.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import dev.openfeature.sdk.internal.ConfigurableThreadFactory;
44
import java.util.Collection;
5+
import java.util.HashSet;
56
import java.util.Map;
67
import java.util.Optional;
78
import java.util.Set;
@@ -117,7 +118,7 @@ public void removeGlobalHandler(ProviderEvent event, Consumer<EventDetails> hand
117118
* @return set of domain names
118119
*/
119120
public Set<String> getAllDomainNames() {
120-
return this.handlerStores.keySet();
121+
return new HashSet<>(this.handlerStores.keySet());
121122
}
122123

123124
/**

src/test/java/dev/openfeature/sdk/OpenFeatureAPITest.java

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,22 @@
11
package dev.openfeature.sdk;
22

3+
import static dev.openfeature.sdk.ProviderEvent.PROVIDER_CONFIGURATION_CHANGED;
34
import static org.assertj.core.api.Assertions.assertThat;
45
import static org.assertj.core.api.Assertions.assertThatCode;
56
import static org.junit.jupiter.api.Assertions.assertEquals;
7+
import static org.junit.jupiter.api.Assertions.assertTrue;
68
import static org.mockito.ArgumentMatchers.any;
79
import static org.mockito.Mockito.mock;
10+
import static org.mockito.Mockito.spy;
811
import static org.mockito.Mockito.times;
912
import static org.mockito.Mockito.verify;
1013

1114
import dev.openfeature.sdk.testutils.testProvider.TestProvider;
1215
import java.util.HashMap;
16+
import java.util.concurrent.CountDownLatch;
17+
import java.util.concurrent.TimeUnit;
1318
import org.junit.jupiter.api.BeforeEach;
19+
import org.junit.jupiter.api.DisplayName;
1420
import org.junit.jupiter.api.Test;
1521

1622
class OpenFeatureAPITest {
@@ -115,4 +121,42 @@ void featureProviderTrackIsCalled() throws Exception {
115121
verify(featureProvider, times(2)).getMetadata();
116122
verify(featureProvider).track(any(), any(), any());
117123
}
124+
125+
@Test
126+
@DisplayName("Domainless provider initialized after domain provider - OnConfigurationChanged handlers are invoked for both providers after emitting PROVIDER_CONFIGURATION_CHANGED")
127+
void onConfigurationChangedAreCalledForDomainlessAndDomainProviders() throws InterruptedException {
128+
EventProvider domainlessFeatureProvider = spy(EventProvider.class);
129+
EventProvider featureProvider = spy(EventProvider.class);
130+
131+
Client domainlessClient = api.getClient();
132+
Client client = api.getClient("domain");
133+
134+
CountDownLatch domainlessLatch = new CountDownLatch(1);
135+
CountDownLatch latch = new CountDownLatch(1);
136+
137+
domainlessClient.onProviderConfigurationChanged(
138+
eventDetails -> domainlessLatch.countDown()
139+
);
140+
client.onProviderConfigurationChanged(
141+
eventDetails -> latch.countDown()
142+
);
143+
144+
api.setProviderAndWait("domain", featureProvider);
145+
api.setProviderAndWait(domainlessFeatureProvider);
146+
147+
featureProvider.emit(PROVIDER_CONFIGURATION_CHANGED, mock(ProviderEventDetails.class));
148+
domainlessFeatureProvider.emit(PROVIDER_CONFIGURATION_CHANGED, mock(ProviderEventDetails.class));
149+
150+
boolean domainlessCompleted = domainlessLatch.await(5, TimeUnit.SECONDS);
151+
assertTrue(
152+
domainlessCompleted,
153+
"onProviderConfigurationChanged was not be invoked for a client with default domain"
154+
);
155+
156+
boolean completed = latch.await(5, TimeUnit.SECONDS);
157+
assertTrue(
158+
completed,
159+
"onProviderConfigurationChanged was not be invoked for a client with domain 'domain'"
160+
);
161+
}
118162
}

0 commit comments

Comments
 (0)