mongo 2.13.1 → 2.13.2

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: cd4f9d74906d6f99fd038c0a3b4cfe0ee5cc3a7a4b327debf9c57649112b2cbb
4
- data.tar.gz: 052b3f3af1749d9f26d8e3655359650653b4bf71e9198a3d2116afde6d576eb3
3
+ metadata.gz: e1730c9274095cd8113fe9ac6d8f48b82ea3228aeb0b327988ab580105c745e3
4
+ data.tar.gz: d8a224877facc2e078dceb63c01eb9351f558ec9ea8a42b9264b909a77855d56
5
5
  SHA512:
6
- metadata.gz: c016d60512a77572e58ae6553dc9e61ecf6574abc724785858c43987aa84d7b79199589a9be7da702d6385d48f70f65fe135caa36176f9cf6fb638c3e156afc4
7
- data.tar.gz: a5c0dbab135a661a3cec5b0eab3300308693474d4c6662b0a18dd33b303f86753390eb0880232794a09ba511824f5d863f7bf428a8af1ca7b7b511458c078049
6
+ metadata.gz: 93e0f291aa4e52e81decda048473b8330eac80c17251cde83fb66592800d066d14010142893fabb00d896cdf409aa0bc7dd25feba3ca27b443d94cd44a6542e6
7
+ data.tar.gz: 6e19b5c2a3f846ae7ffb0feab92b92bbfb0d88d21536d8e66eaccfc63f3dc8236cf7672b6aa23e9d51696135138529819f7fd3fff122c4d1608f8bf6081086b8
Binary file
data.tar.gz.sig CHANGED
Binary file
@@ -286,7 +286,7 @@ module Mongo
286
286
  rescue IOError, SystemCallError => e
287
287
  raise Error::SocketError, "#{e.class}: #{e} (for #{self})"
288
288
  rescue OpenSSL::SSL::SSLError => e
289
- raise Error::SocketError, "#{e.class}: #{e} (for #{self}) (#{SSL_ERROR})"
289
+ raise Error::SocketError, "#{e.class}: #{e} (for #{self})"
290
290
  end
291
291
  end
292
292
  end
@@ -100,7 +100,7 @@ module Mongo
100
100
  #
101
101
  # @return [ Array<Hash> ] Info for each collection in the database.
102
102
  #
103
- # @since 2.0.5
103
+ # @since 2.0.5
104
104
  def list_collections(options = {})
105
105
  session = client.send(:get_session)
106
106
  collections_info(session, ServerSelector.primary, options)
@@ -27,6 +27,11 @@ module Mongo
27
27
 
28
28
  private
29
29
 
30
+ def get_result(connection, client, options = {})
31
+ # This is a Mongo::Operation::CollectionsInfo::Result
32
+ Result.new(*dispatch_message(connection, client), db_name)
33
+ end
34
+
30
35
  def selector(connection)
31
36
  {}
32
37
  end
@@ -22,6 +22,21 @@ module Mongo
22
22
  # @since 2.1.0
23
23
  class Result < Operation::Result
24
24
 
25
+ # Initialize a new result.
26
+ #
27
+ # @param [ Array<Protocol::Message> | nil ] replies The wire protocol replies, if any.
28
+ # @param [ Server::Description ] connection_description
29
+ # Server description of the server that performed the operation that
30
+ # this result is for.
31
+ # @param [ String ] database_name The name of the database that the
32
+ # query was sent to.
33
+ #
34
+ # @api private
35
+ def initialize(replies, connection_description, database_name)
36
+ super(replies, connection_description)
37
+ @database_name = database_name
38
+ end
39
+
25
40
  # Get the namespace for the cursor.
26
41
  #
27
42
  # @example Get the namespace.
@@ -31,7 +46,7 @@ module Mongo
31
46
  #
32
47
  # @since 2.1.0
33
48
  def namespace
34
- Database::NAMESPACES
49
+ "#{@database_name}.#{Database::NAMESPACES}"
35
50
  end
36
51
  end
37
52
  end
@@ -17,5 +17,5 @@ module Mongo
17
17
  # The current version of the driver.
18
18
  #
19
19
  # @since 2.0.0
20
- VERSION = '2.13.1'.freeze
20
+ VERSION = '2.13.2'.freeze
21
21
  end
@@ -25,8 +25,10 @@ describe 'Symbol encoding to BSON' do
25
25
  end
26
26
 
27
27
  it 'round-trips symbol values using the same byte buffer' do
