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
@@ -9,6 +9,7 @@ describe 'Step down behavior' do
9
9
  before(:all) do
10
10
  # These before/after blocks are run even if the tests themselves are
11
11
  # skipped due to server version not being appropriate
12
+ ClientRegistry.instance.close_all_clients
12
13
  if ClusterConfig.instance.fcv_ish >= '4.2' && ClusterConfig.instance.topology == :replica_set
13
14
  # It seems that a short election timeout can cause unintended elections,
14
15
  # which makes the server close connections which causes the driver to
@@ -160,8 +161,7 @@ describe 'Step down behavior' do
160
161
  collection.insert_one(test: 1)
161
162
  end.to raise_error(Mongo::Error::OperationFailure, /10107/)
162
163
 
163
- # Temporarily add 1 due to RUBY-1894 backport
164
- expect(event_subscriber.select_published_events(Mongo::Monitoring::Event::Cmap::PoolCleared).count).to eq(0+1)
164
+ expect(event_subscriber.select_published_events(Mongo::Monitoring::Event::Cmap::PoolCleared).count).to eq(0)
165
165
  end
166
166
  end
167
167
 
@@ -180,8 +180,7 @@ describe 'Step down behavior' do
180
180
  collection.insert_one(test: 1)
181
181
  end.to raise_error(Mongo::Error::OperationFailure, /10107/)
182
182
 
183
- # Temporarily add 1 due to RUBY-1894 backport
184
- expect(event_subscriber.select_published_events(Mongo::Monitoring::Event::Cmap::PoolCleared).count).to eq(1+1)
183
+ expect(event_subscriber.select_published_events(Mongo::Monitoring::Event::Cmap::PoolCleared).count).to eq(1)
185
184
  end
186
185
  end
187
186
 
@@ -198,8 +197,7 @@ describe 'Step down behavior' do
198
197
  collection.insert_one(test: 1)
199
198
  end.to raise_error(Mongo::Error::OperationFailure, /11600/)
200
199
 
201
- # Temporarily add 1 due to RUBY-1894 backport
202
- expect(event_subscriber.select_published_events(Mongo::Monitoring::Event::Cmap::PoolCleared).count).to eq(1+1)
200
+ expect(event_subscriber.select_published_events(Mongo::Monitoring::Event::Cmap::PoolCleared).count).to eq(1)
203
201
  end
204
202
  end
205
203
  end
