2011-06-06 14:17:44 -04:00
|
|
|
require "cases/helper"
|
2010-07-16 17:39:40 -04:00
|
|
|
|
|
|
|
module ActiveRecord
|
|
|
|
module ConnectionAdapters
|
|
|
|
class ConnectionPoolTest < ActiveRecord::TestCase
|
2011-02-04 13:19:02 -05:00
|
|
|
def setup
|
2011-12-30 17:09:39 -05:00
|
|
|
super
|
|
|
|
|
2011-02-04 13:19:02 -05:00
|
|
|
# Keep a duplicate pool so we do not bother others
|
|
|
|
@pool = ConnectionPool.new ActiveRecord::Base.connection_pool.spec
|
2011-02-11 17:32:21 -05:00
|
|
|
|
|
|
|
if in_memory_db?
|
|
|
|
# Separate connections to an in-memory database create an entirely new database,
|
|
|
|
# with an empty schema etc, so we just stub out this schema on the fly.
|
|
|
|
@pool.with_connection do |connection|
|
|
|
|
connection.create_table :posts do |t|
|
|
|
|
t.integer :cololumn
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
2011-02-04 13:19:02 -05:00
|
|
|
end
|
|
|
|
|
2011-12-30 17:09:39 -05:00
|
|
|
def teardown
|
|
|
|
super
|
|
|
|
@pool.connections.each(&:close)
|
|
|
|
end
|
|
|
|
|
2011-12-30 17:26:29 -05:00
|
|
|
def test_reap
|
|
|
|
@pool.checkout
|
|
|
|
@pool.checkout
|
|
|
|
@pool.checkout
|
|
|
|
@pool.timeout = 0
|
|
|
|
|
|
|
|
connections = @pool.connections.dup
|
|
|
|
|
|
|
|
@pool.reap
|
|
|
|
|
|
|
|
assert_equal 0, @pool.connections.length
|
|
|
|
ensure
|
|
|
|
connections.map(&:close)
|
|
|
|
end
|
|
|
|
|
2011-12-30 17:09:39 -05:00
|
|
|
def test_remove_connection
|
|
|
|
conn = @pool.checkout
|
|
|
|
assert conn.in_use?
|
|
|
|
|
|
|
|
length = @pool.connections.length
|
|
|
|
@pool.remove conn
|
|
|
|
assert conn.in_use?
|
|
|
|
assert_equal(length - 1, @pool.connections.length)
|
|
|
|
ensure
|
|
|
|
conn.close
|
|
|
|
end
|
|
|
|
|
2011-12-30 17:14:13 -05:00
|
|
|
def test_remove_connection_for_thread
|
|
|
|
conn = @pool.connection
|
|
|
|
@pool.remove conn
|
|
|
|
assert_not_equal(conn, @pool.connection)
|
|
|
|
ensure
|
|
|
|
conn.close
|
|
|
|
end
|
|
|
|
|
2011-03-28 19:43:34 -04:00
|
|
|
def test_active_connection?
|
|
|
|
assert !@pool.active_connection?
|
|
|
|
assert @pool.connection
|
|
|
|
assert @pool.active_connection?
|
|
|
|
@pool.release_connection
|
|
|
|
assert !@pool.active_connection?
|
|
|
|
end
|
|
|
|
|
2010-09-30 02:42:23 -04:00
|
|
|
def test_checkout_behaviour
|
|
|
|
pool = ConnectionPool.new ActiveRecord::Base.connection_pool.spec
|
|
|
|
connection = pool.connection
|
|
|
|
assert_not_nil connection
|
|
|
|
threads = []
|
|
|
|
4.times do |i|
|
|
|
|
threads << Thread.new(i) do |pool_count|
|
|
|
|
connection = pool.connection
|
|
|
|
assert_not_nil connection
|
2011-12-30 14:37:21 -05:00
|
|
|
connection.close
|
2010-09-30 02:42:23 -04:00
|
|
|
end
|
|
|
|
end
|
2010-11-30 16:38:48 -05:00
|
|
|
|
2011-12-30 14:37:21 -05:00
|
|
|
threads.each(&:join)
|
2010-11-30 16:38:48 -05:00
|
|
|
|
2010-09-30 02:42:23 -04:00
|
|
|
Thread.new do
|
2011-12-30 14:37:21 -05:00
|
|
|
assert pool.connection
|
2011-11-29 18:04:41 -05:00
|
|
|
pool.connection.close
|
|
|
|
end.join
|
2010-09-30 02:42:23 -04:00
|
|
|
end
|
2011-02-04 18:54:32 -05:00
|
|
|
|
|
|
|
def test_automatic_reconnect=
|
|
|
|
pool = ConnectionPool.new ActiveRecord::Base.connection_pool.spec
|
|
|
|
assert pool.automatic_reconnect
|
|
|
|
assert pool.connection
|
|
|
|
|
|
|
|
pool.disconnect!
|
|
|
|
assert pool.connection
|
|
|
|
|
|
|
|
pool.disconnect!
|
|
|
|
pool.automatic_reconnect = false
|
|
|
|
|
|
|
|
assert_raises(ConnectionNotEstablished) do
|
|
|
|
pool.connection
|
|
|
|
end
|
|
|
|
|
|
|
|
assert_raises(ConnectionNotEstablished) do
|
|
|
|
pool.with_connection
|
|
|
|
end
|
|
|
|
end
|
2011-08-08 18:27:54 -04:00
|
|
|
|
|
|
|
def test_pool_sets_connection_visitor
|
|
|
|
assert @pool.connection.visitor.is_a?(Arel::Visitors::ToSql)
|
|
|
|
end
|
2010-07-16 17:39:40 -04:00
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|