mongo 2.19.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 (356) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +40 -1
  3. data/Rakefile +83 -174
  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/topology/base.rb +16 -0
  13. data/lib/mongo/cluster.rb +41 -5
  14. data/lib/mongo/collection/helpers.rb +1 -1
  15. data/lib/mongo/collection/view/aggregation/behavior.rb +131 -0
  16. data/lib/mongo/collection/view/aggregation.rb +33 -99
  17. data/lib/mongo/collection/view/builder/aggregation.rb +1 -7
  18. data/lib/mongo/collection/view/change_stream.rb +80 -27
  19. data/lib/mongo/collection/view/iterable.rb +92 -60
  20. data/lib/mongo/collection/view/map_reduce.rb +25 -8
  21. data/lib/mongo/collection/view/readable.rb +79 -30
  22. data/lib/mongo/collection/view/writable.rb +109 -48
  23. data/lib/mongo/collection/view.rb +44 -3
  24. data/lib/mongo/collection.rb +185 -26
  25. data/lib/mongo/config.rb +2 -2
  26. data/lib/mongo/crypt/auto_encrypter.rb +4 -6
  27. data/lib/mongo/crypt/binding.rb +4 -4
  28. data/lib/mongo/crypt/context.rb +20 -14
  29. data/lib/mongo/crypt/encryption_io.rb +56 -26
  30. data/lib/mongo/crypt/explicit_encrypter.rb +49 -20
  31. data/lib/mongo/crypt/explicit_encryption_context.rb +17 -11
  32. data/lib/mongo/crypt/kms/azure/credentials_retriever.rb +22 -6
  33. data/lib/mongo/crypt/kms/gcp/credentials_retriever.rb +29 -4
  34. data/lib/mongo/csot_timeout_holder.rb +119 -0
  35. data/lib/mongo/cursor/kill_spec.rb +5 -2
  36. data/lib/mongo/cursor/nontailable.rb +27 -0
  37. data/lib/mongo/cursor.rb +86 -24
  38. data/lib/mongo/cursor_host.rb +82 -0
  39. data/lib/mongo/database/view.rb +81 -14
  40. data/lib/mongo/database.rb +88 -18
  41. data/lib/mongo/error/operation_failure.rb +209 -204
  42. data/lib/mongo/error/server_timeout_error.rb +12 -0
  43. data/lib/mongo/error/socket_timeout_error.rb +3 -1
  44. data/lib/mongo/error/timeout_error.rb +23 -0
  45. data/lib/mongo/error/transactions_not_supported.rb +34 -0
  46. data/lib/mongo/error.rb +3 -0
  47. data/lib/mongo/grid/fs_bucket.rb +48 -9
  48. data/lib/mongo/grid/stream/read.rb +15 -1
  49. data/lib/mongo/grid/stream/write.rb +21 -4
  50. data/lib/mongo/index/view.rb +77 -16
  51. data/lib/mongo/monitoring/event/secure.rb +1 -1
  52. data/lib/mongo/operation/context.rb +40 -2
  53. data/lib/mongo/operation/create_search_indexes/op_msg.rb +31 -0
  54. data/lib/mongo/operation/create_search_indexes.rb +15 -0
  55. data/lib/mongo/operation/delete/op_msg.rb +2 -1
  56. data/lib/mongo/operation/drop_search_index/op_msg.rb +33 -0
  57. data/lib/mongo/operation/drop_search_index.rb +15 -0
  58. data/lib/mongo/operation/find/op_msg.rb +45 -0
  59. data/lib/mongo/operation/get_more/op_msg.rb +33 -0
  60. data/lib/mongo/operation/insert/op_msg.rb +3 -2
  61. data/lib/mongo/operation/insert/result.rb +4 -2
  62. data/lib/mongo/operation/list_collections/result.rb +1 -1
  63. data/lib/mongo/operation/map_reduce/result.rb +1 -1
  64. data/lib/mongo/operation/op_msg_base.rb +3 -1
  65. data/lib/mongo/operation/result.rb +26 -5
  66. data/lib/mongo/operation/shared/executable.rb +55 -28
  67. data/lib/mongo/operation/shared/op_msg_executable.rb +4 -1
  68. data/lib/mongo/operation/shared/response_handling.rb +25 -27
  69. data/lib/mongo/operation/shared/sessions_supported.rb +1 -1
  70. data/lib/mongo/operation/shared/specifiable.rb +7 -0
  71. data/lib/mongo/operation/shared/timed.rb +52 -0
  72. data/lib/mongo/operation/shared/write.rb +4 -1
  73. data/lib/mongo/operation/update/op_msg.rb +2 -1
  74. data/lib/mongo/operation/update_search_index/op_msg.rb +34 -0
  75. data/lib/mongo/operation/update_search_index.rb +15 -0
  76. data/lib/mongo/operation.rb +4 -0
  77. data/lib/mongo/protocol/message.rb +1 -4
  78. data/lib/mongo/protocol/msg.rb +2 -2
  79. data/lib/mongo/retryable/base_worker.rb +28 -3
  80. data/lib/mongo/retryable/read_worker.rb +78 -36
  81. data/lib/mongo/retryable/write_worker.rb +59 -25
  82. data/lib/mongo/retryable.rb +8 -2
  83. data/lib/mongo/search_index/view.rb +232 -0
  84. data/lib/mongo/server/app_metadata/environment.rb +64 -9
  85. data/lib/mongo/server/app_metadata.rb +5 -4
  86. data/lib/mongo/server/connection.rb +11 -5
  87. data/lib/mongo/server/connection_base.rb +22 -2
  88. data/lib/mongo/server/connection_pool.rb +32 -14
  89. data/lib/mongo/server/description/features.rb +2 -1
  90. data/lib/mongo/server/description.rb +18 -5
  91. data/lib/mongo/server/monitor.rb +7 -4
  92. data/lib/mongo/server/pending_connection.rb +25 -8
  93. data/lib/mongo/server/{round_trip_time_averager.rb → round_trip_time_calculator.rb} +25 -7
  94. data/lib/mongo/server.rb +11 -6
  95. data/lib/mongo/server_selector/base.rb +54 -12
  96. data/lib/mongo/session/server_session/dirtyable.rb +52 -0
  97. data/lib/mongo/session/server_session.rb +3 -0
  98. data/lib/mongo/session/session_pool.rb +12 -18
  99. data/lib/mongo/session.rb +110 -9
  100. data/lib/mongo/socket/ssl.rb +131 -18
  101. data/lib/mongo/socket/tcp.rb +40 -6
  102. data/lib/mongo/socket.rb +154 -25
  103. data/lib/mongo/uri/options_mapper.rb +1 -0
  104. data/lib/mongo/uri.rb +0 -4
  105. data/lib/mongo/version.rb +1 -5
  106. data/lib/mongo.rb +2 -0
  107. data/mongo.gemspec +9 -18
  108. data/spec/atlas/atlas_connectivity_spec.rb +9 -9
  109. data/spec/atlas/operations_spec.rb +5 -5
  110. data/spec/faas/ruby-sam-app/Gemfile +9 -0
  111. data/spec/faas/ruby-sam-app/mongodb/Gemfile +4 -0
  112. data/spec/faas/ruby-sam-app/mongodb/app.rb +149 -0
  113. data/spec/faas/ruby-sam-app/template.yaml +48 -0
  114. data/spec/integration/client_side_encryption/auto_encryption_mongocryptd_spawn_spec.rb +2 -1
  115. data/spec/integration/client_side_encryption/auto_encryption_spec.rb +494 -487
  116. data/spec/integration/client_side_encryption/corpus_spec.rb +10 -2
  117. data/spec/integration/client_side_encryption/on_demand_aws_credentials_spec.rb +1 -1
  118. data/spec/integration/client_side_encryption/range_explicit_encryption_prose_spec.rb +67 -20
  119. data/spec/integration/client_side_operations_timeout/encryption_prose_spec.rb +131 -0
  120. data/spec/integration/connection_pool_populator_spec.rb +2 -0
  121. data/spec/integration/cursor_pinning_spec.rb +15 -60
  122. data/spec/integration/cursor_reaping_spec.rb +1 -1
  123. data/spec/integration/docs_examples_spec.rb +1 -1
  124. data/spec/integration/find_options_spec.rb +227 -0
  125. data/spec/integration/operation_failure_code_spec.rb +1 -1
  126. data/spec/integration/operation_failure_message_spec.rb +3 -3
  127. data/spec/integration/retryable_errors_spec.rb +2 -2
  128. data/spec/integration/retryable_reads_errors_spec.rb +196 -31
  129. data/spec/integration/retryable_writes_errors_spec.rb +156 -0
  130. data/spec/integration/sdam_error_handling_spec.rb +4 -1
  131. data/spec/integration/search_indexes_prose_spec.rb +172 -0
  132. data/spec/integration/server_spec.rb +4 -3
  133. data/spec/integration/transactions_api_examples_spec.rb +2 -0
  134. data/spec/kerberos/kerberos_spec.rb +4 -0
  135. data/spec/lite_spec_helper.rb +34 -20
  136. data/spec/mongo/auth/user/view_spec.rb +1 -1
  137. data/spec/mongo/caching_cursor_spec.rb +1 -1
  138. data/spec/mongo/client_encryption_spec.rb +1 -0
  139. data/spec/mongo/client_spec.rb +158 -4
  140. data/spec/mongo/cluster_spec.rb +36 -0
  141. data/spec/mongo/collection/view/aggregation_spec.rb +20 -40
  142. data/spec/mongo/collection/view/change_stream_spec.rb +3 -3
  143. data/spec/mongo/collection/view/explainable_spec.rb +2 -0
  144. data/spec/mongo/collection_crud_spec.rb +2 -1
  145. data/spec/mongo/collection_spec.rb +5 -6
  146. data/spec/mongo/crypt/auto_encrypter_spec.rb +14 -12
  147. data/spec/mongo/crypt/data_key_context_spec.rb +3 -1
  148. data/spec/mongo/crypt/explicit_encryption_context_spec.rb +2 -2
  149. data/spec/mongo/crypt/handle_spec.rb +1 -1
  150. data/spec/mongo/cursor_spec.rb +26 -9
  151. data/spec/mongo/error/operation_failure_heavy_spec.rb +2 -2
  152. data/spec/mongo/operation/context_spec.rb +79 -0
  153. data/spec/mongo/operation/create/op_msg_spec.rb +106 -110
  154. data/spec/mongo/operation/delete/op_msg_spec.rb +6 -5
  155. data/spec/mongo/operation/find/op_msg_spec.rb +66 -0
  156. data/spec/mongo/operation/get_more/op_msg_spec.rb +65 -0
  157. data/spec/mongo/operation/insert/op_msg_spec.rb +128 -131
  158. data/spec/mongo/operation/insert_spec.rb +1 -1
  159. data/spec/mongo/operation/shared/csot/examples.rb +113 -0
  160. data/spec/mongo/query_cache_spec.rb +243 -225
  161. data/spec/mongo/retryable/write_worker_spec.rb +39 -0
  162. data/spec/mongo/retryable_spec.rb +1 -0
  163. data/spec/mongo/server/app_metadata/environment_spec.rb +135 -0
  164. data/spec/mongo/server/app_metadata_spec.rb +12 -2
  165. data/spec/mongo/server/connection_spec.rb +26 -0
  166. data/spec/mongo/server/round_trip_time_calculator_spec.rb +120 -0
  167. data/spec/mongo/session/session_pool_spec.rb +1 -16
  168. data/spec/mongo/session_transaction_spec.rb +15 -0
  169. data/spec/mongo/socket/ssl_spec.rb +0 -10
  170. data/spec/mongo/uri_spec.rb +0 -9
  171. data/spec/runners/change_streams/test.rb +2 -2
  172. data/spec/runners/crud/operation.rb +1 -1
  173. data/spec/runners/crud/test.rb +0 -8
  174. data/spec/runners/crud/verifier.rb +3 -1
  175. data/spec/runners/crud.rb +1 -1
  176. data/spec/runners/transactions/operation.rb +4 -6
  177. data/spec/runners/transactions/test.rb +12 -3
  178. data/spec/runners/unified/ambiguous_operations.rb +13 -0
  179. data/spec/runners/unified/assertions.rb +20 -3
  180. data/spec/runners/unified/change_stream_operations.rb +14 -24
  181. data/spec/runners/unified/crud_operations.rb +82 -47
  182. data/spec/runners/unified/ddl_operations.rb +38 -7
  183. data/spec/runners/unified/grid_fs_operations.rb +37 -2
  184. data/spec/runners/unified/search_index_operations.rb +63 -0
  185. data/spec/runners/unified/support_operations.rb +46 -9
  186. data/spec/runners/unified/test.rb +33 -12
  187. data/spec/runners/unified.rb +1 -1
  188. data/spec/solo/clean_exit_spec.rb +2 -0
  189. data/spec/spec_helper.rb +1 -1
  190. data/spec/spec_tests/client_side_operations_timeout_spec.rb +15 -0
  191. data/spec/spec_tests/data/change_streams_unified/change-streams-clusterTime.yml +3 -1
  192. data/spec/spec_tests/data/change_streams_unified/change-streams-disambiguatedPaths.yml +3 -1
  193. data/spec/spec_tests/data/change_streams_unified/change-streams-errors.yml +3 -1
  194. data/spec/spec_tests/data/change_streams_unified/change-streams-pre_and_post_images.yml +1 -1
  195. data/spec/spec_tests/data/change_streams_unified/change-streams-resume-allowlist.yml +1 -1
  196. data/spec/spec_tests/data/change_streams_unified/change-streams-resume-errorLabels.yml +1 -1
  197. data/spec/spec_tests/data/change_streams_unified/change-streams-showExpandedEvents.yml +1 -1
  198. data/spec/spec_tests/data/client_side_encryption/badQueries.yml +2 -1
  199. data/spec/spec_tests/data/client_side_encryption/explain.yml +2 -2
  200. data/spec/spec_tests/data/client_side_encryption/fle2v2-BypassQueryAnalysis.yml +1 -0
  201. data/spec/spec_tests/data/client_side_encryption/fle2v2-Compact.yml +1 -0
  202. data/spec/spec_tests/data/client_side_encryption/fle2v2-CreateCollection.yml +1 -0
  203. data/spec/spec_tests/data/client_side_encryption/fle2v2-DecryptExistingData.yml +1 -0
  204. data/spec/spec_tests/data/client_side_encryption/fle2v2-Delete.yml +1 -0
  205. data/spec/spec_tests/data/client_side_encryption/fle2v2-EncryptedFields-vs-EncryptedFieldsMap.yml +1 -0
  206. data/spec/spec_tests/data/client_side_encryption/fle2v2-EncryptedFields-vs-jsonSchema.yml +1 -0
  207. data/spec/spec_tests/data/client_side_encryption/fle2v2-EncryptedFieldsMap-defaults.yml +1 -0
  208. data/spec/spec_tests/data/client_side_encryption/fle2v2-FindOneAndUpdate.yml +1 -0
  209. data/spec/spec_tests/data/client_side_encryption/fle2v2-InsertFind-Indexed.yml +1 -0
  210. data/spec/spec_tests/data/client_side_encryption/fle2v2-InsertFind-Unindexed.yml +1 -0
  211. data/spec/spec_tests/data/client_side_encryption/fle2v2-MissingKey.yml +1 -0
  212. data/spec/spec_tests/data/client_side_encryption/fle2v2-NoEncryption.yml +1 -0
  213. data/spec/spec_tests/data/client_side_encryption/fle2v2-Update.yml +1 -0
  214. data/spec/spec_tests/data/client_side_encryption/fle2v2-validatorAndPartialFieldExpression.yml +2 -1
  215. data/spec/spec_tests/data/client_side_encryption/timeoutMS.yml +67 -0
  216. data/spec/spec_tests/data/client_side_operations_timeout/bulkWrite.yml +87 -0
  217. data/spec/spec_tests/data/client_side_operations_timeout/change-streams.yml +358 -0
  218. data/spec/spec_tests/data/client_side_operations_timeout/close-cursors.yml +129 -0
  219. data/spec/spec_tests/data/client_side_operations_timeout/command-execution.yml +250 -0
  220. data/spec/spec_tests/data/client_side_operations_timeout/convenient-transactions.yml +113 -0
  221. data/spec/spec_tests/data/client_side_operations_timeout/cursors.yml +70 -0
  222. data/spec/spec_tests/data/client_side_operations_timeout/deprecated-options.yml +3982 -0
  223. data/spec/spec_tests/data/client_side_operations_timeout/error-transformations.yml +96 -0
  224. data/spec/spec_tests/data/client_side_operations_timeout/global-timeoutMS.yml +3236 -0
  225. data/spec/spec_tests/data/client_side_operations_timeout/gridfs-advanced.yml +207 -0
  226. data/spec/spec_tests/data/client_side_operations_timeout/gridfs-delete.yml +152 -0
  227. data/spec/spec_tests/data/client_side_operations_timeout/gridfs-download.yml +182 -0
  228. data/spec/spec_tests/data/client_side_operations_timeout/gridfs-find.yml +100 -0
  229. data/spec/spec_tests/data/client_side_operations_timeout/gridfs-upload.yml +249 -0
  230. data/spec/spec_tests/data/client_side_operations_timeout/legacy-timeouts.yml +204 -0
  231. data/spec/spec_tests/data/client_side_operations_timeout/non-tailable-cursors.yml +307 -0
  232. data/spec/spec_tests/data/client_side_operations_timeout/override-collection-timeoutMS.yml +1877 -0
  233. data/spec/spec_tests/data/client_side_operations_timeout/override-operation-timeoutMS.yml +1918 -0
  234. data/spec/spec_tests/data/client_side_operations_timeout/retryability-legacy-timeouts.yml +1676 -0
  235. data/spec/spec_tests/data/client_side_operations_timeout/retryability-timeoutMS.yml +2824 -0
  236. data/spec/spec_tests/data/client_side_operations_timeout/sessions-inherit-timeoutMS.yml +168 -0
  237. data/spec/spec_tests/data/client_side_operations_timeout/sessions-override-operation-timeoutMS.yml +171 -0
  238. data/spec/spec_tests/data/client_side_operations_timeout/sessions-override-timeoutMS.yml +168 -0
  239. data/spec/spec_tests/data/client_side_operations_timeout/tailable-awaitData.yml +247 -0
  240. data/spec/spec_tests/data/client_side_operations_timeout/tailable-non-awaitData.yml +181 -0
  241. data/spec/spec_tests/data/connection_string/invalid-uris.yml +0 -10
  242. data/spec/spec_tests/data/connection_string/valid-options.yml +13 -0
  243. data/spec/spec_tests/data/crud_unified/aggregate-write-readPreference.yml +6 -0
  244. data/spec/spec_tests/data/crud_unified/db-aggregate-write-readPreference.yml +6 -0
  245. data/spec/spec_tests/data/crud_unified/find-test-all-options.yml +377 -0
  246. data/spec/spec_tests/data/index_management/createSearchIndex.yml +64 -0
  247. data/spec/spec_tests/data/index_management/createSearchIndexes.yml +86 -0
  248. data/spec/spec_tests/data/index_management/dropSearchIndex.yml +43 -0
  249. data/spec/spec_tests/data/index_management/listSearchIndexes.yml +91 -0
  250. data/spec/spec_tests/data/index_management/updateSearchIndex.yml +46 -0
  251. data/spec/spec_tests/data/retryable_writes/unified/bulkWrite-serverErrors.yml +3 -6
  252. data/spec/spec_tests/data/retryable_writes/unified/insertOne-serverErrors.yml +3 -6
  253. data/spec/spec_tests/data/run_command_unified/runCommand.yml +319 -0
  254. data/spec/spec_tests/data/sessions_unified/driver-sessions-dirty-session-errors.yml +351 -0
  255. data/spec/spec_tests/data/unified/valid-pass/poc-crud.yml +1 -1
  256. data/spec/spec_tests/data/unified/valid-pass/poc-retryable-writes.yml +7 -7
  257. data/spec/spec_tests/data/unified/valid-pass/poc-sessions.yml +3 -4
  258. data/spec/spec_tests/data/unified/valid-pass/poc-transactions-convenient-api.yml +1 -1
  259. data/spec/spec_tests/data/unified/valid-pass/poc-transactions-mongos-pin-auto.yml +1 -1
  260. data/spec/spec_tests/data/unified/valid-pass/poc-transactions.yml +3 -3
  261. data/spec/spec_tests/index_management_unified_spec.rb +13 -0
  262. data/spec/spec_tests/run_command_unified_spec.rb +13 -0
  263. data/spec/spec_tests/sdam_unified_spec.rb +2 -0
  264. data/spec/spec_tests/server_selection_rtt_spec.rb +6 -6
  265. data/spec/spec_tests/transactions_unified_spec.rb +2 -1
  266. data/spec/support/certificates/atlas-ocsp-ca.crt +89 -79
  267. data/spec/support/certificates/atlas-ocsp.crt +117 -122
  268. data/spec/support/certificates/retrieve-atlas-cert +1 -1
  269. data/spec/support/cluster_tools.rb +3 -3
  270. data/spec/support/common_shortcuts.rb +2 -2
  271. data/spec/support/constraints.rb +6 -0
  272. data/spec/support/crypt/encrypted_fields/range-encryptedFields-Date.json +1 -1
  273. data/spec/support/crypt/encrypted_fields/range-encryptedFields-DecimalNoPrecision.json +1 -1
  274. data/spec/support/crypt/encrypted_fields/range-encryptedFields-DecimalPrecision.json +1 -1
  275. data/spec/support/crypt/encrypted_fields/range-encryptedFields-DoubleNoPrecision.json +1 -1
  276. data/spec/support/crypt/encrypted_fields/range-encryptedFields-DoublePrecision.json +1 -1
  277. data/spec/support/crypt/encrypted_fields/range-encryptedFields-Int.json +1 -1
  278. data/spec/support/crypt/encrypted_fields/range-encryptedFields-Long.json +1 -1
  279. data/spec/support/ocsp +1 -1
  280. data/spec/support/recording_logger.rb +27 -0
  281. data/spec/support/shared/session.rb +2 -2
  282. data/spec/support/spec_config.rb +5 -0
  283. data/spec/support/spec_setup.rb +2 -2
  284. data/spec/support/utils.rb +3 -1
  285. metadata +1329 -1368
  286. checksums.yaml.gz.sig +0 -0
  287. data/spec/mongo/server/round_trip_time_averager_spec.rb +0 -48
  288. data/spec/shared/LICENSE +0 -20
  289. data/spec/shared/bin/get-mongodb-download-url +0 -17
  290. data/spec/shared/bin/s3-copy +0 -45
  291. data/spec/shared/bin/s3-upload +0 -69
  292. data/spec/shared/lib/mrss/child_process_helper.rb +0 -80
  293. data/spec/shared/lib/mrss/cluster_config.rb +0 -231
  294. data/spec/shared/lib/mrss/constraints.rb +0 -378
  295. data/spec/shared/lib/mrss/docker_runner.rb +0 -295
  296. data/spec/shared/lib/mrss/eg_config_utils.rb +0 -51
  297. data/spec/shared/lib/mrss/event_subscriber.rb +0 -210
  298. data/spec/shared/lib/mrss/lite_constraints.rb +0 -238
  299. data/spec/shared/lib/mrss/server_version_registry.rb +0 -113
  300. data/spec/shared/lib/mrss/session_registry.rb +0 -69
  301. data/spec/shared/lib/mrss/session_registry_legacy.rb +0 -60
  302. data/spec/shared/lib/mrss/spec_organizer.rb +0 -179
  303. data/spec/shared/lib/mrss/utils.rb +0 -37
  304. data/spec/shared/share/Dockerfile.erb +0 -330
  305. data/spec/shared/share/haproxy-1.conf +0 -16
  306. data/spec/shared/share/haproxy-2.conf +0 -17
  307. data/spec/shared/shlib/config.sh +0 -27
  308. data/spec/shared/shlib/distro.sh +0 -74
  309. data/spec/shared/shlib/server.sh +0 -416
  310. data/spec/shared/shlib/set_env.sh +0 -169
  311. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Date-Aggregate.yml +0 -241
  312. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Date-Correctness.yml +0 -422
  313. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Date-Delete.yml +0 -182
  314. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Date-FindOneAndUpdate.yml +0 -239
  315. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Date-InsertFind.yml +0 -235
  316. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Date-Update.yml +0 -252
  317. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Decimal-Aggregate.yml +0 -1687
  318. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Decimal-Correctness.yml +0 -293
  319. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Decimal-Delete.yml +0 -905
  320. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Decimal-FindOneAndUpdate.yml +0 -1684
  321. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Decimal-InsertFind.yml +0 -1680
  322. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Decimal-Update.yml +0 -1697
  323. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-DecimalPrecision-Aggregate.yml +0 -329
  324. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-DecimalPrecision-Correctness.yml +0 -424
  325. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-DecimalPrecision-Delete.yml +0 -226
  326. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-DecimalPrecision-FindOneAndUpdate.yml +0 -327
  327. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-DecimalPrecision-InsertFind.yml +0 -319
  328. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-DecimalPrecision-Update.yml +0 -336
  329. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Double-Aggregate.yml +0 -913
  330. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Double-Correctness.yml +0 -292
  331. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Double-Delete.yml +0 -518
  332. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Double-FindOneAndUpdate.yml +0 -911
  333. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Double-InsertFind.yml +0 -907
  334. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Double-Update.yml +0 -924
  335. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-DoublePrecision-Aggregate.yml +0 -325
  336. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-DoublePrecision-Correctness.yml +0 -424
  337. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-DoublePrecision-Delete.yml +0 -224
  338. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-DoublePrecision-FindOneAndUpdate.yml +0 -323
  339. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-DoublePrecision-InsertFind.yml +0 -319
  340. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-DoublePrecision-Update.yml +0 -338
  341. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Int-Aggregate.yml +0 -241
  342. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Int-Correctness.yml +0 -423
  343. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Int-Delete.yml +0 -182
  344. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Int-FindOneAndUpdate.yml +0 -239
  345. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Int-InsertFind.yml +0 -235
  346. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Int-Update.yml +0 -254
  347. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Long-Aggregate.yml +0 -241
  348. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Long-Correctness.yml +0 -422
  349. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Long-Delete.yml +0 -182
  350. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Long-FindOneAndUpdate.yml +0 -239
  351. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Long-InsertFind.yml +0 -235
  352. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Long-Update.yml +0 -254
  353. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-WrongType.yml +0 -43
  354. data/spec/spec_tests/data/cmap/pool-clear-interrupt-immediately.yml +0 -49
  355. data.tar.gz.sig +0 -0
  356. metadata.gz.sig +0 -2
