mongo 2.13.0.beta1 → 2.13.0.rc1

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 (170) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data.tar.gz.sig +1 -5
  4. data/Rakefile +15 -9
  5. data/lib/mongo.rb +4 -2
  6. data/lib/mongo/auth/aws/request.rb +4 -2
  7. data/lib/mongo/bulk_write.rb +1 -0
  8. data/lib/mongo/client.rb +143 -21
  9. data/lib/mongo/cluster.rb +53 -17
  10. data/lib/mongo/cluster/sdam_flow.rb +13 -10
  11. data/lib/mongo/cluster/topology/replica_set_no_primary.rb +3 -2
  12. data/lib/mongo/cluster/topology/sharded.rb +1 -1
  13. data/lib/mongo/cluster/topology/single.rb +1 -1
  14. data/lib/mongo/collection.rb +17 -13
  15. data/lib/mongo/collection/view/readable.rb +3 -1
  16. data/lib/mongo/collection/view/writable.rb +41 -5
  17. data/lib/mongo/database.rb +31 -4
  18. data/lib/mongo/database/view.rb +19 -4
  19. data/lib/mongo/distinguishing_semaphore.rb +55 -0
  20. data/lib/mongo/error.rb +1 -0
  21. data/lib/mongo/error/invalid_session.rb +2 -1
  22. data/lib/mongo/error/operation_failure.rb +6 -0
  23. data/lib/mongo/error/sessions_not_supported.rb +35 -0
  24. data/lib/mongo/event/base.rb +6 -0
  25. data/lib/mongo/grid/file.rb +5 -0
  26. data/lib/mongo/grid/file/chunk.rb +2 -0
  27. data/lib/mongo/grid/fs_bucket.rb +15 -13
  28. data/lib/mongo/grid/stream/write.rb +9 -3
  29. data/lib/mongo/monitoring.rb +38 -0
  30. data/lib/mongo/monitoring/command_log_subscriber.rb +10 -2
  31. data/lib/mongo/monitoring/event/command_failed.rb +11 -0
  32. data/lib/mongo/monitoring/event/command_started.rb +37 -2
  33. data/lib/mongo/monitoring/event/command_succeeded.rb +11 -0
  34. data/lib/mongo/monitoring/event/server_closed.rb +1 -1
  35. data/lib/mongo/monitoring/event/server_description_changed.rb +27 -4
  36. data/lib/mongo/monitoring/event/server_heartbeat_failed.rb +9 -2
  37. data/lib/mongo/monitoring/event/server_heartbeat_started.rb +9 -2
  38. data/lib/mongo/monitoring/event/server_heartbeat_succeeded.rb +9 -2
  39. data/lib/mongo/monitoring/event/server_opening.rb +1 -1
  40. data/lib/mongo/monitoring/event/topology_changed.rb +1 -1
  41. data/lib/mongo/monitoring/event/topology_closed.rb +1 -1
  42. data/lib/mongo/monitoring/event/topology_opening.rb +1 -1
  43. data/lib/mongo/monitoring/publishable.rb +6 -3
  44. data/lib/mongo/monitoring/server_description_changed_log_subscriber.rb +9 -1
  45. data/lib/mongo/monitoring/topology_changed_log_subscriber.rb +1 -1
  46. data/lib/mongo/protocol/message.rb +36 -8
  47. data/lib/mongo/protocol/msg.rb +14 -0
  48. data/lib/mongo/protocol/serializers.rb +5 -2
  49. data/lib/mongo/server.rb +10 -3
  50. data/lib/mongo/server/connection.rb +4 -4
  51. data/lib/mongo/server/connection_base.rb +3 -1
  52. data/lib/mongo/server/description.rb +5 -0
  53. data/lib/mongo/server/monitor.rb +76 -44
  54. data/lib/mongo/server/monitor/connection.rb +55 -7
  55. data/lib/mongo/server/pending_connection.rb +14 -4
  56. data/lib/mongo/server/push_monitor.rb +173 -0
  57. data/{spec/runners/transactions/context.rb → lib/mongo/server/push_monitor/connection.rb} +9 -14
  58. data/lib/mongo/server_selector.rb +0 -1
  59. data/lib/mongo/server_selector/base.rb +579 -1
  60. data/lib/mongo/server_selector/nearest.rb +1 -6
  61. data/lib/mongo/server_selector/primary.rb +1 -6
  62. data/lib/mongo/server_selector/primary_preferred.rb +7 -10
  63. data/lib/mongo/server_selector/secondary.rb +1 -6
  64. data/lib/mongo/server_selector/secondary_preferred.rb +1 -7
  65. data/lib/mongo/session.rb +2 -0
  66. data/lib/mongo/socket.rb +20 -8
  67. data/lib/mongo/socket/ssl.rb +1 -1
  68. data/lib/mongo/socket/tcp.rb +1 -1
  69. data/lib/mongo/topology_version.rb +9 -0
  70. data/lib/mongo/utils.rb +62 -0
  71. data/lib/mongo/version.rb +1 -1
  72. data/spec/README.aws-auth.md +2 -2
  73. data/spec/integration/awaited_ismaster_spec.rb +28 -0
  74. data/spec/integration/change_stream_examples_spec.rb +6 -2
  75. data/spec/integration/check_clean_slate_spec.rb +16 -0
  76. data/spec/integration/client_construction_spec.rb +1 -0
  77. data/spec/integration/connect_single_rs_name_spec.rb +5 -2
  78. data/spec/integration/connection_spec.rb +7 -4
  79. data/spec/integration/crud_spec.rb +4 -4
  80. data/spec/integration/docs_examples_spec.rb +6 -0
  81. data/spec/integration/grid_fs_bucket_spec.rb +48 -0
  82. data/spec/integration/heartbeat_events_spec.rb +4 -23
  83. data/spec/integration/read_concern_spec.rb +1 -1
  84. data/spec/integration/retryable_errors_spec.rb +1 -1
  85. data/spec/integration/retryable_writes/shared/performs_legacy_retries.rb +2 -2
  86. data/spec/integration/retryable_writes/shared/performs_modern_retries.rb +3 -3
  87. data/spec/integration/retryable_writes/shared/performs_no_retries.rb +2 -2
  88. data/spec/integration/sdam_error_handling_spec.rb +37 -15
  89. data/spec/integration/sdam_events_spec.rb +77 -6
  90. data/spec/integration/sdam_prose_spec.rb +64 -0
  91. data/spec/integration/server_monitor_spec.rb +25 -1
  92. data/spec/integration/size_limit_spec.rb +7 -3
  93. data/spec/integration/size_limit_spec.rb~12e1e9c4f... RUBY-2242 Fix zlib compression (#2021) +98 -0
  94. data/spec/integration/ssl_uri_options_spec.rb +2 -2
  95. data/spec/integration/zlib_compression_spec.rb +25 -0
  96. data/spec/lite_spec_helper.rb +12 -5
  97. data/spec/mongo/auth/aws/request_spec.rb +76 -0
  98. data/spec/mongo/auth/scram_spec.rb +1 -1
  99. data/spec/mongo/client_construction_spec.rb +207 -0
  100. data/spec/mongo/client_spec.rb +38 -3
  101. data/spec/mongo/cluster/topology/replica_set_spec.rb +52 -9
  102. data/spec/mongo/cluster/topology/single_spec.rb +4 -2
  103. data/spec/mongo/cluster_spec.rb +34 -35
  104. data/spec/mongo/collection/view/change_stream_resume_spec.rb +6 -6
  105. data/spec/mongo/collection_spec.rb +500 -0
  106. data/spec/mongo/database_spec.rb +245 -8
  107. data/spec/mongo/distinguishing_semaphore_spec.rb +63 -0
  108. data/spec/mongo/error/operation_failure_spec.rb +40 -0
  109. data/spec/mongo/index/view_spec.rb +2 -2
  110. data/spec/mongo/monitoring/event/server_description_changed_spec.rb +1 -4
  111. data/spec/mongo/protocol/msg_spec.rb +10 -0
  112. data/spec/mongo/semaphore_spec.rb +51 -0
  113. data/spec/mongo/server/connection_auth_spec.rb +2 -2
  114. data/spec/mongo/server_selector/nearest_spec.rb +23 -23
  115. data/spec/mongo/server_selector/primary_preferred_spec.rb +26 -26
  116. data/spec/mongo/server_selector/primary_spec.rb +9 -9
  117. data/spec/mongo/server_selector/secondary_preferred_spec.rb +22 -22
  118. data/spec/mongo/server_selector/secondary_spec.rb +18 -18
  119. data/spec/mongo/server_selector_spec.rb +4 -4
  120. data/spec/mongo/session_spec.rb +35 -0
  121. data/spec/runners/change_streams/test.rb +2 -2
  122. data/spec/runners/cmap.rb +1 -1
  123. data/spec/runners/command_monitoring.rb +3 -34
  124. data/spec/runners/crud/context.rb +9 -5
  125. data/spec/runners/crud/operation.rb +59 -27
  126. data/spec/runners/crud/spec.rb +0 -8
  127. data/spec/runners/crud/test.rb +1 -1
  128. data/spec/runners/sdam.rb +2 -2
  129. data/spec/runners/server_selection.rb +242 -28
  130. data/spec/runners/transactions.rb +12 -12
  131. data/spec/runners/transactions/operation.rb +151 -25
  132. data/spec/runners/transactions/test.rb +60 -16
  133. data/spec/spec_tests/command_monitoring_spec.rb +22 -12
  134. data/spec/spec_tests/crud_spec.rb +1 -1
  135. data/spec/spec_tests/data/change_streams/change-streams-errors.yml +4 -8
  136. data/spec/spec_tests/data/change_streams/change-streams-resume-whitelist.yml +66 -0
  137. data/spec/spec_tests/data/max_staleness/ReplicaSetNoPrimary/MaxStalenessTooSmall.yml +15 -0
  138. data/spec/spec_tests/data/max_staleness/ReplicaSetNoPrimary/NoKnownServers.yml +4 -3
  139. data/spec/spec_tests/data/max_staleness/Unknown/SmallMaxStaleness.yml +1 -0
  140. data/spec/spec_tests/data/sdam_integration/cancel-server-check.yml +96 -0
  141. data/spec/spec_tests/data/sdam_integration/connectTimeoutMS.yml +88 -0
  142. data/spec/spec_tests/data/sdam_integration/find-network-error.yml +83 -0
  143. data/spec/spec_tests/data/sdam_integration/find-shutdown-error.yml +116 -0
  144. data/spec/spec_tests/data/sdam_integration/insert-network-error.yml +86 -0
  145. data/spec/spec_tests/data/sdam_integration/insert-shutdown-error.yml +115 -0
  146. data/spec/spec_tests/data/sdam_integration/isMaster-command-error.yml +168 -0
  147. data/spec/spec_tests/data/sdam_integration/isMaster-network-error.yml +162 -0
  148. data/spec/spec_tests/data/sdam_integration/isMaster-timeout.yml +229 -0
  149. data/spec/spec_tests/data/sdam_integration/rediscover-quickly-after-step-down.yml +87 -0
  150. data/spec/spec_tests/max_staleness_spec.rb +4 -142
  151. data/spec/spec_tests/retryable_reads_spec.rb +2 -2
  152. data/spec/spec_tests/sdam_integration_spec.rb +13 -0
  153. data/spec/spec_tests/sdam_monitoring_spec.rb +1 -2
  154. data/spec/spec_tests/server_selection_spec.rb +4 -116
  155. data/spec/stress/cleanup_spec.rb +17 -2
  156. data/spec/stress/connection_pool_stress_spec.rb +10 -8
  157. data/spec/support/child_process_helper.rb +78 -0
  158. data/spec/support/client_registry.rb +1 -0
  159. data/spec/support/cluster_config.rb +4 -0
  160. data/spec/support/event_subscriber.rb +123 -33
  161. data/spec/support/keyword_struct.rb +26 -0
  162. data/spec/support/shared/server_selector.rb +13 -1
  163. data/spec/support/spec_config.rb +38 -13
  164. data/spec/support/spec_organizer.rb +129 -0
  165. data/spec/support/spec_setup.rb +1 -1
  166. data/spec/support/utils.rb +46 -0
  167. metadata +992 -942
  168. metadata.gz.sig +0 -0
  169. data/lib/mongo/server_selector/selectable.rb +0 -560
  170. data/spec/runners/sdam_monitoring.rb +0 -89
@@ -92,8 +92,8 @@ describe Mongo::Database do
92
92
  end
93
93
 
94
94
  before do
95
- database[:users].drop
96
- database[:users].create
95
+ database['users'].drop
96
+ database['users'].create
97
97
  end
98
98
 
99
99
  let(:actual) do
@@ -153,7 +153,80 @@ describe Mongo::Database do
153
153
  expect(collection_names).to include('0_dalmatians')
154
154
  expect(collection_names).to include('1_dalmatians')
155
155
  end
156
+ end
157
+
158
+ context 'when provided a filter' do
159
+ min_server_fcv '3.0'
160
+
161
+ before do
162
+ database['users2'].drop
163
+ database['users2'].create
164
+ end
165
+
166
+ let(:result) do
167
+ database.collection_names(filter: { name: 'users2' })
168
+ end
156
169
 
170
+ it 'returns users2 collection' do
171
+ expect(result.length).to eq(1)
172
+ expect(result.first).to eq('users2')
173
+ end
174
+ end
175
+
176
+ context 'when provided authorized_collections or not' do
177
+
178
+ context 'on server versions >= 4.0' do
179
+ min_server_fcv '4.0'
180
+
181
+ let(:database) do
182
+ described_class.new(client, SpecConfig.instance.test_db)
183
+ end
184
+
185
+ let(:subscriber) { EventSubscriber.new }
186
+
187
+ let(:client) do
188
+ authorized_client.tap do |client|
189
+ client.subscribe(Mongo::Monitoring::COMMAND, subscriber)
190
+ end
191
+ end
192
+
193
+ context 'when authorized_collections is provided' do
194
+ let(:options) do
195
+ { authorized_collections: true }
196
+ end
197
+
198
+ let!(:result) do
199
+ database.collections(options)
200
+ end
201
+
202
+ let(:events) do
203
+ subscriber.command_started_events('listCollections')
204
+ end
205
+
206
+ it 'passes authorized_collections to the server' do
207
+ expect(events.length).to eq(1)
208
+ command = events.first.command
209
+ expect(command['authorizedCollections']).to eq(true)
210
+ end
211
+ end
212
+
213
+ context 'when no options are provided' do
214
+ let!(:result) do
215
+ database.collection_names
216
+ end
217
+
218
+ let(:events) do
219
+ subscriber.command_started_events('listCollections')
220
+ end
221
+
222
+ it 'authorized_collections not passed to server' do
223
+ expect(events.length).to eq(1)
224
+ command = events.first.command
225
+ expect(command['nameOnly']).to eq(true)
226
+ expect(command['authorizedCollections']).to be_nil
227
+ end
228
+ end
229
+ end
157
230
  end
158
231
  end
159
232
 
@@ -170,8 +243,8 @@ describe Mongo::Database do
170
243
  end
171
244
 
172
245
  before do
173
- database[:acol].drop
174
- database[:acol].create
246
+ database['acol'].drop
247
+ database['acol'].create
175
248
  end
176
249
 
177
250
  context 'server 3.0+' do
@@ -183,8 +256,8 @@ describe Mongo::Database do
183
256
 
184
257
  context 'with more than one collection' do
185
258
  before do
186
- database[:anothercol].drop
187
- database[:anothercol].create
259
+ database['anothercol'].drop
260
+ database['anothercol'].create
188
261
 
189
262
  expect(database.collections.length).to be > 1
190
263
  end
@@ -239,6 +312,85 @@ describe Mongo::Database do
239
312
  end
240
313
  end
241
314
  end
315
+
316
+ context 'when provided authorized_collections or name_only options or not' do
317
+
318
+ context 'on server versions >= 4.0' do
319
+ min_server_fcv '4.0'
320
+
321
+ let(:database) do
322
+ described_class.new(client, SpecConfig.instance.test_db)
323
+ end
324
+
325
+ let(:subscriber) { EventSubscriber.new }
326
+
327
+ let(:client) do
328
+ authorized_client.tap do |client|
329
+ client.subscribe(Mongo::Monitoring::COMMAND, subscriber)
330
+ end
331
+ end
332
+
333
+ context 'when both are provided' do
334
+ let(:options) do
335
+ { name_only: true, authorized_collections: true }
336
+ end
337
+
338
+ let!(:result) do
339
+ database.list_collections(options)
340
+ end
341
+
342
+ let(:events) do
343
+ subscriber.command_started_events('listCollections')
344
+ end
345
+
346
+ it 'passes original options to the server' do
347
+ expect(events.length).to eq(1)
348
+ command = events.first.command
349
+ expect(command['nameOnly']).to eq(true)
350
+ expect(command['authorizedCollections']).to eq(true)
351
+ end
352
+ end
353
+
354
+ context 'when name_only is provided' do
355
+ let(:options) do
356
+ { name_only: false }
357
+ end
358
+
359
+ let!(:result) do
360
+ database.list_collections(options)
361
+ end
362
+
363
+ let(:events) do
364
+ subscriber.command_started_events('listCollections')
365
+ end
366
+
367
+ it 'no options passed to server because false' do
368
+ expect(events.length).to eq(1)
369
+ command = events.first.command
370
+ expect(command['nameOnly']).to be_nil
371
+ expect(command['authorizedCollections']).to be_nil
372
+ end
373
+ end
374
+
375
+ context 'when no options provided' do
376
+
377
+ let!(:result) do
378
+ database.list_collections
379
+ end
380
+
381
+ let(:events) do
382
+ subscriber.command_started_events('listCollections')
383
+ end
384
+
385
+ it 'no options passed to server because none provided' do
386
+ expect(events.length).to eq(1)
387
+ command = events.first.command
388
+ expect(command['nameOnly']).to be_nil
389
+ expect(command['authorizedCollections']).to be_nil
390
+ end
391
+ end
392
+ end
393
+ end
242
394
  end
243
395
 
244
396
  describe '#collections' do
@@ -254,8 +406,8 @@ describe Mongo::Database do
254
406
  end
255
407
 
256
408
  before do
257
- database[:users].drop
258
- database[:users].create
409
+ database['users'].drop
410
+ database['users'].create
259
411
  end
260
412
 
261
413
  it 'returns collection objects for each name' do
@@ -304,6 +456,91 @@ describe Mongo::Database do
304
456
  }.to raise_error(Mongo::Error::OperationFailure)
