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.
Files changed (94) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data.tar.gz.sig +1 -3
  4. data/lib/mongo/address.rb +17 -20
  5. data/lib/mongo/address/ipv4.rb +6 -3
  6. data/lib/mongo/address/ipv6.rb +6 -3
  7. data/lib/mongo/address/unix.rb +5 -2
  8. data/lib/mongo/auth.rb +15 -2
  9. data/lib/mongo/auth/cr/conversation.rb +4 -2
  10. data/lib/mongo/auth/ldap/conversation.rb +4 -2
  11. data/lib/mongo/auth/scram.rb +3 -7
  12. data/lib/mongo/auth/scram/conversation.rb +28 -19
  13. data/lib/mongo/auth/user.rb +45 -10
  14. data/lib/mongo/auth/x509/conversation.rb +4 -2
  15. data/lib/mongo/cluster.rb +9 -17
  16. data/lib/mongo/error.rb +2 -0
  17. data/lib/mongo/error/missing_password.rb +29 -0
  18. data/lib/mongo/error/operation_failure.rb +7 -3
  19. data/lib/mongo/error/parser.rb +2 -1
  20. data/lib/mongo/error/sdam_error_detection.rb +54 -0
  21. data/lib/mongo/operation/aggregate/command.rb +1 -16
  22. data/lib/mongo/operation/aggregate/op_msg.rb +1 -1
  23. data/lib/mongo/operation/collections_info.rb +2 -3
  24. data/lib/mongo/operation/delete/command.rb +2 -15
  25. data/lib/mongo/operation/delete/legacy.rb +1 -16
  26. data/lib/mongo/operation/explain/command.rb +1 -16
  27. data/lib/mongo/operation/explain/legacy.rb +1 -16
  28. data/lib/mongo/operation/find/command.rb +1 -16
  29. data/lib/mongo/operation/find/legacy.rb +1 -16
  30. data/lib/mongo/operation/get_more/command.rb +1 -16
  31. data/lib/mongo/operation/indexes/command.rb +1 -16
  32. data/lib/mongo/operation/indexes/legacy.rb +4 -16
  33. data/lib/mongo/operation/list_collections/command.rb +1 -16
  34. data/lib/mongo/operation/map_reduce/command.rb +1 -16
  35. data/lib/mongo/operation/parallel_scan/command.rb +1 -16
  36. data/lib/mongo/operation/result.rb +3 -0
  37. data/lib/mongo/operation/shared/executable.rb +4 -0
  38. data/lib/mongo/operation/shared/polymorphic_lookup.rb +1 -1
  39. data/lib/mongo/operation/shared/polymorphic_result.rb +8 -1
  40. data/lib/mongo/operation/shared/result/aggregatable.rb +0 -5
  41. data/lib/mongo/operation/update/command.rb +2 -15
  42. data/lib/mongo/operation/update/legacy.rb +1 -16
  43. data/lib/mongo/operation/users_info/command.rb +1 -16
  44. data/lib/mongo/retryable.rb +22 -10
  45. data/lib/mongo/server.rb +10 -1
  46. data/lib/mongo/server/app_metadata.rb +7 -2
  47. data/lib/mongo/server/connectable.rb +0 -6
  48. data/lib/mongo/server/connection.rb +86 -135
  49. data/lib/mongo/server/connection_base.rb +133 -0
  50. data/lib/mongo/server/connection_pool.rb +11 -24
  51. data/lib/mongo/server/connection_pool/queue.rb +41 -41
  52. data/lib/mongo/server/description.rb +1 -1
  53. data/lib/mongo/server/monitor.rb +4 -4
  54. data/lib/mongo/server/monitor/connection.rb +26 -7
  55. data/lib/mongo/server/pending_connection.rb +36 -0
  56. data/lib/mongo/server_selector/selectable.rb +9 -1
  57. data/lib/mongo/session.rb +0 -1
  58. data/lib/mongo/socket.rb +23 -6
  59. data/lib/mongo/socket/ssl.rb +11 -18
  60. data/lib/mongo/socket/tcp.rb +13 -14
  61. data/lib/mongo/socket/unix.rb +9 -27
  62. data/lib/mongo/uri.rb +1 -1
  63. data/lib/mongo/version.rb +1 -1
  64. data/spec/integration/auth_spec.rb +160 -0
  65. data/spec/integration/retryable_writes_spec.rb +55 -58
  66. data/spec/integration/sdam_error_handling_spec.rb +115 -0
  67. data/spec/mongo/address/ipv4_spec.rb +4 -0
  68. data/spec/mongo/address/ipv6_spec.rb +4 -0
  69. data/spec/mongo/auth/scram/conversation_spec.rb +6 -5
  70. data/spec/mongo/auth/scram/negotiation_spec.rb +25 -36
  71. data/spec/mongo/auth/scram_spec.rb +2 -2
  72. data/spec/mongo/auth/user_spec.rb +97 -0
  73. data/spec/mongo/client_construction_spec.rb +1 -1
  74. data/spec/mongo/error/operation_failure_spec.rb +125 -1
  75. data/spec/mongo/retryable_spec.rb +17 -8
  76. data/spec/mongo/server/connection_pool/queue_spec.rb +24 -10
  77. data/spec/mongo/server/connection_pool_spec.rb +30 -117
  78. data/spec/mongo/server/connection_spec.rb +147 -25
  79. data/spec/mongo/server/description_spec.rb +0 -14
  80. data/spec/mongo/server/monitor/connection_spec.rb +22 -0
  81. data/spec/mongo/server_selector_spec.rb +1 -0
  82. data/spec/mongo/server_spec.rb +6 -6
  83. data/spec/mongo/socket/ssl_spec.rb +48 -116
  84. data/spec/mongo/socket/tcp_spec.rb +22 -0
  85. data/spec/mongo/socket/unix_spec.rb +9 -9
  86. data/spec/mongo/socket_spec.rb +15 -3
  87. data/spec/spec_tests/server_selection_spec.rb +2 -0
  88. data/spec/support/client_registry.rb +8 -2
  89. data/spec/support/common_shortcuts.rb +20 -1
  90. data/spec/support/constraints.rb +10 -2
  91. data/spec/support/lite_constraints.rb +8 -0
  92. data/spec/support/spec_config.rb +9 -1
  93. metadata +14 -4
  94. metadata.gz.sig +0 -0
