mongo 2.11.0.rc0 → 2.11.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (154) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data.tar.gz.sig +0 -0
  4. data/Rakefile +2 -0
  5. data/lib/mongo/auth.rb +11 -2
  6. data/lib/mongo/auth/cr/conversation.rb +1 -1
  7. data/lib/mongo/auth/ldap/conversation.rb +1 -1
  8. data/lib/mongo/auth/scram/conversation.rb +4 -1
  9. data/lib/mongo/auth/user.rb +15 -1
  10. data/lib/mongo/auth/user/view.rb +10 -4
  11. data/lib/mongo/auth/x509.rb +11 -1
  12. data/lib/mongo/auth/x509/conversation.rb +15 -6
  13. data/lib/mongo/background_thread.rb +28 -13
  14. data/lib/mongo/client.rb +23 -15
  15. data/lib/mongo/collection/view/change_stream.rb +5 -1
  16. data/lib/mongo/collection/view/readable.rb +5 -2
  17. data/lib/mongo/collection/view/writable.rb +3 -1
  18. data/lib/mongo/cursor/builder/get_more_command.rb +4 -1
  19. data/lib/mongo/cursor/builder/kill_cursors_command.rb +16 -5
  20. data/lib/mongo/cursor/builder/op_get_more.rb +2 -2
  21. data/lib/mongo/cursor/builder/op_kill_cursors.rb +17 -5
  22. data/lib/mongo/error/operation_failure.rb +3 -3
  23. data/lib/mongo/monitoring/command_log_subscriber.rb +5 -3
  24. data/lib/mongo/monitoring/event/command_started.rb +13 -3
  25. data/lib/mongo/monitoring/publishable.rb +4 -2
  26. data/lib/mongo/operation/create_user/command.rb +1 -0
  27. data/lib/mongo/operation/remove_user/command.rb +1 -0
  28. data/lib/mongo/operation/update_user/command.rb +1 -0
  29. data/lib/mongo/protocol/get_more.rb +2 -1
  30. data/lib/mongo/protocol/kill_cursors.rb +6 -13
  31. data/lib/mongo/protocol/serializers.rb +10 -4
  32. data/lib/mongo/retryable.rb +1 -1
  33. data/lib/mongo/server/connection.rb +6 -2
  34. data/lib/mongo/server/connection_base.rb +2 -1
  35. data/lib/mongo/server/monitor.rb +1 -1
  36. data/lib/mongo/server/pending_connection.rb +6 -0
  37. data/lib/mongo/socket/ssl.rb +1 -1
  38. data/lib/mongo/uri.rb +5 -41
  39. data/lib/mongo/version.rb +1 -1
  40. data/mongo.gemspec +11 -2
  41. data/spec/README.md +105 -9
  42. data/spec/USERS.md +72 -0
  43. data/spec/integration/auth_spec.rb +20 -6
  44. data/spec/integration/client_construction_spec.rb +3 -1
  45. data/spec/integration/client_options_spec.rb +437 -0
  46. data/spec/integration/command_monitoring_spec.rb +4 -1
  47. data/spec/integration/connection_pool_populator_spec.rb +4 -0
  48. data/spec/integration/connection_spec.rb +4 -2
  49. data/spec/integration/cursor_reaping_spec.rb +1 -1
  50. data/spec/integration/get_more_spec.rb +32 -0
  51. data/spec/integration/retryable_errors_spec.rb +99 -0
  52. data/spec/integration/retryable_writes_errors_spec.rb +11 -10
  53. data/spec/lite_spec_helper.rb +2 -1
  54. data/spec/mongo/auth/scram_spec.rb +1 -0
  55. data/spec/mongo/auth/user/view_spec.rb +102 -1
  56. data/spec/mongo/auth/user_spec.rb +56 -15
  57. data/spec/mongo/auth/x509_spec.rb +31 -1
  58. data/spec/mongo/bulk_write_spec.rb +2 -2
  59. data/spec/mongo/collection/view/change_stream_spec.rb +2 -2
  60. data/spec/mongo/collection/view/readable_spec.rb +8 -4
  61. data/spec/mongo/cursor/builder/get_more_command_spec.rb +4 -2
  62. data/spec/mongo/cursor/builder/op_get_more_spec.rb +4 -2
  63. data/spec/mongo/cursor_spec.rb +3 -3
  64. data/spec/mongo/retryable_spec.rb +31 -52
  65. data/spec/mongo/server/connection_auth_spec.rb +3 -0
  66. data/spec/mongo/server/connection_pool_spec.rb +4 -0
  67. data/spec/mongo/server/connection_spec.rb +12 -4
  68. data/spec/mongo/server/monitor_spec.rb +19 -1
  69. data/spec/mongo/socket/ssl_spec.rb +1 -1
  70. data/spec/mongo/uri/srv_protocol_spec.rb +0 -13
  71. data/spec/mongo/uri_option_parsing_spec.rb +0 -8
  72. data/spec/mongo/uri_spec.rb +6 -20
  73. data/spec/runners/connection_string.rb +116 -0
  74. data/spec/runners/read_write_concern_document.rb +67 -0
  75. data/spec/spec_tests/change_streams_spec.rb +17 -2
  76. data/spec/spec_tests/connection_string_spec.rb +2 -59
  77. data/spec/spec_tests/data/change_streams/change-streams-errors.yml +3 -3
  78. data/spec/spec_tests/data/change_streams/change-streams.yml +88 -20
  79. data/spec/spec_tests/data/cmap/connection-must-have-id.yml +6 -0
  80. data/spec/spec_tests/data/cmap/connection-must-order-ids.yml +6 -0
  81. data/spec/spec_tests/data/cmap/pool-checkin-destroy-closed.yml +3 -0
  82. data/spec/spec_tests/data/cmap/pool-checkin-destroy-stale.yml +3 -0
  83. data/spec/spec_tests/data/cmap/pool-checkin-make-available.yml +3 -0
  84. data/spec/spec_tests/data/cmap/pool-checkin.yml +1 -0
  85. data/spec/spec_tests/data/cmap/pool-checkout-connection.yml +2 -0
  86. data/spec/spec_tests/data/cmap/pool-checkout-error-closed.yml +5 -0
  87. data/spec/spec_tests/data/cmap/pool-checkout-multiple.yml +3 -0
  88. data/spec/spec_tests/data/cmap/pool-checkout-no-idle.yml +4 -0
  89. data/spec/spec_tests/data/cmap/pool-checkout-no-stale.yml +4 -0
  90. data/spec/spec_tests/data/cmap/pool-close-destroy-conns.yml +2 -0
  91. data/spec/spec_tests/data/cmap/pool-create-max-size.yml +15 -0
  92. data/spec/spec_tests/data/cmap/pool-create-min-size.yml +4 -0
  93. data/spec/spec_tests/data/cmap/wait-queue-fairness.yml +31 -1
  94. data/spec/spec_tests/data/cmap/wait-queue-timeout.yml +5 -0
  95. data/spec/spec_tests/data/read_write_concern/connection-string/read-concern.yml +32 -0
  96. data/spec/spec_tests/data/read_write_concern/connection-string/write-concern.yml +82 -0
  97. data/spec/spec_tests/data/read_write_concern/document/read-concern.yml +37 -0
  98. data/spec/spec_tests/data/read_write_concern/document/write-concern.yml +100 -0
  99. data/spec/spec_tests/data/retryable_reads/aggregate-merge.yml +39 -0
  100. data/spec/spec_tests/data/retryable_reads/aggregate-serverErrors.yml +1 -1
  101. data/spec/spec_tests/data/retryable_reads/changeStreams-client.watch-serverErrors.yml +2 -2
  102. data/spec/spec_tests/data/retryable_reads/changeStreams-client.watch.yml +1 -1
  103. data/spec/spec_tests/data/retryable_reads/changeStreams-db.coll.watch-serverErrors.yml +2 -2
  104. data/spec/spec_tests/data/retryable_reads/changeStreams-db.coll.watch.yml +1 -1
  105. data/spec/spec_tests/data/retryable_reads/changeStreams-db.watch-serverErrors.yml +2 -2
  106. data/spec/spec_tests/data/retryable_reads/changeStreams-db.watch.yml +1 -1
  107. data/spec/spec_tests/data/retryable_reads/count-serverErrors.yml +1 -1
  108. data/spec/spec_tests/data/retryable_reads/countDocuments-serverErrors.yml +1 -1
  109. data/spec/spec_tests/data/retryable_reads/distinct-serverErrors.yml +1 -1
  110. data/spec/spec_tests/data/retryable_reads/estimatedDocumentCount-serverErrors.yml +1 -1
  111. data/spec/spec_tests/data/retryable_reads/find-serverErrors.yml +1 -1
  112. data/spec/spec_tests/data/retryable_reads/findOne-serverErrors.yml +1 -1
  113. data/spec/spec_tests/data/retryable_reads/gridfs-download-serverErrors.yml +1 -1
  114. data/spec/spec_tests/data/retryable_reads/gridfs-downloadByName-serverErrors.yml +1 -1
  115. data/spec/spec_tests/data/retryable_reads/listCollectionNames-serverErrors.yml +1 -1
  116. data/spec/spec_tests/data/retryable_reads/listCollectionObjects-serverErrors.yml +1 -1
  117. data/spec/spec_tests/data/retryable_reads/listCollections-serverErrors.yml +1 -1
  118. data/spec/spec_tests/data/retryable_reads/listDatabaseNames-serverErrors.yml +1 -1
  119. data/spec/spec_tests/data/retryable_reads/listDatabaseObjects-serverErrors.yml +1 -1
  120. data/spec/spec_tests/data/retryable_reads/listDatabases-serverErrors.yml +1 -1
  121. data/spec/spec_tests/data/retryable_reads/listIndexNames-serverErrors.yml +1 -1
  122. data/spec/spec_tests/data/retryable_reads/listIndexes-serverErrors.yml +1 -1
  123. data/spec/spec_tests/data/transactions/read-concern.yml +6 -6
  124. data/spec/spec_tests/data/transactions/transaction-options-repl.yml +117 -0
  125. data/spec/spec_tests/data/transactions/transaction-options.yml +14 -121
  126. data/spec/spec_tests/data/transactions/write-concern.yml +3 -0
  127. data/spec/spec_tests/data/transactions_api/transaction-options.yml +11 -12
  128. data/spec/spec_tests/dns_seedlist_discovery_spec.rb +17 -7
  129. data/spec/spec_tests/read_write_concern_connection_string_spec.rb +8 -0
  130. data/spec/spec_tests/read_write_concern_document_spec.rb +74 -0
  131. data/spec/spec_tests/retryable_reads_spec.rb +32 -1
  132. data/spec/spec_tests/uri_options_spec.rb +4 -2
  133. data/spec/support/auth.rb +5 -14
  134. data/spec/support/certificates/client-x509.crt +78 -0
  135. data/spec/support/certificates/client-x509.key +27 -0
  136. data/spec/support/certificates/client-x509.pem +105 -0
  137. data/spec/support/change_streams.rb +8 -11
  138. data/spec/support/client_registry.rb +26 -12
  139. data/spec/support/cluster_tools.rb +2 -2
  140. data/spec/support/cmap.rb +11 -7
  141. data/spec/support/command_monitoring.rb +8 -8
  142. data/spec/support/connection_string.rb +56 -28
  143. data/spec/support/constraints.rb +8 -0
  144. data/spec/support/crud/spec.rb +5 -8
  145. data/spec/support/event_subscriber.rb +7 -0
  146. data/spec/support/gridfs.rb +4 -7
  147. data/spec/support/server_discovery_and_monitoring.rb +3 -8
  148. data/spec/support/server_selection.rb +4 -9
  149. data/spec/support/server_selection_rtt.rb +4 -7
  150. data/spec/support/spec_config.rb +47 -19
  151. data/spec/support/spec_setup.rb +5 -0
  152. data/spec/support/utils.rb +46 -8
  153. metadata +637 -597
  154. metadata.gz.sig +0 -0
