Skip to content

Commit 394b9fc

Browse files
committed
added events delivery and tests
1 parent 55e477a commit 394b9fc

6 files changed

Lines changed: 234 additions & 10 deletions

File tree

lib/splitclient-rb.rb

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,7 @@
6969
require 'splitclient-rb/engine/events/events_manager_config.rb'
7070
require 'splitclient-rb/engine/events/events_manager.rb'
7171
require 'splitclient-rb/engine/events/events_task.rb'
72+
require 'splitclient-rb/engine/events/events_delivery.rb'
7273
require 'splitclient-rb/engine/parser/condition'
7374
require 'splitclient-rb/engine/parser/partition'
7475
require 'splitclient-rb/engine/parser/evaluator'
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
# frozen_string_literal: true
2+
3+
module SplitIoClient
4+
module Engine
5+
module Events
6+
class EventsDelivery
7+
8+
def initialize(config)
9+
@config = config
10+
end
11+
12+
def deliver(sdk_event, event_metadata, event_handler)
13+
begin
14+
event_handler.call(event_metadata)
15+
rescue StandardError => e
16+
@config.logger.error("Exception when calling handler for Sdk Event #{sdk_event}")
17+
@config.log_found_exception(__method__.to_s, e)
18+
end
19+
end
20+
end
21+
end
22+
end
23+
end

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

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,8 @@ module SplitIoClient
44
module Engine
55
module Events
66
class EventsManager
7-
def initialize(events_configurations, events_delivery, config)
8-
@events_configurations = events_configurations
7+
def initialize(events_manager_config, events_delivery, config)
8+
@manager_config = events_manager_config
99
@events_delivery = events_delivery
1010
@active_subscriptions = {}
1111
@internal_events_status = {}
@@ -18,7 +18,7 @@ def register(sdk_event, event_handler)
1818

1919
@mutex.synchronize do
2020
# SDK ready already fired
21-
if sdk_event == SdkEvent.SDK_READY && event_already_triggered(sdk_event)
21+
if sdk_event == SplitIoClient::Engine::Models::SdkEvent::SDK_READY && event_already_triggered(sdk_event)
2222
@active_subscriptions[sdk_event] = SplitIoClient::Engine::Models::EventActiveSubscriptions.new(true, event_handler)
2323
@config.logger.debug('EventsManager: Firing SDK_READY event for new subscription') if @config.debug_enabled
2424
fire_sdk_event(sdk_event, nil)
@@ -49,7 +49,7 @@ def notify_internal_event(sdk_internal_event, event_metadata)
4949
# if client is not subscribed to SDK_READY
5050
if sorted_event == SplitIoClient::Engine::Models::SdkEvent::SDK_READY && get_event_handler(sorted_event).nil?
5151
@config.logger.debug('EventsManager: Registering SDK_READY event as fired') if @config.debug_enabled
52-
@active_subscriptions[Engine::Models::SdkEvent::SDK_READY] = Engine::Models::EventActiveSubscriptions.new(true, None)
52+
@active_subscriptions[Engine::Models::SdkEvent::SDK_READY] = Engine::Models::EventActiveSubscriptions.new(true, nil)
5353
end
5454
end
5555
end
@@ -103,7 +103,7 @@ def get_event_handler(sdk_event)
103103
end
104104

105105
def get_sdk_event_if_applicable(sdk_internal_event)
106-
final_sdk_event = SplitIoClient::Engine::Models::ValidSdkEvent.new(None, false)
106+
final_sdk_event = SplitIoClient::Engine::Models::ValidSdkEvent.new(nil, false)
107107

108108
events_to_fire = []
109109
require_any_sdk_event = check_require_any(sdk_internal_event)
@@ -141,7 +141,7 @@ def check_event_eligible_conditions(final_status, require_name, require_value)
141141
((!event_already_triggered(require_name) &&
142142
execution_limit(require_name) == 1) ||
143143
execution_limit(require_name) == -1) &&
144-
len(require_value).positive?
144+
require_value.length.positive?
145145
end
146146

