Skip to content

Commit 7ab4650

Browse files
rashidspmjc1283
authored andcommitted
feat(eventProcessor): Incorporate batch processing into OptimizelyFactory. (#198)
Summary: - Incorporate BatchEventProcessor with OptimizelyFactory. Test plan: - Added unit tests
1 parent 31e93c7 commit 7ab4650

File tree

2 files changed

+125
-1
lines changed

2 files changed

+125
-1
lines changed

lib/optimizely/optimizely_factory.rb

Lines changed: 60 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,56 @@
1717
#
1818

1919
require 'optimizely'
20+
require 'optimizely/event_dispatcher'
21+
require 'optimizely/event/batch_event_processor'
2022
module Optimizely
2123
class OptimizelyFactory
24+
attr_reader :max_event_batch_size, :max_event_flush_interval
25+
26+
# Convenience method for setting the maximum number of events contained within a batch.
27+
# @param batch_size Integer - Sets size of EventQueue.
28+
# @param logger - Optional LoggerInterface Provides a log method to log messages.
29+
def self.max_event_batch_size(batch_size, logger)
30+
unless batch_size.is_a? Integer
31+
logger.log(
32+
Logger::ERROR,
33+
"Batch size is invalid, setting to default batch size #{BatchEventProcessor::DEFAULT_BATCH_SIZE}."
34+
)
35+
return
36+
end
37+
38+
unless batch_size.positive?
39+
logger.log(
40+
Logger::ERROR,
41+
"Batch size is negative, setting to default batch size #{BatchEventProcessor::DEFAULT_BATCH_SIZE}."
42+
)
43+
return
44+
end
45+
@max_event_batch_size = batch_size
46+
end
47+
48+
# Convenience method for setting the maximum time interval in milliseconds between event dispatches.
49+
# @param flush_interval Numeric - Time interval between event dispatches.
50+
# @param logger - Optional LoggerInterface Provides a log method to log messages.
51+
def self.max_event_flush_interval(flush_interval, logger)
52+
unless flush_interval.is_a? Numeric
53+
logger.log(
54+
Logger::ERROR,
55+
"Flush interval is invalid, setting to default flush interval #{BatchEventProcessor::DEFAULT_BATCH_INTERVAL}."
56+
)
57+
return
58+
end
59+
60+
unless flush_interval.positive?
61+
logger.log(
62+
Logger::ERROR,
63+
"Flush interval is negative, setting to default flush interval #{BatchEventProcessor::DEFAULT_BATCH_INTERVAL}."
64+
)
65+
return
66+
end
67+
@max_event_flush_interval = flush_interval
68+
end
69+
2270
# Returns a new optimizely instance.
2371
#
2472
# @params sdk_key - Required String uniquely identifying the fallback datafile corresponding to project.
@@ -46,6 +94,9 @@ def self.default_instance_with_config_manager(config_manager)
4694
# @param user_profile_service - Optional UserProfileServiceInterface Provides methods to store and retreive user profiles.
4795
# @param config_manager - Optional ConfigManagerInterface Responds to get_config.
4896
# @param notification_center - Optional Instance of NotificationCenter.
97+
#
98+
# if @max_event_batch_size and @max_event_flush_interval are nil then default batchsize and flush_interval
99+
# will be used to setup batchEventProcessor.
49100
def self.custom_instance(
50101
sdk_key,
51102
datafile = nil,
@@ -57,6 +108,13 @@ def self.custom_instance(
57108
config_manager = nil,
58109
notification_center = nil
59110
)
111+
event_processor = BatchEventProcessor.new(
112+
event_dispatcher: event_dispatcher || EventDispatcher.new,
113+
batch_size: @max_event_batch_size,
114+
flush_interval: @max_event_flush_interval,
115+
notification_center: notification_center
116+
)
117+
60118
Optimizely::Project.new(
61119
datafile,
62120
event_dispatcher,
@@ -66,7 +124,8 @@ def self.custom_instance(
66124
user_profile_service,
67125
sdk_key,
68126
config_manager,
69-
notification_center
127+
notification_center,
128+
event_processor
70129
)
71130
end
72131
end

spec/optimizely_factory_spec.rb

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,5 +86,70 @@ def get_config; end
8686
)
8787
expect(optimizely_instance.config_manager). to eq(http_project_config_manager)
8888
end
89+
90+
it 'should take event processor when flush interval and batch size are set' do
91+
Optimizely::OptimizelyFactory.max_event_flush_interval(5, spy_logger)
92+
Optimizely::OptimizelyFactory.max_event_batch_size(100, spy_logger)
93+
94+
event_processor = Optimizely::BatchEventProcessor.new(
95+
event_dispatcher: event_dispatcher,
96+
batch_size: 100,
97+
flush_interval: 5,
98+
notification_center: notification_center
99+
)
100+
101+
optimizely_instance = Optimizely::OptimizelyFactory.custom_instance(
102+
'sdk_key',
103+
datafile,
104+
event_dispatcher,
105+
spy_logger,
106+
error_handler,
107+
false,
108+
user_profile_service,
109+
nil,
110+
notification_center
111+
)
112+
113+
expect(optimizely_instance.event_processor).equal? event_processor
114+
optimizely_instance.close
115+
end
116+
end
117+
118+
describe '.max_event_batch_size' do
119+
it 'should log error message and return nil when invalid batch size provided' do
120+
expect(Optimizely::OptimizelyFactory.max_event_batch_size([], spy_logger)). to eq(nil)
121+
expect(Optimizely::OptimizelyFactory.max_event_batch_size(true, spy_logger)). to eq(nil)
122+
expect(Optimizely::OptimizelyFactory.max_event_batch_size('test', spy_logger)). to eq(nil)
123+
expect(Optimizely::OptimizelyFactory.max_event_batch_size(5.2, spy_logger)). to eq(nil)
124+
expect(Optimizely::OptimizelyFactory.max_event_batch_size(nil, spy_logger)). to eq(nil)
125+
expect(spy_logger).to have_received(:log).with(Logger::ERROR, 'Batch size is invalid, setting to default batch size 10.').exactly(5).times
126+
expect(Optimizely::OptimizelyFactory.max_event_batch_size(0, spy_logger)). to eq(nil)
127+
expect(Optimizely::OptimizelyFactory.max_event_batch_size(-2, spy_logger)). to eq(nil)
128+
expect(spy_logger).to have_received(:log).with(Logger::ERROR, 'Batch size is negative, setting to default batch size 10.').twice
129+
end
130+
131+
it 'should not log error and return batch size and when valid batch size provided' do
132+
expect(Optimizely::OptimizelyFactory.max_event_batch_size(5, spy_logger)). to eq(5)
133+
expect(spy_logger).not_to have_received(:log)
134+
end
135+
end
136+
137+
describe '.max_event_flush_interval' do
138+
it 'should log error message and return nil when invalid flush interval provided' do
139+
expect(Optimizely::OptimizelyFactory.max_event_flush_interval([], spy_logger)). to eq(nil)
140+
expect(Optimizely::OptimizelyFactory.max_event_flush_interval(true, spy_logger)). to eq(nil)
141+
expect(Optimizely::OptimizelyFactory.max_event_flush_interval('test', spy_logger)). to eq(nil)
142+
expect(Optimizely::OptimizelyFactory.max_event_flush_interval(nil, spy_logger)). to eq(nil)
143+
expect(spy_logger).to have_received(:log).with(Logger::ERROR, 'Flush interval is invalid, setting to default flush interval 30000.').exactly(4).times
144+
expect(Optimizely::OptimizelyFactory.max_event_flush_interval(0, spy_logger)). to eq(nil)
145+
expect(Optimizely::OptimizelyFactory.max_event_flush_interval(-2, spy_logger)). to eq(nil)
146+
expect(spy_logger).to have_received(:log).with(Logger::ERROR, 'Flush interval is negative, setting to default flush interval 30000.').twice
147+
end
148+
149+
it 'should not log error and return batch size and when valid flush interval provided' do
150+
expect(Optimizely::OptimizelyFactory.max_event_flush_interval(5, spy_logger)). to eq(5)
151+
expect(Optimizely::OptimizelyFactory.max_event_flush_interval(5.5, spy_logger)). to eq(5.5)
152+
expect(spy_logger).not_to have_received(:log)
153+
end
89154
end
90155
end

0 commit comments

Comments
 (0)