mongo 2.11.0.rc0 → 2.11.0

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 (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