mongo 2.17.4 → 2.18.0.beta1

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 (624) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data/README.md +21 -37
  4. data/lib/mongo/auth/base.rb +8 -1
  5. data/lib/mongo/auth.rb +12 -1
  6. data/lib/mongo/bulk_write/result.rb +10 -1
  7. data/lib/mongo/bulk_write/result_combiner.rb +2 -4
  8. data/lib/mongo/bulk_write.rb +108 -28
  9. data/lib/mongo/client.rb +114 -12
  10. data/lib/mongo/client_encryption.rb +30 -9
  11. data/lib/mongo/cluster/reapers/cursor_reaper.rb +11 -1
  12. data/lib/mongo/cluster.rb +20 -24
  13. data/lib/mongo/collection/helpers.rb +43 -0
  14. data/lib/mongo/collection/queryable_encryption.rb +122 -0
  15. data/lib/mongo/collection/view/aggregation.rb +19 -16
  16. data/lib/mongo/collection/view/change_stream.rb +56 -23
  17. data/lib/mongo/collection/view/explainable.rb +1 -1
  18. data/lib/mongo/collection/view/iterable.rb +2 -18
  19. data/lib/mongo/collection/view/map_reduce.rb +18 -9
  20. data/lib/mongo/collection/view/readable.rb +19 -23
  21. data/lib/mongo/collection/view/writable.rb +133 -40
  22. data/lib/mongo/collection/view.rb +0 -1
  23. data/lib/mongo/collection.rb +108 -48
  24. data/lib/mongo/config/options.rb +62 -0
  25. data/lib/mongo/config/validators/option.rb +26 -0
  26. data/lib/mongo/config.rb +31 -0
  27. data/lib/mongo/crypt/auto_encrypter.rb +79 -6
  28. data/lib/mongo/crypt/binding.rb +395 -143
  29. data/lib/mongo/crypt/context.rb +5 -2
  30. data/lib/mongo/crypt/data_key_context.rb +7 -104
  31. data/lib/mongo/crypt/encryption_io.rb +28 -60
  32. data/lib/mongo/crypt/explicit_encrypter.rb +27 -25
  33. data/lib/mongo/crypt/explicit_encryption_context.rb +31 -3
  34. data/lib/mongo/crypt/handle.rb +102 -79
  35. data/lib/mongo/crypt/hooks.rb +25 -2
  36. data/lib/mongo/crypt/kms/aws.rb +128 -0
  37. data/lib/mongo/crypt/kms/azure.rb +136 -0
  38. data/lib/mongo/crypt/kms/credentials.rb +81 -0
  39. data/lib/mongo/crypt/kms/gcp.rb +182 -0
  40. data/lib/mongo/crypt/kms/kmip.rb +110 -0
  41. data/lib/mongo/crypt/kms/local.rb +74 -0
  42. data/lib/mongo/crypt/kms/master_key_document.rb +65 -0
  43. data/lib/mongo/crypt/kms.rb +117 -0
  44. data/lib/mongo/crypt.rb +1 -0
  45. data/lib/mongo/cursor/kill_spec.rb +27 -6
  46. data/lib/mongo/cursor.rb +21 -16
  47. data/lib/mongo/database/view.rb +6 -3
  48. data/lib/mongo/database.rb +73 -12
  49. data/lib/mongo/dbref.rb +1 -105
  50. data/lib/mongo/error/bulk_write_error.rb +31 -4
  51. data/lib/mongo/error/invalid_config_option.rb +20 -0
  52. data/lib/mongo/error/invalid_replacement_document.rb +27 -9
  53. data/lib/mongo/error/invalid_update_document.rb +27 -7
  54. data/lib/mongo/error/labelable.rb +72 -0
  55. data/lib/mongo/error/missing_connection.rb +25 -0
  56. data/lib/mongo/error/notable.rb +7 -0
  57. data/lib/mongo/error/operation_failure.rb +34 -86
  58. data/lib/mongo/error/read_write_retryable.rb +108 -0
  59. data/lib/mongo/{operation/kill_cursors/legacy.rb → error/session_not_materialized.rb} +7 -19
  60. data/lib/mongo/error.rb +5 -37
  61. data/lib/mongo/index/view.rb +22 -7
  62. data/lib/mongo/monitoring/event/command_failed.rb +8 -2
  63. data/lib/mongo/monitoring/event/command_started.rb +1 -1
  64. data/lib/mongo/monitoring/event/command_succeeded.rb +9 -2
  65. data/lib/mongo/monitoring/publishable.rb +9 -5
  66. data/lib/mongo/operation/collections_info/result.rb +5 -2
  67. data/lib/mongo/operation/command/op_msg.rb +6 -0
  68. data/lib/mongo/operation/context.rb +24 -6
  69. data/lib/mongo/operation/count/op_msg.rb +4 -1
  70. data/lib/mongo/operation/create/op_msg.rb +16 -1
  71. data/lib/mongo/operation/create_index/op_msg.rb +2 -1
  72. data/lib/mongo/operation/delete/op_msg.rb +1 -0
  73. data/lib/mongo/operation/delete.rb +0 -1
  74. data/lib/mongo/operation/drop_index/op_msg.rb +5 -1
  75. data/lib/mongo/operation/get_more/command_builder.rb +5 -1
  76. data/lib/mongo/operation/insert/bulk_result.rb +5 -1
  77. data/lib/mongo/operation/insert/command.rb +0 -4
  78. data/lib/mongo/operation/insert/op_msg.rb +6 -3
  79. data/lib/mongo/operation/insert/result.rb +6 -3
  80. data/lib/mongo/operation/insert.rb +0 -1
  81. data/lib/mongo/operation/kill_cursors.rb +0 -1
  82. data/lib/mongo/operation/list_collections/op_msg.rb +4 -1
  83. data/lib/mongo/operation/map_reduce/result.rb +16 -0
  84. data/lib/mongo/operation/result.rb +21 -5
  85. data/lib/mongo/operation/shared/executable.rb +21 -6
  86. data/lib/mongo/operation/shared/polymorphic_operation.rb +15 -3
  87. data/lib/mongo/operation/shared/response_handling.rb +6 -5
  88. data/lib/mongo/operation/shared/sessions_supported.rb +3 -7
  89. data/lib/mongo/operation/shared/write.rb +18 -12
  90. data/lib/mongo/operation/update/op_msg.rb +2 -1
  91. data/lib/mongo/operation/update.rb +0 -1
  92. data/lib/mongo/protocol/caching_hash.rb +69 -0
  93. data/lib/mongo/protocol/msg.rb +37 -1
  94. data/lib/mongo/protocol.rb +1 -0
  95. data/lib/mongo/query_cache.rb +15 -0
  96. data/lib/mongo/retryable.rb +78 -30
  97. data/lib/mongo/server/connection.rb +33 -0
  98. data/lib/mongo/server/connection_base.rb +2 -0
  99. data/lib/mongo/server/connection_common.rb +4 -1
  100. data/lib/mongo/server/connection_pool.rb +69 -42
  101. data/lib/mongo/server/description/features.rb +3 -1
  102. data/lib/mongo/server/description.rb +7 -2
  103. data/lib/mongo/server/monitor/connection.rb +5 -10
  104. data/lib/mongo/server/monitor.rb +21 -13
  105. data/lib/mongo/server/push_monitor.rb +9 -3
  106. data/lib/mongo/server.rb +9 -5
  107. data/lib/mongo/session/session_pool.rb +8 -0
  108. data/lib/mongo/session.rb +111 -35
  109. data/lib/mongo/socket/ocsp_verifier.rb +4 -5
  110. data/lib/mongo/socket/tcp.rb +3 -0
  111. data/lib/mongo/srv/resolver.rb +24 -3
  112. data/lib/mongo/uri/options_mapper.rb +2 -0
  113. data/lib/mongo/uri/srv_protocol.rb +1 -1
  114. data/lib/mongo/uri.rb +20 -0
  115. data/lib/mongo/version.rb +1 -1
  116. data/lib/mongo.rb +20 -0
  117. data/mongo.gemspec +10 -4
  118. data/spec/README.md +5 -5
  119. data/spec/integration/aws_lambda_examples_spec.rb +68 -0
  120. data/spec/integration/bulk_write_error_message_spec.rb +32 -0
  121. data/spec/integration/bulk_write_spec.rb +0 -16
  122. data/spec/integration/change_stream_spec.rb +6 -5
  123. data/spec/integration/client_construction_spec.rb +1 -1
  124. data/spec/integration/client_side_encryption/auto_encryption_bulk_writes_spec.rb +9 -9
  125. data/spec/integration/client_side_encryption/auto_encryption_command_monitoring_spec.rb +18 -19
  126. data/spec/integration/client_side_encryption/auto_encryption_mongocryptd_spawn_spec.rb +0 -1
  127. data/spec/integration/client_side_encryption/auto_encryption_reconnect_spec.rb +31 -0
  128. data/spec/integration/client_side_encryption/auto_encryption_spec.rb +108 -1
  129. data/spec/integration/client_side_encryption/bson_size_limit_spec.rb +2 -2
  130. data/spec/integration/client_side_encryption/bypass_mongocryptd_spawn_spec.rb +2 -2
  131. data/spec/integration/client_side_encryption/client_close_spec.rb +1 -1
  132. data/spec/integration/client_side_encryption/corpus_spec.rb +64 -35
  133. data/spec/integration/client_side_encryption/custom_endpoint_spec.rb +39 -42
  134. data/spec/integration/client_side_encryption/data_key_spec.rb +97 -7
  135. data/spec/integration/client_side_encryption/explicit_encryption_spec.rb +59 -0
  136. data/spec/integration/client_side_encryption/explicit_queryable_encryption_spec.rb +147 -0
  137. data/spec/integration/client_side_encryption/external_key_vault_spec.rb +6 -6
  138. data/spec/integration/client_side_encryption/kms_tls_options_spec.rb +394 -0
  139. data/spec/integration/client_side_encryption/kms_tls_spec.rb +92 -0
  140. data/spec/integration/client_side_encryption/queryable_encryption_examples_spec.rb +111 -0
  141. data/spec/integration/client_side_encryption/views_spec.rb +1 -1
  142. data/spec/integration/client_update_spec.rb +2 -2
  143. data/spec/integration/crud_spec.rb +12 -0
  144. data/spec/integration/cursor_pinning_spec.rb +3 -3
  145. data/spec/integration/fork_reconnect_spec.rb +15 -8
  146. data/spec/integration/grid_fs_bucket_spec.rb +3 -3
  147. data/spec/integration/ocsp_verifier_spec.rb +1 -0
  148. data/spec/integration/query_cache_spec.rb +34 -30
  149. data/spec/integration/retryable_writes/retryable_writes_36_and_older_spec.rb +1 -1
  150. data/spec/integration/sdam_events_spec.rb +0 -40
  151. data/spec/integration/server_monitor_spec.rb +2 -1
  152. data/spec/integration/size_limit_spec.rb +4 -1
  153. data/spec/integration/snapshot_query_examples_spec.rb +127 -0
  154. data/spec/integration/srv_monitoring_spec.rb +37 -0
  155. data/spec/integration/step_down_spec.rb +20 -4
  156. data/spec/integration/transaction_pinning_spec.rb +2 -2
  157. data/spec/integration/versioned_api_examples_spec.rb +37 -31
  158. data/spec/lite_spec_helper.rb +14 -5
  159. data/spec/mongo/address/ipv6_spec.rb +7 -0
  160. data/spec/mongo/address_spec.rb +7 -0
  161. data/spec/mongo/auth/scram/conversation_spec.rb +23 -23
  162. data/spec/mongo/auth/scram256/conversation_spec.rb +20 -20
  163. data/spec/mongo/auth/scram_negotiation_spec.rb +1 -0
  164. data/spec/mongo/bulk_write/result_spec.rb +15 -1
  165. data/spec/mongo/bulk_write_spec.rb +128 -20
  166. data/spec/mongo/client_construction_spec.rb +141 -7
  167. data/spec/mongo/client_encryption_spec.rb +11 -11
  168. data/spec/mongo/client_spec.rb +297 -1
  169. data/spec/mongo/cluster/cursor_reaper_spec.rb +21 -3
  170. data/spec/mongo/cluster_spec.rb +0 -44
  171. data/spec/mongo/collection/view/aggregation_spec.rb +2 -2
  172. data/spec/mongo/collection/view/change_stream_spec.rb +2 -2
  173. data/spec/mongo/collection/view/readable_spec.rb +35 -56
  174. data/spec/mongo/collection/view/writable_spec.rb +144 -32
  175. data/spec/mongo/collection_crud_spec.rb +63 -13
  176. data/spec/mongo/config/options_spec.rb +75 -0
  177. data/spec/mongo/config_spec.rb +73 -0
  178. data/spec/mongo/crypt/auto_decryption_context_spec.rb +17 -1
  179. data/spec/mongo/crypt/auto_encrypter_spec.rb +106 -0
  180. data/spec/mongo/crypt/auto_encryption_context_spec.rb +17 -1
  181. data/spec/mongo/crypt/binding/context_spec.rb +99 -17
  182. data/spec/mongo/crypt/binding/mongocrypt_spec.rb +17 -46
  183. data/spec/mongo/crypt/binding/version_spec.rb +25 -0
  184. data/spec/mongo/crypt/binding_unloaded_spec.rb +14 -0
  185. data/spec/mongo/crypt/data_key_context_spec.rb +42 -114
  186. data/spec/mongo/crypt/encryption_io_spec.rb +2 -0
  187. data/spec/mongo/crypt/explicit_decryption_context_spec.rb +32 -1
  188. data/spec/mongo/crypt/explicit_encryption_context_spec.rb +89 -1
  189. data/spec/mongo/crypt/handle_spec.rb +47 -169
  190. data/spec/mongo/crypt/hooks_spec.rb +30 -0
  191. data/spec/mongo/crypt/kms/credentials_spec.rb +404 -0
  192. data/spec/mongo/crypt/kms_spec.rb +59 -0
  193. data/spec/mongo/cursor_spec.rb +37 -51
  194. data/spec/mongo/database_spec.rb +66 -1
  195. data/spec/mongo/error/operation_failure_heavy_spec.rb +49 -0
  196. data/spec/mongo/index/view_spec.rb +69 -0
  197. data/spec/mongo/operation/create/op_msg_spec.rb +286 -0
  198. data/spec/mongo/operation/delete/op_msg_spec.rb +13 -4
  199. data/spec/mongo/operation/delete_spec.rb +0 -30
  200. data/spec/mongo/operation/insert/op_msg_spec.rb +18 -10
  201. data/spec/mongo/operation/insert_spec.rb +0 -32
  202. data/spec/mongo/operation/result_spec.rb +20 -0
  203. data/spec/mongo/operation/update/op_msg_spec.rb +13 -4
  204. data/spec/mongo/operation/update_spec.rb +0 -29
  205. data/spec/mongo/protocol/caching_hash_spec.rb +82 -0
  206. data/spec/mongo/protocol/msg_spec.rb +41 -0
  207. data/spec/mongo/query_cache_spec.rb +1 -0
  208. data/spec/mongo/retryable_spec.rb +32 -3
  209. data/spec/mongo/server/connection_auth_spec.rb +3 -1
  210. data/spec/mongo/server/connection_common_spec.rb +13 -1
  211. data/spec/mongo/server/connection_pool_spec.rb +94 -49
  212. data/spec/mongo/server/connection_spec.rb +50 -159
  213. data/spec/mongo/server/description/features_spec.rb +24 -0
  214. data/spec/mongo/server/push_monitor_spec.rb +2 -8
  215. data/spec/mongo/session_spec.rb +26 -6
  216. data/spec/mongo/session_transaction_spec.rb +2 -1
  217. data/spec/mongo/socket/ssl_spec.rb +15 -4
  218. data/spec/mongo/uri/srv_protocol_spec.rb +101 -2
  219. data/spec/mongo/uri_spec.rb +25 -0
  220. data/spec/runners/connection_string.rb +8 -0
  221. data/spec/runners/crud/operation.rb +12 -3
  222. data/spec/runners/crud/requirement.rb +3 -3
  223. data/spec/runners/crud/spec.rb +5 -0
  224. data/spec/runners/crud/verifier.rb +6 -0
  225. data/spec/runners/transactions/test.rb +33 -14
  226. data/spec/runners/transactions.rb +9 -6
  227. data/spec/runners/unified/assertions.rb +59 -10
  228. data/spec/runners/unified/change_stream_operations.rb +9 -0
  229. data/spec/runners/unified/crud_operations.rb +50 -2
  230. data/spec/runners/unified/ddl_operations.rb +20 -0
  231. data/spec/runners/unified/error.rb +2 -1
  232. data/spec/runners/unified/support_operations.rb +5 -2
  233. data/spec/runners/unified/test.rb +19 -4
  234. data/spec/runners/unified.rb +9 -2
  235. data/spec/shared/lib/mrss/constraints.rb +10 -17
  236. data/spec/shared/lib/mrss/docker_runner.rb +21 -3
  237. data/spec/shared/lib/mrss/lite_constraints.rb +32 -1
  238. data/spec/shared/lib/mrss/session_registry.rb +69 -0
  239. data/spec/shared/lib/mrss/session_registry_legacy.rb +60 -0
  240. data/spec/shared/share/Dockerfile.erb +56 -54
  241. data/spec/shared/shlib/config.sh +27 -0
  242. data/spec/shared/shlib/distro.sh +2 -1
  243. data/spec/shared/shlib/server.sh +46 -21
  244. data/spec/shared/shlib/set_env.sh +40 -5
  245. data/spec/spec_helper.rb +0 -1
  246. data/spec/spec_tests/crud_spec.rb +0 -10
  247. data/spec/spec_tests/data/change_streams_unified/change-streams-errors.yml +124 -0
  248. data/spec/spec_tests/data/change_streams_unified/change-streams-pre_and_post_images.yml +351 -0
  249. data/spec/spec_tests/data/change_streams_unified/change-streams-resume-allowlist.yml +1171 -0
  250. data/spec/spec_tests/data/change_streams_unified/change-streams-resume-errorLabels.yml +1068 -0
  251. data/spec/spec_tests/data/change_streams_unified/change-streams.yml +859 -4
  252. data/spec/spec_tests/data/client_side_encryption/aggregate.yml +3 -17
  253. data/spec/spec_tests/data/client_side_encryption/azureKMS.yml +46 -0
  254. data/spec/spec_tests/data/client_side_encryption/badQueries.yml +12 -2
  255. data/spec/spec_tests/data/client_side_encryption/basic.yml +3 -17
  256. data/spec/spec_tests/data/client_side_encryption/bulk.yml +1 -8
  257. data/spec/spec_tests/data/client_side_encryption/bypassAutoEncryption.yml +2 -2
  258. data/spec/spec_tests/data/client_side_encryption/count.yml +1 -8
  259. data/spec/spec_tests/data/client_side_encryption/countDocuments.yml +1 -8
  260. data/spec/spec_tests/data/client_side_encryption/delete.yml +2 -16
  261. data/spec/spec_tests/data/client_side_encryption/distinct.yml +1 -8
  262. data/spec/spec_tests/data/client_side_encryption/explain.yml +1 -8
  263. data/spec/spec_tests/data/client_side_encryption/find.yml +2 -16
  264. data/spec/spec_tests/data/client_side_encryption/findOneAndDelete.yml +1 -8
  265. data/spec/spec_tests/data/client_side_encryption/findOneAndReplace.yml +1 -8
  266. data/spec/spec_tests/data/client_side_encryption/findOneAndUpdate.yml +1 -8
  267. data/spec/spec_tests/data/client_side_encryption/fle2-BypassQueryAnalysis.yml +101 -0
  268. data/spec/spec_tests/data/client_side_encryption/fle2-Compact.yml +80 -0
  269. data/spec/spec_tests/data/client_side_encryption/fle2-CreateCollection.yml +1263 -0
  270. data/spec/spec_tests/data/client_side_encryption/fle2-DecryptExistingData.yml +64 -0
  271. data/spec/spec_tests/data/client_side_encryption/fle2-Delete.yml +107 -0
  272. data/spec/spec_tests/data/client_side_encryption/fle2-EncryptedFields-vs-EncryptedFieldsMap.yml +80 -0
  273. data/spec/spec_tests/data/client_side_encryption/fle2-EncryptedFields-vs-jsonSchema.yml +90 -0
  274. data/spec/spec_tests/data/client_side_encryption/fle2-EncryptedFieldsMap-defaults.yml +57 -0
  275. data/spec/spec_tests/data/client_side_encryption/fle2-FindOneAndUpdate.yml +213 -0
  276. data/spec/spec_tests/data/client_side_encryption/fle2-InsertFind-Indexed.yml +86 -0
  277. data/spec/spec_tests/data/client_side_encryption/fle2-InsertFind-Unindexed.yml +83 -0
  278. data/spec/spec_tests/data/client_side_encryption/fle2-MissingKey.yml +41 -0
  279. data/spec/spec_tests/data/client_side_encryption/fle2-NoEncryption.yml +42 -0
  280. data/spec/spec_tests/data/client_side_encryption/fle2-Update.yml +221 -0
  281. data/spec/spec_tests/data/client_side_encryption/fle2-validatorAndPartialFieldExpression.yml +168 -0
  282. data/spec/spec_tests/data/client_side_encryption/gcpKMS.yml +46 -0
  283. data/spec/spec_tests/data/client_side_encryption/getMore.yml +1 -8
  284. data/spec/spec_tests/data/client_side_encryption/insert.yml +2 -16
  285. data/spec/spec_tests/data/client_side_encryption/keyAltName.yml +1 -8
  286. data/spec/spec_tests/data/client_side_encryption/localKMS.yml +1 -8
  287. data/spec/spec_tests/data/client_side_encryption/localSchema.yml +1 -8
  288. data/spec/spec_tests/data/client_side_encryption/maxWireVersion.yml +2 -0
  289. data/spec/spec_tests/data/client_side_encryption/missingKey.yml +2 -9
  290. data/spec/spec_tests/data/client_side_encryption/noSchema.yml +39 -0
  291. data/spec/spec_tests/data/client_side_encryption/replaceOne.yml +1 -8
  292. data/spec/spec_tests/data/client_side_encryption/types.yml +44 -70
  293. data/spec/spec_tests/data/client_side_encryption/updateMany.yml +1 -8
  294. data/spec/spec_tests/data/client_side_encryption/updateOne.yml +1 -8
  295. data/spec/spec_tests/data/collection_management/clustered-indexes.yml +135 -0
  296. data/spec/spec_tests/data/collection_management/createCollection-pre_and_post_images.yml +50 -0
  297. data/spec/spec_tests/data/collection_management/modifyCollection-pre_and_post_images.yml +58 -0
  298. data/spec/spec_tests/data/command_monitoring_unified/pre-42-server-connection-id.yml +56 -0
  299. data/spec/spec_tests/data/command_monitoring_unified/server-connection-id.yml +56 -0
  300. data/spec/spec_tests/data/crud/read/aggregate-collation.yml +1 -1
  301. data/spec/spec_tests/data/crud/read/count-collation.yml +1 -1
  302. data/spec/spec_tests/data/crud/read/distinct-collation.yml +1 -1
  303. data/spec/spec_tests/data/crud/read/find-collation.yml +1 -1
  304. data/spec/spec_tests/data/crud/write/bulkWrite-collation.yml +1 -1
  305. data/spec/spec_tests/data/crud/write/deleteMany-collation.yml +1 -1
  306. data/spec/spec_tests/data/crud/write/deleteOne-collation.yml +1 -1
  307. data/spec/spec_tests/data/crud/write/findOneAndDelete-collation.yml +1 -1
  308. data/spec/spec_tests/data/crud/write/findOneAndReplace-collation.yml +1 -1
  309. data/spec/spec_tests/data/crud/write/findOneAndUpdate-collation.yml +1 -1
  310. data/spec/spec_tests/data/crud/write/replaceOne-collation.yml +1 -1
  311. data/spec/spec_tests/data/crud/write/updateMany-collation.yml +1 -1
  312. data/spec/spec_tests/data/crud/write/updateOne-collation.yml +1 -1
  313. data/spec/spec_tests/data/crud_unified/aggregate-allowdiskuse.yml +75 -0
  314. data/spec/spec_tests/data/crud_unified/aggregate-merge.yml +185 -0
  315. data/spec/spec_tests/data/crud_unified/aggregate-out-readConcern.yml +171 -0
  316. data/spec/spec_tests/data/crud_unified/aggregate.yml +215 -0
  317. data/spec/spec_tests/data/crud_unified/bulkWrite-arrayFilters-clientError.yml +98 -0
  318. data/spec/spec_tests/data/crud_unified/bulkWrite-arrayFilters.yml +174 -0
  319. data/spec/spec_tests/data/crud_unified/bulkWrite-comment.yml +189 -0
  320. data/spec/spec_tests/data/crud_unified/bulkWrite-delete-hint-clientError.yml +113 -0
  321. data/spec/spec_tests/data/crud_unified/bulkWrite-delete-hint-serverError.yml +142 -0
  322. data/spec/spec_tests/data/crud_unified/bulkWrite-delete-hint.yml +154 -0
  323. data/spec/spec_tests/data/crud_unified/bulkWrite-deleteMany-hint-unacknowledged.yml +98 -0
  324. data/spec/spec_tests/data/crud_unified/bulkWrite-deleteMany-let.yml +86 -0
  325. data/spec/spec_tests/data/crud_unified/bulkWrite-deleteOne-hint-unacknowledged.yml +97 -0
  326. data/spec/spec_tests/data/crud_unified/bulkWrite-deleteOne-let.yml +86 -0
  327. data/spec/spec_tests/data/crud_unified/bulkWrite-insertOne-dots_and_dollars.yml +138 -0
  328. data/spec/spec_tests/data/crud_unified/bulkWrite-replaceOne-dots_and_dollars.yml +165 -0
  329. data/spec/spec_tests/data/crud_unified/bulkWrite-replaceOne-hint-unacknowledged.yml +103 -0
  330. data/spec/spec_tests/data/crud_unified/bulkWrite-replaceOne-let.yml +93 -0
  331. data/spec/spec_tests/data/crud_unified/bulkWrite-update-hint-clientError.yml +148 -0
  332. data/spec/spec_tests/data/crud_unified/bulkWrite-update-hint-serverError.yml +239 -0
  333. data/spec/spec_tests/data/crud_unified/bulkWrite-update-hint.yml +256 -0
  334. data/spec/spec_tests/data/crud_unified/bulkWrite-update-validation.yml +73 -0
  335. data/spec/spec_tests/data/crud_unified/bulkWrite-updateMany-dots_and_dollars.yml +150 -0
  336. data/spec/spec_tests/data/crud_unified/bulkWrite-updateMany-hint-unacknowledged.yml +104 -0
  337. data/spec/spec_tests/data/crud_unified/bulkWrite-updateMany-let.yml +96 -0
  338. data/spec/spec_tests/data/crud_unified/bulkWrite-updateOne-dots_and_dollars.yml +150 -0
  339. data/spec/spec_tests/data/crud_unified/bulkWrite-updateOne-hint-unacknowledged.yml +103 -0
  340. data/spec/spec_tests/data/crud_unified/bulkWrite-updateOne-let.yml +95 -0
  341. data/spec/spec_tests/data/crud_unified/countDocuments-comment.yml +92 -0
  342. data/spec/spec_tests/data/crud_unified/db-aggregate.yml +73 -0
  343. data/spec/spec_tests/data/crud_unified/deleteMany-comment.yml +97 -0
  344. data/spec/spec_tests/data/crud_unified/deleteMany-hint-clientError.yml +87 -0
  345. data/spec/spec_tests/data/crud_unified/deleteMany-hint-serverError.yml +107 -0
  346. data/spec/spec_tests/data/crud_unified/deleteMany-hint-unacknowledged.yml +90 -0
  347. data/spec/spec_tests/data/crud_unified/deleteMany-hint.yml +99 -0
  348. data/spec/spec_tests/data/crud_unified/deleteMany-let.yml +2 -0
  349. data/spec/spec_tests/data/crud_unified/deleteOne-comment.yml +98 -0
  350. data/spec/spec_tests/data/crud_unified/deleteOne-hint-clientError.yml +80 -0
  351. data/spec/spec_tests/data/crud_unified/deleteOne-hint-serverError.yml +100 -0
  352. data/spec/spec_tests/data/crud_unified/deleteOne-hint-unacknowledged.yml +89 -0
  353. data/spec/spec_tests/data/crud_unified/deleteOne-hint.yml +95 -0
  354. data/spec/spec_tests/data/crud_unified/deleteOne-let.yml +2 -0
  355. data/spec/spec_tests/data/crud_unified/estimatedDocumentCount-comment.yml +95 -0
  356. data/spec/spec_tests/data/crud_unified/estimatedDocumentCount.yml +5 -135
  357. data/spec/spec_tests/data/crud_unified/find-allowdiskuse-clientError.yml +55 -0
  358. data/spec/spec_tests/data/crud_unified/find-allowdiskuse-serverError.yml +68 -0
  359. data/spec/spec_tests/data/crud_unified/find-allowdiskuse.yml +79 -0
  360. data/spec/spec_tests/data/crud_unified/find-comment.yml +166 -0
  361. data/spec/spec_tests/data/crud_unified/find.yml +68 -0
  362. data/spec/spec_tests/data/crud_unified/findOneAndDelete-comment.yml +96 -0
  363. data/spec/spec_tests/data/crud_unified/findOneAndDelete-hint-clientError.yml +91 -0
  364. data/spec/spec_tests/data/crud_unified/findOneAndDelete-hint-serverError.yml +107 -0
  365. data/spec/spec_tests/data/crud_unified/findOneAndDelete-hint-unacknowledged.yml +88 -0
  366. data/spec/spec_tests/data/crud_unified/findOneAndDelete-hint.yml +102 -0
  367. data/spec/spec_tests/data/crud_unified/findOneAndDelete-let.yml +2 -4
  368. data/spec/spec_tests/data/crud_unified/findOneAndReplace-comment.yml +101 -0
  369. data/spec/spec_tests/data/crud_unified/findOneAndReplace-dots_and_dollars.yml +140 -0
  370. data/spec/spec_tests/data/crud_unified/findOneAndReplace-hint-clientError.yml +83 -0
  371. data/spec/spec_tests/data/crud_unified/findOneAndReplace-hint-serverError.yml +99 -0
  372. data/spec/spec_tests/data/crud_unified/findOneAndReplace-hint-unacknowledged.yml +96 -0
  373. data/spec/spec_tests/data/crud_unified/findOneAndReplace-hint.yml +98 -0
  374. data/spec/spec_tests/data/crud_unified/findOneAndUpdate-comment.yml +95 -0
  375. data/spec/spec_tests/data/crud_unified/findOneAndUpdate-dots_and_dollars.yml +127 -0
  376. data/spec/spec_tests/data/crud_unified/findOneAndUpdate-hint-clientError.yml +84 -0
  377. data/spec/spec_tests/data/crud_unified/findOneAndUpdate-hint-serverError.yml +100 -0
  378. data/spec/spec_tests/data/crud_unified/findOneAndUpdate-hint-unacknowledged.yml +92 -0
  379. data/spec/spec_tests/data/crud_unified/findOneAndUpdate-hint.yml +99 -0
  380. data/spec/spec_tests/data/crud_unified/insertMany-comment.yml +93 -0
  381. data/spec/spec_tests/data/crud_unified/insertMany-dots_and_dollars.yml +128 -0
  382. data/spec/spec_tests/data/crud_unified/insertOne-comment.yml +91 -0
  383. data/spec/spec_tests/data/crud_unified/insertOne-dots_and_dollars.yml +238 -0
  384. data/spec/spec_tests/data/crud_unified/replaceOne-comment.yml +105 -0
  385. data/spec/spec_tests/data/crud_unified/replaceOne-dots_and_dollars.yml +180 -0
  386. data/spec/spec_tests/data/crud_unified/replaceOne-hint-unacknowledged.yml +95 -0
  387. data/spec/spec_tests/data/crud_unified/replaceOne-hint.yml +108 -0
  388. data/spec/spec_tests/data/crud_unified/replaceOne-let.yml +98 -0
  389. data/spec/spec_tests/data/crud_unified/replaceOne-validation.yml +37 -0
  390. data/spec/spec_tests/data/crud_unified/updateMany-comment.yml +104 -0
  391. data/spec/spec_tests/data/crud_unified/updateMany-dots_and_dollars.yml +138 -0
  392. data/spec/spec_tests/data/crud_unified/updateMany-hint-clientError.yml +91 -0
  393. data/spec/spec_tests/data/crud_unified/updateMany-hint-serverError.yml +115 -0
  394. data/spec/spec_tests/data/crud_unified/updateMany-hint-unacknowledged.yml +96 -0
  395. data/spec/spec_tests/data/crud_unified/updateMany-hint.yml +115 -0
  396. data/spec/spec_tests/data/crud_unified/updateMany-let.yml +5 -1
  397. data/spec/spec_tests/data/crud_unified/updateMany-validation.yml +39 -0
  398. data/spec/spec_tests/data/crud_unified/updateOne-comment.yml +104 -0
  399. data/spec/spec_tests/data/crud_unified/updateOne-dots_and_dollars.yml +138 -0
  400. data/spec/spec_tests/data/crud_unified/updateOne-hint-clientError.yml +85 -0
  401. data/spec/spec_tests/data/crud_unified/updateOne-hint-serverError.yml +109 -0
  402. data/spec/spec_tests/data/crud_unified/updateOne-hint-unacknowledged.yml +95 -0
  403. data/spec/spec_tests/data/crud_unified/updateOne-hint.yml +109 -0
  404. data/spec/spec_tests/data/crud_unified/updateOne-let.yml +5 -1
  405. data/spec/spec_tests/data/crud_unified/updateOne-validation.yml +37 -0
  406. data/spec/spec_tests/data/crud_unified/updateWithPipelines.yml +8 -14
  407. data/spec/spec_tests/data/retryable_reads/{estimatedDocumentCount-serverErrors-pre4.9.yml → legacy/estimatedDocumentCount-serverErrors.yml} +0 -2
  408. data/spec/spec_tests/data/retryable_reads/{estimatedDocumentCount-pre4.9.yml → legacy/estimatedDocumentCount.yml} +0 -2
  409. data/spec/spec_tests/data/retryable_reads/unified/handshakeError.yml +129 -0
  410. data/spec/spec_tests/data/retryable_writes/{bulkWrite-serverErrors.yml → legacy/bulkWrite-serverErrors.yml} +1 -1
  411. data/spec/spec_tests/data/retryable_writes/{deleteOne-serverErrors.yml → legacy/deleteOne-serverErrors.yml} +1 -1
  412. data/spec/spec_tests/data/retryable_writes/{findOneAndDelete-serverErrors.yml → legacy/findOneAndDelete-serverErrors.yml} +1 -1
  413. data/spec/spec_tests/data/retryable_writes/{findOneAndReplace-serverErrors.yml → legacy/findOneAndReplace-serverErrors.yml} +1 -1
  414. data/spec/spec_tests/data/retryable_writes/{findOneAndUpdate-serverErrors.yml → legacy/findOneAndUpdate-serverErrors.yml} +1 -1
  415. data/spec/spec_tests/data/retryable_writes/{insertMany-serverErrors.yml → legacy/insertMany-serverErrors.yml} +1 -1
  416. data/spec/spec_tests/data/retryable_writes/{insertOne-serverErrors.yml → legacy/insertOne-serverErrors.yml} +5 -5
  417. data/spec/spec_tests/data/retryable_writes/{replaceOne-serverErrors.yml → legacy/replaceOne-serverErrors.yml} +1 -1
  418. data/spec/spec_tests/data/retryable_writes/{updateOne-serverErrors.yml → legacy/updateOne-serverErrors.yml} +1 -1
  419. data/spec/spec_tests/data/retryable_writes/unified/bulkWrite-serverErrors.yml +96 -0
  420. data/spec/spec_tests/data/retryable_writes/unified/handshakeError.yml +137 -0
  421. data/spec/spec_tests/data/retryable_writes/unified/insertOne-serverErrors.yml +78 -0
  422. data/spec/spec_tests/data/sdam/errors/prefer-error-code.yml +2 -2
  423. data/spec/spec_tests/data/seed_list_discovery/load-balanced/loadBalanced-no-results.yml +5 -0
  424. data/spec/spec_tests/data/seed_list_discovery/load-balanced/srvMaxHosts-conflicts_with_loadBalanced-true-txt.yml +5 -0
  425. data/spec/spec_tests/data/seed_list_discovery/load-balanced/srvMaxHosts-conflicts_with_loadBalanced-true.yml +5 -0
  426. data/spec/spec_tests/data/seed_list_discovery/load-balanced/srvMaxHosts-zero-txt.yml +10 -0
  427. data/spec/spec_tests/data/seed_list_discovery/load-balanced/srvMaxHosts-zero.yml +10 -0
  428. data/spec/spec_tests/data/seed_list_discovery/replica-set/srv-service-name.yml +11 -0
  429. data/spec/spec_tests/data/seed_list_discovery/replica-set/srvMaxHosts-conflicts_with_replicaSet-txt.yml +5 -0
  430. data/spec/spec_tests/data/seed_list_discovery/replica-set/srvMaxHosts-conflicts_with_replicaSet.yml +5 -0
  431. data/spec/spec_tests/data/seed_list_discovery/replica-set/srvMaxHosts-equal_to_srv_records.yml +16 -0
  432. data/spec/spec_tests/data/seed_list_discovery/replica-set/srvMaxHosts-greater_than_srv_records.yml +15 -0
  433. data/spec/spec_tests/data/seed_list_discovery/replica-set/srvMaxHosts-less_than_srv_records.yml +15 -0
  434. data/spec/spec_tests/data/seed_list_discovery/replica-set/srvMaxHosts-zero-txt.yml +15 -0
  435. data/spec/spec_tests/data/seed_list_discovery/replica-set/srvMaxHosts-zero.yml +15 -0
  436. data/spec/spec_tests/data/seed_list_discovery/sharded/srvMaxHosts-equal_to_srv_records.yml +13 -0
  437. data/spec/spec_tests/data/seed_list_discovery/sharded/srvMaxHosts-greater_than_srv_records.yml +12 -0
  438. data/spec/spec_tests/data/seed_list_discovery/sharded/srvMaxHosts-less_than_srv_records.yml +10 -0
  439. data/spec/spec_tests/data/seed_list_discovery/sharded/srvMaxHosts-zero.yml +11 -0
  440. data/spec/spec_tests/data/server_selection/Unknown/read/ghost.yml +11 -0
  441. data/spec/spec_tests/data/server_selection/Unknown/write/ghost.yml +11 -0
  442. data/spec/spec_tests/data/sessions_unified/driver-sessions-server-support.yml +123 -0
  443. data/spec/spec_tests/data/sessions_unified/snapshot-sessions-not-supported-client-error.yml +9 -3
  444. data/spec/spec_tests/data/transactions/error-labels.yml +1 -1
  445. data/spec/spec_tests/data/transactions/errors-client.yml +8 -9
  446. data/spec/spec_tests/data/transactions/mongos-recovery-token.yml +1 -1
  447. data/spec/spec_tests/data/transactions/retryable-abort-errorLabels.yml +0 -2
  448. data/spec/spec_tests/data/transactions/retryable-abort.yml +7 -9
  449. data/spec/spec_tests/data/transactions/retryable-commit-errorLabels.yml +0 -2
  450. data/spec/spec_tests/data/transactions/retryable-commit.yml +7 -9
  451. data/spec/spec_tests/data/transactions/retryable-writes.yml +0 -2
  452. data/spec/spec_tests/data/unified/invalid/expectedEventsForClient-ignoreExtraEvents-type.yml +15 -0
  453. data/spec/spec_tests/data/unified/valid-fail/operation-unsupported.yml +13 -0
  454. data/spec/spec_tests/data/unified/valid-pass/expectedEventsForClient-ignoreExtraEvents.yml +78 -0
  455. data/spec/spec_tests/data/unified/valid-pass/poc-change-streams.yml +4 -1
  456. data/spec/spec_tests/data/unified/valid-pass/poc-command-monitoring.yml +3 -3
  457. data/spec/spec_tests/data/unified/valid-pass/poc-transactions.yml +3 -2
  458. data/spec/spec_tests/data/uri_options/srv-options.yml +96 -0
  459. data/spec/spec_tests/data/versioned_api/crud-api-version-1-strict.yml +6 -4
  460. data/spec/spec_tests/data/versioned_api/crud-api-version-1.yml +7 -5
  461. data/spec/spec_tests/retryable_reads_spec.rb +4 -1
  462. data/spec/spec_tests/retryable_reads_unified_spec.rb +22 -0
  463. data/spec/spec_tests/retryable_writes_spec.rb +4 -1
  464. data/spec/spec_tests/retryable_writes_unified_spec.rb +21 -0
  465. data/spec/spec_tests/seed_list_discovery_spec.rb +10 -1
  466. data/spec/spec_tests/unified_spec.rb +6 -1
  467. data/spec/stress/connection_pool_timing_spec.rb +2 -1
  468. data/spec/stress/fork_reconnect_stress_spec.rb +3 -2
  469. data/spec/support/authorization.rb +1 -1
  470. data/spec/support/certificates/atlas-ocsp-ca.crt +47 -40
  471. data/spec/support/certificates/atlas-ocsp.crt +106 -101
  472. data/spec/support/cluster_tools.rb +1 -1
  473. data/spec/support/common_shortcuts.rb +22 -0
  474. data/spec/support/crypt/corpus/corpus-encrypted.json +9515 -0
  475. data/spec/support/crypt/corpus/corpus-key-aws.json +32 -32
  476. data/spec/support/crypt/corpus/corpus-key-azure.json +33 -0
  477. data/spec/support/crypt/corpus/corpus-key-gcp.json +35 -0
  478. data/spec/support/crypt/corpus/corpus-key-kmip.json +32 -0
  479. data/spec/support/crypt/corpus/corpus-key-local.json +30 -30
  480. data/spec/support/crypt/corpus/corpus-schema.json +4399 -121
  481. data/spec/support/crypt/corpus/corpus.json +4999 -37
  482. data/spec/support/crypt/data_keys/key_document_azure.json +33 -0
  483. data/spec/support/crypt/data_keys/key_document_gcp.json +37 -0
  484. data/spec/support/crypt/data_keys/key_document_kmip.json +32 -0
  485. data/spec/support/crypt/encryptedFields.json +33 -0
  486. data/spec/support/crypt/keys/key1-document.json +30 -0
  487. data/spec/support/crypt/schema_maps/schema_map_azure.json +17 -0
  488. data/spec/support/crypt/schema_maps/schema_map_azure_key_alt_names.json +12 -0
  489. data/spec/support/crypt/schema_maps/schema_map_gcp.json +17 -0
  490. data/spec/support/crypt/schema_maps/schema_map_gcp_key_alt_names.json +12 -0
  491. data/spec/support/crypt/schema_maps/schema_map_kmip.json +17 -0
  492. data/spec/support/crypt/schema_maps/schema_map_kmip_key_alt_names.json +12 -0
  493. data/spec/support/crypt.rb +207 -6
  494. data/spec/support/macros.rb +18 -0
  495. data/spec/support/mongos_macros.rb +17 -0
  496. data/spec/support/shared/scram_conversation.rb +2 -1
  497. data/spec/support/shared/session.rb +13 -7
  498. data/spec/support/spec_config.rb +82 -1
  499. data/spec/support/utils.rb +25 -4
  500. data.tar.gz.sig +0 -0
  501. metadata +1499 -1252
  502. metadata.gz.sig +0 -0
  503. data/lib/mongo/operation/delete/legacy.rb +0 -64
  504. data/lib/mongo/operation/insert/legacy.rb +0 -68
  505. data/lib/mongo/operation/update/legacy/result.rb +0 -112
  506. data/lib/mongo/operation/update/legacy.rb +0 -76
  507. data/spec/integration/find_options_spec.rb +0 -227
  508. data/spec/mongo/dbref_spec.rb +0 -152
  509. data/spec/mongo/operation/kill_cursors_spec.rb +0 -47
  510. data/spec/spec_tests/change_streams_spec.rb +0 -93
  511. data/spec/spec_tests/data/change_streams/change-streams-errors.yml +0 -101
  512. data/spec/spec_tests/data/change_streams/change-streams-resume-allowlist.yml +0 -1173
  513. data/spec/spec_tests/data/change_streams/change-streams-resume-errorLabels.yml +0 -1105
  514. data/spec/spec_tests/data/change_streams/change-streams.yml +0 -535
  515. data/spec/spec_tests/data/crud_v2/aggregate-merge.yml +0 -103
  516. data/spec/spec_tests/data/crud_v2/aggregate-out-readConcern.yml +0 -111
  517. data/spec/spec_tests/data/crud_v2/bulkWrite-arrayFilters.yml +0 -103
  518. data/spec/spec_tests/data/crud_v2/bulkWrite-delete-hint-clientError.yml +0 -63
  519. data/spec/spec_tests/data/crud_v2/bulkWrite-delete-hint-serverError.yml +0 -92
  520. data/spec/spec_tests/data/crud_v2/bulkWrite-delete-hint.yml +0 -103
  521. data/spec/spec_tests/data/crud_v2/bulkWrite-update-hint-clientError.yml +0 -90
  522. data/spec/spec_tests/data/crud_v2/bulkWrite-update-hint-serverError.yml +0 -147
  523. data/spec/spec_tests/data/crud_v2/bulkWrite-update-hint.yml +0 -164
  524. data/spec/spec_tests/data/crud_v2/db-aggregate.yml +0 -39
  525. data/spec/spec_tests/data/crud_v2/deleteMany-hint-clientError.yml +0 -43
  526. data/spec/spec_tests/data/crud_v2/deleteMany-hint-serverError.yml +0 -62
  527. data/spec/spec_tests/data/crud_v2/deleteMany-hint.yml +0 -58
  528. data/spec/spec_tests/data/crud_v2/deleteOne-hint-clientError.yml +0 -41
  529. data/spec/spec_tests/data/crud_v2/deleteOne-hint-serverError.yml +0 -60
  530. data/spec/spec_tests/data/crud_v2/deleteOne-hint.yml +0 -57
  531. data/spec/spec_tests/data/crud_v2/find-allowdiskuse-clientError.yml +0 -28
  532. data/spec/spec_tests/data/crud_v2/find-allowdiskuse-serverError.yml +0 -44
  533. data/spec/spec_tests/data/crud_v2/find-allowdiskuse.yml +0 -50
  534. data/spec/spec_tests/data/crud_v2/findOneAndDelete-hint-clientError.yml +0 -45
  535. data/spec/spec_tests/data/crud_v2/findOneAndDelete-hint-serverError.yml +0 -60
  536. data/spec/spec_tests/data/crud_v2/findOneAndDelete-hint.yml +0 -56
  537. data/spec/spec_tests/data/crud_v2/findOneAndReplace-hint-clientError.yml +0 -40
  538. data/spec/spec_tests/data/crud_v2/findOneAndReplace-hint-serverError.yml +0 -59
  539. data/spec/spec_tests/data/crud_v2/findOneAndReplace-hint.yml +0 -55
  540. data/spec/spec_tests/data/crud_v2/findOneAndUpdate-hint-clientError.yml +0 -40
  541. data/spec/spec_tests/data/crud_v2/findOneAndUpdate-hint-serverError.yml +0 -58
  542. data/spec/spec_tests/data/crud_v2/findOneAndUpdate-hint.yml +0 -55
  543. data/spec/spec_tests/data/crud_v2/replaceOne-hint.yml +0 -61
  544. data/spec/spec_tests/data/crud_v2/unacknowledged-bulkWrite-delete-hint-clientError.yml +0 -60
  545. data/spec/spec_tests/data/crud_v2/unacknowledged-bulkWrite-update-hint-clientError.yml +0 -88
  546. data/spec/spec_tests/data/crud_v2/unacknowledged-deleteMany-hint-clientError.yml +0 -40
  547. data/spec/spec_tests/data/crud_v2/unacknowledged-deleteOne-hint-clientError.yml +0 -38
  548. data/spec/spec_tests/data/crud_v2/unacknowledged-findOneAndDelete-hint-clientError.yml +0 -42
  549. data/spec/spec_tests/data/crud_v2/unacknowledged-findOneAndReplace-hint-clientError.yml +0 -40
  550. data/spec/spec_tests/data/crud_v2/unacknowledged-findOneAndUpdate-hint-clientError.yml +0 -40
  551. data/spec/spec_tests/data/crud_v2/unacknowledged-replaceOne-hint-clientError.yml +0 -40
  552. data/spec/spec_tests/data/crud_v2/unacknowledged-updateMany-hint-clientError.yml +0 -43
  553. data/spec/spec_tests/data/crud_v2/unacknowledged-updateOne-hint-clientError.yml +0 -40
  554. data/spec/spec_tests/data/crud_v2/updateMany-hint-clientError.yml +0 -45
  555. data/spec/spec_tests/data/crud_v2/updateMany-hint-serverError.yml +0 -66
  556. data/spec/spec_tests/data/crud_v2/updateMany-hint.yml +0 -65
  557. data/spec/spec_tests/data/crud_v2/updateOne-hint-clientError.yml +0 -43
  558. data/spec/spec_tests/data/crud_v2/updateOne-hint-serverError.yml +0 -62
  559. data/spec/spec_tests/data/crud_v2/updateOne-hint.yml +0 -61
  560. data/spec/spec_tests/data/crud_v2/updateWithPipelines.yml +0 -157
  561. data/spec/spec_tests/data/retryable_reads/estimatedDocumentCount-4.9.yml +0 -60
  562. data/spec/spec_tests/data/retryable_reads/estimatedDocumentCount-serverErrors-4.9.yml +0 -146
  563. data/spec/support/crypt/corpus/corpus_encrypted.json +0 -4152
  564. data/spec/support/session_registry.rb +0 -55
  565. /data/spec/spec_tests/data/retryable_reads/{aggregate-merge.yml → legacy/aggregate-merge.yml} +0 -0
  566. /data/spec/spec_tests/data/retryable_reads/{aggregate-serverErrors.yml → legacy/aggregate-serverErrors.yml} +0 -0
  567. /data/spec/spec_tests/data/retryable_reads/{aggregate.yml → legacy/aggregate.yml} +0 -0
  568. /data/spec/spec_tests/data/retryable_reads/{changeStreams-client.watch-serverErrors.yml → legacy/changeStreams-client.watch-serverErrors.yml} +0 -0
  569. /data/spec/spec_tests/data/retryable_reads/{changeStreams-client.watch.yml → legacy/changeStreams-client.watch.yml} +0 -0
  570. /data/spec/spec_tests/data/retryable_reads/{changeStreams-db.coll.watch-serverErrors.yml → legacy/changeStreams-db.coll.watch-serverErrors.yml} +0 -0
  571. /data/spec/spec_tests/data/retryable_reads/{changeStreams-db.coll.watch.yml → legacy/changeStreams-db.coll.watch.yml} +0 -0
  572. /data/spec/spec_tests/data/retryable_reads/{changeStreams-db.watch-serverErrors.yml → legacy/changeStreams-db.watch-serverErrors.yml} +0 -0
  573. /data/spec/spec_tests/data/retryable_reads/{changeStreams-db.watch.yml → legacy/changeStreams-db.watch.yml} +0 -0
  574. /data/spec/spec_tests/data/retryable_reads/{count-serverErrors.yml → legacy/count-serverErrors.yml} +0 -0
  575. /data/spec/spec_tests/data/retryable_reads/{count.yml → legacy/count.yml} +0 -0
  576. /data/spec/spec_tests/data/retryable_reads/{countDocuments-serverErrors.yml → legacy/countDocuments-serverErrors.yml} +0 -0
  577. /data/spec/spec_tests/data/retryable_reads/{countDocuments.yml → legacy/countDocuments.yml} +0 -0
  578. /data/spec/spec_tests/data/retryable_reads/{distinct-serverErrors.yml → legacy/distinct-serverErrors.yml} +0 -0
  579. /data/spec/spec_tests/data/retryable_reads/{distinct.yml → legacy/distinct.yml} +0 -0
  580. /data/spec/spec_tests/data/retryable_reads/{find-serverErrors.yml → legacy/find-serverErrors.yml} +0 -0
  581. /data/spec/spec_tests/data/retryable_reads/{find.yml → legacy/find.yml} +0 -0
  582. /data/spec/spec_tests/data/retryable_reads/{findOne-serverErrors.yml → legacy/findOne-serverErrors.yml} +0 -0
  583. /data/spec/spec_tests/data/retryable_reads/{findOne.yml → legacy/findOne.yml} +0 -0
  584. /data/spec/spec_tests/data/retryable_reads/{gridfs-download-serverErrors.yml → legacy/gridfs-download-serverErrors.yml} +0 -0
  585. /data/spec/spec_tests/data/retryable_reads/{gridfs-download.yml → legacy/gridfs-download.yml} +0 -0
  586. /data/spec/spec_tests/data/retryable_reads/{gridfs-downloadByName-serverErrors.yml → legacy/gridfs-downloadByName-serverErrors.yml} +0 -0
  587. /data/spec/spec_tests/data/retryable_reads/{gridfs-downloadByName.yml → legacy/gridfs-downloadByName.yml} +0 -0
  588. /data/spec/spec_tests/data/retryable_reads/{listCollectionNames-serverErrors.yml → legacy/listCollectionNames-serverErrors.yml} +0 -0
  589. /data/spec/spec_tests/data/retryable_reads/{listCollectionNames.yml → legacy/listCollectionNames.yml} +0 -0
  590. /data/spec/spec_tests/data/retryable_reads/{listCollectionObjects-serverErrors.yml → legacy/listCollectionObjects-serverErrors.yml} +0 -0
  591. /data/spec/spec_tests/data/retryable_reads/{listCollectionObjects.yml → legacy/listCollectionObjects.yml} +0 -0
  592. /data/spec/spec_tests/data/retryable_reads/{listCollections-serverErrors.yml → legacy/listCollections-serverErrors.yml} +0 -0
  593. /data/spec/spec_tests/data/retryable_reads/{listCollections.yml → legacy/listCollections.yml} +0 -0
  594. /data/spec/spec_tests/data/retryable_reads/{listDatabaseNames-serverErrors.yml → legacy/listDatabaseNames-serverErrors.yml} +0 -0
  595. /data/spec/spec_tests/data/retryable_reads/{listDatabaseNames.yml → legacy/listDatabaseNames.yml} +0 -0
  596. /data/spec/spec_tests/data/retryable_reads/{listDatabaseObjects-serverErrors.yml → legacy/listDatabaseObjects-serverErrors.yml} +0 -0
  597. /data/spec/spec_tests/data/retryable_reads/{listDatabaseObjects.yml → legacy/listDatabaseObjects.yml} +0 -0
  598. /data/spec/spec_tests/data/retryable_reads/{listDatabases-serverErrors.yml → legacy/listDatabases-serverErrors.yml} +0 -0
  599. /data/spec/spec_tests/data/retryable_reads/{listDatabases.yml → legacy/listDatabases.yml} +0 -0
  600. /data/spec/spec_tests/data/retryable_reads/{listIndexNames-serverErrors.yml → legacy/listIndexNames-serverErrors.yml} +0 -0
  601. /data/spec/spec_tests/data/retryable_reads/{listIndexNames.yml → legacy/listIndexNames.yml} +0 -0
  602. /data/spec/spec_tests/data/retryable_reads/{listIndexes-serverErrors.yml → legacy/listIndexes-serverErrors.yml} +0 -0
  603. /data/spec/spec_tests/data/retryable_reads/{listIndexes.yml → legacy/listIndexes.yml} +0 -0
  604. /data/spec/spec_tests/data/retryable_reads/{mapReduce.yml → legacy/mapReduce.yml} +0 -0
  605. /data/spec/spec_tests/data/retryable_writes/{bulkWrite-errorLabels.yml → legacy/bulkWrite-errorLabels.yml} +0 -0
  606. /data/spec/spec_tests/data/retryable_writes/{bulkWrite.yml → legacy/bulkWrite.yml} +0 -0
  607. /data/spec/spec_tests/data/retryable_writes/{deleteMany.yml → legacy/deleteMany.yml} +0 -0
  608. /data/spec/spec_tests/data/retryable_writes/{deleteOne-errorLabels.yml → legacy/deleteOne-errorLabels.yml} +0 -0
  609. /data/spec/spec_tests/data/retryable_writes/{deleteOne.yml → legacy/deleteOne.yml} +0 -0
  610. /data/spec/spec_tests/data/retryable_writes/{findOneAndDelete-errorLabels.yml → legacy/findOneAndDelete-errorLabels.yml} +0 -0
  611. /data/spec/spec_tests/data/retryable_writes/{findOneAndDelete.yml → legacy/findOneAndDelete.yml} +0 -0
  612. /data/spec/spec_tests/data/retryable_writes/{findOneAndReplace-errorLabels.yml → legacy/findOneAndReplace-errorLabels.yml} +0 -0
  613. /data/spec/spec_tests/data/retryable_writes/{findOneAndReplace.yml → legacy/findOneAndReplace.yml} +0 -0
  614. /data/spec/spec_tests/data/retryable_writes/{findOneAndUpdate-errorLabels.yml → legacy/findOneAndUpdate-errorLabels.yml} +0 -0
  615. /data/spec/spec_tests/data/retryable_writes/{findOneAndUpdate.yml → legacy/findOneAndUpdate.yml} +0 -0
  616. /data/spec/spec_tests/data/retryable_writes/{insertMany-errorLabels.yml → legacy/insertMany-errorLabels.yml} +0 -0
  617. /data/spec/spec_tests/data/retryable_writes/{insertMany.yml → legacy/insertMany.yml} +0 -0
  618. /data/spec/spec_tests/data/retryable_writes/{insertOne-errorLabels.yml → legacy/insertOne-errorLabels.yml} +0 -0
  619. /data/spec/spec_tests/data/retryable_writes/{insertOne.yml → legacy/insertOne.yml} +0 -0
  620. /data/spec/spec_tests/data/retryable_writes/{replaceOne-errorLabels.yml → legacy/replaceOne-errorLabels.yml} +0 -0
  621. /data/spec/spec_tests/data/retryable_writes/{replaceOne.yml → legacy/replaceOne.yml} +0 -0
  622. /data/spec/spec_tests/data/retryable_writes/{updateMany.yml → legacy/updateMany.yml} +0 -0
  623. /data/spec/spec_tests/data/retryable_writes/{updateOne-errorLabels.yml → legacy/updateOne-errorLabels.yml} +0 -0
  624. /data/spec/spec_tests/data/retryable_writes/{updateOne.yml → legacy/updateOne.yml} +0 -0
