mongoid 7.2.0 → 7.2.4

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.
Files changed (70) 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/lib/mongoid/attributes.rb +8 -1
  6. data/lib/mongoid/criteria/queryable/selector.rb +0 -4
  7. data/lib/mongoid/document.rb +3 -2
  8. data/lib/mongoid/errors/mongoid_error.rb +1 -1
  9. data/lib/mongoid/interceptable.rb +3 -1
  10. data/lib/mongoid/matcher.rb +19 -43
  11. data/lib/mongoid/matcher/elem_match.rb +2 -1
  12. data/lib/mongoid/matcher/expression.rb +5 -14
  13. data/lib/mongoid/matcher/field_expression.rb +4 -5
  14. data/lib/mongoid/matcher/field_operator.rb +7 -11
  15. data/lib/mongoid/reloadable.rb +5 -0
  16. data/lib/mongoid/validatable/associated.rb +1 -1
  17. data/lib/mongoid/validatable/presence.rb +3 -3
  18. data/lib/mongoid/validatable/uniqueness.rb +1 -1
  19. data/lib/mongoid/version.rb +1 -1
  20. data/lib/rails/generators/mongoid/config/config_generator.rb +8 -1
  21. data/lib/rails/generators/mongoid/config/templates/mongoid.yml +1 -1
  22. data/spec/integration/app_spec.rb +174 -84
  23. data/spec/integration/callbacks_models.rb +49 -0
  24. data/spec/integration/callbacks_spec.rb +216 -0
  25. data/spec/integration/document_spec.rb +21 -0
  26. data/spec/integration/matcher_operator_data/elem_match.yml +46 -0
  27. data/spec/integration/matcher_operator_data/gt_types.yml +63 -0
  28. data/spec/integration/matcher_operator_data/gte_types.yml +15 -0
  29. data/spec/integration/matcher_operator_data/implicit_traversal.yml +96 -0
  30. data/spec/integration/matcher_operator_data/lt_types.yml +15 -0
  31. data/spec/integration/matcher_operator_data/lte_types.yml +15 -0
  32. data/spec/integration/matcher_operator_data/ne_types.yml +15 -0
  33. data/spec/lite_spec_helper.rb +3 -4
  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_fields_spec.rb +26 -0
  40. data/spec/mongoid/document_query_spec.rb +51 -0
  41. data/spec/mongoid/errors/mongoid_error_spec.rb +20 -8
  42. data/spec/mongoid/matcher/extract_attribute_data/numeric_keys.yml +104 -0
  43. data/spec/mongoid/matcher/extract_attribute_data/traversal.yml +68 -88
  44. data/spec/mongoid/matcher/extract_attribute_spec.rb +3 -13
  45. data/spec/mongoid/persistable/settable_spec.rb +30 -0
  46. data/spec/mongoid/persistable_spec.rb +2 -2
  47. data/spec/shared/bin/get-mongodb-download-url +17 -0
  48. data/spec/shared/bin/s3-copy +45 -0
  49. data/spec/shared/bin/s3-upload +69 -0
  50. data/spec/shared/lib/mrss/cluster_config.rb +226 -0
  51. data/spec/shared/lib/mrss/constraints.rb +71 -6
  52. data/spec/shared/lib/mrss/docker_runner.rb +271 -0
  53. data/spec/shared/lib/mrss/lite_constraints.rb +16 -0
  54. data/spec/shared/lib/mrss/server_version_registry.rb +115 -0
  55. data/spec/shared/lib/mrss/spec_organizer.rb +32 -2
  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 +1 -1
  64. data/spec/support/models/customer.rb +11 -0
  65. data/spec/support/models/customer_address.rb +12 -0
  66. data/spec/support/models/dictionary.rb +6 -0
  67. data/spec/support/models/mop.rb +10 -0
  68. data/spec/support/spec_config.rb +8 -0
  69. metadata +554 -508
  70. metadata.gz.sig +3 -2
@@ -25,20 +25,10 @@ describe 'Matcher.extract_attribute' do
25
25
  Mongoid::Matcher.extract_attribute(document, key)
26
26
  end
27
27
 
28
- let(:expected_exists) { spec['exists'] }
29
- let(:expected_value) { spec['value'] }
30
- let(:expected_expanded) { spec['expanded'] }
28
+ let(:expected) { spec.fetch('result') }
31
29
 
