mongoid 7.1.5 → 7.1.9

Sign up to get free protection for your applications and to get access to all the features.
Files changed (69) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data.tar.gz.sig +0 -0
  4. data/README.md +1 -1
  5. data/Rakefile +33 -7
  6. data/lib/mongoid/association/referenced/has_one/proxy.rb +6 -1
  7. data/lib/mongoid/attributes.rb +8 -1
  8. data/lib/mongoid/criteria/queryable/selector.rb +0 -4
  9. data/lib/mongoid/document.rb +3 -2
  10. data/lib/mongoid/errors/mongoid_error.rb +1 -1
  11. data/lib/mongoid/interceptable.rb +3 -1
  12. data/lib/mongoid/reloadable.rb +5 -0
  13. data/lib/mongoid/validatable/associated.rb +1 -1
  14. data/lib/mongoid/validatable/presence.rb +3 -3
  15. data/lib/mongoid/validatable/uniqueness.rb +1 -1
  16. data/lib/mongoid/version.rb +1 -1
  17. data/lib/rails/generators/mongoid/config/config_generator.rb +8 -1
  18. data/lib/rails/generators/mongoid/config/templates/mongoid.yml +1 -1
  19. data/spec/app/models/customer.rb +11 -0
  20. data/spec/app/models/customer_address.rb +12 -0
  21. data/spec/app/models/dictionary.rb +6 -0
  22. data/spec/app/models/person.rb +2 -0
  23. data/spec/app/models/series.rb +1 -0
  24. data/spec/app/models/wiki_page.rb +1 -0
  25. data/spec/integration/app_spec.rb +178 -88
  26. data/spec/integration/associations/embeds_many_spec.rb +24 -0
  27. data/spec/integration/associations/embeds_one_spec.rb +24 -0
  28. data/spec/integration/associations/has_many_spec.rb +42 -0
  29. data/spec/integration/associations/has_one_spec.rb +42 -0
  30. data/spec/integration/callbacks_models.rb +49 -0
  31. data/spec/integration/callbacks_spec.rb +216 -0
  32. data/spec/integration/document_spec.rb +21 -0
  33. data/spec/lite_spec_helper.rb +6 -6
  34. data/spec/mongoid/association/embedded/embedded_in/proxy_spec.rb +50 -0
  35. data/spec/mongoid/atomic/paths_spec.rb +41 -0
  36. data/spec/mongoid/attributes_spec.rb +241 -0
  37. data/spec/mongoid/contextual/atomic_spec.rb +17 -4
  38. data/spec/mongoid/criteria/queryable/selectable_logical_spec.rb +36 -0
  39. data/spec/mongoid/document_query_spec.rb +51 -0
  40. data/spec/mongoid/errors/mongoid_error_spec.rb +20 -8
  41. data/spec/mongoid/factory_spec.rb +2 -2
  42. data/spec/mongoid/persistable/savable_spec.rb +4 -4
  43. data/spec/mongoid/persistable/settable_spec.rb +30 -0
  44. data/spec/mongoid/persistable_spec.rb +2 -2
  45. data/spec/shared/LICENSE +20 -0
  46. data/spec/shared/bin/get-mongodb-download-url +17 -0
  47. data/spec/shared/bin/s3-copy +45 -0
  48. data/spec/shared/bin/s3-upload +69 -0
  49. data/spec/shared/lib/mrss/child_process_helper.rb +80 -0
  50. data/spec/shared/lib/mrss/cluster_config.rb +226 -0
  51. data/spec/shared/lib/mrss/constraints.rb +368 -0
  52. data/spec/shared/lib/mrss/docker_runner.rb +271 -0
  53. data/spec/shared/lib/mrss/lite_constraints.rb +191 -0
  54. data/spec/shared/lib/mrss/server_version_registry.rb +115 -0
  55. data/spec/shared/lib/mrss/spec_organizer.rb +179 -0
  56. data/spec/shared/lib/mrss/utils.rb +15 -0
  57. data/spec/shared/share/Dockerfile.erb +322 -0
  58. data/spec/shared/share/haproxy-1.conf +16 -0
  59. data/spec/shared/share/haproxy-2.conf +17 -0
  60. data/spec/shared/shlib/distro.sh +73 -0
  61. data/spec/shared/shlib/server.sh +317 -0
  62. data/spec/shared/shlib/set_env.sh +131 -0
  63. data/spec/spec_helper.rb +3 -1
  64. data/spec/support/constraints.rb +0 -226
  65. data/spec/support/spec_config.rb +8 -0
  66. metadata +538 -493
  67. metadata.gz.sig +0 -0
  68. data/spec/support/child_process_helper.rb +0 -76
  69. data/spec/support/lite_constraints.rb +0 -22
