mongo 2.9.2 → 2.10.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 (227) 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 +1 -0
  5. data/lib/mongo/auth/user/view.rb +4 -4
  6. data/lib/mongo/bulk_write.rb +14 -8
  7. data/lib/mongo/bulk_write/result.rb +1 -1
  8. data/lib/mongo/bulk_write/result_combiner.rb +2 -2
  9. data/lib/mongo/bulk_write/transformable.rb +17 -9
  10. data/lib/mongo/client.rb +107 -16
  11. data/lib/mongo/cluster.rb +47 -25
  12. data/lib/mongo/cluster/topology/replica_set_no_primary.rb +1 -1
  13. data/lib/mongo/cluster_time.rb +139 -0
  14. data/lib/mongo/collection.rb +84 -25
  15. data/lib/mongo/collection/view.rb +7 -3
  16. data/lib/mongo/collection/view/aggregation.rb +4 -4
  17. data/lib/mongo/collection/view/builder/aggregation.rb +31 -6
  18. data/lib/mongo/collection/view/builder/find_command.rb +4 -1
  19. data/lib/mongo/collection/view/builder/map_reduce.rb +4 -1
  20. data/lib/mongo/collection/view/change_stream.rb +54 -66
  21. data/lib/mongo/collection/view/iterable.rb +2 -2
  22. data/lib/mongo/collection/view/map_reduce.rb +6 -4
  23. data/lib/mongo/collection/view/readable.rb +36 -16
  24. data/lib/mongo/collection/view/writable.rb +68 -22
  25. data/lib/mongo/cursor.rb +87 -20
  26. data/lib/mongo/database.rb +47 -43
  27. data/lib/mongo/database/view.rb +54 -11
  28. data/lib/mongo/error.rb +13 -4
  29. data/lib/mongo/error/invalid_write_concern.rb +2 -2
  30. data/lib/mongo/error/operation_failure.rb +65 -11
  31. data/lib/mongo/error/parser.rb +41 -8
  32. data/lib/mongo/grid/fs_bucket.rb +26 -6
  33. data/lib/mongo/grid/stream/read.rb +9 -2
  34. data/lib/mongo/grid/stream/write.rb +21 -5
  35. data/lib/mongo/index/view.rb +3 -3
  36. data/lib/mongo/lint.rb +10 -3
  37. data/lib/mongo/operation.rb +2 -0
  38. data/lib/mongo/operation/aggregate/result.rb +19 -6
  39. data/lib/mongo/operation/collections_info.rb +1 -1
  40. data/lib/mongo/operation/get_more/result.rb +9 -0
  41. data/lib/mongo/operation/list_collections/command.rb +1 -3
  42. data/lib/mongo/operation/list_collections/op_msg.rb +1 -2
  43. data/lib/mongo/operation/parallel_scan/command.rb +4 -1
  44. data/lib/mongo/operation/parallel_scan/op_msg.rb +4 -1
  45. data/lib/mongo/operation/result.rb +27 -4
  46. data/lib/mongo/operation/shared/executable.rb +19 -5
  47. data/lib/mongo/operation/shared/executable_no_validate.rb +1 -2
  48. data/lib/mongo/operation/shared/executable_transaction_label.rb +0 -9
  49. data/lib/mongo/operation/shared/polymorphic_result.rb +9 -1
  50. data/lib/mongo/operation/shared/result/aggregatable.rb +2 -2
  51. data/lib/mongo/operation/shared/sessions_supported.rb +42 -32
  52. data/lib/mongo/operation/shared/specifiable.rb +40 -0
  53. data/lib/mongo/operation/shared/unpinnable.rb +39 -0
  54. data/lib/mongo/operation/shared/write.rb +1 -1
  55. data/lib/mongo/protocol/update.rb +6 -2
  56. data/lib/mongo/retryable.rb +79 -39
  57. data/lib/mongo/server/connection.rb +10 -3
  58. data/lib/mongo/server/description.rb +25 -1
  59. data/lib/mongo/server/monitor/connection.rb +1 -1
  60. data/lib/mongo/server_selector.rb +10 -0
  61. data/lib/mongo/server_selector/selectable.rb +172 -32
  62. data/lib/mongo/session.rb +654 -581
  63. data/lib/mongo/session/session_pool.rb +1 -1
  64. data/lib/mongo/socket.rb +7 -28
  65. data/lib/mongo/socket/ssl.rb +26 -1
  66. data/lib/mongo/socket/tcp.rb +3 -0
  67. data/lib/mongo/socket/unix.rb +3 -0
  68. data/lib/mongo/uri.rb +112 -265
  69. data/lib/mongo/uri/srv_protocol.rb +4 -1
  70. data/lib/mongo/version.rb +1 -1
  71. data/lib/mongo/write_concern.rb +10 -29
  72. data/lib/mongo/write_concern/acknowledged.rb +12 -0
  73. data/lib/mongo/write_concern/base.rb +17 -13
  74. data/lib/mongo/write_concern/unacknowledged.rb +12 -0
  75. data/spec/atlas/atlas_connectivity_spec.rb +7 -37
  76. data/spec/atlas/operations_spec.rb +25 -0
  77. data/spec/integration/change_stream_examples_spec.rb +45 -31
  78. data/spec/integration/change_stream_spec.rb +305 -5
  79. data/spec/integration/client_spec.rb +44 -0
  80. data/spec/integration/command_monitoring_spec.rb +1 -0
  81. data/spec/integration/command_spec.rb +7 -1
  82. data/spec/integration/mmapv1_spec.rb +28 -0
  83. data/spec/integration/mongos_pinning_spec.rb +34 -0
  84. data/spec/integration/operation_failure_code_spec.rb +2 -2
  85. data/spec/integration/{read_concern.rb → read_concern_spec.rb} +7 -1
  86. data/spec/integration/read_preference_spec.rb +485 -0
  87. data/spec/integration/retryable_writes_spec.rb +8 -19
  88. data/spec/integration/sdam_error_handling_spec.rb +1 -1
  89. data/spec/integration/sdam_events_spec.rb +2 -2
  90. data/spec/integration/server_description_spec.rb +14 -17
  91. data/spec/integration/server_selector_spec.rb +7 -3
  92. data/spec/integration/server_spec.rb +48 -0
  93. data/spec/integration/ssl_uri_options_spec.rb +1 -1
  94. data/spec/integration/step_down_spec.rb +10 -4
  95. data/spec/integration/transactions_examples_spec.rb +11 -10
  96. data/spec/lite_spec_helper.rb +19 -16
  97. data/spec/mongo/auth/scram/negotiation_spec.rb +11 -8
  98. data/spec/mongo/bulk_write/ordered_combiner_spec.rb +6 -6
  99. data/spec/mongo/bulk_write/unordered_combiner_spec.rb +4 -4
  100. data/spec/mongo/bulk_write_spec.rb +12 -2
  101. data/spec/mongo/client_construction_spec.rb +160 -8
  102. data/spec/mongo/client_spec.rb +5 -4
  103. data/spec/mongo/cluster_spec.rb +6 -6
  104. data/spec/mongo/cluster_time_spec.rb +148 -0
  105. data/spec/mongo/collection/view/aggregation_spec.rb +34 -15
  106. data/spec/mongo/collection/view/change_stream_spec.rb +62 -3
  107. data/spec/mongo/collection/view/map_reduce_spec.rb +7 -5
  108. data/spec/mongo/collection/view/readable_spec.rb +4 -4
  109. data/spec/mongo/collection_spec.rb +331 -14
  110. data/spec/mongo/cursor_spec.rb +117 -5
  111. data/spec/mongo/database_spec.rb +240 -8
  112. data/spec/mongo/error/operation_failure_spec.rb +47 -1
  113. data/spec/mongo/error/parser_spec.rb +160 -23
  114. data/spec/mongo/operation/insert/bulk_spec.rb +2 -1
  115. data/spec/mongo/operation/result_spec.rb +27 -0
  116. data/spec/mongo/operation/update/bulk_spec.rb +1 -0
  117. data/spec/mongo/retryable_spec.rb +2 -0
  118. data/spec/mongo/server/app_metadata_spec.rb +2 -2
  119. data/spec/mongo/server/connection_spec.rb +13 -17
  120. data/spec/mongo/server/monitor/connection_spec.rb +13 -10
  121. data/spec/mongo/server_selector_spec.rb +34 -2
  122. data/spec/mongo/session/session_pool_spec.rb +14 -3
  123. data/spec/mongo/session_spec.rb +3 -3
  124. data/spec/mongo/session_transaction_spec.rb +4 -3
  125. data/spec/mongo/socket/ssl_spec.rb +19 -5
  126. data/spec/mongo/socket_spec.rb +1 -62
  127. data/spec/mongo/uri/srv_protocol_spec.rb +14 -20
  128. data/spec/mongo/uri_option_parsing_spec.rb +94 -8
  129. data/spec/mongo/uri_spec.rb +23 -10
  130. data/spec/mongo/write_concern_spec.rb +56 -3
  131. data/spec/spec_tests/change_streams_spec.rb +2 -1
  132. data/spec/spec_tests/cmap_spec.rb +1 -1
  133. data/spec/spec_tests/crud_spec.rb +12 -2
  134. data/spec/spec_tests/data/change_streams/change-streams-errors.yml +24 -1
  135. data/spec/spec_tests/data/change_streams/change-streams.yml +172 -3
  136. data/spec/spec_tests/data/command_monitoring/bulkWrite.yml +1 -1
  137. data/spec/spec_tests/data/command_monitoring/updateMany.yml +0 -2
  138. data/spec/spec_tests/data/command_monitoring/updateOne.yml +0 -5
  139. data/spec/spec_tests/data/crud/read/aggregate-out.yml +0 -6
  140. data/spec/spec_tests/data/crud/read/count-empty.yml +29 -0
  141. data/spec/spec_tests/data/crud/write/bulkWrite-arrayFilters.yml +1 -0
  142. data/spec/spec_tests/data/crud/write/bulkWrite-collation.yml +101 -0
  143. data/spec/spec_tests/data/crud/write/bulkWrite.yml +401 -0
  144. data/spec/spec_tests/data/crud/write/insertMany.yml +58 -2
  145. data/spec/spec_tests/data/crud/write/updateMany-arrayFilters.yml +3 -0
  146. data/spec/spec_tests/data/crud/write/updateOne-arrayFilters.yml +6 -1
  147. data/spec/spec_tests/data/crud_v2/aggregate-merge.yml +103 -0
  148. data/spec/spec_tests/data/crud_v2/aggregate-out-readConcern.yml +110 -0
  149. data/spec/spec_tests/data/crud_v2/bulkWrite-arrayFilters.yml +81 -0
  150. data/spec/spec_tests/data/crud_v2/db-aggregate.yml +38 -0
  151. data/spec/spec_tests/data/crud_v2/updateWithPipelines.yml +92 -0
  152. data/spec/spec_tests/data/retryable_writes/insertOne-serverErrors.yml +2 -2
  153. data/spec/spec_tests/data/transactions/abort.yml +3 -0
  154. data/spec/spec_tests/data/transactions/bulk.yml +3 -8
  155. data/spec/spec_tests/data/transactions/causal-consistency.yml +3 -8
  156. data/spec/spec_tests/data/transactions/commit.yml +3 -1
  157. data/spec/spec_tests/data/transactions/count.yml +3 -0
  158. data/spec/spec_tests/data/transactions/delete.yml +3 -0
  159. data/spec/spec_tests/data/transactions/error-labels.yml +4 -1
  160. data/spec/spec_tests/data/transactions/errors-client.yml +56 -0
  161. data/spec/spec_tests/data/transactions/errors.yml +3 -0
  162. data/spec/spec_tests/data/transactions/findOneAndDelete.yml +3 -0
  163. data/spec/spec_tests/data/transactions/findOneAndReplace.yml +3 -0
  164. data/spec/spec_tests/data/transactions/findOneAndUpdate.yml +3 -0
  165. data/spec/spec_tests/data/transactions/insert.yml +3 -0
  166. data/spec/spec_tests/data/transactions/isolation.yml +3 -0
  167. data/spec/spec_tests/data/transactions/mongos-pin-auto.yml +1671 -0
  168. data/spec/spec_tests/data/transactions/mongos-recovery-token.yml +347 -0
  169. data/spec/spec_tests/data/transactions/pin-mongos.yml +557 -0
  170. data/spec/spec_tests/data/transactions/read-concern.yml +3 -0
  171. data/spec/spec_tests/data/transactions/read-pref.yml +3 -0
  172. data/spec/spec_tests/data/transactions/reads.yml +3 -0
  173. data/spec/spec_tests/data/transactions/retryable-abort.yml +5 -2
  174. data/spec/spec_tests/data/transactions/retryable-commit.yml +4 -1
  175. data/spec/spec_tests/data/transactions/retryable-writes.yml +3 -0
  176. data/spec/spec_tests/data/transactions/run-command.yml +3 -0
  177. data/spec/spec_tests/data/transactions/transaction-options.yml +6 -0
  178. data/spec/spec_tests/data/transactions/update.yml +3 -8
  179. data/spec/spec_tests/data/transactions/write-concern.yml +348 -38
  180. data/spec/spec_tests/data/transactions_api/callback-aborts.yml +6 -0
  181. data/spec/spec_tests/data/transactions_api/callback-commits.yml +5 -0
  182. data/spec/spec_tests/data/transactions_api/callback-retry.yml +7 -2
  183. data/spec/spec_tests/data/transactions_api/commit-retry.yml +70 -15
  184. data/spec/spec_tests/data/transactions_api/commit-transienttransactionerror-4.2.yml +3 -0
  185. data/spec/spec_tests/data/transactions_api/commit-transienttransactionerror.yml +3 -0
  186. data/spec/spec_tests/data/transactions_api/commit-writeconcernerror.yml +59 -109
  187. data/spec/spec_tests/data/transactions_api/commit.yml +5 -0
  188. data/spec/spec_tests/data/transactions_api/transaction-options.yml +10 -0
  189. data/spec/spec_tests/retryable_reads_spec.rb +5 -2
  190. data/spec/spec_tests/retryable_writes_spec.rb +5 -2
  191. data/spec/spec_tests/sdam_monitoring_spec.rb +3 -3
  192. data/spec/spec_tests/sdam_spec.rb +2 -2
  193. data/spec/spec_tests/transactions_api_spec.rb +1 -67
  194. data/spec/spec_tests/transactions_spec.rb +2 -66
  195. data/spec/support/authorization.rb +4 -0
  196. data/spec/support/change_streams.rb +30 -10
  197. data/spec/support/change_streams/operation.rb +27 -0
  198. data/spec/support/client_registry.rb +44 -25
  199. data/spec/support/cluster_config.rb +25 -14
  200. data/spec/support/cluster_tools.rb +32 -10
  201. data/spec/support/command_monitoring.rb +1 -1
  202. data/spec/support/common_shortcuts.rb +30 -0
  203. data/spec/support/connection_string.rb +8 -3
  204. data/spec/support/constraints.rb +34 -0
  205. data/spec/support/crud.rb +31 -16
  206. data/spec/support/crud/context.rb +23 -0
  207. data/spec/support/crud/operation.rb +311 -14
  208. data/spec/support/crud/spec.rb +2 -1
  209. data/spec/support/crud/test.rb +24 -27
  210. data/spec/support/crud/test_base.rb +22 -0
  211. data/spec/support/crud/verifier.rb +15 -1
  212. data/spec/support/event_subscriber.rb +12 -0
  213. data/spec/support/sdam_formatter_integration.rb +12 -6
  214. data/spec/support/shared/server_selector.rb +10 -0
  215. data/spec/support/shared/session.rb +13 -12
  216. data/spec/support/spec_config.rb +32 -22
  217. data/spec/support/spec_setup.rb +2 -2
  218. data/spec/support/transactions.rb +87 -0
  219. data/spec/support/transactions/context.rb +33 -0
  220. data/spec/support/transactions/operation.rb +99 -349
  221. data/spec/support/transactions/spec.rb +1 -3
  222. data/spec/support/transactions/test.rb +110 -49
  223. data/spec/support/utils.rb +74 -1
  224. metadata +52 -10
  225. metadata.gz.sig +0 -0
  226. data/spec/support/crud/read.rb +0 -265
  227. data/spec/support/crud/write.rb +0 -284
