mongo 1.10.0-java

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.
Files changed (116) hide show
  1. checksums.yaml +7 -0
  2. checksums.yaml.gz.sig +0 -0
  3. data.tar.gz.sig +0 -0
  4. data/LICENSE +190 -0
  5. data/README.md +149 -0
  6. data/Rakefile +31 -0
  7. data/VERSION +1 -0
  8. data/bin/mongo_console +43 -0
  9. data/ext/jsasl/target/jsasl.jar +0 -0
  10. data/lib/mongo.rb +90 -0
  11. data/lib/mongo/bulk_write_collection_view.rb +380 -0
  12. data/lib/mongo/collection.rb +1164 -0
  13. data/lib/mongo/collection_writer.rb +364 -0
  14. data/lib/mongo/connection.rb +19 -0
  15. data/lib/mongo/connection/node.rb +239 -0
  16. data/lib/mongo/connection/pool.rb +347 -0
  17. data/lib/mongo/connection/pool_manager.rb +325 -0
  18. data/lib/mongo/connection/sharding_pool_manager.rb +67 -0
  19. data/lib/mongo/connection/socket.rb +18 -0
  20. data/lib/mongo/connection/socket/socket_util.rb +37 -0
  21. data/lib/mongo/connection/socket/ssl_socket.rb +95 -0
  22. data/lib/mongo/connection/socket/tcp_socket.rb +86 -0
  23. data/lib/mongo/connection/socket/unix_socket.rb +39 -0
  24. data/lib/mongo/cursor.rb +719 -0
  25. data/lib/mongo/db.rb +735 -0
  26. data/lib/mongo/exception.rb +88 -0
  27. data/lib/mongo/functional.rb +21 -0
  28. data/lib/mongo/functional/authentication.rb +318 -0
  29. data/lib/mongo/functional/logging.rb +85 -0
  30. data/lib/mongo/functional/read_preference.rb +174 -0
  31. data/lib/mongo/functional/sasl_java.rb +48 -0
  32. data/lib/mongo/functional/uri_parser.rb +374 -0
  33. data/lib/mongo/functional/write_concern.rb +66 -0
  34. data/lib/mongo/gridfs.rb +18 -0
  35. data/lib/mongo/gridfs/grid.rb +112 -0
  36. data/lib/mongo/gridfs/grid_ext.rb +53 -0
  37. data/lib/mongo/gridfs/grid_file_system.rb +163 -0
  38. data/lib/mongo/gridfs/grid_io.rb +484 -0
  39. data/lib/mongo/legacy.rb +140 -0
  40. data/lib/mongo/mongo_client.rb +702 -0
  41. data/lib/mongo/mongo_replica_set_client.rb +523 -0
  42. data/lib/mongo/mongo_sharded_client.rb +159 -0
  43. data/lib/mongo/networking.rb +370 -0
  44. data/lib/mongo/utils.rb +19 -0
  45. data/lib/mongo/utils/conversions.rb +110 -0
  46. data/lib/mongo/utils/core_ext.rb +70 -0
  47. data/lib/mongo/utils/server_version.rb +69 -0
  48. data/lib/mongo/utils/support.rb +80 -0
  49. data/lib/mongo/utils/thread_local_variable_manager.rb +25 -0
  50. data/mongo.gemspec +36 -0
  51. data/test/functional/authentication_test.rb +35 -0
  52. data/test/functional/bulk_api_stress_test.rb +133 -0
  53. data/test/functional/bulk_write_collection_view_test.rb +1129 -0
  54. data/test/functional/client_test.rb +565 -0
  55. data/test/functional/collection_test.rb +2073 -0
  56. data/test/functional/collection_writer_test.rb +83 -0
  57. data/test/functional/conversions_test.rb +163 -0
  58. data/test/functional/cursor_fail_test.rb +63 -0
  59. data/test/functional/cursor_message_test.rb +57 -0
  60. data/test/functional/cursor_test.rb +625 -0
  61. data/test/functional/db_api_test.rb +819 -0
  62. data/test/functional/db_connection_test.rb +27 -0
  63. data/test/functional/db_test.rb +344 -0
  64. data/test/functional/grid_file_system_test.rb +285 -0
  65. data/test/functional/grid_io_test.rb +252 -0
  66. data/test/functional/grid_test.rb +273 -0
  67. data/test/functional/pool_test.rb +62 -0
  68. data/test/functional/safe_test.rb +98 -0
  69. data/test/functional/ssl_test.rb +29 -0
  70. data/test/functional/support_test.rb +62 -0
  71. data/test/functional/timeout_test.rb +58 -0
  72. data/test/functional/uri_test.rb +330 -0
  73. data/test/functional/write_concern_test.rb +118 -0
  74. data/test/helpers/general.rb +50 -0
  75. data/test/helpers/test_unit.rb +317 -0
  76. data/test/replica_set/authentication_test.rb +35 -0
  77. data/test/replica_set/basic_test.rb +174 -0
  78. data/test/replica_set/client_test.rb +341 -0
  79. data/test/replica_set/complex_connect_test.rb +77 -0
  80. data/test/replica_set/connection_test.rb +138 -0
  81. data/test/replica_set/count_test.rb +64 -0
  82. data/test/replica_set/cursor_test.rb +212 -0
  83. data/test/replica_set/insert_test.rb +140 -0
  84. data/test/replica_set/max_values_test.rb +145 -0
  85. data/test/replica_set/pinning_test.rb +55 -0
  86. data/test/replica_set/query_test.rb +73 -0
  87. data/test/replica_set/read_preference_test.rb +214 -0
  88. data/test/replica_set/refresh_test.rb +175 -0
  89. data/test/replica_set/replication_ack_test.rb +94 -0
  90. data/test/replica_set/ssl_test.rb +32 -0
  91. data/test/sharded_cluster/basic_test.rb +197 -0
  92. data/test/shared/authentication/basic_auth_shared.rb +286 -0
  93. data/test/shared/authentication/bulk_api_auth_shared.rb +259 -0
  94. data/test/shared/authentication/gssapi_shared.rb +164 -0
  95. data/test/shared/authentication/sasl_plain_shared.rb +96 -0
  96. data/test/shared/ssl_shared.rb +235 -0
  97. data/test/test_helper.rb +56 -0
  98. data/test/threading/basic_test.rb +120 -0
  99. data/test/tools/mongo_config.rb +608 -0
  100. data/test/tools/mongo_config_test.rb +160 -0
  101. data/test/unit/client_test.rb +347 -0
  102. data/test/unit/collection_test.rb +166 -0
  103. data/test/unit/connection_test.rb +325 -0
  104. data/test/unit/cursor_test.rb +299 -0
  105. data/test/unit/db_test.rb +136 -0
  106. data/test/unit/grid_test.rb +76 -0
  107. data/test/unit/mongo_sharded_client_test.rb +48 -0
  108. data/test/unit/node_test.rb +93 -0
  109. data/test/unit/pool_manager_test.rb +142 -0
  110. data/test/unit/read_pref_test.rb +115 -0
  111. data/test/unit/read_test.rb +159 -0
  112. data/test/unit/safe_test.rb +158 -0
  113. data/test/unit/sharding_pool_manager_test.rb +84 -0
  114. data/test/unit/write_concern_test.rb +175 -0
  115. metadata +260 -0
  116. metadata.gz.sig +0 -0