32
- it 'has the expected exists flag' do
33
- actual[0].should == expected_exists
34
- end
35
-
36
- it 'has the expected value' do
37
- actual[1].should == expected_value
38
- end
39
-
40
- it 'has the expected expanded flag' do
41
- actual[2].should == expected_expanded
30
+ it 'has the expected result' do
31
+ actual.should == expected
42
32
  end
43
33
  end
44
34
  end
@@ -512,4 +512,34 @@ describe Mongoid::Persistable::Settable do
512
512
  end
513
513
  end
514
514
  end
515
+
516
+ context "when the field being set was projected out" do
517
+ let(:full_agent) do
518
+ Agent.create!(title: "Double-Oh Eight")
519
+ end
520
+
521
+ let(:agent) do
522
+ Agent.where(_id: full_agent.id).only(:dob).first
523
+ end
524
+
525
+ context 'field exists in database' do
526
+ it "raises MissingAttributeError" do
527
+ lambda do
528
+ agent.set(title: '008')
529
+ end.should raise_error(ActiveModel::MissingAttributeError)
530
+
531
+ expect(agent.reload.title).to eq 'Double-Oh Eight'
532
+ end
533
+ end
534
+
535
+ context 'field does not exist in database' do
536
+ it "raises MissingAttributeError" do
537
+ lambda do
538
+ agent.set(number: '008')
539
+ end.should raise_error(ActiveModel::MissingAttributeError)
540
+
541
+ expect(agent.reload.read_attribute(:number)).to be nil
542
+ end
543
+ end
544
+ end
515
545
  end
@@ -178,8 +178,8 @@ describe Mongoid::Persistable do
178
178
 
179
179
  before do
180
180
  class Band
181
- def my_updates(*args)
182
- atomically(*args) do |d|
181
+ def my_updates(**args)
182
+ atomically(**args) do |d|
183
183
  d.set(name: "Placebo")
184
184
  d.unset(:origin)
185
185
  end
