mongo 2.14.0.rc1 → 2.14.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (84) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data.tar.gz.sig +1 -1
  4. data/Rakefile +39 -4
  5. data/lib/mongo/address.rb +1 -1
  6. data/lib/mongo/collection.rb +5 -0
  7. data/lib/mongo/collection/view/readable.rb +4 -0
  8. data/lib/mongo/cursor.rb +15 -3
  9. data/lib/mongo/database/view.rb +1 -1
  10. data/lib/mongo/operation/collections_info/command.rb +5 -0
  11. data/lib/mongo/operation/collections_info/result.rb +16 -1
  12. data/lib/mongo/operation/find/result.rb +10 -0
  13. data/lib/mongo/server/description.rb +8 -1
  14. data/lib/mongo/session.rb +2 -1
  15. data/lib/mongo/version.rb +1 -1
  16. data/spec/README.md +7 -0
  17. data/spec/integration/bson_symbol_spec.rb +4 -2
  18. data/spec/integration/change_stream_spec.rb +1 -1
  19. data/spec/integration/connection_pool_populator_spec.rb +1 -1
  20. data/spec/integration/cursor_reaping_spec.rb +1 -1
  21. data/spec/integration/fork_reconnect_spec.rb +56 -1
  22. data/spec/integration/query_cache_transactions_spec.rb +29 -18
  23. data/spec/integration/sdam_error_handling_spec.rb +17 -0
  24. data/spec/integration/sdam_events_spec.rb +8 -5
  25. data/spec/integration/transactions_examples_spec.rb +17 -7
  26. data/spec/lite_spec_helper.rb +5 -3
  27. data/spec/mongo/auth/user_spec.rb +1 -1
  28. data/spec/mongo/bulk_write_spec.rb +2 -2
  29. data/spec/mongo/client_construction_spec.rb +3 -3
  30. data/spec/mongo/client_encryption_spec.rb +16 -10
  31. data/spec/mongo/client_spec.rb +7 -0
  32. data/spec/mongo/cluster/topology/replica_set_spec.rb +1 -1
  33. data/spec/mongo/cluster/topology/sharded_spec.rb +1 -1
  34. data/spec/mongo/cluster/topology/single_spec.rb +1 -1
  35. data/spec/mongo/cluster/topology/unknown_spec.rb +1 -1
  36. data/spec/mongo/cluster/topology_spec.rb +1 -1
  37. data/spec/mongo/collection/view/change_stream_resume_spec.rb +1 -1
  38. data/spec/mongo/collection/view/readable_spec.rb +36 -0
  39. data/spec/mongo/collection_spec.rb +12 -0
  40. data/spec/mongo/crypt/binary_spec.rb +1 -6
  41. data/spec/mongo/crypt/binding/binary_spec.rb +1 -6
  42. data/spec/mongo/crypt/binding/context_spec.rb +2 -7
  43. data/spec/mongo/crypt/binding/helpers_spec.rb +1 -6
  44. data/spec/mongo/crypt/binding/mongocrypt_spec.rb +2 -7
  45. data/spec/mongo/crypt/binding/status_spec.rb +1 -6
  46. data/spec/mongo/crypt/binding/version_spec.rb +1 -6
  47. data/spec/mongo/crypt/data_key_context_spec.rb +1 -1
  48. data/spec/mongo/crypt/status_spec.rb +1 -6
  49. data/spec/mongo/database_spec.rb +64 -0
  50. data/spec/mongo/monitoring/event/server_closed_spec.rb +1 -1
  51. data/spec/mongo/monitoring/event/server_opening_spec.rb +1 -1
  52. data/spec/mongo/monitoring/event/topology_changed_spec.rb +1 -1
  53. data/spec/mongo/monitoring/event/topology_closed_spec.rb +1 -1
  54. data/spec/mongo/monitoring/event/topology_opening_spec.rb +1 -1
  55. data/spec/mongo/operation/delete/op_msg_spec.rb +3 -3
  56. data/spec/mongo/operation/insert/command_spec.rb +2 -2
  57. data/spec/mongo/operation/insert/op_msg_spec.rb +3 -3
  58. data/spec/mongo/operation/read_preference_op_msg_spec.rb +1 -1
  59. data/spec/mongo/operation/update/command_spec.rb +2 -2
  60. data/spec/mongo/operation/update/op_msg_spec.rb +3 -3
  61. data/spec/mongo/query_cache_spec.rb +1 -0
  62. data/spec/mongo/server/app_metadata_shared.rb +2 -2
  63. data/spec/mongo/server/connection_spec.rb +1 -1
  64. data/spec/mongo/server/description_spec.rb +18 -0
  65. data/spec/mongo/server_selector_spec.rb +2 -2
  66. data/spec/mongo/socket/ssl_spec.rb +3 -3
  67. data/spec/runners/change_streams/test.rb +1 -1
  68. data/spec/runners/crud/test_base.rb +0 -19
  69. data/spec/runners/server_selection.rb +1 -1
  70. data/spec/runners/transactions/test.rb +2 -2
  71. data/spec/shared/LICENSE +20 -0
  72. data/spec/shared/lib/mrss/child_process_helper.rb +80 -0
  73. data/spec/shared/lib/mrss/constraints.rb +303 -0
  74. data/spec/shared/lib/mrss/lite_constraints.rb +175 -0
  75. data/spec/shared/lib/mrss/spec_organizer.rb +149 -0
  76. data/spec/spec_helper.rb +3 -1
  77. data/spec/stress/fork_reconnect_stress_spec.rb +1 -1
  78. data/spec/support/constraints.rb +0 -270
  79. data/spec/support/utils.rb +19 -0
  80. metadata +956 -952
  81. metadata.gz.sig +0 -0
  82. data/spec/support/child_process_helper.rb +0 -78
  83. data/spec/support/lite_constraints.rb +0 -165
  84. data/spec/support/spec_organizer.rb +0 -129
@@ -123,7 +123,7 @@ end
123
123
  def define_server_selection_spec_tests(test_paths)
124
124
  # Linter insists that a server selection semaphore is present when
125
125
  # performing server selection.
126
- skip_if_linting
126
+ require_no_linting
127
127
 
128
128
  test_paths.each do |file|
129
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
@@ -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