@@ -148,6 +148,52 @@ describe Mongo::Error::OperationFailure do
148
148
  end
149
149
  end
150
150
  end
151
+
152
+ context 'when there is a non-resumable label' do
153
+ context 'getMore response' do
154
+ let(:error) { Mongo::Error::OperationFailure.new('no message',
155
+ Mongo::Operation::GetMore::Result.new([]),
156
+ :code => 91, :code_name => 'ShutdownInProgress',
157
+ :labels => ['NonResumableChangeStreamError']) }
158
+
159
+ it 'returns false' do
160
+ expect(error.change_stream_resumable?).to eql(false)
161
+ end
162
+ end
163
+
164
+ context 'not a getMore response' do
165
+ let(:error) { Mongo::Error::OperationFailure.new('no message', nil,
166
+ :code => 91, :code_name => 'ShutdownInProgress',
167
+ :labels => ['NonResumableChangeStreamError']) }
168
+
169
+ it 'returns false' do
170
+ expect(error.change_stream_resumable?).to eql(false)
171
+ end
172
+ end
173
+ end
174
+
175
+ context 'when there is another label' do
176
+ context 'getMore response' do
177
+ let(:error) { Mongo::Error::OperationFailure.new('no message',
178
+ Mongo::Operation::GetMore::Result.new([]),
179
+ :code => 91, :code_name => 'ShutdownInProgress',
180
+ :labels => %w(TransientTransactionError)) }
181
+
182
+ it 'returns true' do
183
+ expect(error.change_stream_resumable?).to eql(true)
184
+ end
185
+ end
186
+
187
+ context 'not a getMore response' do
188
+ let(:error) { Mongo::Error::OperationFailure.new('no message', nil,
189
+ :code => 91, :code_name => 'ShutdownInProgress',
190
+ :labels => %w(TransientTransactionError)) }
191
+
192
+ it 'returns false' do
193
+ expect(error.change_stream_resumable?).to eql(false)
194
+ end
195
+ end
196
+ end
151
197
  end
