]> git.openstreetmap.org Git - rails.git/blob - vendor/plugins/deadlock_retry/test/deadlock_retry_test.rb
Merge 14059:14394 from trunk.
[rails.git] / vendor / plugins / deadlock_retry / test / deadlock_retry_test.rb
1 begin
2   require 'active_record'
3 rescue LoadError
4   if ENV['ACTIVERECORD_PATH'].nil?
5     abort <<MSG
6 Please set the ACTIVERECORD_PATH environment variable to the directory
7 containing the active_record.rb file.
8 MSG
9   else
10     $LOAD_PATH.unshift << ENV['ACTIVERECORD_PATH']
11     begin
12       require 'active_record'
13     rescue LoadError
14       abort "ActiveRecord could not be found."
15     end
16   end
17 end
18
19 require 'test/unit'
20 require "#{File.dirname(__FILE__)}/../lib/deadlock_retry"
21
22 class MockModel
23   def self.transaction(*objects, &block)
24     block.call
25   end
26
27   def self.logger
28     @logger ||= Logger.new(nil)
29   end
30
31   include DeadlockRetry
32 end
33
34 class DeadlockRetryTest < Test::Unit::TestCase
35   DEADLOCK_ERROR = "MySQL::Error: Deadlock found when trying to get lock"
36   TIMEOUT_ERROR = "MySQL::Error: Lock wait timeout exceeded"
37
38   def test_no_errors
39     assert_equal :success, MockModel.transaction { :success }
40   end
41
42   def test_no_errors_with_deadlock
43     errors = [ DEADLOCK_ERROR ] * 3
44     assert_equal :success, MockModel.transaction { raise ActiveRecord::StatementInvalid, errors.shift unless errors.empty?; :success }
45     assert errors.empty?
46   end
47
48   def test_no_errors_with_lock_timeout
49     errors = [ TIMEOUT_ERROR ] * 3
50     assert_equal :success, MockModel.transaction { raise ActiveRecord::StatementInvalid, errors.shift unless errors.empty?; :success }
51     assert errors.empty?
52   end
53
54   def test_error_if_limit_exceeded
55     assert_raise(ActiveRecord::StatementInvalid) do
56       MockModel.transaction { raise ActiveRecord::StatementInvalid, DEADLOCK_ERROR }
57     end
58   end
59
60   def test_error_if_unrecognized_error
61     assert_raise(ActiveRecord::StatementInvalid) do
62       MockModel.transaction { raise ActiveRecord::StatementInvalid, "Something else" }
63     end
64   end
65 end