mongo 2.17.2 → 2.18.1

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 (689) 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 +115 -29
  9. data/lib/mongo/client.rb +133 -17
  10. data/lib/mongo/client_encryption.rb +113 -10
  11. data/lib/mongo/cluster/reapers/cursor_reaper.rb +11 -1
  12. data/lib/mongo/cluster.rb +26 -28
  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 +22 -16
  16. data/lib/mongo/collection/view/change_stream.rb +65 -23
  17. data/lib/mongo/collection/view/explainable.rb +1 -1
  18. data/lib/mongo/collection/view/iterable.rb +2 -2
  19. data/lib/mongo/collection/view/map_reduce.rb +18 -9
  20. data/lib/mongo/collection/view/readable.rb +29 -25
  21. data/lib/mongo/collection/view/writable.rb +133 -40
  22. data/lib/mongo/collection.rb +117 -49
  23. data/lib/mongo/config/options.rb +62 -0
  24. data/lib/mongo/config/validators/option.rb +26 -0
  25. data/lib/mongo/config.rb +42 -0
  26. data/lib/mongo/crypt/auto_encrypter.rb +136 -14
  27. data/lib/mongo/crypt/binding.rb +513 -144
  28. data/lib/mongo/crypt/context.rb +5 -2
  29. data/lib/mongo/crypt/data_key_context.rb +12 -104
  30. data/lib/mongo/crypt/encryption_io.rb +94 -60
  31. data/lib/mongo/crypt/explicit_encrypter.rb +143 -26
  32. data/lib/mongo/crypt/explicit_encryption_context.rb +25 -2
  33. data/lib/mongo/crypt/handle.rb +160 -86
  34. data/lib/mongo/crypt/hooks.rb +25 -2
  35. data/lib/mongo/crypt/kms/aws.rb +136 -0
  36. data/lib/mongo/crypt/kms/azure.rb +144 -0
  37. data/lib/mongo/crypt/kms/credentials.rb +81 -0
  38. data/lib/mongo/crypt/kms/gcp.rb +189 -0
  39. data/lib/mongo/crypt/kms/kmip.rb +116 -0
  40. data/lib/mongo/crypt/kms/local.rb +82 -0
  41. data/lib/mongo/crypt/kms/master_key_document.rb +65 -0
  42. data/lib/mongo/crypt/kms.rb +117 -0
  43. data/lib/mongo/crypt/rewrap_many_data_key_context.rb +46 -0
  44. data/lib/mongo/crypt/rewrap_many_data_key_result.rb +37 -0
  45. data/lib/mongo/crypt/status.rb +8 -2
  46. data/lib/mongo/crypt.rb +3 -0
  47. data/lib/mongo/cursor/kill_spec.rb +27 -6
  48. data/lib/mongo/cursor.rb +26 -11
  49. data/lib/mongo/database/view.rb +6 -3
  50. data/lib/mongo/database.rb +57 -13
  51. data/lib/mongo/dbref.rb +1 -105
  52. data/lib/mongo/error/bulk_write_error.rb +31 -4
  53. data/lib/mongo/error/invalid_config_option.rb +20 -0
  54. data/lib/mongo/error/invalid_replacement_document.rb +27 -9
  55. data/lib/mongo/error/invalid_update_document.rb +27 -7
  56. data/lib/mongo/error/labelable.rb +72 -0
  57. data/lib/mongo/error/missing_connection.rb +25 -0
  58. data/lib/mongo/error/missing_file_chunk.rb +8 -2
  59. data/lib/mongo/error/notable.rb +7 -0
  60. data/lib/mongo/error/operation_failure.rb +34 -86
  61. data/lib/mongo/error/read_write_retryable.rb +108 -0
  62. data/lib/mongo/{operation/kill_cursors/legacy.rb → error/session_not_materialized.rb} +7 -19
  63. data/lib/mongo/error.rb +5 -37
  64. data/lib/mongo/grid/stream/read.rb +6 -0
  65. data/lib/mongo/index/view.rb +23 -7
  66. data/lib/mongo/monitoring/event/command_failed.rb +8 -2
  67. data/lib/mongo/monitoring/event/command_started.rb +1 -1
  68. data/lib/mongo/monitoring/event/command_succeeded.rb +9 -2
  69. data/lib/mongo/monitoring/publishable.rb +9 -5
  70. data/lib/mongo/operation/collections_info/result.rb +5 -2
  71. data/lib/mongo/operation/command/op_msg.rb +6 -0
  72. data/lib/mongo/operation/context.rb +24 -6
  73. data/lib/mongo/operation/count/op_msg.rb +4 -1
  74. data/lib/mongo/operation/create/op_msg.rb +4 -1
  75. data/lib/mongo/operation/create_index/op_msg.rb +2 -1
  76. data/lib/mongo/operation/delete/op_msg.rb +1 -0
  77. data/lib/mongo/operation/delete.rb +0 -1
  78. data/lib/mongo/operation/distinct/op_msg.rb +4 -1
  79. data/lib/mongo/operation/drop_index/op_msg.rb +5 -1
  80. data/lib/mongo/operation/get_more/command_builder.rb +5 -1
  81. data/lib/mongo/operation/insert/bulk_result.rb +5 -1
  82. data/lib/mongo/operation/insert/command.rb +0 -4
  83. data/lib/mongo/operation/insert/op_msg.rb +6 -3
  84. data/lib/mongo/operation/insert/result.rb +6 -3
  85. data/lib/mongo/operation/insert.rb +0 -1
  86. data/lib/mongo/operation/kill_cursors.rb +0 -1
  87. data/lib/mongo/operation/list_collections/op_msg.rb +4 -1
  88. data/lib/mongo/operation/map_reduce/result.rb +16 -0
  89. data/lib/mongo/operation/result.rb +21 -5
  90. data/lib/mongo/operation/shared/executable.rb +21 -6
  91. data/lib/mongo/operation/shared/polymorphic_operation.rb +15 -3
  92. data/lib/mongo/operation/shared/response_handling.rb +6 -5
  93. data/lib/mongo/operation/shared/sessions_supported.rb +7 -3
  94. data/lib/mongo/operation/shared/write.rb +18 -12
  95. data/lib/mongo/operation/update/op_msg.rb +2 -1
  96. data/lib/mongo/operation/update.rb +0 -1
  97. data/lib/mongo/protocol/caching_hash.rb +69 -0
  98. data/lib/mongo/protocol/msg.rb +21 -1
  99. data/lib/mongo/protocol.rb +1 -0
  100. data/lib/mongo/query_cache.rb +15 -0
  101. data/lib/mongo/retryable.rb +78 -30
  102. data/lib/mongo/server/connection.rb +33 -0
  103. data/lib/mongo/server/connection_base.rb +2 -0
  104. data/lib/mongo/server/connection_common.rb +4 -1
  105. data/lib/mongo/server/connection_pool.rb +74 -46
  106. data/lib/mongo/server/description/features.rb +3 -1
  107. data/lib/mongo/server/description.rb +7 -2
  108. data/lib/mongo/server/monitor/connection.rb +1 -0
  109. data/lib/mongo/server/monitor.rb +25 -13
  110. data/lib/mongo/server/push_monitor.rb +13 -3
  111. data/lib/mongo/server.rb +9 -5
  112. data/lib/mongo/session/session_pool.rb +8 -0
  113. data/lib/mongo/session.rb +111 -35
  114. data/lib/mongo/socket/ocsp_verifier.rb +4 -5
  115. data/lib/mongo/socket/tcp.rb +3 -0
  116. data/lib/mongo/srv/resolver.rb +24 -3
  117. data/lib/mongo/uri/options_mapper.rb +2 -0
  118. data/lib/mongo/uri/srv_protocol.rb +1 -1
  119. data/lib/mongo/uri.rb +20 -0
  120. data/lib/mongo/version.rb +1 -1
  121. data/lib/mongo.rb +22 -0
  122. data/mongo.gemspec +10 -4
  123. data/spec/README.md +23 -5
  124. data/spec/integration/aws_lambda_examples_spec.rb +68 -0
  125. data/spec/integration/bulk_write_error_message_spec.rb +32 -0
  126. data/spec/integration/bulk_write_spec.rb +16 -0
  127. data/spec/integration/change_stream_spec.rb +6 -5
  128. data/spec/integration/client_construction_spec.rb +74 -8
  129. data/spec/integration/client_side_encryption/auto_encryption_bulk_writes_spec.rb +9 -9
  130. data/spec/integration/client_side_encryption/auto_encryption_command_monitoring_spec.rb +168 -168
  131. data/spec/integration/client_side_encryption/auto_encryption_mongocryptd_spawn_spec.rb +0 -1
  132. data/spec/integration/client_side_encryption/auto_encryption_reconnect_spec.rb +31 -0
  133. data/spec/integration/client_side_encryption/auto_encryption_spec.rb +108 -1
  134. data/spec/integration/client_side_encryption/bson_size_limit_spec.rb +2 -2
  135. data/spec/integration/client_side_encryption/bypass_mongocryptd_spawn_spec.rb +2 -2
  136. data/spec/integration/client_side_encryption/client_close_spec.rb +1 -1
  137. data/spec/integration/client_side_encryption/corpus_spec.rb +64 -35
  138. data/spec/integration/client_side_encryption/custom_endpoint_spec.rb +39 -42
  139. data/spec/integration/client_side_encryption/data_key_spec.rb +97 -7
  140. data/spec/integration/client_side_encryption/decryption_events_prose_spec.rb +158 -0
  141. data/spec/integration/client_side_encryption/explicit_encryption_spec.rb +59 -0
  142. data/spec/integration/client_side_encryption/explicit_queryable_encryption_spec.rb +147 -0
  143. data/spec/integration/client_side_encryption/external_key_vault_spec.rb +6 -6
  144. data/spec/integration/client_side_encryption/kms_tls_options_spec.rb +436 -0
  145. data/spec/integration/client_side_encryption/kms_tls_spec.rb +92 -0
  146. data/spec/integration/client_side_encryption/queryable_encryption_examples_spec.rb +111 -0
  147. data/spec/integration/client_side_encryption/unique_index_on_key_alt_names_prose_spec.rb +85 -0
  148. data/spec/integration/client_side_encryption/views_spec.rb +1 -1
  149. data/spec/integration/client_update_spec.rb +2 -2
  150. data/spec/integration/crud_spec.rb +12 -0
  151. data/spec/integration/cursor_pinning_spec.rb +3 -3
  152. data/spec/integration/fork_reconnect_spec.rb +15 -8
  153. data/spec/integration/grid_fs_bucket_spec.rb +3 -3
  154. data/spec/integration/ocsp_verifier_spec.rb +3 -0
  155. data/spec/integration/query_cache_spec.rb +34 -30
  156. data/spec/integration/reconnect_spec.rb +2 -0
  157. data/spec/integration/retryable_writes/retryable_writes_36_and_older_spec.rb +1 -1
  158. data/spec/integration/server_monitor_spec.rb +2 -1
  159. data/spec/integration/size_limit_spec.rb +4 -1
  160. data/spec/integration/snapshot_query_examples_spec.rb +127 -0
  161. data/spec/integration/srv_monitoring_spec.rb +38 -0
  162. data/spec/integration/srv_spec.rb +1 -0
  163. data/spec/integration/step_down_spec.rb +20 -4
  164. data/spec/integration/transaction_pinning_spec.rb +2 -2
  165. data/spec/integration/versioned_api_examples_spec.rb +37 -31
  166. data/spec/lite_spec_helper.rb +19 -9
  167. data/spec/mongo/address/ipv6_spec.rb +7 -0
  168. data/spec/mongo/address_spec.rb +7 -0
  169. data/spec/mongo/auth/scram/conversation_spec.rb +23 -23
  170. data/spec/mongo/auth/scram256/conversation_spec.rb +20 -20
  171. data/spec/mongo/auth/scram_negotiation_spec.rb +1 -0
  172. data/spec/mongo/bulk_write/result_spec.rb +15 -1
  173. data/spec/mongo/bulk_write_spec.rb +141 -20
  174. data/spec/mongo/client_construction_spec.rb +186 -9
  175. data/spec/mongo/client_encryption_spec.rb +10 -22
  176. data/spec/mongo/client_spec.rb +297 -1
  177. data/spec/mongo/cluster/cursor_reaper_spec.rb +21 -3
  178. data/spec/mongo/cluster_spec.rb +0 -44
  179. data/spec/mongo/collection/view/aggregation_spec.rb +121 -2
  180. data/spec/mongo/collection/view/change_stream_spec.rb +2 -2
  181. data/spec/mongo/collection/view/readable_spec.rb +605 -1
  182. data/spec/mongo/collection/view/writable_spec.rb +144 -32
  183. data/spec/mongo/collection_crud_spec.rb +63 -13
  184. data/spec/mongo/collection_spec.rb +32 -0
  185. data/spec/mongo/config/options_spec.rb +75 -0
  186. data/spec/mongo/config_spec.rb +73 -0
  187. data/spec/mongo/crypt/auto_decryption_context_spec.rb +17 -1
  188. data/spec/mongo/crypt/auto_encrypter_spec.rb +256 -5
  189. data/spec/mongo/crypt/auto_encryption_context_spec.rb +17 -1
  190. data/spec/mongo/crypt/binding/context_spec.rb +67 -17
  191. data/spec/mongo/crypt/binding/mongocrypt_spec.rb +17 -46
  192. data/spec/mongo/crypt/binding/version_spec.rb +33 -0
  193. data/spec/mongo/crypt/binding_unloaded_spec.rb +14 -0
  194. data/spec/mongo/crypt/data_key_context_spec.rb +42 -114
  195. data/spec/mongo/crypt/encryption_io_spec.rb +2 -0
  196. data/spec/mongo/crypt/explicit_decryption_context_spec.rb +32 -1
  197. data/spec/mongo/crypt/explicit_encryption_context_spec.rb +94 -1
  198. data/spec/mongo/crypt/handle_spec.rb +172 -156
  199. data/spec/mongo/crypt/hooks_spec.rb +30 -0
  200. data/spec/mongo/crypt/kms/credentials_spec.rb +357 -0
  201. data/spec/mongo/crypt/kms_spec.rb +59 -0
  202. data/spec/mongo/cursor_spec.rb +87 -1
  203. data/spec/mongo/database_spec.rb +66 -1
  204. data/spec/mongo/error/operation_failure_heavy_spec.rb +49 -0
  205. data/spec/mongo/index/view_spec.rb +125 -0
  206. data/spec/mongo/operation/create/op_msg_spec.rb +244 -0
  207. data/spec/mongo/operation/delete/op_msg_spec.rb +13 -4
  208. data/spec/mongo/operation/delete_spec.rb +0 -30
  209. data/spec/mongo/operation/insert/op_msg_spec.rb +18 -10
  210. data/spec/mongo/operation/insert_spec.rb +0 -32
  211. data/spec/mongo/operation/result_spec.rb +20 -0
  212. data/spec/mongo/operation/update/op_msg_spec.rb +13 -4
  213. data/spec/mongo/operation/update_spec.rb +0 -29
  214. data/spec/mongo/protocol/caching_hash_spec.rb +82 -0
  215. data/spec/mongo/protocol/msg_spec.rb +41 -0
  216. data/spec/mongo/query_cache_spec.rb +1 -0
  217. data/spec/mongo/retryable_spec.rb +32 -3
  218. data/spec/mongo/server/connection_auth_spec.rb +3 -1
  219. data/spec/mongo/server/connection_common_spec.rb +13 -1
  220. data/spec/mongo/server/connection_pool_spec.rb +120 -53
  221. data/spec/mongo/server/connection_spec.rb +50 -159
  222. data/spec/mongo/server/description/features_spec.rb +24 -0
  223. data/spec/mongo/server/push_monitor_spec.rb +2 -8
  224. data/spec/mongo/session_spec.rb +26 -6
  225. data/spec/mongo/session_transaction_spec.rb +2 -1
  226. data/spec/mongo/socket/ssl_spec.rb +18 -7
  227. data/spec/mongo/uri/srv_protocol_spec.rb +101 -2
  228. data/spec/mongo/uri_spec.rb +25 -0
  229. data/spec/runners/connection_string.rb +8 -0
  230. data/spec/runners/crud/operation.rb +12 -3
  231. data/spec/runners/crud/requirement.rb +9 -4
  232. data/spec/runners/crud/spec.rb +5 -0
  233. data/spec/runners/crud/test.rb +1 -1
  234. data/spec/runners/crud/verifier.rb +6 -0
  235. data/spec/runners/transactions/spec.rb +2 -2
  236. data/spec/runners/transactions/test.rb +19 -16
  237. data/spec/runners/transactions.rb +11 -8
  238. data/spec/runners/unified/assertions.rb +90 -11
  239. data/spec/runners/unified/change_stream_operations.rb +12 -0
  240. data/spec/runners/unified/client_side_encryption_operations.rb +83 -0
  241. data/spec/runners/unified/crud_operations.rb +67 -4
  242. data/spec/runners/unified/ddl_operations.rb +45 -0
  243. data/spec/runners/unified/error.rb +2 -1
  244. data/spec/runners/unified/grid_fs_operations.rb +21 -0
  245. data/spec/runners/unified/support_operations.rb +5 -2
  246. data/spec/runners/unified/test.rb +78 -5
  247. data/spec/runners/unified.rb +9 -2
  248. data/spec/shared/lib/mrss/constraints.rb +10 -17
  249. data/spec/shared/lib/mrss/docker_runner.rb +23 -3
  250. data/spec/shared/lib/mrss/eg_config_utils.rb +51 -0
  251. data/spec/shared/lib/mrss/event_subscriber.rb +15 -5
  252. data/spec/shared/lib/mrss/lite_constraints.rb +40 -1
  253. data/spec/shared/lib/mrss/session_registry.rb +69 -0
  254. data/spec/shared/lib/mrss/session_registry_legacy.rb +60 -0
  255. data/spec/shared/share/Dockerfile.erb +56 -54
  256. data/spec/shared/shlib/config.sh +27 -0
  257. data/spec/shared/shlib/distro.sh +2 -1
  258. data/spec/shared/shlib/server.sh +46 -21
  259. data/spec/shared/shlib/set_env.sh +43 -5
  260. data/spec/solo/clean_exit_spec.rb +5 -0
  261. data/spec/spec_helper.rb +0 -1
  262. data/spec/spec_tests/client_side_encryption_spec.rb +1 -1
  263. data/spec/spec_tests/client_side_encryption_unified_spec.rb +16 -0
  264. data/spec/spec_tests/crud_spec.rb +0 -10
  265. data/spec/spec_tests/data/change_streams_unified/change-streams-errors.yml +124 -0
  266. data/spec/spec_tests/data/change_streams_unified/change-streams-pre_and_post_images.yml +351 -0
  267. data/spec/spec_tests/data/change_streams_unified/change-streams-resume-allowlist.yml +1171 -0
  268. data/spec/spec_tests/data/change_streams_unified/change-streams-resume-errorLabels.yml +1071 -0
  269. data/spec/spec_tests/data/change_streams_unified/change-streams-showExpandedEvents.yml +298 -0
  270. data/spec/spec_tests/data/change_streams_unified/change-streams.yml +859 -4
  271. data/spec/spec_tests/data/client_side_encryption/aggregate.yml +3 -17
  272. data/spec/spec_tests/data/client_side_encryption/azureKMS.yml +46 -0
  273. data/spec/spec_tests/data/client_side_encryption/badQueries.yml +12 -2
  274. data/spec/spec_tests/data/client_side_encryption/basic.yml +3 -17
  275. data/spec/spec_tests/data/client_side_encryption/bulk.yml +1 -8
  276. data/spec/spec_tests/data/client_side_encryption/bypassAutoEncryption.yml +2 -2
  277. data/spec/spec_tests/data/client_side_encryption/count.yml +1 -8
  278. data/spec/spec_tests/data/client_side_encryption/countDocuments.yml +1 -8
  279. data/spec/spec_tests/data/client_side_encryption/create-and-createIndexes.yml +58 -0
  280. data/spec/spec_tests/data/client_side_encryption/delete.yml +2 -16
  281. data/spec/spec_tests/data/client_side_encryption/distinct.yml +1 -8
  282. data/spec/spec_tests/data/client_side_encryption/explain.yml +1 -8
  283. data/spec/spec_tests/data/client_side_encryption/find.yml +2 -16
  284. data/spec/spec_tests/data/client_side_encryption/findOneAndDelete.yml +1 -8
  285. data/spec/spec_tests/data/client_side_encryption/findOneAndReplace.yml +1 -8
  286. data/spec/spec_tests/data/client_side_encryption/findOneAndUpdate.yml +1 -8
  287. data/spec/spec_tests/data/client_side_encryption/fle2-BypassQueryAnalysis.yml +101 -0
  288. data/spec/spec_tests/data/client_side_encryption/fle2-Compact.yml +80 -0
  289. data/spec/spec_tests/data/client_side_encryption/fle2-CreateCollection.yml +1263 -0
  290. data/spec/spec_tests/data/client_side_encryption/fle2-DecryptExistingData.yml +64 -0
  291. data/spec/spec_tests/data/client_side_encryption/fle2-Delete.yml +107 -0
  292. data/spec/spec_tests/data/client_side_encryption/fle2-EncryptedFields-vs-EncryptedFieldsMap.yml +80 -0
  293. data/spec/spec_tests/data/client_side_encryption/fle2-EncryptedFields-vs-jsonSchema.yml +90 -0
  294. data/spec/spec_tests/data/client_side_encryption/fle2-EncryptedFieldsMap-defaults.yml +57 -0
  295. data/spec/spec_tests/data/client_side_encryption/fle2-FindOneAndUpdate.yml +213 -0
  296. data/spec/spec_tests/data/client_side_encryption/fle2-InsertFind-Indexed.yml +86 -0
  297. data/spec/spec_tests/data/client_side_encryption/fle2-InsertFind-Unindexed.yml +83 -0
  298. data/spec/spec_tests/data/client_side_encryption/fle2-MissingKey.yml +41 -0
  299. data/spec/spec_tests/data/client_side_encryption/fle2-NoEncryption.yml +42 -0
  300. data/spec/spec_tests/data/client_side_encryption/fle2-Update.yml +221 -0
  301. data/spec/spec_tests/data/client_side_encryption/fle2-validatorAndPartialFieldExpression.yml +168 -0
  302. data/spec/spec_tests/data/client_side_encryption/gcpKMS.yml +46 -0
  303. data/spec/spec_tests/data/client_side_encryption/getMore.yml +1 -8
  304. data/spec/spec_tests/data/client_side_encryption/insert.yml +2 -16
  305. data/spec/spec_tests/data/client_side_encryption/keyAltName.yml +1 -8
  306. data/spec/spec_tests/data/client_side_encryption/localKMS.yml +1 -8
  307. data/spec/spec_tests/data/client_side_encryption/localSchema.yml +1 -8
  308. data/spec/spec_tests/data/client_side_encryption/maxWireVersion.yml +2 -0
  309. data/spec/spec_tests/data/client_side_encryption/missingKey.yml +2 -9
  310. data/spec/spec_tests/data/client_side_encryption/noSchema.yml +39 -0
  311. data/spec/spec_tests/data/client_side_encryption/replaceOne.yml +1 -8
  312. data/spec/spec_tests/data/client_side_encryption/types.yml +44 -70
  313. data/spec/spec_tests/data/client_side_encryption/unified/addKeyAltName.yml +194 -0
  314. data/spec/spec_tests/data/client_side_encryption/unified/createDataKey-kms_providers-invalid.yml +67 -0
  315. data/spec/spec_tests/data/client_side_encryption/unified/createDataKey.yml +309 -0
  316. data/spec/spec_tests/data/client_side_encryption/unified/deleteKey.yml +159 -0
  317. data/spec/spec_tests/data/client_side_encryption/unified/getKey.yml +105 -0
  318. data/spec/spec_tests/data/client_side_encryption/unified/getKeyByAltName.yml +104 -0
  319. data/spec/spec_tests/data/client_side_encryption/unified/getKeys.yml +122 -0
  320. data/spec/spec_tests/data/client_side_encryption/unified/removeKeyAltName.yml +157 -0
  321. data/spec/spec_tests/data/client_side_encryption/unified/rewrapManyDataKey-decrypt_failure.yml +69 -0
  322. data/spec/spec_tests/data/client_side_encryption/unified/rewrapManyDataKey-encrypt_failure.yml +122 -0
  323. data/spec/spec_tests/data/client_side_encryption/unified/rewrapManyDataKey.yml +432 -0
  324. data/spec/spec_tests/data/client_side_encryption/updateMany.yml +1 -8
  325. data/spec/spec_tests/data/client_side_encryption/updateOne.yml +1 -8
  326. data/spec/spec_tests/data/client_side_encryption/validatorAndPartialFieldExpression.yml +166 -0
  327. data/spec/spec_tests/data/collection_management/clustered-indexes.yml +135 -0
  328. data/spec/spec_tests/data/collection_management/createCollection-pre_and_post_images.yml +50 -0
  329. data/spec/spec_tests/data/collection_management/modifyCollection-pre_and_post_images.yml +58 -0
  330. data/spec/spec_tests/data/command_monitoring_unified/bulkWrite.yml +68 -0
  331. data/spec/spec_tests/data/command_monitoring_unified/command.yml +50 -0
  332. data/spec/spec_tests/data/command_monitoring_unified/deleteMany.yml +79 -0
  333. data/spec/spec_tests/data/command_monitoring_unified/deleteOne.yml +79 -0
  334. data/spec/spec_tests/data/command_monitoring_unified/find.yml +254 -0
  335. data/spec/spec_tests/data/command_monitoring_unified/insertMany.yml +79 -0
  336. data/spec/spec_tests/data/command_monitoring_unified/insertOne.yml +77 -0
  337. data/spec/spec_tests/data/command_monitoring_unified/pre-42-server-connection-id.yml +56 -0
  338. data/spec/spec_tests/data/command_monitoring_unified/server-connection-id.yml +56 -0
  339. data/spec/spec_tests/data/command_monitoring_unified/unacknowledgedBulkWrite.yml +55 -0
  340. data/spec/spec_tests/data/command_monitoring_unified/updateMany.yml +87 -0
  341. data/spec/spec_tests/data/command_monitoring_unified/updateOne.yml +118 -0
  342. data/spec/spec_tests/data/crud/read/aggregate-collation.yml +1 -1
  343. data/spec/spec_tests/data/crud/read/count-collation.yml +1 -1
  344. data/spec/spec_tests/data/crud/read/distinct-collation.yml +1 -1
  345. data/spec/spec_tests/data/crud/read/find-collation.yml +1 -1
  346. data/spec/spec_tests/data/crud/write/bulkWrite-collation.yml +1 -1
  347. data/spec/spec_tests/data/crud/write/deleteMany-collation.yml +1 -1
  348. data/spec/spec_tests/data/crud/write/deleteOne-collation.yml +1 -1
  349. data/spec/spec_tests/data/crud/write/findOneAndDelete-collation.yml +1 -1
  350. data/spec/spec_tests/data/crud/write/findOneAndReplace-collation.yml +1 -1
  351. data/spec/spec_tests/data/crud/write/findOneAndUpdate-collation.yml +1 -1
  352. data/spec/spec_tests/data/crud/write/replaceOne-collation.yml +1 -1
  353. data/spec/spec_tests/data/crud/write/updateMany-collation.yml +1 -1
  354. data/spec/spec_tests/data/crud/write/updateOne-collation.yml +1 -1
  355. data/spec/spec_tests/data/crud_unified/aggregate-allowdiskuse.yml +75 -0
  356. data/spec/spec_tests/data/crud_unified/aggregate-merge.yml +185 -0
  357. data/spec/spec_tests/data/crud_unified/aggregate-out-readConcern.yml +171 -0
  358. data/spec/spec_tests/data/crud_unified/aggregate.yml +215 -0
  359. data/spec/spec_tests/data/crud_unified/bulkWrite-arrayFilters-clientError.yml +98 -0
  360. data/spec/spec_tests/data/crud_unified/bulkWrite-arrayFilters.yml +174 -0
  361. data/spec/spec_tests/data/crud_unified/bulkWrite-comment.yml +189 -0
  362. data/spec/spec_tests/data/crud_unified/bulkWrite-delete-hint-clientError.yml +113 -0
  363. data/spec/spec_tests/data/crud_unified/bulkWrite-delete-hint-serverError.yml +142 -0
  364. data/spec/spec_tests/data/crud_unified/bulkWrite-delete-hint.yml +154 -0
  365. data/spec/spec_tests/data/crud_unified/bulkWrite-deleteMany-hint-unacknowledged.yml +98 -0
  366. data/spec/spec_tests/data/crud_unified/bulkWrite-deleteMany-let.yml +86 -0
  367. data/spec/spec_tests/data/crud_unified/bulkWrite-deleteOne-hint-unacknowledged.yml +97 -0
  368. data/spec/spec_tests/data/crud_unified/bulkWrite-deleteOne-let.yml +86 -0
  369. data/spec/spec_tests/data/crud_unified/bulkWrite-insertOne-dots_and_dollars.yml +138 -0
  370. data/spec/spec_tests/data/crud_unified/bulkWrite-replaceOne-dots_and_dollars.yml +165 -0
  371. data/spec/spec_tests/data/crud_unified/bulkWrite-replaceOne-hint-unacknowledged.yml +103 -0
  372. data/spec/spec_tests/data/crud_unified/bulkWrite-replaceOne-let.yml +93 -0
  373. data/spec/spec_tests/data/crud_unified/bulkWrite-update-hint-clientError.yml +148 -0
  374. data/spec/spec_tests/data/crud_unified/bulkWrite-update-hint-serverError.yml +239 -0
  375. data/spec/spec_tests/data/crud_unified/bulkWrite-update-hint.yml +256 -0
  376. data/spec/spec_tests/data/crud_unified/bulkWrite-update-validation.yml +73 -0
  377. data/spec/spec_tests/data/crud_unified/bulkWrite-updateMany-dots_and_dollars.yml +150 -0
  378. data/spec/spec_tests/data/crud_unified/bulkWrite-updateMany-hint-unacknowledged.yml +104 -0
  379. data/spec/spec_tests/data/crud_unified/bulkWrite-updateMany-let.yml +96 -0
  380. data/spec/spec_tests/data/crud_unified/bulkWrite-updateOne-dots_and_dollars.yml +150 -0
  381. data/spec/spec_tests/data/crud_unified/bulkWrite-updateOne-hint-unacknowledged.yml +103 -0
  382. data/spec/spec_tests/data/crud_unified/bulkWrite-updateOne-let.yml +95 -0
  383. data/spec/spec_tests/data/crud_unified/countDocuments-comment.yml +92 -0
  384. data/spec/spec_tests/data/crud_unified/db-aggregate.yml +73 -0
  385. data/spec/spec_tests/data/crud_unified/deleteMany-comment.yml +97 -0
  386. data/spec/spec_tests/data/crud_unified/deleteMany-hint-clientError.yml +87 -0
  387. data/spec/spec_tests/data/crud_unified/deleteMany-hint-serverError.yml +107 -0
  388. data/spec/spec_tests/data/crud_unified/deleteMany-hint-unacknowledged.yml +90 -0
  389. data/spec/spec_tests/data/crud_unified/deleteMany-hint.yml +99 -0
  390. data/spec/spec_tests/data/crud_unified/deleteMany-let.yml +2 -0
  391. data/spec/spec_tests/data/crud_unified/deleteOne-comment.yml +98 -0
  392. data/spec/spec_tests/data/crud_unified/deleteOne-hint-clientError.yml +80 -0
  393. data/spec/spec_tests/data/crud_unified/deleteOne-hint-serverError.yml +100 -0
  394. data/spec/spec_tests/data/crud_unified/deleteOne-hint-unacknowledged.yml +89 -0
  395. data/spec/spec_tests/data/crud_unified/deleteOne-hint.yml +95 -0
  396. data/spec/spec_tests/data/crud_unified/deleteOne-let.yml +2 -0
  397. data/spec/spec_tests/data/crud_unified/distinct-comment.yml +98 -0
  398. data/spec/spec_tests/data/crud_unified/estimatedDocumentCount-comment.yml +95 -0
  399. data/spec/spec_tests/data/crud_unified/estimatedDocumentCount.yml +5 -135
  400. data/spec/spec_tests/data/crud_unified/find-allowdiskuse-clientError.yml +55 -0
  401. data/spec/spec_tests/data/crud_unified/find-allowdiskuse-serverError.yml +68 -0
  402. data/spec/spec_tests/data/crud_unified/find-allowdiskuse.yml +79 -0
  403. data/spec/spec_tests/data/crud_unified/find-comment.yml +166 -0
  404. data/spec/spec_tests/data/crud_unified/find.yml +68 -0
  405. data/spec/spec_tests/data/crud_unified/findOneAndDelete-comment.yml +96 -0
  406. data/spec/spec_tests/data/crud_unified/findOneAndDelete-hint-clientError.yml +91 -0
  407. data/spec/spec_tests/data/crud_unified/findOneAndDelete-hint-serverError.yml +107 -0
  408. data/spec/spec_tests/data/crud_unified/findOneAndDelete-hint-unacknowledged.yml +88 -0
  409. data/spec/spec_tests/data/crud_unified/findOneAndDelete-hint.yml +102 -0
  410. data/spec/spec_tests/data/crud_unified/findOneAndDelete-let.yml +2 -4
  411. data/spec/spec_tests/data/crud_unified/findOneAndReplace-comment.yml +101 -0
  412. data/spec/spec_tests/data/crud_unified/findOneAndReplace-dots_and_dollars.yml +140 -0
  413. data/spec/spec_tests/data/crud_unified/findOneAndReplace-hint-clientError.yml +83 -0
  414. data/spec/spec_tests/data/crud_unified/findOneAndReplace-hint-serverError.yml +99 -0
  415. data/spec/spec_tests/data/crud_unified/findOneAndReplace-hint-unacknowledged.yml +96 -0
  416. data/spec/spec_tests/data/crud_unified/findOneAndReplace-hint.yml +98 -0
  417. data/spec/spec_tests/data/crud_unified/findOneAndUpdate-comment.yml +95 -0
  418. data/spec/spec_tests/data/crud_unified/findOneAndUpdate-dots_and_dollars.yml +127 -0
  419. data/spec/spec_tests/data/crud_unified/findOneAndUpdate-hint-clientError.yml +84 -0
  420. data/spec/spec_tests/data/crud_unified/findOneAndUpdate-hint-serverError.yml +100 -0
  421. data/spec/spec_tests/data/crud_unified/findOneAndUpdate-hint-unacknowledged.yml +92 -0
  422. data/spec/spec_tests/data/crud_unified/findOneAndUpdate-hint.yml +99 -0
  423. data/spec/spec_tests/data/crud_unified/insertMany-comment.yml +93 -0
  424. data/spec/spec_tests/data/crud_unified/insertMany-dots_and_dollars.yml +128 -0
  425. data/spec/spec_tests/data/crud_unified/insertOne-comment.yml +91 -0
  426. data/spec/spec_tests/data/crud_unified/insertOne-dots_and_dollars.yml +238 -0
  427. data/spec/spec_tests/data/crud_unified/replaceOne-comment.yml +105 -0
  428. data/spec/spec_tests/data/crud_unified/replaceOne-dots_and_dollars.yml +180 -0
  429. data/spec/spec_tests/data/crud_unified/replaceOne-hint-unacknowledged.yml +95 -0
  430. data/spec/spec_tests/data/crud_unified/replaceOne-hint.yml +108 -0
  431. data/spec/spec_tests/data/crud_unified/replaceOne-let.yml +98 -0
  432. data/spec/spec_tests/data/crud_unified/replaceOne-validation.yml +37 -0
  433. data/spec/spec_tests/data/crud_unified/updateMany-comment.yml +104 -0
  434. data/spec/spec_tests/data/crud_unified/updateMany-dots_and_dollars.yml +138 -0
  435. data/spec/spec_tests/data/crud_unified/updateMany-hint-clientError.yml +91 -0
  436. data/spec/spec_tests/data/crud_unified/updateMany-hint-serverError.yml +115 -0
  437. data/spec/spec_tests/data/crud_unified/updateMany-hint-unacknowledged.yml +96 -0
  438. data/spec/spec_tests/data/crud_unified/updateMany-hint.yml +115 -0
  439. data/spec/spec_tests/data/crud_unified/updateMany-let.yml +5 -1
  440. data/spec/spec_tests/data/crud_unified/updateMany-validation.yml +39 -0
  441. data/spec/spec_tests/data/crud_unified/updateOne-comment.yml +104 -0
  442. data/spec/spec_tests/data/crud_unified/updateOne-dots_and_dollars.yml +138 -0
  443. data/spec/spec_tests/data/crud_unified/updateOne-hint-clientError.yml +85 -0
  444. data/spec/spec_tests/data/crud_unified/updateOne-hint-serverError.yml +109 -0
  445. data/spec/spec_tests/data/crud_unified/updateOne-hint-unacknowledged.yml +95 -0
  446. data/spec/spec_tests/data/crud_unified/updateOne-hint.yml +109 -0
  447. data/spec/spec_tests/data/crud_unified/updateOne-let.yml +5 -1
  448. data/spec/spec_tests/data/crud_unified/updateOne-validation.yml +37 -0
  449. data/spec/spec_tests/data/crud_unified/updateWithPipelines.yml +8 -14
  450. data/spec/spec_tests/data/gridfs_unified/delete.yml +198 -0
  451. data/spec/spec_tests/data/gridfs_unified/download.yml +241 -0
  452. data/spec/spec_tests/data/gridfs_unified/downloadByName.yml +159 -0
  453. data/spec/spec_tests/data/gridfs_unified/upload-disableMD5.yml +92 -0
  454. data/spec/spec_tests/data/gridfs_unified/upload.yml +288 -0
  455. data/spec/spec_tests/data/retryable_reads/{aggregate-merge.yml → legacy/aggregate-merge.yml} +0 -0
  456. data/spec/spec_tests/data/retryable_reads/{aggregate-serverErrors.yml → legacy/aggregate-serverErrors.yml} +0 -0
  457. data/spec/spec_tests/data/retryable_reads/{aggregate.yml → legacy/aggregate.yml} +0 -0
  458. data/spec/spec_tests/data/retryable_reads/{changeStreams-client.watch-serverErrors.yml → legacy/changeStreams-client.watch-serverErrors.yml} +0 -0
  459. data/spec/spec_tests/data/retryable_reads/{changeStreams-client.watch.yml → legacy/changeStreams-client.watch.yml} +0 -0
  460. data/spec/spec_tests/data/retryable_reads/{changeStreams-db.coll.watch-serverErrors.yml → legacy/changeStreams-db.coll.watch-serverErrors.yml} +0 -0
  461. data/spec/spec_tests/data/retryable_reads/{changeStreams-db.coll.watch.yml → legacy/changeStreams-db.coll.watch.yml} +0 -0
  462. data/spec/spec_tests/data/retryable_reads/{changeStreams-db.watch-serverErrors.yml → legacy/changeStreams-db.watch-serverErrors.yml} +0 -0
  463. data/spec/spec_tests/data/retryable_reads/{changeStreams-db.watch.yml → legacy/changeStreams-db.watch.yml} +0 -0
  464. data/spec/spec_tests/data/retryable_reads/{count-serverErrors.yml → legacy/count-serverErrors.yml} +0 -0
  465. data/spec/spec_tests/data/retryable_reads/{count.yml → legacy/count.yml} +0 -0
  466. data/spec/spec_tests/data/retryable_reads/{countDocuments-serverErrors.yml → legacy/countDocuments-serverErrors.yml} +0 -0
  467. data/spec/spec_tests/data/retryable_reads/{countDocuments.yml → legacy/countDocuments.yml} +0 -0
  468. data/spec/spec_tests/data/retryable_reads/{distinct-serverErrors.yml → legacy/distinct-serverErrors.yml} +0 -0
  469. data/spec/spec_tests/data/retryable_reads/{distinct.yml → legacy/distinct.yml} +0 -0
  470. data/spec/spec_tests/data/retryable_reads/{estimatedDocumentCount-serverErrors-pre4.9.yml → legacy/estimatedDocumentCount-serverErrors.yml} +0 -2
  471. data/spec/spec_tests/data/retryable_reads/{estimatedDocumentCount-pre4.9.yml → legacy/estimatedDocumentCount.yml} +0 -2
  472. data/spec/spec_tests/data/retryable_reads/{find-serverErrors.yml → legacy/find-serverErrors.yml} +0 -0
  473. data/spec/spec_tests/data/retryable_reads/{find.yml → legacy/find.yml} +0 -0
  474. data/spec/spec_tests/data/retryable_reads/{findOne-serverErrors.yml → legacy/findOne-serverErrors.yml} +0 -0
  475. data/spec/spec_tests/data/retryable_reads/{findOne.yml → legacy/findOne.yml} +0 -0
  476. data/spec/spec_tests/data/retryable_reads/{gridfs-download-serverErrors.yml → legacy/gridfs-download-serverErrors.yml} +0 -0
  477. data/spec/spec_tests/data/retryable_reads/{gridfs-download.yml → legacy/gridfs-download.yml} +0 -0
  478. data/spec/spec_tests/data/retryable_reads/{gridfs-downloadByName-serverErrors.yml → legacy/gridfs-downloadByName-serverErrors.yml} +0 -0
  479. data/spec/spec_tests/data/retryable_reads/{gridfs-downloadByName.yml → legacy/gridfs-downloadByName.yml} +0 -0
  480. data/spec/spec_tests/data/retryable_reads/{listCollectionNames-serverErrors.yml → legacy/listCollectionNames-serverErrors.yml} +0 -0
  481. data/spec/spec_tests/data/retryable_reads/{listCollectionNames.yml → legacy/listCollectionNames.yml} +0 -0
  482. data/spec/spec_tests/data/retryable_reads/{listCollectionObjects-serverErrors.yml → legacy/listCollectionObjects-serverErrors.yml} +0 -0
  483. data/spec/spec_tests/data/retryable_reads/{listCollectionObjects.yml → legacy/listCollectionObjects.yml} +0 -0
  484. data/spec/spec_tests/data/retryable_reads/{listCollections-serverErrors.yml → legacy/listCollections-serverErrors.yml} +0 -0
  485. data/spec/spec_tests/data/retryable_reads/{listCollections.yml → legacy/listCollections.yml} +0 -0
  486. data/spec/spec_tests/data/retryable_reads/{listDatabaseNames-serverErrors.yml → legacy/listDatabaseNames-serverErrors.yml} +0 -0
  487. data/spec/spec_tests/data/retryable_reads/{listDatabaseNames.yml → legacy/listDatabaseNames.yml} +0 -0
  488. data/spec/spec_tests/data/retryable_reads/{listDatabaseObjects-serverErrors.yml → legacy/listDatabaseObjects-serverErrors.yml} +0 -0
  489. data/spec/spec_tests/data/retryable_reads/{listDatabaseObjects.yml → legacy/listDatabaseObjects.yml} +0 -0
  490. data/spec/spec_tests/data/retryable_reads/{listDatabases-serverErrors.yml → legacy/listDatabases-serverErrors.yml} +0 -0
  491. data/spec/spec_tests/data/retryable_reads/{listDatabases.yml → legacy/listDatabases.yml} +0 -0
  492. data/spec/spec_tests/data/retryable_reads/{listIndexNames-serverErrors.yml → legacy/listIndexNames-serverErrors.yml} +0 -0
  493. data/spec/spec_tests/data/retryable_reads/{listIndexNames.yml → legacy/listIndexNames.yml} +0 -0
  494. data/spec/spec_tests/data/retryable_reads/{listIndexes-serverErrors.yml → legacy/listIndexes-serverErrors.yml} +0 -0
  495. data/spec/spec_tests/data/retryable_reads/{listIndexes.yml → legacy/listIndexes.yml} +0 -0
  496. data/spec/spec_tests/data/retryable_reads/{mapReduce.yml → legacy/mapReduce.yml} +0 -0
  497. data/spec/spec_tests/data/retryable_reads/unified/handshakeError.yml +129 -0
  498. data/spec/spec_tests/data/retryable_writes/{bulkWrite-errorLabels.yml → legacy/bulkWrite-errorLabels.yml} +0 -0
  499. data/spec/spec_tests/data/retryable_writes/{bulkWrite-serverErrors.yml → legacy/bulkWrite-serverErrors.yml} +1 -1
  500. data/spec/spec_tests/data/retryable_writes/{bulkWrite.yml → legacy/bulkWrite.yml} +0 -0
  501. data/spec/spec_tests/data/retryable_writes/{deleteMany.yml → legacy/deleteMany.yml} +0 -0
  502. data/spec/spec_tests/data/retryable_writes/{deleteOne-errorLabels.yml → legacy/deleteOne-errorLabels.yml} +0 -0
  503. data/spec/spec_tests/data/retryable_writes/{deleteOne-serverErrors.yml → legacy/deleteOne-serverErrors.yml} +1 -1
  504. data/spec/spec_tests/data/retryable_writes/{deleteOne.yml → legacy/deleteOne.yml} +0 -0
  505. data/spec/spec_tests/data/retryable_writes/{findOneAndDelete-errorLabels.yml → legacy/findOneAndDelete-errorLabels.yml} +0 -0
  506. data/spec/spec_tests/data/retryable_writes/{findOneAndDelete-serverErrors.yml → legacy/findOneAndDelete-serverErrors.yml} +1 -1
  507. data/spec/spec_tests/data/retryable_writes/{findOneAndDelete.yml → legacy/findOneAndDelete.yml} +0 -0
  508. data/spec/spec_tests/data/retryable_writes/{findOneAndReplace-errorLabels.yml → legacy/findOneAndReplace-errorLabels.yml} +0 -0
  509. data/spec/spec_tests/data/retryable_writes/{findOneAndReplace-serverErrors.yml → legacy/findOneAndReplace-serverErrors.yml} +1 -1
  510. data/spec/spec_tests/data/retryable_writes/{findOneAndReplace.yml → legacy/findOneAndReplace.yml} +0 -0
  511. data/spec/spec_tests/data/retryable_writes/{findOneAndUpdate-errorLabels.yml → legacy/findOneAndUpdate-errorLabels.yml} +0 -0
  512. data/spec/spec_tests/data/retryable_writes/{findOneAndUpdate-serverErrors.yml → legacy/findOneAndUpdate-serverErrors.yml} +1 -1
  513. data/spec/spec_tests/data/retryable_writes/{findOneAndUpdate.yml → legacy/findOneAndUpdate.yml} +0 -0
  514. data/spec/spec_tests/data/retryable_writes/{insertMany-errorLabels.yml → legacy/insertMany-errorLabels.yml} +0 -0
  515. data/spec/spec_tests/data/retryable_writes/{insertMany-serverErrors.yml → legacy/insertMany-serverErrors.yml} +1 -1
  516. data/spec/spec_tests/data/retryable_writes/{insertMany.yml → legacy/insertMany.yml} +0 -0
  517. data/spec/spec_tests/data/retryable_writes/{insertOne-errorLabels.yml → legacy/insertOne-errorLabels.yml} +0 -0
  518. data/spec/spec_tests/data/retryable_writes/{insertOne-serverErrors.yml → legacy/insertOne-serverErrors.yml} +5 -5
  519. data/spec/spec_tests/data/retryable_writes/{insertOne.yml → legacy/insertOne.yml} +0 -0
  520. data/spec/spec_tests/data/retryable_writes/{replaceOne-errorLabels.yml → legacy/replaceOne-errorLabels.yml} +0 -0
  521. data/spec/spec_tests/data/retryable_writes/{replaceOne-serverErrors.yml → legacy/replaceOne-serverErrors.yml} +1 -1
  522. data/spec/spec_tests/data/retryable_writes/{replaceOne.yml → legacy/replaceOne.yml} +0 -0
  523. data/spec/spec_tests/data/retryable_writes/{updateMany.yml → legacy/updateMany.yml} +0 -0
  524. data/spec/spec_tests/data/retryable_writes/{updateOne-errorLabels.yml → legacy/updateOne-errorLabels.yml} +0 -0
  525. data/spec/spec_tests/data/retryable_writes/{updateOne-serverErrors.yml → legacy/updateOne-serverErrors.yml} +1 -1
  526. data/spec/spec_tests/data/retryable_writes/{updateOne.yml → legacy/updateOne.yml} +0 -0
  527. data/spec/spec_tests/data/retryable_writes/unified/bulkWrite-serverErrors.yml +96 -0
  528. data/spec/spec_tests/data/retryable_writes/unified/handshakeError.yml +137 -0
  529. data/spec/spec_tests/data/retryable_writes/unified/insertOne-serverErrors.yml +78 -0
  530. data/spec/spec_tests/data/sdam/errors/prefer-error-code.yml +2 -2
  531. data/spec/spec_tests/data/sdam_integration/hello-command-error.yml +6 -14
  532. data/spec/spec_tests/data/sdam_integration/hello-network-error.yml +4 -14
  533. data/spec/spec_tests/data/sdam_integration/hello-timeout.yml +8 -14
  534. data/spec/spec_tests/data/seed_list_discovery/load-balanced/loadBalanced-no-results.yml +5 -0
  535. data/spec/spec_tests/data/seed_list_discovery/load-balanced/srvMaxHosts-conflicts_with_loadBalanced-true-txt.yml +5 -0
  536. data/spec/spec_tests/data/seed_list_discovery/load-balanced/srvMaxHosts-conflicts_with_loadBalanced-true.yml +5 -0
  537. data/spec/spec_tests/data/seed_list_discovery/load-balanced/srvMaxHosts-zero-txt.yml +10 -0
  538. data/spec/spec_tests/data/seed_list_discovery/load-balanced/srvMaxHosts-zero.yml +10 -0
  539. data/spec/spec_tests/data/seed_list_discovery/replica-set/srv-service-name.yml +11 -0
  540. data/spec/spec_tests/data/seed_list_discovery/replica-set/srvMaxHosts-conflicts_with_replicaSet-txt.yml +5 -0
  541. data/spec/spec_tests/data/seed_list_discovery/replica-set/srvMaxHosts-conflicts_with_replicaSet.yml +5 -0
  542. data/spec/spec_tests/data/seed_list_discovery/replica-set/srvMaxHosts-equal_to_srv_records.yml +16 -0
  543. data/spec/spec_tests/data/seed_list_discovery/replica-set/srvMaxHosts-greater_than_srv_records.yml +15 -0
  544. data/spec/spec_tests/data/seed_list_discovery/replica-set/srvMaxHosts-less_than_srv_records.yml +15 -0
  545. data/spec/spec_tests/data/seed_list_discovery/replica-set/srvMaxHosts-zero-txt.yml +15 -0
  546. data/spec/spec_tests/data/seed_list_discovery/replica-set/srvMaxHosts-zero.yml +15 -0
  547. data/spec/spec_tests/data/seed_list_discovery/sharded/srvMaxHosts-equal_to_srv_records.yml +13 -0
  548. data/spec/spec_tests/data/seed_list_discovery/sharded/srvMaxHosts-greater_than_srv_records.yml +12 -0
  549. data/spec/spec_tests/data/seed_list_discovery/sharded/srvMaxHosts-less_than_srv_records.yml +10 -0
  550. data/spec/spec_tests/data/seed_list_discovery/sharded/srvMaxHosts-zero.yml +11 -0
  551. data/spec/spec_tests/data/server_selection/Unknown/read/ghost.yml +11 -0
  552. data/spec/spec_tests/data/server_selection/Unknown/write/ghost.yml +11 -0
  553. data/spec/spec_tests/data/sessions_unified/driver-sessions-server-support.yml +123 -0
  554. data/spec/spec_tests/data/sessions_unified/snapshot-sessions-not-supported-client-error.yml +9 -3
  555. data/spec/spec_tests/data/transactions/error-labels.yml +1 -1
  556. data/spec/spec_tests/data/transactions/errors-client.yml +8 -9
  557. data/spec/spec_tests/data/transactions/mongos-recovery-token.yml +1 -1
  558. data/spec/spec_tests/data/transactions/retryable-abort-errorLabels.yml +0 -2
  559. data/spec/spec_tests/data/transactions/retryable-abort.yml +7 -9
  560. data/spec/spec_tests/data/transactions/retryable-commit-errorLabels.yml +0 -2
  561. data/spec/spec_tests/data/transactions/retryable-commit.yml +7 -9
  562. data/spec/spec_tests/data/transactions/retryable-writes.yml +0 -2
  563. data/spec/spec_tests/data/transactions_unified/do-not-retry-read-in-transaction.yml +64 -0
  564. data/spec/spec_tests/data/transactions_unified/retryable-abort-handshake.yml +118 -0
  565. data/spec/spec_tests/data/transactions_unified/retryable-commit-handshake.yml +118 -0
  566. data/spec/spec_tests/data/unified/invalid/expectedEventsForClient-ignoreExtraEvents-type.yml +15 -0
  567. data/spec/spec_tests/data/unified/valid-fail/operation-unsupported.yml +13 -0
  568. data/spec/spec_tests/data/unified/valid-pass/expectedEventsForClient-ignoreExtraEvents.yml +78 -0
  569. data/spec/spec_tests/data/unified/valid-pass/poc-change-streams.yml +4 -1
  570. data/spec/spec_tests/data/unified/valid-pass/poc-command-monitoring.yml +3 -3
  571. data/spec/spec_tests/data/unified/valid-pass/poc-transactions.yml +3 -2
  572. data/spec/spec_tests/data/uri_options/srv-options.yml +96 -0
  573. data/spec/spec_tests/data/versioned_api/crud-api-version-1-strict.yml +6 -4
  574. data/spec/spec_tests/data/versioned_api/crud-api-version-1.yml +7 -5
  575. data/spec/spec_tests/gridfs_unified_spec.rb +13 -0
  576. data/spec/spec_tests/retryable_reads_spec.rb +4 -1
  577. data/spec/spec_tests/retryable_reads_unified_spec.rb +22 -0
  578. data/spec/spec_tests/retryable_writes_spec.rb +4 -1
  579. data/spec/spec_tests/retryable_writes_unified_spec.rb +21 -0
  580. data/spec/spec_tests/seed_list_discovery_spec.rb +10 -1
  581. data/spec/spec_tests/unified_spec.rb +6 -1
  582. data/spec/stress/connection_pool_timing_spec.rb +3 -2
  583. data/spec/stress/fork_reconnect_stress_spec.rb +3 -2
  584. data/spec/support/authorization.rb +1 -1
  585. data/spec/support/background_thread_registry.rb +3 -13
  586. data/spec/support/certificates/retrieve-atlas-cert +38 -0
  587. data/spec/support/cluster_tools.rb +1 -1
  588. data/spec/support/common_shortcuts.rb +22 -0
  589. data/spec/support/crypt/corpus/corpus-encrypted.json +9515 -0
  590. data/spec/support/crypt/corpus/corpus-key-aws.json +32 -32
  591. data/spec/support/crypt/corpus/corpus-key-azure.json +33 -0
  592. data/spec/support/crypt/corpus/corpus-key-gcp.json +35 -0
  593. data/spec/support/crypt/corpus/corpus-key-kmip.json +32 -0
  594. data/spec/support/crypt/corpus/corpus-key-local.json +30 -30
  595. data/spec/support/crypt/corpus/corpus-schema.json +4399 -121
  596. data/spec/support/crypt/corpus/corpus.json +4999 -37
  597. data/spec/support/crypt/data_keys/key_document_azure.json +33 -0
  598. data/spec/support/crypt/data_keys/key_document_gcp.json +37 -0
  599. data/spec/support/crypt/data_keys/key_document_kmip.json +32 -0
  600. data/spec/support/crypt/encryptedFields.json +33 -0
  601. data/spec/support/crypt/keys/key1-document.json +30 -0
  602. data/spec/support/crypt/schema_maps/schema_map_azure.json +17 -0
  603. data/spec/support/crypt/schema_maps/schema_map_azure_key_alt_names.json +12 -0
  604. data/spec/support/crypt/schema_maps/schema_map_gcp.json +17 -0
  605. data/spec/support/crypt/schema_maps/schema_map_gcp_key_alt_names.json +12 -0
  606. data/spec/support/crypt/schema_maps/schema_map_kmip.json +17 -0
  607. data/spec/support/crypt/schema_maps/schema_map_kmip_key_alt_names.json +12 -0
  608. data/spec/support/crypt.rb +258 -13
  609. data/spec/support/macros.rb +28 -0
  610. data/spec/support/mongos_macros.rb +17 -0
  611. data/spec/support/shared/scram_conversation.rb +2 -1
  612. data/spec/support/shared/session.rb +13 -7
  613. data/spec/support/spec_config.rb +90 -1
  614. data/spec/support/utils.rb +25 -4
  615. data.tar.gz.sig +0 -0
  616. metadata +604 -290
  617. metadata.gz.sig +0 -0
  618. data/lib/mongo/operation/delete/legacy.rb +0 -64
  619. data/lib/mongo/operation/insert/legacy.rb +0 -68
  620. data/lib/mongo/operation/update/legacy/result.rb +0 -112
  621. data/lib/mongo/operation/update/legacy.rb +0 -76
  622. data/spec/mongo/dbref_spec.rb +0 -152
  623. data/spec/mongo/operation/kill_cursors_spec.rb +0 -47
  624. data/spec/spec_tests/change_streams_spec.rb +0 -93
  625. data/spec/spec_tests/command_monitoring_spec.rb +0 -71
  626. data/spec/spec_tests/data/change_streams/change-streams-errors.yml +0 -101
  627. data/spec/spec_tests/data/change_streams/change-streams-resume-allowlist.yml +0 -1173
  628. data/spec/spec_tests/data/change_streams/change-streams-resume-errorLabels.yml +0 -1105
  629. data/spec/spec_tests/data/change_streams/change-streams.yml +0 -535
  630. data/spec/spec_tests/data/command_monitoring/bulkWrite.yml +0 -49
  631. data/spec/spec_tests/data/command_monitoring/command.yml +0 -61
  632. data/spec/spec_tests/data/command_monitoring/deleteMany.yml +0 -55
  633. data/spec/spec_tests/data/command_monitoring/deleteOne.yml +0 -55
  634. data/spec/spec_tests/data/command_monitoring/find.yml +0 -266
  635. data/spec/spec_tests/data/command_monitoring/insertMany.yml +0 -75
  636. data/spec/spec_tests/data/command_monitoring/insertOne.yml +0 -51
  637. data/spec/spec_tests/data/command_monitoring/unacknowledgedBulkWrite.yml +0 -34
  638. data/spec/spec_tests/data/command_monitoring/updateMany.yml +0 -65
  639. data/spec/spec_tests/data/command_monitoring/updateOne.yml +0 -90
  640. data/spec/spec_tests/data/crud_v2/aggregate-merge.yml +0 -103
  641. data/spec/spec_tests/data/crud_v2/aggregate-out-readConcern.yml +0 -111
  642. data/spec/spec_tests/data/crud_v2/bulkWrite-arrayFilters.yml +0 -103
  643. data/spec/spec_tests/data/crud_v2/bulkWrite-delete-hint-clientError.yml +0 -63
  644. data/spec/spec_tests/data/crud_v2/bulkWrite-delete-hint-serverError.yml +0 -92
  645. data/spec/spec_tests/data/crud_v2/bulkWrite-delete-hint.yml +0 -103
  646. data/spec/spec_tests/data/crud_v2/bulkWrite-update-hint-clientError.yml +0 -90
  647. data/spec/spec_tests/data/crud_v2/bulkWrite-update-hint-serverError.yml +0 -147
  648. data/spec/spec_tests/data/crud_v2/bulkWrite-update-hint.yml +0 -164
  649. data/spec/spec_tests/data/crud_v2/db-aggregate.yml +0 -39
  650. data/spec/spec_tests/data/crud_v2/deleteMany-hint-clientError.yml +0 -43
  651. data/spec/spec_tests/data/crud_v2/deleteMany-hint-serverError.yml +0 -62
  652. data/spec/spec_tests/data/crud_v2/deleteMany-hint.yml +0 -58
  653. data/spec/spec_tests/data/crud_v2/deleteOne-hint-clientError.yml +0 -41
  654. data/spec/spec_tests/data/crud_v2/deleteOne-hint-serverError.yml +0 -60
  655. data/spec/spec_tests/data/crud_v2/deleteOne-hint.yml +0 -57
  656. data/spec/spec_tests/data/crud_v2/find-allowdiskuse-clientError.yml +0 -28
  657. data/spec/spec_tests/data/crud_v2/find-allowdiskuse-serverError.yml +0 -44
  658. data/spec/spec_tests/data/crud_v2/find-allowdiskuse.yml +0 -50
  659. data/spec/spec_tests/data/crud_v2/findOneAndDelete-hint-clientError.yml +0 -45
  660. data/spec/spec_tests/data/crud_v2/findOneAndDelete-hint-serverError.yml +0 -60
  661. data/spec/spec_tests/data/crud_v2/findOneAndDelete-hint.yml +0 -56
  662. data/spec/spec_tests/data/crud_v2/findOneAndReplace-hint-clientError.yml +0 -40
  663. data/spec/spec_tests/data/crud_v2/findOneAndReplace-hint-serverError.yml +0 -59
  664. data/spec/spec_tests/data/crud_v2/findOneAndReplace-hint.yml +0 -55
  665. data/spec/spec_tests/data/crud_v2/findOneAndUpdate-hint-clientError.yml +0 -40
  666. data/spec/spec_tests/data/crud_v2/findOneAndUpdate-hint-serverError.yml +0 -58
  667. data/spec/spec_tests/data/crud_v2/findOneAndUpdate-hint.yml +0 -55
  668. data/spec/spec_tests/data/crud_v2/replaceOne-hint.yml +0 -61
  669. data/spec/spec_tests/data/crud_v2/unacknowledged-bulkWrite-delete-hint-clientError.yml +0 -60
  670. data/spec/spec_tests/data/crud_v2/unacknowledged-bulkWrite-update-hint-clientError.yml +0 -88
  671. data/spec/spec_tests/data/crud_v2/unacknowledged-deleteMany-hint-clientError.yml +0 -40
  672. data/spec/spec_tests/data/crud_v2/unacknowledged-deleteOne-hint-clientError.yml +0 -38
  673. data/spec/spec_tests/data/crud_v2/unacknowledged-findOneAndDelete-hint-clientError.yml +0 -42
  674. data/spec/spec_tests/data/crud_v2/unacknowledged-findOneAndReplace-hint-clientError.yml +0 -40
  675. data/spec/spec_tests/data/crud_v2/unacknowledged-findOneAndUpdate-hint-clientError.yml +0 -40
  676. data/spec/spec_tests/data/crud_v2/unacknowledged-replaceOne-hint-clientError.yml +0 -40
  677. data/spec/spec_tests/data/crud_v2/unacknowledged-updateMany-hint-clientError.yml +0 -43
  678. data/spec/spec_tests/data/crud_v2/unacknowledged-updateOne-hint-clientError.yml +0 -40
  679. data/spec/spec_tests/data/crud_v2/updateMany-hint-clientError.yml +0 -45
  680. data/spec/spec_tests/data/crud_v2/updateMany-hint-serverError.yml +0 -66
  681. data/spec/spec_tests/data/crud_v2/updateMany-hint.yml +0 -65
  682. data/spec/spec_tests/data/crud_v2/updateOne-hint-clientError.yml +0 -43
  683. data/spec/spec_tests/data/crud_v2/updateOne-hint-serverError.yml +0 -62
  684. data/spec/spec_tests/data/crud_v2/updateOne-hint.yml +0 -61
  685. data/spec/spec_tests/data/crud_v2/updateWithPipelines.yml +0 -157
  686. data/spec/spec_tests/data/retryable_reads/estimatedDocumentCount-4.9.yml +0 -60
  687. data/spec/spec_tests/data/retryable_reads/estimatedDocumentCount-serverErrors-4.9.yml +0 -146
  688. data/spec/support/crypt/corpus/corpus_encrypted.json +0 -4152
  689. data/spec/support/session_registry.rb +0 -55