152
198
 
153
199
  describe '#labels' do
@@ -210,7 +256,7 @@ describe Mongo::Error::OperationFailure do
210
256
  context 'when the error has labels' do
211
257
 
212
258
  let(:labels) do
213
- [ Mongo::Error::TRANSIENT_TRANSACTION_ERROR_LABEL ]
259
+ %w(TransientTransactionError)
214
260
  end
215
261
 
216
262
  it 'has the correct labels' do
@@ -1,13 +1,12 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe Mongo::Error::Parser do
4
+ let(:parser) do
5
+ described_class.new(document)
6
+ end
4
7
 
5
8
  describe '#message' do
6
9
 
7
- let(:parser) do
8
- described_class.new(document)
9
- end
10
-
11
10
  context 'when the document contains no error message' do
12
11
 
13
12
  let(:document) do
@@ -97,9 +96,6 @@ describe Mongo::Error::Parser do
97
96
  end
98
97
 
99
98
  describe '#code' do
100
- let(:parser) do
101
- described_class.new(document)
102
- end
103
99
 
104
100
  context 'when document contains code and ok: 1' do
105
101
  let(:document) do
@@ -172,12 +168,23 @@ describe Mongo::Error::Parser do
172
168
  expect(parser.code).to be nil
173
169
  end
