mongo 2.0.6 → 2.1.0.beta

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 (119) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data.tar.gz.sig +0 -0
  4. data/lib/mongo.rb +2 -0
  5. data/lib/mongo/bulk_write.rb +1 -0
  6. data/lib/mongo/bulk_write/bulk_writable.rb +87 -31
  7. data/lib/mongo/bulk_write/deletable.rb +8 -7
  8. data/lib/mongo/bulk_write/insertable.rb +4 -3
  9. data/lib/mongo/bulk_write/ordered_bulk_write.rb +6 -6
  10. data/lib/mongo/bulk_write/replacable.rb +4 -3
  11. data/lib/mongo/bulk_write/result.rb +138 -0
  12. data/lib/mongo/bulk_write/unordered_bulk_write.rb +5 -8
  13. data/lib/mongo/bulk_write/updatable.rb +8 -7
  14. data/lib/mongo/client.rb +36 -4
  15. data/lib/mongo/cluster.rb +39 -4
  16. data/lib/mongo/cluster/topology/replica_set.rb +20 -4
  17. data/lib/mongo/cluster/topology/sharded.rb +1 -1
  18. data/lib/mongo/collection.rb +282 -29
  19. data/lib/mongo/collection/view/aggregation.rb +32 -4
  20. data/lib/mongo/collection/view/iterable.rb +2 -1
  21. data/lib/mongo/collection/view/map_reduce.rb +3 -1
  22. data/lib/mongo/collection/view/readable.rb +89 -14
  23. data/lib/mongo/collection/view/writable.rb +11 -5
  24. data/lib/mongo/cursor.rb +11 -3
  25. data/lib/mongo/dbref.rb +113 -0
  26. data/lib/mongo/error.rb +6 -2
  27. data/lib/mongo/error/parser.rb +1 -1
  28. data/lib/mongo/event/description_changed.rb +1 -1
  29. data/lib/mongo/grid/file.rb +1 -1
  30. data/lib/mongo/grid/fs.rb +2 -5
  31. data/lib/mongo/monitoring.rb +199 -0
  32. data/lib/mongo/monitoring/command_log_subscriber.rb +88 -0
  33. data/lib/mongo/monitoring/event.rb +17 -0
  34. data/lib/mongo/monitoring/event/command_failed.rb +96 -0
  35. data/lib/mongo/monitoring/event/command_started.rb +88 -0
  36. data/lib/mongo/monitoring/event/command_succeeded.rb +96 -0
  37. data/lib/mongo/monitoring/publishable.rb +96 -0
  38. data/lib/mongo/operation.rb +1 -0
  39. data/lib/mongo/operation/executable.rb +1 -1
  40. data/lib/mongo/operation/parallel_scan.rb +76 -0
  41. data/lib/mongo/operation/parallel_scan/result.rb +72 -0
  42. data/lib/mongo/operation/specifiable.rb +18 -0
  43. data/lib/mongo/operation/write/bulk/bulk_delete.rb +1 -1
  44. data/lib/mongo/operation/write/bulk/bulk_insert.rb +1 -1
  45. data/lib/mongo/operation/write/bulk/bulk_mergable.rb +2 -2
  46. data/lib/mongo/operation/write/bulk/bulk_update.rb +1 -1
  47. data/lib/mongo/operation/write/bulk/bulk_update/result.rb +13 -1
  48. data/lib/mongo/protocol/delete.rb +8 -13
  49. data/lib/mongo/protocol/get_more.rb +13 -13
  50. data/lib/mongo/protocol/insert.rb +8 -13
  51. data/lib/mongo/protocol/kill_cursors.rb +7 -11
  52. data/lib/mongo/protocol/query.rb +58 -20
  53. data/lib/mongo/protocol/reply.rb +12 -0
  54. data/lib/mongo/protocol/update.rb +13 -14
  55. data/lib/mongo/server.rb +23 -2
  56. data/lib/mongo/server/connectable.rb +0 -22
  57. data/lib/mongo/server/connection.rb +29 -0
  58. data/lib/mongo/server/description.rb +23 -1
  59. data/lib/mongo/server/monitor.rb +17 -1
  60. data/lib/mongo/server/monitor/connection.rb +24 -0
  61. data/lib/mongo/socket/ssl.rb +28 -16
  62. data/lib/mongo/socket/tcp.rb +1 -1
  63. data/lib/mongo/socket/unix.rb +1 -1
  64. data/lib/mongo/uri.rb +12 -5
  65. data/lib/mongo/version.rb +1 -1
  66. data/spec/mongo/auth/cr_spec.rb +9 -1
  67. data/spec/mongo/auth/ldap_spec.rb +9 -1
  68. data/spec/mongo/auth/scram_spec.rb +9 -1
  69. data/spec/mongo/auth/x509_spec.rb +9 -1
  70. data/spec/mongo/{bulk/bulk_write_spec.rb → bulk_write_spec.rb} +15 -15
  71. data/spec/mongo/client_spec.rb +42 -0
  72. data/spec/mongo/cluster/topology/replica_set_spec.rb +16 -9
  73. data/spec/mongo/cluster/topology/sharded_spec.rb +11 -3
  74. data/spec/mongo/cluster/topology/single_spec.rb +12 -4
  75. data/spec/mongo/cluster_spec.rb +55 -10
  76. data/spec/mongo/collection/view/aggregation_spec.rb +123 -1
  77. data/spec/mongo/collection/view/explainable_spec.rb +1 -1
  78. data/spec/mongo/collection/view/map_reduce_spec.rb +1 -1
  79. data/spec/mongo/collection/view/readable_spec.rb +251 -6
  80. data/spec/mongo/collection/view/writable_spec.rb +4 -4
  81. data/spec/mongo/collection/view_spec.rb +233 -71
  82. data/spec/mongo/collection_spec.rb +905 -9
  83. data/spec/mongo/crud_spec.rb +2 -2
  84. data/spec/mongo/cursor_spec.rb +3 -3
  85. data/spec/mongo/dbref_spec.rb +149 -0
  86. data/spec/mongo/monitoring_spec.rb +168 -0
  87. data/spec/mongo/operation/map_reduce_spec.rb +1 -1
  88. data/spec/mongo/operation/write/bulk/bulk_delete_spec.rb +1 -1
  89. data/spec/mongo/operation/write/bulk/bulk_insert_spec.rb +2 -2
  90. data/spec/mongo/operation/write/bulk/bulk_update_spec.rb +1 -1
  91. data/spec/mongo/operation/write/delete_spec.rb +1 -1
  92. data/spec/mongo/operation/write/insert_spec.rb +2 -2
  93. data/spec/mongo/operation/write/update_spec.rb +1 -1
  94. data/spec/mongo/protocol/query_spec.rb +0 -29
  95. data/spec/mongo/server/connection_pool_spec.rb +18 -6
  96. data/spec/mongo/server/connection_spec.rb +12 -4
  97. data/spec/mongo/server/description_spec.rb +7 -3
  98. data/spec/mongo/server/monitor_spec.rb +30 -0
  99. data/spec/mongo/server_discovery_and_monitoring_spec.rb +11 -4
  100. data/spec/mongo/server_selection_spec.rb +14 -6
  101. data/spec/mongo/server_spec.rb +27 -8
  102. data/spec/mongo/socket/ssl_spec.rb +94 -8
  103. data/spec/mongo/uri_spec.rb +25 -9
  104. data/spec/spec_helper.rb +29 -20
  105. data/spec/support/authorization.rb +19 -4
  106. data/spec/support/certificates/client.pem +4 -4
  107. data/spec/support/crud/read.rb +9 -10
  108. data/spec/support/crud/write.rb +24 -20
  109. data/spec/support/sdam/rs/equal_electionids.yml +45 -0
  110. data/spec/support/sdam/rs/new_primary_new_electionid.yml +98 -0
  111. data/spec/support/sdam/rs/null_election_id.yml +144 -0
  112. data/spec/support/sdam/rs/primary_disconnect_electionid.yml +124 -0
  113. data/spec/support/sdam/sharded/mongos_disconnect.yml +104 -0
  114. data/spec/support/server_discovery_and_monitoring.rb +19 -2
  115. data/spec/support/shared/bulk_write.rb +26 -22
  116. data/spec/support/shared/server_selector.rb +2 -1
  117. metadata +31 -7
  118. metadata.gz.sig +0 -0
  119. data/lib/mongo/error/invalid_uri_option.rb +0 -38