305
457
  end
306
458
  end
459
+
460
+ context 'when provided a filter' do
461
+ min_server_fcv '3.0'
462
+
463
+ let(:database) do
464
+ described_class.new(authorized_client, SpecConfig.instance.test_db)
465
+ end
466
+
467
+ let(:collection2) do
468
+ Mongo::Collection.new(database, 'users2')
469
+ end
470
+
471
+ before do
472
+ database['users1'].drop
473
+ database['users1'].create
474
+
475
+ database['users2'].drop
476
+ database['users2'].create
477
+ end
478
+
479
+ let(:result) do
480
+ database.collections(filter: { name: 'users2' })
481
+ end
482
+
483
+ it 'returns users2 collection' do
484
+ expect(result.length).to eq(1)
485
+ expect(database.collections).to include(collection2)
486
+ end
487
+ end
488
+
489
+ context 'when provided authorized_collections or not' do
490
+
491
+ context 'on server versions >= 4.0' do
492
+ min_server_fcv '4.0'
493
+
494
+ let(:database) do
495
+ described_class.new(client, SpecConfig.instance.test_db)
496
+ end
497
+
498
+ let(:subscriber) { EventSubscriber.new }
499
+
500
+ let(:client) do
501
+ authorized_client.tap do |client|
502
+ client.subscribe(Mongo::Monitoring::COMMAND, subscriber)
503
+ end
504
+ end
505
+
506
+ context 'when authorized_collections are provided' do
507
+ let(:options) do
508
+ { authorized_collections: false }
509
+ end
510
+
511
+ let!(:result) do
512
+ database.collections(options)
513
+ end
514
+
515
+ let(:events) do
516
+ subscriber.command_started_events('listCollections')
517
+ end
518
+
519
+ it 'authorized_collections not passed to server because false' do
520
+ expect(events.length).to eq(1)
521
+ command = events.first.command
522
+ expect(command['nameOnly']).to eq(true)
523
+ expect(command['authorizedCollections']).to be_nil
524
+ end
525
+ end
526
+
527
+ context 'when no options are provided' do
528
+ let!(:result) do
529
+ database.collections
530
+ end
531
+
532
+ let(:events) do
533
+ subscriber.command_started_events('listCollections')
534
+ end
535
+
536
+ it 'authorized_collections not passed to server because not provided' do
537
+ expect(events.length).to eq(1)
538
+ command = events.first.command
539
+ expect(command['authorizedCollections']).to be_nil
540
+ end
541
+ end
542
+ end
543
+ end
307
544
  end