174
170
  end
171
+
172
+ context 'when both top level code and write concern code are present' do
173
+
174
+ let(:document) do
175
+ { 'ok' => 0,
176
+ 'errmsg' => 'not master', 'code' => 10107, 'codeName' => 'NotMaster',
177
+ 'writeConcernError' => {
178
+ 'code' => 100, 'errmsg' => 'Not enough data-bearing nodes' } }
179
+ end
180
+
181
+ it 'returns top level code' do
182
+ expect(parser.code).to eq(10107)
183
+ end
184
+ end
175
185
  end
176
186
 
177
187
  describe '#code_name' do
178
- let(:parser) do
179
- described_class.new(document)
180
- end
181
188
 
182
189
  context 'when document contains code name and ok: 1' do
183
190
  let(:document) do
@@ -251,13 +258,152 @@ describe Mongo::Error::Parser do
251
258
  expect(parser.code_name).to be nil
252
259
  end
253
260
  end
261
+
262
+ context 'when both top level code and write concern code are present' do
263
+
264
+ let(:document) do
265
+ { 'ok' => 0,
266
+ 'errmsg' => 'not master', 'code' => 10107, 'codeName' => 'NotMaster',
267
+ 'writeConcernError' => {
268
+ 'code' => 100, 'errmsg' => 'Not enough data-bearing nodes' } }
269
+ end
270
+
271
+ it 'returns top level code' do
272
+ expect(parser.code_name).to eq('NotMaster')
273
+ end
274
+ end
254
275
  end