@@ -19,10 +19,13 @@ TRANSACTIONS_TESTS = Dir.glob("#{CURRENT_PATH}/spec_tests/data/transactions/*.ym
19
19
  TRANSACTIONS_API_TESTS = Dir.glob("#{CURRENT_PATH}/spec_tests/data/transactions_api/*.yml").sort
20
20
  CHANGE_STREAMS_TESTS = Dir.glob("#{CURRENT_PATH}/spec_tests/data/change_streams/*.yml").sort
21
21
  CMAP_TESTS = Dir.glob("#{CURRENT_PATH}/spec_tests/data/cmap/*.yml").sort
22
+ AUTH_TESTS = Dir.glob("#{CURRENT_PATH}/spec_tests/data/auth/*.yml").sort
22
23
 
23
24
  require 'mongo'
24
25
  require 'pp'
25
26
 
27
+ autoload :Benchmark, 'benchmark'
28
+
26
29
  unless ENV['CI']
27
30
  begin
28
31
  require 'byebug'
@@ -37,6 +40,13 @@ unless ENV['CI']
37
40
  end
38
41
  end
39
42
 
43
+ if BSON::Environment.jruby?
44
+ require 'concurrent-ruby'
45
+ PossiblyConcurrentArray = Concurrent::Array
46
+ else
47
+ PossiblyConcurrentArray = Array
48
+ end
49
+
40
50
  require 'support/spec_config'
41
51
 
42
52
  Mongo::Logger.logger = Logger.new($stdout)
@@ -68,6 +78,8 @@ require 'support/client_registry_macros'
68
78
  require 'support/json_ext_formatter'
69
79
  require 'support/sdam_formatter_integration'
70
80
  require 'support/utils'
81
+ require 'support/background_thread_registry'
82
+ require 'support/auth'
71
83
 
72
84
  if SpecConfig.instance.mri?
73
85
  require 'timeout_interrupt'
@@ -106,6 +118,16 @@ RSpec.configure do |config|
106
118
  end
107
119
  end
108
120
  end
121
+
122
+ if SpecConfig.instance.ci?
123
+ unless BSON::Environment.jruby?
124
+ Rfc::Rif.output_object_space_stats = true
125
+ end
126
+ end
127
+
128
+ config.expect_with :rspec do |c|
129
+ c.max_formatted_output_length = 10000
130
+ end
109
131
  end
110
132
 
111
133
  EventSubscriber.initialize
@@ -0,0 +1,51 @@
1
+ require 'lite_spec_helper'
2
+
3
+ class ValidatorHost
4
+ include Mongo::Address::Validator
5
+ end
6
+
7
+ describe Mongo::Address::Validator do
8
+ let(:host) { ValidatorHost.new }
9
+
10
+ describe '#validate_address_str!' do
11
+ shared_examples_for 'raises InvalidAddress' do
12
+ it 'raises InvalidAddress' do
13
+ expect do
14
+ host.validate_address_str!(address_str)
15
+ end.to raise_error(Mongo::Error::InvalidAddress)
16
+ end
17
+ end
18
+
19
+ shared_examples_for 'passes validation' do
20
+ it 'passes validation' do
21
+ expect do
22
+ host.validate_address_str!(address_str)
23
+ end.not_to raise_error
24
+ end
25
+ end
26
+
27
+ context 'leading dots' do
28
+ let(:address_str) { '.foo.bar.com' }
29
+
30
+ it_behaves_like 'raises InvalidAddress'
31
+ end
32
+
33
+ context 'trailing dots' do
34
+ let(:address_str) { 'foo.bar.com.' }
35
+
36
+ it_behaves_like 'raises InvalidAddress'
37
+ end
38
+
39
+ context 'runs of multiple dots' do
40
+ let(:address_str) { 'foo..bar.com' }
41
+
42
+ it_behaves_like 'raises InvalidAddress'
43
+ end
44
+
45
+ context 'no dots' do
46
+ let(:address_str) { 'foo' }
47
+
48
+ it_behaves_like 'passes validation'
49
+ end
50
+ end
51
+ end
@@ -2,36 +2,8 @@ require 'spec_helper'
2
2
 
3
3
  describe Mongo::Auth::CR do
4
4
 
5
- let(:address) do
6
- default_address
7
- end
8
-
9
- let(:monitoring) do
10
- Mongo::Monitoring.new(monitoring: false)
11
- end
12
-
13
- let(:listeners) do
14
- Mongo::Event::Listeners.new
15
- end
16
-
17
- let(:cluster) do
18
- double('cluster').tap do |cl|
19
- allow(cl).to receive(:topology).and_return(topology)
20
- allow(cl).to receive(:app_metadata).and_return(app_metadata)
21
- allow(cl).to receive(:options).and_return({})
22
- allow(cl).to receive(:cluster_time).and_return(nil)
23
- allow(cl).to receive(:update_cluster_time)
24
- end
25
- end
26
-
27
- declare_topology_double
28
-
29
5
  let(:server) do
30
- Mongo::Server.new(address, cluster, monitoring, listeners,
31
- SpecConfig.instance.test_options
32
- ).tap do |server|
33
- server.scan!
34
- end
6
+ authorized_client.cluster.next_primary
35
7
  end
36
8
 
37
9
  let(:connection) do
@@ -2,36 +2,8 @@ require 'spec_helper'
2
2
 
3
3
  describe Mongo::Auth::LDAP do
4
4
 
5
- let(:address) do
6
- default_address
7
- end
8
-
9
- let(:monitoring) do
10
- Mongo::Monitoring.new(monitoring: false)
11
- end
12
-
13
- let(:listeners) do
14
- Mongo::Event::Listeners.new
15
- end
16
-
17
- let(:cluster) do
18
- double('cluster').tap do |cl|
19
- allow(cl).to receive(:topology).and_return(topology)
20
- allow(cl).to receive(:app_metadata).and_return(app_metadata)
21
- allow(cl).to receive(:options).and_return({})
22
- allow(cl).to receive(:cluster_time).and_return(nil)
23
- allow(cl).to receive(:update_cluster_time)
24
- end
25
- end
26
-
27
- declare_topology_double
28
-
29
5
  let(:server) do
30
- Mongo::Server.new(address, cluster, monitoring, listeners,
31
- SpecConfig.instance.test_options
32
- ).tap do |server|
33
- server.scan!
34
- end
6
+ authorized_client.cluster.next_primary
35
7
  end
36
8
 
37
9
  let(:connection) do
@@ -57,7 +57,6 @@ describe Mongo::Auth::SCRAM::Conversation, retry: 3 do
57
57
  end
58
58
 
59
59
  describe '#continue' do
60
- fails_on_jruby
61
60
 
62
61
  let(:reply) do
63
62
  Mongo::Protocol::Message.new
@@ -125,7 +124,6 @@ describe Mongo::Auth::SCRAM::Conversation, retry: 3 do
125
124
  end
126
125
 
127
126
  describe '#finalize' do
128
- fails_on_jruby
129
127
 
130
128
  let(:continue_reply) do
131
129
  Mongo::Protocol::Message.new
@@ -27,7 +27,7 @@ describe 'SCRAM-SHA auth mechanism negotiation' do
27
27
  roles: ['root'],
28
28
  mechanisms: server_user_auth_mechanisms,
29
29
  )