@@ -203,7 +203,7 @@ describe Mongo::Client do
203
203
  it 'does not use compression for authentication messages' do
204
204
  expect(Mongo::Protocol::Compressed).not_to receive(:new)
205
205
  client.cluster.next_primary.send(:with_connection) do |conn|
206
- conn.send(:authenticate!)
206
+ conn.send(:authenticate!, conn)
207
207
  end
208
208
  end
209
209
  end
@@ -1,4 +1,4 @@
1
- require 'spec_helper'
1
+ require 'lite_spec_helper'
2
2
 
3
3
  describe Mongo::Error::OperationFailure do
4
4
 
@@ -219,4 +219,128 @@ describe Mongo::Error::OperationFailure do
219
219
  end
220
220
  end
221
221
  end
222
+
223
+ describe '#not_master?' do
224
+ [10107, 13435].each do |code|
225
+ context "error code #{code}" do
226
+ subject do
227
+ described_class.new("thingy (#{code})", nil,
228
+ :code => code, :code_name => 'thingy')
229
+ end
230
+
231
+ it 'is true' do
232
+ expect(subject.not_master?).to be true
233
+ end
234
+ end
235
+ end
236
+
237
+ # node is recovering error codes
238
+ [11600, 11602, 13436, 189, 91].each do |code|
239
+ context "error code #{code}" do
240
+ subject do
241
+ described_class.new("thingy (#{code})", nil,
242
+ :code => code, :code_name => 'thingy')
243
+ end
244
+
245
+ it 'is false' do
246
+ expect(subject.not_master?).to be false
247
+ end
248
+ end
249
+ end
250
+
251
+ context 'another error code' do
252
+ subject do
253
+ described_class.new('some error (123)', nil,
254
+ :code => 123, :code_name => 'SomeError')
255
+ end
256
+
257
+ it 'is false' do
258
+ expect(subject.not_master?).to be false
259
+ end
260
+ end
261
+
262
+ context 'not master in message with different code' do
263
+ subject do
264
+ described_class.new('not master (999)', nil,
265
+ :code => 999, :code_name => nil)
266
+ end
267
+
268
+ it 'is true' do
269
+ expect(subject.not_master?).to be true
270
+ end
271
+ end
272
+
273
+ context 'not master or secondary text' do
274
+ subject do
275
+ described_class.new('not master or secondary (999)', nil,
276
+ :code => 999, :code_name => nil)
277
+ end
278
+
279
+ it 'is false' do
280
+ expect(subject.not_master?).to be false
281
+ end
282
+ end
283
+ end
284
+
285
+ describe '#node_recovering?' do
286
+ [11600, 11602, 13436, 189, 91].each do |code|
287
+ context "error code #{code}" do
288
+ subject do
289
+ described_class.new("thingy (#{code})", nil,
290
+ :code => code, :code_name => 'thingy')
291
+ end
292
+
293
+ it 'is true' do
294
+ expect(subject.node_recovering?).to be true
295
+ end
296
+ end
297
+ end
298
+
299
+ # not master error codes
300
+ [10107, 13435].each do |code|
301
+ context "error code #{code}" do
302
+ subject do
303
+ described_class.new("thingy (#{code})", nil,
304
+ :code => code, :code_name => 'thingy')
305
+ end
306
+
307
+ it 'is false' do
308
+ expect(subject.node_recovering?).to be false
309
+ end
310
+ end
311
+ end
312
+
313
+ context 'another error code' do
314
+ subject do
315
+ described_class.new('some error (123)', nil,
316
+ :code => 123, :code_name => 'SomeError')
317
+ end
318
+
319
+ it 'is false' do
320
+ expect(subject.node_recovering?).to be false
321
+ end
322
+ end
323
+
324
+ context 'node is recovering in message with different code' do
325
+ subject do
326
+ described_class.new('node is recovering (999)', nil,
327
+ :code => 999, :code_name => nil)
328
+ end
329
+
330
+ it 'is true' do
331
+ expect(subject.node_recovering?).to be true
332
+ end
333
+ end
334
+
335
+ context 'not master or secondary text' do
336
+ subject do
337
+ described_class.new('not master or secondary (999)', nil,
338
+ :code => 999, :code_name => nil)
339
+ end
340
+
341
+ it 'is true' do
342
+ expect(subject.node_recovering?).to be true
343
+ end
344
+ end
345
+ end
222
346
  end