@@ -11,10 +11,40 @@ describe Mongo::Auth::X509 do
11
11
  end
12
12
 
13
13
  let(:user) do
14
- Mongo::Auth::User.new(database: SpecConfig.instance.test_db, user: 'driver', password: 'password')
14
+ Mongo::Auth::User.new(database: '$external')
15
+ end
16
+
17
+ describe '#initialize' do
18
+
19
+ context 'when user specifies database $external' do
20
+
21
+ let(:user) do
22
+ Mongo::Auth::User.new(database: '$external')
23
+ end
24
+
25
+ it 'works' do
26
+ described_class.new(user)
27
+ end
28
+ end
29
+
30
+ context 'when user specifies database other than $external' do
31
+
32
+ let(:user) do
33
+ Mongo::Auth::User.new(database: 'foo')
34
+ end
35
+
36
+ it 'raises InvalidConfiguration' do
37
+ expect do
38
+ described_class.new(user)
39
+ end.to raise_error(Mongo::Auth::InvalidConfiguration, /User specifies auth source 'foo', but the only valid auth source for X.509 is '\$external'/)
40
+ end
41
+ end
15
42
  end
16
43
 
17
44
  describe '#login' do
45
+ # When x509 auth is configured, the login would work and this test
46
+ # requires the login to fail.
47
+ require_no_x509_auth
18
48
 