308
545
 
309
546
  describe '#command' do
@@ -0,0 +1,63 @@
1
+ require 'lite_spec_helper'
2
+
3
+ describe Mongo::DistinguishingSemaphore do
4
+ let(:semaphore) do
5
+ described_class.new
6
+ end
7
+
8
+ it 'waits until signaled' do
9
+ result = nil
10
+
11
+ consumer = Thread.new do
12
+ result = semaphore.wait(3)
13
+ end
14
+
15
+ # Context switch to start the thread
16
+ sleep 0.1
17
+
18
+ start_time = Time.now
19
+ semaphore.signal
20
+ consumer.join
21
+
22
+ (Time.now - start_time).should < 1
23
+
24
+ result.should be true
25
+ end
26
+
27
+ it 'waits until broadcast' do
28
+ result = nil
29
+
30
+ consumer = Thread.new do
31
+ result = semaphore.wait(3)
32
+ end
33
+
34
+ # Context switch to start the thread
35
+ sleep 0.1
36
+
37
+ start_time = Time.now
38
+ semaphore.broadcast
39
+ consumer.join
40
+
41
+ (Time.now - start_time).should < 1
42
+
43
+ result.should be true
44
+ end
45
+
46
+ it 'times out' do
47
+ result = nil
48
+
49
+ consumer = Thread.new do
50
+ result = semaphore.wait(2)
51
+ end
52
+
53
+ # Context switch to start the thread
54
+ sleep 0.1
55
+
56
+ start_time = Time.now
57
+ consumer.join
58
+
59
+ (Time.now - start_time).should > 1
60
+
61
+ result.should be false
62
+ end
63
+ end
@@ -227,6 +227,46 @@ describe Mongo::Error::OperationFailure do
227
227
  end
