mongo 2.13.1 → 2.13.2

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