@@ -188,6 +188,15 @@ describe 'Client-Side Encryption' do
188
188
  key_vault_collection.insert_one(kmip_data_key)
189
189
  end
190
190
 
191
+ # This method compensates for an API change between BSON 4 and
192
+ # BSON 5.
193
+ def normalize_cse_value(a)
194
+ case a
195
+ when BSON::Decimal128 then a.to_d
196
+ else a
197
+ end
198
+ end
199
+
191
200
  shared_context 'with jsonSchema collection validator' do
192
201
  let(:local_schema_map) { nil }
193
202
 
@@ -228,12 +237,11 @@ describe 'Client-Side Encryption' do
228
237
  .find(_id: corpus_encrypted_id)
229
238
  .first
230
239
 
231
-
232
240
  corpus_encrypted_actual.each do |key, value|
233
241
  # If it was deterministically encrypted, test the encrypted values
234
242
  # for equality.
235
243
  if value['algo'] == 'det'
236
- expect(value['value']).to eq(corpus_encrypted_expected[key]['value'])
244
+ expect(normalize_cse_value(value['value'])).to eq(normalize_cse_value(corpus_encrypted_expected[key]['value']))
237
245
  else
238
246
  # If the document was randomly encrypted, the two encrypted values
239
247
  # will not be equal. Ensure that they are equal when decrypted.