@@ -18,6 +18,22 @@ describe 'Bulk writes' do
18
18
  authorized_collection.bulk_write(operations)
19
19
  end.not_to raise_error
20
20
  end
21
+
22
+ context 'in transaction' do
23
+ require_transaction_support
24
+ min_server_version "4.4"
25
+
26
+ it 'succeeds' do
27
+ authorized_collection.create
28
+ expect do
29
+ authorized_collection.client.start_session do |session|
30
+ session.with_transaction do
31
+ authorized_collection.bulk_write(operations, { session: session })
32
+ end
33
+ end
34
+ end.not_to raise_error
35
+ end
36
+ end
21
37
  end
22
38
 
23
39
  context 'when bulk write needs to be split' do
@@ -3,7 +3,8 @@
3
3
 
4
4
  require 'spec_helper'
5
5
 
6
- describe 'Change stream integration', retry: 4 do
6
+ describe 'Change stream integration' do
7
+ retry_test tries: 4
7
8
  require_mri
8
9
  max_example_run_time 7
9
10
  min_server_fcv '3.6'
@@ -101,7 +102,7 @@ describe 'Change stream integration', retry: 4 do
101
102
  it 'watch raises error' do
102
103
  expect do
103
104
  client['change-stream'].watch
104
- end.to raise_error(Mongo::Error::OperationFailure, /10107\b.*Failing command due to 'failCommand' failpoint/)
105
+ end.to raise_error(Mongo::Error::OperationFailure, /10107\b.*Failing command (due to|via) 'failCommand' failpoint/)
105
106
  end
