mongo 2.12.0.rc0 → 2.12.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (93) 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 +2 -1
  5. data/lib/mongo/client.rb +23 -9
  6. data/lib/mongo/client_encryption.rb +1 -1
  7. data/lib/mongo/cluster.rb +6 -2
  8. data/lib/mongo/crypt/auto_decryption_context.rb +3 -5
  9. data/lib/mongo/crypt/auto_encrypter.rb +17 -7
  10. data/lib/mongo/crypt/binding.rb +446 -379
  11. data/lib/mongo/crypt/context.rb +4 -4
  12. data/lib/mongo/crypt/encryption_io.rb +16 -10
  13. data/lib/mongo/crypt/explicit_encrypter.rb +3 -3
  14. data/lib/mongo/crypt/explicit_encryption_context.rb +1 -1
  15. data/lib/mongo/crypt/handle.rb +26 -4
  16. data/lib/mongo/crypt/hooks.rb +1 -1
  17. data/lib/mongo/database.rb +11 -1
  18. data/lib/mongo/error/bulk_write_error.rb +16 -14
  19. data/lib/mongo/error/notable.rb +0 -15
  20. data/lib/mongo/error/parser.rb +1 -1
  21. data/lib/mongo/grid/file/info.rb +1 -1
  22. data/lib/mongo/monitoring/event/cmap/connection_check_out_failed.rb +1 -1
  23. data/lib/mongo/operation/insert/command.rb +3 -2
  24. data/lib/mongo/operation/insert/legacy.rb +2 -1
  25. data/lib/mongo/operation/insert/op_msg.rb +1 -1
  26. data/lib/mongo/operation/shared/executable.rb +9 -9
  27. data/lib/mongo/operation/shared/op_msg_or_command.rb +2 -2
  28. data/lib/mongo/operation/shared/read_preference_supported.rb +68 -19
  29. data/lib/mongo/operation/shared/response_handling.rb +1 -1
  30. data/lib/mongo/operation/shared/sessions_supported.rb +44 -3
  31. data/lib/mongo/protocol/bit_vector.rb +2 -1
  32. data/lib/mongo/protocol/message.rb +22 -7
  33. data/lib/mongo/protocol/msg.rb +2 -5
  34. data/lib/mongo/protocol/serializers.rb +32 -11
  35. data/lib/mongo/retryable.rb +1 -1
  36. data/lib/mongo/server/connection.rb +1 -1
  37. data/lib/mongo/server/connection_base.rb +9 -4
  38. data/lib/mongo/server/connection_pool/populator.rb +1 -1
  39. data/lib/mongo/session.rb +1 -1
  40. data/lib/mongo/srv/monitor.rb +73 -42
  41. data/lib/mongo/srv/result.rb +0 -1
  42. data/lib/mongo/uri.rb +1 -1
  43. data/lib/mongo/uri/srv_protocol.rb +1 -1
  44. data/lib/mongo/version.rb +1 -1
  45. data/mongo.gemspec +0 -2
  46. data/spec/README.md +106 -12
  47. data/spec/integration/client_construction_spec.rb +29 -5
  48. data/spec/integration/client_side_encryption/auto_encryption_bulk_writes_spec.rb +6 -4
  49. data/spec/integration/client_side_encryption/auto_encryption_command_monitoring_spec.rb +19 -17
  50. data/spec/integration/client_side_encryption/auto_encryption_mongocryptd_spawn_spec.rb +5 -4
  51. data/spec/integration/client_side_encryption/auto_encryption_old_wire_version_spec.rb +11 -8
  52. data/spec/integration/client_side_encryption/auto_encryption_reconnect_spec.rb +14 -9
  53. data/spec/integration/client_side_encryption/auto_encryption_spec.rb +46 -45
  54. data/spec/integration/client_side_encryption/bson_size_limit_spec.rb +11 -7
  55. data/spec/integration/client_side_encryption/bypass_mongocryptd_spawn_spec.rb +13 -9
  56. data/spec/integration/client_side_encryption/client_close_spec.rb +10 -6
  57. data/spec/integration/client_side_encryption/corpus_spec.rb +19 -14
  58. data/spec/integration/client_side_encryption/data_key_spec.rb +10 -8
  59. data/spec/integration/client_side_encryption/external_key_vault_spec.rb +12 -8
  60. data/spec/integration/client_side_encryption/views_spec.rb +6 -4
  61. data/spec/integration/client_update_spec.rb +36 -2
  62. data/spec/integration/crud_spec.rb +89 -0
  63. data/spec/integration/read_preference_spec.rb +26 -0
  64. data/spec/integration/srv_monitoring_spec.rb +2 -2
  65. data/spec/kerberos/kerberos_spec.rb +87 -0
  66. data/spec/lite_spec_helper.rb +4 -8
  67. data/spec/mongo/bulk_write/result_spec.rb +11 -7
  68. data/spec/mongo/client_encryption_spec.rb +3 -6
  69. data/spec/mongo/crypt/auto_encrypter_spec.rb +8 -3
  70. data/spec/mongo/crypt/handle_spec.rb +38 -4
  71. data/spec/mongo/error/bulk_write_error_spec.rb +49 -0
  72. data/spec/mongo/error/notable_spec.rb +59 -0
  73. data/spec/mongo/operation/find/legacy_spec.rb +1 -0
  74. data/spec/mongo/operation/read_preference_legacy_spec.rb +351 -0
  75. data/spec/mongo/operation/read_preference_op_msg_spec.rb +194 -0
  76. data/spec/mongo/srv/monitor_spec.rb +88 -69
  77. data/spec/runners/transactions.rb +5 -7
  78. data/spec/spec_tests/client_side_encryption_spec.rb +0 -5
  79. data/spec/spec_tests/data/client_side_encryption/bulk.yml +3 -0
  80. data/spec/spec_tests/data/client_side_encryption/replaceOne.yml +4 -1
  81. data/spec/spec_tests/data/client_side_encryption/updateOne.yml +3 -0
  82. data/spec/support/cluster_tools.rb +6 -1
  83. data/spec/support/crypt.rb +14 -0
  84. data/spec/support/lite_constraints.rb +3 -1
  85. data/spec/support/spec_config.rb +10 -0
  86. data/spec/support/utils.rb +9 -1
  87. metadata +15 -14
  88. metadata.gz.sig +0 -0
  89. data/lib/mongo/cluster/srv_monitor.rb +0 -127
  90. data/lib/mongo/srv/warning_result.rb +0 -35
  91. data/spec/enterprise_auth/kerberos_spec.rb +0 -58
  92. data/spec/mongo/cluster/srv_monitor_spec.rb +0 -214
  93. data/spec/mongo/operation/read_preference_spec.rb +0 -245