19
49
  context 'when the user is not authorized for the database' do
20
50
 
@@ -1924,11 +1924,11 @@ describe Mongo::BulkWrite do
1924
1924
  end
1925
1925
 
1926
1926
  let(:first_txn_number) do
1927
- started_events[-2].command['txnNumber'].instance_variable_get(:@integer)
1927
+ started_events[-2].command['txnNumber'].value
1928
1928
  end
1929
1929
 
1930
1930
  let(:second_txn_number) do
1931
- started_events[-1].command['txnNumber'].instance_variable_get(:@integer)
1931
+ started_events[-1].command['txnNumber'].value
1932
1932
  end
1933
1933
 
1934
1934
  it 'inserts the documents' do
@@ -118,8 +118,8 @@ describe Mongo::Collection::View::ChangeStream do
118
118
 
119
119
  context 'when full_document is not provided' do
120
120
 
121
- it "defaults to use the 'default' value" do
122
- expect(change_stream_document[:fullDocument]).to eq('default')
121
+ it "does not set fullDocument" do
122
+ expect(change_stream_document).not_to have_key(:fullDocument)
123
123
  end
124
124
  end
125
125
 
@@ -641,8 +641,10 @@ describe Mongo::Collection::View::Readable do
641
641
  view.distinct(nil)