106
107
  end
107
108
 
@@ -286,7 +287,7 @@ describe 'Change stream integration', retry: 4 do
286
287
 
287
288
  expect do
288
289
  enum.next
289
- end.to raise_error(Mongo::Error::OperationFailure, /101\b.*Failing command due to 'failCommand' failpoint/)
290
+ end.to raise_error(Mongo::Error::OperationFailure, /101\b.*Failing command (due to|via) 'failCommand' failpoint/)
290
291
  end
291
292
  end
292
293
  end
@@ -417,7 +418,7 @@ describe 'Change stream integration', retry: 4 do
417
418
 
418
419
  expect do
419
420
  enum.try_next
420
- end.to raise_error(Mongo::Error::OperationFailure, /10107\b.*Failing command due to 'failCommand' failpoint/)
421
+ end.to raise_error(Mongo::Error::OperationFailure, /10107\b.*Failing command (due to|via) 'failCommand' failpoint/)
421
422
  end
422
423
  end
423
424
 
@@ -444,7 +445,7 @@ describe 'Change stream integration', retry: 4 do
444
445
 
445
446
  expect do
446
447
  enum.try_next
447
- end.to raise_error(Mongo::Error::OperationFailure, /10107\b.*Failing command due to 'failCommand' failpoint/)
448
+ end.to raise_error(Mongo::Error::OperationFailure, /10107\b.*Failing command (due to|via) 'failCommand' failpoint/)
448
449
  end