228
228
  end
229
229
 
230
+ context 'when the error code is 43 (CursorNotFound)' do
231
+ let(:error) { Mongo::Error::OperationFailure.new(nil, result, code: 43, code_name: 'CursorNotFound') }
232
+ let(:result) do
233
+ Mongo::Operation::GetMore::Result.new(
234
+ Mongo::Protocol::Message.new, description)
235
+ end
236
+
237
+ context 'wire protocol < 9' do
238
+ let(:description) do
239
+ Mongo::Server::Description.new('',
240
+ 'minWireVersion' => 0,
241
+ 'maxWireVersion' => 8,
242
+ )
243
+ end
244
+
245
+ it 'returns true' do
246
+ # CursorNotFound exceptions are resumable even if they don't have
247
+ # a ResumableChangeStreamError label because the server is not aware
248
+ # of the cursor id, and thus cannot determine if it is a change stream.
249
+ expect(error.change_stream_resumable?).to be true
250
+ end
251
+ end
252
+
253
+ context 'wire protocol >= 9' do
254
+ let(:description) do
255
+ Mongo::Server::Description.new('',
256
+ 'minWireVersion' => 0,
257
+ 'maxWireVersion' => 9,
258
+ )
259
+ end
260
+
261
+ it 'returns true' do
262
+ # CursorNotFound exceptions are resumable even if they don't have
263
+ # a ResumableChangeStreamError label because the server is not aware
264
+ # of the cursor id, and thus cannot determine if it is a change stream.
265
+ expect(error.change_stream_resumable?).to be true
266
+ end
267
+ end
268
+ end
269
+
230
270
  context 'not a getMore response' do