@@ -0,0 +1,368 @@
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, :load_balanced]
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, :load_balanced
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_retry_writes
117
+ before(:all) do
118
+ unless SpecConfig.instance.retry_writes?
119
+ skip "Retry writes is disabled"
120
+ end
121
+ end
122
+ end
123
+
124
+ def require_no_retry_writes
125
+ before(:all) do
126
+ if SpecConfig.instance.retry_writes?
127
+ skip "Retry writes is enabled"
128
+ end
129
+ end
130
+ end
131
+
132
+ def require_compression
133
+ before(:all) do
134
+ if SpecConfig.instance.compressors.nil?
135
+ skip "Compression is not enabled"
136
+ end
137
+ end
138
+ end
139
+
140
+ def require_zlib_compression
141
+ before(:all) do
142
+ compressors = SpecConfig.instance.compressors
143
+ unless compressors && compressors.include?('zlib')
144
+ skip "Zlib compression is not enabled"
145
+ end
146
+ end
147
+ end
148
+
149
+ def require_snappy_compression
150
+ before(:all) do
151
+ compressors = SpecConfig.instance.compressors
152
+ unless compressors && compressors.include?('snappy')
153
+ skip "Snappy compression is not enabled"
154
+ end
155
+ end
156
+ end
157
+
158
+ def require_no_snappy_compression
159
+ before(:all) do
160
+ compressors = SpecConfig.instance.compressors
161
+ if compressors && compressors.include?('snappy')
162
+ skip "Snappy compression is enabled"
163
+ end
164
+ end
165
+ end
166
+
167
+ def require_zstd_compression
168
+ before(:all) do
169
+ compressors = SpecConfig.instance.compressors
170
+ unless compressors && compressors.include?('zstd')
171
+ skip "Zstd compression is not enabled"
172
+ end
173
+ end
174
+ end
175
+
176
+ def require_no_zstd_compression
177
+ before(:all) do
178
+ compressors = SpecConfig.instance.compressors
179
+ if compressors && compressors.include?('zstd')
180
+ skip "Zstd compression is enabled"
181
+ end
182
+ end
183
+ end
184
+
185
+ def require_no_compression
186
+ before(:all) do
187
+ if SpecConfig.instance.compressors
188
+ skip "Compression is enabled"
189
+ end
190
+ end
191
+ end
192
+
193
+ def ruby_version_gte(version)
194
+ before(:all) do
195
+ if RUBY_VERSION < version
196
+ skip "Ruby version #{version} or higher required"
197
+ end
198
+ end
199
+ end
200
+
201
+ def ruby_version_lt(version)
202
+ before(:all) do
203
+ if RUBY_VERSION >= version
204
+ skip "Ruby version less than #{version} required"
205
+ end
206
+ end
207
+ end
208
+
209
+ def require_auth(*values)
210
+ before(:all) do
211
+ if values.any?
212
+ unless values.include?(ENV['AUTH'])
213
+ msg = values.map { |v| "AUTH=#{v}" }.join(' or ')
214
+ skip "This test requires #{msg}"
215
+ end
216
+ else
217
+ unless ENV['AUTH'] == 'auth' || SpecConfig.instance.user || ClusterConfig.instance.auth_enabled?
218
+ skip "Auth required"
219
+ end
220
+ end
221
+ end
222
+ end
223
+
224
+ def require_no_auth
225
+ before(:all) do
226
+ if (ENV['AUTH'] && ENV['AUTH'] != 'noauth') || SpecConfig.instance.user || ClusterConfig.instance.auth_enabled?
227
+ skip "Auth not allowed"
228
+ end
229
+ end
230
+ end
231
+
232
+ def require_x509_auth
233
+ before(:all) do
234
+ unless SpecConfig.instance.x509_auth?
235
+ skip "X.509 auth required"
236
+ end
237
+ end
238
+ end
239
+
240
+ def require_no_external_user
241
+ before(:all) do
242
+ if SpecConfig.instance.external_user?
243
+ skip "External user configurations are not compatible with this test"
244
+ end
245
+ end
246
+ end
247
+
248
+ # Can the driver specify a write concern that won't be overridden?
249
+ # (mongos 4.0+ overrides the write concern)
250
+ def require_set_write_concern
251
+ before(:all) do
252
+ if %i(sharded load_balanced).include?(ClusterConfig.instance.topology) &&
253
+ ClusterConfig.instance.short_server_version >= '4.0'
254
+ then
255
+ skip "mongos 4.0+ overrides write concern"
256
+ end
257
+ end
258
+ end
259
+
260
+ def require_multi_shard
261
+ before(:all) do
262
+ if ClusterConfig.instance.topology == :sharded && SpecConfig.instance.addresses.length == 1
263
+ skip 'Test requires a minimum of two shards if run in sharded topology'
264
+ end
265
+ end
266
+ end
267
+
268
+ def require_no_multi_shard
269
+ before(:all) do
270
+ if ClusterConfig.instance.topology == :sharded && SpecConfig.instance.addresses.length > 1
271
+ skip 'Test requires a single shard if run in sharded topology'
272
+ end
273
+ end
274
+ end
275
+
276
+ def require_wired_tiger
277
+ before(:all) do
278
+ # Storage detection fails for serverless instances. However, it is safe to
279
+ # assume that a serverless instance uses WiredTiger Storage Engine.
280
+ if !SpecConfig.instance.serverless? && ClusterConfig.instance.storage_engine != :wired_tiger
281
+ skip 'Test requires WiredTiger storage engine'
282
+ end
283
+ end
284
+ end
285
+
286
+ def require_wired_tiger_on_36
287
+ before(:all) do
288
+ if ClusterConfig.instance.short_server_version >= '3.6'
289
+ # Storage detection fails for serverless instances. However, it is safe to
290
+ # assume that a serverless instance uses WiredTiger Storage Engine.
291
+ if !SpecConfig.instance.serverless? && ClusterConfig.instance.storage_engine != :wired_tiger
292
+ skip 'Test requires WiredTiger storage engine on 3.6+ servers'
293
+ end
294
+ end
295
+ end
296
+ end
297
+
298
+ def require_mmapv1
299
+ before(:all) do
300
+ if SpecConfig.instance.serverless? || ClusterConfig.instance.storage_engine != :mmapv1
301
+ skip 'Test requires MMAPv1 storage engine'
302
+ end
303
+ end
304
+ end
305
+
306
+ def require_enterprise
307
+ before(:all) do
308
+ unless ClusterConfig.instance.enterprise?
309
+ skip 'Test requires enterprise build of MongoDB'
310
+ end
311
+ end
312
+ end
313
+
314
+ # Integration tests for SRV polling require internet connectivity to
315
+ # look up SRV records and a sharded cluster configured on default port on
316
+ # localhost (localhost:27017, localhost:27018).
317
+ def require_default_port_deployment
318
+ # Because the DNS records at test1.test.build.10gen.cc point to
319
+ # localhost:27017 & localhost:27018, the test suite must have been
320
+ # configured to use these addresses
321
+ before(:all) do
322
+ have_default_port = SpecConfig.instance.addresses.any? do |address|
323
+ %w(127.0.0.1 127.0.0.1:27017 localhost localhost:27017).include?(address)
324
+ end
325
+ unless have_default_port
326
+ skip 'This test requires the test suite to be configured for localhost:27017'
327
+ end
328
+ end
329
+ end
330
+
331
+ # Some tests perform assertions on what the driver is logging.
332
+ # Some test configurations, for example OCSP with unknown response,
333
+ # produce warnings due to optional checks failing.
334
+ # This constraint skips tests that issue logging assertions on configurations
335
+ # that may produce non-test-originated log entries.
336
+ def require_warning_clean
337
+ before(:all) do
338
+ if ENV['OCSP_STATUS'] == 'unknown'
339
+ skip 'Unknown OCSP status is not global warning-clean'
340
+ end
341
+ end
342
+ end
343
+
344
+ def require_required_api_version
345
+ before(:all) do
346
+ unless ENV['API_VERSION_REQUIRED'] == '1'
347
+ skip 'Set API_VERSION_REQUIRED=1 to run this test'
348
+ end
349
+ end
350
+ end
351
+
352
+ def require_no_required_api_version
353
+ before(:all) do
354
+ if ENV['API_VERSION_REQUIRED'] == '1'
355
+ skip 'Cannot have API_VERSION_REQUIRED=1 to run this test'
356
+ end
357
+ end
358
+ end
359
+
360
+ def require_unix_socket
361
+ before(:all) do
362
+ if ENV['TOPOLOGY'] == 'load-balanced'
363
+ skip 'Load balancer does not listen on Unix sockets'
364
+ end
365
+ end
366
+ end
367
+ end
368
+ end
@@ -0,0 +1,271 @@
1
+ # frozen_string_literal: true
2
+ # encoding: utf-8
3
+
4
+ require 'optparse'
5
+ require 'erb'
6
+ autoload :Dotenv, 'dotenv'
7
+
8
+ module Mrss
9
+ autoload :ServerVersionRegistry, 'mrss/server_version_registry'
10
+
11
+ class DockerRunner
12
+ def initialize(**opts)
13
+ # These options are required:
14
+ opts.fetch(:image_tag)
15
+ opts.fetch(:dockerfile_path)
16
+ opts.fetch(:default_script)
17
+ opts.fetch(:project_lib_subdir)
18
+
19
+ @options = opts
20
+ end
21
+
22
+ attr_reader :options
23
+
24
+ def run
25
+ process_arguments
26
+ unless @options[:exec_only]
27
+ create_dockerfile
28
+ create_image
29
+ end
30
+ if @options[:mongo_only]
31
+ run_deployment
32
+ else
33
+ run_tests
34
+ end
35
+ end
36
+
37
+ private
38
+
39
+ def process_arguments
40
+ #@options = {}
41
+ OptionParser.new do |opts|
42
+ opts.banner = "Usage: test-on-docker [-d distro] [evergreen_key=value ...]"
43
+
44
+ opts.on("-a", "--add-env=PATH", "Load environment variables from PATH in .env format") do |path|
45
+ @options[:extra_env] ||= {}
46
+ unless File.exist?(path)
47
+ raise "-a option references nonexistent file #{path}"
48
+ end
49
+ Dotenv.parse(path).each do |k, v|
50
+ @options[:extra_env][k] = v
51
+ end
52
+ end
53
+
54
+ opts.on("-d", "--distro=DISTRO", "Distro to use") do |v|
55
+ @options[:distro] = v
56
+ end
57
+
58
+ opts.on('-e', '--exec-only', 'Execute tests using existing Dockerfile (for offline user)') do |v|
59
+ @options[:exec_only] = v
60
+ end
61
+
62
+ opts.on('-m', '--mongo-only=PORT', 'Start the MongoDB deployment and expose it to host on ports starting with PORT') do |v|
63
+ @options[:mongo_only] = v.to_i
64
+ end
65
+
66
+ opts.on('-p', '--preload', 'Preload Ruby toolchain and server binaries in docker') do |v|
67
+ @options[:preload] = v
68
+ end
69
+
70
+ opts.on('-s', '--script=SCRIPT', 'Test script to invoke') do |v|
71
+ @options[:script] = v
72
+ end
73
+
74
+ opts.on('-i', '--interactive', 'Interactive mode - disable per-test timeouts') do |v|
75
+ @options[:interactive] = v
76
+ end
77
+ end.parse!
78
+
79
+ @env = Hash[ARGV.map do |arg|
80
+ arg.split('=', 2)
81
+ end]
82
+
83
+ @env['RVM_RUBY'] ||= 'ruby-2.7'
84
+ unless ruby =~ /^j?ruby-/
85
+ raise "RVM_RUBY option is not in expected format: #{ruby}"
86
+ end
87
+
88
+ @env['MONGODB_VERSION'] ||= '4.4'
89
+ end
90
+
91
+ def create_dockerfile
92
+ template_path = File.join(File.dirname(__FILE__), '../../share/Dockerfile.erb')
93
+ result = ERB.new(File.read(template_path)).result(binding)
94
+ File.open(dockerfile_path, 'w') do |f|
95
+ f << result
96
+ end
97
+ end
98
+
99
+ def image_tag
100
+ options.fetch(:image_tag)
101
+ end
102
+
103
+ def dockerfile_path
104
+ options.fetch(:dockerfile_path)
105
+ end
106
+
107
+ def create_image
108
+ run_command(['docker', 'build',
109
+ '-t', image_tag,
110
+ '-f', dockerfile_path,
111
+ '.'])
112
+ end
113
+
114
+ BASE_TEST_COMMAND = %w(docker run --rm -i --tmpfs /tmpfs:exec).freeze
115
+
116
+ def run_tests
117
+ run_command(BASE_TEST_COMMAND + tty_arg + extra_env + [image_tag] +
118
+ script.split(/\s+/))
119
+ end
120
+
121
+ def run_deployment
122
+ run_command(BASE_TEST_COMMAND + tty_arg + extra_env + [
123
+ '-e', %q`TEST_CMD=watch -x bash -c "ps awwxu |egrep 'mongo|ocsp'"`,
124
+ '-e', 'BIND_ALL=true',
125
+ ] + port_forwards + [image_tag] + script.split(/\s+/))
126
+ end
127
+
128
+ def tty_arg
129
+ tty = File.open('/dev/stdin') do |f|
130
+ f.isatty
131
+ end
132
+ if tty
133
+ %w(-t --init)
134
+ else
135
+ []
136
+ end
137
+ end
138
+
139
+ def extra_env
140
+ if @options[:extra_env]
141
+ @options[:extra_env].map do |k, v|
142
+ # Here the value must not be escaped
143
+ ['-e', "#{k}=#{v}"]
144
+ end.flatten
145
+ else
146
+ []
147
+ end
148
+ end
149
+
150
+ def port_forwards
151
+ args = (0...num_exposed_ports).map do |i|
152
+ host_port = @options[:mongo_only] + i
153
+ container_port = 27017 + i
154
+ ['-p', "#{host_port}:#{container_port}"]
155
+ end.flatten
156
+
157
+ if @env['OCSP_ALGORITHM'] && !@env['OCSP_VERIFIER']
158
+ args += %w(-p 8100:8100)
159
+ end
160
+
161
+ args
162
+ end
163
+
164
+ def run_command(cmd)
165
+ if pid = fork
166
+ Process.wait(pid)
167
+ unless $?.exitstatus == 0
168
+ raise "Process exited with code #{$?.exitstatus}"
169
+ end
170
+ else
171
+ exec(*cmd)
172
+ end
173
+ end
174
+
175
+ def distro
176
+ @options[:distro] || 'ubuntu1604'
177
+ end
178
+
179
+ BASE_IMAGES = {
180
+ 'debian81' => 'debian:jessie',
181
+ 'debian92' => 'debian:stretch',
182
+ 'debian10' => 'debian:buster',
183
+ 'ubuntu1404' => 'ubuntu:trusty',
184
+ 'ubuntu1604' => 'ubuntu:xenial',
185
+ 'ubuntu1804' => 'ubuntu:bionic',
186
+ 'ubuntu2004' => 'ubuntu:focal',
187
+ 'rhel62' => 'centos:6',
188
+ 'rhel70' => 'centos:7',
189
+ }.freeze
190
+
191
+ def base_image
192
+ BASE_IMAGES[distro] or raise "Unknown distro: #{distro}"
193
+ end
194
+
195
+ def ruby
196
+ @env['RVM_RUBY']
197
+ end
198
+
199
+ def ruby_head?
200
+ ruby == 'ruby-head'
201
+ end
202
+
203
+ def system_ruby?
204
+ %w(1 true yes).include?(@env['SYSTEM_RUBY']&.downcase)
205
+ end
206
+
207
+ def server_version
208
+ @env['MONGODB_VERSION']
209
+ end
210
+
211
+ def script
212
+ @options[:script] || options.fetch(:default_script)
213
+ end
214
+
215
+ def debian?
216
+ distro =~ /debian|ubuntu/
217
+ end
218
+
219
+ def preload?
220
+ !!@options[:preload]
221
+ end
222
+
223
+ def interactive?
224
+ !!@options[:interactive]
225
+ end
226
+
227
+ def project_lib_subdir
228
+ options.fetch(:project_lib_subdir)
229
+ end
230
+
231
+ def server_download_url
232
+ @server_download_url ||= ServerVersionRegistry.new(server_version, distro).download_url
233
+ end
234
+
235
+ def libmongocrypt_path
236
+ case distro
237
+ when /ubuntu1604/
238
+ "./ubuntu1604/nocrypto/lib64/libmongocrypt.so"
239
+ when /ubuntu1804/
240
+ "./ubuntu1804-64/nocrypto/lib64/libmongocrypt.so"
241
+ when /debian92/
242
+ "./debian92/nocrypto/lib64/libmongocrypt.so"
243
+ else
244
+ raise "This script does not support running FLE tests on #{distro}. Use ubuntu1604, ubuntu1804 or debian92 instead"
245
+ end
246
+ end
247
+
248
+ def expose?
249
+ !!@options[:mongo_only]
250
+ end
251
+
252
+ def fle?
253
+ %w(1 true yes).include?(@env['FLE']&.downcase)
254
+ end
255
+
256
+ def num_exposed_ports
257
+ case @env['TOPOLOGY'] || 'standalone'
258
+ when 'standalone'
259
+ 1
260
+ when 'replica-set'
261
+ 3
262
+ when 'sharded-cluster'
263
+ if @env['SINGLE_MONGOS']
264
+ 1
265
+ else
266
+ 2
267
+ end
268
+ end
269
+ end
270
+ end
271
+ end