@@ -79,12 +79,14 @@ describe Mongo::Retryable do
79
79
  double('operation')
80
80
  end
81
81
 
82
+ let(:server) { double('server') }
83
+
82
84
  let(:cluster) do
83
- double('cluster', next_primary: server_selector)
85
+ double('cluster', next_primary: server)
84
86
  end
85
87
 
86
88
  let(:server_selector) do
87
- double('server_selector', select_server: double('server'))
89
+ double('server_selector', select_server: server)
88
90
  end
89
91
 
90
92
  let(:retryable) do
@@ -418,7 +420,7 @@ describe Mongo::Retryable do
418
420
  # Quick sanity check that the expected code path is being exercised
419
421
  expect(retryable.retry_write_allowed_as_configured?).to be true
420
422
 
421
- allow(server_selector).to receive(:retry_writes?).and_return(true)
423
+ allow(server).to receive(:retry_writes?).and_return(true)
422
424
  allow(cluster).to receive(:scan!)
423
425
  end
424
426
 
@@ -442,9 +444,9 @@ describe Mongo::Retryable do
442
444
  context 'when a not master error occurs' do
443
445
 
444
446
  before do
447
+ server = cluster.next_primary
445
448
  expect(operation).to receive(:execute).and_raise(
446
449
  Mongo::Error::OperationFailure.new('not master')).ordered
447
- expect(cluster).to receive(:scan!).and_return(true).ordered
448
450
  expect(operation).to receive(:execute).and_return(true).ordered
449
451
  end
450
452
 
@@ -454,9 +456,9 @@ describe Mongo::Retryable do
454
456
  context 'when a node is recovering error occurs' do
455
457
 
456
458
  before do
459
+ server = cluster.next_primary
457
460
  expect(operation).to receive(:execute).and_raise(
458
461
  Mongo::Error::OperationFailure.new('node is recovering')).ordered
459
- expect(cluster).to receive(:scan!).and_return(true).ordered
460
462
  expect(operation).to receive(:execute).and_return(true).ordered
461
463
  end
462
464
 
@@ -466,10 +468,10 @@ describe Mongo::Retryable do
466
468
  context 'when a retryable error occurs with a code' do
467
469
 
468
470
  before do
471
+ server = cluster.next_primary
469
472
  expect(operation).to receive(:execute).and_raise(
470
473
  Mongo::Error::OperationFailure.new('message missing', nil,
471
474
  :code => 91, :code_name => 'ShutdownInProgress')).ordered
472
- expect(cluster).to receive(:scan!).and_return(true).ordered
473
475
  expect(operation).to receive(:execute).and_return(true).ordered
