mongo 0.18.1 → 0.18.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/README.rdoc +3 -59
- data/Rakefile +7 -13
- data/bin/perf.rb +30 -0
- data/examples/cursor.rb +4 -4
- data/examples/types.rb +1 -1
- data/lib/mongo.rb +2 -2
- data/lib/mongo/admin.rb +1 -2
- data/lib/mongo/collection.rb +85 -45
- data/lib/mongo/connection.rb +55 -102
- data/lib/mongo/constants.rb +3 -3
- data/lib/mongo/cursor.rb +48 -44
- data/lib/mongo/db.rb +8 -8
- data/lib/mongo/errors.rb +8 -2
- data/lib/mongo/gridfs/chunk.rb +0 -1
- data/lib/mongo/gridfs/grid_store.rb +57 -14
- data/lib/mongo/types/code.rb +1 -0
- data/lib/mongo/types/objectid.rb +5 -6
- data/lib/mongo/util/bson_ruby.rb +25 -15
- data/lib/mongo/util/conversions.rb +12 -4
- data/lib/mongo/util/ordered_hash.rb +18 -0
- data/lib/mongo/util/server_version.rb +3 -3
- data/test/replica/count_test.rb +3 -3
- data/test/replica/insert_test.rb +6 -6
- data/test/replica/pooled_insert_test.rb +8 -8
- data/test/replica/query_test.rb +3 -3
- data/test/test_bson.rb +32 -0
- data/test/test_collection.rb +140 -65
- data/test/test_connection.rb +2 -2
- data/test/test_conversions.rb +3 -3
- data/test/test_cursor.rb +44 -20
- data/test/test_db_api.rb +7 -1
- data/test/test_grid_store.rb +16 -2
- data/test/test_objectid.rb +12 -0
- data/test/test_ordered_hash.rb +16 -0
- data/test/test_threading.rb +3 -3
- data/test/threading/test_threading_large_pool.rb +7 -7
- data/test/unit/collection_test.rb +7 -7
- data/test/unit/connection_test.rb +0 -79
- data/test/unit/cursor_test.rb +12 -12
- data/test/unit/db_test.rb +11 -11
- metadata +7 -5
- data/bin/autoreconnect.rb +0 -26
data/test/test_connection.rb
CHANGED
@@ -54,8 +54,8 @@ class TestConnection < Test::Unit::TestCase
|
|
54
54
|
def test_copy_database
|
55
55
|
@mongo.db('old').collection('copy-test').insert('a' => 1)
|
56
56
|
@mongo.copy_database('old', 'new')
|
57
|
-
old_object = @mongo.db('old').collection('copy-test').find.
|
58
|
-
new_object = @mongo.db('new').collection('copy-test').find.
|
57
|
+
old_object = @mongo.db('old').collection('copy-test').find.next_document
|
58
|
+
new_object = @mongo.db('new').collection('copy-test').find.next_document
|
59
59
|
assert_equal old_object, new_object
|
60
60
|
end
|
61
61
|
|
data/test/test_conversions.rb
CHANGED
@@ -6,9 +6,9 @@ require 'mongo/util/ordered_hash'
|
|
6
6
|
class ConversionsTest < Test::Unit::TestCase
|
7
7
|
include Mongo::Conversions
|
8
8
|
|
9
|
-
def
|
10
|
-
params = array_as_sort_parameters(["field1", "
|
11
|
-
assert_equal({
|
9
|
+
def test_array_as_sort_parameters_with_array_of_key_and_value
|
10
|
+
params = array_as_sort_parameters(["field1", "asc"])
|
11
|
+
assert_equal({"field1" => 1}, params)
|
12
12
|
end
|
13
13
|
|
14
14
|
def test_array_as_sort_parameters_with_array_of_string_and_values
|
data/test/test_cursor.rb
CHANGED
@@ -58,36 +58,60 @@ class CursorTest < Test::Unit::TestCase
|
|
58
58
|
assert_equal 0, @@db['acollectionthatdoesn'].count()
|
59
59
|
end
|
60
60
|
|
61
|
+
def test_next_object_deprecation
|
62
|
+
@@coll.remove
|
63
|
+
@@coll.insert({"a" => 1})
|
64
|
+
|
65
|
+
assert_equal 1, @@coll.find().next_object["a"]
|
66
|
+
end
|
67
|
+
|
61
68
|
def test_sort
|
62
69
|
@@coll.remove
|
63
|
-
5.times{|x| @@coll.insert({"
|
70
|
+
5.times{|x| @@coll.insert({"age" => x}) }
|
71
|
+
|
72
|
+
assert_kind_of Cursor, @@coll.find().sort(:age, 1)
|
64
73
|
|
65
|
-
|
74
|
+
assert_equal 0, @@coll.find().sort(:age, 1).next_document["age"]
|
75
|
+
assert_equal 4, @@coll.find().sort(:age, -1).next_document["age"]
|
76
|
+
assert_equal 0, @@coll.find().sort([["age", :asc]]).next_document["age"]
|
66
77
|
|
67
|
-
|
68
|
-
assert_equal 4, @@coll.find().sort(:a, -1).next_object["a"]
|
69
|
-
assert_equal 0, @@coll.find().sort([["a", :asc]]).next_object["a"]
|
78
|
+
assert_kind_of Cursor, @@coll.find().sort([[:age, -1], [:b, 1]])
|
70
79
|
|
71
|
-
|
80
|
+
assert_equal 4, @@coll.find().sort(:age, 1).sort(:age, -1).next_document["age"]
|
81
|
+
assert_equal 0, @@coll.find().sort(:age, -1).sort(:age, 1).next_document["age"]
|
72
82
|
|
73
|
-
assert_equal 4, @@coll.find().sort(:
|
74
|
-
assert_equal 0, @@coll.find().sort(:
|
83
|
+
assert_equal 4, @@coll.find().sort([:age, :asc]).sort(:age, -1).next_document["age"]
|
84
|
+
assert_equal 0, @@coll.find().sort([:age, :desc]).sort(:age, 1).next_document["age"]
|
75
85
|
|
76
86
|
cursor = @@coll.find()
|
77
|
-
cursor.
|
87
|
+
cursor.next_document
|
78
88
|
assert_raise InvalidOperation do
|
79
|
-
cursor.sort(["
|
89
|
+
cursor.sort(["age"])
|
80
90
|
end
|
81
91
|
|
82
92
|
assert_raise InvalidSortValueError do
|
83
|
-
@@coll.find().sort(:
|
93
|
+
@@coll.find().sort(:age, 25).next_document
|
84
94
|
end
|
85
95
|
|
86
96
|
assert_raise InvalidSortValueError do
|
87
|
-
@@coll.find().sort(25).
|
97
|
+
@@coll.find().sort(25).next_document
|
88
98
|
end
|
89
99
|
end
|
90
100
|
|
101
|
+
def test_sort_date
|
102
|
+
@@coll.remove
|
103
|
+
5.times{|x| @@coll.insert({"created_at" => Time.utc(2000 + x)}) }
|
104
|
+
|
105
|
+
assert_equal 2000, @@coll.find().sort(:created_at, :asc).next_document["created_at"].year
|
106
|
+
assert_equal 2004, @@coll.find().sort(:created_at, :desc).next_document["created_at"].year
|
107
|
+
|
108
|
+
assert_equal 2000, @@coll.find().sort([:created_at, :asc]).next_document["created_at"].year
|
109
|
+
assert_equal 2004, @@coll.find().sort([:created_at, :desc]).next_document["created_at"].year
|
110
|
+
|
111
|
+
assert_equal 2000, @@coll.find().sort([[:created_at, :asc]]).next_document["created_at"].year
|
112
|
+
assert_equal 2004, @@coll.find().sort([[:created_at, :desc]]).next_document["created_at"].year
|
113
|
+
end
|
114
|
+
|
91
115
|
def test_limit
|
92
116
|
@@coll.remove
|
93
117
|
|
@@ -106,7 +130,7 @@ class CursorTest < Test::Unit::TestCase
|
|
106
130
|
end
|
107
131
|
|
108
132
|
cursor = @@coll.find()
|
109
|
-
firstResult = cursor.
|
133
|
+
firstResult = cursor.next_document
|
110
134
|
assert_raise InvalidOperation, "Cannot modify the query once it has been run or closed." do
|
111
135
|
cursor.limit(1)
|
112
136
|
end
|
@@ -140,7 +164,7 @@ class CursorTest < Test::Unit::TestCase
|
|
140
164
|
end
|
141
165
|
|
142
166
|
cursor = @@coll.find()
|
143
|
-
firstResult = cursor.
|
167
|
+
firstResult = cursor.next_document
|
144
168
|
assert_raise InvalidOperation, "Cannot modify the query once it has been run or closed." do
|
145
169
|
cursor.skip(1)
|
146
170
|
end
|
@@ -233,7 +257,7 @@ class CursorTest < Test::Unit::TestCase
|
|
233
257
|
def test_close_after_query_sent
|
234
258
|
begin
|
235
259
|
cursor = @@coll.find('a' => 1)
|
236
|
-
cursor.
|
260
|
+
cursor.next_document
|
237
261
|
cursor.close
|
238
262
|
assert cursor.closed?
|
239
263
|
rescue => ex
|
@@ -267,7 +291,7 @@ class CursorTest < Test::Unit::TestCase
|
|
267
291
|
|
268
292
|
10.times do |i|
|
269
293
|
a = @@coll.find()
|
270
|
-
a.
|
294
|
+
a.next_document
|
271
295
|
a.close()
|
272
296
|
end
|
273
297
|
|
@@ -277,7 +301,7 @@ class CursorTest < Test::Unit::TestCase
|
|
277
301
|
@@db.command("cursorInfo" => 1)["byLocation_size"])
|
278
302
|
|
279
303
|
a = @@coll.find()
|
280
|
-
a.
|
304
|
+
a.next_document
|
281
305
|
|
282
306
|
assert_not_equal(client_cursors,
|
283
307
|
@@db.command("cursorInfo" => 1)["clientCursors_size"])
|
@@ -291,7 +315,7 @@ class CursorTest < Test::Unit::TestCase
|
|
291
315
|
assert_equal(by_location,
|
292
316
|
@@db.command("cursorInfo" => 1)["byLocation_size"])
|
293
317
|
|
294
|
-
a = @@coll.find({}, :limit => 10).
|
318
|
+
a = @@coll.find({}, :limit => 10).next_document
|
295
319
|
|
296
320
|
assert_equal(client_cursors,
|
297
321
|
@@db.command("cursorInfo" => 1)["clientCursors_size"])
|
@@ -299,7 +323,7 @@ class CursorTest < Test::Unit::TestCase
|
|
299
323
|
@@db.command("cursorInfo" => 1)["byLocation_size"])
|
300
324
|
|
301
325
|
@@coll.find() do |cursor|
|
302
|
-
cursor.
|
326
|
+
cursor.next_document
|
303
327
|
end
|
304
328
|
|
305
329
|
assert_equal(client_cursors,
|
@@ -308,7 +332,7 @@ class CursorTest < Test::Unit::TestCase
|
|
308
332
|
@@db.command("cursorInfo" => 1)["byLocation_size"])
|
309
333
|
|
310
334
|
@@coll.find() { |cursor|
|
311
|
-
cursor.
|
335
|
+
cursor.next_document
|
312
336
|
}
|
313
337
|
|
314
338
|
assert_equal(client_cursors,
|
data/test/test_db_api.rb
CHANGED
@@ -180,7 +180,7 @@ class DBAPITest < Test::Unit::TestCase
|
|
180
180
|
assert_equal 3, docs[2]['a']
|
181
181
|
assert_equal 4, docs[3]['a']
|
182
182
|
|
183
|
-
docs = @@coll.find({'a' => { '$lt' => 10 }}, :sort => ['b', 'a']).to_a
|
183
|
+
docs = @@coll.find({'a' => { '$lt' => 10 }}, :sort => [['b', 'asc'], ['a', 'asc']]).to_a
|
184
184
|
assert_equal 4, docs.size
|
185
185
|
assert_equal 2, docs[0]['a']
|
186
186
|
assert_equal 4, docs[1]['a']
|
@@ -553,6 +553,12 @@ class DBAPITest < Test::Unit::TestCase
|
|
553
553
|
assert_equal 1, test.group([], {"a" => {"$gt" => 1}}, {"count" => 0}, "function (obj, prev) { prev.count++; }")[0]["count"]
|
554
554
|
assert_equal 1, test.group([], {"a" => {"$gt" => 1}}, {"count" => 0}, "function (obj, prev) { prev.count++; }", true)[0]["count"]
|
555
555
|
|
556
|
+
finalize = "function (obj) { obj.f = obj.count - 1; }"
|
557
|
+
assert_equal 2, test.group([], {}, {"count" => 0}, "function (obj, prev) { prev.count++; }", true, finalize)[0]["f"]
|
558
|
+
assert_raise OperationFailure do
|
559
|
+
test.group([], {}, {"count" => 0}, "function (obj, prev) { prev.count++; }", false, finalize)[0]["f"]
|
560
|
+
end
|
561
|
+
|
556
562
|
test.insert("a" => 2, "b" => 3)
|
557
563
|
expected = [{"a" => 2, "count" => 2},
|
558
564
|
{"a" => nil, "count" => 1},
|
data/test/test_grid_store.rb
CHANGED
@@ -71,9 +71,23 @@ class GridStoreTest < Test::Unit::TestCase
|
|
71
71
|
assert_equal "hello", GridStore.read(@@db, 'foobar', 5)
|
72
72
|
end
|
73
73
|
|
74
|
+
def test_read_with_and_without_length
|
75
|
+
GridStore.open(@@db, 'read-types', 'w') do |f|
|
76
|
+
f.write('hello, there')
|
77
|
+
end
|
78
|
+
|
79
|
+
GridStore.open(@@db, 'read-types', 'r') do |f|
|
80
|
+
assert_equal 'hello, ', f.read(7)
|
81
|
+
assert_equal 'there', f.read
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
def test_access_length
|
86
|
+
assert_equal 13, GridStore.new(@@db, 'foobar').length
|
87
|
+
end
|
88
|
+
|
74
89
|
# Also tests seek
|
75
90
|
def test_read_with_offset
|
76
|
-
assert_equal "world", GridStore.read(@@db, 'foobar', 5, 7)
|
77
91
|
assert_equal "world!", GridStore.read(@@db, 'foobar', nil, 7)
|
78
92
|
end
|
79
93
|
|
@@ -116,7 +130,7 @@ class GridStoreTest < Test::Unit::TestCase
|
|
116
130
|
}
|
117
131
|
|
118
132
|
assert_equal 3, @@chunks.count
|
119
|
-
assert_equal ('x' * size) + ('y' * size) + ('z' * size), GridStore.read(@@db, 'biggie')
|
133
|
+
#assert_equal ('x' * size) + ('y' * size) + ('z' * size), GridStore.read(@@db, 'biggie')
|
120
134
|
end
|
121
135
|
|
122
136
|
def test_puts_and_readlines
|
data/test/test_objectid.rb
CHANGED
@@ -79,6 +79,12 @@ class ObjectIDTest < Test::Unit::TestCase
|
|
79
79
|
assert_equal @o.to_s, o2.to_s
|
80
80
|
end
|
81
81
|
|
82
|
+
def test_illegal_from_string
|
83
|
+
assert_raise InvalidObjectID do
|
84
|
+
ObjectID.from_string("")
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
82
88
|
def test_from_string_legacy
|
83
89
|
hex_str = @o.to_s_legacy
|
84
90
|
o2 = ObjectID.from_string_legacy(hex_str)
|
@@ -87,6 +93,12 @@ class ObjectIDTest < Test::Unit::TestCase
|
|
87
93
|
assert_equal @o.to_s, o2.to_s
|
88
94
|
end
|
89
95
|
|
96
|
+
def test_illegal_from_string_legacy
|
97
|
+
assert_raise InvalidObjectID do
|
98
|
+
ObjectID.from_string_legacy("")
|
99
|
+
end
|
100
|
+
end
|
101
|
+
|
90
102
|
def test_legal
|
91
103
|
assert !ObjectID.legal?(nil)
|
92
104
|
assert !ObjectID.legal?("fred")
|
data/test/test_ordered_hash.rb
CHANGED
@@ -23,6 +23,22 @@ class OrderedHashTest < Test::Unit::TestCase
|
|
23
23
|
assert_equal [], OrderedHash.new.keys
|
24
24
|
end
|
25
25
|
|
26
|
+
def test_uniq
|
27
|
+
list = []
|
28
|
+
doc = OrderedHash.new
|
29
|
+
doc['_id'] = 'ab12'
|
30
|
+
doc['name'] = 'test'
|
31
|
+
|
32
|
+
same_doc = OrderedHash.new
|
33
|
+
same_doc['_id'] = 'ab12'
|
34
|
+
same_doc['name'] = 'test'
|
35
|
+
list << doc
|
36
|
+
list << same_doc
|
37
|
+
|
38
|
+
assert_equal 2, list.size
|
39
|
+
assert_equal 1, list.uniq.size
|
40
|
+
end
|
41
|
+
|
26
42
|
def test_equality
|
27
43
|
a = OrderedHash.new
|
28
44
|
a['x'] = 1
|
data/test/test_threading.rb
CHANGED
@@ -4,7 +4,7 @@ class TestThreading < Test::Unit::TestCase
|
|
4
4
|
|
5
5
|
include Mongo
|
6
6
|
|
7
|
-
@@db = Connection.new('localhost', 27017, :pool_size => 1, :timeout =>
|
7
|
+
@@db = Connection.new('localhost', 27017, :pool_size => 1, :timeout => 30).db('ruby-mongo-test')
|
8
8
|
@@coll = @@db.collection('thread-test-collection')
|
9
9
|
|
10
10
|
def set_up_safe_data
|
@@ -34,7 +34,7 @@ class TestThreading < Test::Unit::TestCase
|
|
34
34
|
end
|
35
35
|
end
|
36
36
|
end
|
37
|
-
|
37
|
+
|
38
38
|
100.times do |i|
|
39
39
|
threads[i].join
|
40
40
|
end
|
@@ -54,7 +54,7 @@ class TestThreading < Test::Unit::TestCase
|
|
54
54
|
end
|
55
55
|
end
|
56
56
|
end
|
57
|
-
|
57
|
+
|
58
58
|
100.times do |i|
|
59
59
|
threads[i].join
|
60
60
|
end
|
@@ -6,7 +6,7 @@ class TestThreadingLargePool < Test::Unit::TestCase
|
|
6
6
|
|
7
7
|
include Mongo
|
8
8
|
|
9
|
-
@@db = Connection.new('localhost', 27017, :pool_size => 50, :timeout =>
|
9
|
+
@@db = Connection.new('localhost', 27017, :pool_size => 50, :timeout => 60).db('ruby-mongo-test')
|
10
10
|
@@coll = @@db.collection('thread-test-collection')
|
11
11
|
|
12
12
|
def set_up_safe_data
|
@@ -25,7 +25,7 @@ class TestThreadingLargePool < Test::Unit::TestCase
|
|
25
25
|
def test_safe_update
|
26
26
|
set_up_safe_data
|
27
27
|
threads = []
|
28
|
-
|
28
|
+
1000.times do |i|
|
29
29
|
threads[i] = Thread.new do
|
30
30
|
if i % 2 == 0
|
31
31
|
assert_raise Mongo::OperationFailure do
|
@@ -36,8 +36,8 @@ class TestThreadingLargePool < Test::Unit::TestCase
|
|
36
36
|
end
|
37
37
|
end
|
38
38
|
end
|
39
|
-
|
40
|
-
|
39
|
+
|
40
|
+
1000.times do |i|
|
41
41
|
threads[i].join
|
42
42
|
end
|
43
43
|
end
|
@@ -45,7 +45,7 @@ class TestThreadingLargePool < Test::Unit::TestCase
|
|
45
45
|
def test_safe_insert
|
46
46
|
set_up_safe_data
|
47
47
|
threads = []
|
48
|
-
|
48
|
+
1000.times do |i|
|
49
49
|
threads[i] = Thread.new do
|
50
50
|
if i % 2 == 0
|
51
51
|
assert_raise Mongo::OperationFailure do
|
@@ -56,8 +56,8 @@ class TestThreadingLargePool < Test::Unit::TestCase
|
|
56
56
|
end
|
57
57
|
end
|
58
58
|
end
|
59
|
-
|
60
|
-
|
59
|
+
|
60
|
+
1000.times do |i|
|
61
61
|
threads[i].join
|
62
62
|
end
|
63
63
|
end
|
@@ -2,26 +2,26 @@ require 'test/test_helper'
|
|
2
2
|
|
3
3
|
class ConnectionTest < Test::Unit::TestCase
|
4
4
|
|
5
|
-
context "Basic operations: " do
|
6
|
-
setup do
|
5
|
+
context "Basic operations: " do
|
6
|
+
setup do
|
7
7
|
@logger = mock()
|
8
8
|
end
|
9
9
|
|
10
|
-
should "send update message" do
|
10
|
+
should "send update message" do
|
11
11
|
@conn = Connection.new('localhost', 27017, :logger => @logger, :connect => false)
|
12
12
|
@db = @conn['testing']
|
13
13
|
@coll = @db.collection('books')
|
14
|
-
@conn.expects(:send_message).with do |op, msg, log|
|
14
|
+
@conn.expects(:send_message).with do |op, msg, log|
|
15
15
|
op == 2001 && log.include?("db.books.update")
|
16
16
|
end
|
17
17
|
@coll.update({}, {:title => 'Moby Dick'})
|
18
18
|
end
|
19
19
|
|
20
|
-
should "send insert message" do
|
20
|
+
should "send insert message" do
|
21
21
|
@conn = Connection.new('localhost', 27017, :logger => @logger, :connect => false)
|
22
22
|
@db = @conn['testing']
|
23
23
|
@coll = @db.collection('books')
|
24
|
-
@conn.expects(:send_message).with do |op, msg, log|
|
24
|
+
@conn.expects(:send_message).with do |op, msg, log|
|
25
25
|
op == 2002 && log.include?("db.books.insert")
|
26
26
|
end
|
27
27
|
@coll.insert({:title => 'Moby Dick'})
|
@@ -49,4 +49,4 @@ class ConnectionTest < Test::Unit::TestCase
|
|
49
49
|
end
|
50
50
|
end
|
51
51
|
|
52
|
-
|
52
|
+
|
@@ -12,11 +12,6 @@ class ConnectionTest < Test::Unit::TestCase
|
|
12
12
|
db = Object.new
|
13
13
|
end
|
14
14
|
|
15
|
-
# Make a few methods public for these tests.
|
16
|
-
class Mongo::Connection
|
17
|
-
public :checkin, :checkout, :clear_stale_cached_connections!
|
18
|
-
end
|
19
|
-
|
20
15
|
context "Initialization: " do
|
21
16
|
|
22
17
|
context "given a single node" do
|
@@ -60,79 +55,5 @@ class ConnectionTest < Test::Unit::TestCase
|
|
60
55
|
assert_equal 2500, @conn.port
|
61
56
|
end
|
62
57
|
end
|
63
|
-
|
64
|
-
context "Connection pooling: " do
|
65
|
-
setup do
|
66
|
-
TCPSocket.stubs(:new).returns(new_mock_socket)
|
67
|
-
@conn = Connection.new('localhost', 27107, :connect => false,
|
68
|
-
:pool_size => 3)
|
69
|
-
|
70
|
-
admin_db = new_mock_db
|
71
|
-
admin_db.expects(:command).returns({'ok' => 1, 'ismaster' => 1})
|
72
|
-
@conn.expects(:[]).with('admin').returns(admin_db)
|
73
|
-
@conn.connect_to_master
|
74
|
-
end
|
75
|
-
|
76
|
-
should "check out a new connection" do
|
77
|
-
socket = @conn.checkout
|
78
|
-
assert @conn.reserved_connections.keys.include?(Thread.current.object_id)
|
79
|
-
end
|
80
|
-
|
81
|
-
context "with multiple threads" do
|
82
|
-
setup do
|
83
|
-
@thread1 = Object.new
|
84
|
-
@thread2 = Object.new
|
85
|
-
@thread3 = Object.new
|
86
|
-
@thread4 = Object.new
|
87
|
-
|
88
|
-
Thread.stubs(:current).returns(@thread1)
|
89
|
-
@socket1 = @conn.checkout
|
90
|
-
Thread.stubs(:current).returns(@thread2)
|
91
|
-
@socket2 = @conn.checkout
|
92
|
-
Thread.stubs(:current).returns(@thread3)
|
93
|
-
@socket3 = @conn.checkout
|
94
|
-
end
|
95
|
-
|
96
|
-
should "add each thread to the reserved pool" do
|
97
|
-
assert @conn.reserved_connections.keys.include?(@thread1.object_id)
|
98
|
-
assert @conn.reserved_connections.keys.include?(@thread2.object_id)
|
99
|
-
assert @conn.reserved_connections.keys.include?(@thread3.object_id)
|
100
|
-
end
|
101
|
-
|
102
|
-
should "only add one socket per thread" do
|
103
|
-
@conn.reserved_connections.values do |socket|
|
104
|
-
assert [@socket1, @socket2, @socket3].include?(socket)
|
105
|
-
end
|
106
|
-
end
|
107
|
-
|
108
|
-
should "check out all sockets" do
|
109
|
-
assert_equal @conn.sockets.size, @conn.checked_out.size
|
110
|
-
@conn.sockets.each do |sock|
|
111
|
-
assert @conn.checked_out.include?(sock)
|
112
|
-
end
|
113
|
-
end
|
114
|
-
|
115
|
-
should "raise an error if no more sockets can be checked out" do
|
116
|
-
# This can't be tested with mock threads.
|
117
|
-
# Will test in integration tests.
|
118
|
-
end
|
119
|
-
|
120
|
-
context "when releasing dead threads" do
|
121
|
-
setup do
|
122
|
-
@thread1.expects(:alive?).returns(false)
|
123
|
-
@thread2.expects(:alive?).returns(true)
|
124
|
-
@thread3.expects(:alive?).returns(true)
|
125
|
-
Thread.expects(:list).returns([@thread1, @thread2, @thread3])
|
126
|
-
@conn.clear_stale_cached_connections!
|
127
|
-
end
|
128
|
-
|
129
|
-
should "return connections for dead threads" do
|
130
|
-
assert !@conn.checked_out.include?(@socket1)
|
131
|
-
assert_nil @conn.reserved_connections[@thread1.object_id]
|
132
|
-
end
|
133
|
-
end
|
134
|
-
|
135
|
-
end
|
136
|
-
end
|
137
58
|
end
|
138
59
|
|