mongo 2.5.0 → 2.5.1
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 +4 -4
- checksums.yaml.gz.sig +0 -0
- data.tar.gz.sig +0 -0
- data/README.md +2 -0
- data/Rakefile +4 -1
- data/lib/mongo/address.rb +2 -1
- data/lib/mongo/client.rb +6 -51
- data/lib/mongo/cluster.rb +34 -4
- data/lib/mongo/cluster/reapers/socket_reaper.rb +1 -1
- data/lib/mongo/cluster/topology/replica_set.rb +3 -1
- data/lib/mongo/collection.rb +6 -6
- data/lib/mongo/collection/view.rb +2 -4
- data/lib/mongo/cursor.rb +9 -4
- data/lib/mongo/error.rb +2 -0
- data/lib/mongo/operation/uses_command_op_msg.rb +1 -1
- data/lib/mongo/server.rb +3 -0
- data/lib/mongo/server/description.rb +1 -1
- data/lib/mongo/server/description/features.rb +18 -12
- data/lib/mongo/server_selector/selectable.rb +5 -1
- data/lib/mongo/session.rb +38 -43
- data/lib/mongo/session/session_pool.rb +12 -30
- data/lib/mongo/socket.rb +24 -0
- data/lib/mongo/socket/tcp.rb +0 -1
- data/lib/mongo/uri.rb +26 -5
- data/lib/mongo/version.rb +1 -1
- data/spec/mongo/address_spec.rb +37 -2
- data/spec/mongo/bulk_write_spec.rb +4 -10
- data/spec/mongo/change_stream_examples_spec.rb +40 -0
- data/spec/mongo/client_spec.rb +47 -12
- data/spec/mongo/cluster/topology/replica_set_spec.rb +2 -0
- data/spec/mongo/collection/view/aggregation_spec.rb +2 -8
- data/spec/mongo/collection/view/change_stream_spec.rb +1 -5
- data/spec/mongo/collection/view/map_reduce_spec.rb +2 -8
- data/spec/mongo/collection/view/readable_spec.rb +1 -1
- data/spec/mongo/collection_spec.rb +11 -29
- data/spec/mongo/crud_spec.rb +6 -2
- data/spec/mongo/cursor_spec.rb +84 -1
- data/spec/mongo/database_spec.rb +2 -8
- data/spec/mongo/dns_seedlist_discovery_spec.rb +67 -63
- data/spec/mongo/max_staleness_spec.rb +1 -0
- data/spec/mongo/retryable_writes_spec.rb +7 -9
- data/spec/mongo/sdam_spec.rb +42 -24
- data/spec/mongo/server/description/features_spec.rb +3 -3
- data/spec/mongo/server_selection_spec.rb +2 -0
- data/spec/mongo/server_selector_spec.rb +2 -0
- data/spec/mongo/session/session_pool_spec.rb +16 -22
- data/spec/mongo/session_spec.rb +13 -8
- data/spec/mongo/uri/srv_protocol_spec.rb +481 -478
- data/spec/mongo/uri_spec.rb +1 -1
- data/spec/spec_helper.rb +11 -63
- data/spec/support/authorization.rb +35 -1
- data/spec/support/connection_string_tests/invalid-uris.yml +27 -11
- data/spec/support/event_subscriber.rb +66 -0
- data/spec/support/sdam/rs/compatible.yml +41 -0
- data/spec/support/sdam/rs/discover_arbiters.yml +3 -1
- data/spec/support/sdam/rs/discover_passives.yml +6 -2
- data/spec/support/sdam/rs/discover_primary.yml +3 -1
- data/spec/support/sdam/rs/discover_secondary.yml +3 -1
- data/spec/support/sdam/rs/discovery.yml +12 -4
- data/spec/support/sdam/rs/equal_electionids.yml +6 -2
- data/spec/support/sdam/rs/ghost_discovered.yml +3 -1
- data/spec/support/sdam/rs/hosts_differ_from_seeds.yml +3 -1
- data/spec/support/sdam/rs/ls_timeout.yml +169 -14
- data/spec/support/sdam/rs/member_reconfig.yml +6 -2
- data/spec/support/sdam/rs/member_standalone.yml +6 -2
- data/spec/support/sdam/rs/new_primary.yml +6 -2
- data/spec/support/sdam/rs/new_primary_new_electionid.yml +9 -3
- data/spec/support/sdam/rs/new_primary_new_setversion.yml +9 -3
- data/spec/support/sdam/rs/new_primary_wrong_set_name.yml +6 -2
- data/spec/support/sdam/rs/non_rs_member.yml +3 -2
- data/spec/support/sdam/rs/normalize_case.yml +3 -1
- data/spec/support/sdam/rs/null_election_id.yml +12 -4
- data/spec/support/sdam/rs/primary_becomes_standalone.yml +6 -4
- data/spec/support/sdam/rs/primary_changes_set_name.yml +6 -2
- data/spec/support/sdam/rs/primary_disconnect.yml +3 -1
- data/spec/support/sdam/rs/primary_disconnect_electionid.yml +15 -5
- data/spec/support/sdam/rs/primary_disconnect_setversion.yml +15 -5
- data/spec/support/sdam/rs/primary_hint_from_secondary_with_mismatched_me.yml +6 -2
- data/spec/support/sdam/rs/primary_mismatched_me.yml +26 -37
- data/spec/support/sdam/rs/primary_reports_new_member.yml +12 -4
- data/spec/support/sdam/rs/primary_to_no_primary_mismatched_me.yml +6 -2
- data/spec/support/sdam/rs/primary_wrong_set_name.yml +3 -1
- data/spec/support/sdam/rs/response_from_removed.yml +6 -2
- data/spec/support/sdam/rs/rsother_discovered.yml +6 -2
- data/spec/support/sdam/rs/sec_not_auth.yml +6 -2
- data/spec/support/sdam/rs/secondary_mismatched_me.yml +26 -37
- data/spec/support/sdam/rs/secondary_wrong_set_name.yml +3 -1
- data/spec/support/sdam/rs/secondary_wrong_set_name_with_primary.yml +6 -2
- data/spec/support/sdam/rs/setversion_without_electionid.yml +6 -2
- data/spec/support/sdam/rs/stepdown_change_set_name.yml +6 -2
- data/spec/support/sdam/rs/too_new.yml +41 -0
- data/spec/support/sdam/rs/too_old.yml +39 -0
- data/spec/support/sdam/rs/unexpected_mongos.yml +3 -1
- data/spec/support/sdam/rs/use_setversion_without_electionid.yml +9 -3
- data/spec/support/sdam/rs/wrong_set_name.yml +3 -1
- data/spec/support/server_discovery_and_monitoring.rb +13 -0
- data/spec/support/shared/session.rb +10 -30
- metadata +10 -2
- metadata.gz.sig +0 -0
data/spec/mongo/uri_spec.rb
CHANGED
data/spec/spec_helper.rb
CHANGED
@@ -38,6 +38,7 @@ Encoding.default_external = Encoding::UTF_8
|
|
38
38
|
|
39
39
|
require 'support/travis'
|
40
40
|
require 'support/matchers'
|
41
|
+
require 'support/event_subscriber'
|
41
42
|
require 'support/authorization'
|
42
43
|
require 'support/server_discovery_and_monitoring'
|
43
44
|
require 'support/server_selection_rtt'
|
@@ -50,7 +51,7 @@ require 'support/gridfs'
|
|
50
51
|
|
51
52
|
RSpec.configure do |config|
|
52
53
|
config.color = true
|
53
|
-
config.fail_fast = true unless ENV['CI']
|
54
|
+
config.fail_fast = true unless ENV['CI']
|
54
55
|
config.formatter = 'documentation'
|
55
56
|
config.include(Authorization)
|
56
57
|
|
@@ -193,11 +194,18 @@ def list_command_enabled?
|
|
193
194
|
$list_command_enabled ||= $mongo_client.cluster.servers.first.features.list_indexes_enabled?
|
194
195
|
end
|
195
196
|
|
196
|
-
# Is the test suite running locally (not on Travis
|
197
|
+
# Is the test suite running locally (not on Travis).
|
197
198
|
#
|
198
199
|
# @since 2.1.0
|
199
200
|
def testing_ssl_locally?
|
200
|
-
running_ssl? && !(ENV['CI']
|
201
|
+
running_ssl? && !(ENV['CI'])
|
202
|
+
end
|
203
|
+
|
204
|
+
# Should tests relying on external connections be run.
|
205
|
+
#
|
206
|
+
# @since 2.5.1
|
207
|
+
def test_connecting_externally?
|
208
|
+
!ENV['CI'] && !ENV['EXTERNAL_DISABLED']
|
201
209
|
end
|
202
210
|
|
203
211
|
# Is the test suite running on SSL.
|
@@ -247,65 +255,5 @@ def initialize_scanned_client!
|
|
247
255
|
Mongo::Client.new(ADDRESSES, TEST_OPTIONS.merge(database: TEST_DB))
|
248
256
|
end
|
249
257
|
|
250
|
-
# Test event subscriber.
|
251
|
-
#
|
252
|
-
# @since 2.5.0
|
253
|
-
class EventSubscriber
|
254
|
-
|
255
|
-
# The started events.
|
256
|
-
#
|
257
|
-
# @since 2.5.0
|
258
|
-
attr_reader :started_events
|
259
|
-
|
260
|
-
# The succeeded events.
|
261
|
-
#
|
262
|
-
# @since 2.5.0
|
263
|
-
attr_reader :succeeded_events
|
264
|
-
|
265
|
-
# The failed events.
|
266
|
-
#
|
267
|
-
# @since 2.5.0
|
268
|
-
attr_reader :failed_events
|
269
|
-
|
270
|
-
# Create the test event subscriber.
|
271
|
-
#
|
272
|
-
# @example Create the subscriber
|
273
|
-
# EventSubscriber.new
|
274
|
-
#
|
275
|
-
# @since 2.5.0
|
276
|
-
def initialize
|
277
|
-
@started_events = []
|
278
|
-
@succeeded_events = []
|
279
|
-
@failed_events = []
|
280
|
-
end
|
281
|
-
|
282
|
-
# Cache the succeeded event.
|
283
|
-
#
|
284
|
-
# @param [ Event ] event The event.
|
285
|
-
#
|
286
|
-
# @since 2.5.0
|
287
|
-
def succeeded(event)
|
288
|
-
@succeeded_events.push(event)
|
289
|
-
end
|
290
|
-
|
291
|
-
# Cache the started event.
|
292
|
-
#
|
293
|
-
# @param [ Event ] event The event.
|
294
|
-
#
|
295
|
-
# @since 2.5.0
|
296
|
-
def started(event)
|
297
|
-
@started_events.push(event)
|
298
|
-
end
|
299
|
-
|
300
|
-
# Cache the failed event.
|
301
|
-
#
|
302
|
-
# @param [ Event ] event The event.
|
303
|
-
#
|
304
|
-
# @since 2.5.0
|
305
|
-
def failed(event)
|
306
|
-
@failed_events.push(event)
|
307
|
-
end
|
308
|
-
end
|
309
|
-
|
310
258
|
# require all shared examples
|
311
259
|
Dir['./spec/support/shared/*.rb'].sort.each { |file| require file }
|
@@ -36,7 +36,7 @@ if ENV['MONGODB_URI']
|
|
36
36
|
ADDRESSES = MONGODB_URI.servers
|
37
37
|
CONNECT = { connect: :direct }
|
38
38
|
end
|
39
|
-
else
|
39
|
+
else
|
40
40
|
ADDRESSES = ENV['MONGODB_ADDRESSES'] ? ENV['MONGODB_ADDRESSES'].split(',').freeze : [ '127.0.0.1:27017' ].freeze
|
41
41
|
if ENV['RS_ENABLED']
|
42
42
|
CONNECT = { connect: :replica_set, replica_set: ENV['RS_NAME'] }
|
@@ -166,6 +166,11 @@ AUTHORIZED_CLIENT = Mongo::Client.new(
|
|
166
166
|
password: TEST_USER.password)
|
167
167
|
)
|
168
168
|
|
169
|
+
# Provides an authorized mongo client that retries writes.
|
170
|
+
#
|
171
|
+
# @since 2.5.1
|
172
|
+
AUTHROIZED_CLIENT_WITH_RETRY_WRITES = AUTHORIZED_CLIENT.with(retry_writes: true)
|
173
|
+
|
169
174
|
# Provides an unauthorized mongo client on the default test database.
|
170
175
|
#
|
171
176
|
# @since 2.0.0
|
@@ -195,6 +200,19 @@ ADMIN_AUTHORIZED_TEST_CLIENT = ADMIN_UNAUTHORIZED_CLIENT.with(
|
|
195
200
|
monitoring: false
|
196
201
|
)
|
197
202
|
|
203
|
+
# A client that has an event subscriber for commands.
|
204
|
+
#
|
205
|
+
# @since 2.5.1
|
206
|
+
SUBSCRIBED_CLIENT = Mongo::Client.new(
|
207
|
+
ADDRESSES,
|
208
|
+
TEST_OPTIONS.merge(
|
209
|
+
database: TEST_DB,
|
210
|
+
user: TEST_USER.name,
|
211
|
+
password: TEST_USER.password)
|
212
|
+
)
|
213
|
+
SUBSCRIBED_CLIENT.subscribe(Mongo::Monitoring::COMMAND, EventSubscriber)
|
214
|
+
AUTHROIZED_CLIENT_WITH_RETRY_WRITES.subscribe(Mongo::Monitoring::COMMAND, EventSubscriber)
|
215
|
+
|
198
216
|
module Authorization
|
199
217
|
|
200
218
|
# On inclusion provides helpers for use with testing with and without
|
@@ -220,6 +238,22 @@ module Authorization
|
|
220
238
|
# @since 2.0.0
|
221
239
|
context.let(:authorized_client) { AUTHORIZED_CLIENT }
|
222
240
|
|
241
|
+
# Provides an authorized mongo client on the default test database that retries writes.
|
242
|
+
#
|
243
|
+
# @since 2.5.1
|
244
|
+
context.let(:authorized_client_with_retry_writes) do
|
245
|
+
EventSubscriber.clear_events!
|
246
|
+
AUTHROIZED_CLIENT_WITH_RETRY_WRITES
|
247
|
+
end
|
248
|
+
|
249
|
+
# Provides an authorized mongo client that has a Command subscriber.
|
250
|
+
#
|
251
|
+
# @since 2.5.1
|
252
|
+
context.let(:subscribed_client) do
|
253
|
+
EventSubscriber.clear_events!
|
254
|
+
SUBSCRIBED_CLIENT
|
255
|
+
end
|
256
|
+
|
223
257
|
# Provides an unauthorized mongo client on the default test database.
|
224
258
|
#
|
225
259
|
# @since 2.0.0
|
@@ -167,14 +167,6 @@ tests:
|
|
167
167
|
hosts: ~
|
168
168
|
auth: ~
|
169
169
|
options: ~
|
170
|
-
-
|
171
|
-
description: "Username with password containing an unescaped colon"
|
172
|
-
uri: "mongodb://alice:foo:bar@127.0.0.1"
|
173
|
-
valid: false
|
174
|
-
warning: ~
|
175
|
-
hosts: ~
|
176
|
-
auth: ~
|
177
|
-
options: ~
|
178
170
|
-
|
179
171
|
description: "Username containing an unescaped at-sign"
|
180
172
|
uri: "mongodb://alice@@127.0.0.1"
|
@@ -193,7 +185,7 @@ tests:
|
|
193
185
|
options: ~
|
194
186
|
-
|
195
187
|
description: "Username containing an unescaped slash"
|
196
|
-
uri: "mongodb://alice/@
|
188
|
+
uri: "mongodb://alice/@localhost/db"
|
197
189
|
valid: false
|
198
190
|
warning: ~
|
199
191
|
hosts: ~
|
@@ -201,7 +193,7 @@ tests:
|
|
201
193
|
options: ~
|
202
194
|
-
|
203
195
|
description: "Username containing unescaped slash with password"
|
204
|
-
uri: "mongodb://alice/bob:foo@
|
196
|
+
uri: "mongodb://alice/bob:foo@localhost/db"
|
205
197
|
valid: false
|
206
198
|
warning: ~
|
207
199
|
hosts: ~
|
@@ -209,7 +201,7 @@ tests:
|
|
209
201
|
options: ~
|
210
202
|
-
|
211
203
|
description: "Username with password containing an unescaped slash"
|
212
|
-
uri: "mongodb://alice:foo/bar@
|
204
|
+
uri: "mongodb://alice:foo/bar@localhost/db"
|
213
205
|
valid: false
|
214
206
|
warning: ~
|
215
207
|
hosts: ~
|
@@ -223,3 +215,27 @@ tests:
|
|
223
215
|
hosts: ~
|
224
216
|
auth: ~
|
225
217
|
options: ~
|
218
|
+
-
|
219
|
+
description: "mongodb+srv with multiple service names"
|
220
|
+
uri: "mongodb+srv://test5.test.mongodb.com,test6.test.mongodb.com"
|
221
|
+
valid: false
|
222
|
+
warning: ~
|
223
|
+
hosts: ~
|
224
|
+
auth: ~
|
225
|
+
options: ~
|
226
|
+
-
|
227
|
+
description: "mongodb+srv with port number"
|
228
|
+
uri: "mongodb+srv://test7.test.mongodb.com:27018"
|
229
|
+
valid: false
|
230
|
+
warning: ~
|
231
|
+
hosts: ~
|
232
|
+
auth: ~
|
233
|
+
options: ~
|
234
|
+
-
|
235
|
+
description: "Username with password containing an unescaped percent sign"
|
236
|
+
uri: "mongodb://alice%foo:bar@127.0.0.1"
|
237
|
+
valid: false
|
238
|
+
warning: ~
|
239
|
+
hosts: ~
|
240
|
+
auth: ~
|
241
|
+
options: ~
|
@@ -0,0 +1,66 @@
|
|
1
|
+
# Test event subscriber.
|
2
|
+
#
|
3
|
+
# @since 2.5.0
|
4
|
+
class EventSubscriber
|
5
|
+
|
6
|
+
class << self
|
7
|
+
|
8
|
+
# The started events.
|
9
|
+
#
|
10
|
+
# @since 2.5.0
|
11
|
+
def started_events
|
12
|
+
@started_events ||= []
|
13
|
+
end
|
14
|
+
|
15
|
+
# The succeeded events.
|
16
|
+
#
|
17
|
+
# @since 2.5.0
|
18
|
+
def succeeded_events
|
19
|
+
@succeeded_events ||= []
|
20
|
+
end
|
21
|
+
|
22
|
+
# The failed events.
|
23
|
+
#
|
24
|
+
# @since 2.5.0
|
25
|
+
def failed_events
|
26
|
+
@failed_events ||= []
|
27
|
+
end
|
28
|
+
|
29
|
+
# Cache the succeeded event.
|
30
|
+
#
|
31
|
+
# @param [ Event ] event The event.
|
32
|
+
#
|
33
|
+
# @since 2.5.0
|
34
|
+
def succeeded(event)
|
35
|
+
succeeded_events.push(event)
|
36
|
+
end
|
37
|
+
|
38
|
+
# Cache the started event.
|
39
|
+
#
|
40
|
+
# @param [ Event ] event The event.
|
41
|
+
#
|
42
|
+
# @since 2.5.0
|
43
|
+
def started(event)
|
44
|
+
started_events.push(event)
|
45
|
+
end
|
46
|
+
|
47
|
+
# Cache the failed event.
|
48
|
+
#
|
49
|
+
# @param [ Event ] event The event.
|
50
|
+
#
|
51
|
+
# @since 2.5.0
|
52
|
+
def failed(event)
|
53
|
+
failed_events.push(event)
|
54
|
+
end
|
55
|
+
|
56
|
+
# Clear all cached events.
|
57
|
+
#
|
58
|
+
# @since 2.5.1
|
59
|
+
def clear_events!
|
60
|
+
@started_events = []
|
61
|
+
@succeeded_events = []
|
62
|
+
@failed_events = []
|
63
|
+
self
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
description: "Replica set member with large maxWireVersion"
|
2
|
+
uri: "mongodb://a,b/?replicaSet=rs"
|
3
|
+
phases: [
|
4
|
+
{
|
5
|
+
responses: [
|
6
|
+
["a:27017", {
|
7
|
+
ok: 1,
|
8
|
+
ismaster: true,
|
9
|
+
setName: "rs",
|
10
|
+
hosts: ["a:27017", "b:27017"],
|
11
|
+
minWireVersion: 0,
|
12
|
+
maxWireVersion: 6
|
13
|
+
}],
|
14
|
+
["b:27017", {
|
15
|
+
ok: 1,
|
16
|
+
ismaster: false,
|
17
|
+
secondary: true,
|
18
|
+
setName: "rs",
|
19
|
+
hosts: ["a:27017", "b:27017"],
|
20
|
+
minWireVersion: 0,
|
21
|
+
maxWireVersion: 1000
|
22
|
+
}]
|
23
|
+
],
|
24
|
+
outcome: {
|
25
|
+
servers: {
|
26
|
+
"a:27017": {
|
27
|
+
type: "RSPrimary",
|
28
|
+
setName: "rs"
|
29
|
+
},
|
30
|
+
"b:27017": {
|
31
|
+
type: "RSSecondary",
|
32
|
+
setName: "rs"
|
33
|
+
}
|
34
|
+
},
|
35
|
+
topologyType: "ReplicaSetWithPrimary",
|
36
|
+
setName: "rs",
|
37
|
+
logicalSessionTimeoutMinutes: null,
|
38
|
+
compatible: true
|
39
|
+
}
|
40
|
+
}
|
41
|
+
]
|
@@ -13,7 +13,9 @@ phases: [
|
|
13
13
|
ismaster: true,
|
14
14
|
hosts: ["a:27017"],
|
15
15
|
passives: ["b:27017"],
|
16
|
-
setName: "rs"
|
16
|
+
setName: "rs",
|
17
|
+
minWireVersion: 0,
|
18
|
+
maxWireVersion: 6
|
17
19
|
}]
|
18
20
|
],
|
19
21
|
|
@@ -49,7 +51,9 @@ phases: [
|
|
49
51
|
passive: true,
|
50
52
|
hosts: ["a:27017"],
|
51
53
|
passives: ["b:27017"],
|
52
|
-
setName: "rs"
|
54
|
+
setName: "rs",
|
55
|
+
minWireVersion: 0,
|
56
|
+
maxWireVersion: 6
|
53
57
|
}]
|
54
58
|
],
|
55
59
|
|
@@ -14,7 +14,9 @@ phases: [
|
|
14
14
|
ismaster: false,
|
15
15
|
secondary: true,
|
16
16
|
setName: "rs",
|
17
|
-
hosts: ["a:27017", "b:27017", "c:27017"]
|
17
|
+
hosts: ["a:27017", "b:27017", "c:27017"],
|
18
|
+
minWireVersion: 0,
|
19
|
+
maxWireVersion: 6
|
18
20
|
}]
|
19
21
|
],
|
20
22
|
|
@@ -57,7 +59,9 @@ phases: [
|
|
57
59
|
secondary: true,
|
58
60
|
setName: "rs",
|
59
61
|
primary: "d:27017",
|
60
|
-
hosts: ["b:27017", "c:27017", "d:27017"]
|
62
|
+
hosts: ["b:27017", "c:27017", "d:27017"],
|
63
|
+
minWireVersion: 0,
|
64
|
+
maxWireVersion: 6
|
61
65
|
}]
|
62
66
|
],
|
63
67
|
|
@@ -104,7 +108,9 @@ phases: [
|
|
104
108
|
ok: 1,
|
105
109
|
ismaster: true,
|
106
110
|
setName: "rs",
|
107
|
-
hosts: ["b:27017", "c:27017", "d:27017", "e:27017"]
|
111
|
+
hosts: ["b:27017", "c:27017", "d:27017", "e:27017"],
|
112
|
+
minWireVersion: 0,
|
113
|
+
maxWireVersion: 6
|
108
114
|
}]
|
109
115
|
],
|
110
116
|
|
@@ -153,7 +159,9 @@ phases: [
|
|
153
159
|
ismaster: false,
|
154
160
|
secondary: true,
|
155
161
|
setName: "rs",
|
156
|
-
hosts: ["a:27017", "b:27017", "c:27017"]
|
162
|
+
hosts: ["a:27017", "b:27017", "c:27017"],
|
163
|
+
minWireVersion: 0,
|
164
|
+
maxWireVersion: 6
|
157
165
|
}]
|
158
166
|
],
|
159
167
|
|