474
476
  end
475
477
 
@@ -494,7 +496,10 @@ describe Mongo::Retryable do
494
496
  before do
495
497
  expect(operation).to receive(:execute).and_raise(
496
498
  Mongo::Error::SocketError.new('socket error')).ordered
497
- expect(cluster).to receive(:scan!).and_return(true).ordered
499
+ # This is where the server would be marked unknown, but since
500
+ # we are not tracking which server the operation was sent to,
501
+ # we are not able to assert this.
502
+ # There is no explicit cluster scan requested.
498
503
  expect(operation).to receive(:execute).and_return(true).ordered
499
504
  end
500
505
 
@@ -506,7 +511,11 @@ describe Mongo::Retryable do
506
511
  before do
507
512
  expect(operation).to receive(:execute).and_raise(
508
513
  Mongo::Error::SocketTimeoutError.new('socket timeout')).ordered
509
- expect(cluster).to receive(:scan!).and_return(true).ordered
514
+ # This is where the server would be marked unknown, but since
515
+ # we are not tracking which server the operation was sent to,
516
+ # we are not able to assert this.
517
+ # There is no explicit cluster scan requested (and the operation may
518
+ # end up being sent to the same server it was sent to originally).
510
519
  expect(operation).to receive(:execute).and_return(true).ordered
511
520
  end
512
521
 
@@ -96,14 +96,14 @@ describe Mongo::Server::ConnectionPool::Queue do
96
96
  create_queue(1)
97
97
  end
98
98
 
99
- it 'disconnects all connections in the queue and recreates up to min size with new generation' do
99
+ it 'disconnects all connections in the queue and bumps generation' do
100
100
  expect(queue.queue_size).to eq(2)
101
101
  expect(queue.pool_size).to eq(2)
102
102
 
103
103
  queue.disconnect!
104
104
 
105
- expect(queue.queue_size).to eq(1)
106
- expect(queue.pool_size).to eq(1)
105
+ expect(queue.queue_size).to eq(0)
106
+ expect(queue.pool_size).to eq(0)
107
107
 
108
108
  new_connection = queue.dequeue
109
109
  expect(new_connection).not_to eq(connection)
@@ -304,12 +304,14 @@ describe Mongo::Server::ConnectionPool::Queue do
304
304
  end
305
305
 
306
306
  describe 'close_stale_sockets!!' do
307
+ after do
308
+ Timecop.return
309
+ end
307
310
 
308
311
  let(:queue) do
309
312
  described_class.new(max_pool_size: 2, max_idle_time: 0.5) do
310
313
  double('connection').tap do |con|
311
314
  expect(con).to receive(:generation).and_return(1)
312
- expect(con).to receive(:disconnect!).and_return(true)
313
315
  allow(con).to receive(:record_checkin!) do
314
316
  allow(con).to receive(:last_checkin).and_return(Time.now)
315
317
  con
@@ -324,16 +326,28 @@ describe Mongo::Server::ConnectionPool::Queue do
324
326
  end
325
327
  end
326
328
 
327
- before do
328
- queue.enqueue(connection)
329
- expect(connection).to receive(:connect!).and_return(true)
330
- sleep(0.5)
329
+ it 'disconnects all expired and only expired connections' do
330
+ c1 = queue.dequeue
331
+ expect(c1).to receive(:disconnect!)
332
+ c2 = queue.dequeue
333
+ expect(c2).not_to receive(:disconnect!)
334
+
335
+ queue.enqueue(c1)
336
+ Timecop.travel(Time.now + 1)
337
+ queue.enqueue(c2)
338
+
339
+ expect(queue.queue_size).to eq(2)
340
+ expect(queue.pool_size).to eq(2)
341
+ expect(queue.queue.length).to eq(2)
342
+
343
+ expect(c1).not_to receive(:connect!)
344
+ expect(c2).not_to receive(:connect!)
345
+
331
346
  queue.close_stale_sockets!
332
- end
333
347
 
334
- it 'disconnects and reconnects up to min_size the expired connections' do
335
348
  expect(queue.queue_size).to eq(1)
336
349
  expect(queue.pool_size).to eq(1)
350
+ expect(queue.queue.length).to eq(1)
337
351
  end
338
352
  end
339
353
  end
@@ -35,11 +35,11 @@ describe Mongo::Server::ConnectionPool do
35
35
  end
36
36
 
37
37
  let!(:pool) do
