Skip to content

Commit 58cb0b9

Browse files
committed
updated factory and split_client with integration tests
1 parent 37fd6f3 commit 58cb0b9

8 files changed

Lines changed: 107 additions & 12 deletions

File tree

lib/splitclient-rb.rb

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,7 @@
7070
require 'splitclient-rb/engine/events/events_manager.rb'
7171
require 'splitclient-rb/engine/events/events_task.rb'
7272
require 'splitclient-rb/engine/events/events_delivery.rb'
73+
require 'splitclient-rb/engine/events/noop_events_queue.rb'
7374
require 'splitclient-rb/engine/parser/condition'
7475
require 'splitclient-rb/engine/parser/partition'
7576
require 'splitclient-rb/engine/parser/evaluator'

lib/splitclient-rb/clients/split_client.rb

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ class SplitClient
1818
# @param sdk_key [String] the SDK key for your split account
1919
#
2020
# @return [SplitIoClient] split.io client instance
21-
def initialize(sdk_key, repositories, status_manager, config, impressions_manager, telemetry_evaluation_producer, evaluator, split_validator, fallback_treatment_calculator)
21+
def initialize(sdk_key, repositories, status_manager, config, impressions_manager, telemetry_evaluation_producer, evaluator, split_validator, fallback_treatment_calculator, events_manager)
2222
@api_key = sdk_key
2323
@splits_repository = repositories[:splits]
2424
@segments_repository = repositories[:segments]
@@ -33,6 +33,7 @@ def initialize(sdk_key, repositories, status_manager, config, impressions_manage
3333
@split_validator = split_validator
3434
@evaluator = evaluator
3535
@fallback_treatment_calculator = fallback_treatment_calculator
36+
@events_manager = events_manager
3637
end
3738

3839
def get_treatment(
@@ -176,6 +177,14 @@ def block_until_ready(time = nil)
176177
@status_manager.wait_until_ready(time) if @status_manager
177178
end
178179

180+
def register(sdk_event, handler)
181+
@events_manager.register(sdk_event, handler)
182+
end
183+
184+
def unregister(sdk_event, handler)
185+
@events_manager.unregister(sdk_event)
186+
end
187+
179188
private
180189

181190
def check_properties_size(properties_size, msg = "Event not queued")

lib/splitclient-rb/engine/api/faraday_middleware/gzip.rb

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
# frozen_string_literal: true
22

33
require 'faraday'
4+
require 'stringio'
45

56
module SplitIoClient
67
module FaradayMiddleware

lib/splitclient-rb/engine/events/events_manager.rb

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ def initialize(events_manager_config, events_delivery, config)
1414
end
1515

1616
def register(sdk_event, event_handler)
17-
return unless !@active_subscriptions.key?(sdk_event) || get_event_handler(sdk_event).nil?
17+
return if @active_subscriptions.key?(sdk_event) && !get_event_handler(sdk_event).nil?
1818

1919
@mutex.synchronize do
2020
# SDK ready already fired
@@ -25,6 +25,7 @@ def register(sdk_event, event_handler)
2525
return
2626
end
2727

28+
@config.logger.debug("EventsManager: Register event: #{sdk_event}") if @config.debug_enabled
2829
@active_subscriptions[sdk_event] = SplitIoClient::Engine::Models::EventActiveSubscriptions.new(false, event_handler)
2930
end
3031
end
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
# frozen_string_literal: true
2+
3+
module SplitIoClient
4+
module Engine
5+
module Events
6+
class NoOpEventsQueue
7+
def push(sdk_event)
8+
# do nothing
9+
end
10+
end
11+
end
12+
end
13+
end

lib/splitclient-rb/split_factory.rb

Lines changed: 20 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ def initialize(api_key, config_hash = {})
4545

4646
register_factory
4747

48+
build_events_manager
4849
build_telemetry_components
4950
build_flag_sets_filter
5051
build_repositories
@@ -53,13 +54,13 @@ def initialize(api_key, config_hash = {})
5354
build_unique_keys_tracker
5455
build_impressions_components
5556

56-
@status_manager = Engine::StatusManager.new(@config)
57+
@status_manager = Engine::StatusManager.new(@config, @internal_events_queue)
5758
@split_validator = SplitIoClient::Validators.new(@config)
5859
@evaluator = Engine::Parser::Evaluator.new(@segments_repository, @splits_repository, @rule_based_segment_repository, @config)
5960

6061
start!
6162
fallback_treatment_calculator = SplitIoClient::Engine::FallbackTreatmentCalculator.new(@config.fallback_treatments_configuration)
62-
@client = SplitClient.new(@api_key, repositories, @status_manager, @config, @impressions_manager, @evaluation_producer, @evaluator, @split_validator, fallback_treatment_calculator)
63+
@client = SplitClient.new(@api_key, repositories, @status_manager, @config, @impressions_manager, @evaluation_producer, @evaluator, @split_validator, fallback_treatment_calculator, @events_manager)
6364
@manager = SplitManager.new(@splits_repository, @status_manager, @config)
6465
end
6566

@@ -219,9 +220,9 @@ def build_repositories
219220
else
220221
@flag_sets_repository = SplitIoClient::Cache::Repositories::MemoryFlagSetsRepository.new(@config.flag_sets_filter)
221222
end
222-
@splits_repository = SplitsRepository.new(@config, @flag_sets_repository, @flag_sets_filter)
223-
@segments_repository = SegmentsRepository.new(@config)
224-
@rule_based_segment_repository = RuleBasedSegmentsRepository.new(@config)
223+
@splits_repository = SplitsRepository.new(@config, @flag_sets_repository, @flag_sets_filter, @internal_events_queue)
224+
@segments_repository = SegmentsRepository.new(@config, @internal_events_queue)
225+
@rule_based_segment_repository = RuleBasedSegmentsRepository.new(@config, @internal_events_queue)
225226
@impressions_repository = ImpressionsRepository.new(@config)
226227
@events_repository = EventsRepository.new(@config, @api_key, @runtime_producer)
227228
end
@@ -265,5 +266,19 @@ def build_impressions_components
265266
def build_flag_sets_filter
266267
@flag_sets_filter = SplitIoClient::Cache::Filter::FlagSetsFilter.new(@config.flag_sets_filter)
267268
end
269+
270+
def build_events_manager
271+
@events_manager = Engine::Events::EventsManager.new(Engine::Events::EventsManagerConfig.new,
272+
Engine::Events::EventsDelivery.new(@config),
273+
@config)
274+
if @config.consumer?
275+
@internal_events_queue = Engine::Events::NoOpEventsQueue.new
276+
return
277+
end
278+
279+
@internal_events_queue = Queue.new
280+
@events_task = Engine::Events::EventsTask.new(@events_manager.method(:notify_internal_event), @internal_events_queue, @config)
281+
@events_task.start
282+
end
268283
end
269284
end

lib/splitclient-rb/version.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
module SplitIoClient
2-
VERSION = '8.10.1'
2+
VERSION = '8.11.0'
33
end

spec/integrations/push_client_spec.rb

Lines changed: 59 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,9 @@
3939
let(:auth_body_response) do
4040
File.read(File.join(SplitIoClient.root, 'spec/test_data/integrations/auth_body_response.json'))
4141
end
42+
let(:metadata) { nil }
43+
let(:event_ready) { false }
44+
let(:sdk_update) { false }
4245

4346
before do
4447
stub_request(:any, /https:\/\/events.*/).to_return(status: 200, body: '')
@@ -155,29 +158,51 @@
155158
stub_request(:get, auth_service_url + "?s=1.3").to_return(status: 200, body: auth_body_response)
156159

157160
mock_server do |server|
158-
161+
log = StringIO.new
159162
streaming_service_url = server.base_uri
160163
factory = SplitIoClient::SplitFactory.new(
161164
'test_api_key',
162165
streaming_service_url: streaming_service_url,
163-
auth_service_url: auth_service_url
166+
auth_service_url: auth_service_url,
167+
logger: Logger.new(log),
168+
debug_enabled: true
164169
)
165170

171+
reset_flags
166172
client = factory.client
173+
client.register(SplitIoClient::Engine::Models::SdkEvent::SDK_READY, method(:ready_call_back))
174+
client.register(SplitIoClient::Engine::Models::SdkEvent::SDK_UPDATE, method(:update_call_back))
167175
client.block_until_ready
168176

169177
server.setup_response('/') do |_, res|
170178
send_content(res, event_split_iff_update_no_compression)
171179
end
172-
173180
treatment = 'control'
174181
for i in 1..10 do
175182
sleep(1)
176183
treatment = client.get_treatment('admin', 'bilal_split')
177184
break if treatment != 'control'
178185
end
179186

187+
expect(@metadata.length).to eq(2)
188+
check1 = false
189+
check2 = false
190+
@metadata.each do |meta|
191+
if meta.type == SplitIoClient::Engine::Models::SdkEventType::FLAG_UPDATE
192+
expect(meta.names).to eq(['bilal_split'])
193+
check1 = true
194+
end
195+
if meta.type == SplitIoClient::Engine::Models::SdkEventType::SEGMENTS_UPDATE
196+
expect(meta.names).to eq([])
197+
check2 = true
198+
end
199+
end
200+
expect(check1).to be(true)
201+
expect(check2).to be(true)
202+
expect(@event_ready).to be(true)
203+
expect(@sdk_update).to eq(true)
180204
expect(treatment).to eq('off')
205+
181206
client.destroy
182207
end
183208
end
@@ -319,20 +344,35 @@
319344
stub_request(:get, auth_service_url + "?s=1.3").to_return(status: 200, body: auth_body_response)
320345

321346
streaming_service_url = server.base_uri
347+
log = StringIO.new
322348
factory = SplitIoClient::SplitFactory.new(
323349
'test_api_key',
324350
streaming_enabled: true,
325351
streaming_service_url: streaming_service_url,
326-
auth_service_url: auth_service_url
352+
auth_service_url: auth_service_url,
353+
logger: Logger.new(log),
354+
debug_enabled: true
327355
)
328356

357+
reset_flags
329358
client = factory.client
359+
client.register(SplitIoClient::Engine::Models::SdkEvent::SDK_UPDATE, method(:update_call_back))
330360
client.block_until_ready(1)
331361
sleep(2)
332362
expect(client.get_treatment('admin', 'push_test')).to eq('on')
333363
expect(a_request(:get, 'https://sdk.split.io/api/splitChanges?s=1.3&since=-1&rbSince=-1')).to have_been_made.times(1)
334364
expect(a_request(:get, 'https://sdk.split.io/api/splitChanges?s=1.3&since=1585948850109&rbSince=-1')).to have_been_made.times(1)
335365
expect(a_request(:get, 'https://sdk.split.io/api/splitChanges?s=1.3&since=1585948850110&rbSince=-1')).to have_been_made.times(0)
366+
367+
check1 = false
368+
@metadata.each do |meta|
369+
if meta.type == SplitIoClient::Engine::Models::SdkEventType::FLAG_UPDATE
370+
expect(meta.names.include?('push_test')).to eq(true)
371+
check1 = true
372+
end
373+
end
374+
expect(check1).to eq(true)
375+
336376
client.destroy
337377
end
338378
end
@@ -572,4 +612,19 @@ def mock_segment_changes(segment_name, segment_json, since)
572612
stub_request(:get, "https://sdk.split.io/api/segmentChanges/#{segment_name}?since=#{since}")
573613
.to_return(status: 200, body: segment_json)
574614
end
615+
616+
def ready_call_back(metadata)
617+
@event_ready = true
618+
end
619+
620+
def update_call_back(metadata)
621+
@sdk_update = true
622+
@metadata.push(metadata)
623+
end
624+
625+
def reset_flags
626+
@event_ready = false
627+
@sdk_update = false
628+
@metadata = []
629+
end
575630
end

0 commit comments

Comments
 (0)