mongoid 7.0.4 → 7.0.10

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 (100) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data.tar.gz.sig +0 -0
  4. data/LICENSE +1 -0
  5. data/README.md +3 -2
  6. data/Rakefile +26 -0
  7. data/lib/mongoid.rb +2 -1
  8. data/lib/mongoid/association/embedded/embeds_many.rb +2 -1
  9. data/lib/mongoid/association/embedded/embeds_one.rb +2 -1
  10. data/lib/mongoid/association/proxy.rb +1 -1
  11. data/lib/mongoid/atomic.rb +13 -3
  12. data/lib/mongoid/atomic/paths/embedded.rb +1 -1
  13. data/lib/mongoid/attributes.rb +28 -20
  14. data/lib/mongoid/attributes/dynamic.rb +15 -14
  15. data/lib/mongoid/clients/sessions.rb +20 -4
  16. data/lib/mongoid/config/environment.rb +21 -8
  17. data/lib/mongoid/criteria.rb +7 -1
  18. data/lib/mongoid/criteria/modifiable.rb +13 -2
  19. data/lib/mongoid/criteria/queryable/extensions/numeric.rb +1 -1
  20. data/lib/mongoid/criteria/queryable/extensions/regexp.rb +3 -3
  21. data/lib/mongoid/criteria/queryable/extensions/time.rb +1 -1
  22. data/lib/mongoid/criteria/queryable/extensions/time_with_zone.rb +12 -0
  23. data/lib/mongoid/criteria/queryable/key.rb +67 -8
  24. data/lib/mongoid/criteria/queryable/mergeable.rb +5 -4
  25. data/lib/mongoid/criteria/queryable/selectable.rb +3 -4
  26. data/lib/mongoid/criteria/queryable/selector.rb +9 -31
  27. data/lib/mongoid/extensions/hash.rb +4 -2
  28. data/lib/mongoid/extensions/regexp.rb +1 -1
  29. data/lib/mongoid/extensions/string.rb +2 -2
  30. data/lib/mongoid/fields.rb +2 -1
  31. data/lib/mongoid/matchable.rb +14 -15
  32. data/lib/mongoid/matchable/all.rb +4 -3
  33. data/lib/mongoid/matchable/default.rb +71 -24
  34. data/lib/mongoid/matchable/regexp.rb +2 -2
  35. data/lib/mongoid/persistable/pushable.rb +11 -2
  36. data/lib/mongoid/persistence_context.rb +6 -6
  37. data/lib/mongoid/positional.rb +1 -1
  38. data/lib/mongoid/query_cache.rb +24 -11
  39. data/lib/mongoid/validatable/macros.rb +1 -1
  40. data/lib/mongoid/validatable/uniqueness.rb +1 -1
  41. data/lib/mongoid/version.rb +2 -1
  42. data/lib/rails/generators/mongoid/model/templates/model.rb.tt +1 -1
  43. data/spec/README.md +18 -0
  44. data/spec/app/models/delegating_patient.rb +16 -0
  45. data/spec/integration/app_spec.rb +192 -0
  46. data/spec/integration/associations/embedded_spec.rb +62 -0
  47. data/spec/integration/criteria/date_field_spec.rb +41 -0
  48. data/spec/integration/criteria/time_with_zone_spec.rb +32 -0
  49. data/spec/integration/document_spec.rb +22 -0
  50. data/spec/integration/matchable_spec.rb +680 -0
  51. data/spec/lite_spec_helper.rb +15 -5
  52. data/spec/mongoid/association/embedded/embeds_many_models.rb +53 -0
  53. data/spec/mongoid/association/embedded/embeds_many_spec.rb +10 -0
  54. data/spec/mongoid/association/embedded/embeds_one_spec.rb +0 -2
  55. data/spec/mongoid/association/referenced/has_and_belongs_to_many/proxy_spec.rb +140 -1
  56. data/spec/mongoid/association/referenced/has_many/enumerable_spec.rb +105 -0
  57. data/spec/mongoid/association/referenced/has_many/proxy_spec.rb +2 -1
  58. data/spec/mongoid/attributes/dynamic_spec.rb +153 -0
  59. data/spec/mongoid/attributes_spec.rb +19 -7
  60. data/spec/mongoid/clients/factory_spec.rb +2 -2
  61. data/spec/mongoid/clients/options_spec.rb +4 -4
  62. data/spec/mongoid/clients/sessions_spec.rb +20 -7
  63. data/spec/mongoid/clients/transactions_spec.rb +36 -15
  64. data/spec/mongoid/clients_spec.rb +2 -2
  65. data/spec/mongoid/contextual/atomic_spec.rb +20 -10
  66. data/spec/mongoid/contextual/geo_near_spec.rb +12 -2
  67. data/spec/mongoid/contextual/map_reduce_spec.rb +20 -5
  68. data/spec/mongoid/contextual/mongo_spec.rb +76 -53
  69. data/spec/mongoid/criteria/modifiable_spec.rb +59 -10
  70. data/spec/mongoid/criteria/queryable/extensions/numeric_spec.rb +54 -0
  71. data/spec/mongoid/criteria/queryable/extensions/regexp_spec.rb +7 -7
  72. data/spec/mongoid/criteria/queryable/extensions/string_spec.rb +1 -1
  73. data/spec/mongoid/criteria/queryable/extensions/time_spec.rb +19 -7
  74. data/spec/mongoid/criteria/queryable/extensions/time_with_zone_spec.rb +28 -1
  75. data/spec/mongoid/criteria/queryable/key_spec.rb +48 -6
  76. data/spec/mongoid/criteria/queryable/selectable_logical_spec.rb +762 -0
  77. data/spec/mongoid/criteria/queryable/selectable_spec.rb +5 -224
  78. data/spec/mongoid/criteria/queryable/selector_spec.rb +37 -0
  79. data/spec/mongoid/criteria_spec.rb +7 -2
  80. data/spec/mongoid/document_fields_spec.rb +88 -0
  81. data/spec/mongoid/document_persistence_context_spec.rb +33 -0
  82. data/spec/mongoid/indexable_spec.rb +6 -4
  83. data/spec/mongoid/matchable/default_spec.rb +10 -3
  84. data/spec/mongoid/matchable/regexp_spec.rb +2 -2
  85. data/spec/mongoid/matchable_spec.rb +2 -2
  86. data/spec/mongoid/persistable/pushable_spec.rb +55 -1
  87. data/spec/mongoid/query_cache_spec.rb +62 -8
  88. data/spec/mongoid/relations/proxy_spec.rb +1 -1
  89. data/spec/mongoid/scopable_spec.rb +2 -1
  90. data/spec/mongoid/tasks/database_rake_spec.rb +13 -13
  91. data/spec/mongoid/tasks/database_spec.rb +1 -1
  92. data/spec/mongoid/validatable/uniqueness_spec.rb +33 -6
  93. data/spec/spec_helper.rb +4 -37
  94. data/spec/support/child_process_helper.rb +76 -0
  95. data/spec/support/cluster_config.rb +158 -0
  96. data/spec/support/constraints.rb +201 -30
  97. data/spec/support/expectations.rb +17 -3
  98. data/spec/support/spec_config.rb +12 -4
  99. metadata +490 -454
  100. metadata.gz.sig +0 -0