30
- client.close(true)
30
+ client.close
31
31
  end
32
32
  end
33
33
 
@@ -2,36 +2,8 @@ require 'spec_helper'
2
2
 
3
3
  describe Mongo::Auth::SCRAM do
4
4
 
5
- let(:address) do
6
- default_address
7
- end
8
-
9
- let(:monitoring) do
10
- Mongo::Monitoring.new(monitoring: false)
11
- end
12
-
13
- let(:listeners) do
14
- Mongo::Event::Listeners.new
15
- end
16
-
17
- let(:cluster) do
18
- double('cluster').tap do |cl|
19
- allow(cl).to receive(:topology).and_return(topology)
20
- allow(cl).to receive(:app_metadata).and_return(app_metadata)
21
- allow(cl).to receive(:options).and_return({})
22
- allow(cl).to receive(:cluster_time).and_return(nil)
23
- allow(cl).to receive(:update_cluster_time)
24
- end
25
- end
26
-
27
- declare_topology_double
28
-
29
5
  let(:server) do
30
- Mongo::Server.new(address, cluster, monitoring, listeners,
31
- SpecConfig.instance.test_options
32
- ).tap do |server|
33
- server.scan!
34
- end
6
+ authorized_client.cluster.next_primary
35
7
  end
36
8
 
37
9
  let(:connection) do
@@ -2,10 +2,8 @@ require 'spec_helper'
2
2
 
3
3
  describe Mongo::Auth::User::View do
4
4
 
5
- let(:database) { root_authorized_client.database }
6
-
7
5
  let(:view) do
8
- described_class.new(database)
6
+ described_class.new(root_authorized_client.database)
9
7
  end
10
8
 
11
9
  before do
@@ -14,39 +12,6 @@ describe Mongo::Auth::User::View do
14
12
 
15
13
  describe '#create' do
16
14
 
17
- context 'when password is not provided' do
18
-
19
- let(:database) { root_authorized_client.use('$external').database }
20
-
21
- let(:username) { 'passwordless-user' }
22
-
23
- let(:response) do
24
- view.create(
25
- username,
26
- # https://stackoverflow.com/questions/55939832/mongodb-external-database-cannot-create-new-user-with-user-defined-role
27
- roles: [{role: 'read', db: 'admin'}],
28
- )
29
- end
30
-
31
- before do
32
- begin
33
- view.remove(username)
34
- rescue Mongo::Error::OperationFailure
35
- # can be user not found, ignore
36
- end
37
- end
38
-
39
- it 'creates the user' do
40
- view.info(username).should == []
41
-
42
- lambda do
43
- response
44
- end.should_not raise_error
45
-
46
- view.info(username).first['user'].should == username
47
- end
48
- end
49
-
50
15
  context 'when a session is not used' do
51
16
 
52
17
  let!(:response) do
