diff --git a/lib/mongo/socket.rb b/lib/mongo/socket.rb index 4f05e99a45..94c1327a72 100644 --- a/lib/mongo/socket.rb +++ b/lib/mongo/socket.rb @@ -29,7 +29,7 @@ class Socket # Error message for SSL related exceptions. # # @since 2.0.0 - SSL_ERROR = 'SSL handshake failed. MongoDB may not be configured with SSL support.'.freeze + SSL_ERROR = 'MongoDB may not be configured with SSL support'.freeze # Error message for timeouts on socket calls. # @@ -284,9 +284,9 @@ def handle_errors rescue Errno::ETIMEDOUT raise Error::SocketTimeoutError, TIMEOUT_ERROR rescue IOError, SystemCallError => e - raise Error::SocketError, e.message - rescue OpenSSL::SSL::SSLError - raise Error::SocketError, SSL_ERROR + raise Error::SocketError, "#{e.class}: #{e}" + rescue OpenSSL::SSL::SSLError => e + raise Error::SocketError, "#{e.class}: #{e} (#{SSL_ERROR})" end end end diff --git a/spec/mongo/socket/ssl_spec.rb b/spec/mongo/socket/ssl_spec.rb index 3e04d7dd91..1f61cc9171 100644 --- a/spec/mongo/socket/ssl_spec.rb +++ b/spec/mongo/socket/ssl_spec.rb @@ -561,7 +561,7 @@ it 'should raise EOFError' do expect { socket.readbyte } - .to raise_error(Mongo::Error::SocketError).with_message("EOFError") + .to raise_error(Mongo::Error::SocketError).with_message("EOFError: EOFError") end end end diff --git a/spec/mongo/socket_spec.rb b/spec/mongo/socket_spec.rb new file mode 100644 index 0000000000..1d044b1f71 --- /dev/null +++ b/spec/mongo/socket_spec.rb @@ -0,0 +1,42 @@ +require 'lite_spec_helper' + +describe Mongo::Socket do + + let(:socket) do + described_class.new(Socket::PF_INET) + end + + describe '#handle_errors' do + it 'maps timeout exception' do + expect do + socket.send(:handle_errors) do + raise Errno::ETIMEDOUT + end + end.to raise_error(Mongo::Error::SocketTimeoutError) + end + + it 'maps SystemCallError and preserves message' do + expect do + socket.send(:handle_errors) do + raise SystemCallError.new('Test error', Errno::ENOMEDIUM::Errno) + end + end.to raise_error(Mongo::Error::SocketError, 'Errno::ENOMEDIUM: No medium found - Test error') + end + + it 'maps IOError and preserves message' do + expect do + socket.send(:handle_errors) do + raise IOError.new('Test error') + end + end.to raise_error(Mongo::Error::SocketError, 'IOError: Test error') + end + + it 'maps SSLError and preserves message' do + expect do + socket.send(:handle_errors) do + raise OpenSSL::SSL::SSLError.new('Test error') + end + end.to raise_error(Mongo::Error::SocketError, 'OpenSSL::SSL::SSLError: Test error (MongoDB may not be configured with SSL support)') + end + end +end