449
450
  end
450
451
  end
@@ -184,23 +184,89 @@ describe 'Client construction' do
184
184
  it 'raises an exception' do
185
185
  expect do
186
186
  client
187
- 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/)
187
+ end.to raise_error(ArgumentError, /The access_key_id option must be a String with at least one character; it is currently an empty string/)
188
188
  end
189
189
  end
190
190
 
191
191
  context 'with default key vault client' do
192
192
  let(:key_vault_client) { nil }
193
193
 
194
- it 'creates a working key vault client' do
195
- key_vault_client = client.encrypter.key_vault_client
194
+ shared_examples 'creates a working key vault client' do
195
+ it 'creates a working key vault client' do
196
+ key_vault_client = client.encrypter.key_vault_client
196
197
 
197
- result = key_vault_client[:test].insert_one(test: 1)
198
- expect(result).to be_ok
198
+ result = key_vault_client[:test].insert_one(test: 1)
199
+ expect(result).to be_ok
200
+ end
199
201
  end
200
202
 
201
- it 'creates a key vault client with the same cluster as the existing client' do
202
- key_vault_client = client.encrypter.key_vault_client
203
- expect(key_vault_client.cluster).to eq(client.cluster)
203
+ context 'when top-level max pool size is not 0' do
204
+ include_examples 'creates a working key vault client'
205
+
206
+ shared_examples 'limited connection pool' do
207
+ it 'creates a key vault client with a different cluster than the existing client' do
208
+ key_vault_client = client.encrypter.key_vault_client
209
+ expect(key_vault_client.cluster).not_to eq(client.cluster)
210
+ end
211
+
212
+ # min pool size for the key vault client can be greater than 0
213
+ # when the key vault client is the same as the top-level client.
214
+ # This is OK because we aren't making any more connections for FLE,
215
+ # the minimum was requested by application for its own needs.
216
+ it 'uses min pool size 0 for key vault client' do
217
+ key_vault_client = client.encrypter.key_vault_client
218
+ key_vault_client.options[:min_pool_size].should be 0
219
+ end
220
+ end
221
+
222
+ context 'when top-level max pool size is not specified' do
223
+ before do
224
+ client.options[:max_pool_size].should be nil
225
+ end
226
+
227
+ include_examples 'limited connection pool'
228
+
229
+ it 'uses unspecified max pool size for key vault client' do
230
+ key_vault_client = client.encrypter.key_vault_client
231
+ key_vault_client.options[:max_pool_size].should be nil
232
+ end
233
+ end
234
+
235
+ context 'when top-level max pool size is specified' do
236
+ let(:options) do
237
+ {
238
+ auto_encryption_options: auto_encryption_options,
239
+ max_pool_size: 42,
240
+ }
241
+ end
242
+
243
+ include_examples 'limited connection pool'
244
+
245
+ it 'uses the same max pool size for key vault client' do
246
+ key_vault_client = client.encrypter.key_vault_client
247
+ key_vault_client.options[:max_pool_size].should be 42
248
+ end
249
+ end
250
+ end
251
+
252
+ context 'when top-level max pool size is 0' do
253
+ let(:options) do
254
+ {
255
+ auto_encryption_options: auto_encryption_options,
256
+ max_pool_size: 0,
257
+ }
258
+ end
259
+
260
+ before do
261
+ client.options[:max_pool_size].should be 0
262
+ end
263
+
264
+ include_examples 'creates a working key vault client'
265
+
266
+ it 'creates a key vault client with the same cluster as the existing client' do
267
+ key_vault_client = client.encrypter.key_vault_client
268
+ expect(key_vault_client.cluster).to eq(client.cluster)
269
+ end
204
270
  end
