mongo 1.8.3 → 1.8.4.rc0
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.
- checksums.yaml +14 -6
- checksums.yaml.gz.sig +0 -0
- data.tar.gz.sig +0 -0
- data/VERSION +1 -1
- data/lib/mongo.rb +11 -0
- data/lib/mongo/collection.rb +54 -49
- data/lib/mongo/cursor.rb +8 -4
- data/lib/mongo/db.rb +107 -112
- data/lib/mongo/mongo_client.rb +18 -14
- data/lib/mongo/mongo_replica_set_client.rb +17 -10
- data/lib/mongo/util/pool.rb +0 -19
- data/lib/mongo/util/pool_manager.rb +0 -21
- data/lib/mongo/util/read_preference.rb +40 -12
- data/lib/mongo/util/uri_parser.rb +2 -2
- data/mongo.gemspec +1 -0
- data/test/auxillary/pool_reuse_test.rb +0 -0
- data/test/bson/object_id_test.rb +7 -1
- data/test/functional/collection_test.rb +24 -1
- data/test/functional/connection_test.rb +7 -7
- data/test/functional/db_api_test.rb +5 -6
- data/test/functional/uri_test.rb +16 -16
- data/test/replica_set/basic_test.rb +1 -1
- data/test/replica_set/pinning_test.rb +41 -0
- data/test/replica_set/refresh_test.rb +0 -0
- data/test/sharded_cluster/basic_test.rb +0 -0
- data/test/unit/client_test.rb +2 -2
- data/test/unit/collection_test.rb +1 -1
- data/test/unit/connection_test.rb +2 -2
- data/test/unit/db_test.rb +0 -1
- data/test/unit/pool_manager_test.rb +0 -0
- metadata +41 -30
- metadata.gz.sig +5 -2
data/lib/mongo/mongo_client.rb
CHANGED
@@ -241,7 +241,7 @@ module Mongo
|
|
241
241
|
def apply_saved_authentication(opts={})
|
242
242
|
return false if @auths.empty?
|
243
243
|
@auths.each do |auth|
|
244
|
-
self[auth[
|
244
|
+
self[auth[:db_name]].issue_authentication(auth[:username], auth[:password], false,
|
245
245
|
:socket => opts[:socket])
|
246
246
|
end
|
247
247
|
true
|
@@ -261,11 +261,15 @@ module Mongo
|
|
261
261
|
#
|
262
262
|
# @return [Hash] a hash representing the authentication just added.
|
263
263
|
def add_auth(db_name, username, password)
|
264
|
-
|
265
|
-
|
266
|
-
|
267
|
-
|
268
|
-
auth
|
264
|
+
if @auths.any? {|a| a[:db_name] == db_name}
|
265
|
+
raise MongoArgumentError, "Cannot apply multiple authentications to database '#{db_name}'"
|
266
|
+
end
|
267
|
+
|
268
|
+
auth = {
|
269
|
+
:db_name => db_name,
|
270
|
+
:username => username,
|
271
|
+
:password => password
|
272
|
+
}
|
269
273
|
@auths << auth
|
270
274
|
auth
|
271
275
|
end
|
@@ -277,11 +281,7 @@ module Mongo
|
|
277
281
|
# @return [Boolean]
|
278
282
|
def remove_auth(db_name)
|
279
283
|
return unless @auths
|
280
|
-
|
281
|
-
true
|
282
|
-
else
|
283
|
-
false
|
284
|
-
end
|
284
|
+
@auths.reject! { |a| a[:db_name] == db_name } ? true : false
|
285
285
|
end
|
286
286
|
|
287
287
|
# Remove all authentication information stored in this connection.
|
@@ -351,10 +351,14 @@ module Mongo
|
|
351
351
|
def refresh
|
352
352
|
end
|
353
353
|
|
354
|
-
def
|
354
|
+
def pinned_pool
|
355
|
+
@primary_pool
|
356
|
+
end
|
357
|
+
|
358
|
+
def pin_pool(pool, read_prefs)
|
355
359
|
end
|
356
360
|
|
357
|
-
def unpin_pool
|
361
|
+
def unpin_pool
|
358
362
|
end
|
359
363
|
|
360
364
|
# Drop a database.
|
@@ -521,7 +525,7 @@ module Mongo
|
|
521
525
|
|
522
526
|
# Checkout a socket for reading (i.e., a secondary node).
|
523
527
|
# Note: this is overridden in MongoReplicaSetClient.
|
524
|
-
def checkout_reader(
|
528
|
+
def checkout_reader(read_preference)
|
525
529
|
connect unless connected?
|
526
530
|
@primary_pool.checkout
|
527
531
|
end
|
@@ -2,6 +2,7 @@ module Mongo
|
|
2
2
|
|
3
3
|
# Instantiates and manages connections to a MongoDB replica set.
|
4
4
|
class MongoReplicaSetClient < MongoClient
|
5
|
+
include ReadPreference
|
5
6
|
include ThreadLocalVariableManager
|
6
7
|
|
7
8
|
REPL_SET_OPTS = [
|
@@ -268,7 +269,7 @@ module Mongo
|
|
268
269
|
#
|
269
270
|
# @return [Boolean]
|
270
271
|
def read_primary?
|
271
|
-
|
272
|
+
read_pool == primary_pool
|
272
273
|
end
|
273
274
|
alias :primary? :read_primary?
|
274
275
|
|
@@ -282,6 +283,7 @@ module Mongo
|
|
282
283
|
|
283
284
|
# Clear the reference to this object.
|
284
285
|
thread_local[:managers].delete(self)
|
286
|
+
unpin_pool
|
285
287
|
|
286
288
|
@connected = false
|
287
289
|
end
|
@@ -335,9 +337,9 @@ module Mongo
|
|
335
337
|
end
|
336
338
|
end
|
337
339
|
|
338
|
-
def checkout_reader(
|
340
|
+
def checkout_reader(read_pref={})
|
339
341
|
checkout do
|
340
|
-
pool = read_pool(
|
342
|
+
pool = read_pool(read_pref)
|
341
343
|
get_socket_from_pool(pool)
|
342
344
|
end
|
343
345
|
end
|
@@ -361,11 +363,20 @@ module Mongo
|
|
361
363
|
thread_local[:managers][self] = @manager
|
362
364
|
end
|
363
365
|
|
364
|
-
def
|
365
|
-
thread_local[:pinned_pools][@manager.object_id]
|
366
|
+
def pinned_pool
|
367
|
+
thread_local[:pinned_pools][@manager.object_id] if @manager
|
366
368
|
end
|
367
369
|
|
368
|
-
def
|
370
|
+
def pin_pool(pool, read_preference)
|
371
|
+
if @manager
|
372
|
+
thread_local[:pinned_pools][@manager.object_id] = {
|
373
|
+
:pool => pool,
|
374
|
+
:read_preference => read_preference
|
375
|
+
}
|
376
|
+
end
|
377
|
+
end
|
378
|
+
|
379
|
+
def unpin_pool
|
369
380
|
thread_local[:pinned_pools].delete @manager.object_id if @manager
|
370
381
|
end
|
371
382
|
|
@@ -402,10 +413,6 @@ module Mongo
|
|
402
413
|
local_manager ? local_manager.primary_pool : nil
|
403
414
|
end
|
404
415
|
|
405
|
-
def read_pool(mode=@read, tags=@tag_sets, acceptable_latency=@acceptable_latency)
|
406
|
-
local_manager ? local_manager.read_pool(mode, tags, acceptable_latency) : nil
|
407
|
-
end
|
408
|
-
|
409
416
|
def secondary_pool
|
410
417
|
local_manager ? local_manager.secondary_pool : nil
|
411
418
|
end
|
data/lib/mongo/util/pool.rb
CHANGED
@@ -85,25 +85,6 @@ module Mongo
|
|
85
85
|
!@closed
|
86
86
|
end
|
87
87
|
|
88
|
-
def matches_mode(mode)
|
89
|
-
if mode == :primary && @node.secondary? ||
|
90
|
-
mode == :secondary && @node.primary?
|
91
|
-
false
|
92
|
-
else
|
93
|
-
true
|
94
|
-
end
|
95
|
-
end
|
96
|
-
|
97
|
-
def matches_tag_set(tag_set)
|
98
|
-
tag_set.all? do |tag, value|
|
99
|
-
tags.has_key?(tag) && tags[tag] == value
|
100
|
-
end
|
101
|
-
end
|
102
|
-
|
103
|
-
def matches_tag_sets(tag_sets)
|
104
|
-
tag_sets.all? {|set| matches_tag_set(set)}
|
105
|
-
end
|
106
|
-
|
107
88
|
def inspect
|
108
89
|
"#<Mongo::Pool:0x#{self.object_id.to_s(16)} @host=#{@host} @port=#{port} " +
|
109
90
|
"@ping_time=#{@ping_time} #{@checked_out.size}/#{@size} sockets available " +
|
@@ -1,6 +1,5 @@
|
|
1
1
|
module Mongo
|
2
2
|
class PoolManager
|
3
|
-
include Mongo::ReadPreference
|
4
3
|
include ThreadLocalVariableManager
|
5
4
|
|
6
5
|
attr_reader :client,
|
@@ -114,26 +113,6 @@ module Mongo
|
|
114
113
|
read_pool.host_port
|
115
114
|
end
|
116
115
|
|
117
|
-
def read_pool(mode=@client.read,
|
118
|
-
tags=@client.tag_sets,
|
119
|
-
acceptable_latency=@client.acceptable_latency)
|
120
|
-
|
121
|
-
pinned = thread_local[:pinned_pools][self.object_id]
|
122
|
-
|
123
|
-
if pinned && pinned.matches_mode(mode) && pinned.matches_tag_sets(tags) && pinned.up?
|
124
|
-
pool = pinned
|
125
|
-
else
|
126
|
-
pool = select_pool(mode, tags, acceptable_latency)
|
127
|
-
end
|
128
|
-
|
129
|
-
unless pool
|
130
|
-
raise ConnectionFailure, "No replica set member available for query " +
|
131
|
-
"with read preference matching mode #{mode} and tags matching #{tags}."
|
132
|
-
end
|
133
|
-
|
134
|
-
pool
|
135
|
-
end
|
136
|
-
|
137
116
|
def max_bson_size
|
138
117
|
@max_bson_size ||= config_min('maxBsonObjectSize', DEFAULT_MAX_BSON_SIZE)
|
139
118
|
end
|
@@ -33,29 +33,56 @@ module Mongo
|
|
33
33
|
end
|
34
34
|
end
|
35
35
|
|
36
|
-
def
|
37
|
-
|
36
|
+
def read_preference
|
37
|
+
{
|
38
|
+
:mode => @read,
|
39
|
+
:tags => @tag_sets,
|
40
|
+
:latency => @acceptable_latency
|
41
|
+
}
|
42
|
+
end
|
43
|
+
|
44
|
+
def read_pool(read_preference_override={})
|
45
|
+
return primary_pool if mongos?
|
46
|
+
|
47
|
+
read_pref = read_preference.merge(read_preference_override)
|
48
|
+
|
49
|
+
if pinned_pool && pinned_pool[:read_preference] == read_pref
|
50
|
+
pool = pinned_pool[:pool]
|
51
|
+
else
|
52
|
+
unpin_pool
|
53
|
+
pool = select_pool(read_pref)
|
54
|
+
end
|
55
|
+
|
56
|
+
unless pool
|
57
|
+
raise ConnectionFailure, "No replica set member available for query " +
|
58
|
+
"with read preference matching mode #{read_pref[:mode]} and tags " +
|
59
|
+
"matching #{read_pref[:tags]}."
|
60
|
+
end
|
61
|
+
|
62
|
+
pool
|
63
|
+
end
|
38
64
|
|
39
|
-
|
65
|
+
def select_pool(read_pref)
|
66
|
+
if read_pref[:mode] == :primary && !read_pref[:tags].empty?
|
40
67
|
raise MongoArgumentError, "Read preference :primary cannot be combined with tags"
|
41
68
|
end
|
42
69
|
|
43
|
-
case mode
|
70
|
+
case read_pref[:mode]
|
44
71
|
when :primary
|
45
72
|
primary_pool
|
46
73
|
when :primary_preferred
|
47
|
-
primary_pool || select_secondary_pool(secondary_pools,
|
74
|
+
primary_pool || select_secondary_pool(secondary_pools, read_pref)
|
48
75
|
when :secondary
|
49
|
-
select_secondary_pool(secondary_pools,
|
76
|
+
select_secondary_pool(secondary_pools, read_pref)
|
50
77
|
when :secondary_preferred
|
51
|
-
select_secondary_pool(secondary_pools,
|
78
|
+
select_secondary_pool(secondary_pools, read_pref) || primary_pool
|
52
79
|
when :nearest
|
53
|
-
select_secondary_pool(pools,
|
80
|
+
select_secondary_pool(pools, read_pref)
|
54
81
|
end
|
55
82
|
end
|
56
83
|
|
57
|
-
def select_secondary_pool(candidates,
|
58
|
-
tag_sets = [
|
84
|
+
def select_secondary_pool(candidates, read_pref)
|
85
|
+
tag_sets = read_pref[:tags]
|
59
86
|
|
60
87
|
if !tag_sets.empty?
|
61
88
|
matches = []
|
@@ -70,10 +97,11 @@ module Mongo
|
|
70
97
|
matches = candidates
|
71
98
|
end
|
72
99
|
|
73
|
-
matches.empty? ? nil : select_near_pool(matches,
|
100
|
+
matches.empty? ? nil : select_near_pool(matches, read_pref)
|
74
101
|
end
|
75
102
|
|
76
|
-
def select_near_pool(candidates,
|
103
|
+
def select_near_pool(candidates, read_pref)
|
104
|
+
latency = read_pref[:latency]
|
77
105
|
nearest_pool = candidates.min_by { |candidate| candidate.ping_time }
|
78
106
|
near_pools = candidates.select do |candidate|
|
79
107
|
(candidate.ping_time - nearest_pool.ping_time) <= latency
|
@@ -220,7 +220,7 @@ module Mongo
|
|
220
220
|
opts[:pool_size] = @pool_size
|
221
221
|
end
|
222
222
|
|
223
|
-
if @readpreference
|
223
|
+
if @readpreference
|
224
224
|
opts[:read] = @readpreference
|
225
225
|
end
|
226
226
|
|
@@ -285,7 +285,7 @@ module Mongo
|
|
285
285
|
end
|
286
286
|
|
287
287
|
if uname && pwd && db
|
288
|
-
auths << {
|
288
|
+
auths << {:db_name => db, :username => uname, :password => pwd}
|
289
289
|
elsif uname || pwd
|
290
290
|
raise MongoArgumentError, "MongoDB URI must include username, password, "
|
291
291
|
"and db if username and password are specified."
|
data/mongo.gemspec
CHANGED
@@ -9,6 +9,7 @@ Gem::Specification.new do |s|
|
|
9
9
|
s.summary = 'Ruby driver for MongoDB'
|
10
10
|
s.description = 'A Ruby driver for MongoDB. For more information about Mongo, see http://www.mongodb.org.'
|
11
11
|
s.rubyforge_project = 'mongo'
|
12
|
+
s.license = 'Apache License Version 2.0'
|
12
13
|
|
13
14
|
s.signing_key = 'gem-private_key.pem'
|
14
15
|
s.cert_chain = ['gem-public_cert.pem']
|
File without changes
|
data/test/bson/object_id_test.rb
CHANGED
@@ -70,11 +70,17 @@ class ObjectIdTest < Test::Unit::TestCase
|
|
70
70
|
end
|
71
71
|
|
72
72
|
def test_illegal_from_string
|
73
|
-
assert_raise InvalidObjectId do
|
73
|
+
assert_raise InvalidObjectId do
|
74
74
|
ObjectId.from_string("")
|
75
75
|
end
|
76
76
|
end
|
77
77
|
|
78
|
+
def test_from_string_with_object_id
|
79
|
+
assert_raise InvalidObjectId do
|
80
|
+
ObjectId.from_string(@o)
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
78
84
|
def test_legal
|
79
85
|
assert !ObjectId.legal?(nil)
|
80
86
|
assert !ObjectId.legal?("fred")
|
@@ -1075,7 +1075,6 @@ end
|
|
1075
1075
|
coll.ensure_index([['a', 1]])
|
1076
1076
|
end
|
1077
1077
|
|
1078
|
-
|
1079
1078
|
if @@version > '2.0.0'
|
1080
1079
|
def test_show_disk_loc
|
1081
1080
|
@@test.save({:a => 1})
|
@@ -1252,12 +1251,36 @@ end
|
|
1252
1251
|
assert_nil @geo.index_information['baz']
|
1253
1252
|
end
|
1254
1253
|
|
1254
|
+
#should "create a text index" do
|
1255
|
+
# @geo.save({'title' => "some text"})
|
1256
|
+
# @geo.create_index([['title', Mongo::TEXT]])
|
1257
|
+
# assert @geo.index_information['title_text']
|
1258
|
+
#end
|
1259
|
+
|
1260
|
+
should "create a hashed index" do
|
1261
|
+
@geo.save({'a' => 1})
|
1262
|
+
@geo.create_index([['a', Mongo::HASHED]])
|
1263
|
+
assert @geo.index_information['a_hashed']
|
1264
|
+
end
|
1265
|
+
|
1255
1266
|
should "create a geospatial index" do
|
1256
1267
|
@geo.save({'loc' => [-100, 100]})
|
1257
1268
|
@geo.create_index([['loc', Mongo::GEO2D]])
|
1258
1269
|
assert @geo.index_information['loc_2d']
|
1259
1270
|
end
|
1260
1271
|
|
1272
|
+
should "create a geoHaystack index" do
|
1273
|
+
@geo.save({ "_id" => 100, "pos" => { "long" => 126.9, "lat" => 35.2 }, "type" => "restaurant"})
|
1274
|
+
@geo.create_index([['pos', Mongo::GEOHAYSTACK], ['type', Mongo::ASCENDING]], :bucket_size => 1)
|
1275
|
+
puts @geo.index_information['loc_geoHaystack_type_1']
|
1276
|
+
end
|
1277
|
+
|
1278
|
+
should "create a geo 2dsphere index" do
|
1279
|
+
@collection.insert({"coordinates" => [ 5 , 5 ], "type" => "Point"})
|
1280
|
+
@geo.create_index([['coordinates', Mongo::GEO2DSPHERE]])
|
1281
|
+
assert @geo.index_information['coordinates_2dsphere']
|
1282
|
+
end
|
1283
|
+
|
1261
1284
|
should "create a unique index" do
|
1262
1285
|
@collection.create_index([['a', Mongo::ASCENDING]], :unique => true)
|
1263
1286
|
assert @collection.index_information['a_1']['unique'] == true
|
@@ -336,8 +336,8 @@ class TestConnection < Test::Unit::TestCase
|
|
336
336
|
context "Saved authentications" do
|
337
337
|
setup do
|
338
338
|
@client = standard_connection
|
339
|
-
@auth = {
|
340
|
-
@client.add_auth(@auth[
|
339
|
+
@auth = {:db_name => 'test', :username => 'bob', :password => 'secret'}
|
340
|
+
@client.add_auth(@auth[:db_name], @auth[:username], @auth[:password])
|
341
341
|
end
|
342
342
|
|
343
343
|
teardown do
|
@@ -348,11 +348,11 @@ class TestConnection < Test::Unit::TestCase
|
|
348
348
|
assert_equal @auth, @client.auths[0]
|
349
349
|
end
|
350
350
|
|
351
|
-
should "
|
352
|
-
auth = {
|
353
|
-
|
354
|
-
|
355
|
-
|
351
|
+
should "not allow multiple authentications for the same db" do
|
352
|
+
auth = {:db_name => 'test', :username => 'mickey', :password => 'm0u53'}
|
353
|
+
assert_raise Mongo::MongoArgumentError do
|
354
|
+
@client.add_auth(auth[:db_name], auth[:username], auth[:password])
|
355
|
+
end
|
356
356
|
end
|
357
357
|
|
358
358
|
should "remove auths by database" do
|
@@ -92,7 +92,7 @@ class DBAPITest < Test::Unit::TestCase
|
|
92
92
|
# Can't compare _id values because at insert, an _id was added to @r1 by
|
93
93
|
# the database but we don't know what it is without re-reading the record
|
94
94
|
# (which is what we are doing right now).
|
95
|
-
#
|
95
|
+
# assert_equal doc['_id'], @r1['_id']
|
96
96
|
assert_equal doc['a'], @r1['a']
|
97
97
|
end
|
98
98
|
|
@@ -194,7 +194,7 @@ class DBAPITest < Test::Unit::TestCase
|
|
194
194
|
@@coll.insert('a' => 2, 'b' => 1)
|
195
195
|
@@coll.insert('a' => 3, 'b' => 2)
|
196
196
|
@@coll.insert('a' => 4, 'b' => 1)
|
197
|
-
|
197
|
+
|
198
198
|
oh = BSON::OrderedHash.new
|
199
199
|
oh['a'] = -1
|
200
200
|
|
@@ -312,7 +312,7 @@ class DBAPITest < Test::Unit::TestCase
|
|
312
312
|
|
313
313
|
begin
|
314
314
|
coll = @@db.create_collection('foobar', :capped => true, :size => 1024)
|
315
|
-
options = coll.options
|
315
|
+
options = coll.options
|
316
316
|
assert_equal 'foobar', options['create']
|
317
317
|
assert_equal true, options['capped']
|
318
318
|
assert_equal 1024, options['size']
|
@@ -488,7 +488,7 @@ HERE
|
|
488
488
|
fail "expected exception"
|
489
489
|
rescue => ex
|
490
490
|
assert_equal Mongo::MongoDBError, ex.class
|
491
|
-
assert_equal "Collection does-not-exist doesn't exist.
|
491
|
+
assert_equal "Collection 'does-not-exist' doesn't exist. (strict=true)", ex.to_s
|
492
492
|
ensure
|
493
493
|
@@db.strict = false
|
494
494
|
@@db.drop_collection('does-not-exist')
|
@@ -500,8 +500,7 @@ HERE
|
|
500
500
|
@@db.strict = true
|
501
501
|
|
502
502
|
begin
|
503
|
-
@@db.create_collection('foobar')
|
504
|
-
assert true
|
503
|
+
assert @@db.create_collection('foobar')
|
505
504
|
rescue => ex
|
506
505
|
fail "did not expect exception \"#{ex}\""
|
507
506
|
end
|
data/test/functional/uri_test.rb
CHANGED
@@ -26,17 +26,17 @@ class URITest < Test::Unit::TestCase
|
|
26
26
|
|
27
27
|
def test_complex_passwords
|
28
28
|
parser = Mongo::URIParser.new('mongodb://bob:secret.word@a.example.com:27018/test')
|
29
|
-
assert_equal "bob", parser.auths[0][
|
30
|
-
assert_equal "secret.word", parser.auths[0][
|
29
|
+
assert_equal "bob", parser.auths[0][:username]
|
30
|
+
assert_equal "secret.word", parser.auths[0][:password]
|
31
31
|
|
32
32
|
parser = Mongo::URIParser.new('mongodb://bob:s-_3#%R.t@a.example.com:27018/test')
|
33
|
-
assert_equal "bob", parser.auths[0][
|
34
|
-
assert_equal "s-_3#%R.t", parser.auths[0][
|
33
|
+
assert_equal "bob", parser.auths[0][:username]
|
34
|
+
assert_equal "s-_3#%R.t", parser.auths[0][:password]
|
35
35
|
end
|
36
36
|
|
37
37
|
def test_complex_usernames
|
38
38
|
parser = Mongo::URIParser.new('mongodb://b:ob:secret.word@a.example.com:27018/test')
|
39
|
-
assert_equal "b:ob", parser.auths[0][
|
39
|
+
assert_equal "b:ob", parser.auths[0][:username]
|
40
40
|
end
|
41
41
|
|
42
42
|
def test_passwords_contain_no_commas
|
@@ -51,12 +51,12 @@ class URITest < Test::Unit::TestCase
|
|
51
51
|
assert_equal ['a.example.com', 27018], parser.nodes[0]
|
52
52
|
assert_equal ['b.example.com', 27017], parser.nodes[1]
|
53
53
|
assert_equal 2, parser.auths.length
|
54
|
-
assert_equal "bob", parser.auths[0][
|
55
|
-
assert_equal "secret", parser.auths[0][
|
56
|
-
assert_equal "test", parser.auths[0][
|
57
|
-
assert_equal "bob", parser.auths[1][
|
58
|
-
assert_equal "secret", parser.auths[1][
|
59
|
-
assert_equal "test", parser.auths[1][
|
54
|
+
assert_equal "bob", parser.auths[0][:username]
|
55
|
+
assert_equal "secret", parser.auths[0][:password]
|
56
|
+
assert_equal "test", parser.auths[0][:db_name]
|
57
|
+
assert_equal "bob", parser.auths[1][:username]
|
58
|
+
assert_equal "secret", parser.auths[1][:password]
|
59
|
+
assert_equal "test", parser.auths[1][:db_name]
|
60
60
|
end
|
61
61
|
|
62
62
|
def test_opts_with_semincolon_separator
|
@@ -165,14 +165,14 @@ class URITest < Test::Unit::TestCase
|
|
165
165
|
assert_equal :nearest, parser.connection_options[:read]
|
166
166
|
end
|
167
167
|
|
168
|
-
def
|
169
|
-
parser = Mongo::URIParser.new("mongodb://localhost:27018?
|
168
|
+
def test_read_preference_connection_options_with_no_replica_set
|
169
|
+
parser = Mongo::URIParser.new("mongodb://localhost:27018?readPreference=nearest")
|
170
170
|
assert_equal :nearest, parser.connection_options[:read]
|
171
171
|
end
|
172
172
|
|
173
|
-
def
|
174
|
-
parser = Mongo::URIParser.new("mongodb://localhost:27018?readPreference=nearest")
|
175
|
-
|
173
|
+
def test_read_preference_connection_options_prefers_preference_over_slaveok
|
174
|
+
parser = Mongo::URIParser.new("mongodb://localhost:27018?replicaset=test&readPreference=nearest&slaveok=true")
|
175
|
+
assert_equal :nearest, parser.connection_options[:read]
|
176
176
|
end
|
177
177
|
|
178
178
|
def test_connection_when_sharded_with_no_options
|