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