205
271
  end
206
272
  end
@@ -132,8 +132,8 @@ describe 'Bulk writes with auto-encryption enabled' do
132
132
  context 'when total request size does not exceed 2MiB' do
133
133
  let(:requests) do
134
134
  [
135
- { update_one: { filter: { _id: 1 }, update: { ssn: 'a' * (size_limit/2) } } },
136
- { update_one: { filter: { _id: 2 }, update: { ssn: 'a' * (size_limit/2) } } },
135
+ { replace_one: { filter: { _id: 1 }, replacement: { ssn: 'a' * (size_limit/2) } } },
136
+ { replace_one: { filter: { _id: 2 }, replacement: { ssn: 'a' * (size_limit/2) } } },
137
137
  ]
138
138
  end
139
139
 
@@ -143,8 +143,8 @@ describe 'Bulk writes with auto-encryption enabled' do
143
143
  context 'when each operation is smaller than 2MiB, but the total request size is greater than 2MiB' do
144
144
  let(:requests) do
145
145
  [
146
- { update_one: { filter: { _id: 1 }, update: { ssn: 'a' * (size_limit - 2000) } } },
147
- { update_one: { filter: { _id: 2 }, update: { ssn: 'a' * (size_limit - 2000) } } },
146
+ { replace_one: { filter: { _id: 1 }, replacement: { ssn: 'a' * (size_limit - 2000) } } },
147
+ { replace_one: { filter: { _id: 2 }, replacement: { ssn: 'a' * (size_limit - 2000) } } },
148
148
  ]
