blob: f92f4e62c5cc1cb45e8c8d846f30ebd2cad61097 (
plain) (
blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
|
require "cases/helper"
module ActiveRecord
module ConnectionAdapters
class ConnectionPoolTest < ActiveRecord::TestCase
def setup
# Keep a duplicate pool so we do not bother others
@pool = ConnectionPool.new ActiveRecord::Base.connection_pool.spec
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
end
def test_active_connection?
assert !@pool.active_connection?
assert @pool.connection
assert @pool.active_connection?
@pool.release_connection
assert !@pool.active_connection?
end
def test_pool_caches_columns
columns = @pool.columns['posts']
assert_equal columns, @pool.columns['posts']
end
def test_pool_caches_columns_hash
columns_hash = @pool.columns_hash['posts']
assert_equal columns_hash, @pool.columns_hash['posts']
end
def test_clearing_column_cache
@pool.columns['posts']
@pool.columns_hash['posts']
@pool.clear_cache!
assert_equal 0, @pool.columns.size
assert_equal 0, @pool.columns_hash.size
end
def test_primary_key
assert_equal 'id', @pool.primary_keys['posts']
end
def test_primary_key_for_non_existent_table
assert_equal 'id', @pool.primary_keys['omgponies']
end
def test_primary_key_is_set_on_columns
posts_columns = @pool.columns_hash['posts']
assert posts_columns['id'].primary
(posts_columns.keys - ['id']).each do |key|
assert !posts_columns[key].primary
end
end
def test_clear_stale_cached_connections!
pool = ConnectionPool.new ActiveRecord::Base.connection_pool.spec
threads = [
Thread.new { pool.connection },
Thread.new { pool.connection }]
threads.map { |t| t.join }
pool.extend Module.new {
attr_accessor :checkins
def checkin conn
@checkins << conn
conn.object_id
end
}
pool.checkins = []
cleared_threads = pool.clear_stale_cached_connections!
assert((cleared_threads - threads.map { |x| x.object_id }).empty?,
"threads should have been removed")
assert_equal pool.checkins.length, threads.length
end
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
end
end
threads.each {|t| t.join}
Thread.new do
threads.each do |t|
thread_ids = pool.instance_variable_get(:@reserved_connections).keys
assert thread_ids.include?(t.object_id)
end
pool.connection
threads.each do |t|
thread_ids = pool.instance_variable_get(:@reserved_connections).keys
assert !thread_ids.include?(t.object_id)
end
end.join()
end
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
end
end
end
|