mongo 2.20.1 → 2.21.0

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 (246) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +3 -0
  3. data/Rakefile +2 -2
  4. data/lib/mongo/address.rb +22 -3
  5. data/lib/mongo/auth/aws/credentials_retriever.rb +70 -17
  6. data/lib/mongo/auth/base.rb +1 -1
  7. data/lib/mongo/bulk_write.rb +35 -2
  8. data/lib/mongo/client.rb +38 -6
  9. data/lib/mongo/client_encryption.rb +6 -3
  10. data/lib/mongo/cluster/reapers/cursor_reaper.rb +6 -1
  11. data/lib/mongo/cluster/sdam_flow.rb +20 -7
  12. data/lib/mongo/cluster.rb +14 -4
  13. data/lib/mongo/collection/helpers.rb +1 -1
  14. data/lib/mongo/collection/view/aggregation/behavior.rb +131 -0
  15. data/lib/mongo/collection/view/aggregation.rb +33 -99
  16. data/lib/mongo/collection/view/builder/aggregation.rb +1 -7
  17. data/lib/mongo/collection/view/change_stream.rb +80 -27
  18. data/lib/mongo/collection/view/iterable.rb +76 -60
  19. data/lib/mongo/collection/view/map_reduce.rb +25 -8
  20. data/lib/mongo/collection/view/readable.rb +79 -30
  21. data/lib/mongo/collection/view/writable.rb +109 -48
  22. data/lib/mongo/collection/view.rb +43 -3
  23. data/lib/mongo/collection.rb +158 -23
  24. data/lib/mongo/crypt/auto_encrypter.rb +4 -6
  25. data/lib/mongo/crypt/binding.rb +4 -4
  26. data/lib/mongo/crypt/context.rb +20 -14
  27. data/lib/mongo/crypt/encryption_io.rb +56 -26
  28. data/lib/mongo/crypt/explicit_encrypter.rb +49 -20
  29. data/lib/mongo/crypt/explicit_encryption_context.rb +17 -11
  30. data/lib/mongo/crypt/kms/azure/credentials_retriever.rb +22 -6
  31. data/lib/mongo/crypt/kms/gcp/credentials_retriever.rb +29 -4
  32. data/lib/mongo/csot_timeout_holder.rb +119 -0
  33. data/lib/mongo/cursor/kill_spec.rb +5 -2
  34. data/lib/mongo/cursor/nontailable.rb +27 -0
  35. data/lib/mongo/cursor.rb +86 -24
  36. data/lib/mongo/cursor_host.rb +82 -0
  37. data/lib/mongo/database/view.rb +81 -14
  38. data/lib/mongo/database.rb +88 -18
  39. data/lib/mongo/error/operation_failure.rb +209 -204
  40. data/lib/mongo/error/server_timeout_error.rb +12 -0
  41. data/lib/mongo/error/socket_timeout_error.rb +3 -1
  42. data/lib/mongo/error/timeout_error.rb +23 -0
  43. data/lib/mongo/error.rb +2 -0
  44. data/lib/mongo/grid/fs_bucket.rb +45 -12
  45. data/lib/mongo/grid/stream/read.rb +15 -1
  46. data/lib/mongo/grid/stream/write.rb +21 -4
  47. data/lib/mongo/index/view.rb +77 -16
  48. data/lib/mongo/operation/context.rb +40 -2
  49. data/lib/mongo/operation/create_search_indexes/op_msg.rb +2 -2
  50. data/lib/mongo/operation/delete/op_msg.rb +2 -1
  51. data/lib/mongo/operation/drop_search_index/op_msg.rb +2 -2
  52. data/lib/mongo/operation/find/op_msg.rb +45 -0
  53. data/lib/mongo/operation/get_more/op_msg.rb +33 -0
  54. data/lib/mongo/operation/insert/op_msg.rb +3 -2
  55. data/lib/mongo/operation/insert/result.rb +4 -2
  56. data/lib/mongo/operation/list_collections/result.rb +1 -1
  57. data/lib/mongo/operation/map_reduce/result.rb +1 -1
  58. data/lib/mongo/operation/op_msg_base.rb +3 -1
  59. data/lib/mongo/operation/result.rb +26 -5
  60. data/lib/mongo/operation/shared/executable.rb +12 -1
  61. data/lib/mongo/operation/shared/op_msg_executable.rb +4 -1
  62. data/lib/mongo/operation/shared/response_handling.rb +3 -3
  63. data/lib/mongo/operation/shared/sessions_supported.rb +1 -1
  64. data/lib/mongo/operation/shared/timed.rb +52 -0
  65. data/lib/mongo/operation/shared/write.rb +4 -1
  66. data/lib/mongo/operation/update/op_msg.rb +2 -1
  67. data/lib/mongo/operation/update_search_index/op_msg.rb +2 -2
  68. data/lib/mongo/operation.rb +1 -0
  69. data/lib/mongo/protocol/message.rb +1 -4
  70. data/lib/mongo/protocol/msg.rb +2 -2
  71. data/lib/mongo/retryable/read_worker.rb +69 -29
  72. data/lib/mongo/retryable/write_worker.rb +49 -18
  73. data/lib/mongo/retryable.rb +8 -2
  74. data/lib/mongo/server/connection.rb +11 -5
  75. data/lib/mongo/server/connection_base.rb +22 -2
  76. data/lib/mongo/server/connection_pool.rb +32 -14
  77. data/lib/mongo/server/description/features.rb +1 -1
  78. data/lib/mongo/server/description.rb +18 -5
  79. data/lib/mongo/server/monitor.rb +7 -4
  80. data/lib/mongo/server/pending_connection.rb +7 -3
  81. data/lib/mongo/server/{round_trip_time_averager.rb → round_trip_time_calculator.rb} +25 -7
  82. data/lib/mongo/server.rb +11 -6
  83. data/lib/mongo/server_selector/base.rb +25 -9
  84. data/lib/mongo/session.rb +78 -9
  85. data/lib/mongo/socket/ssl.rb +109 -17
  86. data/lib/mongo/socket/tcp.rb +40 -6
  87. data/lib/mongo/socket.rb +154 -25
  88. data/lib/mongo/uri/options_mapper.rb +1 -0
  89. data/lib/mongo/version.rb +1 -1
  90. data/lib/mongo.rb +1 -0
  91. data/spec/atlas/atlas_connectivity_spec.rb +4 -0
  92. data/spec/atlas/operations_spec.rb +4 -0
  93. data/spec/integration/client_side_encryption/auto_encryption_mongocryptd_spawn_spec.rb +2 -1
  94. data/spec/integration/client_side_encryption/auto_encryption_spec.rb +494 -487
  95. data/spec/integration/client_side_encryption/on_demand_aws_credentials_spec.rb +1 -1
  96. data/spec/integration/client_side_encryption/range_explicit_encryption_prose_spec.rb +66 -22
  97. data/spec/integration/client_side_operations_timeout/encryption_prose_spec.rb +131 -0
  98. data/spec/integration/connection_pool_populator_spec.rb +2 -0
  99. data/spec/integration/cursor_pinning_spec.rb +15 -60
  100. data/spec/integration/cursor_reaping_spec.rb +1 -1
  101. data/spec/integration/docs_examples_spec.rb +1 -1
  102. data/spec/integration/operation_failure_code_spec.rb +1 -1
  103. data/spec/integration/operation_failure_message_spec.rb +3 -3
  104. data/spec/integration/retryable_errors_spec.rb +2 -2
  105. data/spec/integration/sdam_error_handling_spec.rb +2 -1
  106. data/spec/integration/search_indexes_prose_spec.rb +4 -0
  107. data/spec/integration/server_spec.rb +4 -3
  108. data/spec/integration/transactions_api_examples_spec.rb +2 -0
  109. data/spec/kerberos/kerberos_spec.rb +4 -0
  110. data/spec/lite_spec_helper.rb +3 -1
  111. data/spec/mongo/auth/user/view_spec.rb +1 -1
  112. data/spec/mongo/caching_cursor_spec.rb +1 -1
  113. data/spec/mongo/client_encryption_spec.rb +1 -0
  114. data/spec/mongo/client_spec.rb +158 -4
  115. data/spec/mongo/collection/view/aggregation_spec.rb +14 -39
  116. data/spec/mongo/collection/view/change_stream_spec.rb +3 -3
  117. data/spec/mongo/collection_spec.rb +5 -6
  118. data/spec/mongo/crypt/auto_encrypter_spec.rb +14 -12
  119. data/spec/mongo/crypt/data_key_context_spec.rb +3 -1
  120. data/spec/mongo/crypt/explicit_encryption_context_spec.rb +2 -2
  121. data/spec/mongo/crypt/handle_spec.rb +1 -1
  122. data/spec/mongo/cursor_spec.rb +26 -9
  123. data/spec/mongo/error/operation_failure_heavy_spec.rb +2 -2
  124. data/spec/mongo/operation/context_spec.rb +79 -0
  125. data/spec/mongo/operation/create/op_msg_spec.rb +106 -110
  126. data/spec/mongo/operation/delete/op_msg_spec.rb +6 -5
  127. data/spec/mongo/operation/find/op_msg_spec.rb +66 -0
  128. data/spec/mongo/operation/get_more/op_msg_spec.rb +65 -0
  129. data/spec/mongo/operation/insert/op_msg_spec.rb +128 -131
  130. data/spec/mongo/operation/shared/csot/examples.rb +113 -0
  131. data/spec/mongo/query_cache_spec.rb +243 -225
  132. data/spec/mongo/retryable_spec.rb +1 -0
  133. data/spec/mongo/server/round_trip_time_calculator_spec.rb +120 -0
  134. data/spec/mongo/socket/ssl_spec.rb +0 -10
  135. data/spec/runners/change_streams/test.rb +2 -2
  136. data/spec/runners/crud/operation.rb +1 -1
  137. data/spec/runners/crud/verifier.rb +3 -1
  138. data/spec/runners/transactions/operation.rb +4 -6
  139. data/spec/runners/unified/ambiguous_operations.rb +13 -0
  140. data/spec/runners/unified/assertions.rb +4 -0
  141. data/spec/runners/unified/change_stream_operations.rb +14 -24
  142. data/spec/runners/unified/crud_operations.rb +82 -59
  143. data/spec/runners/unified/ddl_operations.rb +38 -7
  144. data/spec/runners/unified/grid_fs_operations.rb +37 -2
  145. data/spec/runners/unified/support_operations.rb +43 -4
  146. data/spec/runners/unified/test.rb +22 -10
  147. data/spec/runners/unified.rb +1 -1
  148. data/spec/solo/clean_exit_spec.rb +2 -0
  149. data/spec/spec_tests/client_side_operations_timeout_spec.rb +15 -0
  150. data/spec/spec_tests/data/change_streams_unified/change-streams-clusterTime.yml +3 -1
  151. data/spec/spec_tests/data/change_streams_unified/change-streams-disambiguatedPaths.yml +3 -1
  152. data/spec/spec_tests/data/change_streams_unified/change-streams-errors.yml +3 -1
  153. data/spec/spec_tests/data/change_streams_unified/change-streams-pre_and_post_images.yml +1 -1
  154. data/spec/spec_tests/data/change_streams_unified/change-streams-resume-allowlist.yml +1 -1
  155. data/spec/spec_tests/data/change_streams_unified/change-streams-resume-errorLabels.yml +1 -1
  156. data/spec/spec_tests/data/change_streams_unified/change-streams-showExpandedEvents.yml +1 -1
  157. data/spec/spec_tests/data/client_side_encryption/badQueries.yml +2 -1
  158. data/spec/spec_tests/data/client_side_encryption/timeoutMS.yml +67 -0
  159. data/spec/spec_tests/data/client_side_operations_timeout/bulkWrite.yml +87 -0
  160. data/spec/spec_tests/data/client_side_operations_timeout/change-streams.yml +358 -0
  161. data/spec/spec_tests/data/client_side_operations_timeout/close-cursors.yml +129 -0
  162. data/spec/spec_tests/data/client_side_operations_timeout/command-execution.yml +250 -0
  163. data/spec/spec_tests/data/client_side_operations_timeout/convenient-transactions.yml +113 -0
  164. data/spec/spec_tests/data/client_side_operations_timeout/cursors.yml +70 -0
  165. data/spec/spec_tests/data/client_side_operations_timeout/deprecated-options.yml +3982 -0
  166. data/spec/spec_tests/data/client_side_operations_timeout/error-transformations.yml +96 -0
  167. data/spec/spec_tests/data/client_side_operations_timeout/global-timeoutMS.yml +3236 -0
  168. data/spec/spec_tests/data/client_side_operations_timeout/gridfs-advanced.yml +207 -0
  169. data/spec/spec_tests/data/client_side_operations_timeout/gridfs-delete.yml +152 -0
  170. data/spec/spec_tests/data/client_side_operations_timeout/gridfs-download.yml +182 -0
  171. data/spec/spec_tests/data/client_side_operations_timeout/gridfs-find.yml +100 -0
  172. data/spec/spec_tests/data/client_side_operations_timeout/gridfs-upload.yml +249 -0
  173. data/spec/spec_tests/data/client_side_operations_timeout/legacy-timeouts.yml +204 -0
  174. data/spec/spec_tests/data/client_side_operations_timeout/non-tailable-cursors.yml +307 -0
  175. data/spec/spec_tests/data/client_side_operations_timeout/override-collection-timeoutMS.yml +1877 -0
  176. data/spec/spec_tests/data/client_side_operations_timeout/override-operation-timeoutMS.yml +1918 -0
  177. data/spec/spec_tests/data/client_side_operations_timeout/retryability-legacy-timeouts.yml +1676 -0
  178. data/spec/spec_tests/data/client_side_operations_timeout/retryability-timeoutMS.yml +2824 -0
  179. data/spec/spec_tests/data/client_side_operations_timeout/sessions-inherit-timeoutMS.yml +168 -0
  180. data/spec/spec_tests/data/client_side_operations_timeout/sessions-override-operation-timeoutMS.yml +171 -0
  181. data/spec/spec_tests/data/client_side_operations_timeout/sessions-override-timeoutMS.yml +168 -0
  182. data/spec/spec_tests/data/client_side_operations_timeout/tailable-awaitData.yml +247 -0
  183. data/spec/spec_tests/data/client_side_operations_timeout/tailable-non-awaitData.yml +181 -0
  184. data/spec/spec_tests/data/crud_unified/aggregate-write-readPreference.yml +4 -0
  185. data/spec/spec_tests/data/crud_unified/db-aggregate-write-readPreference.yml +4 -0
  186. data/spec/spec_tests/data/crud_unified/find-test-all-options.yml +29 -0
  187. data/spec/spec_tests/server_selection_rtt_spec.rb +6 -6
  188. data/spec/support/certificates/atlas-ocsp-ca.crt +81 -83
  189. data/spec/support/certificates/atlas-ocsp.crt +107 -107
  190. data/spec/support/cluster_tools.rb +3 -3
  191. data/spec/support/common_shortcuts.rb +2 -2
  192. data/spec/support/crypt/encrypted_fields/range-encryptedFields-Date.json +1 -1
  193. data/spec/support/crypt/encrypted_fields/range-encryptedFields-DecimalNoPrecision.json +1 -1
  194. data/spec/support/crypt/encrypted_fields/range-encryptedFields-DecimalPrecision.json +1 -1
  195. data/spec/support/crypt/encrypted_fields/range-encryptedFields-DoubleNoPrecision.json +1 -1
  196. data/spec/support/crypt/encrypted_fields/range-encryptedFields-DoublePrecision.json +1 -1
  197. data/spec/support/crypt/encrypted_fields/range-encryptedFields-Int.json +1 -1
  198. data/spec/support/crypt/encrypted_fields/range-encryptedFields-Long.json +1 -1
  199. data/spec/support/shared/session.rb +2 -2
  200. data/spec/support/spec_setup.rb +2 -2
  201. data/spec/support/utils.rb +3 -1
  202. metadata +78 -91
  203. data/spec/mongo/server/round_trip_time_averager_spec.rb +0 -48
  204. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Date-Aggregate.yml +0 -242
  205. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Date-Correctness.yml +0 -423
  206. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Date-Delete.yml +0 -183
  207. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Date-FindOneAndUpdate.yml +0 -240
  208. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Date-InsertFind.yml +0 -236
  209. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Date-Update.yml +0 -253
  210. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Decimal-Aggregate.yml +0 -1688
  211. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Decimal-Correctness.yml +0 -294
  212. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Decimal-Delete.yml +0 -906
  213. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Decimal-FindOneAndUpdate.yml +0 -1685
  214. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Decimal-InsertFind.yml +0 -1681
  215. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Decimal-Update.yml +0 -1698
  216. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-DecimalPrecision-Aggregate.yml +0 -330
  217. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-DecimalPrecision-Correctness.yml +0 -425
  218. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-DecimalPrecision-Delete.yml +0 -227
  219. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-DecimalPrecision-FindOneAndUpdate.yml +0 -328
  220. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-DecimalPrecision-InsertFind.yml +0 -320
  221. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-DecimalPrecision-Update.yml +0 -337
  222. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Double-Aggregate.yml +0 -914
  223. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Double-Correctness.yml +0 -293
  224. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Double-Delete.yml +0 -519
  225. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Double-FindOneAndUpdate.yml +0 -912
  226. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Double-InsertFind.yml +0 -908
  227. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Double-Update.yml +0 -925
  228. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-DoublePrecision-Aggregate.yml +0 -326
  229. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-DoublePrecision-Correctness.yml +0 -425
  230. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-DoublePrecision-Delete.yml +0 -225
  231. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-DoublePrecision-FindOneAndUpdate.yml +0 -324
  232. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-DoublePrecision-InsertFind.yml +0 -320
  233. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-DoublePrecision-Update.yml +0 -339
  234. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Int-Aggregate.yml +0 -242
  235. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Int-Correctness.yml +0 -424
  236. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Int-Delete.yml +0 -183
  237. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Int-FindOneAndUpdate.yml +0 -240
  238. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Int-InsertFind.yml +0 -236
  239. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Int-Update.yml +0 -255
  240. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Long-Aggregate.yml +0 -242
  241. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Long-Correctness.yml +0 -423
  242. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Long-Delete.yml +0 -183
  243. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Long-FindOneAndUpdate.yml +0 -240
  244. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Long-InsertFind.yml +0 -236
  245. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Long-Update.yml +0 -255
  246. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-WrongType.yml +0 -44
