Skip to content

Commit 87a3f35

Browse files
authored
Merge pull request #133 from launchdarkly/eb/ch71287/broken-events
fix incorrect initialization of EventProcessor
2 parents b53a212 + 1fe77bb commit 87a3f35

File tree

6 files changed

+137
-15
lines changed

6 files changed

+137
-15
lines changed

lib/ldclient-rb/events.rb

+2-2
Original file line numberDiff line numberDiff line change
@@ -319,7 +319,7 @@ def trigger_flush(outbox, flush_workers)
319319
success = flush_workers.post do
320320
begin
321321
events_out = @formatter.make_output_events(payload.events, payload.summary)
322-
result = @event_sender.send_event_data(events_out.to_json, false)
322+
result = @event_sender.send_event_data(events_out.to_json, "#{events_out.length} events", false)
323323
@disabled.value = true if result.must_shutdown
324324
if !result.time_from_server.nil?
325325
@last_known_past_time.value = (result.time_from_server.to_f * 1000).to_i
@@ -348,7 +348,7 @@ def send_diagnostic_event(event, diagnostic_event_workers)
348348
uri = URI(@config.events_uri + "/diagnostic")
349349
diagnostic_event_workers.post do
350350
begin
351-
@event_sender.send_event_data(event.to_json, true)
351+
@event_sender.send_event_data(event.to_json, "diagnostic event", true)
352352
rescue => e
353353
Util.log_exception(@config.logger, "Unexpected error in event processor", e)
354354
end

lib/ldclient-rb/impl/event_sender.rb

