public void FlagValueChangeListener() { var flagKey = "important-flag"; var user = User.WithKey("important-user"); var otherUser = User.WithKey("unimportant-user"); var store = new InMemoryDataStore(); var dataSourceUpdates = TestUtils.BasicDataSourceUpdates(store, testLogger); var resultMap = new Dictionary <KeyValuePair <string, User>, LdValue>(); var tracker = new FlagTrackerImpl(dataSourceUpdates, (key, u) => resultMap[new KeyValuePair <string, User>(key, u)]); resultMap[new KeyValuePair <string, User>(flagKey, user)] = LdValue.Of(false); resultMap[new KeyValuePair <string, User>(flagKey, otherUser)] = LdValue.Of(false); var eventSink1 = new EventSink <FlagValueChangeEvent>(); var eventSink2 = new EventSink <FlagValueChangeEvent>(); var eventSink3 = new EventSink <FlagValueChangeEvent>(); var listener1 = tracker.FlagValueChangeHandler(flagKey, user, eventSink1.Add); var listener2 = tracker.FlagValueChangeHandler(flagKey, user, eventSink2.Add); var listener3 = tracker.FlagValueChangeHandler(flagKey, otherUser, eventSink3.Add); tracker.FlagChanged += listener1; tracker.FlagChanged += listener2; tracker.FlagChanged -= listener2; // just verifying that removing a listener works tracker.FlagChanged += listener3; eventSink1.ExpectNoValue(); eventSink2.ExpectNoValue(); eventSink3.ExpectNoValue(); // make the flag true for the first user only, and broadcast a flag change event resultMap[new KeyValuePair <string, User>(flagKey, user)] = LdValue.Of(true); var flagV1 = new FeatureFlagBuilder(flagKey).Version(1).Build(); dataSourceUpdates.Upsert(DataModel.Features, flagKey, DescriptorOf(flagV1)); // eventSink1 receives a value change event var event1 = eventSink1.ExpectValue(); Assert.Equal(flagKey, event1.Key); Assert.Equal(LdValue.Of(false), event1.OldValue); Assert.Equal(LdValue.Of(true), event1.NewValue); eventSink1.ExpectNoValue(); // eventSink2 doesn't receive one, because it was unregistered eventSink2.ExpectNoValue(); // eventSink3 doesn't receive one, because the flag's value hasn't changed for otherUser eventSink3.ExpectNoValue(); }
public void FlagChangeListeners() { var flagKey = "flagKey"; var store = new InMemoryDataStore(); var dataSourceUpdates = TestUtils.BasicDataSourceUpdates(store, testLogger); var tracker = new FlagTrackerImpl(dataSourceUpdates, null); var eventSink1 = new EventSink <FlagChangeEvent>(); var eventSink2 = new EventSink <FlagChangeEvent>(); EventHandler <FlagChangeEvent> listener1 = eventSink1.Add; EventHandler <FlagChangeEvent> listener2 = eventSink2.Add; tracker.FlagChanged += listener1; tracker.FlagChanged += listener2; eventSink1.ExpectNoValue(); eventSink2.ExpectNoValue(); var flagV1 = new FeatureFlagBuilder(flagKey).Version(1).Build(); dataSourceUpdates.Upsert(DataModel.Features, flagKey, DescriptorOf(flagV1)); var event1 = eventSink1.ExpectValue(); var event2 = eventSink2.ExpectValue(); Assert.Equal(flagKey, event1.Key); Assert.Equal(flagKey, event2.Key); eventSink1.ExpectNoValue(); eventSink2.ExpectNoValue(); tracker.FlagChanged -= listener2; var flagV2 = new FeatureFlagBuilder(flagKey).Version(2).Build(); dataSourceUpdates.Upsert(DataModel.Features, flagKey, DescriptorOf(flagV2)); var event3 = eventSink1.ExpectValue(); Assert.Equal(flagKey, event3.Key); eventSink2.ExpectNoValue(); }