mongo 2.20.2 → 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 (279) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +3 -0
  3. data/Rakefile +11 -11
  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 +113 -30
  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 +15 -4
  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/ocsp_verifier_spec.rb +99 -30
  103. data/spec/integration/operation_failure_code_spec.rb +1 -1
  104. data/spec/integration/operation_failure_message_spec.rb +3 -3
  105. data/spec/integration/reconnect_spec.rb +2 -8
  106. data/spec/integration/retryable_errors_spec.rb +2 -2
  107. data/spec/integration/sdam_error_handling_spec.rb +2 -1
  108. data/spec/integration/search_indexes_prose_spec.rb +4 -0
  109. data/spec/integration/server_spec.rb +4 -3
  110. data/spec/integration/srv_monitoring_spec.rb +3 -2
  111. data/spec/integration/srv_spec.rb +4 -0
  112. data/spec/integration/transactions_api_examples_spec.rb +2 -0
  113. data/spec/kerberos/kerberos_spec.rb +4 -0
  114. data/spec/lite_spec_helper.rb +3 -1
  115. data/spec/mongo/auth/user/view_spec.rb +1 -1
  116. data/spec/mongo/caching_cursor_spec.rb +1 -1
  117. data/spec/mongo/client_encryption_spec.rb +1 -0
  118. data/spec/mongo/client_spec.rb +158 -4
  119. data/spec/mongo/collection/view/aggregation_spec.rb +14 -39
  120. data/spec/mongo/collection/view/change_stream_spec.rb +3 -3
  121. data/spec/mongo/collection_spec.rb +5 -6
  122. data/spec/mongo/crypt/auto_encrypter_spec.rb +14 -12
  123. data/spec/mongo/crypt/data_key_context_spec.rb +3 -1
  124. data/spec/mongo/crypt/explicit_encryption_context_spec.rb +2 -2
  125. data/spec/mongo/crypt/handle_spec.rb +1 -1
  126. data/spec/mongo/cursor_spec.rb +26 -9
  127. data/spec/mongo/error/operation_failure_heavy_spec.rb +2 -2
  128. data/spec/mongo/operation/context_spec.rb +79 -0
  129. data/spec/mongo/operation/create/op_msg_spec.rb +106 -110
  130. data/spec/mongo/operation/delete/op_msg_spec.rb +6 -5
  131. data/spec/mongo/operation/find/op_msg_spec.rb +66 -0
  132. data/spec/mongo/operation/get_more/op_msg_spec.rb +65 -0
  133. data/spec/mongo/operation/insert/op_msg_spec.rb +128 -131
  134. data/spec/mongo/operation/shared/csot/examples.rb +113 -0
  135. data/spec/mongo/query_cache_spec.rb +243 -225
  136. data/spec/mongo/retryable_spec.rb +1 -0
  137. data/spec/mongo/server/round_trip_time_calculator_spec.rb +120 -0
  138. data/spec/mongo/socket/ssl_spec.rb +0 -10
  139. data/spec/runners/change_streams/test.rb +2 -2
  140. data/spec/runners/crud/operation.rb +1 -1
  141. data/spec/runners/crud/verifier.rb +3 -1
  142. data/spec/runners/transactions/operation.rb +4 -6
  143. data/spec/runners/unified/ambiguous_operations.rb +13 -0
  144. data/spec/runners/unified/assertions.rb +4 -0
  145. data/spec/runners/unified/change_stream_operations.rb +14 -24
  146. data/spec/runners/unified/crud_operations.rb +82 -59
  147. data/spec/runners/unified/ddl_operations.rb +38 -7
  148. data/spec/runners/unified/grid_fs_operations.rb +37 -2
  149. data/spec/runners/unified/support_operations.rb +43 -4
  150. data/spec/runners/unified/test.rb +22 -10
  151. data/spec/runners/unified.rb +1 -1
  152. data/spec/solo/clean_exit_spec.rb +2 -0
  153. data/spec/spec_tests/client_side_operations_timeout_spec.rb +15 -0
  154. data/spec/spec_tests/data/change_streams_unified/change-streams-clusterTime.yml +3 -1
  155. data/spec/spec_tests/data/change_streams_unified/change-streams-disambiguatedPaths.yml +3 -1
  156. data/spec/spec_tests/data/change_streams_unified/change-streams-errors.yml +3 -1
  157. data/spec/spec_tests/data/change_streams_unified/change-streams-pre_and_post_images.yml +1 -1
  158. data/spec/spec_tests/data/change_streams_unified/change-streams-resume-allowlist.yml +1 -1
  159. data/spec/spec_tests/data/change_streams_unified/change-streams-resume-errorLabels.yml +1 -1
  160. data/spec/spec_tests/data/change_streams_unified/change-streams-showExpandedEvents.yml +1 -1
  161. data/spec/spec_tests/data/client_side_encryption/badQueries.yml +2 -1
  162. data/spec/spec_tests/data/client_side_encryption/timeoutMS.yml +67 -0
  163. data/spec/spec_tests/data/client_side_operations_timeout/bulkWrite.yml +87 -0
  164. data/spec/spec_tests/data/client_side_operations_timeout/change-streams.yml +358 -0
  165. data/spec/spec_tests/data/client_side_operations_timeout/close-cursors.yml +129 -0
  166. data/spec/spec_tests/data/client_side_operations_timeout/command-execution.yml +250 -0
  167. data/spec/spec_tests/data/client_side_operations_timeout/convenient-transactions.yml +113 -0
  168. data/spec/spec_tests/data/client_side_operations_timeout/cursors.yml +70 -0
  169. data/spec/spec_tests/data/client_side_operations_timeout/deprecated-options.yml +3982 -0
  170. data/spec/spec_tests/data/client_side_operations_timeout/error-transformations.yml +96 -0
  171. data/spec/spec_tests/data/client_side_operations_timeout/global-timeoutMS.yml +3236 -0
  172. data/spec/spec_tests/data/client_side_operations_timeout/gridfs-advanced.yml +207 -0
  173. data/spec/spec_tests/data/client_side_operations_timeout/gridfs-delete.yml +152 -0
  174. data/spec/spec_tests/data/client_side_operations_timeout/gridfs-download.yml +182 -0
  175. data/spec/spec_tests/data/client_side_operations_timeout/gridfs-find.yml +100 -0
  176. data/spec/spec_tests/data/client_side_operations_timeout/gridfs-upload.yml +249 -0
  177. data/spec/spec_tests/data/client_side_operations_timeout/legacy-timeouts.yml +204 -0
  178. data/spec/spec_tests/data/client_side_operations_timeout/non-tailable-cursors.yml +307 -0
  179. data/spec/spec_tests/data/client_side_operations_timeout/override-collection-timeoutMS.yml +1877 -0
  180. data/spec/spec_tests/data/client_side_operations_timeout/override-operation-timeoutMS.yml +1918 -0
  181. data/spec/spec_tests/data/client_side_operations_timeout/retryability-legacy-timeouts.yml +1676 -0
  182. data/spec/spec_tests/data/client_side_operations_timeout/retryability-timeoutMS.yml +2824 -0
  183. data/spec/spec_tests/data/client_side_operations_timeout/sessions-inherit-timeoutMS.yml +168 -0
  184. data/spec/spec_tests/data/client_side_operations_timeout/sessions-override-operation-timeoutMS.yml +171 -0
  185. data/spec/spec_tests/data/client_side_operations_timeout/sessions-override-timeoutMS.yml +168 -0
  186. data/spec/spec_tests/data/client_side_operations_timeout/tailable-awaitData.yml +247 -0
  187. data/spec/spec_tests/data/client_side_operations_timeout/tailable-non-awaitData.yml +181 -0
  188. data/spec/spec_tests/data/crud_unified/aggregate-write-readPreference.yml +4 -0
  189. data/spec/spec_tests/data/crud_unified/db-aggregate-write-readPreference.yml +4 -0
  190. data/spec/spec_tests/data/crud_unified/find-test-all-options.yml +29 -0
  191. data/spec/spec_tests/server_selection_rtt_spec.rb +6 -6
  192. data/spec/support/certificates/atlas-ocsp-ca.crt +81 -83
  193. data/spec/support/certificates/atlas-ocsp.crt +107 -107
  194. data/spec/support/cluster_tools.rb +3 -3
  195. data/spec/support/common_shortcuts.rb +39 -21
  196. data/spec/support/constraints.rb +0 -10
  197. data/spec/support/crypt/encrypted_fields/range-encryptedFields-Date.json +1 -1
  198. data/spec/support/crypt/encrypted_fields/range-encryptedFields-DecimalNoPrecision.json +1 -1
  199. data/spec/support/crypt/encrypted_fields/range-encryptedFields-DecimalPrecision.json +1 -1
  200. data/spec/support/crypt/encrypted_fields/range-encryptedFields-DoubleNoPrecision.json +1 -1
  201. data/spec/support/crypt/encrypted_fields/range-encryptedFields-DoublePrecision.json +1 -1
  202. data/spec/support/crypt/encrypted_fields/range-encryptedFields-Int.json +1 -1
  203. data/spec/support/crypt/encrypted_fields/range-encryptedFields-Long.json +1 -1
  204. data/spec/support/dns.rb +16 -0
  205. data/spec/support/shared/session.rb +2 -2
  206. data/spec/support/spec_setup.rb +2 -2
  207. data/spec/support/utils.rb +3 -1
  208. metadata +91 -153
  209. data/spec/mongo/server/round_trip_time_averager_spec.rb +0 -48
  210. data/spec/shared/CANDIDATE.md +0 -28
  211. data/spec/shared/LICENSE +0 -20
  212. data/spec/shared/bin/get-mongodb-download-url +0 -17
  213. data/spec/shared/bin/s3-copy +0 -45
  214. data/spec/shared/bin/s3-upload +0 -69
  215. data/spec/shared/lib/mrss/child_process_helper.rb +0 -80
  216. data/spec/shared/lib/mrss/cluster_config.rb +0 -231
  217. data/spec/shared/lib/mrss/constraints.rb +0 -378
  218. data/spec/shared/lib/mrss/docker_runner.rb +0 -298
  219. data/spec/shared/lib/mrss/eg_config_utils.rb +0 -51
  220. data/spec/shared/lib/mrss/event_subscriber.rb +0 -210
  221. data/spec/shared/lib/mrss/lite_constraints.rb +0 -238
  222. data/spec/shared/lib/mrss/release/candidate.rb +0 -281
  223. data/spec/shared/lib/mrss/release/product_data.rb +0 -144
  224. data/spec/shared/lib/mrss/server_version_registry.rb +0 -113
  225. data/spec/shared/lib/mrss/session_registry.rb +0 -69
  226. data/spec/shared/lib/mrss/session_registry_legacy.rb +0 -60
  227. data/spec/shared/lib/mrss/spec_organizer.rb +0 -179
  228. data/spec/shared/lib/mrss/utils.rb +0 -37
  229. data/spec/shared/lib/tasks/candidate.rake +0 -64
  230. data/spec/shared/share/Dockerfile.erb +0 -251
  231. data/spec/shared/share/haproxy-1.conf +0 -16
  232. data/spec/shared/share/haproxy-2.conf +0 -17
  233. data/spec/shared/shlib/config.sh +0 -27
  234. data/spec/shared/shlib/distro.sh +0 -84
  235. data/spec/shared/shlib/server.sh +0 -423
  236. data/spec/shared/shlib/set_env.sh +0 -110
  237. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Date-Aggregate.yml +0 -242
  238. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Date-Correctness.yml +0 -423
  239. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Date-Delete.yml +0 -183
  240. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Date-FindOneAndUpdate.yml +0 -240
  241. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Date-InsertFind.yml +0 -236
  242. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Date-Update.yml +0 -253
  243. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Decimal-Aggregate.yml +0 -1688
  244. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Decimal-Correctness.yml +0 -294
  245. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Decimal-Delete.yml +0 -906
  246. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Decimal-FindOneAndUpdate.yml +0 -1685
  247. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Decimal-InsertFind.yml +0 -1681
  248. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Decimal-Update.yml +0 -1698
  249. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-DecimalPrecision-Aggregate.yml +0 -330
  250. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-DecimalPrecision-Correctness.yml +0 -425
  251. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-DecimalPrecision-Delete.yml +0 -227
  252. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-DecimalPrecision-FindOneAndUpdate.yml +0 -328
  253. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-DecimalPrecision-InsertFind.yml +0 -320
  254. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-DecimalPrecision-Update.yml +0 -337
  255. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Double-Aggregate.yml +0 -914
  256. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Double-Correctness.yml +0 -293
  257. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Double-Delete.yml +0 -519
  258. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Double-FindOneAndUpdate.yml +0 -912
  259. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Double-InsertFind.yml +0 -908
  260. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Double-Update.yml +0 -925
  261. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-DoublePrecision-Aggregate.yml +0 -326
  262. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-DoublePrecision-Correctness.yml +0 -425
  263. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-DoublePrecision-Delete.yml +0 -225
  264. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-DoublePrecision-FindOneAndUpdate.yml +0 -324
  265. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-DoublePrecision-InsertFind.yml +0 -320
  266. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-DoublePrecision-Update.yml +0 -339
  267. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Int-Aggregate.yml +0 -242
  268. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Int-Correctness.yml +0 -424
  269. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Int-Delete.yml +0 -183
  270. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Int-FindOneAndUpdate.yml +0 -240
  271. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Int-InsertFind.yml +0 -236
  272. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Int-Update.yml +0 -255
  273. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Long-Aggregate.yml +0 -242
  274. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Long-Correctness.yml +0 -423
  275. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Long-Delete.yml +0 -183
  276. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Long-FindOneAndUpdate.yml +0 -240
  277. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Long-InsertFind.yml +0 -236
  278. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Long-Update.yml +0 -255
  279. 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"] }