mongo 2.7.2 → 2.8.0.rc0
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.
- checksums.yaml +4 -4
- checksums.yaml.gz.sig +0 -0
- data.tar.gz.sig +1 -3
- data/lib/mongo/address.rb +17 -20
- data/lib/mongo/address/ipv4.rb +6 -3
- data/lib/mongo/address/ipv6.rb +6 -3
- data/lib/mongo/address/unix.rb +5 -2
- data/lib/mongo/auth.rb +15 -2
- data/lib/mongo/auth/cr/conversation.rb +4 -2
- data/lib/mongo/auth/ldap/conversation.rb +4 -2
- data/lib/mongo/auth/scram.rb +3 -7
- data/lib/mongo/auth/scram/conversation.rb +28 -19
- data/lib/mongo/auth/user.rb +45 -10
- data/lib/mongo/auth/x509/conversation.rb +4 -2
- data/lib/mongo/cluster.rb +9 -17
- data/lib/mongo/error.rb +2 -0
- data/lib/mongo/error/missing_password.rb +29 -0
- data/lib/mongo/error/operation_failure.rb +7 -3
- data/lib/mongo/error/parser.rb +2 -1
- data/lib/mongo/error/sdam_error_detection.rb +54 -0
- data/lib/mongo/operation/aggregate/command.rb +1 -16
- data/lib/mongo/operation/aggregate/op_msg.rb +1 -1
- data/lib/mongo/operation/collections_info.rb +2 -3
- data/lib/mongo/operation/delete/command.rb +2 -15
- data/lib/mongo/operation/delete/legacy.rb +1 -16
- data/lib/mongo/operation/explain/command.rb +1 -16
- data/lib/mongo/operation/explain/legacy.rb +1 -16
- data/lib/mongo/operation/find/command.rb +1 -16
- data/lib/mongo/operation/find/legacy.rb +1 -16
- data/lib/mongo/operation/get_more/command.rb +1 -16
- data/lib/mongo/operation/indexes/command.rb +1 -16
- data/lib/mongo/operation/indexes/legacy.rb +4 -16
- data/lib/mongo/operation/list_collections/command.rb +1 -16
- data/lib/mongo/operation/map_reduce/command.rb +1 -16
- data/lib/mongo/operation/parallel_scan/command.rb +1 -16
- data/lib/mongo/operation/result.rb +3 -0
- data/lib/mongo/operation/shared/executable.rb +4 -0
- data/lib/mongo/operation/shared/polymorphic_lookup.rb +1 -1
- data/lib/mongo/operation/shared/polymorphic_result.rb +8 -1
- data/lib/mongo/operation/shared/result/aggregatable.rb +0 -5
- data/lib/mongo/operation/update/command.rb +2 -15
- data/lib/mongo/operation/update/legacy.rb +1 -16
- data/lib/mongo/operation/users_info/command.rb +1 -16
- data/lib/mongo/retryable.rb +22 -10
- data/lib/mongo/server.rb +10 -1
- data/lib/mongo/server/app_metadata.rb +7 -2
- data/lib/mongo/server/connectable.rb +0 -6
- data/lib/mongo/server/connection.rb +86 -135
- data/lib/mongo/server/connection_base.rb +133 -0
- data/lib/mongo/server/connection_pool.rb +11 -24
- data/lib/mongo/server/connection_pool/queue.rb +41 -41
- data/lib/mongo/server/description.rb +1 -1
- data/lib/mongo/server/monitor.rb +4 -4
- data/lib/mongo/server/monitor/connection.rb +26 -7
- data/lib/mongo/server/pending_connection.rb +36 -0
- data/lib/mongo/server_selector/selectable.rb +9 -1
- data/lib/mongo/session.rb +0 -1
- data/lib/mongo/socket.rb +23 -6
- data/lib/mongo/socket/ssl.rb +11 -18
- data/lib/mongo/socket/tcp.rb +13 -14
- data/lib/mongo/socket/unix.rb +9 -27
- data/lib/mongo/uri.rb +1 -1
- data/lib/mongo/version.rb +1 -1
- data/spec/integration/auth_spec.rb +160 -0
- data/spec/integration/retryable_writes_spec.rb +55 -58
- data/spec/integration/sdam_error_handling_spec.rb +115 -0
- data/spec/mongo/address/ipv4_spec.rb +4 -0
- data/spec/mongo/address/ipv6_spec.rb +4 -0
- data/spec/mongo/auth/scram/conversation_spec.rb +6 -5
- data/spec/mongo/auth/scram/negotiation_spec.rb +25 -36
- data/spec/mongo/auth/scram_spec.rb +2 -2
- data/spec/mongo/auth/user_spec.rb +97 -0
- data/spec/mongo/client_construction_spec.rb +1 -1
- data/spec/mongo/error/operation_failure_spec.rb +125 -1
- data/spec/mongo/retryable_spec.rb +17 -8
- data/spec/mongo/server/connection_pool/queue_spec.rb +24 -10
- data/spec/mongo/server/connection_pool_spec.rb +30 -117
- data/spec/mongo/server/connection_spec.rb +147 -25
- data/spec/mongo/server/description_spec.rb +0 -14
- data/spec/mongo/server/monitor/connection_spec.rb +22 -0
- data/spec/mongo/server_selector_spec.rb +1 -0
- data/spec/mongo/server_spec.rb +6 -6
- data/spec/mongo/socket/ssl_spec.rb +48 -116
- data/spec/mongo/socket/tcp_spec.rb +22 -0
- data/spec/mongo/socket/unix_spec.rb +9 -9
- data/spec/mongo/socket_spec.rb +15 -3
- data/spec/spec_tests/server_selection_spec.rb +2 -0
- data/spec/support/client_registry.rb +8 -2
- data/spec/support/common_shortcuts.rb +20 -1
- data/spec/support/constraints.rb +10 -2
- data/spec/support/lite_constraints.rb +8 -0
- data/spec/support/spec_config.rb +9 -1
- metadata +14 -4
- metadata.gz.sig +0 -0
@@ -8,11 +8,7 @@ describe Mongo::Server::Connection, retry: 3 do
|
|
8
8
|
ClientRegistry.instance.close_all_clients
|
9
9
|
end
|
10
10
|
|
11
|
-
|
12
|
-
ClientRegistry.instance.close_all_clients
|
13
|
-
end
|
14
|
-
|
15
|
-
let(:address) do
|
11
|
+
let!(:address) do
|
16
12
|
default_address
|
17
13
|
end
|
18
14
|
|
@@ -43,10 +39,9 @@ describe Mongo::Server::Connection, retry: 3 do
|
|
43
39
|
|
44
40
|
declare_topology_double
|
45
41
|
|
42
|
+
let(:server_options) { SpecConfig.instance.test_options.merge(monitoring_io: false) }
|
46
43
|
let(:server) do
|
47
|
-
Mongo::Server.new(address, cluster, monitoring, listeners,
|
48
|
-
SpecConfig.instance.test_options.merge(monitoring_io: false),
|
49
|
-
)
|
44
|
+
Mongo::Server.new(address, cluster, monitoring, listeners, server_options)
|
50
45
|
end
|
51
46
|
|
52
47
|
let(:monitored_server) do
|
@@ -54,6 +49,7 @@ describe Mongo::Server::Connection, retry: 3 do
|
|
54
49
|
SpecConfig.instance.test_options
|
55
50
|
).tap do |server|
|
56
51
|
server.scan!
|
52
|
+
expect(server).not_to be_unknown
|
57
53
|
end
|
58
54
|
end
|
59
55
|
|
@@ -142,6 +138,23 @@ describe Mongo::Server::Connection, retry: 3 do
|
|
142
138
|
end
|
143
139
|
end
|
144
140
|
|
141
|
+
shared_examples_for 'logs a warning' do
|
142
|
+
let(:expected_message) do
|
143
|
+
"MONGODB | Failed to handshake with #{address}: #{error.class}: #{error}"
|
144
|
+
end
|
145
|
+
|
146
|
+
it 'logs a warning' do
|
147
|
+
messages = []
|
148
|
+
# Straightforward expectations are not working here for some reason
|
149
|
+
expect(Mongo::Logger.logger).to receive(:warn) do |msg|
|
150
|
+
messages << msg
|
151
|
+
end
|
152
|
+
expect(error).not_to be nil
|
153
|
+
expect(messages).to include(expected_message)
|
154
|
+
end
|
155
|
+
|
156
|
+
end
|
157
|
+
|
145
158
|
context 'when #handshake! dependency raises a non-network exception' do
|
146
159
|
|
147
160
|
let(:exception) do
|
@@ -181,15 +194,24 @@ describe Mongo::Server::Connection, retry: 3 do
|
|
181
194
|
|
182
195
|
it_behaves_like 'failing connection'
|
183
196
|
it_behaves_like 'marks server unknown'
|
197
|
+
it_behaves_like 'logs a warning'
|
184
198
|
end
|
185
199
|
|
186
200
|
context 'when #authenticate! raises an exception' do
|
201
|
+
require_auth
|
202
|
+
|
203
|
+
let(:server_options) do
|
204
|
+
SpecConfig.instance.test_options.merge(monitoring_io: false).
|
205
|
+
merge(SpecConfig.instance.auth_options)
|
206
|
+
end
|
207
|
+
|
187
208
|
let(:exception) do
|
188
209
|
Mongo::Error::OperationFailure.new
|
189
210
|
end
|
190
211
|
|
191
212
|
let(:error) do
|
192
|
-
expect(
|
213
|
+
expect(Mongo::Auth).to receive(:get).and_raise(exception)
|
214
|
+
expect(connection.send(:socket)).to be nil
|
193
215
|
begin
|
194
216
|
connection.connect!
|
195
217
|
rescue Exception => e
|
@@ -200,6 +222,7 @@ describe Mongo::Server::Connection, retry: 3 do
|
|
200
222
|
end
|
201
223
|
|
202
224
|
it_behaves_like 'failing connection'
|
225
|
+
it_behaves_like 'logs a warning'
|
203
226
|
end
|
204
227
|
|
205
228
|
context 'when a non-Mongo exception is raised' do
|
@@ -249,7 +272,7 @@ describe Mongo::Server::Connection, retry: 3 do
|
|
249
272
|
|
250
273
|
shared_examples_for 'does not disconnect connection pool' do
|
251
274
|
it 'does not disconnect non-monitoring sockets' do
|
252
|
-
allow(
|
275
|
+
allow(server).to receive(:pool).and_return(pool)
|
253
276
|
expect(pool).not_to receive(:disconnect!)
|
254
277
|
error
|
255
278
|
end
|
@@ -257,7 +280,7 @@ describe Mongo::Server::Connection, retry: 3 do
|
|
257
280
|
|
258
281
|
shared_examples_for 'disconnects connection pool' do
|
259
282
|
it 'disconnects non-monitoring sockets' do
|
260
|
-
expect(
|
283
|
+
expect(server).to receive(:pool).and_return(pool)
|
261
284
|
expect(pool).to receive(:disconnect!).and_return(true)
|
262
285
|
error
|
263
286
|
end
|
@@ -607,10 +630,6 @@ describe Mongo::Server::Connection, retry: 3 do
|
|
607
630
|
|
608
631
|
context 'when the message is a command' do
|
609
632
|
|
610
|
-
before do
|
611
|
-
allow(connection).to receive(:max_bson_object_size).and_return(100)
|
612
|
-
end
|
613
|
-
|
614
633
|
let(:selector) do
|
615
634
|
{ :getlasterror => '1' }
|
616
635
|
end
|
@@ -624,29 +643,92 @@ describe Mongo::Server::Connection, retry: 3 do
|
|
624
643
|
end
|
625
644
|
|
626
645
|
it 'checks the size against the max bson size' do
|
627
|
-
|
646
|
+
expect_any_instance_of(Mongo::Server).to receive(:max_bson_object_size).at_least(:once).and_return(100)
|
647
|
+
expect do
|
628
648
|
reply
|
629
|
-
|
649
|
+
end.to raise_exception(Mongo::Error::MaxBSONSize)
|
630
650
|
end
|
631
651
|
end
|
632
652
|
end
|
633
653
|
|
634
|
-
context 'when a network
|
654
|
+
context 'when a network error occurs' do
|
655
|
+
let(:server) do
|
656
|
+
authorized_client.cluster.next_primary.tap do |server|
|
657
|
+
# to ensure the server stays in unknown state for the duration
|
658
|
+
# of the test, i.e. to avoid racing with the monitor thread
|
659
|
+
# which may put the server back into non-unknown state before
|
660
|
+
# we can verify that the server was marked unknown, kill off
|
661
|
+
# the monitor thread
|
662
|
+
server.monitor.instance_variable_get('@thread').kill
|
663
|
+
end
|
664
|
+
end
|
635
665
|
|
636
666
|
let(:socket) do
|
637
667
|
connection.connect!
|
638
668
|
connection.instance_variable_get(:@socket)
|
639
669
|
end
|
640
670
|
|
641
|
-
|
642
|
-
|
671
|
+
context 'when a non-timeout socket error occurs' do
|
672
|
+
|
673
|
+
before do
|
674
|
+
expect(socket).to receive(:write).and_raise(Mongo::Error::SocketError)
|
675
|
+
end
|
676
|
+
|
677
|
+
let(:result) do
|
678
|
+
expect do
|
679
|
+
connection.dispatch([ insert ])
|
680
|
+
end.to raise_error(Mongo::Error::SocketError)
|
681
|
+
end
|
682
|
+
|
683
|
+
it 'disconnects and raises the exception' do
|
684
|
+
result
|
685
|
+
expect(connection).to_not be_connected
|
686
|
+
end
|
687
|
+
|
688
|
+
it 'disconnects connection pool' do
|
689
|
+
expect(server.pool).to receive(:disconnect!)
|
690
|
+
result
|
691
|
+
end
|
692
|
+
|
693
|
+
it 'does not request server scan' do
|
694
|
+
expect(server.monitor.scan_semaphore).not_to receive(:signal)
|
695
|
+
result
|
696
|
+
end
|
697
|
+
|
698
|
+
it 'marks server unknown' do
|
699
|
+
expect(server).not_to be_unknown
|
700
|
+
result
|
701
|
+
expect(server).to be_unknown
|
702
|
+
end
|
643
703
|
end
|
644
704
|
|
645
|
-
|
646
|
-
|
647
|
-
|
648
|
-
|
649
|
-
|
705
|
+
context 'when a socket timeout occurs' do
|
706
|
+
|
707
|
+
before do
|
708
|
+
expect(socket).to receive(:write).and_raise(Mongo::Error::SocketTimeoutError)
|
709
|
+
end
|
710
|
+
|
711
|
+
let(:result) do
|
712
|
+
expect do
|
713
|
+
connection.dispatch([ insert ])
|
714
|
+
end.to raise_error(Mongo::Error::SocketTimeoutError)
|
715
|
+
end
|
716
|
+
|
717
|
+
it 'disconnects the used connection' do
|
718
|
+
result
|
719
|
+
expect(connection).to_not be_connected
|
720
|
+
end
|
721
|
+
|
722
|
+
it 'does not disconnect connection pool' do
|
723
|
+
expect(server.pool).not_to receive(:disconnect!)
|
724
|
+
result
|
725
|
+
end
|
726
|
+
|
727
|
+
it 'does not mark server unknown' do
|
728
|
+
expect(server).not_to be_unknown
|
729
|
+
result
|
730
|
+
expect(server).not_to be_unknown
|
731
|
+
end
|
650
732
|
end
|
651
733
|
end
|
652
734
|
|
@@ -947,4 +1029,44 @@ describe Mongo::Server::Connection, retry: 3 do
|
|
947
1029
|
end
|
948
1030
|
end
|
949
1031
|
end
|
1032
|
+
|
1033
|
+
describe '#app_metadata' do
|
1034
|
+
context 'when all options are identical to server' do
|
1035
|
+
let(:connection) do
|
1036
|
+
described_class.new(server, server.options)
|
1037
|
+
end
|
1038
|
+
|
1039
|
+
it 'is the same object as server app_metadata' do
|
1040
|
+
expect(connection.app_metadata).not_to be nil
|
1041
|
+
expect(connection.app_metadata).to be server.app_metadata
|
1042
|
+
end
|
1043
|
+
end
|
1044
|
+
|
1045
|
+
context 'when auth options are identical to server' do
|
1046
|
+
let(:connection) do
|
1047
|
+
described_class.new(server, server.options.merge(socket_timeout: 2))
|
1048
|
+
end
|
1049
|
+
|
1050
|
+
it 'is the same object as server app_metadata' do
|
1051
|
+
expect(connection.app_metadata).not_to be nil
|
1052
|
+
expect(connection.app_metadata).to be server.app_metadata
|
1053
|
+
end
|
1054
|
+
end
|
1055
|
+
|
1056
|
+
context 'when auth options differ from server' do
|
1057
|
+
let(:connection) do
|
1058
|
+
described_class.new(server, server.options.merge(user: 'foo'))
|
1059
|
+
end
|
1060
|
+
|
1061
|
+
it 'is different object from server app_metadata' do
|
1062
|
+
expect(connection.app_metadata).not_to be nil
|
1063
|
+
expect(connection.app_metadata).not_to be server.app_metadata
|
1064
|
+
end
|
1065
|
+
|
1066
|
+
it 'includes request auth mechanism' do
|
1067
|
+
document = connection.app_metadata.send(:document)
|
1068
|
+
expect(document[:saslSupportedMechs]).to eq('admin.foo')
|
1069
|
+
end
|
1070
|
+
end
|
1071
|
+
end
|
950
1072
|
end
|
@@ -49,20 +49,6 @@ describe Mongo::Server::Description do
|
|
49
49
|
end
|
50
50
|
end
|
51
51
|
|
52
|
-
describe '#initialize' do
|
53
|
-
context 'when Time.now is mocked' do
|
54
|
-
it 'does not freeze mocked time' do
|
55
|
-
obj = Time.now
|
56
|
-
expect(Time).to receive(:now).at_least(:once).and_return(obj)
|
57
|
-
expect(obj.frozen?).to be false
|
58
|
-
|
59
|
-
description = described_class.new(address)
|
60
|
-
expect(description.last_update_time).to eq(obj)
|
61
|
-
expect(obj.frozen?).to be false
|
62
|
-
end
|
63
|
-
end
|
64
|
-
end
|
65
|
-
|
66
52
|
describe '#arbiters' do
|
67
53
|
|
68
54
|
context 'when the replica set has arbiters' do
|
@@ -158,4 +158,26 @@ describe Mongo::Server::Monitor::Connection do
|
|
158
158
|
end
|
159
159
|
end
|
160
160
|
end
|
161
|
+
|
162
|
+
describe '#connect!' do
|
163
|
+
context 'network error' do
|
164
|
+
before do
|
165
|
+
address
|
166
|
+
server.monitor.instance_variable_get('@thread').kill
|
167
|
+
server.monitor.connection.disconnect!
|
168
|
+
expect_any_instance_of(Mongo::Socket).to receive(:write).and_raise(Mongo::Error::SocketError, 'test error')
|
169
|
+
end
|
170
|
+
|
171
|
+
let(:options) { SpecConfig.instance.test_options }
|
172
|
+
|
173
|
+
let(:expected_message) { "MONGODB | Failed to handshake with #{address}: Mongo::Error::SocketError: test error" }
|
174
|
+
|
175
|
+
it 'logs a warning' do
|
176
|
+
expect(Mongo::Logger.logger).to receive(:warn).with(expected_message).and_call_original
|
177
|
+
expect do
|
178
|
+
server.monitor.connection.connect!
|
179
|
+
end.to raise_error(Mongo::Error::SocketError, 'test error')
|
180
|
+
end
|
181
|
+
end
|
182
|
+
end
|
161
183
|
end
|
@@ -218,6 +218,7 @@ describe Mongo::ServerSelector do
|
|
218
218
|
allow(c).to receive(:unknown?).and_return(false)
|
219
219
|
allow(c).to receive(:scan!).and_return(true)
|
220
220
|
allow(c).to receive(:options).and_return(server_selection_timeout: 0.1)
|
221
|
+
allow(c).to receive(:server_selection_semaphore).and_return(nil)
|
221
222
|
end
|
222
223
|
end
|
223
224
|
|
data/spec/mongo/server_spec.rb
CHANGED
@@ -25,7 +25,7 @@ describe Mongo::Server do
|
|
25
25
|
end
|
26
26
|
|
27
27
|
let(:pool) do
|
28
|
-
|
28
|
+
server.pool
|
29
29
|
end
|
30
30
|
|
31
31
|
describe '#==' do
|
@@ -35,7 +35,7 @@ describe Mongo::Server do
|
|
35
35
|
end
|
36
36
|
|
37
37
|
after do
|
38
|
-
expect(
|
38
|
+
expect(server).to receive(:pool).and_return(pool)
|
39
39
|
server.disconnect!
|
40
40
|
end
|
41
41
|
|
@@ -88,7 +88,7 @@ describe Mongo::Server do
|
|
88
88
|
|
89
89
|
it 'stops the monitor instance' do
|
90
90
|
expect(server.instance_variable_get(:@monitor)).to receive(:stop!).and_return(true)
|
91
|
-
expect(
|
91
|
+
expect(server).to receive(:pool).and_return(pool)
|
92
92
|
server.disconnect!
|
93
93
|
end
|
94
94
|
end
|
@@ -106,7 +106,7 @@ describe Mongo::Server do
|
|
106
106
|
end
|
107
107
|
|
108
108
|
after do
|
109
|
-
expect(
|
109
|
+
expect(server).to receive(:pool).and_return(pool)
|
110
110
|
server.disconnect!
|
111
111
|
end
|
112
112
|
|
@@ -150,7 +150,7 @@ describe Mongo::Server do
|
|
150
150
|
end
|
151
151
|
|
152
152
|
after do
|
153
|
-
expect(
|
153
|
+
expect(server).to receive(:pool).and_return(pool)
|
154
154
|
server.disconnect!
|
155
155
|
end
|
156
156
|
|
@@ -170,7 +170,7 @@ describe Mongo::Server do
|
|
170
170
|
end
|
171
171
|
|
172
172
|
after do
|
173
|
-
expect(
|
173
|
+
expect(server).to receive(:pool).and_return(pool)
|
174
174
|
server.disconnect!
|
175
175
|
end
|
176
176
|
|
@@ -4,10 +4,12 @@ describe Mongo::Socket::SSL do
|
|
4
4
|
require_ssl
|
5
5
|
|
6
6
|
let(:address) do
|
7
|
-
default_address
|
7
|
+
default_address.tap do
|
8
|
+
ClientRegistry.instance.close_all_clients
|
9
|
+
end
|
8
10
|
end
|
9
11
|
|
10
|
-
let(:resolver) do
|
12
|
+
let!(:resolver) do
|
11
13
|
address.send(:create_resolver, {})
|
12
14
|
end
|
13
15
|
|
@@ -47,16 +49,19 @@ describe Mongo::Socket::SSL do
|
|
47
49
|
OpenSSL::PKey.read(key_string)
|
48
50
|
end
|
49
51
|
|
52
|
+
describe '#address' do
|
53
|
+
it 'returns the address and tls indicator' do
|
54
|
+
addr = socket.instance_variable_get(:@tcp_socket).remote_address
|
55
|
+
expect(socket.send(:address)).to eq("#{addr.ip_address}:#{addr.ip_port} (#{default_address}, TLS)")
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
50
59
|
describe '#connect!' do
|
51
60
|
|
52
61
|
context 'when a certificate is provided' do
|
53
62
|
|
54
63
|
context 'when connecting the tcp socket is successful' do
|
55
64
|
|
56
|
-
before do
|
57
|
-
socket.connect!
|
58
|
-
end
|
59
|
-
|
60
65
|
it 'connects to the server' do
|
61
66
|
expect(socket).to be_alive
|
62
67
|
end
|
@@ -64,21 +69,11 @@ describe Mongo::Socket::SSL do
|
|
64
69
|
|
65
70
|
context 'when connecting the tcp socket raises an exception' do
|
66
71
|
|
67
|
-
before do
|
68
|
-
tcp_socket = socket.instance_variable_get(:@tcp_socket)
|
69
|
-
allow(tcp_socket).to receive(:connect).and_raise(Mongo::Error::SocketTimeoutError)
|
70
|
-
end
|
71
|
-
|
72
|
-
let!(:result) do
|
73
|
-
begin
|
74
|
-
socket.connect!
|
75
|
-
rescue => e
|
76
|
-
e
|
77
|
-
end
|
78
|
-
end
|
79
|
-
|
80
72
|
it 'raises an exception' do
|
81
|
-
|
73
|
+
expect_any_instance_of(::Socket).to receive(:connect).and_raise(Mongo::Error::SocketTimeoutError)
|
74
|
+
expect do
|
75
|
+
socket
|
76
|
+
end.to raise_error(Mongo::Error::SocketTimeoutError)
|
82
77
|
end
|
83
78
|
end
|
84
79
|
end
|
@@ -94,10 +89,6 @@ describe Mongo::Socket::SSL do
|
|
94
89
|
}
|
95
90
|
end
|
96
91
|
|
97
|
-
before do
|
98
|
-
socket.connect!
|
99
|
-
end
|
100
|
-
|
101
92
|
it 'connects to the server' do
|
102
93
|
expect(socket).to be_alive
|
103
94
|
end
|
@@ -116,10 +107,6 @@ describe Mongo::Socket::SSL do
|
|
116
107
|
}
|
117
108
|
end
|
118
109
|
|
119
|
-
before do
|
120
|
-
socket.connect!
|
121
|
-
end
|
122
|
-
|
123
110
|
it 'connects to the server' do
|
124
111
|
expect(socket).to be_alive
|
125
112
|
end
|
@@ -136,10 +123,6 @@ describe Mongo::Socket::SSL do
|
|
136
123
|
}
|
137
124
|
end
|
138
125
|
|
139
|
-
before do
|
140
|
-
socket.connect!
|
141
|
-
end
|
142
|
-
|
143
126
|
it 'connects to the server' do
|
144
127
|
expect(socket).to be_alive
|
145
128
|
end
|
@@ -153,10 +136,6 @@ describe Mongo::Socket::SSL do
|
|
153
136
|
)
|
154
137
|
end
|
155
138
|
|
156
|
-
before do
|
157
|
-
socket.connect!
|
158
|
-
end
|
159
|
-
|
160
139
|
# since the lower priority option is clearly invalid we verify priority by checking that it connects
|
161
140
|
it 'discards the value of :ssl_cert_string' do
|
162
141
|
expect(socket).to be_alive
|
@@ -171,10 +150,6 @@ describe Mongo::Socket::SSL do
|
|
171
150
|
)
|
172
151
|
end
|
173
152
|
|
174
|
-
before do
|
175
|
-
socket.connect!
|
176
|
-
end
|
177
|
-
|
178
153
|
# since the lower priority option is clearly invalid we verify priority by checking that it connects
|
179
154
|
it 'discards the value of :ssl_cert_object' do
|
180
155
|
expect(socket).to be_alive
|
@@ -193,10 +168,6 @@ describe Mongo::Socket::SSL do
|
|
193
168
|
}
|
194
169
|
end
|
195
170
|
|
196
|
-
before do
|
197
|
-
socket.connect!
|
198
|
-
end
|
199
|
-
|
200
171
|
# since the lower priority option is clearly invalid we verify priority by checking that it connects
|
201
172
|
it 'discards the value of :ssl_cert_object' do
|
202
173
|
expect(socket).to be_alive
|
@@ -211,10 +182,6 @@ describe Mongo::Socket::SSL do
|
|
211
182
|
)
|
212
183
|
end
|
213
184
|
|
214
|
-
before do
|
215
|
-
socket.connect!
|
216
|
-
end
|
217
|
-
|
218
185
|
# since the lower priority option is clearly invalid we verify priority by checking that it connects
|
219
186
|
it 'discards the value of :ssl_key_string' do
|
220
187
|
expect(socket).to be_alive
|
@@ -229,10 +196,6 @@ describe Mongo::Socket::SSL do
|
|
229
196
|
)
|
230
197
|
end
|
231
198
|
|
232
|
-
before do
|
233
|
-
socket.connect!
|
234
|
-
end
|
235
|
-
|
236
199
|
# since the lower priority option is clearly invalid we verify priority by checking that it connects
|
237
200
|
it 'discards the value of :ssl_key_object' do
|
238
201
|
expect(socket).to be_alive
|
@@ -251,10 +214,6 @@ describe Mongo::Socket::SSL do
|
|
251
214
|
}
|
252
215
|
end
|
253
216
|
|
254
|
-
before do
|
255
|
-
socket.connect!
|
256
|
-
end
|
257
|
-
|
258
217
|
# since the lower priority option is clearly invalid we verify priority by checking that it connects
|
259
218
|
it 'discards the value of :ssl_key_object' do
|
260
219
|
expect(socket).to be_alive
|
@@ -274,9 +233,9 @@ describe Mongo::Socket::SSL do
|
|
274
233
|
end
|
275
234
|
|
276
235
|
it 'raises a TypeError' do
|
277
|
-
expect
|
278
|
-
socket
|
279
|
-
|
236
|
+
expect do
|
237
|
+
socket
|
238
|
+
end.to raise_exception(TypeError)
|
280
239
|
end
|
281
240
|
end
|
282
241
|
|
@@ -290,13 +249,13 @@ describe Mongo::Socket::SSL do
|
|
290
249
|
error = nil
|
291
250
|
begin
|
292
251
|
described_class.new(
|
293
|
-
|
294
|
-
|
252
|
+
resolver.host,
|
253
|
+
resolver.port,
|
295
254
|
host_name,
|
296
255
|
30,
|
297
256
|
::Socket::PF_INET,
|
298
257
|
options.merge(ssl_verify_hostname: true)
|
299
|
-
)
|
258
|
+
)
|
300
259
|
rescue => e
|
301
260
|
error = e
|
302
261
|
end
|
@@ -310,13 +269,13 @@ describe Mongo::Socket::SSL do
|
|
310
269
|
it 'raises an error' do
|
311
270
|
expect {
|
312
271
|
described_class.new(
|
313
|
-
|
314
|
-
|
272
|
+
resolver.host,
|
273
|
+
resolver.port,
|
315
274
|
host_name,
|
316
275
|
30,
|
317
276
|
::Socket::PF_INET,
|
318
277
|
options.merge(ssl_verify_hostname: false)
|
319
|
-
)
|
278
|
+
)
|
320
279
|
}.not_to raise_error
|
321
280
|
end
|
322
281
|
end
|
@@ -338,9 +297,9 @@ describe Mongo::Socket::SSL do
|
|
338
297
|
end
|
339
298
|
|
340
299
|
it 'raises a TypeError' do
|
341
|
-
expect
|
342
|
-
socket
|
343
|
-
|
300
|
+
expect do
|
301
|
+
socket
|
302
|
+
end.to raise_exception(TypeError)
|
344
303
|
end
|
345
304
|
end
|
346
305
|
end
|
@@ -379,9 +338,9 @@ describe Mongo::Socket::SSL do
|
|
379
338
|
end
|
380
339
|
|
381
340
|
it 'raises a NoMethodError' do
|
382
|
-
expect
|
383
|
-
socket
|
384
|
-
|
341
|
+
expect do
|
342
|
+
socket
|
343
|
+
end.to raise_exception(expected_exception)
|
385
344
|
end
|
386
345
|
end
|
387
346
|
end
|
@@ -412,9 +371,9 @@ describe Mongo::Socket::SSL do
|
|
412
371
|
end
|
413
372
|
|
414
373
|
it 'raises an exception' do
|
415
|
-
expect
|
416
|
-
socket
|
417
|
-
|
374
|
+
expect do
|
375
|
+
socket
|
376
|
+
end.to raise_exception(expected_exception)
|
418
377
|
end
|
419
378
|
end
|
420
379
|
|
@@ -430,10 +389,6 @@ describe Mongo::Socket::SSL do
|
|
430
389
|
)
|
431
390
|
end
|
432
391
|
|
433
|
-
before do
|
434
|
-
socket.connect!
|
435
|
-
end
|
436
|
-
|
437
392
|
it 'connects to the server' do
|
438
393
|
expect(socket).to be_alive
|
439
394
|
end
|
@@ -441,24 +396,20 @@ describe Mongo::Socket::SSL do
|
|
441
396
|
|
442
397
|
context 'as a string containing the PEM-encoded certificate' do
|
443
398
|
|
444
|
-
let
|
399
|
+
let(:options) do
|
445
400
|
super().merge(
|
446
401
|
:ssl_ca_cert_string => ca_cert_string,
|
447
402
|
:ssl_verify => true
|
448
403
|
)
|
449
404
|
end
|
450
405
|
|
451
|
-
before do
|
452
|
-
socket.connect!
|
453
|
-
end
|
454
|
-
|
455
406
|
it 'connects to the server' do
|
456
407
|
expect(socket).to be_alive
|
457
408
|
end
|
458
409
|
end
|
459
410
|
|
460
411
|
context 'as an array of Certificate objects' do
|
461
|
-
let
|
412
|
+
let(:options) do
|
462
413
|
cert = [OpenSSL::X509::Certificate.new(ca_cert_string)]
|
463
414
|
super().merge(
|
464
415
|
:ssl_ca_cert_object => cert,
|
@@ -466,10 +417,6 @@ describe Mongo::Socket::SSL do
|
|
466
417
|
)
|
467
418
|
end
|
468
419
|
|
469
|
-
before do
|
470
|
-
socket.connect!
|
471
|
-
end
|
472
|
-
|
473
420
|
it 'connects to the server' do
|
474
421
|
expect(socket).to be_alive
|
475
422
|
end
|
@@ -485,10 +432,6 @@ describe Mongo::Socket::SSL do
|
|
485
432
|
)
|
486
433
|
end
|
487
434
|
|
488
|
-
before do
|
489
|
-
socket.connect!
|
490
|
-
end
|
491
|
-
|
492
435
|
# since the lower priority option is clearly invalid we verify priority by checking that it connects
|
493
436
|
it 'discards the value of :ssl_ca_cert_string' do
|
494
437
|
expect(socket).to be_alive
|
@@ -505,10 +448,6 @@ describe Mongo::Socket::SSL do
|
|
505
448
|
)
|
506
449
|
end
|
507
450
|
|
508
|
-
before do
|
509
|
-
socket.connect!
|
510
|
-
end
|
511
|
-
|
512
451
|
it 'discards the value of :ssl_ca_cert_object' do
|
513
452
|
expect(socket).to be_alive
|
514
453
|
end
|
@@ -525,10 +464,6 @@ describe Mongo::Socket::SSL do
|
|
525
464
|
)
|
526
465
|
end
|
527
466
|
|
528
|
-
before do
|
529
|
-
socket.connect!
|
530
|
-
end
|
531
|
-
|
532
467
|
it 'discards the value of :ssl_ca_cert_object' do
|
533
468
|
expect(socket).to be_alive
|
534
469
|
end
|
@@ -544,9 +479,14 @@ describe Mongo::Socket::SSL do
|
|
544
479
|
)
|
545
480
|
end
|
546
481
|
|
547
|
-
|
482
|
+
around do |example|
|
483
|
+
saved = ENV['SSL_CERT_FILE']
|
548
484
|
ENV['SSL_CERT_FILE'] = CA_PEM
|
549
|
-
|
485
|
+
begin
|
486
|
+
example.run
|
487
|
+
ensure
|
488
|
+
ENV['SSL_CERT_FILE'] = saved
|
489
|
+
end
|
550
490
|
end
|
551
491
|
|
552
492
|
it 'uses the default cert store' do
|
@@ -563,10 +503,6 @@ describe Mongo::Socket::SSL do
|
|
563
503
|
).tap { |options| options.delete(:ssl_verify) }
|
564
504
|
end
|
565
505
|
|
566
|
-
before do
|
567
|
-
socket.connect!
|
568
|
-
end
|
569
|
-
|
570
506
|
it 'verifies the server certificate' do
|
571
507
|
expect(socket).to be_alive
|
572
508
|
end
|
@@ -582,10 +518,6 @@ describe Mongo::Socket::SSL do
|
|
582
518
|
)
|
583
519
|
end
|
584
520
|
|
585
|
-
before do
|
586
|
-
socket.connect!
|
587
|
-
end
|
588
|
-
|
589
521
|
it 'verifies the server certificate' do
|
590
522
|
expect(socket).to be_alive
|
591
523
|
end
|
@@ -600,10 +532,6 @@ describe Mongo::Socket::SSL do
|
|
600
532
|
)
|
601
533
|
end
|
602
534
|
|
603
|
-
before do
|
604
|
-
socket.connect!
|
605
|
-
end
|
606
|
-
|
607
535
|
it 'does not verify the server certificate' do
|
608
536
|
expect(socket).to be_alive
|
609
537
|
end
|
@@ -642,9 +570,13 @@ describe Mongo::Socket::SSL do
|
|
642
570
|
|
643
571
|
let(:socket_content) { "" }
|
644
572
|
|
573
|
+
let(:remote_address) { socket.instance_variable_get(:@tcp_socket).remote_address }
|
574
|
+
let(:address_str) { "#{remote_address.ip_address}:#{remote_address.ip_port} (#{default_address}, TLS)" }
|
575
|
+
|
645
576
|
it 'should raise EOFError' do
|
646
|
-
expect
|
647
|
-
.
|
577
|
+
expect do
|
578
|
+
socket.readbyte
|
579
|
+
end.to raise_error(Mongo::Error::SocketError).with_message("EOFError: EOFError (for #{address_str})")
|
648
580
|
end
|
649
581
|
end
|
650
582
|
end
|