metadata.gz.sig CHANGED
Binary file
@@ -1,127 +0,0 @@
1
- # Copyright (C) 2019 MongoDB, Inc.
2
- #
3
- # Licensed under the Apache License, Version 2.0 (the "License");
4
- # you may not use this file except in compliance with the License.
5
- # You may obtain a copy of the License at
6
- #
7
- # http://www.apache.org/licenses/LICENSE-2.0
8
- #
9
- # Unless required by applicable law or agreed to in writing, software
10
- # distributed under the License is distributed on an "AS IS" BASIS,
11
- # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
- # See the License for the specific language governing permissions and
13
- # limitations under the License.
14
-
15
- module Mongo
16
- class Cluster
17
-
18
- # Periodically retrieves SRV records for the cluster's SRV URI, and
19
- # sets the cluster's server list to the SRV lookup result.
20
- #
21
- # If an error is encountered during SRV lookup or an SRV record is invalid
22
- # or disallowed for security reasons, a warning is logged and monitoring
23
- # continues.
24
- #
25
- # @api private
26
- class SrvMonitor
27
- include Loggable
28
- include BackgroundThread
29
-
30
- MIN_SCAN_INTERVAL = 60
31
-
32
- DEFAULT_TIMEOUT = 10
33
-
34
- # Creates the SRV monitor.
35
- #
36
- # @param [ Cluster ] cluster The cluster.
37
- # @param [ Hash ] options The cluster options.
38
- #
39
- # @option options [ Float ] :timeout The timeout to use for DNS lookups.
40
- # @option options [ URI::SRVProtocol ] :srv_uri The SRV URI to monitor.
41
- # @option options [ Hash ] :resolv_options For internal driver use only.
42
- # Options to pass through to Resolv::DNS constructor for SRV lookups.
43
- def initialize(cluster, options = nil)
44
- options = if options
45
- options.dup
46
- else
47
- {}
48
- end
49
- @cluster = cluster
50
- @resolver = Srv::Resolver.new(options)
51
- unless @srv_uri = options.delete(:srv_uri)
52
- raise ArgumentError, 'SRV URI is required'
53
- end
54
- @options = options.freeze
55
- @last_result = @srv_uri.srv_result
56
- @stop_semaphore = Semaphore.new
57
- end
58
-
59
- attr_reader :options
60
-
61
- attr_reader :cluster
62
-
63
- # @return [ Srv::Result ] Last known SRV lookup result. Used for
64
- # determining intervals between SRV lookups, which depend on SRV DNS
65
- # records' TTL values.
66
- attr_reader :last_result
67
-
68
- def start!
69
- super
70
- ObjectSpace.define_finalizer(self, self.class.finalize(@thread))
71
- end
72
-
73
- private
74
-
75
- def do_work
76
- scan!
77
- @stop_semaphore.wait(scan_interval)
78
- end
79
-
80
- def scan!
81
- old_hosts = last_result.address_strs
82
-
83
- begin
84
- last_result = Timeout.timeout(timeout) do
85
- @resolver.get_records(@srv_uri.query_hostname)
86
- end
87
- rescue Resolv::ResolvTimeout => e
88
- log_warn("SRV monitor: timed out trying to resolve hostname #{@srv_uri.query_hostname}: #{e.class}: #{e}")
89
- return
90
- rescue ::Timeout::Error
91
- log_warn("SRV monitor: timed out trying to resolve hostname #{@srv_uri.query_hostname} (timeout=#{timeout})")
92
- return
93
- rescue Resolv::ResolvError => e
94
- log_warn("SRV monitor: unable to resolve hostname #{@srv_uri.query_hostname}: #{e.class}: #{e}")
95
- return
96
- end
97
-
98
- if last_result.empty?
99
- log_warn("SRV monitor: hostname #{@srv_uri.query_hostname} resolved to zero records")
100
- return
101
- end
102
-
103
- @cluster.set_server_list(last_result.address_strs)
104
- end
105
-
106
- def self.finalize(thread)
107
- Proc.new do
108
- thread.kill
109
- end
110
- end
111
-
112
- def scan_interval
113
- if last_result.empty?
114
- [cluster.heartbeat_interval, MIN_SCAN_INTERVAL].min
115
- elsif last_result.min_ttl.nil?
116
- MIN_SCAN_INTERVAL
117
- else
118
- [last_result.min_ttl, MIN_SCAN_INTERVAL].max
119
- end
120
- end
121
-
122
- def timeout
123
- options[:timeout] || DEFAULT_TIMEOUT
124
- end
125
- end
126
- end
127
- end
@@ -1,35 +0,0 @@
1
- # Copyright (C) 2019 MongoDB, Inc.
2
- #
3
- # Licensed under the Apache License, Version 2.0 (the 'License');
4
- # you may not use this file except in compliance with the License.
5
- # You may obtain a copy of the License at
6
- #
7
- # http://www.apache.org/licenses/LICENSE-2.0
8
- #
9
- # Unless required by applicable law or agreed to in writing, software
10
- # distributed under the License is distributed on an 'AS IS' BASIS,
11
- # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
- # See the License for the specific language governing permissions and
13
- # limitations under the License.
14
-
15
- module Mongo
16
-
17
- module Srv
18
-
19
- # SRV record lookup result which warns on errors rather than raising
20
- # exceptions.
21
- #
22
- # @api private
23
- class WarningResult < Result
24
-
25
- # Adds a new record.
26
- #
27
- # @param [ Resolv::DNS::Resource ] record An SRV record found for the hostname.
28
- def add_record(record)
29
- super
30
- rescue Error::InvalidAddress, Error::MismatchedDomain => e
31
- log_warn(e.message)
32
- end
33
- end
34
- end
35
- end
@@ -1,58 +0,0 @@
1
- require 'mongo'
2
- require 'support/lite_constraints'
3
-
4
- RSpec.configure do |config|
5
- config.extend(LiteConstraints)
6
- end
7
-
8
- describe 'kerberos authentication' do
9
- require_mongo_kerberos
10
-
11
- let(:user) do
12
- "#{ENV['SASL_USER']}%40#{ENV['SASL_HOST'].upcase}"
13
- end
14
-
15
- let(:host) do
16
- "#{ENV['SASL_HOST']}"
17
- end
18
-
19
- let(:kerberos_db) do
20
- "#{ENV['KERBEROS_DB']}"
21
- end
22
-
23
- let(:auth_source) do
24
- "#{ENV['SASL_DB']}"
25
- end
26
-
27
- let(:uri) do
28
- uri = "mongodb://#{user}@#{host}/#{kerberos_db}?authMechanism=GSSAPI&authSource=#{auth_source}"
29
- end
30
-
31
- let(:client) do
32
- Mongo::Client.new(uri)
33
- end
34
-
35
- let(:doc) do
36
- client.database[:test].find.first
37
- end
38
-
39
- it 'correctly authenticates' do
40
- expect(doc['kerberos']).to eq(true)
41
- expect(doc['authenticated']).to eq('yeah')
42
- end
43
-
44
- context 'when canonicalize_host_name is true' do
45
- let(:host) do
46
- "#{ENV['IP_ADDR']}"
47
- end
48
-
49
- let(:uri) do
50
- uri = "mongodb://#{user}@#{host}/#{kerberos_db}?authMechanism=GSSAPI&authSource=#{auth_source}&authMechanismProperties=CANONICALIZE_HOST_NAME:true"
51
- end
52
-
53
- it 'correctly authenticates when using the IP' do
54
- expect(doc['kerberos']).to eq(true)
55
- expect(doc['authenticated']).to eq('yeah')
56
- end
57
- end
58
- end
@@ -1,214 +0,0 @@
1
- require 'lite_spec_helper'
2
-
3
- xdescribe Mongo::Cluster::SrvMonitor do
4
- describe '#scan!' do
5
- let(:hostname) do
6
- 'test1.test.build.10gen.cc.'
7
- end
8
-
9
- let(:hosts) do
10
- [
11
- 'localhost.test.build.10gen.cc.:27017',
12
- 'localhost.test.build.10gen.cc.:27018',
13
- ]
14
- end
15
-
16
- let(:records) do
17
- double('records').tap do |records|
18
- allow(records).to receive(:hostname).and_return(hostname)
19
- allow(records).to receive(:hosts).and_return(hosts)
20
- allow(records).to receive(:empty?).and_return(false)
21
- allow(records).to receive(:min_ttl).and_return(nil)
22
- end
23
- end
24
-
25
- let(:srv_uri) do
26
- Mongo::URI.get("mongodb+srv://localhost.a.b")
27
- end
28
-
29
- let(:cluster) do
30
- Mongo::Cluster.new(records.hosts, Mongo::Monitoring.new, { monitoring_io: false })
31
- end
32
-
33
- let(:monitoring) do
34
- described_class.new(cluster, srv_uri: srv_uri)
35
- end
36
-
37
- before do
38
- monitoring.scan!
39
- end
40
-
41
- context 'when a new DNS record is added' do
42
- let(:new_hosts) do
43
- hosts + ['test1.test.build.10gen.cc.:27019']
44
- end
45
-
46
- let(:new_records) do
47
- double('records').tap do |records|
48
- allow(records).to receive(:hostname).and_return(hostname)
49
- allow(records).to receive(:hosts).and_return(new_hosts)
50
- allow(records).to receive(:empty?).and_return(false)
51
- allow(records).to receive(:min_ttl).and_return(nil)
52
- end
53
- end
54
-
55
- let(:resolver) do
56
- double('resolver').tap do |resolver|
57
- allow(resolver).to receive(:get_records).and_return(new_records)
58
- end
59
- end
60
-
61
- it 'adds the new host to the cluster' do
62
- expect(cluster.addresses.map(&:to_s).sort).to eq(new_hosts.sort)
63
- end
64
- end
65
-
66
- context 'when a DNS record is removed' do
67
- let(:new_hosts) do
68
- hosts - ['test1.test.build.10gen.cc.:27018']
69
- end
70
-
71
- let(:new_records) do
72
- double('records').tap do |records|
73
- allow(records).to receive(:hostname).and_return(hostname)
74
- allow(records).to receive(:hosts).and_return(new_hosts)
75
- allow(records).to receive(:empty?).and_return(false)
76
- allow(records).to receive(:min_ttl).and_return(nil)
77
- end
78
- end
79
-
80
- let(:resolver) do
81
- double('resolver').tap do |resolver|
82
- allow(resolver).to receive(:get_records).and_return(new_records)
83
- end
84
- end
85
-
86
- it 'adds the new host to the cluster' do
87
- expect(cluster.addresses.map(&:to_s).sort).to eq(new_hosts.sort)
88
- end
89
- end
90
-
91
- context 'when a single DNS record is replaced' do
92
- let(:new_hosts) do
93
- hosts - ['test1.test.build.10gen.cc.:27018'] + ['test1.test.build.10gen.cc.:27019']
94
- end
95
-
96
- let(:new_records) do
97
- double('records').tap do |records|
98
- allow(records).to receive(:hostname).and_return(hostname)
99
- allow(records).to receive(:hosts).and_return(new_hosts)
100
- allow(records).to receive(:empty?).and_return(false)
101
- allow(records).to receive(:min_ttl).and_return(nil)
102
- end
103
- end
104
-
105
- let(:resolver) do
106
- double('resolver').tap do |resolver|
107
- allow(resolver).to receive(:get_records).and_return(new_records)
108
- end
109
- end
110
-
111
- it 'adds the new host to the cluster' do
112
- expect(cluster.addresses.map(&:to_s).sort).to eq(new_hosts.sort)
113
- end
114
- end
115
-
116
- context 'when all DNS records are replaced with a single record' do
117
- let(:new_hosts) do
118
- ['test1.test.build.10gen.cc.:27019']
119
- end
120
-
121
- let(:new_records) do
122
- double('records').tap do |records|
123
- allow(records).to receive(:hostname).and_return(hostname)
124
- allow(records).to receive(:hosts).and_return(new_hosts)
125
- allow(records).to receive(:empty?).and_return(false)
126
- allow(records).to receive(:min_ttl).and_return(nil)
127
- end
128
- end
129
-
130
- let(:resolver) do
131
- double('resolver').tap do |resolver|
132
- allow(resolver).to receive(:get_records).and_return(new_records)
133
- end
134
- end
135
-
136
- it 'adds the new host to the cluster' do
137
- expect(cluster.addresses.map(&:to_s).sort).to eq(new_hosts.sort)
138
- end
139
- end
140
-
141
- context 'when all DNS records are replaced with multiple records' do
142
- let(:new_hosts) do
143
- [
144
- 'test1.test.build.10gen.cc.:27019',
145
- 'test1.test.build.10gen.cc.:27020',
146
- ]
147
- end
148
-
149
- let(:new_records) do
150
- double('records').tap do |records|
151
- allow(records).to receive(:hostname).and_return(hostname)
152
- allow(records).to receive(:hosts).and_return(new_hosts)
153
- allow(records).to receive(:empty?).and_return(false)
154
- allow(records).to receive(:min_ttl).and_return(nil)
155
- end
156
- end
157
-
158
- let(:resolver) do
159
- double('resolver').tap do |resolver|
160
- allow(resolver).to receive(:get_records).and_return(new_records)
161
- end
162
- end
163
-
164
- it 'adds the new host to the cluster' do
165
- expect(cluster.addresses.map(&:to_s).sort).to eq(new_hosts.sort)
166
- end
167
- end
168
-
169
- context 'when the DNS lookup times out' do
170
- let(:resolver) do
171
- double('resolver').tap do |resolver|
172
- allow(resolver).to receive(:get_records).and_raise(Resolv::ResolvTimeout)
173
- end
174
- end
175
-
176
- it 'does not add or remove any hosts from the cluster' do
177
- expect(cluster.addresses.map(&:to_s).sort).to eq(hosts.sort)
178
- end
179
- end
180
-
181
- context 'when the DNS lookup is unable to resolve the hostname' do
182
- let(:resolver) do
183
- double('resolver').tap do |resolver|
184
- allow(resolver).to receive(:get_records).and_raise(Resolv::ResolvError)
185
- end
186
- end
187
-
188
- it 'does not add or remove any hosts from the cluster' do
189
- expect(cluster.addresses.map(&:to_s).sort).to eq(hosts.sort)
190
- end
191
- end
192
-
193
- context 'when no DNS records are returned' do
194
- let(:new_records) do
195
- double('records').tap do |records|
196
- allow(records).to receive(:hostname).and_return(hostname)
197
- allow(records).to receive(:hosts).and_return([])
198
- allow(records).to receive(:empty?).and_return(true)
199
- allow(records).to receive(:min_ttl).and_return(nil)
200
- end
201
- end
202
-
203
- let(:resolver) do
204
- double('resolver').tap do |resolver|
205
- allow(resolver).to receive(:get_records).and_return(new_records)
206
- end
207
- end
208
-
209
- it 'does not add or remove any hosts from the cluster' do
210
- expect(cluster.addresses.map(&:to_s).sort).to eq(hosts.sort)
211
- end
212
- end
213
- end
214
- end
@@ -1,245 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe Mongo::Operation::ReadPreferenceSupported do
4
-
5
- let(:selector) do
6
- { name: 'test' }
7
- end
8
-
9
- let(:options) do
10
- {}
11
- end
12
-
13
- let(:cluster_double) do
14
- double('cluster')
15
- end
16
-
17
- let(:single?) do
18
- true
19
- end
20
-
21
- let(:mongos?) do
22
- false
23
- end
24
-
25
- let(:read_pref) do
26
- Mongo::ServerSelector.get
27
- end
28
-
29
- let(:operation) do
30
- Class.new do
31
- include Mongo::Operation::ReadPreferenceSupported
32
- end.new.tap do |rp|
33
- allow(rp).to receive(:read).and_return(read_pref)
34
- allow(rp).to receive(:selector).and_return(selector)
35
- allow(rp).to receive(:options).and_return(options)
36
- end
37
- end
38
-
39
- let(:server) do
40
- double('server').tap do |c|
41
- allow(c).to receive(:cluster).and_return(cluster_double)
42
- allow(cluster_double).to receive(:single?).and_return(single?)
43
- allow(c).to receive(:mongos?).and_return(mongos?)
44
- end
45
- end
46
-
47
- shared_context 'a selector updater' do
48
-
49
- let(:read_pref) do
50
- Mongo::ServerSelector.get(:mode => mode)
51
- end
52
-
53
- let(:expected) do
54
- { :$query => selector, :$readPreference => read_pref.to_mongos }
55
- end
56
-
57
- it 'returns a special selector' do
58
- expect(operation.send(:update_selector_for_read_pref, operation.send(:selector), server)).to eq(expected)
59
- end
60
-
61
- context 'when the selector already has $query in it' do
62
-
63
- let(:selector) do
64
- { :$query => { :name => 'test' },
65
- :$orderby => { :name => -1 } }
66
- end
67
-
68
- let(:expected) do
69
- selector.merge(:$readPreference => read_pref.to_mongos)
70
- end
71
-
72
- it 'returns an unaltered special selector' do
73
- expect(operation.send(:update_selector_for_read_pref, operation.send(:selector), server)).to eq(expected)
74
- end
75
- end
76
- end
77
-
78
- shared_context 'not a selector updater' do
79
-
80
- let(:read_pref) do
81
- Mongo::ServerSelector.get(:mode => mode)
82
- end
83
-
84
- it 'returns a selector' do
85
- expect(operation.send(:update_selector_for_read_pref, operation.send(:selector), server)).to eq(selector)
86
- end
87
- end
88
-
89
- context 'when the server is a mongos' do
90
-
91
- let(:mongos?) do
92
- true
93
- end
94
-
95
- context 'when the read preference mode is primary' do
96
-
97
- let(:mode) do
98
- :primary
99
- end
100
-
101
- it_behaves_like 'not a selector updater'
102
- end
103
-
104
- context 'when the read preference mode is primary_preferred' do
105
-
106
- let(:mode) do
107
- :primary_preferred
108
- end
109
-
110
- it_behaves_like 'a selector updater'
111
- end
112
-
113
- context 'when the read preference mode is secondary' do
114
-
115
- let(:mode) do
116
- :secondary
117
- end
118
-
119
- it_behaves_like 'a selector updater'
120
- end
121
-
122
- context 'when the read preference mode is secondary_preferred' do
123
-
124
- let(:mode) do
125
- :secondary_preferred
126
- end
127
-
128
- it_behaves_like 'not a selector updater'
129
- end
130
-
131
- context 'when the read preference mode is nearest' do
132
-
133
- let(:mode) do
134
- :nearest
135
- end
136
-
137
- it_behaves_like 'a selector updater'
138
- end
139
- end
140
-
141
- context 'when the server is not a mongos' do
142
-
143
- let(:mongos?) do
144
- false
145
- end
146
-
147
- let(:mode) do
148
- :secondary_preferred
149
- end
150
-
151
- it_behaves_like 'not a selector updater'
152
- end
153
-
154
- context 'when the topology is Single' do
155
-
156
- let(:single?) do
157
- true
158
- end
159
-
160
- context 'when the server is a mongos' do
161
-
162
- let(:mongos?) do
163
- true
164
- end
165
-
166
- let(:expected) do
167
- { }
168
- end
169
-
170
- it 'does not set the slave_ok flag' do
171
- expect(operation.send(:update_options_for_slave_ok, operation.send(:options), server)).to eq(expected)
172
- end
173
- end
174
-
175
- context 'when the server is not a mongos' do
176
-
177
- let(:mongos?) do
178
- false
179
- end
180
-
181
- let(:expected) do
182
- { :flags => [ :slave_ok ] }
183
- end
184
-
185
- it 'sets the slave_ok flag' do
186
- expect(operation.send(:update_options_for_slave_ok, operation.send(:options), server)).to eq(expected)
187
- end
188
- end
189
- end
190
-
191
- context 'when the topology is not Single' do
192
-
193
- let(:single?) do
194
- false
195
- end
196
-
197
- context 'when there is no read preference set' do
198
-
199
- let(:read_pref) do
200
- Mongo::ServerSelector.get
201
- end
202
-
203
- let(:expected) do
204
- { }
205
- end
206
-
207
- it 'does not set the slave_ok flag' do
208
- expect(operation.send(:update_options_for_slave_ok, operation.send(:options), server)).to eq(expected)
209
- end
210
- end
211
-
212
- context 'when there is a read preference' do
213
-
214
- context 'when the read preference requires the slave_ok flag' do
215
-
216
- let(:read_pref) do
217
- Mongo::ServerSelector.get(:mode => :secondary)
218
- end
219
-
220
- let(:expected) do
221
- { :flags => [ :slave_ok ] }
222
- end
223
-
224
- it 'sets the slave_ok flag' do
225
- expect(operation.send(:update_options_for_slave_ok, operation.send(:options), server)).to eq(expected)
226
- end
227
- end
228
-
229
- context 'when the read preference does not require the slave_ok flag' do
230
-
231
- let(:read_pref) do
232
- Mongo::ServerSelector.get(:mode => :primary)
233
- end
234
-
235
- let(:expected) do
236
- { }
237
- end
238
-
239
- it 'does not set the slave_ok flag' do
240
- expect(operation.send(:update_options_for_slave_ok, operation.send(:options), server)).to eq(expected)
241
- end
242
- end
243
- end
244
- end
245
- end