spec/timber/log_devices/http_spec.rb in timber-2.0.20 vs spec/timber/log_devices/http_spec.rb in timber-2.0.21

- old
+ new

@@ -9,11 +9,11 @@ http = described_class.new("MYKEY", flush_interval: 0.1) # Ensure that threads have not started thread = http.instance_variable_get(:@flush_thread) expect(thread).to be_nil - thread = http.instance_variable_get(:@outlet_thread) + thread = http.instance_variable_get(:@request_outlet_thread) expect(thread).to be_nil end end describe "#write" do @@ -21,28 +21,33 @@ let(:msg_queue) { http.instance_variable_get(:@msg_queue) } it "should buffer the messages" do http.write("test log message") expect(msg_queue.flush).to eq(["test log message"]) + http.close end it "should start the flush threads" do http.write("test log message") thread = http.instance_variable_get(:@flush_thread) expect(thread).to be_alive - thread = http.instance_variable_get(:@outlet_thread) + thread = http.instance_variable_get(:@request_outlet_thread) expect(thread).to be_alive + expect(http).to receive(:flush).exactly(1).times + http.close end context "with a low batch size" do let(:http) { described_class.new("MYKEY", :batch_size => 2) } it "should attempt a delivery when the limit is exceeded" do http.write("test") expect(http).to receive(:flush).exactly(1).times http.write("my log message") + expect(http).to receive(:flush).exactly(1).times + http.close end end end describe "#close" do @@ -52,11 +57,11 @@ http.send(:ensure_flush_threads_are_started) http.close thread = http.instance_variable_get(:@flush_thread) sleep 0.1 # too fast! expect(thread).to_not be_alive - thread = http.instance_variable_get(:@outlet_thread) + thread = http.instance_variable_get(:@request_outlet_thread) sleep 0.1 # too fast! expect(thread).to_not be_alive end it "should attempt a delivery" do @@ -84,36 +89,28 @@ expect(request.body).to start_with("\x92\x85\xA5level\xA4INFO\xA2dt\xBB2016-09-01T12:00:00.000000Z\xA7message\xB2test log message 1\xA7context\x81".force_encoding("ASCII-8BIT")) message_queue = http.instance_variable_get(:@msg_queue) expect(message_queue.size).to eq(0) end - - it "should preserve formatting for mshpack payloads" do - http = described_class.new("MYKEY", flush_continuously: false) - http.write("This is a log message 1".to_msgpack) - http.write("This is a log message 2".to_msgpack) - http.send(:flush) - end end # Testing a private method because it helps break down our tests describe "#intervaled_flush" do it "should start a intervaled flush thread and flush on an interval" do http = described_class.new("MYKEY", flush_interval: 0.1) http.send(:ensure_flush_threads_are_started) - expect(http).to receive(:flush).exactly(1).times - sleep 0.12 # too fast! - expect(http).to receive(:flush).exactly(1).times - sleep 0.12 # too fast! + expect(http).to receive(:flush).exactly(2).times + sleep 0.15 # too fast! + http.close end end # Outlet - describe "#outlet" do + describe "#request_outlet" do let(:time) { Time.utc(2016, 9, 1, 12, 0, 0) } - it "should start a intervaled flush thread and flush on an interval" do + it "should deliver requests on an interval" do stub = stub_request(:post, "https://logs.timber.io/frames"). with( :body => start_with("\x92\x85\xA5level\xA4INFO\xA2dt\xBB2016-09-01T12:00:00.000000Z\xA7message\xB2test log message 1\xA7context\x81\xA6system".force_encoding("ASCII-8BIT")), :headers => { 'Authorization' => 'Basic TVlLRVk=', @@ -122,15 +119,39 @@ } ). to_return(:status => 200, :body => "", :headers => {}) http = described_class.new("MYKEY", flush_interval: 0.1) - log_entry = Timber::LogEntry.new("INFO", time, nil, "test log message 1", nil, nil) - http.write(log_entry) - log_entry = Timber::LogEntry.new("INFO", time, nil, "test log message 2", nil, nil) - http.write(log_entry) - sleep 0.3 + log_entry1 = Timber::LogEntry.new("INFO", time, nil, "test log message 1", nil, nil) + http.write(log_entry1) + log_entry2 = Timber::LogEntry.new("INFO", time, nil, "test log message 2", nil, nil) + http.write(log_entry2) + sleep 1 expect(stub).to have_been_requested.times(1) + + http.close + end + end + + describe "#deliver_requests" do + it "should handle exceptions properly and return" do + allow_any_instance_of(Net::HTTP).to receive(:request).and_raise("boom") + + http_device = described_class.new("MYKEY", flush_continuously: false) + req_queue = http_device.instance_variable_get(:@request_queue) + + # Place a request on the queue + req = Net::HTTP::Post.new("/") + req_queue.enq(req) + + # Start a HTTP connection to test the method directly + http = http_device.send(:build_http) + http.start do |conn| + result = http_device.send(:deliver_requests, conn) + expect(result).to eq(false) + end + + expect(req_queue.size).to eq(1) end end end \ No newline at end of file