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 +4 -4
- checksums.yaml.gz.sig +0 -0
- data.tar.gz.sig +0 -0
- data/lib/mongo/address.rb +1 -1
- data/lib/mongo/database/view.rb +1 -1
- data/lib/mongo/operation/collections_info/command.rb +5 -0
- data/lib/mongo/operation/collections_info/result.rb +16 -1
- data/lib/mongo/version.rb +1 -1
- data/spec/integration/bson_symbol_spec.rb +4 -2
- data/spec/integration/sdam_error_handling_spec.rb +17 -0
- data/spec/integration/sdam_events_spec.rb +8 -5
- data/spec/lite_spec_helper.rb +1 -1
- data/spec/mongo/client_encryption_spec.rb +16 -10
- data/spec/mongo/crypt/data_key_context_spec.rb +1 -1
- data/spec/mongo/database_spec.rb +64 -0
- data/spec/mongo/server/app_metadata_shared.rb +1 -1
- data/spec/shared/LICENSE +20 -0
- data/spec/shared/lib/mrss/child_process_helper.rb +80 -0
- data/spec/shared/lib/mrss/constraints.rb +303 -0
- data/spec/shared/lib/mrss/lite_constraints.rb +175 -0
- data/spec/shared/lib/mrss/spec_organizer.rb +149 -0
- metadata +985 -975
- metadata.gz.sig +0 -0
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e1730c9274095cd8113fe9ac6d8f48b82ea3228aeb0b327988ab580105c745e3
|
4
|
+
data.tar.gz: d8a224877facc2e078dceb63c01eb9351f558ec9ea8a42b9264b909a77855d56
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 93e0f291aa4e52e81decda048473b8330eac80c17251cde83fb66592800d066d14010142893fabb00d896cdf409aa0bc7dd25feba3ca27b443d94cd44a6542e6
|
7
|
+
data.tar.gz: 6e19b5c2a3f846ae7ffb0feab92b92bbfb0d88d21536d8e66eaccfc63f3dc8236cf7672b6aa23e9d51696135138529819f7fd3fff122c4d1608f8bf6081086b8
|
checksums.yaml.gz.sig
CHANGED
Binary file
|
data.tar.gz.sig
CHANGED
Binary file
|
data/lib/mongo/address.rb
CHANGED
@@ -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})
|
289
|
+
raise Error::SocketError, "#{e.class}: #{e} (for #{self})"
|
290
290
|
end
|
291
291
|
end
|
292
292
|
end
|
data/lib/mongo/database/view.rb
CHANGED
@@ -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)
|
@@ -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
|
data/lib/mongo/version.rb
CHANGED
@@ -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
|
-
|
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
|
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
|
-
#
|
109
|
-
#
|
110
|
-
started_awaited.length.should
|
111
|
-
|
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
|
data/spec/lite_spec_helper.rb
CHANGED
@@ -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
|
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
|
-
|
283
|
-
|
284
|
-
|
285
|
-
|
286
|
-
|
287
|
-
|
288
|
-
|
289
|
-
|
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,
|
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: '
|
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
|
data/spec/mongo/database_spec.rb
CHANGED
@@ -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'
|
data/spec/shared/LICENSE
ADDED
@@ -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
|