255
276
 
256
- describe '#document' do
257
- let(:parser) do
258
- described_class.new(document)
277
+ describe '#write_concern_error?' do
278
+ context 'there is a write concern error' do
279
+
280
+ let(:document) do
281
+ { 'ok' => 1,
282
+ 'writeConcernError' => {
283
+ 'code' => 100, 'errmsg' => 'Not enough data-bearing nodes' } }
284
+ end
285
+
286
+ it 'is true' do
287
+ expect(parser.write_concern_error?).to be true
288
+ end
289
+ end
290
+
291
+ context 'there is no write concern error' do
292
+
293
+ let(:document) do
294
+ { 'ok' => 0,
295
+ 'errmsg' => 'not master', 'code' => 10107, 'codeName' => 'NotMaster',
296
+ }
297
+ end
298
+
299
+ it 'is false' do
300
+ expect(parser.write_concern_error?).to be false
301
+ end
259
302
  end
260
303
 
304
+ context 'there is a top level error and write concern error' do
305
+
306
+ let(:document) do
307
+ { 'ok' => 0,
308
+ 'errmsg' => 'not master', 'code' => 10107, 'codeName' => 'NotMaster',
309
+ 'writeConcernError' => {
310
+ 'code' => 100, 'errmsg' => 'Not enough data-bearing nodes' } }
311
+ end
312
+
313
+ it 'is true' do
314
+ expect(parser.write_concern_error?).to be true
315
+ end
316
+ end
317
+ end
318
+
319
+ describe '#write_concern_error_code' do
320
+ context 'there is a write concern error' do
321
+
322
+ let(:document) do
323
+ { 'ok' => 1,
324
+ 'writeConcernError' => {
325
+ 'code' => 100, 'errmsg' => 'Not enough data-bearing nodes' } }
326
+ end
327
+
328
+ it 'is true' do
329
+ expect(parser.write_concern_error_code).to eq(100)
330
+ end
331
+ end
332
+
333
+ context 'there is no write concern error' do
334
+
335
+ let(:document) do
336
+ { 'ok' => 0,
337
+ 'errmsg' => 'not master', 'code' => 10107, 'codeName' => 'NotMaster',
338
+ }
339
+ end
340
+
341
+ it 'is nil' do
342
+ expect(parser.write_concern_error_code).to be nil
343
+ end
344
+ end
345
+
346
+ context 'there is a top level error and write concern error' do
347
+
348
+ let(:document) do
349
+ { 'ok' => 0,
350
+ 'errmsg' => 'not master', 'code' => 10107, 'codeName' => 'NotMaster',
351
+ 'writeConcernError' => {
352
+ 'code' => 100, 'errmsg' => 'Not enough data-bearing nodes' } }
353
+ end
354
+
355
+ it 'is true' do
356
+ expect(parser.write_concern_error_code).to eq(100)
357
+ end
358
+ end
359
+ end
360
+
361
+ describe '#write_concern_error_code_name' do
362
+ context 'there is a write concern error' do
363
+
364
+ let(:document) do
365
+ { 'ok' => 1,
366
+ 'writeConcernError' => {
367
+ 'code' => 100, 'codeName' => 'SomeCodeName',
368
+ 'errmsg' => 'Not enough data-bearing nodes' } }
369
+ end
370
+
371
+ it 'is the code name' do
372
+ expect(parser.write_concern_error_code_name).to eq('SomeCodeName')
373
+ end
374
+ end
375
+
376
+ context 'there is no write concern error' do
377
+
378
+ let(:document) do
379
+ { 'ok' => 0,
380
+ 'errmsg' => 'not master', 'code' => 10107, 'codeName' => 'NotMaster',
381
+ }
382
+ end
383
+
384
+ it 'is nil' do
385
+ expect(parser.write_concern_error_code_name).to be nil
386
+ end
387
+ end
388
+
389
+ context 'there is a top level error and write concern error' do
390
+
391
+ let(:document) do
392
+ { 'ok' => 0,
393
+ 'errmsg' => 'not master', 'code' => 10107, 'codeName' => 'NotMaster',
394
+ 'writeConcernError' => {
395
+ 'code' => 100, 'codeName' => 'SomeCodeName',
396
+ 'errmsg' => 'Not enough data-bearing nodes' } }
397
+ end
398
+
399
+ it 'is the code name' do
400
+ expect(parser.write_concern_error_code_name).to eq('SomeCodeName')
401
+ end
402
+ end
403
+ end
404
+
405
+ describe '#document' do
406
+
261
407
  let(:document) do