28
- if BSON::Environment.jruby?
29
- pending 'https://jira.mongodb.org/browse/RUBY-2128'
28
+ if BSON::Environment.jruby? && (BSON::VERSION.split('.').map(&:to_i) <=> [4, 11, 0]) < 0
29
+ skip 'This test is only relevant to bson versions that increment ByteBuffer '\
30
+ 'read and write positions separately in JRuby, as implemented in ' \
31
+ 'bson version 4.11.0. For more information, see https://jira.mongodb.org/browse/RUBY-2128'
30
32
  end
31
33
 
32
34
  Hash.from_bson(hash.to_bson).should == hash
@@ -19,6 +19,7 @@ describe 'SDAM error handling' do
19
19
  new_local_client(SpecConfig.instance.addresses,
20
20
  SpecConfig.instance.all_test_options.merge(
21
21
  socket_timeout: 3, connect_timeout: 3,
22
+ heartbeat_frequency: 100,
22
23
  # Uncomment to print all events to stdout:
23
24
  #sdam_proc: Utils.subscribe_all_sdam_proc(diagnostic_subscriber),
24
25
  **Utils.disable_retries_client_options)
@@ -28,6 +29,14 @@ describe 'SDAM error handling' do
28
29
  let(:server) { client.cluster.next_primary }
29
30
 
30
31
  shared_examples_for 'marks server unknown' do
32
+ before do
33
+ server.monitor.stop!
34
+ end
35
+
36
+ after do
37
+ client.close
38
+ end
39
+
31
40
  it 'marks server unknown' do
32
41
  expect(server).not_to be_unknown
33
42
  RSpec::Mocks.with_temporary_scope do
@@ -38,6 +47,14 @@ describe 'SDAM error handling' do
38
47
  end
39
48
 
40
49
  shared_examples_for 'does not mark server unknown' do
50
+ before do
51
+ server.monitor.stop!
52
+ end
53
+
54
+ after do
55
+ client.close
56
+ end
57
+
41
58
  it 'does not mark server unknown' do
42
59
  expect(server).not_to be_unknown
43
60
  RSpec::Mocks.with_temporary_scope do
@@ -69,7 +69,8 @@ describe 'SDAM events' do
69
69
  succeeded_events = subscriber.select_succeeded_events(Mongo::Monitoring::Event::ServerHeartbeatSucceeded)
70
70
  # Since we gracefully close the client, we expect each heartbeat
71
71
  # to complete.
72
- started_events.length.should == succeeded_events.length
72
+ started_events.length.should > 1
73
+ (succeeded_events.length-1..succeeded_events.length).should include(started_events.length)
73
74
  end
74
75
  end
75
76
 
@@ -105,10 +106,12 @@ describe 'SDAM events' do
105
106
  (succeeded_awaited = events.select(&:awaited?)).should_not be_empty
106
107
  (succeeded_regular = events.reject(&:awaited?)).should_not be_empty
107
108
 
108
- # Since we gracefully close the client, we expect each heartbeat
109
- # to complete.
110
- started_awaited.length.should == succeeded_awaited.length
111
- started_regular.length.should == succeeded_regular.length
109
+ # There may be in-flight ismasters that don't complete, both
110
+ # regular and awaited.
111
+ started_awaited.length.should > 1
112
+ (succeeded_awaited.length-1..succeeded_awaited.length).should include(started_awaited.length)
113
+ started_regular.length.should > 1
114
+ (succeeded_regular.length-1..succeeded_regular.length).should include(started_regular.length)
112
115
  end
113
116
  end
114
117
  end
@@ -104,7 +104,7 @@ RSpec.configure do |config|
104
104
  end
105
105
  end
106
106
 
107
- if SpecConfig.instance.ci?
107
+ if SpecConfig.instance.ci? && !%w(1 true yes).include?(ENV['INTERACTIVE']&.downcase)
108
108
  # Allow a max of 30 seconds per test.
109
109
  # Tests should take under 10 seconds ideally but it seems
110
110
  # we have some that run for more than 10 seconds in CI.
@@ -268,7 +268,7 @@ describe Mongo::ClientEncryption do
268
268
  it_behaves_like 'it creates a data key'
269
269
  end
270
270
 
271
- context 'with invalid endpoint' do
271
+ context 'with https' do
272
272
  let(:options) do
273
273
  {
274
274
  master_key: {
@@ -279,20 +279,26 @@ describe Mongo::ClientEncryption do
279
279
  }
280
280
  end
281
281
 
282
- let(:expected_message) do
283
- # RUBY-2129: This error message could be more specific and inform the user
284
- # that there is a problem with their KMS endpoint
285
- if BSON::Environment.jruby?
286
- /getservbyname.* failed/
287
- else
288
- /SocketError/
289
- end
282
+ it_behaves_like 'it creates a data key'
283
+ end
284
+
285
+ context 'with invalid endpoint' do
286
+ let(:options) do
287
+ {
288
+ master_key: {
289
+ key: aws_arn,
290
+ region: aws_region,
291
+ endpoint: "invalid-nonsense-endpoint.com"
292
+ }
293
+ }
290
294
  end
291
295
 
292
296
  it 'raises an exception' do
297
+ # RUBY-2129: This error message could be more specific and inform the user
298
+ # that there is a problem with their KMS endpoint
293
299
  expect do
294
300
  data_key_id
295
- end.to raise_error(Mongo::Error::KmsError, expected_message)
301
+ end.to raise_error(Mongo::Error::KmsError, /SocketError/)
296
302
  end
297
303
  end
298
304
 
@@ -188,7 +188,7 @@ describe Mongo::Crypt::DataKeyContext do
188
188
  end
189
189
 
190
190
  context 'with valid endpoint' do
191
- let(:options) { { master_key: { region: 'us-east-2', key: 'arn', endpoint: 'endpoint/to/kms' } } }
191
+ let(:options) { { master_key: { region: 'us-east-2', key: 'arn', endpoint: 'kms.us-east-2.amazonaws.com:443' } } }
192
192
 
193
193
  it 'does not raise an exception' do
194
194
  expect do
@@ -2,6 +2,19 @@ require 'spec_helper'
2
2
 
3
3
  describe Mongo::Database do
4
4
 
5
+ shared_context 'more than 100 collections' do
6
+ let(:client) do
7
+ root_authorized_client.use('many-collections')
8
+ end
9
+
10
+ before do
11
+ 120.times do |i|
12
+ client["coll-#{i}"].drop
13
+ client["coll-#{i}"].create
14
+ end
15
+ end
16
+ end
17
+
5
18
  describe '#==' do
6
19
 
7
20
  let(:database) do
@@ -228,6 +241,20 @@ describe Mongo::Database do
228
241
  end
229
242
  end
230
243
  end
244
+
245
+ context 'when there are more than 100 collections' do
246
+ include_context 'more than 100 collections'
247
+
248
+ let(:collection_names) do
249
+ client.database.collection_names.sort
250
+ end
251
+
252
+ it 'lists all collections' do
253
+ collection_names.length.should == 120
254
+ collection_names.should include('coll-0')
255
+ collection_names.should include('coll-119')
256
+ end
257
+ end
231
258
  end
232
259
 
233
260
  describe '#list_collections' do
@@ -391,6 +418,25 @@ describe Mongo::Database do
391
418
  end
392
419
  end
393
420
  end
421
+
422
+ context 'when there are more than 100 collections' do
423
+ include_context 'more than 100 collections'
424
+
425
+ let(:collections) do
426
+ client.database.list_collections
427
+ end
428
+
429
+ let(:collection_names) do
430
+ # 2.6 server prefixes collection names with database name
431
+ collections.map { |info| info['name'].sub(/^many-collections\./, '') }.sort
432
+ end
433
+
434
+ it 'lists all collections' do
435
+ collections.length.should == 120
436
+ collection_names.should include('coll-0')
437
+ collection_names.should include('coll-119')
438
+ end
439
+ end
394
440
  end
395
441
 
396
442
  describe '#collections' do
@@ -541,6 +587,24 @@ describe Mongo::Database do
541
587
  end
542
588
  end
543
589
  end
590
+
591
+ context 'when there are more than 100 collections' do
592
+ include_context 'more than 100 collections'
593
+
594
+ let(:collections) do
595
+ client.database.collections
596
+ end
597
+
598
+ let(:collection_names) do
599
+ collections.map(&:name).sort
600
+ end
601
+
602
+ it 'lists all collections' do
603
+ collections.length.should == 120
604
+ collection_names.should include('coll-0')
605
+ collection_names.should include('coll-119')
606
+ end
607
+ end
544
608
  end
545
609
 
546
610
  describe '#command' do
@@ -10,7 +10,7 @@ shared_examples 'app metadata document' do
10
10
 
11
11
  it 'includes operating system information' do
12
12
  document[:client][:os][:type].should == 'linux'
13
- if BSON::Environment.jruby?
13
+ if BSON::Environment.jruby? || RUBY_VERSION >= '3.0'
14
14
  document[:client][:os][:name].should == 'linux'
15
15
  else
16
16
  document[:client][:os][:name].should == 'linux-gnu'
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2020 MongoDB, Inc.
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,80 @@
1
+ # frozen_string_literal: true
2
+ # encoding: utf-8
3
+
4
+ autoload :ChildProcess, 'childprocess'
5
+ autoload :Tempfile, 'tempfile'
6
+
7
+ module Mrss
8
+ module ChildProcessHelper
9
+ class SpawnError < StandardError; end
10
+
11
+ module_function def call(cmd, env: nil, cwd: nil)
12
+ process = ChildProcess.new(*cmd)
13
+ process.io.inherit!
14
+ if cwd
15
+ process.cwd = cwd
16
+ end
17
+ if env
18
+ env.each do |k, v|
19
+ process.environment[k.to_s] = v
20
+ end
21
+ end
22
+ process.start
23
+ process.wait
24
+ process
25
+ end
26
+
27
+ module_function def check_call(cmd, env: nil, cwd: nil)
28
+ process = call(cmd, env: env, cwd: cwd)
29
+ unless process.exit_code == 0
30
+ raise SpawnError, "Failed to execute: #{cmd}"
31
+ end
32
+ end
33
+
34
+ module_function def get_output(cmd, env: nil, cwd: nil)
35
+ process = ChildProcess.new(*cmd)
36
+ process.io.inherit!
37
+ if cwd
38
+ process.cwd = cwd
39
+ end
40
+ if env
41
+ env.each do |k, v|
42
+ process.environment[k.to_s] = v
43
+ end
44
+ end
45
+
46
+ output = ''
47
+ r, w = IO.pipe
48
+
49
+ begin
50
+ process.io.stdout = w
51
+ process.start
52
+ w.close
53
+
54
+ thread = Thread.new do
55
+ begin
56
+ loop do
57
+ output << r.readpartial(16384)
58
+ end
59
+ rescue EOFError
60
+ end
61
+ end
62
+
63
+ process.wait
64
+ thread.join
65
+ ensure
66
+ r.close
67
+ end
68
+
69
+ [process, output]
70
+ end
71
+
72
+ module_function def check_output(*args)
73
+ process, output = get_output(*args)
74
+ unless process.exit_code == 0
75
+ raise SpawnError,"Failed to execute: #{args}"
76
+ end
77
+ output
78
+ end
79
+ end
80
+ end
@@ -0,0 +1,303 @@
1
+ # frozen_string_literal: true
2
+ # encoding: utf-8
3
+
4
+ module Mrss
5
+ module Constraints
6
+ def min_server_version(version)
7
+ unless version =~ /\A\d+\.\d+\z/
8
+ raise ArgumentError, "Version can only be major.minor: #{version}"
9
+ end
10
+
11
+ before(:all) do
12
+ if version > ClusterConfig.instance.server_version
13
+ skip "Server version #{version} or higher required, we have #{ClusterConfig.instance.server_version}"
14
+ end
15
+ end
16
+ end
17
+
18
+ def max_server_version(version)
19
+ unless version =~ /\A\d+\.\d+\z/
20
+ raise ArgumentError, "Version can only be major.minor: #{version}"
21
+ end
22
+
23
+ before(:all) do
24
+ if version < ClusterConfig.instance.short_server_version
25
+ skip "Server version #{version} or lower required, we have #{ClusterConfig.instance.server_version}"
26
+ end
27
+ end
28
+ end
29
+
30
+ def min_server_fcv(version)
31
+ unless version =~ /\A\d+\.\d+\z/
32
+ raise ArgumentError, "FCV can only be major.minor: #{version}"
33
+ end
34
+
35
+ before(:all) do
36
+ unless ClusterConfig.instance.fcv_ish >= version
37
+ skip "FCV #{version} or higher required, we have #{ClusterConfig.instance.fcv_ish} (server #{ClusterConfig.instance.server_version})"
38
+ end
39
+ end
40
+ end
41
+
42
+ def max_server_fcv(version)
43
+ unless version =~ /\A\d+\.\d+\z/
44
+ raise ArgumentError, "Version can only be major.minor: #{version}"
45
+ end
46
+
47
+ before(:all) do
48
+ if version < ClusterConfig.instance.fcv_ish
49
+ skip "FCV #{version} or lower required, we have #{ClusterConfig.instance.fcv_ish} (server #{ClusterConfig.instance.server_version})"
50
+ end
51
+ end
52
+ end
53
+
54
+ def require_topology(*topologies)
55
+ invalid_topologies = topologies - [:single, :replica_set, :sharded]
56
+
57
+ unless invalid_topologies.empty?
58
+ raise ArgumentError, "Invalid topologies requested: #{invalid_topologies.join(', ')}"
59
+ end
60
+
61
+ before(:all) do
62
+ unless topologies.include?(topology = ClusterConfig.instance.topology)
63
+ skip "Topology #{topologies.join(' or ')} required, we have #{topology}"
64
+ end
65
+ end
66
+ end
67
+
68
+ def max_example_run_time(timeout)
69
+ around do |example|
70
+ TimeoutInterrupt.timeout(timeout, TimeoutInterrupt::Error.new("Test execution terminated after #{timeout} seconds")) do
71
+ example.run
72
+ end
73
+ end
74
+ end
75
+
76
+ def require_transaction_support
77
+ before(:all) do
78
+ case ClusterConfig.instance.topology
79
+ when :single
80
+ skip 'Transactions tests require a replica set (4.0+) or a sharded cluster (4.2+)'
81
+ when :replica_set
82
+ unless ClusterConfig.instance.server_version >= '4.0'
83
+ skip 'Transactions tests in a replica set topology require server 4.0+'
84
+ end
85
+ when :sharded
86
+ unless ClusterConfig.instance.server_version >= '4.2'
87
+ skip 'Transactions tests in a sharded cluster topology require server 4.2+'
88
+ end
89
+ else
90
+ raise NotImplementedError
91
+ end
92
+ end
93
+ end
94
+
95
+ # Fail command fail point was added to mongod in 4.0 and to mongos in 4.2.
96
+ def require_fail_command
97
+ require_transaction_support
98
+ end
99
+
100
+ def require_tls
101
+ before(:all) do
102
+ unless SpecConfig.instance.ssl?
103
+ skip "SSL not enabled"
104
+ end
105
+ end
106
+ end
107
+
108
+ def require_no_tls
109
+ before(:all) do
110
+ if SpecConfig.instance.ssl?
111
+ skip "SSL enabled"
112
+ end
113
+ end
114
+ end
115
+
116
+ def require_no_retry_writes
117
+ before(:all) do
118
+ if SpecConfig.instance.retry_writes?
119
+ skip "Retry writes is enabled"
120
+ end
121
+ end
122
+ end
123
+
124
+ def require_compression
125
+ before(:all) do
126
+ if SpecConfig.instance.compressors.nil?
127
+ skip "Compression is not enabled"
128
+ end
129
+ end
130
+ end
131
+
132
+ def require_zlib_compression
133
+ before(:all) do
134
+ compressors = SpecConfig.instance.compressors
135
+ unless compressors && compressors.include?('zlib')
136
+ skip "Zlib compression is not enabled"
137
+ end
138
+ end
139
+ end
140
+
141
+ def require_snappy_compression
142
+ before(:all) do
143
+ compressors = SpecConfig.instance.compressors
144
+ unless compressors && compressors.include?('snappy')
145
+ skip "Snappy compression is not enabled"
146
+ end
147
+ end
148
+ end
149
+
150
+ def require_no_compression
151
+ before(:all) do
152
+ if SpecConfig.instance.compressors
153
+ skip "Compression is enabled"
154
+ end
155
+ end
156
+ end
157
+
158
+ def ruby_version_gte(version)
159
+ before(:all) do
160
+ if RUBY_VERSION < version
161
+ skip "Ruby version #{version} or higher required"
162
+ end
163
+ end
164
+ end
165
+
166
+ def ruby_version_lt(version)
167
+ before(:all) do
168
+ if RUBY_VERSION >= version
169
+ skip "Ruby version less than #{version} required"
170
+ end
171
+ end
172
+ end
173
+
174
+ def require_auth(*values)
175
+ before(:all) do
176
+ if values.any?
177
+ unless values.include?(ENV['AUTH'])
178
+ msg = values.map { |v| "AUTH=#{v}" }.join(' or ')
179
+ skip "This test requires #{msg}"
180
+ end
181
+ else
182
+ unless ENV['AUTH'] == 'auth' || SpecConfig.instance.user || ClusterConfig.instance.auth_enabled?
183
+ skip "Auth required"
184
+ end
185
+ end
186
+ end
187
+ end
188
+
189
+ def require_no_auth
190
+ before(:all) do
191
+ if (ENV['AUTH'] && ENV['AUTH'] != 'noauth') || SpecConfig.instance.user || ClusterConfig.instance.auth_enabled?
192
+ skip "Auth not allowed"
193
+ end
194
+ end
195
+ end
196
+
197
+ def require_x509_auth
198
+ before(:all) do
199
+ unless SpecConfig.instance.x509_auth?
200
+ skip "X.509 auth required"
201
+ end
202
+ end
203
+ end
204
+
205
+ def require_no_external_user
206
+ before(:all) do
207
+ if SpecConfig.instance.external_user?
208
+ skip "External user configurations are not compatible with this test"
209
+ end
210
+ end
211
+ end
212
+
213
+ # Can the driver specify a write concern that won't be overridden?
214
+ # (mongos 4.0+ overrides the write concern)
215
+ def require_set_write_concern
216
+ before(:all) do
217
+ if ClusterConfig.instance.topology == :sharded && ClusterConfig.instance.short_server_version >= '4.0'
218
+ skip "mongos 4.0+ overrides write concern"
219
+ end
220
+ end
221
+ end
222
+
223
+ def require_multi_shard
224
+ before(:all) do
225
+ if ClusterConfig.instance.topology == :sharded && SpecConfig.instance.addresses.length == 1
226
+ skip 'Test requires a minimum of two shards if run in sharded topology'
227
+ end
228
+ end
229
+ end
230
+
231
+ def require_no_multi_shard
232
+ before(:all) do
233
+ if ClusterConfig.instance.topology == :sharded && SpecConfig.instance.addresses.length > 1
234
+ skip 'Test requires a single shard if run in sharded topology'
235
+ end
236
+ end
237
+ end
238
+
239
+ def require_wired_tiger
240
+ before(:all) do
241
+ if ClusterConfig.instance.storage_engine != :wired_tiger
242
+ skip 'Test requires WiredTiger storage engine'
243
+ end
244
+ end
245
+ end
246
+
247
+ def require_wired_tiger_on_36
248
+ before(:all) do
249
+ if ClusterConfig.instance.short_server_version >= '3.6'
250
+ if ClusterConfig.instance.storage_engine != :wired_tiger
251
+ skip 'Test requires WiredTiger storage engine on 3.6+ servers'
252
+ end
253
+ end
254
+ end
255
+ end
256
+
257
+ def require_mmapv1
258
+ before(:all) do
259
+ if ClusterConfig.instance.storage_engine != :mmapv1
260
+ skip 'Test requires MMAPv1 storage engine'
261
+ end
262
+ end
263
+ end
264
+
265
+ def require_enterprise
266
+ before(:all) do
267
+ unless ClusterConfig.instance.enterprise?
268
+ skip 'Test requires enterprise build of MongoDB'
269
+ end
270
+ end
271
+ end
272
+
273
+ # Integration tests for SRV polling require internet connectivity to
274
+ # look up SRV records and a sharded cluster configured on default port on
275
+ # localhost (localhost:27017, localhost:27018).
276
+ def require_default_port_deployment
277
+ # Because the DNS records at test1.test.build.10gen.cc point to
278
+ # localhost:27017 & localhost:27018, the test suite must have been
279
+ # configured to use these addresses
280
+ before(:all) do
281
+ have_default_port = SpecConfig.instance.addresses.any? do |address|
282
+ %w(127.0.0.1 127.0.0.1:27017 localhost localhost:27017).include?(address)
283
+ end
284
+ unless have_default_port
285
+ skip 'This test requires the test suite to be configured for localhost:27017'
286
+ end
287
+ end
288
+ end
289
+
290
+ # Some tests perform assertions on what the driver is logging.
291
+ # Some test configurations, for example OCSP with unknown response,
292
+ # produce warnings due to optional checks failing.
293
+ # This constraint skips tests that issue logging assertions on configurations
294
+ # that may produce non-test-originated log entries.
295
+ def require_warning_clean
296
+ before(:all) do
297
+ if ENV['OCSP_STATUS'] == 'unknown'
298
+ skip 'Unknown OCSP status is not global warning-clean'
299
+ end
300
+ end
301
+ end
302
+ end
303
+ end