@@ -9,20 +9,26 @@ describe Mongo::Crypt::DataKeyContext do
9
9
  require_libmongocrypt
10
10
  include_context 'define shared FLE helpers'
11
11
 
12
+ let(:credentials) { Mongo::Crypt::KMS::Credentials.new(kms_providers) }
13
+
14
+ let(:kms_tls_options) do
15
+ {}
16
+ end
17
+
12
18
  let(:mongocrypt) do
13
- Mongo::Crypt::Handle.new(kms_providers)
19
+ Mongo::Crypt::Handle.new(credentials, kms_tls_options)
14
20
  end
15
21
 
16
22
  let(:io) { double("Mongo::Crypt::EncryptionIO") }
17
23
 
18
- let(:context) { described_class.new(mongocrypt, io, kms_provider_name, options) }
19
- let(:base_options) { {} }
20
- let(:options) { base_options }
24
+ let(:key_alt_names) { [] }
25
+
26
+ let(:context) { described_class.new(mongocrypt, io, key_document, key_alt_names) }
21
27
 
22
28
  describe '#initialize' do
23
29
  shared_examples 'it properly sets key_alt_names' do
24
30
  context 'with one key_alt_names' do
25
- let(:options) { base_options.merge(key_alt_names: ['keyAltName1']) }
31
+ let(:key_alt_names) { ['keyAltName1'] }
26
32
 