@@ -37,7 +37,7 @@ describe 'On-demand AWS Credentials' do
37
37
  it 'raises an error' do
38
38
  expect_any_instance_of(
39
39
  Mongo::Auth::Aws::CredentialsRetriever
40
- ).to receive(:credentials).with(no_args).once.and_raise(
40
+ ).to receive(:credentials).with(kind_of(Mongo::CsotTimeoutHolder)).once.and_raise(
41
41
  Mongo::Auth::Aws::CredentialsNotFound
42
42
  )
43
43
 
@@ -6,7 +6,8 @@ require 'spec_helper'
6
6
  # be revisited if these tests ever need to be significantly modified.
7
7
  # rubocop:disable RSpec/ExampleLength
8
8
  describe 'Range Explicit Encryption' do
9
- min_server_version '7.0.0-rc0'
9
+ min_server_version '8.0.0-rc18'
10
+
10
11
  require_libmongocrypt
11
12
  include_context 'define shared FLE helpers'
12
13
 
@@ -53,7 +54,7 @@ describe 'Range Explicit Encryption' do
53
54
  value,
54
55
  {
55
56
  key_id: key1_id,
56
- algorithm: 'RangePreview',
57
+ algorithm: 'Range',
57
58
  contention_factor: 0,
58
59
  range_opts: range_opts
59
60
  }