149
149
  end
150
150
 
@@ -154,8 +154,8 @@ describe 'Bulk writes with auto-encryption enabled' do
154
154
  context 'when each operation is larger than 2MiB' do
155
155
  let(:requests) do
156
156
  [
157
- { update_one: { filter: { _id: 1 }, update: { ssn: 'a' * (size_limit * 2) } } },
158
- { update_one: { filter: { _id: 2 }, update: { ssn: 'a' * (size_limit * 2) } } },
157
+ { replace_one: { filter: { _id: 1 }, replacement: { ssn: 'a' * (size_limit * 2) } } },
158
+ { replace_one: { filter: { _id: 2 }, replacement: { ssn: 'a' * (size_limit * 2) } } },
159
159
  ]
160
160
  end
161
161
 
@@ -165,8 +165,8 @@ describe 'Bulk writes with auto-encryption enabled' do
165
165
  context 'when one operation is larger than 16MiB' do
166
166
  let(:requests) do
167
167
  [
168
- { update_one: { filter: { _id: 1 }, update: { ssn: 'a' * (Mongo::Server::ConnectionBase::DEFAULT_MAX_BSON_OBJECT_SIZE) } } },
169
- { update_one: { filter: { _id: 2 }, update: { ssn: 'a' * size_limit } } },
168
+ { replace_one: { filter: { _id: 1 }, replacement: { ssn: 'a' * (Mongo::Server::ConnectionBase::DEFAULT_MAX_BSON_OBJECT_SIZE) } } },
169
+ { replace_one: { filter: { _id: 2 }, replacement: { ssn: 'a' * size_limit } } },
170
170
  ]