27
33
  it 'does not raise an exception' do
28
34
  expect do
@@ -32,7 +38,7 @@ describe Mongo::Crypt::DataKeyContext do
32
38
  end
33
39
 
34
40
  context 'with multiple key_alt_names' do
35
- let(:options) { base_options.merge(key_alt_names: ['keyAltName1', 'keyAltName2']) }
41
+ let(:key_alt_names) { ['keyAltName1', 'keyAltName2'] }
36
42
 
37
43
  it 'does not raise an exception' do
38
44
  expect do
@@ -42,7 +48,7 @@ describe Mongo::Crypt::DataKeyContext do
42
48
  end
43
49
 
44
50
  context 'with empty key_alt_names' do
45
- let(:options) { base_options.merge(key_alt_names: []) }
51
+ let(:key_alt_names) { [] }
46
52
 
47
53
  it 'does not raise an exception' do
48
54
  expect do
@@ -52,7 +58,7 @@ describe Mongo::Crypt::DataKeyContext do
52
58
  end
53
59
 
54
60
  context 'with invalid key_alt_names' do
55
- let(:options) { base_options.merge(key_alt_names: ['keyAltName1', 3]) }
61
+ let(:key_alt_names) { ['keyAltName1', 3] }
56
62
 
57
63
  it 'does raises an exception' do