@@ -73,8 +74,8 @@ describe 'Range Explicit Encryption' do
73
74
  expr,
74
75
  {
75
76
  key_id: key1_id,
76
- algorithm: 'RangePreview',
77
- query_type: 'rangePreview',
77
+ algorithm: 'Range',
78
+ query_type: 'range',
78
79
  contention_factor: 0,
79
80
  range_opts: range_opts
80
81
  }
@@ -97,8 +98,8 @@ describe 'Range Explicit Encryption' do
97
98
  expr,
98
99
  {
99
100
  key_id: key1_id,
100
- algorithm: 'RangePreview',
101
- query_type: 'rangePreview',
101
+ algorithm: 'Range',
102
+ query_type: 'range',
102
103
  contention_factor: 0,
103
104
  range_opts: range_opts
104
105
  }
@@ -120,8 +121,8 @@ describe 'Range Explicit Encryption' do
120
121
  expr,
121
122
  {
122
123
  key_id: key1_id,
123
- algorithm: 'RangePreview',
124
- query_type: 'rangePreview',
124
+ algorithm: 'Range',
125
+ query_type: 'range',
125
126
  contention_factor: 0,
126
127
  range_opts: range_opts
127
128
  }
@@ -137,8 +138,8 @@ describe 'Range Explicit Encryption' do
137
138
  expr,