@@ -2,14 +2,26 @@ require 'spec_helper'
2
2
 
3
3
  describe Mongo::Server::ConnectionPool do
4
4
 
5
+ let(:options) do
6
+ TEST_OPTIONS.merge(max_pool_size: 2)
7
+ end
8
+
5
9
  let(:address) do
6
10
  Mongo::Address.new('127.0.0.1:27017')
7
11
  end
8
12
 
13
+ let(:monitoring) do
14
+ Mongo::Monitoring.new
15
+ end
16
+
17
+ let(:listeners) do
18
+ Mongo::Event::Listeners.new
19
+ end
20
+
9
21
  describe '#checkin' do
10
22
 
11
23
  let(:server) do
12
- Mongo::Server.new(address, double('cluster'), Mongo::Event::Listeners.new, ssl: SSL)
24
+ Mongo::Server.new(address, double('cluster'), monitoring, listeners, options)
13
25
  end
14
26
 
15
27
  let!(:pool) do
@@ -39,7 +51,7 @@ describe Mongo::Server::ConnectionPool do
39
51
  describe '#checkout' do
40
52
 
41
53
  let(:server) do
42
- Mongo::Server.new(address, double('cluster'), Mongo::Event::Listeners.new, ssl: SSL)
54
+ Mongo::Server.new(address, double('cluster'), monitoring, listeners, options)
43
55
  end