58
64
  expect do
@@ -62,7 +68,7 @@ describe Mongo::Crypt::DataKeyContext do
62
68
  end
63
69
 
64
70
  context 'with non-array key_alt_names' do
65
- let(:options) { base_options.merge(key_alt_names: "keyAltName1") }
71
+ let(:key_alt_names) { "keyAltName1" }
66
72
 
67
73
  it 'does raises an exception' do
68
74
  expect do
@@ -72,115 +78,17 @@ describe Mongo::Crypt::DataKeyContext do
72
78
  end
73
79
  end
74
80
 
75
- context 'with invalid kms provider'do
76
- let(:kms_providers) { local_kms_providers }
77
- let(:kms_provider_name) { 'invalid' }
78
-
79
- it 'raises an exception' do
80
- expect do
81
- context
82
- end.to raise_exception(/invalid is an invalid kms provider/)
83
- end
84
- end
85
-
86
- context 'with local kms provider and empty options' do
87
- include_context 'with local kms_providers'
88
-
89
- it_behaves_like 'it properly sets key_alt_names'
90
-
91
- it 'does not raise an exception' do
92
- expect do
93
- context
94
- end.not_to raise_error
95
- end
96
- end
97
-
98
81
  context 'with aws kms provider' do
99
82
  include_context 'with AWS kms_providers'