262
408
  { 'ok' => 0, 'errmsg' => 'not master', 'code' => 10107, 'codeName' => 'NotMaster' }
263
409
  end
@@ -268,9 +414,6 @@ describe Mongo::Error::Parser do
268
414
  end
269
415
 
270
416
  describe '#replies' do
271
- let(:parser) do
272
- described_class.new(document)
273
- end
274
417
 
275
418
  context 'when there are no replies' do
276
419
  let(:document) do
@@ -284,9 +427,6 @@ describe Mongo::Error::Parser do
284
427
  end
285
428
 
286
429
  describe '#labels' do
287
- let(:parser) do
288
- described_class.new(document)
289
- end
290
430
 
291
431
  let(:document) do
292
432
  {
@@ -308,7 +448,7 @@ describe Mongo::Error::Parser do
308
448
 
309
449
  context 'when there are labels' do
310
450
  let(:labels) do
311
- [ Mongo::Error::TRANSIENT_TRANSACTION_ERROR_LABEL ]
451
+ %w(TransientTransactionError)
312
452
  end
313
453
 
314
454
  it 'has the correct labels' do
@@ -318,9 +458,6 @@ describe Mongo::Error::Parser do
318
458
  end
319
459
 
320
460
  describe '#wtimeout' do
321
- let(:parser) do
322
- described_class.new(document)
323
- end
324
461
 
325
462
  context 'when document contains wtimeout' do
326
463
  let(:document) do
@@ -1,6 +1,8 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe Mongo::Operation::Insert do
4
+ require_no_multi_shard
5
+
4
6
  before do
5
7
  begin
6
8
  authorized_collection.delete_many
@@ -188,7 +190,6 @@ describe Mongo::Operation::Insert do
188
190
  end
189
191
 
190
192
  context 'when write concern is unacknowledged' do
191
-
192
193
  let(:write_concern) do
193
194
  Mongo::WriteConcern.get(w: 0)
194
195
  end
@@ -261,6 +261,17 @@ describe Mongo::Operation::Result do
261
261
  end
262
262
  end
263
263
  end
264
+
265
+ context 'when there is a write concern error' do
266
+ let(:documents) do
267
+ [{'ok' => 1.0, 'writeConcernError' => {
268
+ 'code' => 91, 'errmsg' => 'Replication is being shut down'}}]
269
+ end
270
+
271
+ it 'is false' do
272
+ expect(result).not_to be_successful
273
+ end
274
+ end
264
275
  end
265
276
 
266
277
  describe '#written_count' do
@@ -309,4 +320,20 @@ describe Mongo::Operation::Result do
309
320
  expect(result).to be_a(Mongo::Operation::Result)
310
321
  end
311
322
  end
323
+
324
+ describe '#validate!' do
325
+
326
+ context 'when there is a write concern error' do
327
+ let(:documents) do
328
+ [{'ok' => 1.0, 'writeConcernError' => {
329
+ 'code' => 91, 'errmsg' => 'Replication is being shut down'}}]
330
+ end
331
+
332
+ it 'raises OperationFailure' do
333
+ expect do
334
+ result.validate!
335
+ end.to raise_error(Mongo::Error::OperationFailure, /Replication is being shut down \(91\)/)
336
+ end
337
+ end
338
+ end
312
339
  end
@@ -1,6 +1,7 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe Mongo::Operation::Update do
4
+ require_no_multi_shard
4
5
 
5
6
  let(:documents) do
6
7
  [{ :q => { :foo => 1 },
@@ -67,6 +67,8 @@ class ModernRetryableTestConsumer < LegacyRetryableTestConsumer
67
67
  i = 1
68
68
  allow(session).to receive(:next_txn_num) { i += 1 }
69
69
  allow(session).to receive(:in_transaction?).and_return(false)
70
+ allow(session).to receive(:pinned_server)
71
+ allow(session).to receive(:starting_transaction?).and_return(false)
70
72
  end
71
73
  end
72
74
 
@@ -23,7 +23,7 @@ describe Mongo::Server::AppMetadata do
23
23
  end
24
24
 
25
25
  after do
26
- client.close
26
+ client.close(true)
27
27
  end
28
28
 
29
29
  it 'sets the app name' do
@@ -41,7 +41,7 @@ describe Mongo::Server::AppMetadata do
41
41
  end
42
42
 
43
43
  after do
44
- client.close
44
+ client.close(true)
45
45
  end
46
46
 
47
47
  it 'raises an error' do
@@ -757,42 +757,38 @@ describe Mongo::Server::Connection, retry: 3 do
757
757
  end
758
758
  end
759
759
 
760
- context 'when a socket timeout is set on client' do
760
+ context 'when a socket timeout is set' do
761
761
 
762
762
  let(:connection) do
763
763
  described_class.new(server, socket_timeout: 10)
764
764
  end
765
765
 
766
- it 'is propagated to connection timeout' do
766
+ it 'sets the timeout' do
767
767
  expect(connection.timeout).to eq(10)
768
768
  end
769
- end
770
769
 
771
- context 'when an operation never completes' do
772
770
  let(:client) do
773
- authorized_client.with(socket_timeout: 1.5,
774
- # Read retries would cause the reads to be attempted twice,
775
- # thus making the find take twice as long to time out.
776
- retry_reads: false, max_read_retries: 0)
771
+ authorized_client.with(socket_timeout: 1.5)
777
772
  end
778
773
 
779
774
  before do
780
- client.cluster.next_primary
775
+ authorized_collection.delete_many
776
+ authorized_collection.insert_one(a: 1)
781
777
  end
782
778
 
783
- it 'times out and raises SocketTimeoutError' do
779
+ it 'raises a timeout when it expires' do
784
780
  start = Time.now
785
781
  begin
786
- Timeout::timeout(1.5 + 2) do
782
+ Timeout::timeout(1.5 + 15) do
787
783
  client[authorized_collection.name].find("$where" => "sleep(2000) || true").first
788
784
  end
789
785
  rescue => ex
790
786
  end_time = Time.now
791
- expect(ex).to be_a(Mongo::Error::SocketTimeoutError)
792
- expect(ex.message).to match(/Took more than 1.5 seconds to receive data/)
787
+ expect(ex).to be_a(Timeout::Error)
788
+ expect(ex.message).to eq("Took more than 1.5 seconds to receive data.")
793
789
  end
794
- # allow 1.5 seconds +- 0.5 seconds
795
- expect(end_time - start).to be_within(1).of(2)
790
+ # Account for wait queue timeout (2s) and rescue
791
+ expect(end_time - start).to be_within(2.5).of(1.5)
796
792
  end
797
793
 
798
794
  context 'when the socket_timeout is negative' do
@@ -820,7 +816,7 @@ describe Mongo::Server::Connection, retry: 3 do
820
816
  it 'raises a timeout error' do
821
817
  expect {
822
818
  reply
823
- }.to raise_exception(Mongo::Error::SocketTimeoutError)
819
+ }.to raise_exception(Timeout::Error)
824
820
  end
825
821
  end
826
822
  end
@@ -1001,7 +997,7 @@ describe Mongo::Server::Connection, retry: 3 do
1001
997
  end
1002
998
 
1003
999
  after do
1004
- client.close
1000
+ client.close(true)
1005
1001
  end
1006
1002
 
1007
1003
  context 'when a connect_timeout is in the options' do