44
56
 
45
57
  let!(:pool) do
@@ -71,7 +83,7 @@ describe Mongo::Server::ConnectionPool do
71
83
  context 'when a connection is checked out on a different thread' do
72
84
 
73
85
  let!(:connection) do
74
- Thread.new { pool.checkout }.value
86
+ Thread.new { pool.checkout }.join
75
87
  end
76
88
 
77
89
  it 'returns a new connection' do
@@ -87,7 +99,7 @@ describe Mongo::Server::ConnectionPool do
87
99
  describe '.get' do
88
100
 
89
101
  let(:server) do
90
- Mongo::Server.new(address, double('cluster'), Mongo::Event::Listeners.new, ssl: SSL)
102
+ Mongo::Server.new(address, double('cluster'), monitoring, listeners, options)
91
103
  end
92
104
 
93
105
  let!(:pool) do
@@ -102,7 +114,7 @@ describe Mongo::Server::ConnectionPool do
102
114
  describe '#inspect' do
103
115
 
104
116
  let(:server) do
105
- Mongo::Server.new(address, double('cluster'), Mongo::Event::Listeners.new, ssl: SSL)
117
+ Mongo::Server.new(address, double('cluster'), monitoring, listeners, options)
106
118
  end
107
119
 
108
120
  let!(:pool) do
@@ -121,7 +133,7 @@ describe Mongo::Server::ConnectionPool do
121
133
  describe '#with_connection' do
122
134
 
123
135
  let(:server) do
124
- Mongo::Server.new(address, double('cluster'), Mongo::Event::Listeners.new, ssl: SSL)
136
+ Mongo::Server.new(address, double('cluster'), monitoring, listeners, options)
125
137
  end
126
138
 
127
139
  let!(:pool) do
@@ -6,8 +6,16 @@ describe Mongo::Server::Connection do
6
6
  Mongo::Address.new(DEFAULT_ADDRESS)
7
7
  end
8
8
 
9
+ let(:monitoring) do
10
+ Mongo::Monitoring.new
11
+ end
12
+
13
+ let(:listeners) do
14
+ Mongo::Event::Listeners.new
15
+ end
16
+
9
17
  let(:server) do
10
- Mongo::Server.new(address, double('cluster'), Mongo::Event::Listeners.new, ssl: SSL)
18
+ Mongo::Server.new(address, double('cluster'), monitoring, listeners, TEST_OPTIONS)
11
19
  end
12
20
 
13
21
  describe '#connect!' do
@@ -164,7 +172,7 @@ describe Mongo::Server::Connection do
164
172
  end