100
83
 
101
- let(:base_options) { { master_key: { region: 'us-east-2', key: 'arn' } } }
102
-
103
- it_behaves_like 'it properly sets key_alt_names'
104
-
105
- context 'with empty options' do
106
- let(:options) { {} }
107
-
108
- it 'raises an exception' do
109
- expect do
110
- context
111
- end.to raise_error(ArgumentError, /options Hash must contain a key named :master_key with a Hash value/)
112
- end
113
- end
114
-
115
- context 'with an invalid master key option' do
116
- let(:options) { { master_key: 'key' } }
117
-
118
- it 'raises an exception' do
119
- expect do
120
- context
121
- end.to raise_error(ArgumentError, /:master_key option must be a Hash/)
122
- end
123
- end
124
-
125
- context 'where master key is an empty hash' do
126
- let(:options) { { master_key: {} } }
127
-
128
- it 'raises an exception' do
129
- expect do
130
- context
131
- end.to raise_error(ArgumentError, /The value of :region option of the :master_key options hash cannot be nil/)
132
- end
84
+ let(:key_document) do
85
+ Mongo::Crypt::KMS::MasterKeyDocument.new(
86
+ 'aws',
87
+ { master_key: { region: 'us-east-2', key: 'arn' } }
88
+ )
133
89
  end
