diff --git a/lib/ldclient-openfeature/provider.rb b/lib/ldclient-openfeature/provider.rb index 4ec1583..b4ea7fc 100644 --- a/lib/ldclient-openfeature/provider.rb +++ b/lib/ldclient-openfeature/provider.rb @@ -49,8 +49,11 @@ def initialize(sdk_key, config = LaunchDarkly::Config.default, wait_for_seconds @metadata = ::OpenFeature::SDK::Provider::ProviderMetadata.new(name: "launchdarkly-openfeature-server").freeze - @client.data_source_status_provider.add_listener(Impl::DataSourceStatusListener.new(self)) - @client.flag_tracker.add_listener(Impl::FlagChangeListener.new(self)) + @status_listener = Impl::DataSourceStatusListener.new(self) + @flag_change_listener = Impl::FlagChangeListener.new(self) + + @client.data_source_status_provider.add_listener(@status_listener) + @client.flag_tracker.add_listener(@flag_change_listener) end # @@ -116,6 +119,8 @@ def emit_status_event(event, **details) # @return [void] # def shutdown + @client.data_source_status_provider.remove_listener(@status_listener) + @client.flag_tracker.remove_listener(@flag_change_listener) @client.close end diff --git a/spec/provider_spec.rb b/spec/provider_spec.rb index 0a9b6f0..773e0a8 100644 --- a/spec/provider_spec.rb +++ b/spec/provider_spec.rb @@ -135,11 +135,15 @@ def data_source_status(state, error = nil) .with(OpenFeature::SDK::ProviderEvent::PROVIDER_STALE, hash_including(:message)) end - it "shutdown closes the client" do - allow(provider.client).to receive(:close) + it "shutdown unsubscribes the listeners and closes the client" do + status_provider = double(remove_listener: nil) + flag_tracker = double(remove_listener: nil) + allow(provider.client).to receive_messages(close: nil, data_source_status_provider: status_provider, flag_tracker: flag_tracker) provider.shutdown + expect(status_provider).to have_received(:remove_listener).with(instance_of(LaunchDarkly::OpenFeature::Impl::DataSourceStatusListener)) + expect(flag_tracker).to have_received(:remove_listener).with(instance_of(LaunchDarkly::OpenFeature::Impl::FlagChangeListener)) expect(provider.client).to have_received(:close) end