642
642
  end
643
643
 
644
- it 'returns an empty array' do
645
- expect(distinct).to be_empty
644
+ it 'raises ArgumentError' do
645
+ expect do
646
+ distinct
647
+ end.to raise_error(ArgumentError, 'Field name for distinct operation must be not nil')
646
648
  end
647
649
  end
648
650
 
@@ -696,8 +698,10 @@ describe Mongo::Collection::View::Readable do
696
698
  view.distinct(nil)
697
699
  end
698
700
 
699
- it 'returns an empty array' do
700
- expect(distinct).to be_empty
701
+ it 'raises ArgumentError' do
702
+ expect do
703
+ distinct
704
+ end.to raise_error(ArgumentError, 'Field name for distinct operation must be not nil')
701
705
  end
702
706
  end
703
707
  end
@@ -5,7 +5,9 @@ describe Mongo::Cursor::Builder::GetMoreCommand do
5
5
  describe '#specification' do
6
6
 
7
7
  let(:reply) do
8
- Mongo::Protocol::Reply.allocate
8
+ Mongo::Protocol::Reply.allocate.tap do |reply|
9
+ allow(reply).to receive(:cursor_id).and_return(8000)
10
+ end
9
11
  end
10
12
 
11
13
  let(:result) do
@@ -54,7 +56,7 @@ describe Mongo::Cursor::Builder::GetMoreCommand do
54
56
  end
55
57
 
