mongo 2.19.1 → 2.21.0

Sign up to get free protection for your applications and to get access to all the features.
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