134
90
 
135
- context 'with a nil region option' do
136
- let(:options) { { master_key: { region: nil } } }
137
-
138
- it 'raises an exception' do
139
- expect do
140
- context
141
- end.to raise_error(ArgumentError, /The value of :region option of the :master_key options hash cannot be nil/)
142
- end
143
- end
144
-
145
- context 'with an invalid region option' do
146
- let(:options) { { master_key: { region: 5 } } }
147
-
148
- it 'raises an exception' do
149
- expect do
150
- context
151
- end.to raise_error(ArgumentError, /5 is an invalid AWS master_key region/)
152
- end
153
- end
154
-
155
- context 'with an invalid key option' do
156
- let(:options) { { master_key: { region: 'us-east-2', key: nil } } }
157
-
158
- it 'raises an exception' do
159
- expect do
160
- context
161
- end.to raise_error(ArgumentError, /The value of :key option of the :master_key options hash cannot be nil/)
162
- end
163
- end
164
-
165
- context 'with an invalid key option' do
166
- let(:options) { { master_key: { region: 'us-east-2', key: 5 } } }
167
-
168
- it 'raises an exception' do
169
- expect do
170
- context
171
- end.to raise_error(ArgumentError, /5 is an invalid AWS master_key key/)
172
- end
173
- end
174
-
175
- context 'with an invalid endpoint option' do
176
- let(:options) { { master_key: { region: 'us-east-2', key: 'arn', endpoint: 5 } } }
177
-
178
- it 'raises an exception' do
179
- expect do
180
- context
181
- end.to raise_error(ArgumentError, /5 is an invalid AWS master_key endpoint/)
182
- end
183
- end
91
+ it_behaves_like 'it properly sets key_alt_names'
184
92
 
185
93
  context 'with valid options' do
186
94
  it 'does not raise an exception' do
@@ -191,7 +99,18 @@ describe Mongo::Crypt::DataKeyContext do
191
99
  end