@@ -133,7 +133,7 @@ describe "Mongoid::Tasks::Database" do
133
133
  expect(removed_indexes).to be_empty
134
134
  end
135
135
 
136
- context 'when the index is a text index', if: non_legacy_server? do
136
+ context 'when the index is a text index' do
137
137
 
138
138
  before do
139
139
  class Band
@@ -796,20 +796,47 @@ describe Mongoid::Validatable::UniquenessValidator do
796
796
  end
797
797
  end
798
798
 
799
- context "when a range scope is provided" do
799
+ context "when a range condition is provided" do
800
800
 
801
801
  before do
802
- Dictionary.validates_uniqueness_of(:name, :scope => Dictionary.where(:year.gte => 1900, :year.lt => 2000))
803
- Dictionary.create(name: "French-English", year: 1950)
804
- Dictionary.create(name: "French-English", year: 1960)
802
+ Dictionary.validates_uniqueness_of(:name,
803
+ conditions: -> { Dictionary.where(:year.gte => 1900, :year.lt => 2000) })
805
804
  end
806
805
 
807
806
  after do
808
807
  Dictionary.reset_callbacks(:validate)
809
808
  end
810
809
 
811
- it "successfully prevents uniqueness violation" do
812
- expect(Dictionary.all.size).to eq(1)
810
+ context 'when multiple documents would match the condition' do
811
+ it "prevents creation of new document" do
812
+ Dictionary.create!(name: "French-English", year: 1950)
813
+
814
+ expect do
815
+ Dictionary.create!(name: "French-English", year: 1960)
816
+ end.to raise_error(Mongoid::Errors::Validations, /Name is already taken/)
817
+
818
+ expect(Dictionary.all.size).to eq(1)
819
+ end
820
+ end
821
+
822
+ context 'when only new document would match the condition' do
823
+ it 'creates the new document' do
824
+ Dictionary.create!(name: "French-English", year: 950)
825
+ expect do
826
+ Dictionary.create!(name: "French-English", year: 1950)
827
+ end.not_to raise_error
828
+ end
829
+ end
830
+
831
+ context 'when only existing document matches the condition' do
832
+ it 'creates the new document' do
833
+ pending 'https://jira.mongodb.org/browse/MONGOID-4815'
834
+
835
+ Dictionary.create!(name: "French-English", year: 1950)
836
+ expect do
837
+ Dictionary.create!(name: "French-English", year: 950)
838
+ end.not_to raise_error
839
+ end
813
840
  end