171
171
  end
172
172
 
@@ -272,7 +272,7 @@ describe 'Bulk writes with auto-encryption enabled' do
272
272
  let(:requests) do
273
273
  [
274
274
  { insert_one: { _id: 1, ssn: 'a' * (size_limit/3) } },
275
- { update_one: { filter: { _id: 1 }, update: { ssn: 'b' * (size_limit/3) } } },
275
+ { replace_one: { filter: { _id: 1 }, replacement: { ssn: 'b' * (size_limit/3) } } },
276
276
  { delete_one: { filter: { ssn: 'b' * (size_limit/3) } } }
277
277
  ]
278
278
  end
@@ -41,19 +41,14 @@ describe 'Auto Encryption' do
41
41
  key_vault_collection.insert_one(data_key)
42
42
 
43
43
  encryption_client['users'].drop
44
- result = encryption_client['users'].insert_one(ssn: ssn, age: 23)
45
44
  end
46
45
 
47
46
  let(:started_event) do
48
- subscriber.started_events.find do |event|
49
- event.command_name == command_name && event.database_name == db_name
50
- end
47
+ subscriber.single_command_started_event(command_name, database_name: db_name)
51
48
  end
52
49
 
53
50
  let(:succeeded_event) do
54
- subscriber.succeeded_events.find do |event|
55
- event.command_name == command_name && event.database_name == db_name
56
- end
51
+ subscriber.single_command_succeeded_event(command_name, database_name: db_name)
57
52
  end
58
53
 
59
54
  let(:key_vault_list_collections_event) do
@@ -62,245 +57,250 @@ describe 'Auto Encryption' do
62
57
  end
63
58
  end
64
59
 
65
- shared_examples 'it has an encrypted key_vault_client' do
66
- it 'registers a listCollections event on the key vault client' do
67
- expect(key_vault_list_collections_event).not_to be_nil
68
- expect(key_vault_list_collections_event.command['$db']).to eq(key_vault_db)
60
+ shared_examples 'it has a non-encrypted key_vault_client' do
61
+ it 'does not register a listCollections event on the key vault client' do
62
+ expect(key_vault_list_collections_event).to be_nil
69
63
  end
70
64
  end
71
65
 
72
- describe '#aggregate' do
73
- let(:command_name) { 'aggregate' }
74
-
66
+ context 'when performing operations that need a document in the database' do
75
67
  before do
76
- encryption_client['users'].aggregate([{ '$match' => { 'ssn' => ssn } }]).first
68
+ result = encryption_client['users'].insert_one(ssn: ssn, age: 23)
77
69
  end
78
70
 
79
- it 'has encrypted data in command monitoring' do
80
- # Command started event occurs after ssn is encrypted
81
- expect(
82
- started_event.command["pipeline"].first["$match"]["ssn"]["$eq"]
83
- ).to be_ciphertext
71
+ describe '#aggregate' do
72
+ let(:command_name) { 'aggregate' }
84
73
 
85
- # Command succeeded event occurs before ssn is decrypted
86
- expect(succeeded_event.reply["cursor"]["firstBatch"].first["ssn"]).to be_ciphertext
87
- end
74
+ before do
75
+ encryption_client['users'].aggregate([{ '$match' => { 'ssn' => ssn } }]).first
76
+ end
88
77
 
89
- it_behaves_like 'it has an encrypted key_vault_client'
90
- end
78
+ it 'has encrypted data in command monitoring' do
79
+ # Command started event occurs after ssn is encrypted
80
+ expect(
81
+ started_event.command["pipeline"].first["$match"]["ssn"]["$eq"]
82
+ ).to be_ciphertext
91
83
 
92
- describe '#count' do
93
- let(:command_name) { 'count' }
84
+ # Command succeeded event occurs before ssn is decrypted
85
+ expect(succeeded_event.reply["cursor"]["firstBatch"].first["ssn"]).to be_ciphertext
86
+ end
94
87
 
95
- before do
96
- encryption_client['users'].count(ssn: ssn)
88
+ it_behaves_like 'it has a non-encrypted key_vault_client'
97
89
  end
98
90
 
99
- it 'has encrypted data in command monitoring' do
100
- # Command started event occurs after ssn is encrypted
101
- # Command succeeded event does not contain any data to be decrypted
102
- expect(started_event.command["query"]["ssn"]["$eq"]).to be_ciphertext
103
- end
91
+ describe '#count' do
92
+ let(:command_name) { 'count' }
104
93
 
105
- it_behaves_like 'it has an encrypted key_vault_client'
106
- end
94
+ before do
95
+ encryption_client['users'].count(ssn: ssn)
96
+ end
107
97
 
108
- describe '#distinct' do
109
- let(:command_name) { 'distinct' }
98
+ it 'has encrypted data in command monitoring' do
99
+ # Command started event occurs after ssn is encrypted
100
+ # Command succeeded event does not contain any data to be decrypted
101
+ expect(started_event.command["query"]["ssn"]["$eq"]).to be_ciphertext
102
+ end
110
103
 
111
- before do
112
- encryption_client['users'].distinct(:ssn)
104
+ it_behaves_like 'it has a non-encrypted key_vault_client'
113
105
  end
114
106
 
115
- it 'has encrypted data in command monitoring' do
116
- # Command started event does not contain any data to be encrypted
117
- # Command succeeded event occurs before ssn is decrypted
118
- expect(succeeded_event.reply["values"].first).to be_ciphertext
119
- end
107
+ describe '#distinct' do
108
+ let(:command_name) { 'distinct' }
120
109
 
121
- it_behaves_like 'it has an encrypted key_vault_client'
122
- end
110
+ before do
111
+ encryption_client['users'].distinct(:ssn)
112
+ end
123
113
 
124
- describe '#delete_one' do
125
- let(:command_name) { 'delete' }
114
+ it 'has encrypted data in command monitoring' do
115
+ # Command started event does not contain any data to be encrypted
116
+ # Command succeeded event occurs before ssn is decrypted
117
+ expect(succeeded_event.reply["values"].first).to be_ciphertext
118
+ end
126
119
 
127
- before do
128
- encryption_client['users'].delete_one(ssn: ssn)
120
+ it_behaves_like 'it has a non-encrypted key_vault_client'
129
121
  end
130
122
 
131
- it 'has encrypted data in command monitoring' do
132
- # Command started event occurs after ssn is encrypted
133
- # Command succeeded event does not contain any data to be decrypted
134
- expect(started_event.command["deletes"].first["q"]["ssn"]["$eq"]).to be_ciphertext
135
- end
123
+ describe '#delete_one' do
124
+ let(:command_name) { 'delete' }
136
125
 
137
- it_behaves_like 'it has an encrypted key_vault_client'
138
- end
126
+ before do
127
+ encryption_client['users'].delete_one(ssn: ssn)
128
+ end
139
129
 
140
- describe '#delete_many' do
141
- let(:command_name) { 'delete' }
130
+ it 'has encrypted data in command monitoring' do
131
+ # Command started event occurs after ssn is encrypted
132
+ # Command succeeded event does not contain any data to be decrypted
133
+ expect(started_event.command["deletes"].first["q"]["ssn"]["$eq"]).to be_ciphertext
134
+ end
142
135
 
143
- before do
144
- encryption_client['users'].delete_many(ssn: ssn)
136
+ it_behaves_like 'it has a non-encrypted key_vault_client'
145
137
  end
146
138
 
147
- it 'has encrypted data in command monitoring' do
148
- # Command started event occurs after ssn is encrypted
149
- # Command succeeded event does not contain any data to be decrypted
150
- expect(started_event.command["deletes"].first["q"]["ssn"]["$eq"]).to be_ciphertext
151
- end
139
+ describe '#delete_many' do
140
+ let(:command_name) { 'delete' }
152
141
 