@@ -2,6 +2,7 @@
2
2
  # rubocop:todo all
3
3
 
4
4
  require 'runners/crud/requirement'
5
+ require 'runners/unified/ambiguous_operations'
5
6
  require 'runners/unified/client_side_encryption_operations'
6
7
  require 'runners/unified/crud_operations'
7
8
  require 'runners/unified/grid_fs_operations'
@@ -17,6 +18,7 @@ require 'support/crypt'
17
18
  module Unified
18
19
 
19
20
  class Test
21
+ include AmbiguousOperations
20
22
  include ClientSideEncryptionOperations
21
23
  include CrudOperations
22
24
  include GridFsOperations
@@ -42,12 +44,14 @@ module Unified
42
44
  if req = @spec['group_runOnRequirements']
43
45
  @group_reqs = req.map { |r| Mongo::CRUD::Requirement.new(r) }
44
46
  end
45
- mongoses = @spec['createEntities'].select do |spec|
46
- spec['client']
47
- end.map do |spec|
48
- spec['client']['useMultipleMongoses']
49
- end.compact.uniq
50
- @multiple_mongoses = mongoses.any? { |v| v }
47
+ if @spec['createEntities']
48
+ mongoses = @spec['createEntities'].select do |spec|
49
+ spec['client']
50
+ end.map do |spec|
51
+ spec['client']['useMultipleMongoses']
52
+ end.compact.uniq
53
+ @multiple_mongoses = mongoses.any? { |v| v }
54
+ end
51
55
  @test_spec.freeze