38
- described_class.get(server)
38
+ server.pool
39
39
  end
40
40
 
41
41
  after do
42
- expect(cluster).to receive(:pool).with(server).and_return(pool)
42
+ expect(server).to receive(:pool).and_return(pool)
43
43
  server.disconnect!
44
44
  end
45
45
 
@@ -70,7 +70,7 @@ describe Mongo::Server::ConnectionPool do
70
70
  end
71
71
 
72
72
  let!(:pool) do
73
- described_class.get(server)
73
+ server.pool
74
74
  end
75
75
 
76
76
  context 'when no connection is checked out on the same thread' do
@@ -129,36 +129,16 @@ describe Mongo::Server::ConnectionPool do
129
129
  end
130
130
 
131
131
  let!(:pool) do
132
- described_class.get(server)
132
+ server.pool
133
133
  end
134
134
 
135
135
  it 'disconnects the queue' do
136
- expect(cluster).to receive(:pool).with(server).and_return(pool)
136
+ expect(server).to receive(:pool).and_return(pool)
137
137
  expect(pool.send(:queue)).to receive(:disconnect!).once.and_call_original
138
138
  server.disconnect!
139
139
  end
140
140
  end
141
141
 
142
- describe '.get' do
143
-
144
- let(:server) do
145
- Mongo::Server.new(address, cluster, monitoring, listeners, options)
146
- end
147
-
148
- let!(:pool) do
149
- described_class.get(server)
150
- end
151
-
152
- after do
153
- expect(cluster).to receive(:pool).with(server).and_return(pool)
154
- server.disconnect!
155
- end
156
-
157
- it 'returns the pool for the server' do
158
- expect(pool).to_not be_nil
159
- end
160
- end
161
-
162
142
  describe '#inspect' do
163
143
 
164
144
  let(:server) do
@@ -166,11 +146,11 @@ describe Mongo::Server::ConnectionPool do
166
146
  end
167
147
 
168
148
  let!(:pool) do
169
- described_class.get(server)
149
+ server.pool
170
150
  end
171
151
 
172
152
  after do
173
- expect(cluster).to receive(:pool).with(server).and_return(pool)
153
+ expect(server).to receive(:pool).and_return(pool)
174
154
  server.disconnect!
175
155
  end
176
156
 
@@ -190,7 +170,7 @@ describe Mongo::Server::ConnectionPool do
190
170
  end
191
171
 
192
172
  let!(:pool) do
193
- described_class.get(server)
173
+ server.pool
194
174
  end
195
175
 
196
176
  context 'when a connection cannot be checked out' do
@@ -217,7 +197,7 @@ describe Mongo::Server::ConnectionPool do
217
197
  end
218
198
 
219
199
  let!(:pool) do
220
- described_class.get(server)
200
+ server.pool
221
201
  end
222
202
 
223
203
  let(:options) do
@@ -245,7 +225,7 @@ describe Mongo::Server::ConnectionPool do
245
225
  end
246
226
 
247
227
  let!(:pool) do
248
- described_class.get(server)
228
+ server.pool
249
229
  end
250
230
 
251
231
  let(:queue) do
@@ -297,14 +277,16 @@ describe Mongo::Server::ConnectionPool do
297
277
  end
298
278
 
299
279
  context 'when min size is > 0' do
280
+ after do
281
+ Timecop.return
282
+ end
300
283
 
301
284
  context 'when more than the number of min_size are checked out' do
302
-
303
285
  let(:options) do
304
286
  SpecConfig.instance.test_options.merge(max_pool_size: 5, min_pool_size: 3, max_idle_time: 0.5)
305
287
  end
306
288
 
307
- before do
289
+ it 'closes and removes connections with stale sockets and does not connect new ones' do
308
290
  first = pool.checkout
309
291
  second = pool.checkout
310
292
  third = pool.checkout
@@ -316,13 +298,14 @@ describe Mongo::Server::ConnectionPool do
316
298
  expect(fifth).to receive(:disconnect!).and_call_original
317
299
  expect(fifth).not_to receive(:connect!)
318
300
 
319
- sleep(0.5)
301
+ Timecop.travel(Time.now + 1)
302
+ expect(queue.length).to be(1)
320
303
  pool.close_stale_sockets!
321
- end
322
304
 