165
173
 
166
174
  after do
167
- authorized_collection.find.delete_many
175
+ authorized_collection.delete_many
168
176
  end
169
177
 
170
178
  it 'it dispatchs the message to the socket' do
@@ -187,7 +195,7 @@ describe Mongo::Server::Connection do
187
195
  end
188
196
 
189
197
  after do
190
- authorized_collection.find.delete_many
198
+ authorized_collection.delete_many
191
199
  end
192
200
 
193
201
  it 'it dispatchs the message to the socket' do
@@ -225,7 +233,7 @@ describe Mongo::Server::Connection do
225
233
  end
226
234
 
227
235
  after do
228
- authorized_collection.find.delete_many
236
+ authorized_collection.delete_many
229
237
  end
230
238
 
231
239
  it 'disconnects the connection' do
@@ -31,6 +31,10 @@ describe Mongo::Server::Description do
31
31
  Mongo::Address.new('127.0.0.1:27017')
32
32
  end
33
33
 
34
+ let(:monitoring) do
35
+ Mongo::Monitoring.new
36
+ end
37
+
34
38
  describe '#arbiter?' do
35
39
 
36
40
  context 'when the server is an arbiter' do
@@ -583,7 +587,7 @@ describe Mongo::Server::Description do
583
587
  end
584
588
 
585
589
  let(:server) do
586
- Mongo::Server.new(address, double('cluster'), listeners)
590
+ Mongo::Server.new(address, double('cluster'), monitoring, listeners)
587
591
  end
588
592
 
589
593
  let(:description) do
@@ -604,7 +608,7 @@ describe Mongo::Server::Description do
604
608
  end
605
609
 
606
610
  let(:server) do
607
- Mongo::Server.new(other_address, double('cluster'), listeners)
611
+ Mongo::Server.new(other_address, double('cluster'), monitoring, listeners)
608
612
  end
609
613
 
610
614
  it 'returns false' do
@@ -628,7 +632,7 @@ describe Mongo::Server::Description do
628
632
  end
629
633
 
630
634
  let(:server) do
631
- Mongo::Server.new(server_address, double('cluster'), listeners)
635
+ Mongo::Server.new(server_address, double('cluster'), monitoring, listeners)
632
636
  end
633
637
 
634
638
  context 'when the server is included in the description hosts list' do
@@ -141,4 +141,34 @@ describe Mongo::Server::Monitor do
141
141
  expect(monitor.description).to_not be_nil
142
142
  end
143
143
  end
144
+
145
+ describe '#restart!' do
146
+
147
+ let(:monitor) do
148
+ described_class.new(address, listeners, TEST_OPTIONS)
149
+ end
150
+
151
+ let!(:thread) do
152
+ monitor.run!
153
+ end
154
+
155
+ context 'when the monitor is already running' do
156
+
157
+ it 'does not create a new thread' do
158
+ expect(monitor.restart!).to be(thread)
159
+ end
160
+ end
161
+
162
+ context 'when the monitor is not already running' do
163
+
164
+ before do
165
+ monitor.stop!
166
+ sleep(1)
167
+ end
168
+
169
+ it 'creates a new thread' do
170
+ expect(monitor.restart!).not_to be(thread)
171
+ end
172
+ end
173
+ end
144
174
  end
@@ -34,9 +34,10 @@ describe 'Server Discovery and Monitoring' do
34
34
 
35
35
  # The constructor keeps the same API, but does not instantiate a
36
36
  # monitor and run it.
37
- def initialize(address, cluster, event_listeners, options = {})
37
+ def initialize(address, cluster, monitoring, event_listeners, options = {})
38
38
  @address = address
39
39
  @cluster = cluster
40
+ @monitoring = monitoring
40
41
  @options = options.freeze
41
42
  @monitor = Monitor.new(address, event_listeners, options)
42
43
  end
@@ -59,9 +60,10 @@ describe 'Server Discovery and Monitoring' do
59
60
  class Mongo::Server
60
61
 
61
62
  # Returns the constructor to its original implementation.
62
- def initialize(address, cluster, event_listeners, options = {})
63
+ def initialize(address, cluster, monitoring, event_listeners, options = {})
63
64
  @address = address
