From eeedec64d1de9bd2f72e4098e2bcbe64f55db068 Mon Sep 17 00:00:00 2001 From: Cheah Chu Yeow Date: Wed, 16 Apr 2008 18:39:19 +0800 Subject: [PATCH] Rescue from Timeout::Error in ActiveResource::Connection. --- activeresource/lib/active_resource/connection.rb | 10 ++++++++++ activeresource/test/abstract_unit.rb | 14 +++++++++++++- activeresource/test/connection_test.rb | 9 +++++++++ 3 files changed, 32 insertions(+), 1 deletions(-) diff --git a/activeresource/lib/active_resource/connection.rb b/activeresource/lib/active_resource/connection.rb index c8cee7a..b6b3b76 100644 --- a/activeresource/lib/active_resource/connection.rb +++ b/activeresource/lib/active_resource/connection.rb @@ -18,6 +18,14 @@ module ActiveResource 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 @@ -129,6 +137,8 @@ module ActiveResource 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 db1e0b9..615a6d9 100644 --- a/activeresource/test/abstract_unit.rb +++ b/activeresource/test/abstract_unit.rb @@ -7,4 +7,16 @@ require 'active_resource/http_mock' $:.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 38fdbd3..597c293 100644 --- a/activeresource/test/connection_test.rb +++ b/activeresource/test/connection_test.rb @@ -163,6 +163,15 @@ class ConnectionTest < Test::Unit::TestCase 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 -- 1.5.3.4