231
271
  let(:result) do
232
272
  Mongo::Operation::Result.new(
@@ -261,7 +261,7 @@ describe Mongo::Index::View do
261
261
  context 'when commit quorum options are specified' do
262
262
  require_topology :replica_set, :sharded
263
263
  context 'on server versions >= 4.4' do
264
- min_server_fcv '4.3'
264
+ min_server_fcv '4.4'
265
265
 
266
266
  let(:subscriber) { EventSubscriber.new }
267
267
 
@@ -776,7 +776,7 @@ describe Mongo::Index::View do
776
776
  context 'when providing commit_quorum option' do
777
777
  require_topology :replica_set, :sharded
778
778
  context 'on server versions >= 4.4' do
779
- min_server_fcv '4.3'
779
+ min_server_fcv '4.4'
780
780
 
781
781
  let(:subscriber) { EventSubscriber.new }
782
782
 
@@ -27,12 +27,9 @@ describe Mongo::Monitoring::Event::ServerDescriptionChanged do
27
27
  end
28
28
 
29
29
  describe '#summary' do
30
- skip_if_linting
31
30
 
32
31
  it 'renders correctly' do
33
- expect(topology).to receive(:server_descriptions).and_return({
34
- '127.0.0.1:27017' => Mongo::Server::Description.new(Mongo::Address.new('127.0.0.1:27017'))})
35
- expect(event.summary).to eq("#<ServerDescriptionChanged address=127.0.0.1:27017 topology=Unknown[127.0.0.1:27017] prev=#{previous_desc.inspect} new=#{updated_desc.inspect}>")
32
+ expect(event.summary).to eq("#<ServerDescriptionChanged address=127.0.0.1:27017 prev=UNKNOWN new=UNKNOWN>")
36
33
  end
37
34
  end
38
35
  end
@@ -425,6 +425,16 @@ describe Mongo::Protocol::Msg do
425
425
  expect(message.serialize).to be_a(BSON::ByteBuffer)
426
426
  end
427
427
  end
428
+
429
+ [:more_to_come, :exhaust_allowed].each do |flag|
430
+ context "with #{flag} flag" do
431
+ let(:flags) { [flag] }
432
+
433
+ it "round trips #{flag} flag" do
434
+ expect(deserialized.flags).to eq(flags)
435
+ end
436
+ end
437
+ end
428
438
  end
429
439
 
430
440
  describe '#deserialize' do