153
- it_behaves_like 'it has an encrypted key_vault_client'
154
- end
142
+ before do
143
+ encryption_client['users'].delete_many(ssn: ssn)
144
+ end
155
145
 
156
- describe '#find' do
157
- let(:command_name) { 'find' }
146
+ it 'has encrypted data in command monitoring' do
147
+ # Command started event occurs after ssn is encrypted
148
+ # Command succeeded event does not contain any data to be decrypted
149
+ expect(started_event.command["deletes"].first["q"]["ssn"]["$eq"]).to be_ciphertext
150
+ end
158
151
 
159
- before do
160
- encryption_client['users'].find(ssn: ssn).first
152
+ it_behaves_like 'it has a non-encrypted key_vault_client'
161
153
  end
162
154
 
163
- it 'has encrypted data in command monitoring' do
164
- # Command started event occurs after ssn is encrypted
165
- expect(started_event.command["filter"]["ssn"]["$eq"]).to be_ciphertext
155
+ describe '#find' do
156
+ let(:command_name) { 'find' }
166
157
 
167
- # Command succeeded event occurs before ssn is decrypted
168
- expect(succeeded_event.reply["cursor"]["firstBatch"].first["ssn"]).to be_ciphertext
169
- end
158
+ before do
159
+ encryption_client['users'].find(ssn: ssn).first
160
+ end
170
161
 
171
- it_behaves_like 'it has an encrypted key_vault_client'
172
- end
162
+ it 'has encrypted data in command monitoring' do
163
+ # Command started event occurs after ssn is encrypted
164
+ expect(started_event.command["filter"]["ssn"]["$eq"]).to be_ciphertext
173
165
 
174
- describe '#find_one_and_delete' do
175
- let(:command_name) { 'findAndModify' }
166
+ # Command succeeded event occurs before ssn is decrypted
167
+ expect(succeeded_event.reply["cursor"]["firstBatch"].first["ssn"]).to be_ciphertext
168
+ end
176
169
 
177
- before do
178
- encryption_client['users'].find_one_and_delete(ssn: ssn)
170
+ it_behaves_like 'it has a non-encrypted key_vault_client'
179
171
  end
180
172
 
181
- it 'has encrypted data in command monitoring' do
182
- # Command started event occurs after ssn is encrypted
183
- expect(started_event.command["query"]["ssn"]["$eq"]).to be_ciphertext
173
+ describe '#find_one_and_delete' do
174
+ let(:command_name) { 'findAndModify' }
184
175
 
185
- # Command succeeded event occurs before ssn is decrypted
186
- expect(succeeded_event.reply["value"]["ssn"]).to be_ciphertext
187
- end
176
+ before do
177
+ encryption_client['users'].find_one_and_delete(ssn: ssn)
178
+ end
188
179
 
189
- it_behaves_like 'it has an encrypted key_vault_client'
190
- end
180
+ it 'has encrypted data in command monitoring' do
181
+ # Command started event occurs after ssn is encrypted
182
+ expect(started_event.command["query"]["ssn"]["$eq"]).to be_ciphertext
191
183
 
192
- describe '#find_one_and_replace' do
193
- let(:command_name) { 'findAndModify' }
184
+ # Command succeeded event occurs before ssn is decrypted
185
+ expect(succeeded_event.reply["value"]["ssn"]).to be_ciphertext
186
+ end
194
187
 
195
- before do
196
- encryption_client['users'].find_one_and_replace(
197
- { ssn: ssn },
198
- { ssn: '555-555-5555' }
199
- )
188
+ it_behaves_like 'it has a non-encrypted key_vault_client'
200
189
  end
201
190
 
202
- it 'has encrypted data in command monitoring' do
203
- # Command started event occurs after ssn is encrypted
204
- expect(started_event.command["query"]["ssn"]["$eq"]).to be_ciphertext
205
- expect(started_event.command["update"]["ssn"]).to be_ciphertext
191
+ describe '#find_one_and_replace' do
192
+ let(:command_name) { 'findAndModify' }
206
193
 
207
- # Command succeeded event occurs before ssn is decrypted
208
- expect(succeeded_event.reply["value"]["ssn"]).to be_ciphertext
209
- end
194
+ before do
195
+ encryption_client['users'].find_one_and_replace(
196
+ { ssn: ssn },
197
+ { ssn: '555-555-5555' }
198
+ )
199
+ end
210
200
 
211
- it_behaves_like 'it has an encrypted key_vault_client'
212
- end
201
+ it 'has encrypted data in command monitoring' do
202
+ # Command started event occurs after ssn is encrypted
203
+ expect(started_event.command["query"]["ssn"]["$eq"]).to be_ciphertext
204
+ expect(started_event.command["update"]["ssn"]).to be_ciphertext
213
205
 
214
- describe '#find_one_and_update' do
215
- let(:command_name) { 'findAndModify' }
206
+ # Command succeeded event occurs before ssn is decrypted
207
+ expect(succeeded_event.reply["value"]["ssn"]).to be_ciphertext
208
+ end
216
209
 
217
- before do
218
- encryption_client['users'].find_one_and_update(
219
- { ssn: ssn },
220
- { ssn: '555-555-5555' }
221
- )
210
+ it_behaves_like 'it has a non-encrypted key_vault_client'
222
211
  end
223
212
 
224
- it 'has encrypted data in command monitoring' do
213
+ describe '#find_one_and_update' do
214
+ let(:command_name) { 'findAndModify' }
225
215
 
226
- # Command started event occurs after ssn is encrypted
227
- expect(started_event.command["query"]["ssn"]["$eq"]).to be_ciphertext
228
- expect(started_event.command["update"]["ssn"]).to be_ciphertext
216
+ before do
217
+ encryption_client['users'].find_one_and_update(
218
+ { ssn: ssn },
219
+ { ssn: '555-555-5555' }
220
+ )
221
+ end
229
222
 
230
- # Command succeeded event occurs before ssn is decrypted
231
- expect(succeeded_event.reply["value"]["ssn"]).to be_ciphertext
232
- end
223
+ it 'has encrypted data in command monitoring' do
233
224
 
234
- it_behaves_like 'it has an encrypted key_vault_client'
235
- end
225
+ # Command started event occurs after ssn is encrypted
226
+ expect(started_event.command["query"]["ssn"]["$eq"]).to be_ciphertext
227
+ expect(started_event.command["update"]["ssn"]).to be_ciphertext
236
228
 
237
- describe '#insert_one' do
238
- let(:command_name) { 'insert' }
229
+ # Command succeeded event occurs before ssn is decrypted
230
+ expect(succeeded_event.reply["value"]["ssn"]).to be_ciphertext
231
+ end
239
232
 
240
- before do
241
- encryption_client['users'].insert_one(ssn: ssn)
233
+ it_behaves_like 'it has a non-encrypted key_vault_client'
242
234
  end
243
235
 
244
- it 'has encrypted data in command monitoring' do
245
- # Command started event occurs after ssn is encrypted
246
- # Command succeeded event does not contain any data to be decrypted
247
- expect(started_event.command["documents"].first["ssn"]).to be_ciphertext
248
- end
236
+ describe '#replace_one' do
237
+ let(:command_name) { 'update' }
249
238
 
250
- it_behaves_like 'it has an encrypted key_vault_client'
251
- end
239
+ before do
240
+ encryption_client['users'].replace_one(
241
+ { ssn: ssn },
242
+ { ssn: '555-555-5555' }
243
+ )
244
+ end
252
245
 
253
- describe '#replace_one' do
254
- let(:command_name) { 'update' }
246
+ it 'has encrypted data in command monitoring' do
247
+ # Command started event occurs after ssn is encrypted
248
+ # Command succeeded event does not contain any data to be decrypted
249
+ expect(started_event.command["updates"].first["q"]["ssn"]["$eq"]).to be_ciphertext
250
+ expect(started_event.command["updates"].first["u"]["ssn"]).to be_ciphertext
251
+ end
255
252
 
256
- before do
257
- encryption_client['users'].replace_one(
258
- { ssn: ssn },
259
- { ssn: '555-555-5555' }
260
- )
253
+ it_behaves_like 'it has a non-encrypted key_vault_client'
261
254
  end
262
255
 
263
- it 'has encrypted data in command monitoring' do
264
- # Command started event occurs after ssn is encrypted
265
- # Command succeeded event does not contain any data to be decrypted
266
- expect(started_event.command["updates"].first["q"]["ssn"]["$eq"]).to be_ciphertext
267
- expect(started_event.command["updates"].first["u"]["ssn"]).to be_ciphertext
268
- end
256
+ describe '#update_one' do
257
+ let(:command_name) { 'update' }
269
258
 
270
- it_behaves_like 'it has an encrypted key_vault_client'
271
- end
259
+ before do
260
+ encryption_client['users'].replace_one({ ssn: ssn }, { ssn: '555-555-5555' })
261
+ end
272
262
 
273
- describe '#update_one' do
274
- let(:command_name) { 'update' }
263
+ it 'has encrypted data in command monitoring' do
264
+ # Command started event occurs after ssn is encrypted
265
+ # Command succeeded event does not contain any data to be decrypted
266
+ expect(started_event.command["updates"].first["q"]["ssn"]["$eq"]).to be_ciphertext
267
+ expect(started_event.command["updates"].first["u"]["ssn"]).to be_ciphertext
268
+ end
275
269
 
276
- before do
277
- encryption_client['users'].update_one({ ssn: ssn }, { ssn: '555-555-5555' })
270
+ it_behaves_like 'it has a non-encrypted key_vault_client'
278
271
  end
279
272
 
280
- it 'has encrypted data in command monitoring' do
281
- # Command started event occurs after ssn is encrypted
282
- # Command succeeded event does not contain any data to be decrypted
283
- expect(started_event.command["updates"].first["q"]["ssn"]["$eq"]).to be_ciphertext
284
- expect(started_event.command["updates"].first["u"]["ssn"]).to be_ciphertext
285
- end
273
+ describe '#update_many' do
274
+ let(:command_name) { 'update' }
275
+
276
+ before do
277
+ # update_many does not support replacement-style updates
278
+ encryption_client['users'].update_many({ ssn: ssn }, { "$inc" => { :age => 1 } })
279
+ end
286
280
 
287
- it_behaves_like 'it has an encrypted key_vault_client'
281
+ it 'has encrypted data in command monitoring' do
282
+ # Command started event occurs after ssn is encrypted
283
+ # Command succeeded event does not contain any data to be decrypted
284
+ expect(started_event.command["updates"].first["q"]["ssn"]["$eq"]).to be_ciphertext
285
+ end
286
+
287
+ it_behaves_like 'it has a non-encrypted key_vault_client'
288
+ end
288
289
  end
289
290
 
290
- describe '#update_many' do
291
- let(:command_name) { 'update' }
291
+ describe '#insert_one' do
292
+ let(:command_name) { 'insert' }
292
293
 
293
294
  before do
294
- # update_many does not support replacement-style updates
295
- encryption_client['users'].update_many({ ssn: ssn }, { "$inc" => { :age => 1 } })
295
+ encryption_client['users'].insert_one(ssn: ssn)
296
296
  end
297
297
 
298
298
  it 'has encrypted data in command monitoring' do
299
299
  # Command started event occurs after ssn is encrypted
300
300
  # Command succeeded event does not contain any data to be decrypted
301
- expect(started_event.command["updates"].first["q"]["ssn"]["$eq"]).to be_ciphertext
301
+ expect(started_event.command["documents"].first["ssn"]).to be_ciphertext
302
302
  end
303
303
 
304
- it_behaves_like 'it has an encrypted key_vault_client'
304
+ it_behaves_like 'it has a non-encrypted key_vault_client'
305
305
  end
306
306
  end