56
58
  it 'includes getMore with cursor id' do
57
- expect(selector[:getMore]).to eq(cursor.id)
59
+ expect(selector[:getMore]).to eq(BSON::Int64.new(8000))
58
60
  end
59
61
 
60
62
  it 'includes the collection name' do
@@ -5,7 +5,9 @@ describe Mongo::Cursor::Builder::OpGetMore do
5
5
  describe '#specification' do
6
6
 
7
7
  let(:reply) do
8
- Mongo::Protocol::Reply.allocate
8
+ Mongo::Protocol::Reply.allocate.tap do |reply|
9
+ allow(reply).to receive(:cursor_id).and_return(8000)
10
+ end
9
11
  end
10
12
 
11
13
  let(:result) do
@@ -38,7 +40,7 @@ describe Mongo::Cursor::Builder::OpGetMore do
38
40
  end
39
41
 
40
42
  it 'includes the cursor id' do
41
- expect(specification[:cursor_id]).to eq(cursor.id)
43
+ expect(specification[:cursor_id]).to eq(BSON::Int64.new(8000))
42
44
  end
43
45
 
44
46
  it 'includes the database name' do
@@ -318,7 +318,7 @@ describe Mongo::Cursor do
318
318
  Mongo::Collection::View.new(
319
319
  authorized_collection,
320
320
  {},
321
- :batch_size => 2
321
+ :batch_size => 2,
322
322
  )
323
323
  end
324
324
 
@@ -329,9 +329,9 @@ describe Mongo::Cursor do
329
329
 
330
330
  it 'schedules a kill cursors op' do
331
331
  cluster.instance_variable_get(:@periodic_executor).flush
332
- expect {
332
+ expect do
333
333
  cursor.to_a
334
- }.to raise_exception(Mongo::Error::OperationFailure, /[cC]ursor.*not found/)
334
+ end.to raise_exception(Mongo::Error::OperationFailure, /[cC]ursor.*not found/)
335
335
  end
336
336
 
337
337
  context 'when the cursor is unregistered before the kill cursors operations are executed' do
@@ -175,83 +175,62 @@ describe Mongo::Retryable do
175
175
 
176
176
  context 'when an operation failure occurs' do
177
177
 
178
- context 'when the cluster is not a mongos' do
178
+ context 'when the operation failure is not retryable' do
179
+
180
+ let(:error) do
181
+ Mongo::Error::OperationFailure.new('not authorized')
182
+ end
179
183
 
180
184
  before do
181
- expect(operation).to receive(:execute).and_raise(Mongo::Error::OperationFailure).ordered
182
- expect(cluster).to receive(:sharded?).and_return(false)
185
+ expect(operation).to receive(:execute).and_raise(error).ordered
183
186
  end
184
187
 
185
- it 'raises an exception' do
188
+ it 'raises the exception' do
186
189
  expect {
187
190
  read_operation
188
191
  }.to raise_error(Mongo::Error::OperationFailure)
189
192
  end
190
193
  end
191
194
 
192
- context 'when the cluster is a mongos' do
195
+ context 'when the operation failure is retryable' do
193
196
 
194
- context 'when the operation failure is not retryable' do
197
+ let(:error) do
198
+ Mongo::Error::OperationFailure.new('not master')
199
+ end
195
200
 
196
- let(:error) do
197
- Mongo::Error::OperationFailure.new('not authorized')
198
- end
201
+ context 'when the retry succeeds' do
199
202
 
200
203
  before do
204
+ expect(retryable).to receive(:select_server).ordered
201
205
  expect(operation).to receive(:execute).and_raise(error).ordered
202
- expect(cluster).to receive(:sharded?).and_return(true)
206
+ expect(client).to receive(:read_retry_interval).and_return(0.1).ordered
207
+ expect(retryable).to receive(:select_server).ordered
208
+ expect(operation).to receive(:execute).and_return(true).ordered
203
209
  end
204
210
 
205
- it 'raises the exception' do
206
- expect {
207
- read_operation
208
- }.to raise_error(Mongo::Error::OperationFailure)
211
+ it 'returns the result' do
212
+ expect(read_operation).to be true
209
213
  end