138
139
  {
139
140
  key_id: key1_id,
140
- algorithm: 'RangePreview',
141
- query_type: 'rangePreview',
141
+ algorithm: 'Range',
142
+ query_type: 'range',
142
143
  contention_factor: 0,
143
144
  range_opts: range_opts
144
145
  }
@@ -160,7 +161,7 @@ describe 'Range Explicit Encryption' do
160
161
  value_converter.call(201),
161
162
  {
162
163
  key_id: key1_id,
163
- algorithm: 'RangePreview',
164
+ algorithm: 'Range',
164
165
  contention_factor: 0,
165
166
  range_opts: range_opts
166
167
  }
@@ -180,7 +181,7 @@ describe 'Range Explicit Encryption' do
180
181
  value,
181
182
  {
182
183
  key_id: key1_id,
183
- algorithm: 'RangePreview',
184
+ algorithm: 'Range',
184
185
  contention_factor: 0,
185
186
  range_opts: range_opts
186
187
  }
@@ -195,7 +196,7 @@ describe 'Range Explicit Encryption' do
195
196
  value_converter.call(6),
196
197
  {
197
198
  key_id: key1_id,
198
- algorithm: 'RangePreview',
199
+ algorithm: 'Range',
199
200
  contention_factor: 0,
200
201
  range_opts: {
201
202
  min: value_converter.call(0),
@@ -241,7 +242,7 @@ describe 'Range Explicit Encryption' do
241
242
  insert_payload = client_encryption.encrypt(
242
243
  num,
243
244
  key_id: key1_id,
244
- algorithm: 'RangePreview',
245
+ algorithm: 'Range',
245
246
  contention_factor: 0,
246
247
  range_opts: range_opts
247
248
  )
@@ -287,7 +288,7 @@ describe 'Range Explicit Encryption' do
287
288
  insert_payload = client_encryption.encrypt(
288
289
  BSON::Int64.new(num),
289
290
  key_id: key1_id,
290
- algorithm: 'RangePreview',
291
+ algorithm: 'Range',
291
292
  contention_factor: 0,
292
293
  range_opts: range_opts
293
294
  )
@@ -334,7 +335,7 @@ describe 'Range Explicit Encryption' do
334
335
  insert_payload = client_encryption.encrypt(
335
336
  num,
336
337
  key_id: key1_id,
337
- algorithm: 'RangePreview',
338
+ algorithm: 'Range',
338
339
  contention_factor: 0,
339
340
  range_opts: range_opts
340
341
  )
@@ -378,7 +379,7 @@ describe 'Range Explicit Encryption' do
378
379
  insert_payload = client_encryption.encrypt(
379
380
  num,
380
381
  key_id: key1_id,
381
- algorithm: 'RangePreview',
382
+ algorithm: 'Range',
382
383
  contention_factor: 0,
383
384
  range_opts: range_opts
384
385
  )
@@ -424,7 +425,7 @@ describe 'Range Explicit Encryption' do
424
425
  insert_payload = client_encryption.encrypt(
425
426
  Time.new(num),
426
427
  key_id: key1_id,
427
- algorithm: 'RangePreview',
428
+ algorithm: 'Range',
428
429
  contention_factor: 0,
429
430
  range_opts: range_opts
430
431
  )
@@ -473,7 +474,7 @@ describe 'Range Explicit Encryption' do
473
474
  insert_payload = client_encryption.encrypt(
474
475
  BSON::Decimal128.new(num),
475
476
  key_id: key1_id,
476
- algorithm: 'RangePreview',
477
+ algorithm: 'Range',
477
478
  contention_factor: 0,
478
479
  range_opts: range_opts
479
480
  )
@@ -519,7 +520,7 @@ describe 'Range Explicit Encryption' do
519
520
  insert_payload = client_encryption.encrypt(
520
521
  BSON::Decimal128.new(num),
521
522
  key_id: key1_id,
522
- algorithm: 'RangePreview',
523
+ algorithm: 'Range',
523
524
  contention_factor: 0,
524
525
  range_opts: range_opts
525
526
  )
@@ -532,5 +533,51 @@ describe 'Range Explicit Encryption' do
532
533
 
533
534
  include_examples 'common cases'
534
535
  end
536
+
537
+ describe 'Range Explicit Encryption applies defaults' do
538
+ let(:payload_defaults) do
539
+ client_encryption.encrypt(
540
+ 123,
541
+ key_id: key1_id,
542
+ algorithm: 'Range',
543
+ contention_factor: 0,
544
+ range_opts: {
545
+ min: 0,
546
+ max: 1000
547
+ }
548
+ )
549
+ end
550
+
551
+ it 'uses libmongocrypt default' do
552
+ payload = client_encryption.encrypt(
553
+ 123,
554
+ key_id: key1_id,
555
+ algorithm: 'Range',
556
+ contention_factor: 0,
557
+ range_opts: {
558
+ min: 0,
559
+ max: 1000,
560
+ sparsity: 2,
561
+ trim_factor: 6
562
+ }
563
+ )
564
+ expect(payload.to_s.size).to eq(payload_defaults.to_s.size)
565
+ end
566
+
567
+ it 'accepts trim_factor 0' do
568
+ payload = client_encryption.encrypt(
569
+ 123,
570
+ key_id: key1_id,
571
+ algorithm: 'Range',
572
+ contention_factor: 0,
573
+ range_opts: {
574
+ min: 0,
575
+ max: 1000,
576
+ trim_factor: 0
577
+ }
578
+ )
579
+ expect(payload.to_s.size).to eq(payload_defaults.to_s.size)
580
+ end
581
+ end
535
582
  end
536
583
  # rubocop:enable RSpec/ExampleLength
@@ -0,0 +1,131 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
4
+
5
+ describe 'CSOT for encryption' do
6
+ require_libmongocrypt
7
+ require_no_multi_mongos
8
+ min_server_fcv '4.2'
9
+
10
+ include_context 'define shared FLE helpers'
11
+ include_context 'with local kms_providers'
12
+
13
+ let(:subscriber) { Mrss::EventSubscriber.new }
14
+
15
+ describe 'mongocryptd' do
16
+ before do
17
+ Process.spawn(
18
+ 'mongocryptd',
19
+ '--pidfilepath=bypass-spawning-mongocryptd.pid', '--port=23000', '--idleShutdownTimeoutSecs=60',
20
+ %i[ out err ] => '/dev/null'
21
+ )
22
+ end
23
+
24
+ let(:client) do
25
+ Mongo::Client.new('mongodb://localhost:23000/?timeoutMS=1000').tap do |client|
26
+ client.subscribe(Mongo::Monitoring::COMMAND, subscriber)
27
+ end
28
+ end
29
+
30
+ let(:ping_command) do
31
+ subscriber.started_events.find do |event|
32
+ event.command_name == 'ping'
33
+ end&.command
34
+ end
35
+
36
+ after do
37
+ client.close
38
+ end
39
+
40
+ it 'does not set maxTimeMS for commands sent to mongocryptd' do
41
+ expect do
42
+ client.use('admin').command(ping: 1)
43
+ end.to raise_error(Mongo::Error::OperationFailure)
44
+
45
+ expect(ping_command).not_to have_key('maxTimeMS')
46
+ end
47
+ end
48
+
49
+ describe 'ClientEncryption' do
50
+ let(:key_vault_client) do
51
+ ClientRegistry.instance.new_local_client(
52
+ SpecConfig.instance.addresses,
53
+ SpecConfig.instance.test_options.merge(timeout_ms: 20)
54
+ )
55
+ end
56
+
57
+ let(:client_encryption) do
58
+ Mongo::ClientEncryption.new(
59
+ key_vault_client,
60
+ key_vault_namespace: key_vault_namespace,
61
+ kms_providers: local_kms_providers
62
+ )
63
+ end
64
+
65
+ describe '#createDataKey' do
66
+ before do
67
+ authorized_client.use(key_vault_db)[key_vault_coll].drop
68
+ authorized_client.use(key_vault_db)[key_vault_coll].create
69
+ authorized_client.use(:admin).command({
70
+ configureFailPoint: 'failCommand',
71
+ mode: {
72
+ times: 1
73
+ },
74
+ data: {
75
+ failCommands: [ 'insert' ],
76
+ blockConnection: true,
77
+ blockTimeMS: 30
78
+ }
79
+ })
80
+ end
81
+
82
+ after do
83
+ authorized_client.use(:admin).command({
84
+ configureFailPoint: 'failCommand',
85
+ mode: 'off',
86
+ })
87
+ key_vault_client.close
88
+ end
89
+
90
+ it 'fails with timeout error' do
91
+ expect do
92
+ client_encryption.create_data_key('local')
93
+ end.to raise_error(Mongo::Error::TimeoutError)
94
+ end
95
+ end
96
+
97
+ describe '#encrypt' do
98
+ let!(:data_key_id) do
99
+ client_encryption.create_data_key('local')
100
+ end
101
+
102
+ before do
103
+ authorized_client.use(:admin).command({
104
+ configureFailPoint: 'failCommand',
105
+ mode: {
106
+ times: 1
107
+ },
108
+ data: {
109
+ failCommands: [ 'find' ],
110
+ blockConnection: true,
111
+ blockTimeMS: 30
112
+ }
113
+ })
114
+ end
115
+
116
+ after do
117
+ authorized_client.use(:admin).command({
118
+ configureFailPoint: 'failCommand',
119
+ mode: 'off',
120
+ })
121
+ end
122
+
123
+ it 'fails with timeout error' do
124
+ expect do
125
+ client_encryption.encrypt('hello', key_id: data_key_id,
126
+ algorithm: 'AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic')
127
+ end.to raise_error(Mongo::Error::TimeoutError)
128
+ end
129
+ end
130
+ end
131
+ end
@@ -26,6 +26,8 @@ describe 'Connection pool populator integration' do
26
26
 
27
27
  declare_topology_double
28
28
 
29
+ retry_test
30
+
29
31
  let(:app_metadata) do
30
32
  Mongo::Server::AppMetadata.new(options)
31
33
  end
@@ -52,73 +52,28 @@ describe 'Cursor pinning' do
52
52
  context 'lb' do
53
53
  require_topology :load_balanced
54
54
 
55
- # In load-balanced topology, we cannot create new connections to a
56
- # particular service.
55
+ # In load-balanced topology, a cursor retains the connection used to create
56
+ # it until the cursor is closed.
57
57
 
58
- context 'when no connection is available' do
58
+ context 'when connection is available' do
59
+ require_multi_mongos
59
60
 
60
- it 'raises ConnectionCheckOutTimeout' do
61
- server.pool.size.should == 0
61
+ let(:client) { authorized_client.with(max_pool_size: 2) }
62
62
 
63
+ it 'does not return connection to the pool if cursor not drained' do
64
+ expect(server.pool).not_to receive(:check_in)
63
65
  enum = collection.find({}, batch_size: 1).to_enum
64
- # Still zero because we haven't iterated
65
- server.pool.size.should == 0
66
-
66
+ # Get the first element only; cursor is not drained, so there should
67
+ # be no check_in of the connection.
67
68
  enum.next
68
- server.pool.size.should == 1
69
-
70
- # Grab the connection that was used
71
- server.with_connection do
72
- # This requires a new connection, but we cannot make one.
73
- lambda do
74
- enum.next
75
- end.should raise_error(Mongo::Error::ConnectionCheckOutTimeout)
76
-
77
- server.pool.size.should == 1
78
- end
79
69
  end
80
- end
81
-
82
- context 'when connection is available' do
83
- require_multi_mongos
84
-
85
- let(:client) { authorized_client.with(max_pool_size: 4) }
86
-
87
- it 'uses the available connection' do
88
- server.pool.size.should == 0
89
-
90
- # Create 4 connections.
91
-
92
- enums = []
93
- connections = []
94
- connection_ids = []
95
-
96
- 4.times do
97
- view = collection.find({}, batch_size: 1)
98
- enum = view.to_enum
99
-
100
- enum.next
101
-
102
- enums << enum
103
- connection_ids << view.cursor.initial_result.connection_global_id
104
- connections << server.pool.check_out
105
- end
106
-
107
- connection_ids.uniq.length.should be > 1
108
-
109
- server.pool.size.should == 4
110
-
111
- connections.each do |c|
112
- server.pool.check_in(c)
113
- end
114
70
 
115
- # At this point, in theory, all connections are equally likely to
116
- # be chosen, but we have cursors referencing more than one
117
- # distinct service.
118
- # Iterate each cursor to ensure they all continue to work.
119
- enums.each do |enum|
120
- enum.next
121
- end
71
+ it 'returns connection to the pool when cursor is drained' do
72
+ view = collection.find({}, batch_size: 1)
73
+ enum = view.to_enum
74
+ expect_any_instance_of(Mongo::Cursor).to receive(:check_in_connection)
75
+ # Drain the cursor
76
+ enum.each { |it| it.nil? }
122
77
  end
123
78
  end
124
79
  end
@@ -24,7 +24,7 @@ describe 'Cursor reaping' do
24
24
  let(:subscriber) { Mrss::EventSubscriber.new }
25
25
 
26
26
  let(:client) do
27
- authorized_client.tap do |client|
27
+ authorized_client.with(max_pool_size: 10).tap do |client|
28
28
  client.subscribe(Mongo::Monitoring::COMMAND, subscriber)
29
29
  end
30
30
  end
@@ -9,7 +9,7 @@ describe 'aggregation examples in Ruby' do
9
9
  # the tests in this file.
10
10
  begin
11
11
  ClientRegistry.instance.global_client('authorized')['_placeholder'].create
12
- rescue Mongo::Error::OperationFailure => e
12
+ rescue Mongo::Error::OperationFailure::Family => e
13
13
  # Collection already exists
14
14
  if e.code != 48
15
15
  raise