64
65
  @cluster = cluster
66
+ @monitoring = monitoring
65
67
  @options = options.freeze
66
68
  @monitor = Monitor.new(address, event_listeners, options)
67
69
  @monitor.scan!
@@ -96,8 +98,13 @@ describe 'Server Discovery and Monitoring' do
96
98
  # For each response in the phase, we need to change that server's
97
99
  # description.
98
100
  server = find_server(@client, response.address)
99
- server = Mongo::Server.new(Mongo::Address.new(response.address), @client.cluster,
100
- @client.cluster.send(:event_listeners), @client.cluster.options) unless server
101
+ server = Mongo::Server.new(
102
+ Mongo::Address.new(response.address),
103
+ @client.cluster,
104
+ @client.instance_variable_get(:@monitoring),
105
+ @client.cluster.send(:event_listeners),
106
+ @client.cluster.options
107
+ ) unless server
101
108
  monitor = server.instance_variable_get(:@monitor)
102
109
  description = monitor.inspector.run(server.description, response.ismaster, 0.5)
103
110
  monitor.instance_variable_set(:@description, description)
@@ -14,6 +14,14 @@ describe 'Server Selection' do
14
14
  spec.type.new({})
15
15
  end
16
16
 
17
+ let(:monitoring) do
18
+ Mongo::Monitoring.new
19
+ end
20
+
21
+ let(:listeners) do
22
+ Mongo::Event::Listeners.new
23
+ end
24
+
17
25
  let(:cluster) do
18
26
  double('cluster').tap do |c|
19
27
  allow(c).to receive(:topology).and_return(topology)
@@ -26,7 +34,7 @@ describe 'Server Selection' do
26
34
  let(:candidate_servers) do
27
35
  spec.candidate_servers.collect do |server|
28
36
  address = Mongo::Address.new(server['address'])
29
- Mongo::Server.new(address, double('cluster'), Mongo::Event::Listeners.new, TEST_OPTIONS).tap do |s|
37
+ Mongo::Server.new(address, double('cluster'), monitoring, listeners, TEST_OPTIONS).tap do |s|
30
38
  allow(s).to receive(:average_round_trip_time).and_return(server['avg_rtt_ms'])
31
39
  allow(s).to receive(:tags).and_return(server['tags'])
32
40
  allow(s).to receive(:secondary?).and_return(server['type'] == 'RSSecondary')
@@ -38,7 +46,7 @@ describe 'Server Selection' do
38
46
  let(:in_latency_window) do
39
47
  spec.in_latency_window.collect do |server|
40
48
  address = Mongo::Address.new(server['address'])
41
- Mongo::Server.new(address, double('cluster'), Mongo::Event::Listeners.new, TEST_OPTIONS).tap do |s|
49
+ Mongo::Server.new(address, double('cluster'), monitoring, listeners, TEST_OPTIONS).tap do |s|
42
50
  allow(s).to receive(:average_round_trip_time).and_return(server['avg_rtt_ms'])
43
51
  allow(s).to receive(:tags).and_return(server['tags'])
44
52
  end
@@ -57,18 +65,18 @@ describe 'Server Selection' do
57
65
  end
58
66
 
59
67
  context 'Valid read preference and matching server available', if: spec.server_available? do
60
-
68
+
61
69
  it 'Finds all suitable servers in the latency window', if: spec.replica_set? do
62
- expect(server_selector.send(:select, cluster.servers)).to eq(in_latency_window)
70
+ expect(server_selector.send(:select, cluster.servers)).to eq(in_latency_window)
63
71
  end
64
-
72
+
65
73
  it 'Finds the most suitable server in the latency window' do
66
74
  expect(in_latency_window).to include(server_selector.select_server(cluster))
67
75
  end
68
76
  end
69
77
 
70
78
  context 'No matching server available', if: !spec.server_available? do
71
-
79
+
72
80
  it 'Raises exception' do
73
81
  expect do
74
82
  server_selector.select_server(cluster)
@@ -10,6 +10,10 @@ describe Mongo::Server do
10
10
  Mongo::Event::Listeners.new
11
11
  end