52
56
  @subscribers = {}
53
57
  @observe_sensitive = {}
@@ -85,6 +89,8 @@ module Unified
85
89
  end
86
90
 
87
91
  def generate_entities(es)
92
+ return if es.nil?
93
+
88
94
  es.each do |entity_spec|
89
95
  unless entity_spec.keys.length == 1
90
96
  raise NotImplementedError, "Entity must have exactly one key"
@@ -329,7 +335,7 @@ module Unified
329
335
  begin
330
336
  collection.create(create_options)
331
337
  rescue Mongo::Error => e
332
- if Mongo::Error::OperationFailure === e && (
338
+ if Mongo::Error::OperationFailure::Family === e && (
333
339
  e.code == 48 || e.message =~ /collection already exists/
334
340
  )
335
341
  # Already exists
@@ -411,10 +417,16 @@ module Unified
411
417
 
412
418
  public_send(method_name, op)
413
419
  rescue Mongo::Error, bson_error, Mongo::Auth::Unauthorized, ArgumentError => e
420
+ if expected_error.use('isTimeoutError')
421
+ unless Mongo::Error::TimeoutError === e
422
+ raise e
423
+ raise Error::ErrorMismatch, %Q,Expected TimeoutError ("isTimeoutError") but got #{e},
424
+ end
425
+ end
414
426
  if expected_error.use('isClientError')
415
427
  # isClientError doesn't actually mean a client error.
416
428
  # It means anything other than OperationFailure. DRIVERS-1799
417
- if Mongo::Error::OperationFailure === e
429
+ if Mongo::Error::OperationFailure::Family === e
418
430
  raise Error::ErrorMismatch, %Q,Expected not OperationFailure ("isClientError") but got #{e},
419
431
  end
420
432
  end
@@ -482,7 +494,7 @@ module Unified
482
494
  if result.nil? && expected_result.keys == ["$$unsetOrMatches"]
483
495
  return
484
496
  elsif result.nil? && !expected_result.empty?
485
- raise Error::ResultMismatch, "#{msg}: expected #{expected} but got nil"
497
+ raise Error::ResultMismatch, "expected #{expected_result} but got nil"
486
498
  elsif Array === expected_result
487
499
  assert_documents_match(result, expected_result)
488
500
  else
@@ -536,7 +548,7 @@ module Unified
536
548
  root_authorized_client.command(
537
549
  killAllSessions: [],
538
550
  )
539
- rescue Mongo::Error::OperationFailure => e
551
+ rescue Mongo::Error::OperationFailure::Family => e
540
552
  if e.code == 11601
541
553
  # operation was interrupted, ignore. SERVER-38335
542
554
  elsif e.code == 13
@@ -72,7 +72,7 @@ def define_unified_spec_tests(base_path, paths, expect_failure: false)
72
72
  test.assert_events
73
73
  # HACK: other errors are possible and likely will need to
74
74
  # be added here later as the tests evolve.
75
- rescue Mongo::Error::OperationFailure, Unified::Error::UnsupportedOperation, UsingHash::UsingHashKeyError, Unified::Error::EntityMissing
75
+ rescue Mongo::Error::OperationFailure::Family, Unified::Error::UnsupportedOperation, UsingHash::UsingHashKeyError, Unified::Error::EntityMissing
76
76
  rescue => e
77
77
  fail "Expected to raise Mongo::Error::OperationFailure or Unified::Error::UnsupportedOperation or UsingHash::UsingHashKeyError or Unified::Error::EntityMissing, got #{e.class}: #{e}"
78
78
  else
@@ -17,6 +17,8 @@ describe 'Clean exit' do
17
17
  it 'exits cleanly' do
18
18
  client = Mongo::Client.new(uri)
19
19
  client.database.collection_names.to_a
20
+ ensure
21
+ client.close
20
22
  end
21
23
  end
22
24
  end
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
4
+ require 'runners/unified'
5
+
6
+ base = "#{CURRENT_PATH}/spec_tests/data/client_side_operations_timeout"
7
+ CSOT_TESTS = Dir.glob("#{base}/**/*.yml").sort
8
+
9
+ describe 'CSOT unified spec tests' do
10
+ if [ 1, '1', 'yes', 'true' ].include?(ENV['CSOT_SPEC_TESTS'])
11
+ define_unified_spec_tests(base, CSOT_TESTS)
12
+ else
13
+ skip 'CSOT spec tests are disabled. To enable them set env variable CSOT_SPEC_TESTS to 1'
14
+ end
15
+ end
@@ -15,7 +15,9 @@ createEntities:
15
15
 
16
16
  runOnRequirements:
17
17
  - minServerVersion: "4.0.0"
18
- topologies: [ replicaset, load-balanced, sharded ]
18
+ # TODO(DRIVERS-2323): Run all possible tests against sharded clusters once we know the
19
+ # cause of unexpected command monitoring events.
20
+ topologies: [ replicaset ]
19
21
  serverless: forbid
20
22
 
21
23
  initialData:
@@ -15,7 +15,9 @@ createEntities:
15
15
 
16
16
  runOnRequirements:
17
17
  - minServerVersion: "6.1.0"
18
- topologies: [ replicaset, load-balanced, sharded ]
18
+ # TODO(DRIVERS-2323): Run all possible tests against sharded clusters once we know the
19
+ # cause of unexpected command monitoring events.
20
+ topologies: [ replicaset ]
19
21
  serverless: forbid
20
22
 
21
23
  initialData:
@@ -3,7 +3,9 @@ description: "change-streams-errors"
3
3
  schemaVersion: "1.7"
4
4
 
5
5
  runOnRequirements:
6
- - serverless: forbid
6
+ # TODO(DRIVERS-2323): Run all possible tests against sharded clusters once we know the
7
+ # cause of unexpected command monitoring events.
8
+ - topologies: [ replicaset ]
7
9
 
8
10
  createEntities:
9
11
  - client:
@@ -4,7 +4,7 @@ schemaVersion: "1.4"
4
4
 
5
5
  runOnRequirements:
6
6
  - minServerVersion: "6.0.0"
7
- topologies: [ replicaset, sharded, load-balanced ]
7
+ topologies: [ replicaset ]
8
8
  serverless: forbid
9
9
 
10
10
  createEntities:
@@ -5,7 +5,7 @@ schemaVersion: "1.7"
5
5
 
6
6
  runOnRequirements:
7
7
  - minServerVersion: "3.6"
8
- topologies: [ replicaset, sharded, load-balanced ]
8
+ topologies: [ replicaset ]
9
9
  serverless: forbid
10
10
 
11
11
  createEntities:
@@ -5,7 +5,7 @@ schemaVersion: "1.7"
5
5
 
6
6
  runOnRequirements:
7
7
  - minServerVersion: "4.3.1"
8
- topologies: [ replicaset, sharded, load-balanced ]
8
+ topologies: [ replicaset ]
9
9
  serverless: forbid
10
10
 
11
11
  createEntities:
@@ -2,7 +2,7 @@ description: "change-streams-showExpandedEvents"
2
2
  schemaVersion: "1.7"
3
3
  runOnRequirements:
4
4
  - minServerVersion: "6.0.0"
5
- topologies: [ replicaset, sharded ]
5
+ topologies: [ replicaset ]
6
6
  serverless: forbid
7
7
  createEntities:
8
8
  - client:
@@ -1,5 +1,6 @@
1
1
  runOn:
2
2
  - minServerVersion: "4.1.10"
3
+ topology: [ "replicaset", "sharded" ]
3
4
  database_name: &database_name "default"
4
5
  collection_name: &collection_name "default"
5
6
 
@@ -533,4 +534,4 @@ tests:
533
534
  filter: {}
534
535
  fieldName: "encrypted_w_altname"
535
536
  result:
536
- errorContains: "The distinct key is not allowed to be marked for encryption with a non-UUID keyId"
537
+ errorContains: "The distinct key is not allowed to be marked for encryption with a non-UUID keyId"
@@ -0,0 +1,67 @@
1
+ runOn:
2
+ - minServerVersion: "4.4"
3
+ database_name: &database_name "cse-timeouts-db"
4
+ collection_name: &collection_name "cse-timeouts-coll"
5
+
6
+ data: []
7
+ json_schema: {'properties': {'encrypted_w_altname': {'encrypt': {'keyId': '/altname', 'bsonType': 'string', 'algorithm': 'AEAD_AES_256_CBC_HMAC_SHA_512-Random'}}, 'encrypted_string': {'encrypt': {'keyId': [{'$binary': {'base64': 'AAAAAAAAAAAAAAAAAAAAAA==', 'subType': '04'}}], 'bsonType': 'string', 'algorithm': 'AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic'}}, 'random': {'encrypt': {'keyId': [{'$binary': {'base64': 'AAAAAAAAAAAAAAAAAAAAAA==', 'subType': '04'}}], 'bsonType': 'string', 'algorithm': 'AEAD_AES_256_CBC_HMAC_SHA_512-Random'}}, 'encrypted_string_equivalent': {'encrypt': {'keyId': [{'$binary': {'base64': 'AAAAAAAAAAAAAAAAAAAAAA==', 'subType': '04'}}], 'bsonType': 'string', 'algorithm': 'AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic'}}}, 'bsonType': 'object'}
8
+ key_vault_data: [{'status': 1, '_id': {'$binary': {'base64': 'AAAAAAAAAAAAAAAAAAAAAA==', 'subType': '04'}}, 'masterKey': {'provider': 'aws', 'key': 'arn:aws:kms:us-east-1:579766882180:key/89fcc2c4-08b0-4bd9-9f25-e30687b580d0', 'region': 'us-east-1'}, 'updateDate': {'$date': {'$numberLong': '1552949630483'}}, 'keyMaterial': {'$binary': {'base64': 'AQICAHhQNmWG2CzOm1dq3kWLM+iDUZhEqnhJwH9wZVpuZ94A8gEqnsxXlR51T5EbEVezUqqKAAAAwjCBvwYJKoZIhvcNAQcGoIGxMIGuAgEAMIGoBgkqhkiG9w0BBwEwHgYJYIZIAWUDBAEuMBEEDHa4jo6yp0Z18KgbUgIBEIB74sKxWtV8/YHje5lv5THTl0HIbhSwM6EqRlmBiFFatmEWaeMk4tO4xBX65eq670I5TWPSLMzpp8ncGHMmvHqRajNBnmFtbYxN3E3/WjxmdbOOe+OXpnGJPcGsftc7cB2shRfA4lICPnE26+oVNXT6p0Lo20nY5XC7jyCO', 'subType': '00'}}, 'creationDate': {'$date': {'$numberLong': '1552949630483'}}, 'keyAltNames': ['altname', 'another_altname']}]
9
+
10
+ tests:
11
+ - description: "timeoutMS applied to listCollections to get collection schema"
12
+ failPoint:
13
+ configureFailPoint: failCommand
14
+ mode: { times: 1 }
15
+ data:
16
+ failCommands: ["listCollections"]
17
+ blockConnection: true
18
+ blockTimeMS: 60
19
+ clientOptions:
20
+ autoEncryptOpts:
21
+ kmsProviders:
22
+ aws: {} # Credentials filled in from environment.
23
+ timeoutMS: 50
24
+ operations:
25
+ - name: insertOne
26
+ arguments:
27
+ document: &doc0 { _id: 1, encrypted_string: "string0", random: "abc" }
28
+ result:
29
+ isTimeoutError: true
30
+ expectations:
31
+ # Auto encryption will request the collection info.
32
+ - command_started_event:
33
+ command:
34
+ listCollections: 1
35
+ filter:
36
+ name: *collection_name
37
+ maxTimeMS: { $$type: ["int", "long"] }
38
+ command_name: listCollections
39
+
40
+ # Test that timeoutMS applies to the sum of all operations done for client-side encryption. This is done by blocking
41
+ # listCollections and find for 30ms each and running an insertOne with timeoutMS=50. There should be one
42
+ # listCollections command and one "find" command, so the sum should take more than timeoutMS. A second listCollections
43
+ # event doesn't occur due to the internal MongoClient lacking configured auto encryption, plus libmongocrypt holds the
44
+ # collection schema in cache for a minute.
45
+ #
46
+ # This test does not include command monitoring expectations because the exact command sequence is dependent on the
47
+ # amount of time taken by mongocryptd communication. In slow runs, mongocryptd communication can breach the timeout
48
+ # and result in the final "find" not being sent.
49
+ - description: "remaining timeoutMS applied to find to get keyvault data"
50
+ failPoint:
51
+ configureFailPoint: failCommand
52
+ mode: { times: 2 }
53
+ data:
54
+ failCommands: ["listCollections", "find"]
55
+ blockConnection: true
56
+ blockTimeMS: 30
57
+ clientOptions:
58
+ autoEncryptOpts:
59
+ kmsProviders:
60
+ aws: {} # Credentials filled in from environment.
61
+ timeoutMS: 50
62
+ operations:
63
+ - name: insertOne
64
+ arguments:
65
+ document: *doc0
66
+ result:
67
+ isTimeoutError: true
@@ -0,0 +1,87 @@
1
+ description: "timeoutMS behaves correctly for bulkWrite operations"
2
+
3
+ schemaVersion: "1.9"
4
+
5
+ runOnRequirements:
6
+ - minServerVersion: "4.4"
7
+
8
+ createEntities:
9
+ - client:
10
+ id: &failPointClient failPointClient
11
+ useMultipleMongoses: false
12
+ - client:
13
+ id: &client client
14
+ useMultipleMongoses: false
15
+ observeEvents:
16
+ - commandStartedEvent
17
+ uriOptions:
18
+ # Used to speed up the test
19
+ w: 1
20
+ - database:
21
+ id: &database database
22
+ client: *client
23
+ databaseName: &databaseName test
24
+ - collection:
25
+ id: &collection collection
26
+ database: *database
27
+ collectionName: &collectionName coll
28
+
29
+ initialData:
30
+ - collectionName: *collectionName
31
+ databaseName: *databaseName
32
+ documents: []
33
+
34
+ tests:
35
+ # Test that drivers do not refresh timeoutMS between commands. This is done by running a bulkWrite that will require
36
+ # two commands with timeoutMS=200 and blocking each command for 120ms. The server should take over 200ms total, so the
37
+ # bulkWrite should fail with a timeout error.
38
+ - description: "timeoutMS applied to entire bulkWrite, not individual commands"
39
+ operations:
40
+ # Do an operation without a timeout to ensure the servers are discovered.
41
+ - name: insertOne
42
+ object: *collection
43
+ arguments:
44
+ document: {}
45
+ - name: failPoint
46
+ object: testRunner
47
+ arguments:
48
+ client: *failPointClient
49
+ failPoint:
50
+ configureFailPoint: failCommand
51
+ mode: { times: 2 }
52
+ data:
53
+ failCommands: ["insert", "update"]
54
+ blockConnection: true
55
+ blockTimeMS: 120
56
+ - name: bulkWrite
57
+ object: *collection
58
+ arguments:
59
+ requests:
60
+ - insertOne:
61
+ document: { _id: 1 }
62
+ - replaceOne:
63
+ filter: { _id: 1 }
64
+ replacement: { x: 1 }
65
+ timeoutMS: 200
66
+ expectError:
67
+ isTimeoutError: true
68
+ expectEvents:
69
+ - client: *client
70
+ events:
71
+ - commandStartedEvent:
72
+ commandName: insert
73
+ databaseName: *databaseName
74
+ command:
75
+ insert: *collectionName
76
+ - commandStartedEvent:
77
+ commandName: insert
78
+ databaseName: *databaseName
79
+ command:
80
+ insert: *collectionName
81
+ maxTimeMS: { $$type: ["int", "long"] }
82
+ - commandStartedEvent:
83
+ commandName: update
84
+ databaseName: *databaseName
85
+ command:
86
+ update: *collectionName
87
+ maxTimeMS: { $$type: ["int", "long"] }