+2-3
Original file line numberDiff line numberDiff line change
@@ -18,10 +18,9 @@ def initialize(sdk_key, config, http_client = nil, retry_interval = DEFAULT_RETR
1818
@retry_interval = retry_interval
1919
end
2020

21-
def send_event_data(event_data, is_diagnostic)
21+
def send_event_data(event_data, description, is_diagnostic)
2222
uri = is_diagnostic ? @diagnostic_uri : @events_uri
2323
payload_id = is_diagnostic ? nil : SecureRandom.uuid
24-
description = is_diagnostic ? 'diagnostic event' : "#{event_data.length} events"
2524
res = nil
2625
(0..1).each do |attempt|
2726
if attempt > 0
@@ -30,7 +29,7 @@ def send_event_data(event_data, is_diagnostic)
3029
end
3130
begin
3231
@client.start if !@client.started?
33-
@logger.debug { "[LDClient] sending #{description}: #{body}" }
32+
@logger.debug { "[LDClient] sending #{description}: #{event_data}" }
3433
req = Net::HTTP::Post.new(uri)
3534
req.content_type = "application/json"
3635
req.body = event_data

lib/ldclient-rb/ldclient.rb

+1-1
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ def initialize(sdk_key, config = Config.default, wait_for_sec = 5)
5656
if @config.offline? || !@config.send_events
5757
@event_processor = NullEventProcessor.new
5858
else
59-
@event_processor = EventProcessor.new(sdk_key, config, diagnostic_accumulator)
59+
@event_processor = EventProcessor.new(sdk_key, config, nil, diagnostic_accumulator)
6060
end
6161

6262
if @config.use_ldd?

spec/event_sender_spec.rb

+8-8
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ def with_sender_and_server
2727
with_sender_and_server do |es, server|
2828
server.setup_ok_response("/bulk", "")
2929

30-
result = es.send_event_data(fake_data, false)
30+
result = es.send_event_data(fake_data, "", false)
3131

3232
expect(result.success).to be true
3333
expect(result.must_shutdown).to be false
@@ -49,8 +49,8 @@ def with_sender_and_server
4949
with_sender_and_server do |es, server|
5050
server.setup_ok_response("/bulk", "")
5151

52-
result1 = es.send_event_data(fake_data, false)
53-
result2 = es.send_event_data(fake_data, false)
52+
result1 = es.send_event_data(fake_data, "", false)
53+
result2 = es.send_event_data(fake_data, "", false)
5454
expect(result1.success).to be true
5555
expect(result2.success).to be true
5656

@@ -66,7 +66,7 @@ def with_sender_and_server
6666
with_sender_and_server do |es, server|
6767
server.setup_ok_response("/diagnostic", "")
6868

69-
result = es.send_event_data(fake_data, true)
69+
result = es.send_event_data(fake_data, "", true)
7070

7171
expect(result.success).to be true
7272
expect(result.must_shutdown).to be false
@@ -94,7 +94,7 @@ def with_sender_and_server
9494

9595
es = make_sender(server)
9696

97-
result = es.send_event_data(fake_data, false)
97+
result = es.send_event_data(fake_data, "", false)
9898

9999
expect(result.success).to be true
100100

@@ -116,7 +116,7 @@ def with_sender_and_server
116116
res.status = req_count == 2 ? 200 : status
117117
end
118118

119-
result = es.send_event_data(fake_data, false)
119+
result = es.send_event_data(fake_data, "", false)
120120

121121
expect(result.success).to be true
122122
expect(result.must_shutdown).to be false
@@ -141,7 +141,7 @@ def with_sender_and_server
141141
res.status = req_count == 3 ? 200 : status
142142
end
143143

144-
result = es.send_event_data(fake_data, false)
144+
result = es.send_event_data(fake_data, "", false)
145145

146146
expect(result.success).to be false
147147
expect(result.must_shutdown).to be false
@@ -164,7 +164,7 @@ def with_sender_and_server
164164
res.status = status
165165
end
166166

167-
result = es.send_event_data(fake_data, false)
167+
result = es.send_event_data(fake_data, "", false)
168168

169169
expect(result.success).to be false
170170
expect(result.must_shutdown).to be true

spec/events_spec.rb

+1-1
Original file line numberDiff line numberDiff line change
@@ -578,7 +578,7 @@ def initialize
578578
@diagnostic_payloads = Queue.new
579579
end
580580

581-
def send_event_data(data, is_diagnostic)
581+
def send_event_data(data, description, is_diagnostic)
582582
(is_diagnostic ? @diagnostic_payloads : @analytics_payloads).push(JSON.parse(data, symbolize_names: true))
583583
@result
584584
end

spec/ldclient_end_to_end_spec.rb

+123
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,123 @@
1+
require "http_util"
2+
require "spec_helper"
3+
4+
5+
SDK_KEY = "sdk-key"
6+
7+
USER = { key: 'userkey' }
8+
9+
ALWAYS_TRUE_FLAG = { key: 'flagkey', version: 1, on: false, offVariation: 1, variations: [ false, true ] }
10+
DATA_WITH_ALWAYS_TRUE_FLAG = {
11+
flags: { ALWAYS_TRUE_FLAG[:key ].to_sym => ALWAYS_TRUE_FLAG },
12+
segments: {}
13+
}
14+
PUT_EVENT_WITH_ALWAYS_TRUE_FLAG = "event: put\ndata:{\"data\":#{DATA_WITH_ALWAYS_TRUE_FLAG.to_json}}\n\n'"
15+
16+
def with_client(config)
17+
client = LaunchDarkly::LDClient.new(SDK_KEY, config)
18+
begin
19+
yield client
20+
ensure
21+
client.close
22+
end
23+
end
24+
25+
module LaunchDarkly
26+
# Note that we can't do end-to-end tests in streaming mode until we have a test server that can do streaming
27+
# responses, which is difficult in WEBrick.
28+
29+
describe "LDClient end-to-end" do
30+
it "starts in polling mode" do
31+
with_server do |poll_server|
32+
poll_server.setup_ok_response("/sdk/latest-all", DATA_WITH_ALWAYS_TRUE_FLAG.to_json, "application/json")
33+
34+
config = Config.new(
35+
stream: false,
36+
base_uri: poll_server.base_uri.to_s,
37+
send_events: false,
38+
logger: NullLogger.new
39+
)
40+
with_client(config) do |client|
41+
expect(client.initialized?).to be true
42+
expect(client.variation(ALWAYS_TRUE_FLAG[:key], USER, false)).to be true
43+
end
44+
end
45+
end
46+
47+
it "fails in polling mode with 401 error" do
48+
with_server do |poll_server|
49+
poll_server.setup_status_response("/sdk/latest-all", 401)
50+
51+
config = Config.new(
52+
stream: false,
53+
base_uri: poll_server.base_uri.to_s,
54+
send_events: false,
55+
logger: NullLogger.new
56+
)
57+
with_client(config) do |client|
58+
expect(client.initialized?).to be false
59+
expect(client.variation(ALWAYS_TRUE_FLAG[:key], USER, false)).to be false
60+
end
61+
end
62+
end
63+
64+
it "sends event without diagnostics" do
65+
with_server do |poll_server|
66+
with_server do |events_server|
67+
events_server.setup_ok_response("/bulk", "")
68+
poll_server.setup_ok_response("/sdk/latest-all", '{"flags":{},"segments":{}}', "application/json")
69+
70+
config = Config.new(
71+
stream: false,
72+
base_uri: poll_server.base_uri.to_s,
73+
events_uri: events_server.base_uri.to_s,
74+
diagnostic_opt_out: true,
75+
logger: NullLogger.new
76+
)
77+
with_client(config) do |client|
78+
client.identify(USER)
79+
client.flush
80+
81+
req, body = events_server.await_request_with_body
82+
expect(req.header['authorization']).to eq [ SDK_KEY ]
83+
data = JSON.parse(body)
84+
expect(data.length).to eq 1
85+
expect(data[0]["kind"]).to eq "identify"
86+
end
87+
end
88+
end
89+
end
90+
91+
it "sends diagnostic event" do
92+
with_server do |poll_server|
93+
with_server do |events_server|
94+
events_server.setup_ok_response("/bulk", "")
95+
events_server.setup_ok_response("/diagnostic", "")
96+
poll_server.setup_ok_response("/sdk/latest-all", '{"flags":{},"segments":{}}', "application/json")
97+
98+
config = Config.new(
99+
stream: false,
100+
base_uri: poll_server.base_uri.to_s,
101+
events_uri: events_server.base_uri.to_s,
102+
logger: NullLogger.new
103+
)
104+
with_client(config) do |client|
105+
user = { key: 'userkey' }
106+
client.identify(user)
107+
client.flush
108+
109+
req0, body0 = events_server.await_request_with_body
110+
req1, body1 = events_server.await_request_with_body
111+
req = req0.path == "/diagnostic" ? req0 : req1
112+
body = req0.path == "/diagnostic" ? body0 : body1
113+
expect(req.header['authorization']).to eq [ SDK_KEY ]
114+
data = JSON.parse(body)
115+
expect(data["kind"]).to eq "diagnostic-init"
116+
end
117+
end
118+
end
119+
end
120+
121+
# TODO: TLS tests with self-signed cert
122+
end
123+
end

0 commit comments

Comments
 (0)