210
214
  end
211
215
 
212
- context 'when the operation failure is retryable' do
216
+ context 'when the retry fails once and then succeeds' do
217
+ let(:max_read_retries) { 2 }
213
218
 
214
- let(:error) do
215
- Mongo::Error::OperationFailure.new('not master')
216
- end
217
-
218
- context 'when the retry succeeds' do
219
+ before do
220
+ expect(retryable).to receive(:select_server).ordered
221
+ expect(operation).to receive(:execute).and_raise(error).ordered
219
222
 
220
- before do
221
- expect(retryable).to receive(:select_server).ordered
222
- expect(operation).to receive(:execute).and_raise(error).ordered
223
- expect(cluster).to receive(:sharded?).and_return(true)
224
- expect(client).to receive(:read_retry_interval).and_return(0.1).ordered
225
- expect(retryable).to receive(:select_server).ordered
226
- expect(operation).to receive(:execute).and_return(true).ordered
227
- end
223
+ expect(client).to receive(:read_retry_interval).and_return(0.1).ordered
224
+ expect(retryable).to receive(:select_server).ordered
225
+ expect(operation).to receive(:execute).and_raise(error).ordered
228
226
 
229
- it 'returns the result' do
230
- expect(read_operation).to be true
231
- end
227
+ expect(client).to receive(:read_retry_interval).and_return(0.1).ordered
228
+ expect(retryable).to receive(:select_server).ordered
229
+ expect(operation).to receive(:execute).and_return(true).ordered
232
230
  end
233
231
 
234
- context 'when the retry fails once and then succeeds' do
235
- let(:max_read_retries) { 2 }
236
-
237
- before do
238
- expect(retryable).to receive(:select_server).ordered
239
- expect(operation).to receive(:execute).and_raise(error).ordered
240
-
241
- expect(cluster).to receive(:sharded?).and_return(true)
242
- expect(client).to receive(:read_retry_interval).and_return(0.1).ordered
243
- expect(retryable).to receive(:select_server).ordered
244
- expect(operation).to receive(:execute).and_raise(error).ordered
245
-
246
- expect(cluster).to receive(:sharded?).and_return(true)
247
- expect(client).to receive(:read_retry_interval).and_return(0.1).ordered
248
- expect(retryable).to receive(:select_server).ordered
249
- expect(operation).to receive(:execute).and_return(true).ordered
250
- end
251
-
252
- it 'returns the result' do
253
- expect(read_operation).to be true
254
- end
232
+ it 'returns the result' do
233
+ expect(read_operation).to be true
255
234
  end
256
235
  end
257
236
  end
@@ -46,6 +46,7 @@ describe Mongo::Server::Connection, retry: 3 do
46
46
  end
47
47
 
48
48
  describe '#auth_mechanism' do
49
+ require_no_x509_auth
49
50
 
50
51
  let(:connection) do
51
52
  described_class.new(server, server.options)
@@ -87,6 +88,8 @@ describe Mongo::Server::Connection, retry: 3 do
87
88
  end
88
89
 
89
90
  context 'when the ismaster response indicates the auth mechanism is :scram' do
91
+ require_no_x509_auth
92
+
90
93
  let(:features) do
91
94
  Mongo::Server::Description::Features.new(0..7)
92
95
  end
@@ -24,6 +24,10 @@ describe Mongo::Server::ConnectionPool do
24
24
 
25
25
  declare_topology_double
26
26
 
27
+ let(:app_metadata) do
28
+ Mongo::Server::AppMetadata.new(server_options)
29
+ end
30
+
27
31
  let(:cluster) do
28
32
  double('cluster').tap do |cl|
29
33
  allow(cl).to receive(:topology).and_return(topology)
@@ -289,6 +289,7 @@ describe Mongo::Server::Connection, retry: 3 do
289
289
  end
290
290
 
291
291
  context 'when user credentials exist' do
292
+ require_no_x509_auth
292
293
 
293
294
  let(:server) { monitored_server }
294
295
 