323
- it 'closes all stale sockets and does not connect new ones' do
324
- expect(queue.size).to be(1)
325
- expect(queue[0].connected?).to be(false)
305
+ expect(pool.send(:queue).pool_size).to be(4)
306
+ expect(pool.send(:queue).queue_size).to be(0)
307
+ expect(queue.length).to be(0)
308
+ expect(fifth.connected?).to be(false)
326
309
  end
327
310
  end
328
311
 
@@ -332,46 +315,7 @@ describe Mongo::Server::ConnectionPool do
332
315
  SpecConfig.instance.test_options.merge(max_pool_size: 5, min_pool_size: 3, max_idle_time: 0.5)
333
316
  end
334
317
 
335
- before do
336
- first = pool.checkout
337
- second = pool.checkout
338
- third = pool.checkout
339
- fourth = pool.checkout
340
- fifth = pool.checkout
341
-
342
- pool.checkin(third)
343
- pool.checkin(fourth)
344
- pool.checkin(fifth)
345
-
346
-
347
- expect(third).to receive(:disconnect!).and_call_original
348
- expect(third).not_to receive(:connect!)
349
-
350
- expect(fourth).to receive(:disconnect!).and_call_original
351
- expect(fourth).not_to receive(:connect!)
352
-
353
- expect(fifth).to receive(:disconnect!).and_call_original
354
- expect(fifth).to receive(:connect!).and_call_original
355
-
356
- sleep(0.5)
357
- pool.close_stale_sockets!
358
- end
359
-
360
- it 'closes all stale sockets and does not connect new ones' do
361
- expect(queue.size).to be(3)
362
- expect(queue[0].connected?).to be(true)
363
- expect(queue[1].connected?).to be(false)
364
- expect(queue[2].connected?).to be(false)
365
- end
366
- end
367
-
368
- context 'when a stale connection is unsuccessfully reconnected' do
369
-
370
- let(:options) do
371
- SpecConfig.instance.test_options.merge(max_pool_size: 5, min_pool_size: 3, max_idle_time: 0.5)
372
- end
373
-
374
- before do
318
+ it 'closes and removes connections with stale sockets and does not connect new ones' do
375
319
  first = pool.checkout
376
320
  second = pool.checkout
377
321
  third = pool.checkout
@@ -390,50 +334,19 @@ describe Mongo::Server::ConnectionPool do
390
334
  expect(fourth).not_to receive(:connect!)
391
335
 
392
336
  expect(fifth).to receive(:disconnect!).and_call_original
393
- allow(fifth).to receive(:connect!).and_raise(Mongo::Error::SocketError)
337
+ expect(fifth).not_to receive(:connect!).and_call_original
394
338
 
395
- sleep(0.5)
339
+ Timecop.travel(Time.now + 1)
340
+ expect(queue.length).to be(3)
396
341
  pool.close_stale_sockets!
397
- end
398
-
399
- it 'is kept in the pool' do
400
- expect(queue.size).to be(3)
401
- expect(queue[0].connected?).to be(false)
402
- expect(queue[1].connected?).to be(false)
403
- expect(queue[2].connected?).to be(false)
404
- end
405
- end
406
342
 
407
- context 'when exactly the min_size number of connections is checked out' do
408
-
409
- let(:options) do
410
- SpecConfig.instance.test_options.merge(max_pool_size: 5, min_pool_size: 3, max_idle_time: 0.5)
411
- end
412
-
413
- before do
414
- first = pool.checkout
415
- second = pool.checkout
416
- third = pool.checkout
417
- fourth = pool.checkout
418
- fifth = pool.checkout
419
-
420
- pool.checkin(fourth)
421
- pool.checkin(fifth)
422
-
423
- expect(fourth).to receive(:disconnect!).and_call_original
424
- expect(fourth).not_to receive(:connect!)
425
-
426
- expect(fifth).to receive(:disconnect!).and_call_original
427
- expect(fifth).not_to receive(:connect!)
428
-
429
- sleep(0.5)
430
- pool.close_stale_sockets!
431
- end
343
+ expect(pool.send(:queue).pool_size).to be(2)
344
+ expect(pool.send(:queue).queue_size).to be(0)
345
+ expect(queue.length).to be(0)
432
346
 
433
- it 'closes all stale sockets and does not connect new ones' do
434
- expect(queue.size).to be(2)
435
- expect(queue[0].connected?).to be(false)
436
- expect(queue[1].connected?).to be(false)
347
+ expect(third.connected?).to be(false)
348
+ expect(fourth.connected?).to be(false)
349
+ expect(fifth.connected?).to be(false)
437
350
  end
438
351
  end
439
352
  end