Skip to content

Commit

Permalink
Simulated & actual (manual/skipped) PostgreSQL auto-reconnection tests.
Browse files Browse the repository at this point in the history
  • Loading branch information
Steve Jorgensen committed Jul 16, 2012
1 parent 0d63cda commit 6d5f4de
Show file tree
Hide file tree
Showing 3 changed files with 75 additions and 0 deletions.
Expand Up @@ -474,6 +474,7 @@ def active?
def reconnect!
clear_cache!
@connection.reset
@open_transactions = 0
configure_connection
end

Expand Down
72 changes: 72 additions & 0 deletions activerecord/test/cases/adapters/postgresql/connection_test.rb
Expand Up @@ -81,5 +81,77 @@ def test_schema_names_logs_name
assert_equal 'SCHEMA', @connection.logged[0][1]
end

def test_reconnection_after_simulated_disconnection_with_verify
assert @connection.active?
original_connection_pid = @connection.query('select pg_backend_pid()')

# Fail with bad connection after next query attempt.
connection_class = class << @connection ; self ; end
connection_class.class_eval <<-CODE
def query_fake(*args)
if @called ||= false
@connection.stubs(:status).returns(PCconn::CONNECTION_BAD)
raise PGError
else
@called = true
@connection.unstub(:status)
query_unfake(*args)
end
end
alias query_unfake query
alias query query_fake
CODE

begin
@connection.verify!
new_connection_pid = @connection.query('select pg_backend_pid()')
ensure
connection_class.class_eval <<-CODE
alias query query_unfake
undef query_fake
CODE
end

assert_equal original_connection_pid, new_connection_pid, "Should have a new underlying connection pid"
end

# Must have with_manual_interventions set to true for this
# test to run.
# When prompted, restart the PostgreSQL server with the
# "-m fast" option or kill the individual connection assuming
# you know the incantation to do that.
# To restart PostgreSQL 9.1 on OS X, installed via MacPorts, ...
# sudo su postgres -c "pg_ctl restart -D /opt/local/var/db/postgresql91/defaultdb/ -m fast"
def test_reconnection_after_actual_disconnection_with_verify
skip "with_manual_interventions is false in configuration" unless ARTest.config['with_manual_interventions']

original_connection_pid = @connection.query('select pg_backend_pid()')

# Sanity check.
assert @connection.active?

puts 'Kill the connection now (e.g. by restarting the PostgreSQL ' +
'server with the "-m fast" option) and then press enter.'
$stdin.gets

@connection.verify!

assert @connection.active?

# If we get no exception here, then either we re-connected successfully, or
# we never actually got disconnected.
new_connection_pid = @connection.query('select pg_backend_pid()')

assert_not_equal original_connection_pid, new_connection_pid,
"umm -- looks like you didn't break the connection, because we're still " +
"successfully querying with the same connection pid."

# Repair all fixture connections so other tests won't break.
@fixture_connections.each do |c|
c.verify!
end
end

end
end
2 changes: 2 additions & 0 deletions activerecord/test/config.example.yml
@@ -1,5 +1,7 @@
default_connection: <%= defined?(JRUBY_VERSION) ? 'jdbcsqlite3' : 'sqlite3' %>

with_manual_interventions: false

connections:
jdbcderby:
arunit: activerecord_unittest
Expand Down

0 comments on commit 6d5f4de

Please sign in to comment.