@@ -458,9 +459,11 @@ describe Mongo::Server::Connection, retry: 3 do
458
459
  described_class.new(
459
460
  server,
460
461
  SpecConfig.instance.test_options.merge(
461
- :user => SpecConfig.instance.test_user.name,
462
- :password => SpecConfig.instance.test_user.password,
463
- :database => SpecConfig.instance.test_user.database )
462
+ :database => SpecConfig.instance.test_user.database,
463
+ ).merge(SpecConfig.instance.credentials_or_x509(
464
+ user: SpecConfig.instance.test_user.name,
465
+ password: SpecConfig.instance.test_user.password,
466
+ ))
464
467
  )
465
468
  end
466
469
 
@@ -657,7 +660,9 @@ describe Mongo::Server::Connection, retry: 3 do
657
660
  end
658
661
 
659
662
  it 'checks the size against the max bson size' do
660
- expect_any_instance_of(Mongo::Server).to receive(:max_bson_object_size).at_least(:once).and_return(100)
663
+ # 100 works for non-x509 auth.
664
+ # 10 is needed for x509 auth due to smaller payloads, apparently.
665
+ expect_any_instance_of(Mongo::Server).to receive(:max_bson_object_size).at_least(:once).and_return(10)
661
666
  expect do
662
667
  reply
663
668
  end.to raise_exception(Mongo::Error::MaxBSONSize)
@@ -950,6 +955,7 @@ describe Mongo::Server::Connection, retry: 3 do
950
955
  end
951
956
 
952
957
  context 'when authentication options are provided' do
958
+ require_no_x509_auth
953
959
 
954
960
  let(:connection) do
