mongo 2.7.2 → 2.8.0.rc0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|