spec/outputs/udp_spec.rb in logstash-output-udp-3.0.6 vs spec/outputs/udp_spec.rb in logstash-output-udp-3.1.0

- old
+ new

@@ -1,30 +1,93 @@ # encoding: utf-8 require_relative "../spec_helper" describe LogStash::Outputs::UDP do + subject { described_class.new(config) } let(:host) { "localhost" } let(:port) { rand(1024..65535) } + let(:config) {{ "host" => host, "port" => port}} it "should register without errors" do - plugin = LogStash::Plugin.lookup("output", "udp").new({ "host" => host, "port" => port}) + plugin = LogStash::Plugin.lookup("output", "udp").new(config) expect { plugin.register }.to_not raise_error end describe "#send" do - - subject { LogStash::Outputs::UDP.new({"host" => host, "port" => port}) } - let(:properties) { { "message" => "This is a message!"} } let(:event) { LogStash::Event.new(properties) } before(:each) do subject.register end it "should receive the generated event" do expect(subject.instance_variable_get("@socket")).to receive(:send).with(kind_of(String), 0, host, port) + expect(subject.instance_variable_get("@logger")).not_to receive(:error) subject.receive(event) end + end + + describe "retries" do + let(:event) { LogStash::Event.new("message" => "test") } + let(:config) {{ "host" => host, "port" => port}} + + before(:each) do + subject.register + end + + context "not using :retry_count" do + it "should not retry upon send exception by default" do + allow(subject.instance_variable_get("@socket")).to receive(:send).once.and_raise(IOError) + expect(subject.instance_variable_get("@logger")).to receive(:error).once + subject.receive(event) + end + end + + context "using :retry_count" do + let(:backoff) { 10 } + let(:retry_count) { 5 } + let(:config) {{ "host" => host, "port" => port, "retry_count" => retry_count, "retry_backoff_ms" => backoff}} + + it "should retry upon send exception" do + allow(subject.instance_variable_get("@socket")).to receive(:send).exactly(retry_count + 1).times.and_raise(IOError) + expect(subject.instance_variable_get("@logger")).to receive(:warn).exactly(retry_count).times + expect(subject.instance_variable_get("@logger")).to receive(:error).once + expect(subject).to receive(:sleep).with(backoff / 1000.0).exactly(retry_count).times + subject.receive(event) + end + end + end + + describe "large message" do + let(:properties) { { "message" => "0" * 65_536 } } + let(:event) { LogStash::Event.new(properties) } + + before(:each) do + subject.register + end + + it "should handle the error and log when an error is received" do + expect(subject.instance_variable_get("@logger")).to receive(:error) + subject.receive(event) + end + + it "should log a truncated payload with debug logging when an error is received and the message is too long" do + expect(subject.instance_variable_get("@logger")).to receive(:debug?).and_return(true) + expect(subject.instance_variable_get("@logger")).to receive(:error) do |_, hash| + expect(hash).to include(:event_payload) + expect(hash[:event_payload]).to include("TRUNCATED") + end + subject.receive(event) + end + + it "should not log a payload with debug logging when an error is received" do + expect(subject.instance_variable_get("@logger")).to receive(:debug?).and_return(false) + expect(subject.instance_variable_get("@logger")).to receive(:error) do |_, hash| + expect(hash).not_to include(:event_payload) + end + subject.receive(event) + end + end end