blob: 28cdd1d588cbb2950941e94f0a0aa45ddfa6368b (
plain) (
tree)
|
|
require "cases/helper"
module ActiveRecord
class PostgresqlConnectionTest < ActiveRecord::TestCase
def setup
super
@connection = ActiveRecord::Base.connection
end
def test_encoding
assert_not_nil @connection.encoding
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 on next query attempt.
raw_connection = @connection.raw_connection
raw_connection_class = class << raw_connection ; self ; end
raw_connection_class.class_eval <<-CODE, __FILE__, __LINE__ + 1
def query_fake(*args)
if !( @called ||= false )
self.stubs(:status).returns(PGconn::CONNECTION_BAD)
@called = true
raise PGError
else
self.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
raw_connection_class.class_eval <<-CODE
alias query query_unfake
undef query_fake
CODE
end
assert_not_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
return 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
|