@@ -0,0 +1,166 @@
1
+ # Copyright (C) 2009-2013 MongoDB, Inc.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ require 'test_helper'
16
+
17
+ module Mongo
18
+ class Collection
19
+ attr_reader :operation_writer,
20
+ :command_writer
21
+ end
22
+ end
23
+
24
+ class CollectionUnitTest < Test::Unit::TestCase
25
+
26
+ context "Basic operations: " do
27
+ setup do
28
+ @logger = mock()
29
+ @logger.stubs(:level => 0)
30
+ @logger.expects(:debug)
31
+
32
+ @client = MongoClient.new('localhost', 27017, :logger => @logger, :connect => false)
33
+ @db = @client[TEST_DB]
34
+ @coll = @db.collection('collection-unit-test')
35
+ end
36
+
37
+ should "send update message" do
38
+ @client.expects(:send_message_with_gle).with do |op, msg, log|
39
+ op == 2001
40
+ end
41
+ @coll.operation_writer.stubs(:log_operation)
42
+ @coll.update({}, {:title => 'Moby Dick'})
43
+ end
44
+
45
+ should "send insert message" do
46
+ @client.expects(:send_message_with_gle).with do |op, msg, log|
47
+ op == 2002
48
+ end
49
+ @coll.operation_writer.expects(:log_operation).with do |name, payload|
50
+ (name == :insert) && payload[:documents][:title].include?('Moby')
51
+ end
52
+ @coll.insert({:title => 'Moby Dick'})
53
+ end
54
+
55
+ should "send sort data" do
56
+ @client.expects(:checkout_reader).returns(new_mock_socket)
57
+ @client.expects(:receive_message).with do |op, msg, log, sock|
58
+ op == 2004
59
+ end.returns([[], 0, 0])
60
+ @logger.expects(:debug)
61
+ @coll.find({:title => 'Moby Dick'}).sort([['title', 1], ['author', 1]]).next_document
62
+ end
63
+
64
+ should "not log binary data" do
65
+ data = BSON::Binary.new(("BINARY " * 1000).unpack("c*"))
66
+ @client.expects(:send_message_with_gle).with do |op, msg, log|
67
+ op == 2002
68
+ end
69
+ @coll.operation_writer.expects(:log_operation).with do |name, payload|
70
+ (name == :insert) && payload[:documents][:data].inspect.include?('Binary')
71
+ end
72
+ @coll.insert({:data => data})
73
+ end
74
+
75
+ should "send safe update message" do
76
+ @client.expects(:send_message_with_gle).with do |op, msg, db_name, log|
77
+ op == 2001
78
+ end
79
+ @coll.operation_writer.expects(:log_operation).with do |name, payload|
80
+ (name == :update) && payload[:documents][:title].include?('Moby')
81
+ end
82
+ @coll.update({}, {:title => 'Moby Dick'})
83
+ end
84
+
85
+ should "send safe update message with legacy" do
86
+ connection = Connection.new('localhost', 27017, :safe => true, :connect => false)
87
+ db = connection[TEST_DB]
88
+ coll = db.collection('collection-unit-test')
89
+ connection.expects(:send_message_with_gle).with do |op, msg, db_name, log|
90
+ op == 2001
91
+ end
92
+ coll.operation_writer.expects(:log_operation).with do |name, payload|
93
+ (name == :update) && payload[:documents][:title].include?('Moby')
94
+ end
95
+ coll.update({}, {:title => 'Moby Dick'})
96
+ end
97
+
98
+ should "send safe insert message" do
99
+ @client.expects(:send_message_with_gle).with do |op, msg, db_name, log|
100
+ op == 2001
101
+ end
102
+ @coll.operation_writer.stubs(:log_operation)
103
+ @coll.update({}, {:title => 'Moby Dick'})
104
+ end
105
+
106
+ should "not call insert for each ensure_index call" do
107
+ @coll.expects(:generate_indexes).once
108
+
109
+ @coll.ensure_index [["x", Mongo::DESCENDING]]
110
+ @coll.ensure_index [["x", Mongo::DESCENDING]]
111
+ end
112
+
113
+ should "call generate_indexes for a new type on the same field for ensure_index" do
114
+ @coll.expects(:generate_indexes).twice
115
+
116
+ @coll.ensure_index [["x", Mongo::DESCENDING]]
117
+ @coll.ensure_index [["x", Mongo::ASCENDING]]
118
+ end
119
+
120
+ should "call generate_indexes twice because the cache time is 0 seconds" do
121
+ @db.cache_time = 0
122
+ @coll = @db.collection('collection-unit-test')
123
+ @coll.expects(:generate_indexes).twice
124
+
125
+ @coll.ensure_index [["x", Mongo::DESCENDING]]
126
+ @coll.ensure_index [["x", Mongo::DESCENDING]]
127
+ end
128
+
129
+ should "call generate_indexes for each key when calling ensure_indexes" do
130
+ @db.cache_time = 300
131
+ @coll = @db.collection('collection-unit-test')
132
+ @coll.expects(:generate_indexes).once.with do |a, b, c|
133
+ a == {"x"=>-1, "y"=>-1}
134
+ end
135
+
136
+ @coll.ensure_index [["x", Mongo::DESCENDING], ["y", Mongo::DESCENDING]]
137
+ end
138
+
139
+ should "call generate_indexes for each key when calling ensure_indexes with a hash" do
140
+ @db.cache_time = 300
141
+ @coll = @db.collection('collection-unit-test')
142
+ oh = BSON::OrderedHash.new
143
+ oh['x'] = Mongo::DESCENDING
144
+ oh['y'] = Mongo::DESCENDING
145
+ @coll.expects(:generate_indexes).once.with do |a, b, c|
146
+ a == oh
147
+ end
148
+
149
+ if RUBY_VERSION > '1.9'
150
+ @coll.ensure_index({"x" => Mongo::DESCENDING, "y" => Mongo::DESCENDING})
151
+ else
152
+ ordered_hash = BSON::OrderedHash.new
153
+ ordered_hash['x'] = Mongo::DESCENDING
154
+ ordered_hash['y'] = Mongo::DESCENDING
155
+ @coll.ensure_index(ordered_hash)
156
+ end
157
+ end
158
+
159
+ should "use the connection's logger" do
160
+ @logger.expects(:warn).with do |msg|
161
+ msg == "MONGODB [WARNING] test warning"
162
+ end
163
+ @coll.log(:warn, "test warning")
164
+ end
165
+ end
166
+ end
@@ -0,0 +1,325 @@
1
+ # Copyright (C) 2009-2013 MongoDB, Inc.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ require 'test_helper'
16
+
17
+ class ConnectionUnitTest < Test::Unit::TestCase
18
+ context "Mongo::MongoClient initialization " do
19
+ context "given a single node" do
20
+ setup do
21
+ @connection = Mongo::Connection.new('localhost', 27017, :safe => true, :connect => false)
22
+ TCPSocket.stubs(:new).returns(new_mock_socket)
23
+
24
+ admin_db = new_mock_db
25
+ admin_db.expects(:command).returns({'ok' => 1, 'ismaster' => 1})
26
+ @connection.expects(:[]).with('admin').returns(admin_db)
27
+ @connection.connect
28
+ end
29
+
30
+ should "set safe mode true" do
31
+ assert_equal true, @connection.safe
32
+ end
33
+
34
+ should "set localhost and port to master" do
35
+ assert_equal 'localhost', @connection.primary_pool.host
36
+ assert_equal 27017, @connection.primary_pool.port
37
+ end
38
+
39
+ should "set connection pool to 1" do
40
+ assert_equal 1, @connection.primary_pool.size
41
+ end
42
+
43
+ should "default slave_ok to false" do
44
+ assert !@connection.slave_ok?
45
+ end
46
+
47
+ should "not raise error if no host or port is supplied" do
48
+ assert_nothing_raised do
49
+ Mongo::Connection.new(:safe => true, :connect => false)
50
+ end
51
+ assert_nothing_raised do
52
+ Mongo::Connection.new('localhost', :safe => true, :connect => false)
53
+ end
54
+ end
55
+
56
+ should "warn if invalid options are specified" do
57
+ connection = Mongo::Connection.allocate
58
+ opts = {:connect => false}
59
+
60
+ Mongo::ReplSetConnection::REPL_SET_OPTS.each do |opt|
61
+ connection.expects(:warn).with("#{opt} is not a valid option for #{connection.class}")
62
+ opts[opt] = true
63
+ end
64
+
65
+ args = ['localhost', 27017, opts]
66
+ connection.send(:initialize, *args)
67
+ end
68
+
69
+ end
70
+
71
+ context "initializing with a unix socket" do
72
+ setup do
73
+ @connection = Mongo::Connection.new('/tmp/mongod.sock', :safe => true, :connect => false)
74
+ UNIXSocket.stubs(:new).returns(new_mock_unix_socket)
75
+ end
76
+ should "parse a unix socket" do
77
+ assert_equal "/tmp/mongod.sock", @connection.host_port.first
78
+ end
79
+ end
80
+
81
+ context "initializing with a mongodb uri" do
82
+ should "parse a simple uri" do
83
+ @connection = Mongo::Connection.from_uri("mongodb://localhost", :connect => false)
84
+ assert_equal ['localhost', 27017], @connection.host_port
85
+ end
86
+
87
+ should "set auth source" do
88
+ @connection = Mongo::Connection.from_uri("mongodb://user:pass@localhost?authSource=foo", :connect => false)
89
+ assert_equal 'foo', @connection.auths.first[:source]
90
+ end
91
+
92
+ should "set auth mechanism" do
93
+ @connection = Mongo::Connection.from_uri("mongodb://user@localhost?authMechanism=MONGODB-X509", :connect => false)
94
+ assert_equal 'MONGODB-X509', @connection.auths.first[:mechanism]
95
+
96
+ assert_raise MongoArgumentError do
97
+ Mongo::Connection.from_uri("mongodb://localhost?authMechanism=INVALID", :connect => false)
98
+ end
99
+ end
100
+
101
+ should "allow a complex host names" do
102
+ host_name = "foo.bar-12345.org"
103
+ @connection = Mongo::Connection.from_uri("mongodb://#{host_name}", :connect => false)
104
+ assert_equal [host_name, 27017], @connection.host_port
105
+ end
106
+
107
+ should "allow db without username and password" do
108
+ host_name = "foo.bar-12345.org"
109
+ @connection = Mongo::Connection.from_uri("mongodb://#{host_name}/foo", :connect => false)
110
+ assert_equal [host_name, 27017], @connection.host_port
111
+ end
112
+
113
+ should "set safe options on connection" do
114
+ host_name = "localhost"
115
+ opts = "safe=true&w=2&wtimeoutMS=1000&fsync=true&journal=true"
116
+ @connection = Mongo::Connection.from_uri("mongodb://#{host_name}/foo?#{opts}", :connect => false)
117
+ assert_equal({:w => 2, :wtimeout => 1000, :fsync => true, :j => true}, @connection.write_concern)
118
+ end
119
+
120
+ should "set timeout options on connection" do
121
+ host_name = "localhost"
122
+ opts = "connectTimeoutMS=1000&socketTimeoutMS=5000"
123
+ @connection = Mongo::Connection.from_uri("mongodb://#{host_name}/foo?#{opts}", :connect => false)
124
+ assert_equal 1, @connection.connect_timeout
125
+ assert_equal 5, @connection.op_timeout
126
+ end
127
+
128
+ should "parse a uri with a hyphen & underscore in the username or password" do
129
+ @connection = Mongo::Connection.from_uri("mongodb://hyphen-user_name:p-s_s@localhost:27017/db", :connect => false)
130
+ assert_equal ['localhost', 27017], @connection.host_port
131
+
132
+ auth_hash = {
133
+ :db_name => 'db',
134
+ :username => 'hyphen-user_name',
135
+ :password => 'p-s_s',
136
+ :source => 'db',
137
+ :mechanism => Authentication::DEFAULT_MECHANISM,
138
+ :extra => {}
139
+ }
140
+ assert_equal auth_hash, @connection.auths.first
141
+ end
142
+
143
+ should "attempt to connect" do
144
+ TCPSocket.stubs(:new).returns(new_mock_socket)
145
+ @connection = Mongo::Connection.from_uri("mongodb://localhost", :connect => false)
146
+
147
+ admin_db = new_mock_db
148
+ admin_db.expects(:command).returns({'ok' => 1, 'ismaster' => 1})
149
+ @connection.expects(:[]).with('admin').returns(admin_db)
150
+ @connection.connect
151
+ end
152
+
153
+ should "raise an error on invalid uris" do
154
+ assert_raise MongoArgumentError do
155
+ Mongo::Connection.from_uri("mongo://localhost", :connect => false)
156
+ end
157
+
158
+ assert_raise MongoArgumentError do
159
+ Mongo::Connection.from_uri("mongodb://localhost:abc", :connect => false)
160
+ end
161
+ end
162
+
163
+ should "require password if using legacy auth and username present" do
164
+ assert Mongo::Connection.from_uri("mongodb://kyle:jones@localhost/db", :connect => false)
165
+
166
+ assert_raise MongoArgumentError do
167
+ Mongo::Connection.from_uri("mongodb://kyle:@localhost", :connect => false)
168
+ end
169
+
170
+ assert_raise MongoArgumentError do
171
+ Mongo::Connection.from_uri("mongodb://kyle@localhost", :connect => false)
172
+ end
173
+ end
174
+ end
175
+
176
+ context "initializing with ENV['MONGODB_URI']" do
177
+ should "parse a simple uri" do
178
+ uri = "mongodb://localhost?connect=false"
179
+ with_preserved_env_uri(uri) do
180
+ @connection = Mongo::Connection.new
181
+ assert_equal ['localhost', 27017], @connection.host_port
182
+ end
183
+ end
184
+
185
+ should "set auth source" do
186
+ uri = "mongodb://user:pass@localhost?authSource=foo&connect=false"
187
+ with_preserved_env_uri(uri) do
188
+ @connection = Mongo::Connection.new
189
+ assert_equal 'foo', @connection.auths.first[:source]
190
+ end
191
+ end
192
+
193
+ should "set auth mechanism" do
194
+ uri = "mongodb://user@localhost?authMechanism=MONGODB-X509&connect=false"
195
+ with_preserved_env_uri(uri) do
196
+ @connection = Mongo::Connection.new
197
+ assert_equal 'MONGODB-X509', @connection.auths.first[:mechanism]
198
+
199
+ ENV['MONGODB_URI'] = "mongodb://user@localhost?authMechanism=INVALID&connect=false"
200
+ assert_raise MongoArgumentError do
201
+ Mongo::Connection.new
202
+ end
203
+ end
204
+ end
205
+
206
+ should "allow a complex host names" do
207
+ host_name = "foo.bar-12345.org"
208
+ uri = "mongodb://#{host_name}?connect=false"
209
+ with_preserved_env_uri(uri) do
210
+ @connection = Mongo::Connection.new
211
+ assert_equal [host_name, 27017], @connection.host_port
212
+ end
213
+ end
214
+
215
+ should "allow db without username and password" do
216
+ host_name = "foo.bar-12345.org"
217
+ uri = "mongodb://#{host_name}/foo?connect=false"
218
+ with_preserved_env_uri(uri) do
219
+ @connection = Mongo::Connection.new
220
+ assert_equal [host_name, 27017], @connection.host_port
221
+ end
222
+ end
223
+
224
+ should "set safe options on connection" do
225
+ host_name = "localhost"
226
+ opts = "safe=true&w=2&wtimeoutMS=1000&fsync=true&journal=true&connect=false"
227
+ uri = "mongodb://#{host_name}/foo?#{opts}"
228
+ with_preserved_env_uri(uri) do
229
+ @connection = Mongo::Connection.new
230
+ assert_equal({:w => 2, :wtimeout => 1000, :fsync => true, :j => true}, @connection.safe)
231
+ end
232
+ end
233
+
234
+ should "set timeout options on connection" do
235
+ host_name = "localhost"
236
+ opts = "connectTimeoutMS=1000&socketTimeoutMS=5000&connect=false"
237
+ uri = "mongodb://#{host_name}/foo?#{opts}"
238
+ with_preserved_env_uri(uri) do
239
+ @connection = Mongo::Connection.new
240
+ assert_equal 1, @connection.connect_timeout
241
+ assert_equal 5, @connection.op_timeout
242
+ end
243
+ end
244
+
245
+ should "parse a uri with a hyphen & underscore in the username or password" do
246
+ uri = "mongodb://hyphen-user_name:p-s_s@localhost:27017/db?connect=false"
247
+ with_preserved_env_uri(uri) do
248
+ @connection = Mongo::Connection.new
249
+ assert_equal ['localhost', 27017], @connection.host_port
250
+
251
+ auth_hash = {
252
+ :db_name => 'db',
253
+ :username => 'hyphen-user_name',
254
+ :password => 'p-s_s',
255
+ :source => 'db',
256
+ :mechanism => Authentication::DEFAULT_MECHANISM,
257
+ :extra => {}
258
+ }
259
+ assert_equal auth_hash, @connection.auths.first
260
+ end
261
+ end
262
+
263
+ should "attempt to connect" do
264
+ TCPSocket.stubs(:new).returns(new_mock_socket)
265
+ uri = "mongodb://localhost?connect=false"
266
+ with_preserved_env_uri(uri) do
267
+ @connection = Mongo::Connection.new
268
+
269
+ admin_db = new_mock_db
270
+ admin_db.expects(:command).returns({'ok' => 1, 'ismaster' => 1})
271
+ @connection.expects(:[]).with('admin').returns(admin_db)
272
+ @connection.connect
273
+ end
274
+ end
275
+
276
+ should "raise an error on invalid uris" do
277
+ uri = "mongo://localhost"
278
+ with_preserved_env_uri(uri) do
279
+ assert_raise MongoArgumentError do
280
+ Mongo::Connection.new
281
+ end
282
+
283
+ ENV['MONGODB_URI'] = "mongodb://localhost:abc"
284
+ assert_raise MongoArgumentError do
285
+ Mongo::Connection.new
286
+ end
287
+ end
288
+ end
289
+
290
+ should "require password if using legacy auth and username present" do
291
+ uri = "mongodb://kyle:jones@localhost/db?connect=false"
292
+ with_preserved_env_uri(uri) do
293
+ assert Mongo::Connection.new
294
+
295
+ ENV['MONGODB_URI'] = "mongodb://kyle:@localhost?connect=false"
296
+ assert_raise MongoArgumentError do
297
+ Mongo::Connection.new
298
+ end
299
+
300
+ ENV['MONGODB_URI'] = "mongodb://kyle@localhost?connect=false"
301
+ assert_raise MongoArgumentError do
302
+ Mongo::Connection.new
303
+ end
304
+ end
305
+ end
306
+
307
+ should "require password if using PLAIN auth and username present" do
308
+ uri = "mongodb://kyle:jones@localhost/db?connect=false&authMechanism=PLAIN"
309
+ with_preserved_env_uri(uri) do
310
+ assert Mongo::Connection.new
311
+
312
+ ENV['MONGODB_URI'] = "mongodb://kyle:@localhost?connect=false&authMechanism=PLAIN"
313
+ assert_raise MongoArgumentError do
314
+ Mongo::Connection.new
315
+ end
316
+
317
+ ENV['MONGODB_URI'] = "mongodb://kyle@localhost?connect=false&authMechanism=PLAIN"
318
+ assert_raise MongoArgumentError do
319
+ Mongo::Connection.new
320
+ end
321
+ end
322
+ end
323
+ end
324
+ end
325
+ end