147147
def check_prerequisites(sdk_event)
@@ -165,13 +165,13 @@ def check_suppressed_by(sdk_event)
165165
end
166166

167167
def execution_limit(sdk_event)
168-
return -1 if @manager_config.execution_limits.key?(sdk_event)
168+
return -1 unless @manager_config.execution_limits.key?(sdk_event)
169169

170170
@manager_config.execution_limits[sdk_event]
171171
end
172172

173173
def check_require_any(sdk_internal_event)
174-
valid_sdk_event = SplitIoClient::Engine::Models::ValidSdkEvent.new(None, false)
174+
valid_sdk_event = SplitIoClient::Engine::Models::ValidSdkEvent.new(nil, false)
175175
@manager_config.require_any.each do |name, val|
176176
if val.include?(sdk_internal_event)
177177
valid_sdk_event = SplitIoClient::Engine::Models::ValidSdkEvent.new(name, true)

lib/splitclient-rb/engine/models/event_active_subscriptions.rb

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@
22

33
module SplitIoClient
44
module Engine::Models
5-
class EventsActiveSubscriptions
6-
attr_reader :triggered, :handler
5+
class EventActiveSubscriptions
6+
attr_accessor :triggered, :handler
77

88
def initialize(triggered, handler)
99
@triggered = triggered
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
# frozen_string_literal: true
2+
3+
require 'spec_helper'
4+
5+
describe SplitIoClient::Engine::Events::EventsDelivery do
6+
subject { SplitIoClient::Engine::Events::EventsDelivery }
7+
let(:metadata) { nil }
8+
9+
it 'test calling handler' do
10+
config = SplitIoClient::SplitConfig.new(logger: Logger.new(StringIO.new))
11+
delivery = subject.new(config)
12+
13+
delivery.deliver(SplitIoClient::Engine::Models::SdkInternalEvent::FLAGS_UPDATED,
14+
SplitIoClient::Engine::Models::EventsMetadata.new(SplitIoClient::Engine::Models::SdkEventType::FLAG_UPDATE),
15+
method(:call_back)
16+
)
17+
sleep 0.5
18+
expect(@metadata.type).to be(SplitIoClient::Engine::Models::SdkEventType::FLAG_UPDATE)
19+
end
20+
21+
it 'test exception when calling handler' do
22+
log = StringIO.new
23+
config = SplitIoClient::SplitConfig.new(logger: Logger.new(log))
24+
delivery = subject.new(config)
25+
26+
delivery.deliver(SplitIoClient::Engine::Models::SdkInternalEvent::FLAGS_UPDATED,
27+
SplitIoClient::Engine::Models::EventsMetadata.new(SplitIoClient::Engine::Models::SdkEventType::FLAG_UPDATE),
28+
method(:call_with_exception)
29+
)
30+
sleep 0.5
31+
expect(log.string).to include 'Exception when calling handler for Sdk Event' \
32+
end
33+
34+
def call_back(metadata)
35+
@metadata = metadata
36+
end
37+
38+
def call_with_exception(metadata)
39+
raise StandardError("call exception")
40+
end
41+
end
Lines changed: 159 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,159 @@
1+
# frozen_string_literal: true
2+
3+
require 'spec_helper'
4+
5+
describe SplitIoClient::Engine::Events::EventsManager do
6+
subject { SplitIoClient::Engine::Events::EventsManager }
7+
let(:metadata) { nil }
8+
let(:sdk_ready) { false }
9+
let(:sdk_update) { false }
10+
let(:first_event) { nil }
11+
12+
13+
it 'test_firing_events' do
14+
config = SplitIoClient::SplitConfig.new(logger: Logger.new(StringIO.new))
15+
manager = subject.new(SplitIoClient::Engine::Events::EventsManagerConfig.new,
16+
SplitIoClient::Engine::Events::EventsDelivery.new(config),
17+
config)
18+
manager.register(SplitIoClient::Engine::Models::SdkEvent::SDK_READY, method(:ready_call_back))
19+
manager.register(SplitIoClient::Engine::Models::SdkEvent::SDK_UPDATE, method(:update_call_back))
20+
meta = SplitIoClient::Engine::Models::EventsMetadata.new(SplitIoClient::Engine::Models::SdkEventType::FLAG_UPDATE, ["feature1"])
21+
22+
reset_flags
23+
manager.notify_internal_event(SplitIoClient::Engine::Models::SdkInternalEvent::SDK_READY, nil)
24+
sleep 0.5
25+
expect(@metadata).to be(nil)
26+
expect(@sdk_ready).to be(true)
27+
expect(@sdk_update).to be(false)
28+
29+
reset_flags
30+
manager.notify_internal_event(SplitIoClient::Engine::Models::SdkInternalEvent::FLAGS_UPDATED, meta)
31+
sleep 0.5
32+
expect(@metadata).to eq(meta)
33+
expect(@sdk_update).to be(true)
34+
expect(@sdk_ready).to be(false)
35+
36+
reset_flags
37+
manager.notify_internal_event(SplitIoClient::Engine::Models::SdkInternalEvent::FLAG_KILLED_NOTIFICATION, meta)
38+
sleep 0.5
39+
expect(@metadata).to eq(meta)
40+
expect(@sdk_update).to be(true)
41+
expect(@sdk_ready).to be(false)
42+
43+
reset_flags
44+
manager.notify_internal_event(SplitIoClient::Engine::Models::SdkInternalEvent::SEGMENTS_UPDATED, meta)
45+
sleep 0.5
46+
expect(@metadata).to eq(meta)
47+
expect(@sdk_update).to be(true)
48+
expect(@sdk_ready).to be(false)
49+
50+
reset_flags
51+
manager.notify_internal_event(SplitIoClient::Engine::Models::SdkInternalEvent::RB_SEGMENTS_UPDATED, meta)
52+
sleep 0.5
53+
expect(@metadata).to eq(meta)
54+
expect(@sdk_update).to be(true)
55+
expect(@sdk_ready).to be(false)
56+
end
57+
58+
it 'events fire only after register' do
59+
config = SplitIoClient::SplitConfig.new(logger: Logger.new(StringIO.new))
60+
manager = subject.new(SplitIoClient::Engine::Events::EventsManagerConfig.new,
61+
SplitIoClient::Engine::Events::EventsDelivery.new(config),
62+
config)
63+
meta = SplitIoClient::Engine::Models::EventsMetadata.new(SplitIoClient::Engine::Models::SdkEventType::FLAG_UPDATE, ["feature1"])
64+
65+
reset_flags
66+
manager.notify_internal_event(SplitIoClient::Engine::Models::SdkInternalEvent::SDK_READY, nil)
67+
sleep 0.5
68+
expect(@metadata).to be(nil)
69+
expect(@sdk_ready).to be(false)
70+
expect(@sdk_update).to be(false)
71+
72+
manager.register(SplitIoClient::Engine::Models::SdkEvent::SDK_READY, method(:ready_call_back))
73+
manager.notify_internal_event(SplitIoClient::Engine::Models::SdkInternalEvent::SDK_READY, nil)
74+
sleep 0.5
75+
expect(@metadata).to be(nil)
76+
expect(@sdk_ready).to be(true)
77+
expect(@sdk_update).to be(false)
78+
79+
reset_flags
80+
manager.notify_internal_event(SplitIoClient::Engine::Models::SdkInternalEvent::FLAGS_UPDATED, meta)
81+
sleep 0.5
82+
expect(@metadata).to eq(nil)
83+
expect(@sdk_update).to be(false)
84+
expect(@sdk_ready).to be(false)
85+
86+
manager.register(SplitIoClient::Engine::Models::SdkEvent::SDK_UPDATE, method(:update_call_back))
87+
manager.notify_internal_event(SplitIoClient::Engine::Models::SdkInternalEvent::FLAGS_UPDATED, meta)
88+
sleep 0.5
89+
expect(@metadata).to eq(meta)
90+
expect(@sdk_update).to be(true)
91+
expect(@sdk_ready).to be(false)
92+
end
93+
94+
it 'update fires only after ready events' do
95+
config = SplitIoClient::SplitConfig.new(logger: Logger.new(StringIO.new))
96+
manager = subject.new(SplitIoClient::Engine::Events::EventsManagerConfig.new,
97+
SplitIoClient::Engine::Events::EventsDelivery.new(config),
98+
config)
99+
manager.register(SplitIoClient::Engine::Models::SdkEvent::SDK_READY, method(:ready_call_back))
100+
manager.register(SplitIoClient::Engine::Models::SdkEvent::SDK_UPDATE, method(:update_call_back))
101+
meta = SplitIoClient::Engine::Models::EventsMetadata.new(SplitIoClient::Engine::Models::SdkEventType::FLAG_UPDATE, ["feature1"])
102+
103+
reset_flags
104+
manager.notify_internal_event(SplitIoClient::Engine::Models::SdkInternalEvent::FLAGS_UPDATED, meta)
105+
sleep 0.5
106+
expect(@metadata).to eq(nil)
107+
expect(@sdk_update).to be(false)
108+
expect(@sdk_ready).to be(false)
109+
110+
reset_flags
111+
manager.notify_internal_event(SplitIoClient::Engine::Models::SdkInternalEvent::SDK_READY, nil)
112+
sleep 0.5
113+
expect(@metadata).to be(nil)
114+
expect(@sdk_ready).to be(true)
115+
expect(@sdk_update).to be(false)
116+
117+
reset_flags
118+
manager.notify_internal_event(SplitIoClient::Engine::Models::SdkInternalEvent::FLAGS_UPDATED, meta)
119+
sleep 0.5
120+
expect(@metadata).to eq(meta)
121+
expect(@sdk_update).to be(true)
122+
expect(@sdk_ready).to be(false)
123+
end
124+
125+
it 'event ordered correctly' do
126+
config = SplitIoClient::SplitConfig.new(logger: Logger.new(StringIO.new))
127+
manager = subject.new(SplitIoClient::Engine::Events::EventsManagerConfig.new,
128+
SplitIoClient::Engine::Events::EventsDelivery.new(config),
129+
config)
130+
manager.register(SplitIoClient::Engine::Models::SdkEvent::SDK_READY, method(:ready_call_back))
131+
manager.register(SplitIoClient::Engine::Models::SdkEvent::SDK_UPDATE, method(:update_call_back))
132+
meta = SplitIoClient::Engine::Models::EventsMetadata.new(SplitIoClient::Engine::Models::SdkEventType::FLAG_UPDATE, ["feature1"])
133+
134+
reset_flags
135+
@first_event = nil
136+
manager.notify_internal_event(SplitIoClient::Engine::Models::SdkInternalEvent::SDK_READY, nil)
137+
manager.notify_internal_event(SplitIoClient::Engine::Models::SdkInternalEvent::FLAGS_UPDATED, meta)
138+
sleep 0.5
139+
expect(@first_event).to be("ready")
140+
end
141+
142+
def ready_call_back(metadata)
143+
@sdk_ready = true
144+
@metadata = metadata
145+
@first_event = "ready" if @first_event.nil?
146+
end
147+
148+
def update_call_back(metadata)
149+
@sdk_update = true
150+
@metadata = metadata
151+
@first_event = "update" if @first_event.nil?
152+
end
153+
154+
def reset_flags
155+
@sdk_ready = false
156+
@sdk_update = false
157+
@metadata = nil
158+
end
159+
end

0 commit comments

Comments
 (0)