955
961
  described_class.new(
@@ -1100,6 +1106,8 @@ describe Mongo::Server::Connection, retry: 3 do
1100
1106
  end
1101
1107
 
1102
1108
  context 'when auth options differ from server' do
1109
+ require_no_x509_auth
1110
+
1103
1111
  let(:connection) do
1104
1112
  described_class.new(server, server.options.merge(user: 'foo'))
1105
1113
  end
@@ -158,7 +158,7 @@ describe Mongo::Server::Monitor do
158
158
  end
159
159
  =end
160
160
 
161
- describe '#restart!' do
161
+ describe '#run!' do
162
162
 
163
163
  let!(:thread) do
164
164
  monitor.run!
@@ -182,6 +182,24 @@ describe Mongo::Server::Monitor do
182
182
  expect(monitor.restart!).not_to be(thread)
183
183
  end
184
184
  end
185
+
186
+ context 'when running after a stop' do
187
+ it 'starts the thread' do
188
+ ClientRegistry.instance.close_all_clients
189
+ thread
190
+ sleep 0.5
191
+
192
+ RSpec::Mocks.with_temporary_scope do
193
+ expect(monitor.connection).to receive(:disconnect!).and_call_original
194
+ monitor.stop!
195
+ sleep 0.5
196
+ expect(thread.alive?).to be false
197
+ new_thread = monitor.run!
198
+ sleep 0.5
199
+ expect(new_thread.alive?).to be(true)
200
+ end
201
+ end
202
+ end
185
203
  end
186
204
 
187
205
  describe '#stop' do
@@ -225,7 +225,7 @@ describe Mongo::Socket::SSL, retry: 3 do
225
225
  context 'when a certificate is passed, but it is not of the right type' do
226
226
 
227
227
  let(:options) do
228
- cert = "This is a string, not a X509 Certificate"
228
+ cert = "This is a string, not an X.509 Certificate"
229
229
  {
230
230
  :ssl => true,
231
231
  :ssl_cert_object => cert,
@@ -713,19 +713,6 @@ describe Mongo::URI::SRVProtocol do
713
713
  expect(client.options[:auth_source]).to eq(source)
714
714
  end
715
715
  end
716
-
717
- context '$external' do
718
- let(:source) { '$external' }
719
- let(:expected) { :external }
720
-
721
- it 'sets the auth source to :external' do
722
- expect(uri.uri_options[:auth_source]).to eq(expected)
723
- end
724
-
725
- it 'sets the options on a client created with the uri' do
726
- expect(client.options[:auth_source]).to eq(expected)
727
- end
728
- end
729
716
  end
730
717
 
731
718
  context 'auth mechanism properties provided' do
@@ -242,14 +242,6 @@ describe Mongo::URI do
242
242
 
243
243
  it_behaves_like 'a string option'
244
244
 
245
- context '$external' do
246
- let(:string) { "mongodb://example.com/?#{uri_option}=$external" }
247
-
248
- it 'is converted to ;external' do
249
- expect(uri.uri_options[ruby_option]).to eq(:external)
250
- end
251
- end
252
-
253
245
  context 'empty' do
254
246
  let(:string) { "mongodb://example.com/?#{uri_option}=" }
255
247
 
@@ -729,7 +729,7 @@ describe Mongo::URI do
729
729
 
730
730
  context 'when mechanism_properties are provided' do
731
731
  let(:options) { "authMechanism=#{mechanism}&authMechanismProperties=CANONICALIZE_HOST_NAME:true" }
732
-
732
+
733
733
  it 'does not allow a client to be created' do
734
734
  expect {
735
735
  new_local_client_nmio(string)
@@ -758,7 +758,7 @@ describe Mongo::URI do
758
758
 
759
759
  context 'when mechanism_properties are provided' do
760
760
  let(:options) { "authMechanism=#{mechanism}&authMechanismProperties=CANONICALIZE_HOST_NAME:true" }
761
-
761
+
762
762
  it 'does not allow a client to be created' do
763
763
  expect {
764
764
  new_local_client_nmio(string)
@@ -799,7 +799,7 @@ describe Mongo::URI do
799
799
 
800
800
  context 'when mechanism_properties are provided' do
801
801
  let(:options) { "authMechanism=#{mechanism}&authMechanismProperties=SERVICE_NAME:other,CANONICALIZE_HOST_NAME:true" }
802
-
802
+
803
803
  it 'sets the options on a client created with the uri' do
804
804
  client = new_local_client_nmio(string)
805
805
  expect(client.options[:auth_mech_properties]).to eq({ 'canonicalize_host_name' => true, 'service_name' => 'other' })
@@ -827,7 +827,7 @@ describe Mongo::URI do
827
827
 
828
828
  context 'when mechanism_properties are provided' do
829
829
  let(:options) { "authMechanism=#{mechanism}&authMechanismProperties=CANONICALIZE_HOST_NAME:true" }
830
-
830
+
831
831
  it 'does not allow a client to be created' do
832
832
  expect {
833
833
  new_local_client_nmio(string)
@@ -878,7 +878,7 @@ describe Mongo::URI do
878
878
  context 'when a password is provided' do
879
879
  let(:credentials) { "#{user}:#{password}"}
880
880
  let(:password) { 's3kr4t' }
881
-
881
+
882
882
  it 'does not allow a client to be created' do
883
883
  expect {
884
884
  new_local_client_nmio(string)
@@ -888,7 +888,7 @@ describe Mongo::URI do
888
888
 
889
889
  context 'when mechanism_properties are provided' do
890
890
  let(:options) { "authMechanism=#{mechanism}&authMechanismProperties=CANONICALIZE_HOST_NAME:true" }
891
-
891
+
892
892
  it 'does not allow a client to be created' do
893
893
  expect {
894
894
  new_local_client_nmio(string)
@@ -947,20 +947,6 @@ describe Mongo::URI do
947
947
  expect(client.options[:auth_source]).to eq(source)
948
948
  end
949
949
  end
950
-
951
- context '$external' do
952
- let(:source) { '$external' }
953
- let(:expected) { :external }
954
-
955
- it 'sets the auth source to :external' do
956
- expect(uri.uri_options[:auth_source]).to eq(expected)
957
- end
958
-
959
- it 'sets the options on a client created with the uri' do
960
- client = new_local_client_nmio(string)
961
- expect(client.options[:auth_source]).to eq(expected)
962
- end
963
- end
964
950
  end
965
951
 
966
952
  context 'auth mechanism properties provided' do