192
100
 
193
101
  context 'with valid endpoint' do
194
- let(:options) { { master_key: { region: 'us-east-2', key: 'arn', endpoint: 'kms.us-east-2.amazonaws.com:443' } } }
102
+ let(:key_document) do
103
+ Mongo::Crypt::KMS::MasterKeyDocument.new(
104
+ 'aws',
105
+ {
106
+ master_key: {
107
+ region: 'us-east-2',
108
+ key: 'arn',
109
+ endpoint: 'kms.us-east-2.amazonaws.com:443'
110
+ }
111
+ }
112
+ )
113
+ end
195
114
 
196
115
  it 'does not raise an exception' do
197
116
  expect do
@@ -208,6 +127,15 @@ describe Mongo::Crypt::DataKeyContext do
208
127
  context 'with local KMS provider' do
209
128
  include_context 'with local kms_providers'
210
129
 
130
+ let(:key_document) do
131
+ Mongo::Crypt::KMS::MasterKeyDocument.new(
132
+ 'local',
133
+ {
134
+ master_key: { key: 'MASTER-KEY' }
135
+ }
136
+ )
137
+ end
138
+
211
139
  it 'creates a data key' do
212
140
  expect(context.run_state_machine).to be_a_kind_of(Hash)
213
141
  end
@@ -9,6 +9,7 @@ describe Mongo::Crypt::EncryptionIO do
9
9
  described_class.new(
10
10
  key_vault_namespace: 'foo.bar',
11
11
  key_vault_client: authorized_client,
12
+ metadata_client: authorized_client.with(auto_encryption_options: nil),
12
13
  mongocryptd_options: mongocryptd_options,
13
14
  )
14
15
  end
@@ -106,6 +107,7 @@ describe Mongo::Crypt::EncryptionIO do
106
107
  mongocryptd_client: mock_client,
107
108
  key_vault_namespace: 'foo.bar',
108
109
  key_vault_client: authorized_client,
110
+ metadata_client: authorized_client.with(auto_encryption_options: nil),
109
111
  mongocryptd_options: mongocryptd_options,
110
112
  )
111
113
  end
@@ -8,7 +8,8 @@ describe Mongo::Crypt::ExplicitDecryptionContext do
8
8
  require_libmongocrypt
9
9
  include_context 'define shared FLE helpers'
10
10
 
11
- let(:mongocrypt) { Mongo::Crypt::Handle.new(kms_providers, logger: logger) }
11
+ let(:credentials) { Mongo::Crypt::KMS::Credentials.new(kms_providers) }
12
+ let(:mongocrypt) { Mongo::Crypt::Handle.new(credentials, logger: logger) }
12
13
  let(:context) { described_class.new(mongocrypt, io, value) }
13
14
  let(:logger) { nil }
14
15
  let(:io) { double("Mongo::ClientEncryption::IO") }
@@ -43,6 +44,36 @@ describe Mongo::Crypt::ExplicitDecryptionContext do
43
44
  end
44
45
  end
45
46
 
47
+ context 'when mongocrypt is initialized with Azure KMS provider options' do
48
+ include_context 'with Azure kms_providers'
49
+
50
+ it 'initializes context' do
51
+ expect do
52
+ context
53
+ end.not_to raise_error
54
+ end
55
+ end
56
+
57
+ context 'when mongocrypt is initialized with GCP KMS provider options' do
58
+ include_context 'with GCP kms_providers'
59
+
60
+ it 'initializes context' do
61
+ expect do
62
+ context
63
+ end.not_to raise_error
64
+ end
65
+ end
66
+
67
+ context 'when mongocrypt is initialized with KMIP KMS provider options' do
68
+ include_context 'with KMIP kms_providers'
69
+
70
+ it 'initializes context' do
71
+ expect do
72
+ context
73
+ end.not_to raise_error
74
+ end
75
+ end
76
+
46
77
  context 'with verbose logging' do
47
78
  include_context 'with local kms_providers'
48
79
 
@@ -8,7 +8,8 @@ describe Mongo::Crypt::ExplicitEncryptionContext do
8
8
  require_libmongocrypt
9
9
  include_context 'define shared FLE helpers'
10
10
 
11
- let(:mongocrypt) { Mongo::Crypt::Handle.new(kms_providers, logger: logger) }
11
+ let(:credentials) { Mongo::Crypt::KMS::Credentials.new(kms_providers) }
12
+ let(:mongocrypt) { Mongo::Crypt::Handle.new(credentials, logger: logger) }
12
13
  let(:context) { described_class.new(mongocrypt, io, value, options) }
13
14
 
14
15
  let(:logger) { nil }
@@ -126,6 +127,78 @@ describe Mongo::Crypt::ExplicitEncryptionContext do
126
127
  end.not_to raise_error
127
128
  end
128
129
  end
130
+
131
+ context 'with query_type' do
132
+ let(:key_alt_name) { nil }
133
+
134
+ it 'raises exception' do
135
+ expect do
136
+ described_class.new(
137
+ mongocrypt,
138
+ io,
139
+ value,
140
+ options.merge(query_type: :equality)
141
+ )
142
+ end.to raise_error(ArgumentError, /query_type is allowed only for "Indexed" algorithm/)
143
+ end
144
+ end
145
+
146
+ context 'with contention_factor' do
147
+ let(:key_alt_name) { nil }
148
+
149
+ it 'raises exception' do
150
+ expect do
151
+ described_class.new(
152
+ mongocrypt,
153
+ io,
154
+ value,
155
+ options.merge(contention_factor: 10)
156
+ )
157
+ end.to raise_error(ArgumentError, /contention_factor is allowed only for "Indexed" algorithm/)
158
+ end
159
+ end
160
+
161
+ context 'with Indexed algorithm' do
162
+ let(:algorithm) do
163
+ 'Indexed'
164
+ end
165
+
166
+ let(:key_alt_name) do
167
+ nil
168
+ end
169
+
170
+ it 'initializes context' do
171
+ expect do
172
+ context
173
+ end.not_to raise_error
174
+ end
175
+
176
+ context 'with query_type' do
177
+ it 'initializes context' do
178
+ expect do
179
+ described_class.new(
180
+ mongocrypt,
181
+ io,
182
+ value,
183
+ options.merge(query_type: :equality)
184
+ )
185
+ end.not_to raise_error
186
+ end
187
+ end
188
+
189
+ context 'with contention_factor' do
190
+ it 'initializes context' do
191
+ expect do
192
+ described_class.new(
193
+ mongocrypt,
194
+ io,
195
+ value,
196
+ options.merge(contention_factor: 10)
197
+ )
198
+ end.not_to raise_error
199
+ end
200
+ end
201
+ end
129
202
  end
130
203
 
131
204
  context 'when mongocrypt is initialized with AWS KMS provider options' do
@@ -133,6 +206,21 @@ describe Mongo::Crypt::ExplicitEncryptionContext do
133
206
  it_behaves_like 'a functioning ExplicitEncryptionContext'
134
207
  end
135
208
 
209
+ context 'when mongocrypt is initialized with Azure KMS provider options' do
210
+ include_context 'with Azure kms_providers'
211
+ it_behaves_like 'a functioning ExplicitEncryptionContext'
212
+ end
213
+
214
+ context 'when mongocrypt is initialized with GCP KMS provider options' do
215
+ include_context 'with GCP kms_providers'
216
+ it_behaves_like 'a functioning ExplicitEncryptionContext'
217
+ end
218
+
219
+ context 'when mongocrypt is initialized with KMIP KMS provider options' do
220
+ include_context 'with KMIP kms_providers'
221
+ it_behaves_like 'a functioning ExplicitEncryptionContext'
222
+ end
223
+
136
224
  context 'when mongocrypt is initialized with local KMS provider options' do
137
225
  include_context 'with local kms_providers'
138
226
  it_behaves_like 'a functioning ExplicitEncryptionContext'
@@ -10,7 +10,9 @@ describe Mongo::Crypt::Handle do
10
10
  include_context 'define shared FLE helpers'
11
11
 
12
12
  describe '#initialize' do
13
- let(:handle) { described_class.new(kms_providers, schema_map: schema_map) }
13
+ let(:credentials) { Mongo::Crypt::KMS::Credentials.new(kms_providers) }
14
+ let(:kms_tls_options) { {} }
15
+ let(:handle) { described_class.new(credentials, kms_tls_options, schema_map: schema_map) }
14
16
  let(:schema_map) { nil }
15
17
 
16
18
  shared_examples 'a functioning Mongo::Crypt::Handle' do
@@ -37,199 +39,75 @@ describe Mongo::Crypt::Handle do
37
39
  end
38
40
  end
39
41
 
