diff --git a/lib/ldclient-rb/events.rb b/lib/ldclient-rb/events.rb index 9313b670..0b65f3d5 100644 --- a/lib/ldclient-rb/events.rb +++ b/lib/ldclient-rb/events.rb @@ -319,7 +319,7 @@ def trigger_flush(outbox, flush_workers) success = flush_workers.post do begin events_out = @formatter.make_output_events(payload.events, payload.summary) - result = @event_sender.send_event_data(events_out.to_json, false) + result = @event_sender.send_event_data(events_out.to_json, "#{events_out.length} events", false) @disabled.value = true if result.must_shutdown if !result.time_from_server.nil? @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) uri = URI(@config.events_uri + "/diagnostic") diagnostic_event_workers.post do begin - @event_sender.send_event_data(event.to_json, true) + @event_sender.send_event_data(event.to_json, "diagnostic event", true) rescue => e Util.log_exception(@config.logger, "Unexpected error in event processor", e) end diff --git a/lib/ldclient-rb/impl/event_sender.rb b/lib/ldclient-rb/impl/event_sender.rb index 834cd3a3..f6da0843 100644 --- a/lib/ldclient-rb/impl/event_sender.rb +++ b/lib/ldclient-rb/impl/event_sender.rb @@ -18,10 +18,9 @@ def initialize(sdk_key, config, http_client = nil, retry_interval = DEFAULT_RETR @retry_interval = retry_interval end - def send_event_data(event_data, is_diagnostic) + def send_event_data(event_data, description, is_diagnostic) uri = is_diagnostic ? @diagnostic_uri : @events_uri payload_id = is_diagnostic ? nil : SecureRandom.uuid - description = is_diagnostic ? 'diagnostic event' : "#{event_data.length} events" res = nil (0..1).each do |attempt| if attempt > 0 @@ -30,7 +29,7 @@ def send_event_data(event_data, is_diagnostic) end begin @client.start if !@client.started? - @logger.debug { "[LDClient] sending #{description}: #{body}" } + @logger.debug { "[LDClient] sending #{description}: #{event_data}" } req = Net::HTTP::Post.new(uri) req.content_type = "application/json" req.body = event_data diff --git a/lib/ldclient-rb/ldclient.rb b/lib/ldclient-rb/ldclient.rb index 06db4f00..ed0a724e 100644 --- a/lib/ldclient-rb/ldclient.rb +++ b/lib/ldclient-rb/ldclient.rb @@ -56,7 +56,7 @@ def initialize(sdk_key, config = Config.default, wait_for_sec = 5) if @config.offline? || !@config.send_events @event_processor = NullEventProcessor.new else - @event_processor = EventProcessor.new(sdk_key, config, diagnostic_accumulator) + @event_processor = EventProcessor.new(sdk_key, config, nil, diagnostic_accumulator) end if @config.use_ldd? diff --git a/spec/event_sender_spec.rb b/spec/event_sender_spec.rb index e99761b7..0519aebb 100644 --- a/spec/event_sender_spec.rb +++ b/spec/event_sender_spec.rb @@ -27,7 +27,7 @@ def with_sender_and_server with_sender_and_server do |es, server| server.setup_ok_response("/bulk", "") - result = es.send_event_data(fake_data, false) + result = es.send_event_data(fake_data, "", false) expect(result.success).to be true expect(result.must_shutdown).to be false @@ -49,8 +49,8 @@ def with_sender_and_server with_sender_and_server do |es, server| server.setup_ok_response("/bulk", "") - result1 = es.send_event_data(fake_data, false) - result2 = es.send_event_data(fake_data, false) + result1 = es.send_event_data(fake_data, "", false) + result2 = es.send_event_data(fake_data, "", false) expect(result1.success).to be true expect(result2.success).to be true @@ -66,7 +66,7 @@ def with_sender_and_server with_sender_and_server do |es, server| server.setup_ok_response("/diagnostic", "") - result = es.send_event_data(fake_data, true) + result = es.send_event_data(fake_data, "", true) expect(result.success).to be true expect(result.must_shutdown).to be false @@ -94,7 +94,7 @@ def with_sender_and_server es = make_sender(server) - result = es.send_event_data(fake_data, false) + result = es.send_event_data(fake_data, "", false) expect(result.success).to be true @@ -116,7 +116,7 @@ def with_sender_and_server res.status = req_count == 2 ? 200 : status end - result = es.send_event_data(fake_data, false) + result = es.send_event_data(fake_data, "", false) expect(result.success).to be true expect(result.must_shutdown).to be false @@ -141,7 +141,7 @@ def with_sender_and_server res.status = req_count == 3 ? 200 : status end - result = es.send_event_data(fake_data, false) + result = es.send_event_data(fake_data, "", false) expect(result.success).to be false expect(result.must_shutdown).to be false @@ -164,7 +164,7 @@ def with_sender_and_server res.status = status end - result = es.send_event_data(fake_data, false) + result = es.send_event_data(fake_data, "", false) expect(result.success).to be false expect(result.must_shutdown).to be true diff --git a/spec/events_spec.rb b/spec/events_spec.rb index a36fa95f..c32eeb29 100644 --- a/spec/events_spec.rb +++ b/spec/events_spec.rb @@ -578,7 +578,7 @@ def initialize @diagnostic_payloads = Queue.new end - def send_event_data(data, is_diagnostic) + def send_event_data(data, description, is_diagnostic) (is_diagnostic ? @diagnostic_payloads : @analytics_payloads).push(JSON.parse(data, symbolize_names: true)) @result end diff --git a/spec/ldclient_end_to_end_spec.rb b/spec/ldclient_end_to_end_spec.rb new file mode 100644 index 00000000..b93a98b4 --- /dev/null +++ b/spec/ldclient_end_to_end_spec.rb @@ -0,0 +1,123 @@ +require "http_util" +require "spec_helper" + + +SDK_KEY = "sdk-key" + +USER = { key: 'userkey' } + +ALWAYS_TRUE_FLAG = { key: 'flagkey', version: 1, on: false, offVariation: 1, variations: [ false, true ] } +DATA_WITH_ALWAYS_TRUE_FLAG = { + flags: { ALWAYS_TRUE_FLAG[:key ].to_sym => ALWAYS_TRUE_FLAG }, + segments: {} +} +PUT_EVENT_WITH_ALWAYS_TRUE_FLAG = "event: put\ndata:{\"data\":#{DATA_WITH_ALWAYS_TRUE_FLAG.to_json}}\n\n'" + +def with_client(config) + client = LaunchDarkly::LDClient.new(SDK_KEY, config) + begin + yield client + ensure + client.close + end +end + +module LaunchDarkly + # Note that we can't do end-to-end tests in streaming mode until we have a test server that can do streaming + # responses, which is difficult in WEBrick. + + describe "LDClient end-to-end" do + it "starts in polling mode" do + with_server do |poll_server| + poll_server.setup_ok_response("/sdk/latest-all", DATA_WITH_ALWAYS_TRUE_FLAG.to_json, "application/json") + + config = Config.new( + stream: false, + base_uri: poll_server.base_uri.to_s, + send_events: false, + logger: NullLogger.new + ) + with_client(config) do |client| + expect(client.initialized?).to be true + expect(client.variation(ALWAYS_TRUE_FLAG[:key], USER, false)).to be true + end + end + end + + it "fails in polling mode with 401 error" do + with_server do |poll_server| + poll_server.setup_status_response("/sdk/latest-all", 401) + + config = Config.new( + stream: false, + base_uri: poll_server.base_uri.to_s, + send_events: false, + logger: NullLogger.new + ) + with_client(config) do |client| + expect(client.initialized?).to be false + expect(client.variation(ALWAYS_TRUE_FLAG[:key], USER, false)).to be false + end + end + end + + it "sends event without diagnostics" do + with_server do |poll_server| + with_server do |events_server| + events_server.setup_ok_response("/bulk", "") + poll_server.setup_ok_response("/sdk/latest-all", '{"flags":{},"segments":{}}', "application/json") + + config = Config.new( + stream: false, + base_uri: poll_server.base_uri.to_s, + events_uri: events_server.base_uri.to_s, + diagnostic_opt_out: true, + logger: NullLogger.new + ) + with_client(config) do |client| + client.identify(USER) + client.flush + + req, body = events_server.await_request_with_body + expect(req.header['authorization']).to eq [ SDK_KEY ] + data = JSON.parse(body) + expect(data.length).to eq 1 + expect(data[0]["kind"]).to eq "identify" + end + end + end + end + + it "sends diagnostic event" do + with_server do |poll_server| + with_server do |events_server| + events_server.setup_ok_response("/bulk", "") + events_server.setup_ok_response("/diagnostic", "") + poll_server.setup_ok_response("/sdk/latest-all", '{"flags":{},"segments":{}}', "application/json") + + config = Config.new( + stream: false, + base_uri: poll_server.base_uri.to_s, + events_uri: events_server.base_uri.to_s, + logger: NullLogger.new + ) + with_client(config) do |client| + user = { key: 'userkey' } + client.identify(user) + client.flush + + req0, body0 = events_server.await_request_with_body + req1, body1 = events_server.await_request_with_body + req = req0.path == "/diagnostic" ? req0 : req1 + body = req0.path == "/diagnostic" ? body0 : body1 + expect(req.header['authorization']).to eq [ SDK_KEY ] + data = JSON.parse(body) + expect(data["kind"]).to eq "diagnostic-init" + end + end + end + end + + # TODO: TLS tests with self-signed cert + end +end