diff --git a/sentry-ruby/lib/sentry/transport/dummy_transport.rb b/sentry-ruby/lib/sentry/transport/dummy_transport.rb index 68df2d122..c83dece62 100644 --- a/sentry-ruby/lib/sentry/transport/dummy_transport.rb +++ b/sentry-ruby/lib/sentry/transport/dummy_transport.rb @@ -8,22 +8,25 @@ def initialize(*) super @events = [] @envelopes = [] + @mutex = Mutex.new end def send_event(event) - @events << event + @mutex.synchronize { @events << event } super end def send_envelope(envelope) - @envelopes << envelope + @mutex.synchronize { @envelopes << envelope } end # Empties the captured events and envelopes so `TestHelper.clear_sentry_events` # also clears the dummy transport instance def clear - @events.clear - @envelopes.clear + @mutex.synchronize do + @events.clear + @envelopes.clear + end end end end diff --git a/sentry-ruby/spec/sentry/transport/dummy_transport_spec.rb b/sentry-ruby/spec/sentry/transport/dummy_transport_spec.rb new file mode 100644 index 000000000..235f999e8 --- /dev/null +++ b/sentry-ruby/spec/sentry/transport/dummy_transport_spec.rb @@ -0,0 +1,21 @@ +# frozen_string_literal: true + +RSpec.describe Sentry::DummyTransport do + let(:configuration) do + Sentry::Configuration.new.tap do |config| + config.sdk_logger = Logger.new(nil) + end + end + + subject(:transport) { described_class.new(configuration) } + + it "keeps every envelope sent from concurrent threads" do + threads = Array.new(8) do + Thread.new { 500.times { transport.send_envelope(Sentry::Envelope.new) } } + end + threads.each(&:join) + + expect(transport.envelopes.size).to eq(4000) + expect(transport.envelopes).to all(be_a(Sentry::Envelope)) + end +end