40
- context 'with empty kms_providers' do
41
- let(:kms_providers) { {} }
42
-
43
- it 'raises an exception' do
44
- expect { handle }.to raise_error(ArgumentError, /must have one of the following keys: :aws, :local/)
45
- end
46
- end
47
-
48
- context 'with invalid aws kms_providers' do
49
- let(:kms_providers) { { aws: {} } }
50
-
51
- it 'raises an exception' do
52
- expect { handle }.to raise_error(ArgumentError, /kms_providers with :aws key must be in the format: { aws: { access_key_id: 'YOUR-ACCESS-KEY-ID', secret_access_key: 'SECRET-ACCESS-KEY' } }/)
53
- end
54
- end
55
-
56
- context 'with invalid kms_providers key' do
57
- let(:kms_providers) { { random_kms_provider: {} } }
58
-
59
- it 'raises an exception' do
60
- expect { handle }.to raise_error(ArgumentError, /must have one of the following keys: :aws, :local/)
61
- end
62
- end
63
-
64
- context 'with empty local kms_providers' do
65
- let(:kms_providers) { { local: {} } }
66
-
67
- it 'raises an exception' do
68
- expect { handle }.to raise_error(ArgumentError, /kms_providers with :local key must be in the format: { local: { key: 'MASTER-KEY' } }/)
69
- end
70
- end
71
-
72
- context 'with invalid local kms_providers' do
73
- let(:kms_providers) { { local: { invalid_key: 'Some stuff' } } }
74
-
75
- it 'raises an exception' do
76
- expect { handle }.to raise_error(ArgumentError, /kms_providers with :local key must be in the format: { local: { key: 'MASTER-KEY' } }/)
77
- end
78
- end
79
-
80
- context 'with invalid local kms master key' do
81
- let(:kms_providers) do
82
- {
83
- local: {
84
- key: 'ruby' * 23 # NOT 96 bytes
42
+ context 'local' do
43
+ context 'with invalid local kms master key' do
44
+ let(:kms_providers) do
45
+ {
46
+ local: {
47
+ key: 'ruby' * 23 # NOT 96 bytes
48
+ }
85
49
  }
86
- }
87
- end
50
+ end
88
51
 
89
- it 'raises an exception' do
90
- expect { handle }.to raise_error(Mongo::Error::CryptError, 'local key must be 96 bytes (libmongocrypt error code 1)')
52
+ it 'raises an exception' do
53
+ expect { handle }.to raise_error(Mongo::Error::CryptError, 'local key must be 96 bytes (libmongocrypt error code 1)')
54
+ end
91
55
  end
92
- end
93
56
 
94
- context 'with valid local kms_providers' do
95
- include_context 'with local kms_providers'
96
- it_behaves_like 'a functioning Mongo::Crypt::Handle'
97
- end
98
-
99
- context 'with nil AWS kms_provider' do
100
- let(:kms_providers) {
101
- {
102
- aws: nil
103
- }
104
- }
105
-
106
- it 'raises an exception' do
107
- expect do
108
- handle
109
- end.to raise_error(ArgumentError, /The :aws KMS provider must not be nil/)
57
+ context 'with valid local kms_providers' do
58
+ include_context 'with local kms_providers'
59
+ it_behaves_like 'a functioning Mongo::Crypt::Handle'
110
60
  end
111
- end
112
61
 
113
- context 'with empty AWS kms_provider' do
114
- let(:kms_providers) {
115
- {
116
- aws: {}
117
- }
118
- }
119
-
120
- it 'raises an exception' do
121
- expect do
122
- handle
123
- end.to raise_error(ArgumentError, /The specified aws kms_providers option is invalid/)
124
- end
125
62
  end
126
63
 
127
- context 'with nil AWS access_key_id' do
128
- let(:kms_providers) {
129
- {
130
- aws: {
131
- access_key_id: nil,
132
- secret_access_key: SpecConfig.instance.fle_aws_secret
133
- }
134
- }
135
- }
136
-
137
- it 'raises an exception' do
138
- expect do
139
- handle
140
- end.to raise_error(ArgumentError, /The aws access_key_id option must be a String with at least one character; currently have nil/)
64
+ context 'AWS' do
65
+ context 'with valid AWS kms_providers' do
66
+ include_context 'with AWS kms_providers'
67
+ it_behaves_like 'a functioning Mongo::Crypt::Handle'
141
68
  end
142
69
  end
143
70
 
144
- context 'with non-string AWS access_key_id' do
145
- let(:kms_providers) {
146
- {
147
- aws: {
148
- access_key_id: 5,
149
- secret_access_key: SpecConfig.instance.fle_aws_secret
150
- }
151
- }
152
- }
153
-
154
- it 'raises an exception' do
155
- expect do
156
- handle
157
- end.to raise_error(ArgumentError, /The aws access_key_id option must be a String with at least one character; currently have 5/)
71
+ context 'Azure' do
72
+ context 'with valid azure kms_providers' do
73
+ include_context 'with Azure kms_providers'
74
+ it_behaves_like 'a functioning Mongo::Crypt::Handle'
158
75
  end
159
76
  end
160
77
 
161
- context 'with empty string AWS access_key_id' do
162
- let(:kms_providers) {
163
- {
164
- aws: {
165
- access_key_id: '',
166
- secret_access_key: SpecConfig.instance.fle_aws_secret
167
- }
168
- }
169
- }
170
-
171
- it 'raises an exception' do
172
- expect do
173
- handle
174
- end.to raise_error(ArgumentError, /The aws access_key_id option must be a String with at least one character; it is currently an empty string/)
78
+ context 'GCP' do
79
+ context 'with valid gcp kms_providers' do
80
+ include_context 'with GCP kms_providers'
81
+ it_behaves_like 'a functioning Mongo::Crypt::Handle'
175
82
  end
176
83
  end
177
84
 
85
+ context 'GCP with PEM private key' do
86
+ require_mri
178
87
 
179
- context 'with nil AWS secret_access_key' do
180
- let(:kms_providers) {
181
- {
182
- aws: {
183
- access_key_id: SpecConfig.instance.fle_aws_key,
184
- secret_access_key: nil
185
- }
186
- }
187
- }
188
-
189
- it 'raises an exception' do
190
- expect do
191
- handle
192
- end.to raise_error(ArgumentError, /The aws secret_access_key option must be a String with at least one character; currently have nil/)
193
- end
194
- end
88
+ context 'with valid gcp kms_providers' do
89
+ include_context 'with GCP kms_providers'
195
90
 
196
- context 'with non-string AWS secret_access_key' do
197
- let(:kms_providers) {
198
- {
199
- aws: {
200
- access_key_id: SpecConfig.instance.fle_aws_key,
201
- secret_access_key: 5
91
+ let(:kms_providers) do
92
+ {
93
+ gcp: {
94
+ email: SpecConfig.instance.fle_gcp_email,
95
+ private_key: OpenSSL::PKey.read(
96
+ Base64.decode64(SpecConfig.instance.fle_gcp_private_key)
97
+ ).export,
98
+ }
202
99
  }
203
- }
204
- }
100
+ end
205
101
 
206
- it 'raises an exception' do
207
- expect do
208
- handle
209
- end.to raise_error(ArgumentError, /The aws secret_access_key option must be a String with at least one character; currently have 5/)
102
+ it_behaves_like 'a functioning Mongo::Crypt::Handle'
210
103
  end
211
104
  end
212
105
 
213
- context 'with empty string AWS secret_access_key' do
214
- let(:kms_providers) {
215
- {
216
- aws: {
217
- access_key_id: SpecConfig.instance.fle_aws_key,
218
- secret_access_key: ''
219
- }
220
- }
221
- }
222
-
223
- it 'raises an exception' do
224
- expect do
225
- handle
226
- end.to raise_error(ArgumentError, /The aws secret_access_key option must be a String with at least one character; it is currently an empty string/)
106
+ context 'KMIP' do
107
+ context 'with valid kmip kms_providers' do
108
+ include_context 'with KMIP kms_providers'
109
+ it_behaves_like 'a functioning Mongo::Crypt::Handle'
227
110
  end
228
111
  end
229
-
230
- context 'with valid AWS kms_providers' do
231
- include_context 'with AWS kms_providers'
232
- it_behaves_like 'a functioning Mongo::Crypt::Handle'
233
- end
234
112
  end
235
113
  end
@@ -0,0 +1,30 @@
1
+ # frozen_string_literal: true
2
+ # encoding: utf-8
3
+
4
+ require 'mongo'
5
+ require 'base64'
6
+ require 'lite_spec_helper'
7
+
8
+ describe Mongo::Crypt::Hooks do
9
+ context '#rsaes_pkcs_signature' do
10
+ let(:private_key_data_b64) do
11
+ 'MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQC4JOyv5z05cL18ztpknRC7CFY2gYol4DAKerdVUoDJxCTmFMf39dVUEqD0WDiw/qcRtSO1/FRut08PlSPmvbyKetsLoxlpS8lukSzEFpFK7+L+R4miFOl6HvECyg7lbC1H/WGAhIz9yZRlXhRo9qmO/fB6PV9IeYtU+1xYuXicjCDPp36uuxBAnCz7JfvxJ3mdVc0vpSkbSb141nWuKNYR1mgyvvL6KzxO6mYsCo4hRAdhuizD9C4jDHk0V2gDCFBk0h8SLEdzStX8L0jG90/Og4y7J1b/cPo/kbYokkYisxe8cPlsvGBf+rZex7XPxc1yWaP080qeABJb+S88O//LAgMBAAECggEBAKVxP1m3FzHBUe2NZ3fYCc0Qa2zjK7xl1KPFp2u4CU+9sy0oZJUqQHUdm5CMprqWwIHPTftWboFenmCwrSXFOFzujljBO7Z3yc1WD3NJl1ZNepLcsRJ3WWFH5V+NLJ8Bdxlj1DMEZCwr7PC5+vpnCuYWzvT0qOPTl9RNVaW9VVjHouJ9Fg+s2DrShXDegFabl1iZEDdI4xScHoYBob06A5lw0WOCTayzw0Naf37lM8Y4psRAmI46XLiF/Vbuorna4hcChxDePlNLEfMipICcuxTcei1RBSlBa2t1tcnvoTy6cuYDqqImRYjp1KnMKlKQBnQ1NjS2TsRGm+F0FbreVCECgYEA4IDJlm8q/hVyNcPe4OzIcL1rsdYN3bNm2Y2O/YtRPIkQ446ItyxD06d9VuXsQpFp9jNACAPfCMSyHpPApqlxdc8z/xATlgHkcGezEOd1r4E7NdTpGg8y6Rj9b8kVlED6v4grbRhKcU6moyKUQT3+1B6ENZTOKyxuyDEgTwZHtFECgYEA0fqdv9h9s77d6eWmIioP7FSymq93pC4umxf6TVicpjpMErdD2ZfJGulN37dq8FOsOFnSmFYJdICj/PbJm6p1i8O21lsFCltEqVoVabJ7/0alPfdG2U76OeBqI8ZubL4BMnWXAB/VVEYbyWCNpQSDTjHQYs54qa2I0dJB7OgJt1sCgYEArctFQ02/7H5Rscl1yo3DBXO94SeiCFSPdC8f2Kt3MfOxvVdkAtkjkMACSbkoUsgbTVqTYSEOEc2jTgR3iQ13JgpHaFbbsq64V0QP3TAxbLIQUjYGVgQaF1UfLOBv8hrzgj45z/ST/G80lOl595+0nCUbmBcgG1AEWrmdF0/3RmECgYAKvIzKXXB3+19vcT2ga5Qq2l3TiPtOGsppRb2XrNs9qKdxIYvHmXo/9QP1V3SRW0XoD7ez8FpFabp42cmPOxUNk3FK3paQZABLxH5pzCWI9PzIAVfPDrm+sdnbgG7vAnwfL2IMMJSA3aDYGCbF9EgefG+STcpfqq7fQ6f5TBgLFwKBgCd7gn1xYL696SaKVSm7VngpXlczHVEpz3kStWR5gfzriPBxXgMVcWmcbajRser7ARpCEfbxM1UJyv6oAYZWVSNErNzNVb4POqLYcCNySuC6xKhs9FrEQnyKjyk8wI4VnrEMGrQ8e+qYSwYk9Gh6dKGoRMAPYVXQAO0fIsHF/T0a'
12
+ end
13
+
14
+ let(:signature) do
15
+ Base64.decode64(
16
+ 'VocBRhpMmQ2XCzVehWSqheQLnU889gf3dhU4AnVnQTJjsKx/CM23qKDPkZDd2A/BnQsp99SN7ksIX5Raj0TPwyN5OCN/YrNFNGoOFlTsGhgP/hyE8X3Duiq6sNO0SMvRYNPFFGlJFsp1Fw3Z94eYMg4/Wpw5s4+Jo5Zm/qY7aTJIqDKDQ3CNHLeJgcMUOc9sz01/GzoUYKDVODHSxrYEk5ireFJFz9vP8P7Ha+VDUZuQIQdXer9NBbGFtYmWprY3nn4D3Dw93Sn0V0dIqYeIo91oKyslvMebmUM95S2PyIJdEpPb2DJDxjvX/0LLwSWlSXRWy9gapWoBkb4ynqZBsg=='
17
+ )
18
+ end
19
+
20
+ let(:input) do
21
+ 'data to sign'
22
+ end
23
+
24
+ it 'signs data with private key' do
25
+ expect(
26
+ subject.rsaes_pkcs_signature(private_key_data_b64, input)
27
+ ).to eq(signature)
28
+ end
29
+ end
30
+ end