diff --git a/lib/mysql2/em.rb b/lib/mysql2/em.rb index e8c984bdb..5faa7efc4 100644 --- a/lib/mysql2/em.rb +++ b/lib/mysql2/em.rb @@ -15,10 +15,11 @@ def initialize(client, deferable) def notify_readable detach begin - @deferable.succeed(@client.async_result) + result = @client.async_result rescue Exception => e @deferable.fail(e) end + @deferable.succeed(result) end end @@ -34,4 +35,4 @@ def query(sql, opts={}) end end end -end \ No newline at end of file +end diff --git a/spec/em/em_spec.rb b/spec/em/em_spec.rb index b8b53a917..92a3a96ce 100644 --- a/spec/em/em_spec.rb +++ b/spec/em/em_spec.rb @@ -44,6 +44,43 @@ results[0].keys.should include("first_query") results[1].keys.should include("second_query") end + + it "should not swallow exceptions raised in callbacks" do + lambda { + EM.run do + client = Mysql2::EM::Client.new + defer = client.query "SELECT sleep(0.1) as first_query" + defer.callback do |result| + raise 'some error' + end + defer.errback do |err| + # This _shouldn't_ be run, but it needed to prevent the specs from + # freezing if this test fails. + EM.stop_event_loop + end + end + }.should raise_error + end + + it "should swallow exceptions raised in by the client" do + errors = [] + error = StandardError.new('some error') + EM.run do + client = Mysql2::EM::Client.new + defer = client.query "SELECT sleep(0.1) as first_query" + client.stub(:async_result).and_raise(error) + defer.callback do |result| + # This _shouldn't_ be run, but it needed to prevent the specs from + # freezing if this test fails. + EM.stop_event_loop + end + defer.errback do |err| + errors << err + EM.stop_event_loop + end + end + errors.should == [error] + end end rescue LoadError puts "EventMachine not installed, skipping the specs that use it"