mongo 2.10.5 → 2.11.0.rc0

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 (191) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data.tar.gz.sig +0 -0
  4. data/CONTRIBUTING.md +1 -1
  5. data/lib/mongo.rb +2 -0
  6. data/lib/mongo/address.rb +4 -0
  7. data/lib/mongo/address/validator.rb +99 -0
  8. data/lib/mongo/auth.rb +7 -2
  9. data/lib/mongo/auth/user.rb +1 -7
  10. data/lib/mongo/background_thread.rb +135 -0
  11. data/lib/mongo/bulk_write/transformable.rb +3 -3
  12. data/lib/mongo/client.rb +74 -16
  13. data/lib/mongo/cluster.rb +193 -41
  14. data/lib/mongo/cluster/periodic_executor.rb +31 -43
  15. data/lib/mongo/cluster/sdam_flow.rb +26 -3
  16. data/lib/mongo/cluster/srv_monitor.rb +127 -0
  17. data/lib/mongo/collection/view/readable.rb +3 -5
  18. data/lib/mongo/collection/view/writable.rb +3 -3
  19. data/lib/mongo/cursor/builder/get_more_command.rb +1 -4
  20. data/lib/mongo/cursor/builder/kill_cursors_command.rb +5 -23
  21. data/lib/mongo/cursor/builder/op_get_more.rb +2 -2
  22. data/lib/mongo/cursor/builder/op_kill_cursors.rb +5 -24
  23. data/lib/mongo/error.rb +1 -0
  24. data/lib/mongo/error/auth_error.rb +1 -1
  25. data/lib/mongo/error/connection_check_out_timeout.rb +7 -8
  26. data/lib/mongo/error/invalid_address.rb +24 -0
  27. data/lib/mongo/error/notable.rb +2 -2
  28. data/lib/mongo/error/operation_failure.rb +3 -3
  29. data/lib/mongo/error/pool_closed_error.rb +11 -4
  30. data/lib/mongo/event.rb +1 -1
  31. data/lib/mongo/grid/file.rb +0 -5
  32. data/lib/mongo/grid/file/chunk.rb +0 -2
  33. data/lib/mongo/grid/fs_bucket.rb +13 -15
  34. data/lib/mongo/grid/stream/write.rb +3 -9
  35. data/lib/mongo/loggable.rb +5 -1
  36. data/lib/mongo/monitoring.rb +1 -0
  37. data/lib/mongo/monitoring/event/cmap/connection_check_out_failed.rb +7 -0
  38. data/lib/mongo/monitoring/event/cmap/connection_checked_in.rb +11 -3
  39. data/lib/mongo/monitoring/event/cmap/connection_checked_out.rb +11 -3
  40. data/lib/mongo/monitoring/event/cmap/pool_closed.rb +11 -3
  41. data/lib/mongo/monitoring/event/cmap/pool_created.rb +12 -3
  42. data/lib/mongo/monitoring/unified_sdam_log_subscriber.rb +62 -0
  43. data/lib/mongo/operation/shared/executable.rb +5 -10
  44. data/lib/mongo/operation/shared/sessions_supported.rb +1 -5
  45. data/lib/mongo/protocol/get_more.rb +1 -2
  46. data/lib/mongo/protocol/kill_cursors.rb +13 -6
  47. data/lib/mongo/protocol/serializers.rb +4 -20
  48. data/lib/mongo/retryable.rb +9 -34
  49. data/lib/mongo/semaphore.rb +1 -1
  50. data/lib/mongo/server.rb +113 -42
  51. data/lib/mongo/server/connection.rb +12 -5
  52. data/lib/mongo/server/connection_pool.rb +250 -40
  53. data/lib/mongo/server/connection_pool/populator.rb +58 -0
  54. data/lib/mongo/server/description.rb +9 -2
  55. data/lib/mongo/server/monitor.rb +68 -93
  56. data/lib/mongo/server/monitor/connection.rb +2 -0
  57. data/lib/mongo/server_selector/selectable.rb +13 -5
  58. data/lib/mongo/session.rb +0 -13
  59. data/lib/mongo/srv.rb +17 -0
  60. data/lib/mongo/srv/monitor.rb +96 -0
  61. data/lib/mongo/srv/resolver.rb +130 -0
  62. data/lib/mongo/srv/result.rb +126 -0
  63. data/lib/mongo/srv/warning_result.rb +35 -0
  64. data/lib/mongo/uri.rb +45 -55
  65. data/lib/mongo/uri/srv_protocol.rb +89 -42
  66. data/lib/mongo/version.rb +1 -1
  67. data/mongo.gemspec +3 -4
  68. data/spec/README.md +6 -1
  69. data/spec/enterprise_auth/kerberos_spec.rb +7 -6
  70. data/spec/integration/change_stream_examples_spec.rb +0 -4
  71. data/spec/integration/client_construction_spec.rb +14 -2
  72. data/spec/integration/connect_single_rs_name_spec.rb +2 -2
  73. data/spec/integration/connection_pool_populator_spec.rb +296 -0
  74. data/spec/integration/connection_spec.rb +31 -22
  75. data/spec/integration/cursor_reaping_spec.rb +1 -2
  76. data/spec/integration/docs_examples_spec.rb +0 -4
  77. data/spec/integration/heartbeat_events_spec.rb +17 -15
  78. data/spec/integration/reconnect_spec.rb +144 -1
  79. data/spec/integration/retryable_writes_errors_spec.rb +0 -4
  80. data/spec/integration/retryable_writes_spec.rb +36 -36
  81. data/spec/integration/sdam_error_handling_spec.rb +31 -25
  82. data/spec/integration/sdam_events_spec.rb +2 -6
  83. data/spec/integration/server_monitor_spec.rb +28 -0
  84. data/spec/integration/server_selector_spec.rb +7 -5
  85. data/spec/integration/srv_monitoring_spec.rb +360 -0
  86. data/spec/integration/step_down_spec.rb +4 -6
  87. data/spec/lite_spec_helper.rb +22 -0
  88. data/spec/mongo/address/validator_spec.rb +51 -0
  89. data/spec/mongo/auth/cr_spec.rb +1 -29
  90. data/spec/mongo/auth/ldap_spec.rb +1 -29
  91. data/spec/mongo/auth/scram/conversation_spec.rb +0 -2
  92. data/spec/mongo/auth/scram/negotiation_spec.rb +1 -1
  93. data/spec/mongo/auth/scram_spec.rb +1 -29
  94. data/spec/mongo/auth/user/view_spec.rb +1 -36
  95. data/spec/mongo/auth/user_spec.rb +0 -12
  96. data/spec/mongo/auth/x509_spec.rb +1 -29
  97. data/spec/mongo/bulk_write_spec.rb +2 -2
  98. data/spec/mongo/client_construction_spec.rb +56 -15
  99. data/spec/mongo/client_spec.rb +31 -27
  100. data/spec/mongo/cluster/periodic_executor_spec.rb +16 -0
  101. data/spec/mongo/cluster/srv_monitor_spec.rb +214 -0
  102. data/spec/mongo/cluster/topology/replica_set_spec.rb +16 -11
  103. data/spec/mongo/cluster/topology/sharded_spec.rb +12 -9
  104. data/spec/mongo/cluster/topology/single_spec.rb +20 -11
  105. data/spec/mongo/cluster_spec.rb +45 -29
  106. data/spec/mongo/collection/view/map_reduce_spec.rb +14 -9
  107. data/spec/mongo/collection/view/readable_spec.rb +0 -16
  108. data/spec/mongo/collection_spec.rb +0 -44
  109. data/spec/mongo/cursor/builder/get_more_command_spec.rb +2 -4
  110. data/spec/mongo/cursor/builder/op_get_more_spec.rb +2 -4
  111. data/spec/mongo/cursor_spec.rb +27 -7
  112. data/spec/mongo/monitoring/event/cmap/connection_checked_in_spec.rb +10 -3
  113. data/spec/mongo/monitoring/event/cmap/connection_checked_out_spec.rb +10 -3
  114. data/spec/mongo/monitoring/event/cmap/pool_closed_spec.rb +10 -3
  115. data/spec/mongo/monitoring/event/cmap/pool_created_spec.rb +10 -3
  116. data/spec/mongo/operation/delete/op_msg_spec.rb +17 -8
  117. data/spec/mongo/operation/insert/op_msg_spec.rb +50 -35
  118. data/spec/mongo/operation/update/op_msg_spec.rb +14 -7
  119. data/spec/mongo/retryable_spec.rb +52 -31
  120. data/spec/mongo/server/app_metadata_spec.rb +0 -8
  121. data/spec/mongo/server/connection_auth_spec.rb +5 -2
  122. data/spec/mongo/server/connection_pool/populator_spec.rb +101 -0
  123. data/spec/mongo/server/connection_pool_spec.rb +256 -107
  124. data/spec/mongo/server/connection_spec.rb +22 -33
  125. data/spec/mongo/server/description_spec.rb +42 -4
  126. data/spec/mongo/server/monitor/connection_spec.rb +22 -11
  127. data/spec/mongo/server/monitor_spec.rb +66 -107
  128. data/spec/mongo/server_spec.rb +82 -60
  129. data/spec/mongo/session/session_pool_spec.rb +1 -5
  130. data/spec/mongo/session_spec.rb +0 -4
  131. data/spec/mongo/socket/ssl_spec.rb +2 -2
  132. data/spec/mongo/srv/monitor_spec.rb +211 -0
  133. data/spec/mongo/srv/result_spec.rb +54 -0
  134. data/spec/mongo/uri/srv_protocol_spec.rb +30 -15
  135. data/spec/mongo/uri_spec.rb +125 -4
  136. data/spec/spec_helper.rb +6 -0
  137. data/spec/spec_tests/auth_spec.rb +39 -0
  138. data/spec/spec_tests/cmap_spec.rb +55 -8
  139. data/spec/spec_tests/connection_string_spec.rb +6 -31
  140. data/spec/spec_tests/data/auth/connection-string.yml +297 -0
  141. data/spec/spec_tests/data/cmap/pool-checkout-error-closed.yml +4 -1
  142. data/spec/spec_tests/data/cmap/pool-create-with-options.yml +1 -0
  143. data/spec/spec_tests/data/command_monitoring/insertMany.yml +1 -1
  144. data/spec/spec_tests/data/connection_string/invalid-uris.yml +20 -0
  145. data/spec/spec_tests/data/connection_string/valid-auth.yml +16 -0
  146. data/spec/spec_tests/data/connection_string/valid-warnings.yml +26 -30
  147. data/spec/spec_tests/data/transactions/abort.yml +3 -3
  148. data/spec/spec_tests/data/transactions/error-labels.yml +3 -3
  149. data/spec/spec_tests/data/transactions_api/callback-retry.yml +3 -3
  150. data/spec/spec_tests/data/uri_options/auth-options.yml +1 -1
  151. data/spec/spec_tests/max_staleness_spec.rb +7 -2
  152. data/spec/spec_tests/retryable_reads_spec.rb +0 -31
  153. data/spec/spec_tests/sdam_monitoring_spec.rb +12 -12
  154. data/spec/spec_tests/sdam_spec.rb +4 -7
  155. data/spec/spec_tests/server_selection_spec.rb +6 -2
  156. data/spec/spec_tests/transactions_spec.rb +0 -2
  157. data/spec/spec_tests/uri_options_spec.rb +4 -2
  158. data/spec/stress/connection_pool_stress_spec.rb +203 -0
  159. data/spec/stress/connection_pool_timing_spec.rb +181 -0
  160. data/spec/support/auth.rb +113 -0
  161. data/spec/support/background_thread_registry.rb +63 -0
  162. data/spec/support/client_registry.rb +11 -2
  163. data/spec/support/cluster_config.rb +65 -46
  164. data/spec/support/cluster_tools.rb +2 -2
  165. data/spec/support/cmap.rb +13 -14
  166. data/spec/support/cmap/verifier.rb +4 -5
  167. data/spec/support/command_monitoring.rb +0 -5
  168. data/spec/support/common_shortcuts.rb +101 -1
  169. data/spec/support/constraints.rb +25 -0
  170. data/spec/support/dns.rb +13 -0
  171. data/spec/support/event_subscriber.rb +0 -7
  172. data/spec/support/json_ext_formatter.rb +5 -1
  173. data/spec/support/lite_constraints.rb +22 -6
  174. data/spec/support/local_resource_registry.rb +34 -0
  175. data/spec/support/sdam_monitoring.rb +115 -0
  176. data/spec/support/spec_config.rb +20 -6
  177. data/spec/support/spec_setup.rb +2 -2
  178. data/spec/support/transactions.rb +1 -1
  179. data/spec/support/transactions/test.rb +1 -1
  180. data/spec/support/utils.rb +1 -16
  181. metadata +685 -659
  182. metadata.gz.sig +0 -0
  183. data/lib/mongo/event/description_changed.rb +0 -52
  184. data/spec/integration/bson_symbol_spec.rb +0 -34
  185. data/spec/integration/crud_spec.rb +0 -45
  186. data/spec/integration/get_more_spec.rb +0 -32
  187. data/spec/integration/grid_fs_bucket_spec.rb +0 -48
  188. data/spec/integration/retryable_errors_spec.rb +0 -265
  189. data/spec/integration/size_limit_spec.rb~12e1e9c4f... RUBY-2242 Fix zlib compression (#2021) +0 -98
  190. data/spec/mongo/cursor/builder/op_kill_cursors_spec.rb +0 -56
  191. data/spec/runners/sdam/verifier.rb +0 -88
@@ -8,7 +8,7 @@ describe Mongo::Client do
8
8
  describe '#==' do
9
9
 
10
10
  let(:client) do
11
- new_local_client(
11
+ new_local_client_nmio(
12
12
  ['127.0.0.1:27017'],
13
13
  :read => { :mode => :primary },
14
14
  :database => SpecConfig.instance.test_db
@@ -20,7 +20,7 @@ describe Mongo::Client do
20
20
  context 'when the options and cluster are equal' do
21
21
 
22
22
  let(:other) do
23
- new_local_client(
23
+ new_local_client_nmio(
24
24
  ['127.0.0.1:27017'],
25
25
  :read => { :mode => :primary },
26
26
  :database => SpecConfig.instance.test_db
@@ -35,7 +35,7 @@ describe Mongo::Client do
35
35
  context 'when the options are not equal' do
36
36
 
37
37
  let(:other) do
38
- new_local_client(
38
+ new_local_client_nmio(
39
39
  ['127.0.0.1:27017'],
40
40
  :read => { :mode => :secondary },
41
41
  :database => SpecConfig.instance.test_db
@@ -50,7 +50,7 @@ describe Mongo::Client do
50
50
  context 'when cluster is not equal' do
51
51
 
52
52
  let(:other) do
53
- new_local_client(
53
+ new_local_client_nmio(
54
54
  ['127.0.0.1:27010'],
55
55
  :read => { :mode => :primary },
56
56
  :database => SpecConfig.instance.test_db
@@ -74,7 +74,8 @@ describe Mongo::Client do
74
74
  describe '#[]' do
75
75
 
76
76
  let(:client) do
77
- new_local_client(['127.0.0.1:27017'], :database => SpecConfig.instance.test_db)
77
+ new_local_client_nmio(['127.0.0.1:27017'],
78
+ :database => SpecConfig.instance.test_db)
78
79
  end
79
80
 
80
81
  shared_examples_for 'a collection switching object' do
@@ -110,7 +111,7 @@ describe Mongo::Client do
110
111
  describe '#eql' do
111
112
 
112
113
  let(:client) do
113
- new_local_client(
114
+ new_local_client_nmio(
114
115
  ['127.0.0.1:27017'],
115
116
  :read => { :mode => :primary },
116
117
  :database => SpecConfig.instance.test_db
@@ -122,7 +123,7 @@ describe Mongo::Client do
122
123
  context 'when the options and cluster are equal' do
123
124
 
124
125
  let(:other) do
125
- new_local_client(
126
+ new_local_client_nmio(
126
127
  ['127.0.0.1:27017'],
127
128
  :read => { :mode => :primary },
128
129
  :database => SpecConfig.instance.test_db
@@ -137,7 +138,7 @@ describe Mongo::Client do
137
138
  context 'when the options are not equal' do
138
139
 
139
140
  let(:other) do
140
- new_local_client(
141
+ new_local_client_nmio(
141
142
  ['127.0.0.1:27017'],
142
143
  :read => { :mode => :secondary },
143
144
  :database => SpecConfig.instance.test_db
@@ -152,7 +153,7 @@ describe Mongo::Client do
152
153
  context 'when the cluster is not equal' do
153
154
 
154
155
  let(:other) do
155
- new_local_client(
156
+ new_local_client_nmio(
156
157
  ['127.0.0.1:27010'],
157
158
  :read => { :mode => :primary },
158
159
  :database => SpecConfig.instance.test_db
@@ -168,7 +169,7 @@ describe Mongo::Client do
168
169
  context 'when the other is not a client' do
169
170
 
170
171
  let(:client) do
171
- new_local_client(
172
+ new_local_client_nmio(
172
173
  ['127.0.0.1:27017'],
173
174
  :read => { :mode => :primary },
174
175
  :database => SpecConfig.instance.test_db
@@ -184,7 +185,7 @@ describe Mongo::Client do
184
185
  describe '#hash' do
185
186
 
186
187
  let(:client) do
187
- new_local_client(
188
+ new_local_client_nmio(
188
189
  ['127.0.0.1:27017'],
189
190
  :read => { :mode => :primary },
190
191
  :local_threshold => 0.010,
@@ -193,7 +194,8 @@ describe Mongo::Client do
193
194
  )
194
195
  end
195
196
 
196
- let(:default_options) { Mongo::Options::Redacted.new(retry_writes: true, retry_reads: true) }
197
+ let(:default_options) { Mongo::Options::Redacted.new(
198
+ retry_writes: true, retry_reads: true, monitoring_io: false) }
197
199
 
198
200
  let(:options) do
199
201
  Mongo::Options::Redacted.new(:read => { :mode => :primary },
@@ -214,7 +216,7 @@ describe Mongo::Client do
214
216
  describe '#inspect' do
215
217
 
216
218
  let(:client) do
217
- new_local_client(
219
+ new_local_client_nmio(
218
220
  ['127.0.0.1:27017'],
219
221
  :read => { :mode => :primary },
220
222
  :database => SpecConfig.instance.test_db
@@ -228,7 +230,7 @@ describe Mongo::Client do
228
230
  context 'when there is sensitive data in the options' do
229
231
 
230
232
  let(:client) do
231
- new_local_client(
233
+ new_local_client_nmio(
232
234
  ['127.0.0.1:27017'],
233
235
  :read => { :mode => :primary },
234
236
  :database => SpecConfig.instance.test_db,
@@ -248,7 +250,7 @@ describe Mongo::Client do
248
250
  context 'when there is a read preference set' do
249
251
 
250
252
  let(:client) do
251
- new_local_client(['127.0.0.1:27017'],
253
+ new_local_client_nmio(['127.0.0.1:27017'],
252
254
  :database => SpecConfig.instance.test_db,
253
255
  :read => mode,
254
256
  :server_selection_timeout => 2)
@@ -320,7 +322,7 @@ describe Mongo::Client do
320
322
  context 'when no mode provided' do
321
323
 
322
324
  let(:client) do
323
- new_local_client(['127.0.0.1:27017'],
325
+ new_local_client_nmio(['127.0.0.1:27017'],
324
326
  :database => SpecConfig.instance.test_db,
325
327
  :server_selection_timeout => 2)
326
328
  end
@@ -333,7 +335,7 @@ describe Mongo::Client do
333
335
  context 'when the read preference is printed' do
334
336
 
335
337
  let(:client) do
336
- new_local_client(SpecConfig.instance.addresses, options)
338
+ new_local_client_nmio(SpecConfig.instance.addresses, options)
337
339
  end
338
340
 
339
341
  let(:options) do
@@ -362,7 +364,7 @@ describe Mongo::Client do
362
364
  describe '#read_preference' do
363
365
 
364
366
  let(:client) do
365
- new_local_client(['127.0.0.1:27017'],
367
+ new_local_client_nmio(['127.0.0.1:27017'],
366
368
  :database => SpecConfig.instance.test_db,
367
369
  :read => mode,
368
370
  :server_selection_timeout => 2)
@@ -430,7 +432,7 @@ describe Mongo::Client do
430
432
  context 'when no mode provided' do
431
433
 
432
434
  let(:client) do
433
- new_local_client(['127.0.0.1:27017'],
435
+ new_local_client_nmio(['127.0.0.1:27017'],
434
436
  :database => SpecConfig.instance.test_db,
435
437
  :server_selection_timeout => 2)
436
438
  end
@@ -447,7 +449,7 @@ describe Mongo::Client do
447
449
 
448
450
  context 'when no option was provided to the client' do
449
451
 
450
- let(:client) { new_local_client(['127.0.0.1:27017'], :database => SpecConfig.instance.test_db) }
452
+ let(:client) { new_local_client_nmio(['127.0.0.1:27017'], :database => SpecConfig.instance.test_db) }
451
453
 
452
454
  it 'does not set the write concern' do
453
455
  expect(concern).to be_nil
@@ -459,7 +461,7 @@ describe Mongo::Client do
459
461
  context 'when the option is acknowledged' do
460
462
 
461
463
  let(:client) do
462
- new_local_client(['127.0.0.1:27017'], :write => { :j => true }, :database => SpecConfig.instance.test_db)
464
+ new_local_client_nmio(['127.0.0.1:27017'], :write => { :j => true }, :database => SpecConfig.instance.test_db)
463
465
  end
464
466
 
465
467
  it 'returns a acknowledged write concern' do
@@ -472,7 +474,7 @@ describe Mongo::Client do
472
474
  context 'when the w is 0' do
473
475
 
474
476
  let(:client) do
475
- new_local_client(['127.0.0.1:27017'], :write => { :w => 0 }, :database => SpecConfig.instance.test_db)
477
+ new_local_client_nmio(['127.0.0.1:27017'], :write => { :w => 0 }, :database => SpecConfig.instance.test_db)
476
478
  end
477
479
 
478
480
  it 'returns an unacknowledged write concern' do
@@ -483,7 +485,7 @@ describe Mongo::Client do
483
485
  context 'when the w is -1' do
484
486
 
485
487
  let(:client) do
486
- new_local_client(['127.0.0.1:27017'], :write => { :w => -1 }, :database => SpecConfig.instance.test_db)
488
+ new_local_client_nmio(['127.0.0.1:27017'], :write => { :w => -1 }, :database => SpecConfig.instance.test_db)
487
489
  end
488
490
 
489
491
  it 'raises an error' do
@@ -584,7 +586,9 @@ describe Mongo::Client do
584
586
  end
585
587
 
586
588
  let(:client) do
587
- ClientRegistry.instance.new_local_client(SpecConfig.instance.addresses, client_options).tap do |cl|
589
+ ClientRegistry.instance.new_local_client(
590
+ SpecConfig.instance.addresses, client_options
591
+ ).tap do |cl|
588
592
  cl.subscribe(Mongo::Monitoring::COMMAND, EventSubscriber.clear_events!)
589
593
  end
590
594
  end
@@ -645,13 +649,13 @@ describe Mongo::Client do
645
649
 
646
650
  describe '#close' do
647
651
  let(:client) do
648
- Mongo::Client.new(['127.0.0.1:27017'], monitoring_io: false)
652
+ new_local_client_nmio(['127.0.0.1:27017'])
649
653
  end
650
654
 
651
655
  it 'disconnects the cluster and returns true' do
652
656
  RSpec::Mocks.with_temporary_scope do
653
657
  expect(client.cluster).to receive(:disconnect!).and_call_original
654
- expect(client.close(true)).to be(true)
658
+ expect(client.close).to be(true)
655
659
  end
656
660
  end
657
661
  end
@@ -659,7 +663,7 @@ describe Mongo::Client do
659
663
  describe '#reconnect' do
660
664
 
661
665
  let(:client) do
662
- new_local_client(['127.0.0.1:27017'])
666
+ new_local_client_nmio([ClusterConfig.instance.primary_address_str])
663
667
  end
664
668
 
665
669
  it 'replaces the cluster' do
@@ -0,0 +1,16 @@
1
+ require 'spec_helper'
2
+
3
+ describe Mongo::Cluster::PeriodicExecutor do
4
+
5
+ let(:executor) do
6
+ described_class.new
7
+ end
8
+
9
+ describe '#log_warn' do
10
+ it 'works' do
11
+ expect do
12
+ executor.log_warn('test warning')
13
+ end.not_to raise_error
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,214 @@
1
+ require 'lite_spec_helper'
2
+
3
+ xdescribe Mongo::Cluster::SrvMonitor do
4
+ describe '#scan!' do
5
+ let(:hostname) do
6
+ 'test1.test.build.10gen.cc.'
7
+ end
8
+
9
+ let(:hosts) do
10
+ [
11
+ 'localhost.test.build.10gen.cc.:27017',
12
+ 'localhost.test.build.10gen.cc.:27018',
13
+ ]
14
+ end
15
+
16
+ let(:records) do
17
+ double('records').tap do |records|
18
+ allow(records).to receive(:hostname).and_return(hostname)
19
+ allow(records).to receive(:hosts).and_return(hosts)
20
+ allow(records).to receive(:empty?).and_return(false)
21
+ allow(records).to receive(:min_ttl).and_return(nil)
22
+ end
23
+ end
24
+
25
+ let(:srv_uri) do
26
+ Mongo::URI.get("mongodb+srv://localhost.a.b")
27
+ end
28
+
29
+ let(:cluster) do
30
+ Mongo::Cluster.new(records.hosts, Mongo::Monitoring.new, { monitoring_io: false })
31
+ end
32
+
33
+ let(:monitoring) do
34
+ described_class.new(cluster, srv_uri: srv_uri)
35
+ end
36
+
37
+ before do
38
+ monitoring.scan!
39
+ end
40
+
41
+ context 'when a new DNS record is added' do
42
+ let(:new_hosts) do
43
+ hosts + ['test1.test.build.10gen.cc.:27019']
44
+ end
45
+
46
+ let(:new_records) do
47
+ double('records').tap do |records|
48
+ allow(records).to receive(:hostname).and_return(hostname)
49
+ allow(records).to receive(:hosts).and_return(new_hosts)
50
+ allow(records).to receive(:empty?).and_return(false)
51
+ allow(records).to receive(:min_ttl).and_return(nil)
52
+ end
53
+ end
54
+
55
+ let(:resolver) do
56
+ double('resolver').tap do |resolver|
57
+ allow(resolver).to receive(:get_records).and_return(new_records)
58
+ end
59
+ end
60
+
61
+ it 'adds the new host to the cluster' do
62
+ expect(cluster.addresses.map(&:to_s).sort).to eq(new_hosts.sort)
63
+ end
64
+ end
65
+
66
+ context 'when a DNS record is removed' do
67
+ let(:new_hosts) do
68
+ hosts - ['test1.test.build.10gen.cc.:27018']
69
+ end
70
+
71
+ let(:new_records) do
72
+ double('records').tap do |records|
73
+ allow(records).to receive(:hostname).and_return(hostname)
74
+ allow(records).to receive(:hosts).and_return(new_hosts)
75
+ allow(records).to receive(:empty?).and_return(false)
76
+ allow(records).to receive(:min_ttl).and_return(nil)
77
+ end
78
+ end
79
+
80
+ let(:resolver) do
81
+ double('resolver').tap do |resolver|
82
+ allow(resolver).to receive(:get_records).and_return(new_records)
83
+ end
84
+ end
85
+
86
+ it 'adds the new host to the cluster' do
87
+ expect(cluster.addresses.map(&:to_s).sort).to eq(new_hosts.sort)
88
+ end
89
+ end
90
+
91
+ context 'when a single DNS record is replaced' do
92
+ let(:new_hosts) do
93
+ hosts - ['test1.test.build.10gen.cc.:27018'] + ['test1.test.build.10gen.cc.:27019']
94
+ end
95
+
96
+ let(:new_records) do
97
+ double('records').tap do |records|
98
+ allow(records).to receive(:hostname).and_return(hostname)
99
+ allow(records).to receive(:hosts).and_return(new_hosts)
100
+ allow(records).to receive(:empty?).and_return(false)
101
+ allow(records).to receive(:min_ttl).and_return(nil)
102
+ end
103
+ end
104
+
105
+ let(:resolver) do
106
+ double('resolver').tap do |resolver|
107
+ allow(resolver).to receive(:get_records).and_return(new_records)
108
+ end
109
+ end
110
+
111
+ it 'adds the new host to the cluster' do
112
+ expect(cluster.addresses.map(&:to_s).sort).to eq(new_hosts.sort)
113
+ end
114
+ end
115
+
116
+ context 'when all DNS records are replaced with a single record' do
117
+ let(:new_hosts) do
118
+ ['test1.test.build.10gen.cc.:27019']
119
+ end
120
+
121
+ let(:new_records) do
122
+ double('records').tap do |records|
123
+ allow(records).to receive(:hostname).and_return(hostname)
124
+ allow(records).to receive(:hosts).and_return(new_hosts)
125
+ allow(records).to receive(:empty?).and_return(false)
126
+ allow(records).to receive(:min_ttl).and_return(nil)
127
+ end
128
+ end
129
+
130
+ let(:resolver) do
131
+ double('resolver').tap do |resolver|
132
+ allow(resolver).to receive(:get_records).and_return(new_records)
133
+ end
134
+ end
135
+
136
+ it 'adds the new host to the cluster' do
137
+ expect(cluster.addresses.map(&:to_s).sort).to eq(new_hosts.sort)
138
+ end
139
+ end
140
+
141
+ context 'when all DNS records are replaced with multiple records' do
142
+ let(:new_hosts) do
143
+ [
144
+ 'test1.test.build.10gen.cc.:27019',
145
+ 'test1.test.build.10gen.cc.:27020',
146
+ ]
147
+ end
148
+
149
+ let(:new_records) do
150
+ double('records').tap do |records|
151
+ allow(records).to receive(:hostname).and_return(hostname)
152
+ allow(records).to receive(:hosts).and_return(new_hosts)
153
+ allow(records).to receive(:empty?).and_return(false)
154
+ allow(records).to receive(:min_ttl).and_return(nil)
155
+ end
156
+ end
157
+
158
+ let(:resolver) do
159
+ double('resolver').tap do |resolver|
160
+ allow(resolver).to receive(:get_records).and_return(new_records)
161
+ end
162
+ end
163
+
164
+ it 'adds the new host to the cluster' do
165
+ expect(cluster.addresses.map(&:to_s).sort).to eq(new_hosts.sort)
166
+ end
167
+ end
168
+
169
+ context 'when the DNS lookup times out' do
170
+ let(:resolver) do
171
+ double('resolver').tap do |resolver|
172
+ allow(resolver).to receive(:get_records).and_raise(Resolv::ResolvTimeout)
173
+ end
174
+ end
175
+
176
+ it 'does not add or remove any hosts from the cluster' do
177
+ expect(cluster.addresses.map(&:to_s).sort).to eq(hosts.sort)
178
+ end
179
+ end
180
+
181
+ context 'when the DNS lookup is unable to resolve the hostname' do
182
+ let(:resolver) do
183
+ double('resolver').tap do |resolver|
184
+ allow(resolver).to receive(:get_records).and_raise(Resolv::ResolvError)
185
+ end
186
+ end
187
+
188
+ it 'does not add or remove any hosts from the cluster' do
189
+ expect(cluster.addresses.map(&:to_s).sort).to eq(hosts.sort)
190
+ end
191
+ end
192
+
193
+ context 'when no DNS records are returned' do
194
+ let(:new_records) do
195
+ double('records').tap do |records|
196
+ allow(records).to receive(:hostname).and_return(hostname)
197
+ allow(records).to receive(:hosts).and_return([])
198
+ allow(records).to receive(:empty?).and_return(true)
199
+ allow(records).to receive(:min_ttl).and_return(nil)
200
+ end
201
+ end
202
+
203
+ let(:resolver) do
204
+ double('resolver').tap do |resolver|
205
+ allow(resolver).to receive(:get_records).and_return(new_records)
206
+ end
207
+ end
208
+
209
+ it 'does not add or remove any hosts from the cluster' do
210
+ expect(cluster.addresses.map(&:to_s).sort).to eq(hosts.sort)
211
+ end
212
+ end
213
+ end
214
+ end