@@ -0,0 +1,17 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ desired_version, arch = ARGV
4
+ if arch.nil?
5
+ STDERR.puts "Usage: get-mongodb-download-url desired-version arch"
6
+ exit 1
7
+ end
8
+
9
+ $: << File.join(File.dirname(__FILE__), '../lib')
10
+ require 'mrss/server_version_registry'
11
+
12
+ begin
13
+ puts Mrss::ServerVersionRegistry.new(desired_version, arch).download_url
14
+ rescue Mrss::ServerVersionRegistry::Error => exc
15
+ STDERR.puts "Error: #{exc}"
16
+ exit 2
17
+ end
@@ -0,0 +1,45 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'optparse'
4
+ require 'aws-sdk-s3'
5
+
6
+ options = {}
7
+ OptionParser.new do |opts|
8
+ opts.banner = "Usage: s3-copy options"
9
+
10
+ opts.on("-r", "--region=REGION", "AWS region to use (default us-east-1)") do |v|
11
+ options[:region] = v
12
+ end
13
+
14
+ opts.on("-p", "--param=KEY=VALUE", "Specify parameter for new files") do |v|
15
+ options[:params] ||= {}
16
+ k, v = v.split('=', 2)
17
+ options[:params][k.to_sym] = v
18
+ end
19
+
20
+ opts.on("-f", "--from=BUCKET:PATH", "Bucket name and key (or path) to copy from") do |v|
21
+ options[:from] = v
22
+ end
23
+
24
+ opts.on("-t", "--to=BUCKET:PATH", "Bucket name and key (or path) to write to (may be specified more than once)") do |v|
25
+ options[:to] ||= []
26
+ options[:to] << v
27
+ end
28
+ end.parse!
29
+
30
+ ENV['AWS_REGION'] ||= options[:region] || 'us-east-1'
31
+
32
+ bucket, key = options.fetch(:from).split(':', 2)
33
+
34
+ s3 = Aws::S3::Client.new
35
+
36
+ options.fetch(:to).each do |dest|
37
+ STDERR.puts "Copying to #{dest}"
38
+ dbucket, dkey = dest.split(':', 2)
39
+ s3.copy_object(
40
+ bucket: dbucket,
41
+ key: dkey,
42
+ copy_source: "/#{bucket}/#{key}",
43
+ **options[:params] || {},
44
+ )
45
+ end
@@ -0,0 +1,69 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'optparse'
4
+ require 'aws-sdk-s3'
5
+
6
+ options = {}
7
+ OptionParser.new do |opts|
8
+ opts.banner = "Usage: s3-upload options"
9
+
10
+ opts.on("-r", "--region=REGION", "AWS region to use (default us-east-1)") do |v|
11
+ options[:region] = v
12
+ end
13
+
14
+ opts.on("-p", "--param=KEY=VALUE", "Specify parameter for S3 upload") do |v|
15
+ options[:params] ||= {}
16
+ k, v = v.split('=', 2)
17
+ options[:params][k.to_sym] = v
18
+ end
19
+
20
+ opts.on("-f", "--file=PATH", "Path to the file to upload, - to upload standard input") do |v|
21
+ options[:file] = v
22
+ end
23
+
24
+ opts.on("-w", "--write=BUCKET:PATH", "Bucket name and key (or path) to upload to") do |v|
25
+ options[:write] = v
26
+ end
27
+
28
+ opts.on("-c", "--copy=BUCKET:PATH", "Bucket name and key (or path) to copy to (may be specified more than once)") do |v|
29
+ options[:copy] ||= []
30
+ options[:copy] << v
31
+ end
32
+ end.parse!
33
+
34
+ ENV['AWS_REGION'] ||= options[:region] || 'us-east-1'
35
+
36
+ def upload(f, options)
37
+ s3 = Aws::S3::Client.new
38
+ write = options.fetch(:write)
39
+ STDERR.puts "Writing #{write}"
40
+ bucket, key = write.split(':', 2)
41
+ s3.put_object(
42
+ body: f.read,
43
+ bucket: bucket,
44
+ key: key,
45
+ **options[:params] || {},
46
+ )
47
+ if copy = options[:copy]
48
+ copy.each do |dest|
49
+ STDERR.puts "Copying to #{dest}"
50
+ dbucket, dkey = dest.split(':', 2)
51
+ s3.copy_object(
52
+ bucket: dbucket,
53
+ key: dkey,
54
+ copy_source: "/#{bucket}/#{key}",
55
+ **options[:params] || {},
56
+ )
57
+ end
58
+ end
59
+ end
60
+
61
+ if options[:file] == '-'
62
+ upload(STDIN, options)
63
+ elsif options[:file]
64
+ File.open(options[:file]) do |f|
65
+ upload(f, options)
66
+ end
67
+ else
68
+ upload(STDIN, options)
69
+ end
@@ -0,0 +1,226 @@
1
+ # frozen_string_literal: true
2
+ # encoding: utf-8
3
+
4
+ # ClusterConfig requires ClientRegistry class provided by the host project.
5
+
6
+ require 'singleton'
7
+
8
+ module Mrss
9
+ class ClusterConfig
10
+ include Singleton
11
+ include RSpec::Core::Pending
12
+
13
+ def single_server?
14
+ determine_cluster_config
15
+ @single_server
16
+ end
17
+
18
+ def sharded_ish?
19
+ determine_cluster_config
20
+ @topology == :sharded || @topology == :load_balanced
21
+ end
22
+
23
+ def replica_set_name
24
+ determine_cluster_config
25
+ @replica_set_name
26
+ end
27
+
28
+ def server_version
29
+ determine_cluster_config
30
+ @server_version
31
+ end
32
+
33
+ def enterprise?
34
+ determine_cluster_config
35
+ @enterprise
36
+ end
37
+
38
+ def short_server_version
39
+ server_version.split('.')[0..1].join('.')
40
+ end
41
+
42
+ def fcv
43
+ determine_cluster_config
44
+ @fcv
45
+ end
46
+
47
+ # Per https://jira.mongodb.org/browse/SERVER-39052, working with FCV
48
+ # in sharded topologies is annoying. Also, FCV doesn't exist in servers
49
+ # less than 3.4. This method returns FCV on 3.4+ servers when in single
50
+ # or RS topologies, and otherwise returns the major.minor server version.
51
+ def fcv_ish
52
+ if server_version.nil?
53
+ raise "Deployment server version not known - check that connection to deployment succeeded"
54
+ end
55
+
56
+ if server_version >= '3.4' && !sharded_ish?
57
+ fcv
58
+ else
59
+ if short_server_version == '4.1'
60
+ '4.2'
61
+ else
62
+ short_server_version
63
+ end
64
+ end
65
+ end
66
+
67
+ # @return [ Mongo::Address ] The address of the primary in the deployment.
68
+ def primary_address
69
+ determine_cluster_config
70
+ @primary_address
71
+ end
72
+
73
+ def primary_address_str
74
+ determine_cluster_config
75
+ @primary_address.seed
76
+ end
77
+
78
+ def primary_address_host
79
+ both = primary_address_str
80
+ both.split(':').first
81
+ end
82
+
83
+ def primary_address_port
84
+ both = primary_address_str
85
+ both.split(':')[1] || 27017
86
+ end
87
+
88
+ def primary_description
89
+ determine_cluster_config
90
+ @primary_description
91
+ end
92
+
93
+ def server_parameters
94
+ determine_cluster_config
95
+ @server_parameters
96
+ end
97
+
98
+ # Try running a command on the admin database to see if the mongod was
99
+ # started with auth.
100
+ def auth_enabled?
101
+ if @auth_enabled.nil?
102
+ @auth_enabled = begin
103
+ basic_client.use(:admin).command(getCmdLineOpts: 1).first["argv"].include?("--auth")
104
+ rescue => e
105
+ e.message =~ /(not authorized)|(unauthorized)|(no users authenticated)|(requires authentication)/
106
+ end
107
+ end
108
+ @auth_enabled
109
+ end
110
+
111
+ def topology
112
+ determine_cluster_config
113
+ @topology
114
+ end
115
+
116
+ def storage_engine
117
+ @storage_engine ||= begin
118
+ # 2.6 does not have wired tiger
119
+ if short_server_version == '2.6'
120
+ :mmapv1
121
+ else
122
+ client = ClientRegistry.instance.global_client('root_authorized')
123
+ if sharded_ish?
124
+ shards = client.use(:admin).command(listShards: 1).first
125
+ if shards['shards'].empty?
126
+ raise 'Shards are empty'
127
+ end
128
+ shard = shards['shards'].first
129
+ address_str = shard['host'].sub(/^.*\//, '').sub(/,.*/, '')
130
+ client = ClusterTools.instance.direct_client(address_str,
131
+ SpecConfig.instance.test_options.merge(SpecConfig.instance.auth_options).merge(connect: :direct))
132
+ end
133
+ rv = client.use(:admin).command(serverStatus: 1).first
134
+ rv = rv['storageEngine']['name']
135
+ rv_map = {
136
+ 'wiredTiger' => :wired_tiger,
137
+ 'mmapv1' => :mmapv1,
138
+ }
139
+ rv_map[rv] || rv
140
+ end
141
+ end
142
+ end
143
+
144
+ # This method returns an alternate address for connecting to the configured
145
+ # deployment. For example, if the replica set is configured with nodes at
146
+ # of localhost:27017 and so on, this method will return 127.0.0.:27017.
147
+ #
148
+ # Note that the "alternate" refers to replica set configuration, not the
149
+ # addresses specified in test suite configuration. If the deployment topology
150
+ # is not a replica set, "alternate" refers to test suite configuration as
151
+ # this is the only configuration available.
152
+ def alternate_address
153
+ @alternate_address ||= begin
154
+ address = primary_address_host
155
+ str = case address
156
+ when '127.0.0.1'
157
+ 'localhost'
158
+ when /^(\d+\.){3}\d+$/
159
+ skip 'This test requires a hostname or 127.0.0.1 as address'
160
+ else
161
+ # We don't know if mongod is listening on ipv4 or ipv6, in principle.
162
+ # Our tests use ipv4, so hardcode that for now.
163
+ # To support both we need to try both addresses which will make this
164
+ # test more complicated.
165
+ #
166
+ # JRuby chokes on primary_address_port as the port (e.g. 27017).
167
+ # Since the port does not actually matter, use a common port like 80.
168
+ resolved_address = Addrinfo.getaddrinfo(address, 80, Socket::PF_INET).first.ip_address
169
+ if resolved_address.include?(':')
170
+ "[#{resolved_address}]"
171
+ else
172
+ resolved_address
173
+ end
174
+ end + ":#{primary_address_port}"
175
+ Mongo::Address.new(str)
176
+ end
177
+ end
178
+
179
+ private
180
+
181
+ def determine_cluster_config
182
+ return if @primary_address
183
+
184
+ # Run all commands to figure out the cluster configuration from the same
185
+ # client. This is somewhat wasteful when running a single test, but reduces
186
+ # test runtime for the suite overall because all commands are sent on the
187
+ # same connection rather than each command connecting to the cluster by
188
+ # itself.
189
+ client = ClientRegistry.instance.global_client('root_authorized')
190
+
191
+ primary = client.cluster.next_primary
192
+ @primary_address = primary.address
193
+ @primary_description = primary.description
194
+ @replica_set_name = client.cluster.topology.replica_set_name
195
+
196
+ @topology ||= begin
197
+ topology = client.cluster.topology.class.name.sub(/.*::/, '')
198
+ topology = topology.gsub(/([A-Z])/) { |match| '_' + match.downcase }.sub(/^_/, '')
199
+ if topology =~ /^replica_set/
200
+ topology = 'replica_set'
201
+ end
202
+ topology.to_sym
203
+ end
204
+
205
+ @single_server = client.cluster.servers_list.length == 1
206
+
207
+ build_info = client.database.command(buildInfo: 1).first
208
+
209
+ @server_version = build_info['version']
210
+ @enterprise = build_info['modules'] && build_info['modules'].include?('enterprise')
211
+
212
+ @server_parameters = client.use(:admin).command(getParameter: '*').first
213
+
214
+ if !sharded_ish? && short_server_version >= '3.4'
215
+ rv = @server_parameters['featureCompatibilityVersion']
216
+ @fcv = rv['version'] || rv
217
+ end
218
+ end
219
+
220
+ def basic_client
221
+ # Do not cache the result here so that if the client gets closed,
222
+ # client registry reconnects it in subsequent tests
223
+ ClientRegistry.instance.global_client('basic')
224
+ end
225
+ end
226
+ end
@@ -52,7 +52,7 @@ module Mrss
52
52
  end
53
53
 
54
54
  def require_topology(*topologies)
55
- invalid_topologies = topologies - [:single, :replica_set, :sharded]
55
+ invalid_topologies = topologies - [:single, :replica_set, :sharded, :load_balanced]
56
56
 
57
57
  unless invalid_topologies.empty?
58
58
  raise ArgumentError, "Invalid topologies requested: #{invalid_topologies.join(', ')}"
@@ -82,7 +82,7 @@ module Mrss
82
82
  unless ClusterConfig.instance.server_version >= '4.0'
83
83
  skip 'Transactions tests in a replica set topology require server 4.0+'
84
84
  end
85
- when :sharded
85
+ when :sharded, :load_balanced
86
86
  unless ClusterConfig.instance.server_version >= '4.2'
87
87
  skip 'Transactions tests in a sharded cluster topology require server 4.2+'
88
88
  end
@@ -113,6 +113,14 @@ module Mrss
113
113
  end
114
114
  end
115
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
+
116
124
  def require_no_retry_writes
117
125
  before(:all) do
118
126
  if SpecConfig.instance.retry_writes?
@@ -147,6 +155,33 @@ module Mrss
147
155
  end
148
156
  end
149
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
+
150
185
  def require_no_compression
151
186
  before(:all) do
152
187
  if SpecConfig.instance.compressors
@@ -214,7 +249,9 @@ module Mrss
214
249
  # (mongos 4.0+ overrides the write concern)
215
250
  def require_set_write_concern
216
251
  before(:all) do
217
- if ClusterConfig.instance.topology == :sharded && ClusterConfig.instance.short_server_version >= '4.0'
252
+ if %i(sharded load_balanced).include?(ClusterConfig.instance.topology) &&
253
+ ClusterConfig.instance.short_server_version >= '4.0'
254
+ then
218
255
  skip "mongos 4.0+ overrides write concern"
219
256
  end
220
257
  end
@@ -238,7 +275,9 @@ module Mrss
238
275
 
239
276
  def require_wired_tiger
240
277
  before(:all) do
241
- if ClusterConfig.instance.storage_engine != :wired_tiger
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
242
281
  skip 'Test requires WiredTiger storage engine'
243
282
  end
244
283
  end
@@ -247,7 +286,9 @@ module Mrss
247
286
  def require_wired_tiger_on_36
248
287
  before(:all) do
249
288
  if ClusterConfig.instance.short_server_version >= '3.6'
250
- if ClusterConfig.instance.storage_engine != :wired_tiger
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
251
292
  skip 'Test requires WiredTiger storage engine on 3.6+ servers'
252
293
  end
253
294
  end
@@ -256,7 +297,7 @@ module Mrss
256
297
 
257
298
  def require_mmapv1
258
299
  before(:all) do
259
- if ClusterConfig.instance.storage_engine != :mmapv1
300
+ if SpecConfig.instance.serverless? || ClusterConfig.instance.storage_engine != :mmapv1
260
301
  skip 'Test requires MMAPv1 storage engine'
261
302
  end
262
303
  end
@@ -299,5 +340,29 @@ module Mrss
299
340
  end
300
341
  end
301
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
302
367
  end
303
368
  end