12
12
 
13
+ let(:monitoring) do
14
+ Mongo::Monitoring.new
15
+ end
16
+
13
17
  let(:address) do
14
18
  Mongo::Address.new('127.0.0.1:27017')
15
19
  end
@@ -17,7 +21,7 @@ describe Mongo::Server do
17
21
  describe '#==' do
18
22
 
19
23
  let(:server) do
20
- described_class.new(address, cluster, listeners, TEST_OPTIONS)
24
+ described_class.new(address, cluster, monitoring, listeners, TEST_OPTIONS)
21
25
  end
22
26
 
23
27
  context 'when the other is not a server' do
@@ -36,7 +40,7 @@ describe Mongo::Server do
36
40
  context 'when the addresses match' do
37
41
 
38
42
  let(:other) do
39
- described_class.new(address, cluster, listeners, TEST_OPTIONS)
43
+ described_class.new(address, cluster, monitoring, listeners, TEST_OPTIONS)
40
44
  end
41
45
 
42
46
  it 'returns true' do
@@ -51,7 +55,7 @@ describe Mongo::Server do
51
55
  end
52
56
 
53
57
  let(:other) do
54
- described_class.new(other_address, cluster, listeners, TEST_OPTIONS)
58
+ described_class.new(other_address, cluster, monitoring, listeners, TEST_OPTIONS)
55
59
  end
56
60
 
57
61
  it 'returns false' do
@@ -64,7 +68,7 @@ describe Mongo::Server do
64
68
  describe '#context' do
65
69
 
66
70
  let(:server) do
67
- described_class.new(address, cluster, listeners, TEST_OPTIONS)
71
+ described_class.new(address, cluster, monitoring, listeners, TEST_OPTIONS)
68
72
  end
69
73
 
70
74
  let(:context) do
@@ -79,7 +83,7 @@ describe Mongo::Server do
79
83
  describe '#disconnect!' do
80
84
 
81
85
  let(:server) do
82
- described_class.new(address, cluster, listeners, TEST_OPTIONS)
86
+ described_class.new(address, cluster, monitoring, listeners, TEST_OPTIONS)
83
87
  end
84
88
 
85
89
  it 'stops the monitor instance' do
@@ -91,7 +95,7 @@ describe Mongo::Server do
91
95
  describe '#initialize' do
92
96
 
93
97
  let(:server) do
94
- described_class.new(address, cluster, listeners, TEST_OPTIONS.merge(:heartbeat_frequency => 5))
98
+ described_class.new(address, cluster, monitoring, listeners, TEST_OPTIONS.merge(:heartbeat_frequency => 5))
95
99
  end
96
100
 
97
101
  it 'sets the address host' do
@@ -110,7 +114,7 @@ describe Mongo::Server do
110
114
  describe '#pool' do
111
115
 
112
116
  let(:server) do
113
- described_class.new(address, cluster, listeners, TEST_OPTIONS)
117
+ described_class.new(address, cluster, monitoring, listeners, TEST_OPTIONS)
114
118
  end
115
119
 
116
120
  let(:pool) do
@@ -125,11 +129,26 @@ describe Mongo::Server do
125
129
  describe '#scan!' do
126
130
 
127
131
  let(:server) do
128
- described_class.new(address, cluster, listeners, TEST_OPTIONS)
132
+ described_class.new(address, cluster, monitoring, listeners, TEST_OPTIONS)
129
133
  end
130
134
 
131
135
  it 'forces a scan on the monitor' do
132
136
  expect(server.scan!).to eq(server.description)
133
137
  end
134
138
  end
139
+
140
+ describe '#reconnect!' do
141
+
142
+ let(:server) do
143
+ described_class.new(address, cluster, monitoring, listeners, TEST_OPTIONS)
144
+ end
145
+
146
+ before do
147
+ expect(server.monitor).to receive(:restart!).and_call_original
148
+ end
149
+
150
+ it 'restarts the monitor and returns true' do
151
+ expect(server.reconnect!).to be(true)
152
+ end
153
+ end
135
154
  end
@@ -12,9 +12,10 @@ describe Mongo::Socket::SSL do
12
12
 
13
13
  let(:options) do