@@ -284,16 +284,4 @@ describe Mongo::Auth::User do
284
284
  end
285
285
  end
286
286
  end
287
-
288
- describe '#spec' do
289
- context 'when no password and no roles are set' do
290
- let(:user) do
291
- described_class.new(user: 'foo')
292
- end
293
-
294
- it 'is a hash with empty roles' do
295
- user.spec.should == {roles: []}
296
- end
297
- end
298
- end
299
287
  end
@@ -2,36 +2,8 @@ require 'spec_helper'
2
2
 
3
3
  describe Mongo::Auth::X509 do
4
4
 
5
- let(:address) do
6
- default_address
7
- end
8
-
9
- let(:monitoring) do
10
- Mongo::Monitoring.new(monitoring: false)
11
- end
12
-
13
- let(:listeners) do
14
- Mongo::Event::Listeners.new
15
- end
16
-
17
- let(:cluster) do
18
- double('cluster').tap do |cl|
19
- allow(cl).to receive(:topology).and_return(topology)
20
- allow(cl).to receive(:app_metadata).and_return(app_metadata)
21
- allow(cl).to receive(:options).and_return({})
22
- allow(cl).to receive(:cluster_time).and_return(nil)
23
- allow(cl).to receive(:update_cluster_time)
24
- end
25
- end
26
-
27
- declare_topology_double
28
-
29
5
  let(:server) do
30
- Mongo::Server.new(address, cluster, monitoring, listeners,
31
- SpecConfig.instance.test_options
32
- ).tap do |server|
33
- server.scan!
34
- end
6
+ authorized_client.cluster.next_primary
35
7
  end
36
8
 
37
9
  let(:connection) do
@@ -1924,11 +1924,11 @@ describe Mongo::BulkWrite do
1924
1924
  end
1925
1925
 
1926
1926
  let(:first_txn_number) do
1927
- Utils.int64_value(started_events[-2].command['txnNumber'])
1927
+ started_events[-2].command['txnNumber'].instance_variable_get(:@integer)
1928
1928
  end
1929
1929
 
1930
1930
  let(:second_txn_number) do
1931
- Utils.int64_value(started_events[-1].command['txnNumber'])
1931
+ started_events[-1].command['txnNumber'].instance_variable_get(:@integer)
1932
1932
  end
1933
1933
 
1934
1934
  it 'inserts the documents' do
@@ -1,9 +1,7 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe Mongo::Client do
4
- before do
5
- ClientRegistry.instance.close_all_clients
6
- end
4
+ clean_slate
7
5
 
8
6
  describe '.new' do
9
7
  describe 'options' do
@@ -87,10 +85,9 @@ describe Mongo::Client do
87
85
  # https://github.com/rspec/rspec-mocks/issues/1242.
88
86
  #expect_any_instance_of(Mongo::Server::Monitor).to receive(:scan!).
89
87
  # exactly(SpecConfig.instance.addresses.length).times.and_call_original
90
- c = ClientRegistry.instance.new_local_client(
88
+ c = new_local_client(
91
89
  SpecConfig.instance.addresses, SpecConfig.instance.test_options)
92
90
  expect(c.cluster.servers).not_to be_empty
93
- c.close
94
91
  end
95
92
 
96
93
  # This checks the case of all initial seeds being removed from
@@ -120,19 +117,57 @@ describe Mongo::Client do
120
117
  end
121
118
  end
122
119
 
120
+ let(:logger) do
121
+ Logger.new(STDOUT, level: Logger::DEBUG)
122
+ end
123
+
124
+ let(:subscriber) do
125
+ Mongo::Monitoring::UnifiedSdamLogSubscriber.new(
126
+ logger: logger,
127
+ log_prefix: 'CCS-SDAM',
128
+ )
129
+ end
130
+
123
131
  let(:client) do
124
132
  ClientRegistry.instance.new_local_client(
125
133
  [address],
126
134
  # Specify server selection timeout here because test suite sets
127
135
  # one by default and it's fairly low
128
- SpecConfig.instance.test_options.merge(server_selection_timeout: 5))
136
+ SpecConfig.instance.test_options.merge(
137
+ connect_timeout: 1,
138
+ socket_timeout: 1,
139
+ server_selection_timeout: 8,
140
+ logger: logger,
141
+ log_prefix: 'CCS-CLIENT',
142
+ sdam_proc: lambda do |client|
143
+ subscriber.subscribe(client)
144
+ end
145
+ ))
129
146
  end
