mongo 2.14.0.rc1 → 2.14.0
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 +1 -1
- data/Rakefile +39 -4
- data/lib/mongo/address.rb +1 -1
- data/lib/mongo/collection.rb +5 -0
- data/lib/mongo/collection/view/readable.rb +4 -0
- data/lib/mongo/cursor.rb +15 -3
- 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/operation/find/result.rb +10 -0
- data/lib/mongo/server/description.rb +8 -1
- data/lib/mongo/session.rb +2 -1
- data/lib/mongo/version.rb +1 -1
- data/spec/README.md +7 -0
- data/spec/integration/bson_symbol_spec.rb +4 -2
- data/spec/integration/change_stream_spec.rb +1 -1
- data/spec/integration/connection_pool_populator_spec.rb +1 -1
- data/spec/integration/cursor_reaping_spec.rb +1 -1
- data/spec/integration/fork_reconnect_spec.rb +56 -1
- data/spec/integration/query_cache_transactions_spec.rb +29 -18
- data/spec/integration/sdam_error_handling_spec.rb +17 -0
- data/spec/integration/sdam_events_spec.rb +8 -5
- data/spec/integration/transactions_examples_spec.rb +17 -7
- data/spec/lite_spec_helper.rb +5 -3
- data/spec/mongo/auth/user_spec.rb +1 -1
- data/spec/mongo/bulk_write_spec.rb +2 -2
- data/spec/mongo/client_construction_spec.rb +3 -3
- data/spec/mongo/client_encryption_spec.rb +16 -10
- data/spec/mongo/client_spec.rb +7 -0
- data/spec/mongo/cluster/topology/replica_set_spec.rb +1 -1
- data/spec/mongo/cluster/topology/sharded_spec.rb +1 -1
- data/spec/mongo/cluster/topology/single_spec.rb +1 -1
- data/spec/mongo/cluster/topology/unknown_spec.rb +1 -1
- data/spec/mongo/cluster/topology_spec.rb +1 -1
- data/spec/mongo/collection/view/change_stream_resume_spec.rb +1 -1
- data/spec/mongo/collection/view/readable_spec.rb +36 -0
- data/spec/mongo/collection_spec.rb +12 -0
- data/spec/mongo/crypt/binary_spec.rb +1 -6
- data/spec/mongo/crypt/binding/binary_spec.rb +1 -6
- data/spec/mongo/crypt/binding/context_spec.rb +2 -7
- data/spec/mongo/crypt/binding/helpers_spec.rb +1 -6
- data/spec/mongo/crypt/binding/mongocrypt_spec.rb +2 -7
- data/spec/mongo/crypt/binding/status_spec.rb +1 -6
- data/spec/mongo/crypt/binding/version_spec.rb +1 -6
- data/spec/mongo/crypt/data_key_context_spec.rb +1 -1
- data/spec/mongo/crypt/status_spec.rb +1 -6
- data/spec/mongo/database_spec.rb +64 -0
- data/spec/mongo/monitoring/event/server_closed_spec.rb +1 -1
- data/spec/mongo/monitoring/event/server_opening_spec.rb +1 -1
- data/spec/mongo/monitoring/event/topology_changed_spec.rb +1 -1
- data/spec/mongo/monitoring/event/topology_closed_spec.rb +1 -1
- data/spec/mongo/monitoring/event/topology_opening_spec.rb +1 -1
- data/spec/mongo/operation/delete/op_msg_spec.rb +3 -3
- data/spec/mongo/operation/insert/command_spec.rb +2 -2
- data/spec/mongo/operation/insert/op_msg_spec.rb +3 -3
- data/spec/mongo/operation/read_preference_op_msg_spec.rb +1 -1
- data/spec/mongo/operation/update/command_spec.rb +2 -2
- data/spec/mongo/operation/update/op_msg_spec.rb +3 -3
- data/spec/mongo/query_cache_spec.rb +1 -0
- data/spec/mongo/server/app_metadata_shared.rb +2 -2
- data/spec/mongo/server/connection_spec.rb +1 -1
- data/spec/mongo/server/description_spec.rb +18 -0
- data/spec/mongo/server_selector_spec.rb +2 -2
- data/spec/mongo/socket/ssl_spec.rb +3 -3
- data/spec/runners/change_streams/test.rb +1 -1
- data/spec/runners/crud/test_base.rb +0 -19
- data/spec/runners/server_selection.rb +1 -1
- data/spec/runners/transactions/test.rb +2 -2
- 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
- data/spec/spec_helper.rb +3 -1
- data/spec/stress/fork_reconnect_stress_spec.rb +1 -1
- data/spec/support/constraints.rb +0 -270
- data/spec/support/utils.rb +19 -0
- metadata +956 -952
- metadata.gz.sig +0 -0
- data/spec/support/child_process_helper.rb +0 -78
- data/spec/support/lite_constraints.rb +0 -165
- data/spec/support/spec_organizer.rb +0 -129
@@ -224,7 +224,7 @@ module Mongo
|
|
224
224
|
end
|
225
225
|
|
226
226
|
if ClusterConfig.instance.fcv_ish >= '4.2'
|
227
|
-
mongos_each_direct_client do |direct_client|
|
227
|
+
::Utils.mongos_each_direct_client do |direct_client|
|
228
228
|
direct_client.command(configureFailPoint: 'failCommand', mode: 'off')
|
229
229
|
end
|
230
230
|
end
|
@@ -261,7 +261,7 @@ module Mongo
|
|
261
261
|
|
262
262
|
$distinct_ran ||= {}
|
263
263
|
$distinct_ran[@spec.database_name] ||= if description =~ /distinct/ || @operations.any? { |op| op.name == 'distinct' }
|
264
|
-
mongos_each_direct_client do |direct_client|
|
264
|
+
::Utils.mongos_each_direct_client do |direct_client|
|
265
265
|
direct_client.use(@spec.database_name)['test'].distinct('foo').to_a
|
266
266
|
end
|
267
267
|
end
|
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
|
@@ -0,0 +1,175 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
# encoding: utf-8
|
3
|
+
|
4
|
+
module Mrss
|
5
|
+
module LiteConstraints
|
6
|
+
|
7
|
+
# Constrain tests that use TimeoutInterrupt to MRI (and Unix).
|
8
|
+
def require_mri
|
9
|
+
before(:all) do
|
10
|
+
unless SpecConfig.instance.mri?
|
11
|
+
skip "MRI required, we have #{SpecConfig.instance.platform}"
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
def require_jruby
|
17
|
+
before(:all) do
|
18
|
+
unless BSON::Environment.jruby?
|
19
|
+
skip "JRuby required, we have #{SpecConfig.instance.platform}"
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
# This is for marking tests that fail on JRuby that should
|
25
|
+
# in principle work (as opposed to being fundamentally incompatible
|
26
|
+
# with JRuby).
|
27
|
+
# Often times these failures happen only in Evergreen.
|
28
|
+
def fails_on_jruby(version=nil)
|
29
|
+
before(:all) do
|
30
|
+
if BSON::Environment.jruby?
|
31
|
+
if version
|
32
|
+
min_parts = version.split('.').map(&:to_i)
|
33
|
+
actual_parts = JRUBY_VERSION.split('.').map(&:to_i)[0...min_parts.length]
|
34
|
+
actual = actual_parts.join('.')
|
35
|
+
if actual <= version
|
36
|
+
skip "Fails on jruby through #{version}"
|
37
|
+
end
|
38
|
+
else
|
39
|
+
skip "Fails on jruby"
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
# Indicates that the respective test uses the internet in some capacity,
|
46
|
+
# for example the test resolves SRV DNS records.
|
47
|
+
def require_external_connectivity
|
48
|
+
before(:all) do
|
49
|
+
if ENV['EXTERNAL_DISABLED']
|
50
|
+
skip "Test requires external connectivity"
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
def require_mongo_kerberos
|
56
|
+
before(:all) do
|
57
|
+
# TODO Use a more generic environment variable name if/when
|
58
|
+
# Mongoid tests get Kerberos configurations.
|
59
|
+
unless %w(1 yes true).include?(ENV['MONGO_RUBY_DRIVER_KERBEROS']&.downcase)
|
60
|
+
skip 'Set MONGO_RUBY_DRIVER_KERBEROS=1 in environment to run Kerberos unit tests'
|
61
|
+
end
|
62
|
+
require 'mongo_kerberos'
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
def require_linting
|
67
|
+
before(:all) do
|
68
|
+
unless Mongo::Lint.enabled?
|
69
|
+
skip "Linting is not enabled"
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
# Some tests will fail if linting is enabled:
|
75
|
+
# 1. Tests that pass invalid options to client, etc. which the linter
|
76
|
+
# rejects.
|
77
|
+
# 2. Tests that set expectations on topologies, server descriptions, etc.
|
78
|
+
# (since setting expectations requires mutating said objects, and when
|
79
|
+
# linting is on those objects are frozen).
|
80
|
+
def require_no_linting
|
81
|
+
before(:all) do
|
82
|
+
if Mongo::Lint.enabled?
|
83
|
+
skip "Linting is enabled"
|
84
|
+
end
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
def require_libmongocrypt
|
89
|
+
before(:all) do
|
90
|
+
unless ENV['LIBMONGOCRYPT_PATH']
|
91
|
+
skip 'Test requires path to libmongocrypt to be specified in LIBMONGOCRYPT_PATH env variable'
|
92
|
+
end
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
96
|
+
def require_no_libmongocrypt
|
97
|
+
before(:all) do
|
98
|
+
if ENV['LIBMONGOCRYPT_PATH']
|
99
|
+
skip 'Test requires libmongocrypt to not be configured'
|
100
|
+
end
|
101
|
+
end
|
102
|
+
end
|
103
|
+
|
104
|
+
def require_aws_auth
|
105
|
+
before(:all) do
|
106
|
+
unless (ENV['AUTH'] || '') =~ /^aws/
|
107
|
+
skip 'This test requires AUTH=aws* and an appropriately configured runtime environment'
|
108
|
+
end
|
109
|
+
end
|
110
|
+
end
|
111
|
+
|
112
|
+
def require_ec2_host
|
113
|
+
before(:all) do
|
114
|
+
if $have_aws.nil?
|
115
|
+
$have_aws = begin
|
116
|
+
require 'open-uri'
|
117
|
+
begin
|
118
|
+
Timeout.timeout(3.81) do
|
119
|
+
URI.parse('http://169.254.169.254/latest/meta-data/profile').open.read
|
120
|
+
end
|
121
|
+
true
|
122
|
+
# When trying to use the EC2 metadata endpoint on ECS:
|
123
|
+
# Errno::EINVAL: Failed to open TCP connection to 169.254.169.254:80 (Invalid argument - connect(2) for "169.254.169.254" port 80)
|
124
|
+
rescue Timeout::Error, Errno::ETIMEDOUT, Errno::EINVAL, OpenURI::HTTPError => $aws_error
|
125
|
+
false
|
126
|
+
end
|
127
|
+
end
|
128
|
+
end
|
129
|
+
unless $have_aws
|
130
|
+
skip "EC2 instance metadata is not available - assuming not running on an EC2 instance: #{$aws_error.class}: #{$aws_error}"
|
131
|
+
end
|
132
|
+
end
|
133
|
+
end
|
134
|
+
|
135
|
+
def require_stress
|
136
|
+
before(:all) do
|
137
|
+
if !SpecConfig.instance.stress?
|
138
|
+
skip 'Set STRESS=1 in environment to run stress tests'
|
139
|
+
end
|
140
|
+
end
|
141
|
+
end
|
142
|
+
|
143
|
+
def require_fork
|
144
|
+
before(:all) do
|
145
|
+
if !SpecConfig.instance.fork?
|
146
|
+
skip 'Set FORK=1 in environment to run fork tests'
|
147
|
+
end
|
148
|
+
end
|
149
|
+
end
|
150
|
+
|
151
|
+
def require_ocsp
|
152
|
+
before(:all) do
|
153
|
+
if !SpecConfig.instance.ocsp?
|
154
|
+
skip 'Set OCSP=1 in environment to run OCSP tests'
|
155
|
+
end
|
156
|
+
end
|
157
|
+
end
|
158
|
+
|
159
|
+
def require_ocsp_verifier
|
160
|
+
before(:all) do
|
161
|
+
if !SpecConfig.instance.ocsp_verifier?
|
162
|
+
skip 'Set OCSP_VERIFIER=1 in environment to run OCSP verifier tests'
|
163
|
+
end
|
164
|
+
end
|
165
|
+
end
|
166
|
+
|
167
|
+
def require_ocsp_connectivity
|
168
|
+
before(:all) do
|
169
|
+
if !SpecConfig.instance.ocsp_connectivity?
|
170
|
+
skip 'Set OCSP_CONNECTIVITY=pass or OCSP_CONNECTIVITY=fail in environment to run OCSP connectivity tests'
|
171
|
+
end
|
172
|
+
end
|
173
|
+
end
|
174
|
+
end
|
175
|
+
end
|