814
841
  end
815
842
 
@@ -31,6 +31,7 @@ end
31
31
  require 'support/authorization'
32
32
  require 'support/expectations'
33
33
  require 'support/macros'
34
+ require 'support/cluster_config'
34
35
  require 'support/constraints'
35
36
 
36
37
  # Give MongoDB time to start up on the travis ci environment.
@@ -74,42 +75,6 @@ CONFIG = {
74
75
  }
75
76
  }
76
77
 
77
- def non_legacy_server?
78
- Mongoid::Clients.default.cluster.servers.first.features.write_command_enabled?
79
- end
80
-
81
- def testing_replica_set?
82
- Mongoid::Clients.default.cluster.replica_set?
83
- end
84
-
85
- def collation_supported?
86
- Mongoid::Clients.default.cluster.next_primary.features.collation_enabled?
87
- end
88
- alias :decimal128_supported? :collation_supported?
89
-
90
- def array_filters_supported?
91
- Mongoid::Clients.default.cluster.next_primary.features.array_filters_enabled?
92
- end
93
- alias :sessions_supported? :array_filters_supported?
94
-
95
- def testing_geo_near?
96
- $geo_near_enabled ||= (Mongoid::Clients.default
97
- .command(serverStatus: 1)
98
- .first['version'] < '4.1')
99
- end
100
-
101
- def transactions_supported?
102
- Mongoid::Clients.default.cluster.next_primary.features.transactions_enabled?
103
- end
104
-
105
- def testing_transactions?
106
- transactions_supported? && testing_replica_set?
107
- end
108
-
109
- def testing_locally?
110
- !(ENV['CI'] == 'travis')
111
- end
112
-
113
78
  # Set the database that the spec suite connects to.
114
79
  Mongoid.configure do |config|
115
80
  config.load_configuration(CONFIG)
@@ -164,7 +129,9 @@ RSpec.configure do |config|
164
129
 
165
130
  # Drop all collections and clear the identity map before each spec.
166
131
  config.before(:each) do
167
- unless Mongoid.default_client.cluster.connected?
132
+ cluster = Mongoid.default_client.cluster
133
+ # Older drivers do not have a #connected? method
134
+ if cluster.respond_to?(:connected?) && !cluster.connected?
168
135
  Mongoid.default_client.reconnect
169
136
  end
170
137
  Mongoid.default_client.collections.each do |coll|