130
147
 
131
148
  it 'does not wait for server selection timeout' do
132
- start_time = Time.now
133
- client
134
- time_taken = Time.now - start_time
135
- expect(time_taken < 3).to be true
149
+ time_taken = Benchmark.realtime do
150
+ # Client is created here.
151
+ client
152
+ end
153
+ puts "client_construction_spec.rb: Cluster is: #{client.cluster.summary}"
154
+
155
+ # Because the first round of sdam waits for server statuses to change
156
+ # rather than for server selection semaphore on the cluster which
157
+ # is signaled after topology is updated, the topology here could be
158
+ # old (i.e. a monitor thread was just about to update the topology
159
+ # but hasn't quite gotten to it. Add a small delay to compensate.
160
+ # This issue doesn't apply to real applications which will wait for
161
+ # server selection semaphore.
162
+ sleep 0.1
163
+
164
+ actual_class = client.cluster.topology.class
165
+ expect([
166
+ Mongo::Cluster::Topology::ReplicaSetWithPrimary,
167
+ Mongo::Cluster::Topology::Single,
168
+ Mongo::Cluster::Topology::Sharded,
169
+ ]).to include(actual_class)
170
+ expect(time_taken).to be < 5
136
171
 
137
172
  # run a command to ensure the client is a working one
138
173
  client.database.command(ismaster: 1)
@@ -197,7 +232,8 @@ describe Mongo::Client do
197
232
  context 'when compressors are provided' do
198
233
 
199
234
  let(:client) do
200
- new_local_client(SpecConfig.instance.addresses, authorized_client.options.merge(options))
235
+ new_local_client(SpecConfig.instance.addresses,
236
+ SpecConfig.instance.all_test_options.merge(options))
201
237
  end
202
238
 
203
239
  context 'when the compressor is supported' do
@@ -1323,7 +1359,10 @@ describe Mongo::Client do
1323
1359
 
1324
1360
  context 'when new client has a new cluster' do
1325
1361
  let(:client) do
1326
- new_local_client(['127.0.0.1:27017'], :database => SpecConfig.instance.test_db)
1362
+ new_local_client(['127.0.0.1:27017'],
1363
+ database: SpecConfig.instance.test_db,
1364
+ server_selection_timeout: 0.5,
1365
+ socket_timeout: 0.1, connect_timeout: 0.1)
1327
1366
  end
1328
1367
  let(:new_client) do
1329
1368
  client.with(app_name: 'client_construction_spec').tap do |new_client|
@@ -1359,12 +1398,14 @@ describe Mongo::Client do
1359
1398
  let(:new_client) { client.with(database: 'foo') }
1360
1399
 
1361
1400
  it 'does not copy sdam_proc option to new client' do
1362
- client = new_local_client(['a'], sdam_proc: sdam_proc)
1401
+ client = new_local_client_nmio(['a'], sdam_proc: sdam_proc)
1363
1402
  expect(new_client.options[:sdam_proc]).to be nil
1364
1403
  end
1365
1404
 
1366
1405
  it 'does not notify subscribers set up by sdam_proc' do
1367
- client = new_local_client(['a'], sdam_proc: sdam_proc)
1406
+ client = new_local_client(['a'], sdam_proc: sdam_proc,
1407
+ connect_timeout: 0.1, socket_timeout: 0.1,
1408
+ server_selection_timeout: 0.1)
1368
1409
  expect(subscriber.started_events.length).to be > 0
1369
1410
  subscriber.started_events.clear
1370
1411
 
@@ -1380,7 +1421,7 @@ describe Mongo::Client do
1380
1421
  describe '#dup' do
1381
1422
 
1382
1423
  let(:client) do
1383
- new_local_client(
1424
+ new_local_client_nmio(
1384
1425
  ['127.0.0.1:27017'],
1385
1426
  :read => { :mode => :primary },
1386
1427
  :database => SpecConfig.instance.test_db