mongoid 7.1.5 → 7.1.6

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,312 @@
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_snappy_compression
151
+ before(:all) do
152
+ compressors = SpecConfig.instance.compressors
153
+ if compressors && compressors.include?('snappy')
154
+ skip "Snappy compression is enabled"
155
+ end
156
+ end
157
+ end
158
+
159
+ def require_no_compression
160
+ before(:all) do
161
+ if SpecConfig.instance.compressors
162
+ skip "Compression is enabled"
163
+ end
164
+ end
165
+ end
166
+
167
+ def ruby_version_gte(version)
168
+ before(:all) do
169
+ if RUBY_VERSION < version
170
+ skip "Ruby version #{version} or higher required"
171
+ end
172
+ end
173
+ end
174
+
175
+ def ruby_version_lt(version)
176
+ before(:all) do
177
+ if RUBY_VERSION >= version
178
+ skip "Ruby version less than #{version} required"
179
+ end
180
+ end
181
+ end
182
+
183
+ def require_auth(*values)
184
+ before(:all) do
185
+ if values.any?
186
+ unless values.include?(ENV['AUTH'])
187
+ msg = values.map { |v| "AUTH=#{v}" }.join(' or ')
188
+ skip "This test requires #{msg}"
189
+ end
190
+ else
191
+ unless ENV['AUTH'] == 'auth' || SpecConfig.instance.user || ClusterConfig.instance.auth_enabled?
192
+ skip "Auth required"
193
+ end
194
+ end
195
+ end
196
+ end
197
+
198
+ def require_no_auth
199
+ before(:all) do
200
+ if (ENV['AUTH'] && ENV['AUTH'] != 'noauth') || SpecConfig.instance.user || ClusterConfig.instance.auth_enabled?
201
+ skip "Auth not allowed"
202
+ end
203
+ end
204
+ end
205
+
206
+ def require_x509_auth
207
+ before(:all) do
208
+ unless SpecConfig.instance.x509_auth?
209
+ skip "X.509 auth required"
210
+ end
211
+ end
212
+ end
213
+
214
+ def require_no_external_user
215
+ before(:all) do
216
+ if SpecConfig.instance.external_user?
217
+ skip "External user configurations are not compatible with this test"
218
+ end
219
+ end
220
+ end
221
+
222
+ # Can the driver specify a write concern that won't be overridden?
223
+ # (mongos 4.0+ overrides the write concern)
224
+ def require_set_write_concern
225
+ before(:all) do
226
+ if ClusterConfig.instance.topology == :sharded && ClusterConfig.instance.short_server_version >= '4.0'
227
+ skip "mongos 4.0+ overrides write concern"
228
+ end
229
+ end
230
+ end
231
+
232
+ def require_multi_shard
233
+ before(:all) do
234
+ if ClusterConfig.instance.topology == :sharded && SpecConfig.instance.addresses.length == 1
235
+ skip 'Test requires a minimum of two shards if run in sharded topology'
236
+ end
237
+ end
238
+ end
239
+
240
+ def require_no_multi_shard
241
+ before(:all) do
242
+ if ClusterConfig.instance.topology == :sharded && SpecConfig.instance.addresses.length > 1
243
+ skip 'Test requires a single shard if run in sharded topology'
244
+ end
245
+ end
246
+ end
247
+
248
+ def require_wired_tiger
249
+ before(:all) do
250
+ if ClusterConfig.instance.storage_engine != :wired_tiger
251
+ skip 'Test requires WiredTiger storage engine'
252
+ end
253
+ end
254
+ end
255
+
256
+ def require_wired_tiger_on_36
257
+ before(:all) do
258
+ if ClusterConfig.instance.short_server_version >= '3.6'
259
+ if ClusterConfig.instance.storage_engine != :wired_tiger
260
+ skip 'Test requires WiredTiger storage engine on 3.6+ servers'
261
+ end
262
+ end
263
+ end
264
+ end
265
+
266
+ def require_mmapv1
267
+ before(:all) do
268
+ if ClusterConfig.instance.storage_engine != :mmapv1
269
+ skip 'Test requires MMAPv1 storage engine'
270
+ end
271
+ end
272
+ end
273
+
274
+ def require_enterprise
275
+ before(:all) do
276
+ unless ClusterConfig.instance.enterprise?
277
+ skip 'Test requires enterprise build of MongoDB'
278
+ end
279
+ end
280
+ end
281
+
282
+ # Integration tests for SRV polling require internet connectivity to
283
+ # look up SRV records and a sharded cluster configured on default port on
284
+ # localhost (localhost:27017, localhost:27018).
285
+ def require_default_port_deployment
286
+ # Because the DNS records at test1.test.build.10gen.cc point to
287
+ # localhost:27017 & localhost:27018, the test suite must have been
288
+ # configured to use these addresses
289
+ before(:all) do
290
+ have_default_port = SpecConfig.instance.addresses.any? do |address|
291
+ %w(127.0.0.1 127.0.0.1:27017 localhost localhost:27017).include?(address)
292
+ end
293
+ unless have_default_port
294
+ skip 'This test requires the test suite to be configured for localhost:27017'
295
+ end
296
+ end
297
+ end
298
+
299
+ # Some tests perform assertions on what the driver is logging.
300
+ # Some test configurations, for example OCSP with unknown response,
301
+ # produce warnings due to optional checks failing.
302
+ # This constraint skips tests that issue logging assertions on configurations
303
+ # that may produce non-test-originated log entries.
304
+ def require_warning_clean
305
+ before(:all) do
306
+ if ENV['OCSP_STATUS'] == 'unknown'
307
+ skip 'Unknown OCSP status is not global warning-clean'
308
+ end
309
+ end
310
+ end
311
+ end
312
+ 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