@@ -0,0 +1,76 @@
1
+ # frozen_string_literal: true
2
+ # encoding: utf-8
3
+
4
+ autoload :ChildProcess, 'childprocess'
5
+ autoload :Tempfile, 'tempfile'
6
+
7
+ module ChildProcessHelper
8
+ module_function def call(cmd, env: nil, cwd: nil)
9
+ process = ChildProcess.new(*cmd)
10
+ process.io.inherit!
11
+ if cwd
12
+ process.cwd = cwd
13
+ end
14
+ if env
15
+ env.each do |k, v|
16
+ process.environment[k.to_s] = v
17
+ end
18
+ end
19
+ process.start
20
+ process.wait
21
+ process
22
+ end
23
+
24
+ module_function def check_call(cmd, env: nil, cwd: nil)
25
+ process = call(cmd, env: env, cwd: cwd)
26
+ unless process.exit_code == 0
27
+ raise "Failed to execute: #{cmd}"
28
+ end
29
+ end
30
+
31
+ module_function def get_output(cmd, env: nil, cwd: nil)
32
+ process = ChildProcess.new(*cmd)
33
+ process.io.inherit!
34
+ if cwd
35
+ process.cwd = cwd
36
+ end
37
+ if env
38
+ env.each do |k, v|
39
+ process.environment[k.to_s] = v
40
+ end
41
+ end
42
+
43
+ output = ''
44
+ r, w = IO.pipe
45
+
46
+ begin
47
+ process.io.stdout = w
48
+ process.start
49
+ w.close
50
+
51
+ thread = Thread.new do
52
+ begin
53
+ loop do
54
+ output << r.readpartial(16384)
55
+ end
56
+ rescue EOFError
57
+ end
58
+ end
59
+
60
+ process.wait
61
+ thread.join
62
+ ensure
63
+ r.close
64
+ end
65
+
66
+ [process, output]
67
+ end
68
+
69
+ module_function def check_output(*args)
70
+ process, output = get_output(*args)
71
+ unless process.exit_code == 0
72
+ raise "Failed to execute: #{args}"
73
+ end
74
+ output
75
+ end
76
+ end
@@ -0,0 +1,158 @@
1
+ # frozen_string_literal: true
2
+ # encoding: utf-8
3
+
4
+ require 'singleton'
5
+
6
+ class ClusterConfig
7
+ include Singleton
8
+
9
+ def single_server?
10
+ determine_cluster_config
11
+ @single_server
12
+ end
13
+
14
+ def replica_set_name
15
+ determine_cluster_config
16
+ @replica_set_name
17
+ end
18
+
19
+ def server_version
20
+ determine_cluster_config
21
+ @server_version
22
+ end
23
+
24
+ def short_server_version
25
+ server_version.split('.')[0..1].join('.')
26
+ end
27
+
28
+ def fcv
29
+ determine_cluster_config
30
+ @fcv
31
+ end
32
+
33
+ # Per https://jira.mongodb.org/browse/SERVER-39052, working with FCV
34
+ # in sharded topologies is annoying. Also, FCV doesn't exist in servers
35
+ # less than 3.4. This method returns FCV on 3.4+ servers when in single
36
+ # or RS topologies, and otherwise returns the major.minor server version.
37
+ def fcv_ish
38
+ if server_version >= '3.4' && topology != :sharded
39
+ fcv
40
+ else
41
+ if short_server_version == '4.1'
42
+ '4.2'
43
+ else
44
+ short_server_version
45
+ end
46
+ end
47
+ end
48
+
49
+ def primary_address
50
+ determine_cluster_config
51
+ @primary_address
52
+ end
53
+
54
+ def primary_address_str
55
+ determine_cluster_config
56
+ @primary_address.seed
57
+ end
58
+
59
+ def primary_address_host
60
+ both = primary_address_str
61
+ both.split(':').first
62
+ end
63
+
64
+ def primary_address_port
65
+ both = primary_address_str
66
+ both.split(':')[1] || 27017
67
+ end
68
+
69
+ def primary_description
70
+ determine_cluster_config
71
+ @primary_description
72
+ end
73
+
74
+ # Try running a command on the admin database to see if the mongod was
75
+ # started with auth.
76
+ def auth_enabled?
77
+ if @auth_enabled.nil?
78
+ @auth_enabled = begin
79
+ basic_client.use(:admin).command(getCmdLineOpts: 1).first["argv"].include?("--auth")
80
+ rescue => e
81
+ e.message =~ /(not authorized)|(unauthorized)|(no users authenticated)|(requires authentication)/
82
+ end
83
+ end
84
+ @auth_enabled
85
+ end
86
+
87
+ def topology
88
+ determine_cluster_config
89
+ @topology
90
+ end
91
+
92
+ def storage_engine
93
+ @storage_engine ||= begin
94
+ # 2.6 does not have wired tiger
95
+ if short_server_version == '2.6'
96
+ :mmapv1
97
+ else
98
+ client = ClientRegistry.instance.global_client('root_authorized')
99
+ if topology == :sharded
100
+ shards = client.use(:admin).command(listShards: 1).first
101
+ shard = shards['shards'].first
102
+ address_str = shard['host'].sub(/\A.*\//, '').sub(/,.*/, '')
103
+ client = ClusterTools.instance.direct_client(address_str,
104
+ SpecConfig.instance.test_options.merge(SpecConfig.instance.auth_options).merge(connect: :direct))
105
+ end
106
+ rv = client.use(:admin).command(serverStatus: 1).first
107
+ rv = rv['storageEngine']['name']
108
+ rv_map = {
109
+ 'wiredTiger' => :wired_tiger,
110
+ 'mmapv1' => :mmapv1,
111
+ }
112
+ rv_map[rv] || rv
113
+ end
114
+ end
115
+ end
116
+
117
+ private
118
+
119
+ def determine_cluster_config
120
+ return if @primary_address
121
+
122
+ # Run all commands to figure out the cluster configuration from the same
123
+ # client. This is somewhat wasteful when running a single test, but reduces
124
+ # test runtime for the suite overall because all commands are sent on the
125
+ # same connection rather than each command connecting to the cluster by
126
+ # itself.
127
+ client = Mongoid::Clients.default
128
+
129
+ primary = client.cluster.next_primary
130
+ @primary_address = primary.address
131
+ @primary_description = primary.description
132
+ @replica_set_name = client.cluster.topology.replica_set_name
133
+
134
+ @topology ||= begin
135
+ topology = client.cluster.topology.class.name.sub(/.*::/, '')
136
+ topology = topology.gsub(/([A-Z])/) { |match| '_' + match.downcase }.sub(/\A_/, '')
137
+ if topology =~ /\Areplica_set/
138
+ topology = 'replica_set'
139
+ end
140
+ topology.to_sym
141
+ end
142
+
143
+ @single_server = client.cluster.send(:servers_list).length == 1
144
+
145
+ @server_version = client.database.command(buildInfo: 1).first['version']
146
+
147
+ if @topology != :sharded && short_server_version >= '3.4'
148
+ rv = client.use(:admin).command(getParameter: 1, featureCompatibilityVersion: 1).first['featureCompatibilityVersion']
149
+ @fcv = rv['version'] || rv
150
+ end
151
+ end
152
+
153
+ def basic_client
154
+ # Do not cache the result here so that if the client gets closed,
155
+ # client registry reconnects it in subsequent tests
156
+ ClientRegistry.instance.global_client('basic')
157
+ end
158
+ end
@@ -1,12 +1,31 @@
1
+ # frozen_string_literal: true
2
+ # encoding: utf-8
3
+
1
4
  module Constraints
2
5
  RAILS_VERSION = ActiveSupport.version.to_s.split('.')[0..1].join('.').freeze
3
6
 
7
+ def require_driver_query_cache
8
+ before(:all) do
9
+ if !defined?(Mongo::QueryCache)
10
+ skip "Driver version #{Mongo::VERSION} does not support query cache"
11
+ end
12
+ end
13
+ end
14
+
15
+ def require_mongoid_query_cache
16
+ before (:all) do
17
+ if defined?(Mongo::QueryCache)
18
+ skip "Mongoid uses the driver query cache in driver versions that support it"
19
+ end
20
+ end
21
+ end
22
+
4
23
  def min_rails_version(version)
5
- unless version =~ /^\d+\.\d+$/
24
+ unless version =~ /\A\d+\.\d+\z/
6
25
  raise ArgumentError, "Version can only be major.minor: #{version}"
7
26
  end
8
27
 
9
- before do
28
+ before(:all) do
10
29
  if version > RAILS_VERSION
11
30
  skip "Rails version #{version} or higher required, we have #{RAILS_VERSION}"
12
31
  end
@@ -14,11 +33,11 @@ module Constraints
14
33
  end
15
34
 
16
35
  def max_rails_version(version)
17
- unless version =~ /^\d+\.\d+$/
36
+ unless version =~ /\A\d+\.\d+\z/
18
37
  raise ArgumentError, "Version can only be major.minor: #{version}"
19
38
  end
20
39
 
21
- before do
40
+ before(:all) do
22
41
  if version < RAILS_VERSION
23
42
  skip "Rails version #{version} or lower required, we have #{RAILS_VERSION}"
24
43
  end
@@ -26,11 +45,11 @@ module Constraints
26
45
  end
27
46
 
28
47
  def min_server_version(version)
29
- unless version =~ /^\d+\.\d+$/
48
+ unless version =~ /\A\d+\.\d+\z/
30
49
  raise ArgumentError, "Version can only be major.minor: #{version}"
31
50
  end
32
51
 
33
- before do
52
+ before(:all) do
34
53
  if version > ClusterConfig.instance.server_version
35
54
  skip "Server version #{version} or higher required, we have #{ClusterConfig.instance.server_version}"
36
55
  end
@@ -38,11 +57,11 @@ module Constraints
38
57
  end
39
58
 
40
59
  def max_server_version(version)
41
- unless version =~ /^\d+\.\d+$/
60
+ unless version =~ /\A\d+\.\d+\z/
42
61
  raise ArgumentError, "Version can only be major.minor: #{version}"
43
62
  end
44
63
 
45
- before do
64
+ before(:all) do
46
65
  if version < ClusterConfig.instance.short_server_version
47
66
  skip "Server version #{version} or lower required, we have #{ClusterConfig.instance.server_version}"
48
67
  end
@@ -50,18 +69,14 @@ module Constraints
50
69
  end
51
70
 
52
71
  def require_topology(*topologies)
53
- topologies = topologies.map { |t| t.to_s }
54
- invalid_topologies = topologies - %w(single replica_set sharded)
72
+ invalid_topologies = topologies - [:single, :replica_set, :sharded]
73
+
55
74
  unless invalid_topologies.empty?
56
75
  raise ArgumentError, "Invalid topologies requested: #{invalid_topologies.join(', ')}"
57
76
  end
58
- before do
59
- topology = Mongoid.default_client.cluster.topology.class.name.sub(/.*::/, '')
60
- topology = topology.gsub(/([A-Z])/) { |match| '_' + match.downcase }.sub(/^_/, '')
61
- if topology =~ /^replica_set/
62
- topology = 'replica_set'
63
- end
64
- unless topologies.include?(topology)
77
+
78
+ before(:all) do
79
+ unless topologies.include?(topology = ClusterConfig.instance.topology)
65
80
  skip "Topology #{topologies.join(' or ')} required, we have #{topology}"
66
81
  end
67
82
  end
@@ -69,32 +84,188 @@ module Constraints
69
84
 
70
85
  def max_example_run_time(timeout)
71
86
  around do |example|
72
- TimeoutInterrupt.timeout(timeout) do
87
+ TimeoutInterrupt.timeout(timeout, TimeoutInterrupt::Error.new("Test execution terminated after #{timeout} seconds")) do
73
88
  example.run
74
89
  end
75
90
  end
76
91
  end
77
92
 
78
93
  def require_transaction_support
79
- min_server_version '4.0'
80
- require_topology :replica_set
94
+ before(:all) do
95
+ case ClusterConfig.instance.topology
96
+ when :single
97
+ skip 'Transactions tests require a replica set (4.0+) or a sharded cluster (4.2+)'
98
+ when :replica_set
99
+ unless ClusterConfig.instance.server_version >= '4.0'
100
+ skip 'Transactions tests in a replica set topology require server 4.0+'
101
+ end
102
+ when :sharded
103
+ unless ClusterConfig.instance.server_version >= '4.2'
104
+ skip 'Transactions tests in a sharded cluster topology require server 4.2+'
105
+ end
106
+ else
107
+ raise NotImplementedError
108
+ end
109
+ end
81
110
  end
82
111
 
83
- def require_scram_sha_256_support
84
- before do
85
- $mongo_server_features ||= begin
86
- scanned_client_server!.features
112
+ def require_tls
113
+ before(:all) do
114
+ unless SpecConfig.instance.ssl?
115
+ skip "SSL not enabled"
87
116
  end
88
- unless $mongo_server_features.scram_sha_256_enabled?
89
- skip "SCRAM SHA 256 is not enabled on the server"
117
+ end
118
+ end
119
+
120
+ def require_no_tls
121
+ before(:all) do
122
+ if SpecConfig.instance.ssl?
123
+ skip "SSL enabled"
90
124
  end
91
125
  end
92
126
  end
93
127
 
94
- def require_ssl
95
- before do
96
- unless SpecConfig.instance.ssl?
97
- skip "SSL not enabled"
128
+ def require_local_tls
129
+ require_tls
130
+ end
131
+
132
+ def require_no_retry_writes
133
+ before(:all) do
134
+ if SpecConfig.instance.retry_writes?
135
+ skip "Retry writes is enabled"
136
+ end
137
+ end
138
+ end
139
+
140
+ def require_compression
141
+ before(:all) do
142
+ if SpecConfig.instance.compressors.nil?
143
+ skip "Compression is not enabled"
144
+ end
145
+ end
146
+ end
147
+
148
+ def require_no_compression
149
+ before(:all) do
150
+ if SpecConfig.instance.compressors
151
+ skip "Compression is enabled"
152
+ end
153
+ end
154
+ end
155
+
156
+ def ruby_version_gte(version)
157
+ before(:all) do
158
+ if RUBY_VERSION < version
159
+ skip "Ruby version #{version} or higher required"
160
+ end
161
+ end
162
+ end
163
+
164
+ def ruby_version_lt(version)
165
+ before(:all) do
166
+ if RUBY_VERSION >= version
167
+ skip "Ruby version less than #{version} required"
168
+ end
169
+ end
170
+ end
171
+
172
+ def require_auth
173
+ before(:all) do
174
+ unless ENV['AUTH'] == 'auth' || SpecConfig.instance.user || ClusterConfig.instance.auth_enabled?
175
+ skip "Auth required"
176
+ end
177
+ end
178
+ end
179
+
180
+ def require_no_auth
181
+ before(:all) do
182
+ if ENV['AUTH'] == 'auth' || SpecConfig.instance.user || ClusterConfig.instance.auth_enabled?
183
+ skip "Auth not allowed"
184
+ end
185
+ end
186
+ end
187
+
188
+ def require_no_x509_auth
189
+ before(:all) do
190
+ if SpecConfig.instance.x509_auth?
191
+ skip "X.509 auth not allowed"
192
+ end
193
+ end
194
+ end
195
+
196
+ # Can the driver specify a write concern that won't be overridden?
197
+ # (mongos 4.0+ overrides the write concern)
198
+ def require_set_write_concern
199
+ before(:all) do
200
+ if ClusterConfig.instance.topology == :sharded && ClusterConfig.instance.short_server_version >= '4.0'
201
+ skip "mongos 4.0+ overrides write concern"
202
+ end
203
+ end
204
+ end
205
+
206
+ def require_multi_shard
207
+ before(:all) do
208
+ if ClusterConfig.instance.topology == :sharded && SpecConfig.instance.addresses.length == 1
209
+ skip 'Test requires a minimum of two shards if run in sharded topology'
210
+ end
211
+ end
212
+ end
213
+
214
+ def require_no_multi_shard
215
+ before(:all) do
216
+ if ClusterConfig.instance.topology == :sharded && SpecConfig.instance.addresses.length > 1
217
+ skip 'Test requires a single shard if run in sharded topology'
218
+ end
219
+ end
220
+ end
221
+
222
+ def require_wired_tiger
223
+ before(:all) do
224
+ if ClusterConfig.instance.storage_engine != :wired_tiger
225
+ skip 'Test requires WiredTiger storage engine'
226
+ end
227
+ end
228
+ end
229
+
230
+ def require_wired_tiger_on_36
231
+ before(:all) do
232
+ if ClusterConfig.instance.short_server_version >= '3.6'
233
+ if ClusterConfig.instance.storage_engine != :wired_tiger
234
+ skip 'Test requires WiredTiger storage engine on 3.6+ servers'
235
+ end
236
+ end
237
+ end
238
+ end
239
+
240
+ def require_mmapv1
241
+ before(:all) do
242
+ if ClusterConfig.instance.storage_engine != :mmapv1
243
+ skip 'Test requires MMAPv1 storage engine'
244
+ end
245
+ end
246
+ end
247
+
248
+ def require_enterprise
249
+ before(:all) do
250
+ unless ClusterConfig.instance.enterprise?
251
+ skip 'Test requires enterprise build of MongoDB'
252
+ end
253
+ end
254
+ end
255
+
256
+ # Integration tests for SRV polling require internet connectivity to
257
+ # look up SRV records and a sharded cluster configured on default port on
258
+ # localhost (localhost:27017, localhost:27018).
259
+ def require_default_port_deployment
260
+ # Because the DNS records at test1.test.build.10gen.cc point to
261
+ # localhost:27017 & localhost:27018, the test suite must have been
262
+ # configured to use these addresses
263
+ before(:all) do
264
+ have_default_port = SpecConfig.instance.addresses.any? do |address|
265
+ %w(127.0.0.1 127.0.0.1:27017 localhost localhost:27017).include?(address)
266
+ end
267
+ unless have_default_port
268
+ skip 'This test requires the test suite to be configured for localhost:27017'
98
269
  end
99
270
  end
100
271
  end