mongo 2.10.5 → 2.11.0.rc0

Sign up to get free protection for your applications and to get access to all the features.
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