diff --git a/activeresource/lib/active_resource/connection.rb b/activeresource/lib/active_resource/connection.rb index 3b61009f430f1..98b3f87167e60 100644 --- a/activeresource/lib/active_resource/connection.rb +++ b/activeresource/lib/active_resource/connection.rb @@ -18,6 +18,14 @@ def to_s end end + # Raised when a Timeout::Error occurs. + class TimeoutError < ConnectionError + def initialize(message) + @message = message + end + def to_s; @message ;end + end + # 3xx Redirection class Redirection < ConnectionError # :nodoc: def to_s; response['Location'] ? "#{super} => #{response['Location']}" : super; end @@ -134,6 +142,8 @@ def request(method, path, *arguments) time = Benchmark.realtime { result = http.send(method, path, *arguments) } logger.info "--> #{result.code} #{result.message} (#{result.body ? result.body : 0}b %.2fs)" % time if logger handle_response(result) + rescue Timeout::Error => e + raise TimeoutError.new(e.message) end # Handles response and error codes from remote service. diff --git a/activeresource/test/abstract_unit.rb b/activeresource/test/abstract_unit.rb index db1e0b9535655..615a6d922251b 100644 --- a/activeresource/test/abstract_unit.rb +++ b/activeresource/test/abstract_unit.rb @@ -7,4 +7,16 @@ $:.unshift "#{File.dirname(__FILE__)}/../test" require 'setter_trap' -ActiveResource::Base.logger = Logger.new("#{File.dirname(__FILE__)}/debug.log") \ No newline at end of file +ActiveResource::Base.logger = Logger.new("#{File.dirname(__FILE__)}/debug.log") + +# Wrap tests that use Mocha and skip if unavailable. +def uses_mocha(test_name) + unless Object.const_defined?(:Mocha) + require 'mocha' + require 'stubba' + end + yield +rescue LoadError => load_error + raise unless load_error.message =~ /mocha/i + $stderr.puts "Skipping #{test_name} tests. `gem install mocha` and try again." +end \ No newline at end of file diff --git a/activeresource/test/connection_test.rb b/activeresource/test/connection_test.rb index 6c907614e786e..8e43e451ff9f6 100644 --- a/activeresource/test/connection_test.rb +++ b/activeresource/test/connection_test.rb @@ -168,6 +168,15 @@ def test_delete_with_header assert_equal 200, response.code end + uses_mocha('test_timeout') do + def test_timeout + @http = mock('new Net::HTTP') + @conn.expects(:http).returns(@http) + @http.expects(:get).raises(Timeout::Error, 'execution expired') + assert_raises(ActiveResource::TimeoutError) { @conn.get('/people_timeout.xml') } + end + end + protected def assert_response_raises(klass, code) assert_raise(klass, "Expected response code #{code} to raise #{klass}") do