14
14
  {
15
- :ssl => true,
16
- :ssl_cert => CLIENT_PEM,
17
- :ssl_key => CLIENT_PEM
15
+ :ssl => true,
16
+ :ssl_cert => CLIENT_PEM,
17
+ :ssl_key => CLIENT_PEM,
18
+ :ssl_verify => false
18
19
  }
19
20
  end
20
21
 
@@ -31,9 +32,10 @@ describe Mongo::Socket::SSL do
31
32
 
32
33
  let(:options) do
33
34
  {
34
- :ssl => true,
35
- :ssl_cert => CLIENT_PEM,
36
- :ssl_key => CRL_PEM
35
+ :ssl => true,
36
+ :ssl_cert => CLIENT_PEM,
37
+ :ssl_key => CRL_PEM,
38
+ :ssl_verify => false
37
39
  }
38
40
  end
39
41
 
@@ -44,14 +46,15 @@ describe Mongo::Socket::SSL do
44
46
  end
45
47
  end
46
48
 
47
- context 'when a CA certificate is provided', if: running_ssl? && testing_locally? do
49
+ context 'when a CA certificate is provided', if: testing_ssl_locally? do
48
50
 
49
51
  let(:options) do
50
52
  {
51
53
  :ssl => true,
52
54
  :ssl_cert => CLIENT_PEM,
53
55
  :ssl_key => CLIENT_PEM,
54
- :ssl_ca_cert => CA_PEM
56
+ :ssl_ca_cert => CA_PEM,
57
+ :ssl_verify => true
55
58
  }
56
59
  end
57
60
 
@@ -63,5 +66,88 @@ describe Mongo::Socket::SSL do
63
66
  expect(socket).to be_alive
64
67
  end
65
68
  end
69
+
70
+ context 'when a CA certificate is not provided', if: testing_ssl_locally? do
71
+
72
+ let(:options) do
73
+ {
74
+ :ssl => true,
75
+ :ssl_cert => CLIENT_PEM,
76
+ :ssl_key => CLIENT_PEM,
77
+ :ssl_verify => true
78
+ }
79
+ end
80
+
81
+ before do
82
+ ENV['SSL_CERT_FILE']= CA_PEM
83
+ socket.connect!
84
+ end
85
+
86
+ it 'uses the default cert store' do
87
+ expect(socket).to be_alive
88
+ end
89
+ end
90
+
91
+ context 'when ssl_verify is not specified', if: testing_ssl_locally? do
92
+
93
+ let(:options) do
94
+ {
95
+ :ssl => true,
96
+ :ssl_cert => CLIENT_PEM,
97
+ :ssl_key => CLIENT_PEM,
98
+ :ssl_ca_cert => CA_PEM
99
+ }
100
+ end
101
+
102
+ before do
103
+ socket.connect!
104
+ end
105
+
106
+ it 'verifies the server certificate' do
107
+ expect(socket).to be_alive
108
+ end
109
+ end
110
+
111
+ context 'when ssl_verify is true', if: testing_ssl_locally? do
112
+
113
+ let(:options) do
114
+ {
115
+ :ssl => true,
116
+ :ssl_cert => CLIENT_PEM,
117
+ :ssl_key => CLIENT_PEM,
118
+ :ssl_ca_cert => CA_PEM,
119
+ :ssl_verify => true
120
+ }
121
+ end
122
+
123
+ before do
124
+ socket.connect!
125
+ end
126
+
127
+ it 'verifies the server certificate' do
128
+ expect(socket).to be_alive
129
+ end
130
+ end
131
+
132
+ context 'when ssl_verify is false' do
133
+
134
+ let(:options) do
135
+ {
136
+ :ssl => true,
137
+ :ssl_cert => CLIENT_PEM,
138
+ :ssl_key => CLIENT_PEM,
139
+ :ssl_ca_cert => 'invalid',
140
+ :ssl_verify => false
141
+ }
142
+ end
143
+
144
+ before do
145
+ socket.connect!
146
+ end
147
+
148
+ it 'does not verify the server certificate' do
149
+ expect(socket).to be_alive
150
+ end
151
+ end
66
152
  end
67
153
  end