mongo 2.11.4 → 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 (1659) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data/CONTRIBUTING.md +8 -36
  4. data/LICENSE +1 -1
  5. data/README.md +65 -77
  6. data/Rakefile +58 -24
  7. data/lib/mongo/active_support.rb +4 -1
  8. data/lib/mongo/address/ipv4.rb +35 -5
  9. data/lib/mongo/address/ipv6.rb +35 -5
  10. data/lib/mongo/address/unix.rb +6 -3
  11. data/lib/mongo/address/validator.rb +4 -1
  12. data/lib/mongo/address.rb +81 -26
  13. data/lib/mongo/auth/aws/conversation.rb +128 -0
  14. data/lib/mongo/auth/aws/credentials_retriever.rb +222 -0
  15. data/lib/mongo/auth/aws/request.rb +285 -0
  16. data/lib/mongo/auth/aws.rb +40 -0
  17. data/lib/mongo/auth/base.rb +145 -0
  18. data/lib/mongo/auth/conversation_base.rb +87 -0
  19. data/lib/mongo/auth/cr/conversation.rb +21 -86
  20. data/lib/mongo/auth/cr.rb +12 -36
  21. data/lib/mongo/auth/credential_cache.rb +54 -0
  22. data/lib/mongo/auth/gssapi/conversation.rb +100 -0
  23. data/lib/mongo/auth/gssapi.rb +41 -0
  24. data/lib/mongo/auth/ldap/conversation.rb +9 -57
  25. data/lib/mongo/auth/ldap.rb +12 -34
  26. data/lib/mongo/auth/roles.rb +4 -1
  27. data/lib/mongo/auth/sasl_conversation_base.rb +102 -0
  28. data/lib/mongo/auth/scram/conversation.rb +15 -502
  29. data/lib/mongo/auth/scram.rb +42 -51
  30. data/lib/mongo/auth/scram256/conversation.rb +66 -0
  31. data/lib/mongo/auth/scram256.rb +34 -0
  32. data/lib/mongo/auth/scram_conversation_base.rb +378 -0
  33. data/lib/mongo/auth/stringprep/profiles/sasl.rb +5 -1
  34. data/lib/mongo/auth/stringprep/tables.rb +5 -1
  35. data/lib/mongo/auth/stringprep/unicode_normalize/normalize.rb +3 -2
  36. data/lib/mongo/auth/stringprep/unicode_normalize/tables.rb +2 -1
  37. data/lib/mongo/auth/stringprep.rb +9 -5
  38. data/lib/mongo/auth/user/view.rb +20 -10
  39. data/lib/mongo/auth/user.rb +5 -10
  40. data/lib/mongo/auth/x509/conversation.rb +21 -66
  41. data/lib/mongo/auth/x509.rb +17 -32
  42. data/lib/mongo/auth.rb +52 -14
  43. data/lib/mongo/background_thread.rb +27 -4
  44. data/lib/mongo/bson.rb +4 -1
  45. data/lib/mongo/bulk_write/combineable.rb +23 -8
  46. data/lib/mongo/bulk_write/ordered_combiner.rb +4 -1
  47. data/lib/mongo/bulk_write/result.rb +14 -2
  48. data/lib/mongo/bulk_write/result_combiner.rb +6 -5
  49. data/lib/mongo/bulk_write/transformable.rb +12 -10
  50. data/lib/mongo/bulk_write/unordered_combiner.rb +4 -1
  51. data/lib/mongo/bulk_write/validatable.rb +8 -1
  52. data/lib/mongo/bulk_write.rb +187 -42
  53. data/lib/mongo/caching_cursor.rb +77 -0
  54. data/lib/mongo/client.rb +669 -68
  55. data/lib/mongo/client_encryption.rb +209 -0
  56. data/lib/mongo/cluster/periodic_executor.rb +8 -4
  57. data/lib/mongo/cluster/reapers/cursor_reaper.rb +120 -46
  58. data/lib/mongo/cluster/reapers/socket_reaper.rb +4 -1
  59. data/lib/mongo/cluster/sdam_flow.rb +112 -74
  60. data/lib/mongo/cluster/topology/base.rb +17 -10
  61. data/lib/mongo/cluster/topology/load_balanced.rb +102 -0
  62. data/lib/mongo/cluster/topology/no_replica_set_options.rb +4 -1
  63. data/lib/mongo/cluster/topology/replica_set_no_primary.rb +7 -3
  64. data/lib/mongo/cluster/topology/replica_set_with_primary.rb +4 -1
  65. data/lib/mongo/cluster/topology/sharded.rb +5 -2
  66. data/lib/mongo/cluster/topology/single.rb +6 -3
  67. data/lib/mongo/cluster/topology/unknown.rb +4 -1
  68. data/lib/mongo/cluster/topology.rb +44 -4
  69. data/lib/mongo/cluster.rb +344 -155
  70. data/lib/mongo/cluster_time.rb +4 -1
  71. data/lib/mongo/collection/helpers.rb +43 -0
  72. data/lib/mongo/collection/queryable_encryption.rb +122 -0
  73. data/lib/mongo/collection/view/aggregation.rb +96 -23
  74. data/lib/mongo/collection/view/builder/aggregation.rb +20 -18
  75. data/lib/mongo/collection/view/builder/map_reduce.rb +19 -50
  76. data/lib/mongo/collection/view/builder.rb +4 -5
  77. data/lib/mongo/collection/view/change_stream/retryable.rb +4 -1
  78. data/lib/mongo/collection/view/change_stream.rb +83 -28
  79. data/lib/mongo/collection/view/explainable.rb +31 -9
  80. data/lib/mongo/collection/view/immutable.rb +4 -1
  81. data/lib/mongo/collection/view/iterable.rb +135 -23
  82. data/lib/mongo/collection/view/map_reduce.rb +78 -24
  83. data/lib/mongo/collection/view/readable.rb +162 -71
  84. data/lib/mongo/collection/view/writable.rb +356 -140
  85. data/lib/mongo/collection/view.rb +47 -42
  86. data/lib/mongo/collection.rb +244 -68
  87. data/lib/mongo/config/options.rb +62 -0
  88. data/lib/mongo/config/validators/option.rb +26 -0
  89. data/lib/mongo/config.rb +42 -0
  90. data/lib/mongo/crypt/auto_decryption_context.rb +43 -0
  91. data/lib/mongo/crypt/auto_encrypter.rb +304 -0
  92. data/lib/mongo/crypt/auto_encryption_context.rb +47 -0
  93. data/lib/mongo/crypt/binary.rb +158 -0
  94. data/lib/mongo/crypt/binding.rb +1601 -0
  95. data/lib/mongo/crypt/context.rb +141 -0
  96. data/lib/mongo/crypt/data_key_context.rb +73 -0
  97. data/lib/mongo/crypt/encryption_io.rb +343 -0
  98. data/lib/mongo/crypt/explicit_decryption_context.rb +43 -0
  99. data/lib/mongo/crypt/explicit_encrypter.rb +237 -0
  100. data/lib/mongo/crypt/explicit_encryption_context.rb +115 -0
  101. data/lib/mongo/crypt/handle.rb +392 -0
  102. data/lib/mongo/crypt/hooks.rb +116 -0
  103. data/lib/mongo/crypt/kms/aws.rb +136 -0
  104. data/lib/mongo/crypt/kms/azure.rb +144 -0
  105. data/lib/mongo/crypt/kms/credentials.rb +81 -0
  106. data/lib/mongo/crypt/kms/gcp.rb +189 -0
  107. data/lib/mongo/crypt/kms/kmip.rb +116 -0
  108. data/lib/mongo/crypt/kms/local.rb +82 -0
  109. data/lib/mongo/crypt/kms/master_key_document.rb +65 -0
  110. data/lib/mongo/crypt/kms.rb +117 -0
  111. data/lib/mongo/crypt/kms_context.rb +70 -0
  112. data/lib/mongo/crypt/rewrap_many_data_key_context.rb +46 -0
  113. data/lib/mongo/crypt/rewrap_many_data_key_result.rb +37 -0
  114. data/lib/mongo/crypt/status.rb +140 -0
  115. data/lib/mongo/crypt.rb +39 -0
  116. data/lib/mongo/cursor/kill_spec.rb +76 -0
  117. data/lib/mongo/cursor.rb +175 -70
  118. data/lib/mongo/database/view.rb +41 -9
  119. data/lib/mongo/database.rb +142 -25
  120. data/lib/mongo/dbref.rb +5 -99
  121. data/lib/mongo/distinguishing_semaphore.rb +58 -0
  122. data/lib/mongo/error/auth_error.rb +4 -1
  123. data/lib/mongo/error/bad_load_balancer_target.rb +26 -0
  124. data/lib/mongo/error/bulk_write_error.rb +60 -14
  125. data/lib/mongo/error/change_stream_resumable.rb +4 -1
  126. data/lib/mongo/error/closed_stream.rb +4 -1
  127. data/lib/mongo/error/connection_check_out_timeout.rb +4 -1
  128. data/lib/mongo/error/connection_perished.rb +26 -0
  129. data/lib/mongo/error/credential_check_error.rb +29 -0
  130. data/lib/mongo/error/crypt_error.rb +34 -0
  131. data/lib/mongo/error/extra_file_chunk.rb +4 -1
  132. data/lib/mongo/error/{failed_stringprep_validation.rb → failed_string_prep_validation.rb} +3 -0
  133. data/lib/mongo/error/file_not_found.rb +4 -1
  134. data/lib/mongo/error/handshake_error.rb +4 -1
  135. data/lib/mongo/error/insufficient_iteration_count.rb +4 -1
  136. data/lib/mongo/error/internal_driver_error.rb +25 -0
  137. data/lib/mongo/error/invalid_address.rb +4 -1
  138. data/lib/mongo/error/invalid_application_name.rb +4 -1
  139. data/lib/mongo/error/invalid_bulk_operation.rb +4 -1
  140. data/lib/mongo/error/invalid_bulk_operation_type.rb +4 -1
  141. data/lib/mongo/error/invalid_collection_name.rb +4 -1
  142. data/lib/mongo/error/invalid_config_option.rb +20 -0
  143. data/lib/mongo/error/invalid_cursor_operation.rb +30 -0
  144. data/lib/mongo/error/invalid_database_name.rb +4 -1
  145. data/lib/mongo/error/invalid_document.rb +4 -1
  146. data/lib/mongo/error/invalid_file.rb +4 -1
  147. data/lib/mongo/error/invalid_file_revision.rb +4 -1
  148. data/lib/mongo/error/invalid_min_pool_size.rb +4 -1
  149. data/lib/mongo/error/invalid_nonce.rb +5 -2
  150. data/lib/mongo/error/invalid_read_concern.rb +31 -0
  151. data/lib/mongo/error/invalid_read_option.rb +4 -1
  152. data/lib/mongo/error/invalid_replacement_document.rb +31 -10
  153. data/lib/mongo/error/invalid_server_auth_host.rb +25 -0
  154. data/lib/mongo/error/invalid_server_auth_response.rb +26 -0
  155. data/lib/mongo/error/invalid_server_preference.rb +9 -1
  156. data/lib/mongo/error/invalid_session.rb +6 -2
  157. data/lib/mongo/error/invalid_signature.rb +4 -1
  158. data/lib/mongo/error/invalid_transaction_operation.rb +4 -1
  159. data/lib/mongo/error/invalid_txt_record.rb +4 -1
  160. data/lib/mongo/error/invalid_update_document.rb +31 -8
  161. data/lib/mongo/error/invalid_uri.rb +4 -1
  162. data/lib/mongo/error/invalid_write_concern.rb +4 -1
  163. data/{spec/support/crud/context.rb → lib/mongo/error/kms_error.rb} +8 -6
  164. data/lib/mongo/error/labelable.rb +72 -0
  165. data/lib/mongo/error/lint_error.rb +4 -1
  166. data/lib/mongo/error/max_bson_size.rb +18 -4
  167. data/lib/mongo/error/max_message_size.rb +4 -1
  168. data/lib/mongo/error/mismatched_domain.rb +4 -1
  169. data/lib/mongo/error/missing_connection.rb +25 -0
  170. data/lib/mongo/error/missing_file_chunk.rb +12 -3
  171. data/lib/mongo/error/missing_password.rb +4 -1
  172. data/lib/mongo/error/missing_resume_token.rb +4 -1
  173. data/lib/mongo/error/missing_scram_server_signature.rb +30 -0
  174. data/lib/mongo/error/missing_service_id.rb +26 -0
  175. data/lib/mongo/error/mongocryptd_spawn_error.rb +25 -0
  176. data/lib/mongo/error/multi_index_drop.rb +4 -1
  177. data/lib/mongo/error/need_primary_server.rb +4 -1
  178. data/lib/mongo/error/no_server_available.rb +12 -4
  179. data/lib/mongo/error/no_service_connection_available.rb +49 -0
  180. data/lib/mongo/error/no_srv_records.rb +4 -1
  181. data/lib/mongo/error/notable.rb +34 -17
  182. data/lib/mongo/error/operation_failure.rb +107 -117
  183. data/lib/mongo/error/parser.rb +85 -18
  184. data/lib/mongo/error/pool_closed_error.rb +4 -1
  185. data/lib/mongo/error/raise_original_error.rb +32 -0
  186. data/lib/mongo/error/read_write_retryable.rb +108 -0
  187. data/lib/mongo/error/sdam_error_detection.rb +16 -5
  188. data/lib/mongo/error/server_api_conflict.rb +26 -0
  189. data/lib/mongo/error/server_api_not_supported.rb +27 -0
  190. data/lib/mongo/error/server_certificate_revoked.rb +25 -0
  191. data/lib/mongo/error/session_ended.rb +4 -1
  192. data/lib/mongo/error/session_not_materialized.rb +29 -0
  193. data/lib/mongo/error/sessions_not_supported.rb +38 -0
  194. data/lib/mongo/error/snapshot_session_invalid_server_version.rb +31 -0
  195. data/lib/mongo/error/snapshot_session_transaction_prohibited.rb +30 -0
  196. data/lib/mongo/error/socket_error.rb +4 -1
  197. data/lib/mongo/error/socket_timeout_error.rb +4 -1
  198. data/lib/mongo/error/unchangeable_collection_option.rb +4 -1
  199. data/lib/mongo/error/unexpected_chunk_length.rb +4 -1
  200. data/lib/mongo/error/unexpected_response.rb +4 -1
  201. data/lib/mongo/error/unknown_payload_type.rb +4 -1
  202. data/lib/mongo/{cursor/builder.rb → error/unmet_dependency.rb} +11 -5
  203. data/lib/mongo/error/unsupported_array_filters.rb +10 -2
  204. data/lib/mongo/error/unsupported_collation.rb +10 -2
  205. data/lib/mongo/error/unsupported_features.rb +4 -1
  206. data/lib/mongo/error/unsupported_message_type.rb +4 -1
  207. data/lib/mongo/error/unsupported_option.rb +104 -0
  208. data/lib/mongo/error/write_retryable.rb +4 -1
  209. data/lib/mongo/error.rb +50 -34
  210. data/lib/mongo/event/base.rb +10 -1
  211. data/lib/mongo/event/listeners.rb +4 -1
  212. data/lib/mongo/event/publisher.rb +4 -1
  213. data/lib/mongo/event/subscriber.rb +4 -1
  214. data/lib/mongo/event.rb +4 -1
  215. data/lib/mongo/grid/file/chunk.rb +7 -2
  216. data/lib/mongo/grid/file/info.rb +7 -3
  217. data/lib/mongo/grid/file.rb +9 -1
  218. data/lib/mongo/grid/fs_bucket.rb +108 -61
  219. data/lib/mongo/grid/stream/read.rb +29 -8
  220. data/lib/mongo/grid/stream/write.rb +13 -4
  221. data/lib/mongo/grid/stream.rb +4 -1
  222. data/lib/mongo/grid.rb +4 -1
  223. data/lib/mongo/id.rb +11 -6
  224. data/lib/mongo/index/view.rb +103 -43
  225. data/lib/mongo/index.rb +5 -1
  226. data/lib/mongo/lint.rb +14 -0
  227. data/lib/mongo/loggable.rb +4 -1
  228. data/lib/mongo/logger.rb +7 -4
  229. data/lib/mongo/monitoring/cmap_log_subscriber.rb +4 -1
  230. data/lib/mongo/monitoring/command_log_subscriber.rb +23 -5
  231. data/lib/mongo/monitoring/event/cmap/base.rb +4 -1
  232. data/lib/mongo/monitoring/event/cmap/connection_check_out_failed.rb +5 -2
  233. data/lib/mongo/monitoring/event/cmap/connection_check_out_started.rb +4 -1
  234. data/lib/mongo/monitoring/event/cmap/connection_checked_in.rb +4 -1
  235. data/lib/mongo/monitoring/event/cmap/connection_checked_out.rb +4 -1
  236. data/lib/mongo/monitoring/event/cmap/connection_closed.rb +4 -1
  237. data/lib/mongo/monitoring/event/cmap/connection_created.rb +4 -1
  238. data/lib/mongo/monitoring/event/cmap/connection_ready.rb +4 -1
  239. data/lib/mongo/monitoring/event/cmap/pool_cleared.rb +11 -5
  240. data/lib/mongo/monitoring/event/cmap/pool_closed.rb +4 -1
  241. data/lib/mongo/monitoring/event/cmap/pool_created.rb +4 -1
  242. data/lib/mongo/monitoring/event/cmap.rb +4 -1
  243. data/lib/mongo/monitoring/event/command_failed.rb +50 -6
  244. data/lib/mongo/monitoring/event/command_started.rb +70 -4
  245. data/lib/mongo/monitoring/event/command_succeeded.rb +48 -4
  246. data/lib/mongo/monitoring/event/secure.rb +44 -4
  247. data/lib/mongo/monitoring/event/server_closed.rb +5 -2
  248. data/lib/mongo/monitoring/event/server_description_changed.rb +31 -5
  249. data/lib/mongo/monitoring/event/server_heartbeat_failed.rb +39 -18
  250. data/lib/mongo/monitoring/event/server_heartbeat_started.rb +13 -3
  251. data/lib/mongo/monitoring/event/server_heartbeat_succeeded.rb +34 -13
  252. data/lib/mongo/monitoring/event/server_opening.rb +5 -2
  253. data/lib/mongo/monitoring/event/topology_changed.rb +5 -2
  254. data/lib/mongo/monitoring/event/topology_closed.rb +5 -2
  255. data/lib/mongo/monitoring/event/topology_opening.rb +5 -2
  256. data/lib/mongo/monitoring/event.rb +4 -1
  257. data/lib/mongo/monitoring/publishable.rb +43 -17
  258. data/lib/mongo/monitoring/sdam_log_subscriber.rb +4 -1
  259. data/lib/mongo/monitoring/server_closed_log_subscriber.rb +4 -1
  260. data/lib/mongo/monitoring/server_description_changed_log_subscriber.rb +13 -2
  261. data/lib/mongo/monitoring/server_opening_log_subscriber.rb +4 -1
  262. data/lib/mongo/monitoring/topology_changed_log_subscriber.rb +5 -2
  263. data/lib/mongo/monitoring/topology_closed_log_subscriber.rb +4 -1
  264. data/lib/mongo/monitoring/topology_opening_log_subscriber.rb +4 -1
  265. data/lib/mongo/monitoring/unified_sdam_log_subscriber.rb +4 -1
  266. data/lib/mongo/monitoring.rb +51 -1
  267. data/lib/mongo/operation/aggregate/command.rb +16 -5
  268. data/lib/mongo/operation/aggregate/op_msg.rb +4 -1
  269. data/lib/mongo/operation/aggregate/result.rb +13 -9
  270. data/lib/mongo/operation/aggregate.rb +4 -1
  271. data/lib/mongo/operation/{delete/legacy.rb → collections_info/command.rb} +15 -21
  272. data/lib/mongo/operation/collections_info/result.rb +25 -2
  273. data/lib/mongo/operation/collections_info.rb +18 -28
  274. data/lib/mongo/operation/command/command.rb +6 -3
  275. data/lib/mongo/operation/command/op_msg.rb +10 -1
  276. data/lib/mongo/operation/command.rb +4 -1
  277. data/lib/mongo/operation/context.rb +138 -0
  278. data/lib/mongo/operation/count/command.rb +12 -3
  279. data/lib/mongo/operation/count/op_msg.rb +13 -1
  280. data/lib/mongo/operation/count.rb +4 -1
  281. data/lib/mongo/operation/create/command.rb +13 -4
  282. data/lib/mongo/operation/create/op_msg.rb +14 -1
  283. data/lib/mongo/operation/create.rb +4 -1
  284. data/lib/mongo/operation/create_index/command.rb +24 -5
  285. data/lib/mongo/operation/create_index/op_msg.rb +23 -3
  286. data/lib/mongo/operation/create_index.rb +4 -1
  287. data/lib/mongo/operation/create_user/command.rb +7 -4
  288. data/lib/mongo/operation/create_user/op_msg.rb +5 -2
  289. data/lib/mongo/operation/create_user.rb +4 -1
  290. data/lib/mongo/operation/delete/bulk_result.rb +6 -1
  291. data/lib/mongo/operation/delete/command.rb +13 -7
  292. data/lib/mongo/operation/delete/op_msg.rb +18 -6
  293. data/lib/mongo/operation/delete/result.rb +8 -2
  294. data/lib/mongo/operation/delete.rb +4 -2
  295. data/lib/mongo/operation/distinct/command.rb +12 -3
  296. data/lib/mongo/operation/distinct/op_msg.rb +14 -1
  297. data/lib/mongo/operation/distinct.rb +4 -1
  298. data/lib/mongo/operation/drop/command.rb +6 -3
  299. data/lib/mongo/operation/drop/op_msg.rb +4 -1
  300. data/lib/mongo/operation/drop.rb +4 -1
  301. data/lib/mongo/operation/drop_database/command.rb +6 -3
  302. data/lib/mongo/operation/drop_database/op_msg.rb +4 -1
  303. data/lib/mongo/operation/drop_database.rb +4 -1
  304. data/lib/mongo/operation/drop_index/command.rb +7 -4
  305. data/lib/mongo/operation/drop_index/op_msg.rb +10 -3
  306. data/lib/mongo/operation/drop_index.rb +4 -1
  307. data/lib/mongo/operation/explain/command.rb +22 -3
  308. data/lib/mongo/operation/explain/legacy.rb +17 -3
  309. data/lib/mongo/operation/explain/op_msg.rb +18 -1
  310. data/lib/mongo/operation/explain/result.rb +7 -1
  311. data/lib/mongo/operation/explain.rb +4 -1
  312. data/lib/mongo/operation/find/builder/command.rb +111 -0
  313. data/lib/mongo/{collection/view → operation/find}/builder/flags.rb +14 -15
  314. data/lib/mongo/operation/find/builder/legacy.rb +123 -0
  315. data/lib/mongo/{collection/view → operation/find}/builder/modifiers.rb +35 -26
  316. data/lib/mongo/operation/find/builder.rb +21 -0
  317. data/lib/mongo/operation/find/command.rb +15 -3
  318. data/lib/mongo/operation/find/legacy/result.rb +6 -1
  319. data/lib/mongo/operation/find/legacy.rb +15 -3
  320. data/lib/mongo/operation/find/op_msg.rb +17 -9
  321. data/lib/mongo/operation/find/result.rb +17 -1
  322. data/lib/mongo/operation/find.rb +5 -1
  323. data/lib/mongo/operation/get_more/command.rb +7 -3
  324. data/lib/mongo/operation/get_more/command_builder.rb +42 -0
  325. data/lib/mongo/operation/get_more/legacy.rb +5 -2
  326. data/lib/mongo/operation/get_more/op_msg.rb +6 -9
  327. data/lib/mongo/operation/get_more/result.rb +7 -1
  328. data/lib/mongo/operation/get_more.rb +5 -1
  329. data/lib/mongo/operation/indexes/command.rb +6 -3
  330. data/lib/mongo/operation/indexes/legacy.rb +7 -4
  331. data/lib/mongo/operation/indexes/op_msg.rb +4 -1
  332. data/lib/mongo/operation/indexes/result.rb +9 -1
  333. data/lib/mongo/operation/indexes.rb +19 -2
  334. data/lib/mongo/operation/insert/bulk_result.rb +18 -2
  335. data/lib/mongo/operation/insert/command.rb +10 -10
  336. data/lib/mongo/operation/insert/op_msg.rb +15 -9
  337. data/lib/mongo/operation/insert/result.rb +18 -4
  338. data/lib/mongo/operation/insert.rb +6 -3
  339. data/lib/mongo/operation/kill_cursors/command.rb +14 -3
  340. data/lib/mongo/operation/kill_cursors/{legacy.rb → command_builder.rb} +9 -11
  341. data/lib/mongo/operation/kill_cursors/op_msg.rb +14 -1
  342. data/lib/mongo/operation/kill_cursors.rb +5 -2
  343. data/lib/mongo/operation/list_collections/command.rb +7 -4
  344. data/lib/mongo/operation/list_collections/op_msg.rb +9 -3
  345. data/lib/mongo/operation/list_collections/result.rb +13 -2
  346. data/lib/mongo/operation/list_collections.rb +4 -1
  347. data/lib/mongo/operation/map_reduce/command.rb +14 -3
  348. data/lib/mongo/operation/map_reduce/op_msg.rb +5 -2
  349. data/lib/mongo/operation/map_reduce/result.rb +30 -1
  350. data/lib/mongo/operation/map_reduce.rb +4 -1
  351. data/lib/mongo/operation/op_msg_base.rb +6 -3
  352. data/lib/mongo/operation/parallel_scan/command.rb +8 -6
  353. data/lib/mongo/operation/parallel_scan/op_msg.rb +5 -2
  354. data/lib/mongo/operation/parallel_scan/result.rb +8 -1
  355. data/lib/mongo/operation/parallel_scan.rb +4 -1
  356. data/lib/mongo/operation/remove_user/command.rb +7 -4
  357. data/lib/mongo/operation/remove_user/op_msg.rb +5 -2
  358. data/lib/mongo/operation/remove_user.rb +4 -1
  359. data/lib/mongo/operation/result.rb +126 -37
  360. data/lib/mongo/operation/shared/bypass_document_validation.rb +14 -4
  361. data/lib/mongo/operation/shared/causal_consistency_supported.rb +7 -3
  362. data/lib/mongo/operation/shared/executable.rb +92 -28
  363. data/lib/mongo/operation/shared/executable_no_validate.rb +6 -3
  364. data/lib/mongo/operation/shared/executable_transaction_label.rb +4 -1
  365. data/lib/mongo/operation/shared/idable.rb +6 -2
  366. data/lib/mongo/operation/shared/limited.rb +14 -2
  367. data/lib/mongo/operation/shared/object_id_generator.rb +5 -1
  368. data/lib/mongo/operation/shared/op_msg_or_command.rb +7 -8
  369. data/lib/mongo/operation/shared/op_msg_or_find_command.rb +8 -9
  370. data/lib/mongo/operation/shared/polymorphic_lookup.rb +4 -1
  371. data/lib/mongo/operation/shared/polymorphic_operation.rb +54 -0
  372. data/lib/mongo/operation/shared/polymorphic_result.rb +4 -1
  373. data/lib/mongo/operation/shared/read_preference_supported.rb +82 -23
  374. data/lib/mongo/operation/shared/response_handling.rb +97 -17
  375. data/lib/mongo/operation/shared/result/aggregatable.rb +5 -1
  376. data/lib/mongo/operation/shared/result/use_legacy_error_parser.rb +4 -1
  377. data/lib/mongo/operation/shared/sessions_supported.rb +126 -26
  378. data/lib/mongo/operation/shared/specifiable.rb +36 -38
  379. data/lib/mongo/operation/shared/validatable.rb +87 -0
  380. data/lib/mongo/operation/shared/write.rb +37 -24
  381. data/lib/mongo/operation/shared/write_concern_supported.rb +10 -6
  382. data/lib/mongo/operation/update/bulk_result.rb +4 -1
  383. data/lib/mongo/operation/update/command.rb +13 -7
  384. data/lib/mongo/operation/update/op_msg.rb +16 -8
  385. data/lib/mongo/operation/update/result.rb +13 -2
  386. data/lib/mongo/operation/update.rb +4 -2
  387. data/lib/mongo/operation/update_user/command.rb +7 -4
  388. data/lib/mongo/operation/update_user/op_msg.rb +5 -2
  389. data/lib/mongo/operation/update_user.rb +4 -1
  390. data/lib/mongo/operation/users_info/command.rb +7 -4
  391. data/lib/mongo/operation/users_info/op_msg.rb +5 -2
  392. data/lib/mongo/operation/users_info/result.rb +7 -1
  393. data/lib/mongo/operation/users_info.rb +4 -1
  394. data/lib/mongo/operation/write_command/command.rb +51 -0
  395. data/lib/mongo/operation/write_command/op_msg.rb +43 -0
  396. data/lib/mongo/operation/write_command.rb +32 -0
  397. data/lib/mongo/operation.rb +17 -1
  398. data/lib/mongo/options/mapper.rb +4 -1
  399. data/lib/mongo/options/redacted.rb +4 -1
  400. data/lib/mongo/options.rb +4 -1
  401. data/lib/mongo/protocol/bit_vector.rb +6 -2
  402. data/lib/mongo/protocol/caching_hash.rb +69 -0
  403. data/lib/mongo/protocol/compressed.rb +61 -11
  404. data/lib/mongo/protocol/delete.rb +4 -1
  405. data/lib/mongo/protocol/get_more.rb +4 -1
  406. data/lib/mongo/protocol/insert.rb +7 -2
  407. data/lib/mongo/protocol/kill_cursors.rb +4 -1
  408. data/lib/mongo/protocol/message.rb +158 -21
  409. data/lib/mongo/protocol/msg.rb +268 -41
  410. data/lib/mongo/protocol/query.rb +97 -42
  411. data/lib/mongo/protocol/registry.rb +4 -1
  412. data/lib/mongo/protocol/reply.rb +4 -1
  413. data/lib/mongo/protocol/serializers.rb +47 -16
  414. data/lib/mongo/protocol/update.rb +4 -1
  415. data/lib/mongo/protocol.rb +4 -0
  416. data/lib/mongo/query_cache.rb +300 -0
  417. data/lib/mongo/retryable.rb +114 -43
  418. data/lib/mongo/semaphore.rb +4 -1
  419. data/lib/mongo/server/app_metadata.rb +128 -35
  420. data/lib/mongo/server/connection.rb +105 -127
  421. data/lib/mongo/server/connection_base.rb +173 -32
  422. data/lib/mongo/server/connection_common.rb +208 -0
  423. data/lib/mongo/server/connection_pool/generation_manager.rb +71 -0
  424. data/lib/mongo/server/connection_pool/populator.rb +5 -2
  425. data/lib/mongo/server/connection_pool.rb +206 -42
  426. data/lib/mongo/server/description/features.rb +41 -23
  427. data/lib/mongo/{srv/warning_result.rb → server/description/load_balancer.rb} +13 -15
  428. data/lib/mongo/server/description.rb +183 -30
  429. data/lib/mongo/server/monitor/app_metadata.rb +5 -2
  430. data/lib/mongo/server/monitor/connection.rb +148 -117
  431. data/lib/mongo/server/monitor.rb +183 -79
  432. data/lib/mongo/server/pending_connection.rb +247 -1
  433. data/lib/mongo/server/push_monitor/connection.rb +31 -0
  434. data/lib/mongo/server/push_monitor.rb +207 -0
  435. data/lib/mongo/server/round_trip_time_averager.rb +18 -6
  436. data/lib/mongo/server.rb +154 -52
  437. data/lib/mongo/server_selector/{selectable.rb → base.rb} +197 -91
  438. data/lib/mongo/server_selector/nearest.rb +32 -25
  439. data/lib/mongo/server_selector/primary.rb +30 -32
  440. data/lib/mongo/server_selector/primary_preferred.rb +38 -29
  441. data/lib/mongo/server_selector/secondary.rb +32 -25
  442. data/lib/mongo/server_selector/secondary_preferred.rb +30 -38
  443. data/lib/mongo/server_selector.rb +5 -2
  444. data/lib/mongo/session/server_session.rb +4 -1
  445. data/lib/mongo/session/session_pool.rb +33 -4
  446. data/lib/mongo/session.rb +178 -39
  447. data/lib/mongo/socket/ocsp_cache.rb +99 -0
  448. data/lib/mongo/socket/ocsp_verifier.rb +344 -0
  449. data/lib/mongo/socket/ssl.rb +165 -55
  450. data/lib/mongo/socket/tcp.rb +48 -25
  451. data/lib/mongo/socket/unix.rb +17 -6
  452. data/lib/mongo/socket.rb +168 -47
  453. data/lib/mongo/srv/monitor.rb +64 -47
  454. data/lib/mongo/srv/resolver.rb +42 -14
  455. data/lib/mongo/srv/result.rb +4 -2
  456. data/lib/mongo/srv.rb +4 -1
  457. data/lib/mongo/timeout.rb +54 -0
  458. data/lib/mongo/topology_version.rb +92 -0
  459. data/lib/mongo/uri/options_mapper.rb +626 -0
  460. data/lib/mongo/uri/srv_protocol.rb +23 -13
  461. data/lib/mongo/uri.rb +103 -388
  462. data/lib/mongo/utils.rb +105 -0
  463. data/lib/mongo/version.rb +5 -2
  464. data/lib/mongo/write_concern/acknowledged.rb +4 -1
  465. data/lib/mongo/write_concern/base.rb +4 -1
  466. data/lib/mongo/write_concern/unacknowledged.rb +4 -1
  467. data/lib/mongo/write_concern.rb +4 -1
  468. data/lib/mongo.rb +67 -2
  469. data/mongo.gemspec +12 -8
  470. data/spec/NOTES.aws-auth.md +296 -0
  471. data/spec/README.aws-auth.md +318 -0
  472. data/spec/README.md +386 -15
  473. data/spec/atlas/atlas_connectivity_spec.rb +3 -0
  474. data/spec/atlas/operations_spec.rb +3 -0
  475. data/spec/integration/auth_spec.rb +130 -14
  476. data/spec/integration/awaited_ismaster_spec.rb +31 -0
  477. data/spec/integration/aws_auth_request_spec.rb +77 -0
  478. data/spec/integration/aws_credentials_retriever_spec.rb +106 -0
  479. data/spec/integration/aws_lambda_examples_spec.rb +68 -0
  480. data/spec/integration/bson_symbol_spec.rb +8 -3
  481. data/spec/integration/bulk_insert_spec.rb +3 -0
  482. data/spec/integration/bulk_write_error_message_spec.rb +73 -0
  483. data/spec/integration/bulk_write_spec.rb +86 -0
  484. data/spec/integration/change_stream_examples_spec.rb +9 -2
  485. data/spec/integration/change_stream_spec.rb +133 -57
  486. data/spec/integration/check_clean_slate_spec.rb +19 -0
  487. data/spec/integration/{client_options_spec.rb → client_authentication_options_spec.rb} +123 -46
  488. data/spec/integration/client_connectivity_spec.rb +4 -1
  489. data/spec/integration/client_construction_aws_auth_spec.rb +194 -0
  490. data/spec/integration/client_construction_spec.rb +225 -2
  491. data/spec/integration/client_side_encryption/auto_encryption_bulk_writes_spec.rb +360 -0
  492. data/spec/integration/client_side_encryption/auto_encryption_command_monitoring_spec.rb +306 -0
  493. data/spec/integration/client_side_encryption/auto_encryption_mongocryptd_spawn_spec.rb +74 -0
  494. data/spec/integration/client_side_encryption/auto_encryption_old_wire_version_spec.rb +82 -0
  495. data/spec/integration/client_side_encryption/auto_encryption_reconnect_spec.rb +255 -0
  496. data/spec/integration/client_side_encryption/auto_encryption_spec.rb +711 -0
  497. data/spec/integration/client_side_encryption/bson_size_limit_spec.rb +190 -0
  498. data/spec/integration/client_side_encryption/bypass_mongocryptd_spawn_spec.rb +81 -0
  499. data/spec/integration/client_side_encryption/client_close_spec.rb +66 -0
  500. data/spec/integration/client_side_encryption/corpus_spec.rb +265 -0
  501. data/spec/integration/client_side_encryption/custom_endpoint_spec.rb +132 -0
  502. data/spec/integration/client_side_encryption/data_key_spec.rb +258 -0
  503. data/spec/integration/client_side_encryption/decryption_events_prose_spec.rb +158 -0
  504. data/spec/integration/client_side_encryption/explicit_encryption_spec.rb +176 -0
  505. data/spec/integration/client_side_encryption/explicit_queryable_encryption_spec.rb +147 -0
  506. data/spec/integration/client_side_encryption/external_key_vault_spec.rb +144 -0
  507. data/spec/integration/client_side_encryption/kms_tls_options_spec.rb +436 -0
  508. data/spec/integration/client_side_encryption/kms_tls_spec.rb +92 -0
  509. data/spec/integration/client_side_encryption/queryable_encryption_examples_spec.rb +111 -0
  510. data/spec/integration/client_side_encryption/unique_index_on_key_alt_names_prose_spec.rb +85 -0
  511. data/spec/integration/client_side_encryption/views_spec.rb +47 -0
  512. data/spec/integration/client_spec.rb +7 -2
  513. data/spec/integration/client_update_spec.rb +157 -0
  514. data/spec/integration/collection_indexes_prose_spec.rb +58 -0
  515. data/spec/integration/command_monitoring_spec.rb +95 -31
  516. data/spec/integration/command_spec.rb +59 -20
  517. data/spec/integration/connect_single_rs_name_spec.rb +15 -7
  518. data/spec/integration/connection_pool_populator_spec.rb +7 -2
  519. data/spec/integration/connection_spec.rb +121 -38
  520. data/spec/integration/crud_spec.rb +338 -5
  521. data/spec/integration/cursor_pinning_spec.rb +121 -0
  522. data/spec/integration/cursor_reaping_spec.rb +75 -28
  523. data/spec/integration/docs_examples_spec.rb +16 -0
  524. data/spec/integration/error_detection_spec.rb +3 -0
  525. data/spec/integration/fork_reconnect_spec.rb +207 -0
  526. data/spec/integration/get_more_spec.rb +13 -3
  527. data/spec/integration/grid_fs_bucket_spec.rb +51 -0
  528. data/spec/integration/heartbeat_events_spec.rb +11 -27
  529. data/spec/integration/map_reduce_spec.rb +77 -0
  530. data/spec/integration/mmapv1_spec.rb +3 -0
  531. data/spec/integration/mongos_pinning_spec.rb +3 -0
  532. data/spec/integration/ocsp_connectivity_spec.rb +29 -0
  533. data/spec/integration/ocsp_verifier_cache_spec.rb +191 -0
  534. data/spec/integration/ocsp_verifier_spec.rb +358 -0
  535. data/spec/integration/operation_failure_code_spec.rb +4 -1
  536. data/spec/integration/operation_failure_message_spec.rb +90 -0
  537. data/spec/integration/query_cache_spec.rb +1256 -0
  538. data/spec/integration/query_cache_transactions_spec.rb +193 -0
  539. data/spec/integration/read_concern_spec.rb +5 -2
  540. data/spec/integration/read_preference_spec.rb +86 -23
  541. data/spec/integration/reconnect_spec.rb +42 -19
  542. data/spec/integration/retryable_errors_spec.rb +36 -14
  543. data/spec/integration/{retryable_writes_spec.rb → retryable_writes/retryable_writes_36_and_older_spec.rb} +60 -53
  544. data/spec/integration/retryable_writes/retryable_writes_40_and_newer_spec.rb +405 -0
  545. data/spec/integration/retryable_writes/shared/adds_diagnostics.rb +18 -0
  546. data/spec/integration/retryable_writes/shared/does_not_support_retries.rb +27 -0
  547. data/spec/integration/retryable_writes/shared/only_supports_legacy_retries.rb +28 -0
  548. data/spec/integration/retryable_writes/shared/performs_legacy_retries.rb +220 -0
  549. data/spec/integration/retryable_writes/shared/performs_modern_retries.rb +235 -0
  550. data/spec/integration/retryable_writes/shared/performs_no_retries.rb +113 -0
  551. data/spec/integration/retryable_writes/shared/supports_legacy_retries.rb +22 -0
  552. data/spec/integration/retryable_writes/shared/supports_modern_retries.rb +28 -0
  553. data/spec/integration/retryable_writes/shared/supports_retries.rb +19 -0
  554. data/spec/integration/retryable_writes_errors_spec.rb +3 -0
  555. data/spec/integration/sdam_error_handling_spec.rb +235 -25
  556. data/spec/integration/sdam_events_spec.rb +142 -7
  557. data/spec/integration/sdam_prose_spec.rb +67 -0
  558. data/spec/integration/secondary_reads_spec.rb +102 -0
  559. data/spec/integration/server_description_spec.rb +3 -0
  560. data/spec/integration/server_monitor_spec.rb +31 -2
  561. data/spec/integration/server_selection_spec.rb +39 -0
  562. data/spec/integration/server_selector_spec.rb +25 -5
  563. data/spec/integration/server_spec.rb +47 -26
  564. data/spec/integration/shell_examples_spec.rb +3 -0
  565. data/spec/integration/size_limit_spec.rb +118 -0
  566. data/spec/integration/snappy_compression_spec.rb +28 -0
  567. data/spec/integration/snapshot_query_examples_spec.rb +127 -0
  568. data/spec/integration/srv_monitoring_spec.rb +93 -9
  569. data/spec/integration/srv_spec.rb +60 -0
  570. data/spec/integration/ssl_uri_options_spec.rb +5 -2
  571. data/spec/integration/step_down_spec.rb +38 -19
  572. data/spec/integration/time_zone_querying_spec.rb +3 -0
  573. data/spec/integration/transaction_pinning_spec.rb +120 -0
  574. data/spec/integration/transactions_api_examples_spec.rb +62 -0
  575. data/spec/integration/transactions_examples_spec.rb +31 -9
  576. data/spec/integration/truncated_utf8_spec.rb +26 -0
  577. data/spec/integration/versioned_api_examples_spec.rb +120 -0
  578. data/spec/integration/x509_auth_spec.rb +112 -0
  579. data/spec/integration/zlib_compression_spec.rb +28 -0
  580. data/spec/integration/zstd_compression_spec.rb +29 -0
  581. data/spec/kerberos/kerberos_spec.rb +94 -0
  582. data/spec/lite_spec_helper.rb +88 -44
  583. data/spec/mongo/address/ipv4_spec.rb +4 -1
  584. data/spec/mongo/address/ipv6_spec.rb +10 -0
  585. data/spec/mongo/address/unix_spec.rb +4 -0
  586. data/spec/mongo/address/validator_spec.rb +3 -0
  587. data/spec/mongo/address_spec.rb +27 -13
  588. data/spec/mongo/auth/aws/request_region_spec.rb +45 -0
  589. data/spec/mongo/auth/aws/request_spec.rb +79 -0
  590. data/spec/mongo/auth/cr_spec.rb +20 -10
  591. data/spec/mongo/auth/gssapi/conversation_spec.rb +124 -0
  592. data/spec/mongo/auth/invalid_mechanism_spec.rb +4 -1
  593. data/spec/mongo/auth/ldap/conversation_spec.rb +5 -2
  594. data/spec/mongo/auth/ldap_spec.rb +18 -8
  595. data/spec/mongo/auth/scram/conversation_spec.rb +125 -338
  596. data/spec/mongo/auth/scram256/conversation_spec.rb +174 -0
  597. data/spec/mongo/auth/{scram/negotiation_spec.rb → scram_negotiation_spec.rb} +83 -75
  598. data/spec/mongo/auth/scram_spec.rb +60 -88
  599. data/spec/mongo/auth/stringprep/profiles/sasl_spec.rb +3 -0
  600. data/spec/mongo/auth/stringprep_spec.rb +3 -0
  601. data/spec/mongo/auth/user/view_spec.rb +7 -7
  602. data/spec/mongo/auth/user_spec.rb +5 -2
  603. data/spec/mongo/auth/x509/conversation_spec.rb +7 -4
  604. data/spec/mongo/auth/x509_spec.rb +18 -12
  605. data/spec/mongo/auth_spec.rb +7 -4
  606. data/spec/mongo/bson_spec.rb +3 -0
  607. data/spec/mongo/bulk_write/ordered_combiner_spec.rb +3 -0
  608. data/spec/mongo/bulk_write/result_spec.rb +29 -8
  609. data/spec/mongo/bulk_write/unordered_combiner_spec.rb +3 -0
  610. data/spec/mongo/bulk_write_spec.rb +333 -5
  611. data/spec/mongo/caching_cursor_spec.rb +73 -0
  612. data/spec/mongo/client_construction_spec.rb +1662 -284
  613. data/spec/mongo/client_encryption_spec.rb +402 -0
  614. data/spec/mongo/client_spec.rb +425 -6
  615. data/spec/mongo/cluster/cursor_reaper_spec.rb +78 -31
  616. data/spec/mongo/cluster/periodic_executor_spec.rb +6 -1
  617. data/spec/mongo/cluster/socket_reaper_spec.rb +17 -3
  618. data/spec/mongo/cluster/topology/replica_set_spec.rb +65 -19
  619. data/spec/mongo/cluster/topology/sharded_spec.rb +6 -3
  620. data/spec/mongo/cluster/topology/single_spec.rb +24 -10
  621. data/spec/mongo/cluster/topology/unknown_spec.rb +4 -1
  622. data/spec/mongo/cluster/topology_spec.rb +4 -1
  623. data/spec/mongo/cluster_spec.rb +71 -81
  624. data/spec/mongo/cluster_time_spec.rb +3 -0
  625. data/spec/mongo/collection/view/aggregation_spec.rb +186 -86
  626. data/spec/mongo/collection/view/builder/find_command_spec.rb +24 -6
  627. data/spec/mongo/collection/view/builder/op_query_spec.rb +7 -0
  628. data/spec/mongo/collection/view/change_stream_resume_spec.rb +397 -0
  629. data/spec/mongo/collection/view/change_stream_spec.rb +21 -323
  630. data/spec/mongo/collection/view/explainable_spec.rb +90 -4
  631. data/spec/mongo/collection/view/immutable_spec.rb +3 -0
  632. data/spec/mongo/collection/view/iterable_spec.rb +41 -0
  633. data/spec/mongo/collection/view/map_reduce_spec.rb +44 -6
  634. data/spec/mongo/collection/view/readable_spec.rb +745 -2
  635. data/spec/mongo/collection/view/writable_spec.rb +323 -1
  636. data/spec/mongo/collection/view_spec.rb +4 -1
  637. data/spec/mongo/collection_crud_spec.rb +4415 -0
  638. data/spec/mongo/collection_ddl_spec.rb +537 -0
  639. data/spec/mongo/collection_spec.rb +103 -4367
  640. data/spec/mongo/config/options_spec.rb +75 -0
  641. data/spec/mongo/config_spec.rb +73 -0
  642. data/spec/mongo/crypt/auto_decryption_context_spec.rb +109 -0
  643. data/spec/mongo/crypt/auto_encrypter_spec.rb +441 -0
  644. data/spec/mongo/crypt/auto_encryption_context_spec.rb +126 -0
  645. data/spec/mongo/crypt/binary_spec.rb +113 -0
  646. data/spec/mongo/crypt/binding/binary_spec.rb +54 -0
  647. data/spec/mongo/crypt/binding/context_spec.rb +305 -0
  648. data/spec/mongo/crypt/binding/helpers_spec.rb +44 -0
  649. data/spec/mongo/crypt/binding/mongocrypt_spec.rb +113 -0
  650. data/spec/mongo/crypt/binding/status_spec.rb +97 -0
  651. data/spec/mongo/crypt/binding/version_spec.rb +53 -0
  652. data/spec/mongo/crypt/binding_unloaded_spec.rb +37 -0
  653. data/spec/mongo/crypt/data_key_context_spec.rb +144 -0
  654. data/spec/mongo/crypt/encryption_io_spec.rb +141 -0
  655. data/spec/mongo/crypt/explicit_decryption_context_spec.rb +106 -0
  656. data/spec/mongo/crypt/explicit_encryption_context_spec.rb +266 -0
  657. data/spec/mongo/crypt/handle_spec.rb +251 -0
  658. data/spec/mongo/crypt/helpers/mongo_crypt_spec_helper.rb +111 -0
  659. data/spec/mongo/crypt/hooks_spec.rb +30 -0
  660. data/spec/mongo/crypt/kms/credentials_spec.rb +357 -0
  661. data/spec/mongo/crypt/kms_spec.rb +59 -0
  662. data/spec/mongo/crypt/status_spec.rb +150 -0
  663. data/spec/mongo/cursor/builder/get_more_command_spec.rb +15 -1
  664. data/spec/mongo/cursor/builder/op_get_more_spec.rb +15 -1
  665. data/spec/mongo/cursor_spec.rb +209 -17
  666. data/spec/mongo/database_spec.rb +526 -27
  667. data/spec/mongo/distinguishing_semaphore_spec.rb +66 -0
  668. data/spec/mongo/error/bulk_write_error_spec.rb +52 -0
  669. data/spec/mongo/error/crypt_error_spec.rb +29 -0
  670. data/spec/mongo/error/max_bson_size_spec.rb +38 -0
  671. data/spec/mongo/error/no_server_available_spec.rb +15 -2
  672. data/spec/mongo/error/notable_spec.rb +62 -0
  673. data/spec/mongo/error/operation_failure_heavy_spec.rb +110 -0
  674. data/spec/mongo/error/operation_failure_spec.rb +231 -70
  675. data/spec/mongo/error/parser_spec.rb +40 -6
  676. data/spec/mongo/error/unsupported_option_spec.rb +57 -0
  677. data/spec/mongo/event/publisher_spec.rb +3 -0
  678. data/spec/mongo/event/subscriber_spec.rb +3 -0
  679. data/spec/mongo/grid/file/chunk_spec.rb +7 -4
  680. data/spec/mongo/grid/file/info_spec.rb +3 -0
  681. data/spec/mongo/grid/file_spec.rb +4 -1
  682. data/spec/mongo/grid/fs_bucket_spec.rb +58 -17
  683. data/spec/mongo/grid/stream/read_spec.rb +33 -10
  684. data/spec/mongo/grid/stream/write_spec.rb +38 -9
  685. data/spec/mongo/grid/stream_spec.rb +4 -1
  686. data/spec/mongo/id_spec.rb +3 -0
  687. data/spec/mongo/index/view_spec.rb +446 -0
  688. data/spec/mongo/lint_spec.rb +3 -0
  689. data/spec/mongo/logger_spec.rb +16 -11
  690. data/spec/mongo/monitoring/command_log_subscriber_spec.rb +3 -0
  691. data/spec/mongo/monitoring/event/cmap/connection_check_out_failed_spec.rb +3 -0
  692. data/spec/mongo/monitoring/event/cmap/connection_check_out_started_spec.rb +3 -0
  693. data/spec/mongo/monitoring/event/cmap/connection_checked_in_spec.rb +3 -0
  694. data/spec/mongo/monitoring/event/cmap/connection_checked_out_spec.rb +3 -0
  695. data/spec/mongo/monitoring/event/cmap/connection_closed_spec.rb +3 -0
  696. data/spec/mongo/monitoring/event/cmap/connection_created_spec.rb +3 -0
  697. data/spec/mongo/monitoring/event/cmap/connection_ready_spec.rb +3 -0
  698. data/spec/mongo/monitoring/event/cmap/pool_cleared_spec.rb +3 -0
  699. data/spec/mongo/monitoring/event/cmap/pool_closed_spec.rb +3 -0
  700. data/spec/mongo/monitoring/event/cmap/pool_created_spec.rb +3 -0
  701. data/spec/mongo/monitoring/event/command_failed_spec.rb +59 -2
  702. data/spec/mongo/monitoring/event/command_started_spec.rb +3 -0
  703. data/spec/mongo/monitoring/event/command_succeeded_spec.rb +46 -6
  704. data/spec/mongo/monitoring/event/secure_spec.rb +28 -4
  705. data/spec/mongo/monitoring/event/server_closed_spec.rb +4 -1
  706. data/spec/mongo/monitoring/event/server_description_changed_spec.rb +4 -4
  707. data/spec/mongo/monitoring/event/server_heartbeat_failed_spec.rb +4 -1
  708. data/spec/mongo/monitoring/event/server_heartbeat_started_spec.rb +3 -0
  709. data/spec/mongo/monitoring/event/server_heartbeat_succeeded_spec.rb +4 -1
  710. data/spec/mongo/monitoring/event/server_opening_spec.rb +4 -1
  711. data/spec/mongo/monitoring/event/topology_changed_spec.rb +4 -1
  712. data/spec/mongo/monitoring/event/topology_closed_spec.rb +4 -1
  713. data/spec/mongo/monitoring/event/topology_opening_spec.rb +4 -1
  714. data/spec/mongo/monitoring_spec.rb +3 -0
  715. data/spec/mongo/operation/aggregate/result_spec.rb +11 -1
  716. data/spec/mongo/operation/aggregate_spec.rb +5 -1
  717. data/spec/mongo/operation/collections_info_spec.rb +7 -1
  718. data/spec/mongo/operation/command_spec.rb +11 -5
  719. data/spec/mongo/operation/create/op_msg_spec.rb +244 -0
  720. data/spec/mongo/operation/create_index_spec.rb +9 -3
  721. data/spec/mongo/operation/create_user_spec.rb +9 -3
  722. data/spec/mongo/operation/delete/bulk_spec.rb +24 -6
  723. data/spec/mongo/operation/delete/command_spec.rb +3 -0
  724. data/spec/mongo/operation/delete/op_msg_spec.rb +40 -25
  725. data/spec/mongo/operation/delete_spec.rb +13 -36
  726. data/spec/mongo/operation/drop_index_spec.rb +9 -2
  727. data/spec/mongo/{collection/view → operation/find}/builder/flags_spec.rb +5 -2
  728. data/spec/mongo/{collection/view → operation/find}/builder/modifiers_spec.rb +5 -2
  729. data/spec/mongo/operation/find/legacy_spec.rb +34 -7
  730. data/spec/mongo/operation/get_more_spec.rb +11 -1
  731. data/spec/mongo/operation/indexes_spec.rb +8 -1
  732. data/spec/mongo/operation/insert/bulk_spec.rb +28 -8
  733. data/spec/mongo/operation/insert/command_spec.rb +7 -0
  734. data/spec/mongo/operation/insert/op_msg_spec.rb +46 -30
  735. data/spec/mongo/operation/insert_spec.rb +17 -43
  736. data/spec/mongo/operation/limited_spec.rb +8 -3
  737. data/spec/mongo/operation/map_reduce_spec.rb +8 -2
  738. data/spec/mongo/operation/read_preference_legacy_spec.rb +360 -0
  739. data/spec/mongo/operation/read_preference_op_msg_spec.rb +332 -0
  740. data/spec/mongo/operation/remove_user_spec.rb +9 -3
  741. data/spec/mongo/operation/result_spec.rb +34 -4
  742. data/spec/mongo/operation/specifiable_spec.rb +3 -0
  743. data/spec/mongo/operation/update/bulk_spec.rb +25 -7
  744. data/spec/mongo/operation/update/command_spec.rb +7 -0
  745. data/spec/mongo/operation/update/op_msg_spec.rb +41 -24
  746. data/spec/mongo/operation/update_spec.rb +12 -35
  747. data/spec/mongo/operation/update_user_spec.rb +7 -1
  748. data/spec/mongo/options/redacted_spec.rb +3 -0
  749. data/spec/mongo/protocol/caching_hash_spec.rb +82 -0
  750. data/spec/mongo/protocol/compressed_spec.rb +29 -13
  751. data/spec/mongo/protocol/delete_spec.rb +12 -8
  752. data/spec/mongo/protocol/get_more_spec.rb +12 -8
  753. data/spec/mongo/protocol/insert_spec.rb +12 -8
  754. data/spec/mongo/protocol/kill_cursors_spec.rb +9 -5
  755. data/spec/mongo/protocol/msg_spec.rb +111 -53
  756. data/spec/mongo/protocol/query_spec.rb +18 -15
  757. data/spec/mongo/protocol/registry_spec.rb +4 -1
  758. data/spec/mongo/protocol/reply_spec.rb +4 -1
  759. data/spec/mongo/protocol/update_spec.rb +13 -9
  760. data/spec/mongo/query_cache_middleware_spec.rb +55 -0
  761. data/spec/mongo/query_cache_spec.rb +453 -0
  762. data/spec/mongo/retryable_spec.rb +109 -75
  763. data/spec/mongo/semaphore_spec.rb +54 -0
  764. data/spec/mongo/server/app_metadata_spec.rb +53 -21
  765. data/spec/mongo/server/connection_auth_spec.rb +42 -24
  766. data/spec/mongo/server/connection_common_spec.rb +87 -0
  767. data/spec/mongo/server/connection_pool/populator_spec.rb +6 -1
  768. data/spec/mongo/server/connection_pool_spec.rb +189 -80
  769. data/spec/mongo/server/connection_spec.rb +323 -246
  770. data/spec/mongo/server/description/features_spec.rb +27 -0
  771. data/spec/mongo/server/description_query_methods_spec.rb +4 -1
  772. data/spec/mongo/server/description_spec.rb +625 -594
  773. data/spec/mongo/server/monitor/app_metadata_spec.rb +10 -1
  774. data/spec/mongo/server/monitor/connection_spec.rb +60 -69
  775. data/spec/mongo/server/monitor_spec.rb +95 -24
  776. data/spec/mongo/server/push_monitor_spec.rb +95 -0
  777. data/spec/mongo/server/round_trip_time_averager_spec.rb +8 -3
  778. data/spec/mongo/server_selector/nearest_spec.rb +32 -25
  779. data/spec/mongo/server_selector/primary_preferred_spec.rb +35 -28
  780. data/spec/mongo/server_selector/primary_spec.rb +35 -11
  781. data/spec/mongo/server_selector/secondary_preferred_spec.rb +52 -29
  782. data/spec/mongo/server_selector/secondary_spec.rb +27 -20
  783. data/spec/mongo/server_selector_spec.rb +145 -21
  784. data/spec/mongo/server_spec.rb +18 -2
  785. data/spec/mongo/session/server_session_spec.rb +3 -0
  786. data/spec/mongo/session/session_pool_spec.rb +51 -12
  787. data/spec/mongo/session_spec.rb +58 -0
  788. data/spec/mongo/session_transaction_spec.rb +17 -36
  789. data/spec/mongo/socket/ssl_spec.rb +91 -69
  790. data/spec/mongo/socket/tcp_spec.rb +5 -2
  791. data/spec/mongo/socket/unix_spec.rb +6 -2
  792. data/spec/mongo/socket_spec.rb +14 -11
  793. data/spec/mongo/srv/monitor_spec.rb +91 -69
  794. data/spec/mongo/srv/result_spec.rb +3 -0
  795. data/spec/mongo/timeout_spec.rb +42 -0
  796. data/spec/mongo/tls_context_hooks_spec.rb +40 -0
  797. data/spec/mongo/uri/srv_protocol_spec.rb +171 -37
  798. data/spec/mongo/uri_option_parsing_spec.rb +52 -16
  799. data/spec/mongo/uri_spec.rb +165 -48
  800. data/spec/mongo/utils_spec.rb +42 -0
  801. data/spec/mongo/write_concern/acknowledged_spec.rb +3 -0
  802. data/spec/mongo/write_concern/unacknowledged_spec.rb +3 -0
  803. data/spec/mongo/write_concern_spec.rb +16 -1
  804. data/spec/{support → runners}/auth.rb +45 -9
  805. data/spec/runners/change_streams/outcome.rb +45 -0
  806. data/spec/runners/change_streams/spec.rb +60 -0
  807. data/spec/runners/change_streams/test.rb +232 -0
  808. data/spec/{support → runners}/cmap/verifier.rb +4 -1
  809. data/spec/{support → runners}/cmap.rb +7 -4
  810. data/spec/{support → runners}/command_monitoring.rb +8 -36
  811. data/spec/runners/connection_string.rb +283 -6
  812. data/spec/{support/transactions → runners/crud}/context.rb +12 -15
  813. data/spec/{support → runners}/crud/operation.rb +201 -61
  814. data/spec/{support → runners}/crud/outcome.rb +4 -1
  815. data/spec/runners/crud/requirement.rb +139 -0
  816. data/spec/{support → runners}/crud/spec.rb +21 -11
  817. data/spec/{support → runners}/crud/test.rb +12 -27
  818. data/spec/runners/crud/test_base.rb +53 -0
  819. data/spec/{support → runners}/crud/verifier.rb +47 -15
  820. data/spec/{support → runners}/crud.rb +34 -12
  821. data/spec/{support → runners}/gridfs.rb +5 -2
  822. data/spec/runners/read_write_concern_document.rb +4 -1
  823. data/spec/runners/sdam/verifier.rb +29 -8
  824. data/spec/{support/server_discovery_and_monitoring.rb → runners/sdam.rb} +49 -26
  825. data/spec/runners/server_selection.rb +365 -0
  826. data/spec/{support → runners}/server_selection_rtt.rb +5 -2
  827. data/spec/runners/transactions/operation.rb +328 -0
  828. data/spec/{support → runners}/transactions/spec.rb +6 -3
  829. data/spec/runners/transactions/test.rb +329 -0
  830. data/spec/{support → runners}/transactions.rb +30 -27
  831. data/spec/runners/unified/assertions.rb +362 -0
  832. data/spec/runners/unified/change_stream_operations.rb +41 -0
  833. data/spec/runners/unified/client_side_encryption_operations.rb +83 -0
  834. data/spec/runners/unified/crud_operations.rb +323 -0
  835. data/spec/runners/unified/ddl_operations.rb +179 -0
  836. data/spec/runners/unified/entity_map.rb +42 -0
  837. data/spec/runners/unified/error.rb +29 -0
  838. data/spec/runners/unified/event_subscriber.rb +104 -0
  839. data/spec/runners/unified/exceptions.rb +24 -0
  840. data/spec/runners/unified/grid_fs_operations.rb +79 -0
  841. data/spec/runners/unified/support_operations.rb +269 -0
  842. data/spec/runners/unified/test.rb +511 -0
  843. data/spec/runners/unified/test_group.rb +31 -0
  844. data/spec/runners/unified.rb +106 -0
  845. data/spec/shared/LICENSE +20 -0
  846. data/spec/shared/bin/get-mongodb-download-url +17 -0
  847. data/spec/shared/bin/s3-copy +45 -0
  848. data/spec/shared/bin/s3-upload +69 -0
  849. data/spec/shared/lib/mrss/child_process_helper.rb +80 -0
  850. data/spec/shared/lib/mrss/cluster_config.rb +231 -0
  851. data/spec/shared/lib/mrss/constraints.rb +378 -0
  852. data/spec/shared/lib/mrss/docker_runner.rb +291 -0
  853. data/spec/shared/lib/mrss/eg_config_utils.rb +51 -0
  854. data/spec/shared/lib/mrss/event_subscriber.rb +210 -0
  855. data/spec/shared/lib/mrss/lite_constraints.rb +230 -0
  856. data/spec/shared/lib/mrss/server_version_registry.rb +120 -0
  857. data/spec/shared/lib/mrss/session_registry.rb +69 -0
  858. data/spec/shared/lib/mrss/session_registry_legacy.rb +60 -0
  859. data/spec/shared/lib/mrss/spec_organizer.rb +179 -0
  860. data/spec/shared/lib/mrss/utils.rb +15 -0
  861. data/spec/shared/share/Dockerfile.erb +325 -0
  862. data/spec/shared/share/haproxy-1.conf +16 -0
  863. data/spec/shared/share/haproxy-2.conf +17 -0
  864. data/spec/shared/shlib/config.sh +27 -0
  865. data/spec/shared/shlib/distro.sh +74 -0
  866. data/spec/shared/shlib/server.sh +392 -0
  867. data/spec/shared/shlib/set_env.sh +169 -0
  868. data/spec/solo/clean_exit_spec.rb +29 -0
  869. data/spec/spec_helper.rb +10 -9
  870. data/spec/spec_tests/auth_spec.rb +33 -14
  871. data/spec/spec_tests/change_streams_unified_spec.rb +13 -0
  872. data/spec/spec_tests/client_side_encryption_spec.rb +14 -0
  873. data/spec/spec_tests/client_side_encryption_unified_spec.rb +16 -0
  874. data/spec/spec_tests/cmap_spec.rb +19 -4
  875. data/spec/spec_tests/collection_management_spec.rb +13 -0
  876. data/spec/spec_tests/command_monitoring_unified_spec.rb +13 -0
  877. data/spec/spec_tests/connection_string_spec.rb +6 -1
  878. data/spec/spec_tests/crud_spec.rb +5 -10
  879. data/spec/spec_tests/crud_unified_spec.rb +13 -0
  880. data/spec/spec_tests/data/auth/connection-string.yml +69 -0
  881. data/spec/spec_tests/data/change_streams_unified/change-streams-errors.yml +124 -0
  882. data/spec/spec_tests/data/change_streams_unified/change-streams-pre_and_post_images.yml +351 -0
  883. data/spec/spec_tests/data/change_streams_unified/change-streams-resume-allowlist.yml +1171 -0
  884. data/spec/spec_tests/data/change_streams_unified/change-streams-resume-errorLabels.yml +1071 -0
  885. data/spec/spec_tests/data/change_streams_unified/change-streams-showExpandedEvents.yml +298 -0
  886. data/spec/spec_tests/data/change_streams_unified/change-streams.yml +927 -0
  887. data/spec/spec_tests/data/client_side_encryption/aggregate.yml +120 -0
  888. data/spec/spec_tests/data/client_side_encryption/azureKMS.yml +46 -0
  889. data/spec/spec_tests/data/client_side_encryption/badQueries.yml +536 -0
  890. data/spec/spec_tests/data/client_side_encryption/badSchema.yml +73 -0
  891. data/spec/spec_tests/data/client_side_encryption/basic.yml +102 -0
  892. data/spec/spec_tests/data/client_side_encryption/bulk.yml +81 -0
  893. data/spec/spec_tests/data/client_side_encryption/bypassAutoEncryption.yml +100 -0
  894. data/spec/spec_tests/data/client_side_encryption/bypassedCommand.yml +42 -0
  895. data/spec/spec_tests/data/client_side_encryption/count.yml +54 -0
  896. data/spec/spec_tests/data/client_side_encryption/countDocuments.yml +52 -0
  897. data/spec/spec_tests/data/client_side_encryption/create-and-createIndexes.yml +58 -0
  898. data/spec/spec_tests/data/client_side_encryption/delete.yml +91 -0
  899. data/spec/spec_tests/data/client_side_encryption/distinct.yml +66 -0
  900. data/spec/spec_tests/data/client_side_encryption/explain.yml +57 -0
  901. data/spec/spec_tests/data/client_side_encryption/find.yml +105 -0
  902. data/spec/spec_tests/data/client_side_encryption/findOneAndDelete.yml +50 -0
  903. data/spec/spec_tests/data/client_side_encryption/findOneAndReplace.yml +50 -0
  904. data/spec/spec_tests/data/client_side_encryption/findOneAndUpdate.yml +50 -0
  905. data/spec/spec_tests/data/client_side_encryption/fle2-BypassQueryAnalysis.yml +101 -0
  906. data/spec/spec_tests/data/client_side_encryption/fle2-Compact.yml +80 -0
  907. data/spec/spec_tests/data/client_side_encryption/fle2-CreateCollection.yml +1263 -0
  908. data/spec/spec_tests/data/client_side_encryption/fle2-DecryptExistingData.yml +64 -0
  909. data/spec/spec_tests/data/client_side_encryption/fle2-Delete.yml +107 -0
  910. data/spec/spec_tests/data/client_side_encryption/fle2-EncryptedFields-vs-EncryptedFieldsMap.yml +80 -0
  911. data/spec/spec_tests/data/client_side_encryption/fle2-EncryptedFields-vs-jsonSchema.yml +90 -0
  912. data/spec/spec_tests/data/client_side_encryption/fle2-EncryptedFieldsMap-defaults.yml +57 -0
  913. data/spec/spec_tests/data/client_side_encryption/fle2-FindOneAndUpdate.yml +213 -0
  914. data/spec/spec_tests/data/client_side_encryption/fle2-InsertFind-Indexed.yml +86 -0
  915. data/spec/spec_tests/data/client_side_encryption/fle2-InsertFind-Unindexed.yml +83 -0
  916. data/spec/spec_tests/data/client_side_encryption/fle2-MissingKey.yml +41 -0
  917. data/spec/spec_tests/data/client_side_encryption/fle2-NoEncryption.yml +42 -0
  918. data/spec/spec_tests/data/client_side_encryption/fle2-Update.yml +221 -0
  919. data/spec/spec_tests/data/client_side_encryption/fle2-validatorAndPartialFieldExpression.yml +168 -0
  920. data/spec/spec_tests/data/client_side_encryption/gcpKMS.yml +46 -0
  921. data/spec/spec_tests/data/client_side_encryption/getMore.yml +61 -0
  922. data/spec/spec_tests/data/client_side_encryption/insert.yml +88 -0
  923. data/spec/spec_tests/data/client_side_encryption/keyAltName.yml +64 -0
  924. data/spec/spec_tests/data/client_side_encryption/localKMS.yml +47 -0
  925. data/spec/spec_tests/data/client_side_encryption/localSchema.yml +65 -0
  926. data/spec/spec_tests/data/client_side_encryption/malformedCiphertext.yml +69 -0
  927. data/spec/spec_tests/data/client_side_encryption/maxWireVersion.yml +22 -0
  928. data/spec/spec_tests/data/client_side_encryption/missingKey.yml +42 -0
  929. data/spec/spec_tests/data/client_side_encryption/noSchema.yml +39 -0
  930. data/spec/spec_tests/data/client_side_encryption/replaceOne.yml +57 -0
  931. data/spec/spec_tests/data/client_side_encryption/types.yml +501 -0
  932. data/spec/spec_tests/data/client_side_encryption/unified/addKeyAltName.yml +194 -0
  933. data/spec/spec_tests/data/client_side_encryption/unified/createDataKey-kms_providers-invalid.yml +67 -0
  934. data/spec/spec_tests/data/client_side_encryption/unified/createDataKey.yml +309 -0
  935. data/spec/spec_tests/data/client_side_encryption/unified/deleteKey.yml +159 -0
  936. data/spec/spec_tests/data/client_side_encryption/unified/getKey.yml +105 -0
  937. data/spec/spec_tests/data/client_side_encryption/unified/getKeyByAltName.yml +104 -0
  938. data/spec/spec_tests/data/client_side_encryption/unified/getKeys.yml +122 -0
  939. data/spec/spec_tests/data/client_side_encryption/unified/removeKeyAltName.yml +157 -0
  940. data/spec/spec_tests/data/client_side_encryption/unified/rewrapManyDataKey-decrypt_failure.yml +69 -0
  941. data/spec/spec_tests/data/client_side_encryption/unified/rewrapManyDataKey-encrypt_failure.yml +122 -0
  942. data/spec/spec_tests/data/client_side_encryption/unified/rewrapManyDataKey.yml +432 -0
  943. data/spec/spec_tests/data/client_side_encryption/unsupportedCommand.yml +25 -0
  944. data/spec/spec_tests/data/client_side_encryption/updateMany.yml +70 -0
  945. data/spec/spec_tests/data/client_side_encryption/updateOne.yml +164 -0
  946. data/spec/spec_tests/data/client_side_encryption/validatorAndPartialFieldExpression.yml +166 -0
  947. data/spec/spec_tests/data/cmap/pool-checkout-connection.yml +6 -2
  948. data/spec/spec_tests/data/cmap/pool-create-min-size.yml +3 -0
  949. data/spec/spec_tests/data/collection_management/clustered-indexes.yml +135 -0
  950. data/spec/spec_tests/data/collection_management/createCollection-pre_and_post_images.yml +50 -0
  951. data/spec/spec_tests/data/collection_management/modifyCollection-pre_and_post_images.yml +58 -0
  952. data/spec/spec_tests/data/collection_management/timeseries-collection.yml +129 -0
  953. data/spec/spec_tests/data/command_monitoring_unified/bulkWrite.yml +68 -0
  954. data/spec/spec_tests/data/command_monitoring_unified/command.yml +50 -0
  955. data/spec/spec_tests/data/command_monitoring_unified/deleteMany.yml +79 -0
  956. data/spec/spec_tests/data/command_monitoring_unified/deleteOne.yml +79 -0
  957. data/spec/spec_tests/data/command_monitoring_unified/find.yml +254 -0
  958. data/spec/spec_tests/data/command_monitoring_unified/insertMany.yml +79 -0
  959. data/spec/spec_tests/data/command_monitoring_unified/insertOne.yml +77 -0
  960. data/spec/spec_tests/data/command_monitoring_unified/pre-42-server-connection-id.yml +56 -0
  961. data/spec/spec_tests/data/command_monitoring_unified/redacted-commands.yml +340 -0
  962. data/spec/spec_tests/data/command_monitoring_unified/server-connection-id.yml +56 -0
  963. data/spec/spec_tests/data/command_monitoring_unified/unacknowledgedBulkWrite.yml +55 -0
  964. data/spec/spec_tests/data/command_monitoring_unified/updateMany.yml +87 -0
  965. data/spec/spec_tests/data/command_monitoring_unified/updateOne.yml +118 -0
  966. data/spec/spec_tests/data/connection_string/valid-warnings.yml +24 -0
  967. data/spec/spec_tests/data/crud/read/aggregate-collation.yml +2 -1
  968. data/spec/spec_tests/data/crud/read/aggregate-out.yml +1 -0
  969. data/spec/spec_tests/data/crud/read/count-collation.yml +2 -1
  970. data/spec/spec_tests/data/crud/read/distinct-collation.yml +2 -1
  971. data/spec/spec_tests/data/crud/read/find-collation.yml +2 -1
  972. data/spec/spec_tests/data/crud/write/bulkWrite-collation.yml +2 -1
  973. data/spec/spec_tests/data/crud/write/bulkWrite.yml +26 -22
  974. data/spec/spec_tests/data/crud/write/deleteMany-collation.yml +2 -1
  975. data/spec/spec_tests/data/crud/write/deleteOne-collation.yml +2 -1
  976. data/spec/spec_tests/data/crud/write/findOneAndDelete-collation.yml +3 -2
  977. data/spec/spec_tests/data/crud/write/findOneAndReplace-collation.yml +2 -1
  978. data/spec/spec_tests/data/crud/write/findOneAndUpdate-collation.yml +3 -2
  979. data/spec/spec_tests/data/crud/write/insertMany.yml +26 -22
  980. data/spec/spec_tests/data/crud/write/replaceOne-collation.yml +3 -2
  981. data/spec/spec_tests/data/crud/write/updateMany-collation.yml +2 -1
  982. data/spec/spec_tests/data/crud/write/updateOne-collation.yml +2 -1
  983. data/spec/spec_tests/data/crud_unified/aggregate-allowdiskuse.yml +75 -0
  984. data/spec/spec_tests/data/crud_unified/aggregate-let.yml +138 -0
  985. data/spec/spec_tests/data/crud_unified/aggregate-merge.yml +185 -0
  986. data/spec/spec_tests/data/crud_unified/aggregate-out-readConcern.yml +171 -0
  987. data/spec/spec_tests/data/crud_unified/aggregate-write-readPreference.yml +155 -0
  988. data/spec/spec_tests/data/crud_unified/aggregate.yml +215 -0
  989. data/spec/spec_tests/data/crud_unified/bulkWrite-arrayFilters-clientError.yml +98 -0
  990. data/spec/spec_tests/data/crud_unified/bulkWrite-arrayFilters.yml +174 -0
  991. data/spec/spec_tests/data/crud_unified/bulkWrite-comment.yml +189 -0
  992. data/spec/spec_tests/data/crud_unified/bulkWrite-delete-hint-clientError.yml +113 -0
  993. data/spec/spec_tests/data/crud_unified/bulkWrite-delete-hint-serverError.yml +142 -0
  994. data/spec/spec_tests/data/crud_unified/bulkWrite-delete-hint.yml +154 -0
  995. data/spec/spec_tests/data/crud_unified/bulkWrite-deleteMany-hint-unacknowledged.yml +98 -0
  996. data/spec/spec_tests/data/crud_unified/bulkWrite-deleteMany-let.yml +86 -0
  997. data/spec/spec_tests/data/crud_unified/bulkWrite-deleteOne-hint-unacknowledged.yml +97 -0
  998. data/spec/spec_tests/data/crud_unified/bulkWrite-deleteOne-let.yml +86 -0
  999. data/spec/spec_tests/data/crud_unified/bulkWrite-insertOne-dots_and_dollars.yml +138 -0
  1000. data/spec/spec_tests/data/crud_unified/bulkWrite-replaceOne-dots_and_dollars.yml +165 -0
  1001. data/spec/spec_tests/data/crud_unified/bulkWrite-replaceOne-hint-unacknowledged.yml +103 -0
  1002. data/spec/spec_tests/data/crud_unified/bulkWrite-replaceOne-let.yml +93 -0
  1003. data/spec/spec_tests/data/crud_unified/bulkWrite-update-hint-clientError.yml +148 -0
  1004. data/spec/spec_tests/data/crud_unified/bulkWrite-update-hint-serverError.yml +239 -0
  1005. data/spec/spec_tests/data/crud_unified/bulkWrite-update-hint.yml +256 -0
  1006. data/spec/spec_tests/data/crud_unified/bulkWrite-update-validation.yml +73 -0
  1007. data/spec/spec_tests/data/crud_unified/bulkWrite-updateMany-dots_and_dollars.yml +150 -0
  1008. data/spec/spec_tests/data/crud_unified/bulkWrite-updateMany-hint-unacknowledged.yml +104 -0
  1009. data/spec/spec_tests/data/crud_unified/bulkWrite-updateMany-let.yml +96 -0
  1010. data/spec/spec_tests/data/crud_unified/bulkWrite-updateOne-dots_and_dollars.yml +150 -0
  1011. data/spec/spec_tests/data/crud_unified/bulkWrite-updateOne-hint-unacknowledged.yml +103 -0
  1012. data/spec/spec_tests/data/crud_unified/bulkWrite-updateOne-let.yml +95 -0
  1013. data/spec/spec_tests/data/crud_unified/countDocuments-comment.yml +92 -0
  1014. data/spec/spec_tests/data/crud_unified/db-aggregate-write-readPreference.yml +151 -0
  1015. data/spec/spec_tests/data/crud_unified/db-aggregate.yml +73 -0
  1016. data/spec/spec_tests/data/crud_unified/deleteMany-comment.yml +97 -0
  1017. data/spec/spec_tests/data/crud_unified/deleteMany-hint-clientError.yml +87 -0
  1018. data/spec/spec_tests/data/crud_unified/deleteMany-hint-serverError.yml +107 -0
  1019. data/spec/spec_tests/data/crud_unified/deleteMany-hint-unacknowledged.yml +90 -0
  1020. data/spec/spec_tests/data/crud_unified/deleteMany-hint.yml +99 -0
  1021. data/spec/spec_tests/data/crud_unified/deleteMany-let.yml +93 -0
  1022. data/spec/spec_tests/data/crud_unified/deleteOne-comment.yml +98 -0
  1023. data/spec/spec_tests/data/crud_unified/deleteOne-hint-clientError.yml +80 -0
  1024. data/spec/spec_tests/data/crud_unified/deleteOne-hint-serverError.yml +100 -0
  1025. data/spec/spec_tests/data/crud_unified/deleteOne-hint-unacknowledged.yml +89 -0
  1026. data/spec/spec_tests/data/crud_unified/deleteOne-hint.yml +95 -0
  1027. data/spec/spec_tests/data/crud_unified/deleteOne-let.yml +91 -0
  1028. data/spec/spec_tests/data/crud_unified/distinct-comment.yml +98 -0
  1029. data/spec/spec_tests/data/crud_unified/estimatedDocumentCount-comment.yml +95 -0
  1030. data/spec/spec_tests/data/crud_unified/estimatedDocumentCount.yml +137 -0
  1031. data/spec/spec_tests/data/crud_unified/find-allowdiskuse-clientError.yml +55 -0
  1032. data/spec/spec_tests/data/crud_unified/find-allowdiskuse-serverError.yml +68 -0
  1033. data/spec/spec_tests/data/crud_unified/find-allowdiskuse.yml +79 -0
  1034. data/spec/spec_tests/data/crud_unified/find-comment.yml +166 -0
  1035. data/spec/spec_tests/data/crud_unified/find-let.yml +71 -0
  1036. data/spec/spec_tests/data/crud_unified/find.yml +68 -0
  1037. data/spec/spec_tests/data/crud_unified/findOneAndDelete-comment.yml +96 -0
  1038. data/spec/spec_tests/data/crud_unified/findOneAndDelete-hint-clientError.yml +91 -0
  1039. data/spec/spec_tests/data/crud_unified/findOneAndDelete-hint-serverError.yml +107 -0
  1040. data/spec/spec_tests/data/crud_unified/findOneAndDelete-hint-unacknowledged.yml +88 -0
  1041. data/spec/spec_tests/data/crud_unified/findOneAndDelete-hint.yml +102 -0
  1042. data/spec/spec_tests/data/crud_unified/findOneAndDelete-let.yml +86 -0
  1043. data/spec/spec_tests/data/crud_unified/findOneAndReplace-comment.yml +101 -0
  1044. data/spec/spec_tests/data/crud_unified/findOneAndReplace-dots_and_dollars.yml +140 -0
  1045. data/spec/spec_tests/data/crud_unified/findOneAndReplace-hint-clientError.yml +83 -0
  1046. data/spec/spec_tests/data/crud_unified/findOneAndReplace-hint-serverError.yml +99 -0
  1047. data/spec/spec_tests/data/crud_unified/findOneAndReplace-hint-unacknowledged.yml +96 -0
  1048. data/spec/spec_tests/data/crud_unified/findOneAndReplace-hint.yml +98 -0
  1049. data/spec/spec_tests/data/crud_unified/findOneAndReplace-let.yml +94 -0
  1050. data/spec/spec_tests/data/crud_unified/findOneAndUpdate-comment.yml +95 -0
  1051. data/spec/spec_tests/data/crud_unified/findOneAndUpdate-dots_and_dollars.yml +127 -0
  1052. data/spec/spec_tests/data/crud_unified/findOneAndUpdate-hint-clientError.yml +84 -0
  1053. data/spec/spec_tests/data/crud_unified/findOneAndUpdate-hint-serverError.yml +100 -0
  1054. data/spec/spec_tests/data/crud_unified/findOneAndUpdate-hint-unacknowledged.yml +92 -0
  1055. data/spec/spec_tests/data/crud_unified/findOneAndUpdate-hint.yml +99 -0
  1056. data/spec/spec_tests/data/crud_unified/findOneAndUpdate-let.yml +96 -0
  1057. data/spec/spec_tests/data/crud_unified/insertMany-comment.yml +93 -0
  1058. data/spec/spec_tests/data/crud_unified/insertMany-dots_and_dollars.yml +128 -0
  1059. data/spec/spec_tests/data/crud_unified/insertOne-comment.yml +91 -0
  1060. data/spec/spec_tests/data/crud_unified/insertOne-dots_and_dollars.yml +238 -0
  1061. data/spec/spec_tests/data/crud_unified/replaceOne-comment.yml +105 -0
  1062. data/spec/spec_tests/data/crud_unified/replaceOne-dots_and_dollars.yml +180 -0
  1063. data/spec/spec_tests/data/crud_unified/replaceOne-hint-unacknowledged.yml +95 -0
  1064. data/spec/spec_tests/data/crud_unified/replaceOne-hint.yml +108 -0
  1065. data/spec/spec_tests/data/crud_unified/replaceOne-let.yml +98 -0
  1066. data/spec/spec_tests/data/crud_unified/replaceOne-validation.yml +37 -0
  1067. data/spec/spec_tests/data/crud_unified/updateMany-comment.yml +104 -0
  1068. data/spec/spec_tests/data/crud_unified/updateMany-dots_and_dollars.yml +138 -0
  1069. data/spec/spec_tests/data/crud_unified/updateMany-hint-clientError.yml +91 -0
  1070. data/spec/spec_tests/data/crud_unified/updateMany-hint-serverError.yml +115 -0
  1071. data/spec/spec_tests/data/crud_unified/updateMany-hint-unacknowledged.yml +96 -0
  1072. data/spec/spec_tests/data/crud_unified/updateMany-hint.yml +115 -0
  1073. data/spec/spec_tests/data/crud_unified/updateMany-let.yml +107 -0
  1074. data/spec/spec_tests/data/crud_unified/updateMany-validation.yml +39 -0
  1075. data/spec/spec_tests/data/crud_unified/updateOne-comment.yml +104 -0
  1076. data/spec/spec_tests/data/crud_unified/updateOne-dots_and_dollars.yml +138 -0
  1077. data/spec/spec_tests/data/crud_unified/updateOne-hint-clientError.yml +85 -0
  1078. data/spec/spec_tests/data/crud_unified/updateOne-hint-serverError.yml +109 -0
  1079. data/spec/spec_tests/data/crud_unified/updateOne-hint-unacknowledged.yml +95 -0
  1080. data/spec/spec_tests/data/crud_unified/updateOne-hint.yml +109 -0
  1081. data/spec/spec_tests/data/crud_unified/updateOne-let.yml +102 -0
  1082. data/spec/spec_tests/data/crud_unified/updateOne-validation.yml +37 -0
  1083. data/spec/spec_tests/data/crud_unified/updateWithPipelines.yml +299 -0
  1084. data/spec/spec_tests/data/gridfs_unified/delete.yml +198 -0
  1085. data/spec/spec_tests/data/gridfs_unified/download.yml +241 -0
  1086. data/spec/spec_tests/data/gridfs_unified/downloadByName.yml +159 -0
  1087. data/spec/spec_tests/data/gridfs_unified/upload-disableMD5.yml +92 -0
  1088. data/spec/spec_tests/data/gridfs_unified/upload.yml +288 -0
  1089. data/spec/spec_tests/data/load_balancers/event-monitoring.yml +99 -0
  1090. data/spec/spec_tests/data/load_balancers/lb-connection-establishment.yml +36 -0
  1091. data/spec/spec_tests/data/load_balancers/non-lb-connection-establishment.yml +56 -0
  1092. data/spec/spec_tests/data/load_balancers/server-selection.yml +50 -0
  1093. data/spec/spec_tests/data/max_staleness/ReplicaSetNoPrimary/DefaultNoMaxStaleness.yml +2 -2
  1094. data/spec/spec_tests/data/max_staleness/ReplicaSetNoPrimary/LastUpdateTime.yml +3 -3
  1095. data/spec/spec_tests/data/max_staleness/ReplicaSetNoPrimary/MaxStalenessTooSmall.yml +15 -0
  1096. data/spec/spec_tests/data/max_staleness/ReplicaSetNoPrimary/Nearest.yml +3 -3
  1097. data/spec/spec_tests/data/max_staleness/ReplicaSetNoPrimary/Nearest2.yml +3 -3
  1098. data/spec/spec_tests/data/max_staleness/ReplicaSetNoPrimary/NoKnownServers.yml +4 -3
  1099. data/spec/spec_tests/data/max_staleness/ReplicaSetNoPrimary/PrimaryPreferred.yml +2 -2
  1100. data/spec/spec_tests/data/max_staleness/ReplicaSetNoPrimary/PrimaryPreferred_tags.yml +2 -2
  1101. data/spec/spec_tests/data/max_staleness/ReplicaSetNoPrimary/Secondary.yml +4 -4
  1102. data/spec/spec_tests/data/max_staleness/ReplicaSetNoPrimary/SecondaryPreferred.yml +2 -2
  1103. data/spec/spec_tests/data/max_staleness/ReplicaSetNoPrimary/SecondaryPreferred_tags.yml +4 -4
  1104. data/spec/spec_tests/data/max_staleness/ReplicaSetNoPrimary/ZeroMaxStaleness.yml +2 -2
  1105. data/spec/spec_tests/data/max_staleness/ReplicaSetWithPrimary/DefaultNoMaxStaleness.yml +2 -2
  1106. data/spec/spec_tests/data/max_staleness/ReplicaSetWithPrimary/LastUpdateTime.yml +3 -3
  1107. data/spec/spec_tests/data/max_staleness/ReplicaSetWithPrimary/LongHeartbeat.yml +2 -2
  1108. data/spec/spec_tests/data/max_staleness/ReplicaSetWithPrimary/LongHeartbeat2.yml +2 -2
  1109. data/spec/spec_tests/data/max_staleness/ReplicaSetWithPrimary/MaxStalenessTooSmall.yml +2 -2
  1110. data/spec/spec_tests/data/max_staleness/ReplicaSetWithPrimary/MaxStalenessWithModePrimary.yml +2 -2
  1111. data/spec/spec_tests/data/max_staleness/ReplicaSetWithPrimary/Nearest.yml +3 -3
  1112. data/spec/spec_tests/data/max_staleness/ReplicaSetWithPrimary/Nearest2.yml +3 -3
  1113. data/spec/spec_tests/data/max_staleness/ReplicaSetWithPrimary/Nearest_tags.yml +2 -2
  1114. data/spec/spec_tests/data/max_staleness/ReplicaSetWithPrimary/PrimaryPreferred.yml +2 -2
  1115. data/spec/spec_tests/data/max_staleness/ReplicaSetWithPrimary/SecondaryPreferred.yml +2 -2
  1116. data/spec/spec_tests/data/max_staleness/ReplicaSetWithPrimary/SecondaryPreferred_tags.yml +5 -5
  1117. data/spec/spec_tests/data/max_staleness/ReplicaSetWithPrimary/SecondaryPreferred_tags2.yml +3 -3
  1118. data/spec/spec_tests/data/max_staleness/ReplicaSetWithPrimary/Secondary_tags.yml +5 -5
  1119. data/spec/spec_tests/data/max_staleness/ReplicaSetWithPrimary/Secondary_tags2.yml +3 -3
  1120. data/spec/spec_tests/data/max_staleness/ReplicaSetWithPrimary/ZeroMaxStaleness.yml +2 -2
  1121. data/spec/spec_tests/data/max_staleness/Sharded/SmallMaxStaleness.yml +2 -2
  1122. data/spec/spec_tests/data/max_staleness/Single/SmallMaxStaleness.yml +1 -1
  1123. data/spec/spec_tests/data/max_staleness/Unknown/SmallMaxStaleness.yml +1 -0
  1124. data/spec/spec_tests/data/read_write_concern/connection-string/write-concern.yml +1 -4
  1125. data/spec/spec_tests/data/read_write_concern/operation/default-write-concern-2.6.yml +215 -0
  1126. data/spec/spec_tests/data/read_write_concern/operation/default-write-concern-3.2.yml +58 -0
  1127. data/spec/spec_tests/data/read_write_concern/operation/default-write-concern-3.4.yml +95 -0
  1128. data/spec/spec_tests/data/read_write_concern/operation/default-write-concern-4.2.yml +36 -0
  1129. data/spec/spec_tests/data/retryable_reads/{aggregate-serverErrors.yml → legacy/aggregate-serverErrors.yml} +1 -1
  1130. data/spec/spec_tests/data/retryable_reads/{changeStreams-client.watch-serverErrors.yml → legacy/changeStreams-client.watch-serverErrors.yml} +7 -6
  1131. data/spec/spec_tests/data/retryable_reads/{changeStreams-client.watch.yml → legacy/changeStreams-client.watch.yml} +2 -1
  1132. data/spec/spec_tests/data/retryable_reads/{changeStreams-db.coll.watch-serverErrors.yml → legacy/changeStreams-db.coll.watch-serverErrors.yml} +7 -6
  1133. data/spec/spec_tests/data/retryable_reads/{changeStreams-db.coll.watch.yml → legacy/changeStreams-db.coll.watch.yml} +2 -1
  1134. data/spec/spec_tests/data/retryable_reads/{changeStreams-db.watch-serverErrors.yml → legacy/changeStreams-db.watch-serverErrors.yml} +7 -6
  1135. data/spec/spec_tests/data/retryable_reads/{changeStreams-db.watch.yml → legacy/changeStreams-db.watch.yml} +2 -1
  1136. data/spec/spec_tests/data/retryable_reads/{count-serverErrors.yml → legacy/count-serverErrors.yml} +1 -1
  1137. data/spec/spec_tests/data/retryable_reads/{countDocuments-serverErrors.yml → legacy/countDocuments-serverErrors.yml} +1 -1
  1138. data/spec/spec_tests/data/retryable_reads/{distinct-serverErrors.yml → legacy/distinct-serverErrors.yml} +1 -1
  1139. data/spec/spec_tests/data/retryable_reads/{estimatedDocumentCount-serverErrors.yml → legacy/estimatedDocumentCount-serverErrors.yml} +1 -1
  1140. data/spec/spec_tests/data/retryable_reads/{find-serverErrors.yml → legacy/find-serverErrors.yml} +1 -1
  1141. data/spec/spec_tests/data/retryable_reads/{findOne-serverErrors.yml → legacy/findOne-serverErrors.yml} +1 -1
  1142. data/spec/spec_tests/data/retryable_reads/{gridfs-download-serverErrors.yml → legacy/gridfs-download-serverErrors.yml} +1 -1
  1143. data/spec/spec_tests/data/retryable_reads/{gridfs-downloadByName-serverErrors.yml → legacy/gridfs-downloadByName-serverErrors.yml} +1 -1
  1144. data/spec/spec_tests/data/retryable_reads/{listCollectionNames-serverErrors.yml → legacy/listCollectionNames-serverErrors.yml} +1 -1
  1145. data/spec/spec_tests/data/retryable_reads/{listCollectionObjects-serverErrors.yml → legacy/listCollectionObjects-serverErrors.yml} +1 -1
  1146. data/spec/spec_tests/data/retryable_reads/{listCollections-serverErrors.yml → legacy/listCollections-serverErrors.yml} +1 -1
  1147. data/spec/spec_tests/data/retryable_reads/{listDatabaseNames-serverErrors.yml → legacy/listDatabaseNames-serverErrors.yml} +1 -1
  1148. data/spec/spec_tests/data/retryable_reads/{listDatabaseObjects-serverErrors.yml → legacy/listDatabaseObjects-serverErrors.yml} +1 -1
  1149. data/spec/spec_tests/data/retryable_reads/{listDatabases-serverErrors.yml → legacy/listDatabases-serverErrors.yml} +1 -1
  1150. data/spec/spec_tests/data/retryable_reads/{listIndexNames-serverErrors.yml → legacy/listIndexNames-serverErrors.yml} +1 -1
  1151. data/spec/spec_tests/data/retryable_reads/{listIndexNames.yml → legacy/listIndexNames.yml} +1 -1
  1152. data/spec/spec_tests/data/retryable_reads/{listIndexes-serverErrors.yml → legacy/listIndexes-serverErrors.yml} +1 -1
  1153. data/spec/spec_tests/data/retryable_reads/{mapReduce.yml → legacy/mapReduce.yml} +3 -1
  1154. data/spec/spec_tests/data/retryable_reads/unified/handshakeError.yml +129 -0
  1155. data/spec/spec_tests/data/retryable_writes/legacy/bulkWrite-errorLabels.yml +77 -0
  1156. data/spec/spec_tests/data/retryable_writes/{bulkWrite-serverErrors.yml → legacy/bulkWrite-serverErrors.yml} +37 -0
  1157. data/spec/spec_tests/data/retryable_writes/{bulkWrite.yml → legacy/bulkWrite.yml} +30 -24
  1158. data/spec/spec_tests/data/retryable_writes/legacy/deleteOne-errorLabels.yml +48 -0
  1159. data/spec/spec_tests/data/retryable_writes/{deleteOne-serverErrors.yml → legacy/deleteOne-serverErrors.yml} +22 -0
  1160. data/spec/spec_tests/data/retryable_writes/legacy/findOneAndDelete-errorLabels.yml +49 -0
  1161. data/spec/spec_tests/data/retryable_writes/{findOneAndDelete-serverErrors.yml → legacy/findOneAndDelete-serverErrors.yml} +23 -0
  1162. data/spec/spec_tests/data/retryable_writes/legacy/findOneAndReplace-errorLabels.yml +52 -0
  1163. data/spec/spec_tests/data/retryable_writes/{findOneAndReplace-serverErrors.yml → legacy/findOneAndReplace-serverErrors.yml} +25 -0
  1164. data/spec/spec_tests/data/retryable_writes/legacy/findOneAndUpdate-errorLabels.yml +52 -0
  1165. data/spec/spec_tests/data/retryable_writes/{findOneAndUpdate-serverErrors.yml → legacy/findOneAndUpdate-serverErrors.yml} +24 -0
  1166. data/spec/spec_tests/data/retryable_writes/legacy/insertMany-errorLabels.yml +54 -0
  1167. data/spec/spec_tests/data/retryable_writes/{insertMany-serverErrors.yml → legacy/insertMany-serverErrors.yml} +24 -0
  1168. data/spec/spec_tests/data/retryable_writes/legacy/insertOne-errorLabels.yml +44 -0
  1169. data/spec/spec_tests/data/retryable_writes/{insertOne-serverErrors.yml → legacy/insertOne-serverErrors.yml} +94 -3
  1170. data/spec/spec_tests/data/retryable_writes/legacy/replaceOne-errorLabels.yml +53 -0
  1171. data/spec/spec_tests/data/retryable_writes/{replaceOne-serverErrors.yml → legacy/replaceOne-serverErrors.yml} +23 -0
  1172. data/spec/spec_tests/data/retryable_writes/legacy/updateOne-errorLabels.yml +53 -0
  1173. data/spec/spec_tests/data/retryable_writes/{updateOne-serverErrors.yml → legacy/updateOne-serverErrors.yml} +23 -0
  1174. data/spec/spec_tests/data/retryable_writes/unified/bulkWrite-serverErrors.yml +96 -0
  1175. data/spec/spec_tests/data/retryable_writes/unified/handshakeError.yml +137 -0
  1176. data/spec/spec_tests/data/retryable_writes/unified/insertOne-serverErrors.yml +78 -0
  1177. data/spec/spec_tests/data/sdam/errors/error_handling_handshake.yml +55 -0
  1178. data/spec/spec_tests/data/sdam/errors/non-stale-network-error.yml +47 -0
  1179. data/spec/spec_tests/data/sdam/errors/non-stale-network-timeout-error.yml +38 -0
  1180. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-greater-InterruptedAtShutdown.yml +61 -0
  1181. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-greater-InterruptedDueToReplStateChange.yml +61 -0
  1182. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-greater-LegacyNotPrimary.yml +61 -0
  1183. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-greater-NotPrimaryNoSecondaryOk.yml +61 -0
  1184. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-greater-NotPrimaryOrSecondary.yml +61 -0
  1185. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-greater-NotWritablePrimary.yml +61 -0
  1186. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-greater-PrimarySteppedDown.yml +61 -0
  1187. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-greater-ShutdownInProgress.yml +61 -0
  1188. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-missing-InterruptedAtShutdown.yml +52 -0
  1189. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-missing-InterruptedDueToReplStateChange.yml +52 -0
  1190. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-missing-LegacyNotPrimary.yml +52 -0
  1191. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-missing-NotPrimaryNoSecondaryOk.yml +52 -0
  1192. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-missing-NotPrimaryOrSecondary.yml +52 -0
  1193. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-missing-NotWritablePrimary.yml +52 -0
  1194. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-missing-PrimarySteppedDown.yml +52 -0
  1195. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-missing-ShutdownInProgress.yml +52 -0
  1196. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-proccessId-changed-InterruptedAtShutdown.yml +61 -0
  1197. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-proccessId-changed-InterruptedDueToReplStateChange.yml +61 -0
  1198. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-proccessId-changed-LegacyNotPrimary.yml +61 -0
  1199. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-proccessId-changed-NotPrimaryNoSecondaryOk.yml +61 -0
  1200. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-proccessId-changed-NotPrimaryOrSecondary.yml +61 -0
  1201. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-proccessId-changed-NotWritablePrimary.yml +61 -0
  1202. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-proccessId-changed-PrimarySteppedDown.yml +61 -0
  1203. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-proccessId-changed-ShutdownInProgress.yml +61 -0
  1204. data/spec/spec_tests/data/sdam/errors/post-42-InterruptedAtShutdown.yml +47 -0
  1205. data/spec/spec_tests/data/sdam/errors/post-42-InterruptedDueToReplStateChange.yml +47 -0
  1206. data/spec/spec_tests/data/sdam/errors/post-42-LegacyNotPrimary.yml +47 -0
  1207. data/spec/spec_tests/data/sdam/errors/post-42-NotPrimaryNoSecondaryOk.yml +47 -0
  1208. data/spec/spec_tests/data/sdam/errors/post-42-NotPrimaryOrSecondary.yml +47 -0
  1209. data/spec/spec_tests/data/sdam/errors/post-42-NotWritablePrimary.yml +47 -0
  1210. data/spec/spec_tests/data/sdam/errors/post-42-PrimarySteppedDown.yml +47 -0
  1211. data/spec/spec_tests/data/sdam/errors/post-42-ShutdownInProgress.yml +47 -0
  1212. data/spec/spec_tests/data/sdam/errors/pre-42-InterruptedAtShutdown.yml +47 -0
  1213. data/spec/spec_tests/data/sdam/errors/pre-42-InterruptedDueToReplStateChange.yml +47 -0
  1214. data/spec/spec_tests/data/sdam/errors/pre-42-LegacyNotPrimary.yml +47 -0
  1215. data/spec/spec_tests/data/sdam/errors/pre-42-NotPrimaryNoSecondaryOk.yml +47 -0
  1216. data/spec/spec_tests/data/sdam/errors/pre-42-NotPrimaryOrSecondary.yml +47 -0
  1217. data/spec/spec_tests/data/sdam/errors/pre-42-NotWritablePrimary.yml +47 -0
  1218. data/spec/spec_tests/data/sdam/errors/pre-42-PrimarySteppedDown.yml +47 -0
  1219. data/spec/spec_tests/data/sdam/errors/pre-42-ShutdownInProgress.yml +47 -0
  1220. data/spec/spec_tests/data/sdam/errors/prefer-error-code.yml +54 -0
  1221. data/spec/spec_tests/data/sdam/errors/stale-generation-InterruptedAtShutdown.yml +91 -0
  1222. data/spec/spec_tests/data/sdam/errors/stale-generation-InterruptedDueToReplStateChange.yml +91 -0
  1223. data/spec/spec_tests/data/sdam/errors/stale-generation-NotPrimaryNoSecondaryOk.yml +91 -0
  1224. data/spec/spec_tests/data/sdam/errors/stale-generation-NotPrimaryOrSecondary.yml +91 -0
  1225. data/spec/spec_tests/data/sdam/errors/stale-generation-NotWritablePrimary.yml +91 -0
  1226. data/spec/spec_tests/data/sdam/errors/stale-generation-PrimarySteppedDown.yml +91 -0
  1227. data/spec/spec_tests/data/sdam/errors/stale-generation-ShutdownInProgress.yml +91 -0
  1228. data/spec/spec_tests/data/sdam/errors/stale-generation-afterHandshakeCompletes-InterruptedAtShutdown.yml +91 -0
  1229. data/spec/spec_tests/data/sdam/errors/stale-generation-afterHandshakeCompletes-InterruptedDueToReplStateChange.yml +91 -0
  1230. data/spec/spec_tests/data/sdam/errors/stale-generation-afterHandshakeCompletes-LegacyNotPrimary.yml +91 -0
  1231. data/spec/spec_tests/data/sdam/errors/stale-generation-afterHandshakeCompletes-NotPrimaryNoSecondaryOk.yml +91 -0
  1232. data/spec/spec_tests/data/sdam/errors/stale-generation-afterHandshakeCompletes-NotPrimaryOrSecondary.yml +91 -0
  1233. data/spec/spec_tests/data/sdam/errors/stale-generation-afterHandshakeCompletes-NotWritablePrimary.yml +91 -0
  1234. data/spec/spec_tests/data/sdam/errors/stale-generation-afterHandshakeCompletes-PrimarySteppedDown.yml +91 -0
  1235. data/spec/spec_tests/data/sdam/errors/stale-generation-afterHandshakeCompletes-ShutdownInProgress.yml +91 -0
  1236. data/spec/spec_tests/data/sdam/errors/stale-generation-afterHandshakeCompletes-network.yml +82 -0
  1237. data/spec/spec_tests/data/sdam/errors/stale-generation-afterHandshakeCompletes-timeout.yml +82 -0
  1238. data/spec/spec_tests/data/sdam/errors/stale-generation-beforeHandshakeCompletes-InterruptedAtShutdown.yml +91 -0
  1239. data/spec/spec_tests/data/sdam/errors/stale-generation-beforeHandshakeCompletes-InterruptedDueToReplStateChange.yml +91 -0
  1240. data/spec/spec_tests/data/sdam/errors/stale-generation-beforeHandshakeCompletes-LegacyNotPrimary.yml +91 -0
  1241. data/spec/spec_tests/data/sdam/errors/stale-generation-beforeHandshakeCompletes-NotPrimaryNoSecondaryOk.yml +91 -0
  1242. data/spec/spec_tests/data/sdam/errors/stale-generation-beforeHandshakeCompletes-NotPrimaryOrSecondary.yml +91 -0
  1243. data/spec/spec_tests/data/sdam/errors/stale-generation-beforeHandshakeCompletes-NotWritablePrimary.yml +91 -0
  1244. data/spec/spec_tests/data/sdam/errors/stale-generation-beforeHandshakeCompletes-PrimarySteppedDown.yml +91 -0
  1245. data/spec/spec_tests/data/sdam/errors/stale-generation-beforeHandshakeCompletes-ShutdownInProgress.yml +91 -0
  1246. data/spec/spec_tests/data/sdam/errors/stale-generation-beforeHandshakeCompletes-network.yml +82 -0
  1247. data/spec/spec_tests/data/sdam/errors/stale-generation-beforeHandshakeCompletes-timeout.yml +82 -0
  1248. data/spec/spec_tests/data/sdam/errors/stale-topologyVersion-InterruptedAtShutdown.yml +65 -0
  1249. data/spec/spec_tests/data/sdam/errors/stale-topologyVersion-InterruptedDueToReplStateChange.yml +65 -0
  1250. data/spec/spec_tests/data/sdam/errors/stale-topologyVersion-LegacyNotPrimary.yml +65 -0
  1251. data/spec/spec_tests/data/sdam/errors/stale-topologyVersion-NotPrimaryNoSecondaryOk.yml +65 -0
  1252. data/spec/spec_tests/data/sdam/errors/stale-topologyVersion-NotPrimaryOrSecondary.yml +65 -0
  1253. data/spec/spec_tests/data/sdam/errors/stale-topologyVersion-NotWritablePrimary.yml +65 -0
  1254. data/spec/spec_tests/data/sdam/errors/stale-topologyVersion-PrimarySteppedDown.yml +65 -0
  1255. data/spec/spec_tests/data/sdam/errors/stale-topologyVersion-ShutdownInProgress.yml +65 -0
  1256. data/spec/spec_tests/data/sdam/errors/write_errors_ignored.yml +42 -0
  1257. data/spec/spec_tests/data/sdam/load-balanced/discover_load_balancer.yml +25 -0
  1258. data/spec/spec_tests/data/sdam/rs/compatible.yml +6 -2
  1259. data/spec/spec_tests/data/sdam/rs/compatible_unknown.yml +4 -1
  1260. data/spec/spec_tests/data/sdam/rs/discover_arbiters.yml +4 -3
  1261. data/spec/spec_tests/data/sdam/rs/discover_arbiters_replicaset.yml +44 -0
  1262. data/spec/spec_tests/data/sdam/rs/discover_ghost.yml +36 -0
  1263. data/spec/spec_tests/data/sdam/rs/{ghost_discovered.yml → discover_ghost_replicaset.yml} +3 -2
  1264. data/spec/spec_tests/data/sdam/rs/discover_hidden.yml +51 -0
  1265. data/spec/spec_tests/data/sdam/rs/discover_hidden_replicaset.yml +51 -0
  1266. data/spec/spec_tests/data/sdam/rs/discover_passives.yml +6 -4
  1267. data/spec/spec_tests/data/sdam/rs/discover_passives_replicaset.yml +83 -0
  1268. data/spec/spec_tests/data/sdam/rs/discover_primary.yml +4 -3
  1269. data/spec/spec_tests/data/sdam/rs/discover_primary_replicaset.yml +43 -0
  1270. data/spec/spec_tests/data/sdam/rs/discover_rsother.yml +50 -0
  1271. data/spec/spec_tests/data/sdam/rs/{rsother_discovered.yml → discover_rsother_replicaset.yml} +5 -3
  1272. data/spec/spec_tests/data/sdam/rs/discover_secondary.yml +4 -3
  1273. data/spec/spec_tests/data/sdam/rs/discover_secondary_replicaset.yml +44 -0
  1274. data/spec/spec_tests/data/sdam/rs/discovery.yml +8 -4
  1275. data/spec/spec_tests/data/sdam/rs/equal_electionids.yml +4 -2
  1276. data/spec/spec_tests/data/sdam/rs/hosts_differ_from_seeds.yml +2 -1
  1277. data/spec/spec_tests/data/sdam/rs/incompatible_arbiter.yml +5 -1
  1278. data/spec/spec_tests/data/sdam/rs/incompatible_ghost.yml +7 -5
  1279. data/spec/spec_tests/data/sdam/rs/incompatible_other.yml +6 -2
  1280. data/spec/spec_tests/data/sdam/rs/ls_timeout.yml +12 -6
  1281. data/spec/spec_tests/data/sdam/rs/member_reconfig.yml +4 -2
  1282. data/spec/spec_tests/data/sdam/rs/member_standalone.yml +4 -2
  1283. data/spec/spec_tests/data/sdam/rs/new_primary.yml +4 -2
  1284. data/spec/spec_tests/data/sdam/rs/new_primary_new_electionid.yml +6 -3
  1285. data/spec/spec_tests/data/sdam/rs/new_primary_new_setversion.yml +6 -3
  1286. data/spec/spec_tests/data/sdam/rs/new_primary_wrong_set_name.yml +4 -2
  1287. data/spec/spec_tests/data/sdam/rs/non_rs_member.yml +1 -0
  1288. data/spec/spec_tests/data/sdam/rs/normalize_case.yml +2 -1
  1289. data/spec/spec_tests/data/sdam/rs/normalize_case_me.yml +4 -2
  1290. data/spec/spec_tests/data/sdam/rs/null_election_id.yml +8 -4
  1291. data/spec/spec_tests/data/sdam/rs/primary_becomes_ghost.yml +4 -2
  1292. data/spec/spec_tests/data/sdam/rs/primary_becomes_mongos.yml +4 -2
  1293. data/spec/spec_tests/data/sdam/rs/primary_becomes_standalone.yml +2 -1
  1294. data/spec/spec_tests/data/sdam/rs/primary_changes_set_name.yml +4 -2
  1295. data/spec/spec_tests/data/sdam/rs/primary_disconnect.yml +2 -1
  1296. data/spec/spec_tests/data/sdam/rs/primary_disconnect_electionid.yml +10 -5
  1297. data/spec/spec_tests/data/sdam/rs/primary_disconnect_setversion.yml +10 -5
  1298. data/spec/spec_tests/data/sdam/rs/primary_hint_from_secondary_with_mismatched_me.yml +4 -2
  1299. data/spec/spec_tests/data/sdam/rs/primary_mismatched_me.yml +24 -27
  1300. data/spec/spec_tests/data/sdam/rs/primary_mismatched_me_not_removed.yml +75 -0
  1301. data/spec/spec_tests/data/sdam/rs/primary_reports_new_member.yml +8 -4
  1302. data/spec/spec_tests/data/sdam/rs/primary_to_no_primary_mismatched_me.yml +81 -56
  1303. data/spec/spec_tests/data/sdam/rs/primary_wrong_set_name.yml +2 -1
  1304. data/spec/spec_tests/data/sdam/rs/repeated.yml +105 -0
  1305. data/spec/spec_tests/data/sdam/rs/replicaset_rsnp.yml +21 -0
  1306. data/spec/spec_tests/data/sdam/rs/response_from_removed.yml +4 -2
  1307. data/spec/spec_tests/data/sdam/rs/{primary_address_change.yml → ruby_primary_address_change.yml} +2 -0
  1308. data/spec/spec_tests/data/sdam/rs/sec_not_auth.yml +4 -2
  1309. data/spec/spec_tests/data/sdam/rs/secondary_ignore_ok_0.yml +4 -2
  1310. data/spec/spec_tests/data/sdam/rs/secondary_mismatched_me.yml +5 -3
  1311. data/spec/spec_tests/data/sdam/rs/secondary_wrong_set_name.yml +2 -1
  1312. data/spec/spec_tests/data/sdam/rs/secondary_wrong_set_name_with_primary.yml +4 -2
  1313. data/spec/spec_tests/data/sdam/rs/setversion_without_electionid.yml +4 -2
  1314. data/spec/spec_tests/data/sdam/rs/stepdown_change_set_name.yml +4 -2
  1315. data/spec/spec_tests/data/sdam/rs/too_new.yml +6 -2
  1316. data/spec/spec_tests/data/sdam/rs/too_old.yml +4 -2
  1317. data/spec/spec_tests/data/sdam/rs/topology_version_equal.yml +68 -0
  1318. data/spec/spec_tests/data/sdam/rs/topology_version_greater.yml +194 -0
  1319. data/spec/spec_tests/data/sdam/rs/topology_version_less.yml +64 -0
  1320. data/spec/spec_tests/data/sdam/rs/unexpected_mongos.yml +2 -1
  1321. data/spec/spec_tests/data/sdam/rs/use_setversion_without_electionid.yml +6 -3
  1322. data/spec/spec_tests/data/sdam/rs/wrong_set_name.yml +2 -1
  1323. data/spec/spec_tests/data/sdam/sharded/compatible.yml +4 -2
  1324. data/spec/spec_tests/data/sdam/sharded/discover_single_mongos.yml +24 -0
  1325. data/spec/spec_tests/data/sdam/sharded/ls_timeout_mongos.yml +9 -5
  1326. data/spec/spec_tests/data/sdam/sharded/mongos_disconnect.yml +6 -3
  1327. data/spec/spec_tests/data/sdam/sharded/multiple_mongoses.yml +4 -2
  1328. data/spec/spec_tests/data/sdam/sharded/non_mongos_removed.yml +4 -2
  1329. data/spec/spec_tests/data/sdam/sharded/{primary_address_change.yml → ruby_primary_different_address.yml} +1 -1
  1330. data/spec/spec_tests/data/sdam/sharded/{primary_mismatched_me.yml → ruby_primary_mismatched_me.yml} +1 -1
  1331. data/spec/spec_tests/data/sdam/sharded/too_new.yml +4 -2
  1332. data/spec/spec_tests/data/sdam/sharded/too_old.yml +4 -2
  1333. data/spec/spec_tests/data/sdam/single/compatible.yml +2 -1
  1334. data/spec/spec_tests/data/sdam/single/direct_connection_external_ip.yml +3 -2
  1335. data/spec/spec_tests/data/sdam/single/direct_connection_mongos.yml +4 -3
  1336. data/spec/spec_tests/data/sdam/single/direct_connection_replicaset.yml +23 -0
  1337. data/spec/spec_tests/data/sdam/single/direct_connection_rsarbiter.yml +4 -3
  1338. data/spec/spec_tests/data/sdam/single/direct_connection_rsprimary.yml +4 -3
  1339. data/spec/spec_tests/data/sdam/single/direct_connection_rssecondary.yml +4 -3
  1340. data/spec/spec_tests/data/sdam/single/direct_connection_standalone.yml +4 -3
  1341. data/spec/spec_tests/data/sdam/single/{unavailable_seed.yml → direct_connection_unavailable_seed.yml} +2 -2
  1342. data/spec/spec_tests/data/sdam/single/direct_connection_wrong_set_name.yml +40 -0
  1343. data/spec/spec_tests/data/sdam/single/discover_standalone.yml +35 -0
  1344. data/spec/spec_tests/data/sdam/single/discover_unavailable_seed.yml +28 -0
  1345. data/spec/spec_tests/data/sdam/single/ls_timeout_standalone.yml +2 -1
  1346. data/spec/spec_tests/data/sdam/single/not_ok_response.yml +5 -3
  1347. data/spec/spec_tests/data/sdam/single/{primary_address_change.yml → ruby_primary_different_address.yml} +1 -1
  1348. data/spec/spec_tests/data/sdam/single/{primary_mismatched_me.yml → ruby_primary_mismatched_me.yml} +1 -1
  1349. data/spec/spec_tests/data/sdam/single/standalone_removed.yml +2 -1
  1350. data/spec/spec_tests/data/sdam/single/{direct_connection_slave.yml → standalone_using_legacy_hello.yml} +2 -2
  1351. data/spec/spec_tests/data/sdam/single/too_new.yml +2 -1
  1352. data/spec/spec_tests/data/sdam/single/too_old.yml +2 -1
  1353. data/spec/spec_tests/data/sdam/single/too_old_then_upgraded.yml +48 -0
  1354. data/spec/spec_tests/data/sdam_integration/cancel-server-check.yml +96 -0
  1355. data/spec/spec_tests/data/sdam_integration/connectTimeoutMS.yml +88 -0
  1356. data/spec/spec_tests/data/sdam_integration/find-network-error.yml +85 -0
  1357. data/spec/spec_tests/data/sdam_integration/find-shutdown-error.yml +118 -0
  1358. data/spec/spec_tests/data/sdam_integration/hello-command-error.yml +152 -0
  1359. data/spec/spec_tests/data/sdam_integration/hello-network-error.yml +148 -0
  1360. data/spec/spec_tests/data/sdam_integration/hello-timeout.yml +219 -0
  1361. data/spec/spec_tests/data/sdam_integration/insert-network-error.yml +88 -0
  1362. data/spec/spec_tests/data/sdam_integration/insert-shutdown-error.yml +117 -0
  1363. data/spec/spec_tests/data/sdam_integration/rediscover-quickly-after-step-down.yml +98 -0
  1364. data/spec/spec_tests/data/sdam_monitoring/discovered_standalone.yml +2 -4
  1365. data/spec/spec_tests/data/sdam_monitoring/load_balancer.yml +65 -0
  1366. data/spec/spec_tests/data/sdam_monitoring/{replica_set_with_primary_change.yml → replica_set_primary_address_change.yml} +27 -5
  1367. data/spec/spec_tests/data/sdam_monitoring/replica_set_with_me_mismatch.yml +26 -74
  1368. data/spec/spec_tests/data/sdam_monitoring/replica_set_with_no_primary.yml +2 -1
  1369. data/spec/spec_tests/data/sdam_monitoring/replica_set_with_primary.yml +2 -1
  1370. data/spec/spec_tests/data/sdam_monitoring/replica_set_with_removal.yml +21 -16
  1371. data/spec/spec_tests/data/sdam_monitoring/required_replica_set.yml +2 -1
  1372. data/spec/spec_tests/data/sdam_monitoring/standalone.yml +3 -3
  1373. data/spec/spec_tests/data/sdam_monitoring/standalone_repeated.yml +2 -2
  1374. data/spec/spec_tests/data/sdam_monitoring/standalone_suppress_equal_description_changes.yml +73 -0
  1375. data/spec/spec_tests/data/sdam_monitoring/standalone_to_rs_with_me_mismatch.yml +2 -2
  1376. data/spec/spec_tests/data/seed_list_discovery/load-balanced/loadBalanced-directConnection.yml +13 -0
  1377. data/spec/spec_tests/data/seed_list_discovery/load-balanced/loadBalanced-no-results.yml +5 -0
  1378. data/spec/spec_tests/data/seed_list_discovery/load-balanced/loadBalanced-replicaSet-errors.yml +6 -0
  1379. data/spec/spec_tests/data/seed_list_discovery/load-balanced/loadBalanced-true-multiple-hosts.yml +5 -0
  1380. data/spec/spec_tests/data/seed_list_discovery/load-balanced/loadBalanced-true-txt.yml +10 -0
  1381. data/spec/spec_tests/data/seed_list_discovery/load-balanced/srvMaxHosts-conflicts_with_loadBalanced-true-txt.yml +5 -0
  1382. data/spec/spec_tests/data/seed_list_discovery/load-balanced/srvMaxHosts-conflicts_with_loadBalanced-true.yml +5 -0
  1383. data/spec/spec_tests/data/seed_list_discovery/load-balanced/srvMaxHosts-zero-txt.yml +10 -0
  1384. data/spec/spec_tests/data/seed_list_discovery/load-balanced/srvMaxHosts-zero.yml +10 -0
  1385. data/spec/spec_tests/data/seed_list_discovery/replica-set/direct-connection-false.yml +10 -0
  1386. data/spec/spec_tests/data/seed_list_discovery/replica-set/direct-connection-true.yml +5 -0
  1387. data/spec/spec_tests/data/seed_list_discovery/replica-set/encoded-userinfo-and-db.yml +15 -0
  1388. data/spec/spec_tests/data/seed_list_discovery/replica-set/loadBalanced-false-txt.yml +10 -0
  1389. data/spec/spec_tests/data/seed_list_discovery/replica-set/srv-service-name.yml +11 -0
  1390. data/spec/spec_tests/data/seed_list_discovery/replica-set/srvMaxHosts-conflicts_with_replicaSet-txt.yml +5 -0
  1391. data/spec/spec_tests/data/seed_list_discovery/replica-set/srvMaxHosts-conflicts_with_replicaSet.yml +5 -0
  1392. data/spec/spec_tests/data/seed_list_discovery/replica-set/srvMaxHosts-equal_to_srv_records.yml +16 -0
  1393. data/spec/spec_tests/data/seed_list_discovery/replica-set/srvMaxHosts-greater_than_srv_records.yml +15 -0
  1394. data/spec/spec_tests/data/seed_list_discovery/replica-set/srvMaxHosts-less_than_srv_records.yml +15 -0
  1395. data/spec/spec_tests/data/seed_list_discovery/replica-set/srvMaxHosts-zero-txt.yml +15 -0
  1396. data/spec/spec_tests/data/seed_list_discovery/replica-set/srvMaxHosts-zero.yml +15 -0
  1397. data/spec/spec_tests/data/seed_list_discovery/replica-set/uri-with-admin-database.yml +13 -0
  1398. data/spec/spec_tests/data/seed_list_discovery/replica-set/uri-with-auth.yml +12 -0
  1399. data/spec/spec_tests/data/seed_list_discovery/sharded/srvMaxHosts-equal_to_srv_records.yml +13 -0
  1400. data/spec/spec_tests/data/seed_list_discovery/sharded/srvMaxHosts-greater_than_srv_records.yml +12 -0
  1401. data/spec/spec_tests/data/seed_list_discovery/sharded/srvMaxHosts-less_than_srv_records.yml +10 -0
  1402. data/spec/spec_tests/data/seed_list_discovery/sharded/srvMaxHosts-zero.yml +11 -0
  1403. data/spec/spec_tests/data/server_selection/Unknown/read/ghost.yml +11 -0
  1404. data/spec/spec_tests/data/server_selection/Unknown/write/ghost.yml +11 -0
  1405. data/spec/spec_tests/data/sessions_unified/driver-sessions-server-support.yml +123 -0
  1406. data/spec/spec_tests/data/sessions_unified/snapshot-sessions-not-supported-client-error.yml +75 -0
  1407. data/spec/spec_tests/data/sessions_unified/snapshot-sessions-not-supported-server-error.yml +102 -0
  1408. data/spec/spec_tests/data/sessions_unified/snapshot-sessions-unsupported-ops.yml +258 -0
  1409. data/spec/spec_tests/data/sessions_unified/snapshot-sessions.yml +482 -0
  1410. data/spec/spec_tests/data/transactions/create-collection.yml +131 -0
  1411. data/spec/spec_tests/data/transactions/create-index.yml +152 -0
  1412. data/spec/spec_tests/data/transactions/error-labels.yml +90 -21
  1413. data/spec/spec_tests/data/transactions/errors-client.yml +8 -9
  1414. data/spec/spec_tests/data/transactions/mongos-pin-auto.yml +3 -0
  1415. data/spec/spec_tests/data/transactions/mongos-recovery-token.yml +3 -0
  1416. data/spec/spec_tests/data/transactions/pin-mongos.yml +8 -6
  1417. data/spec/spec_tests/data/transactions/retryable-abort-errorLabels.yml +124 -0
  1418. data/spec/spec_tests/data/transactions/retryable-abort.yml +20 -5
  1419. data/spec/spec_tests/data/transactions/retryable-commit-errorLabels.yml +132 -0
  1420. data/spec/spec_tests/data/transactions/retryable-commit.yml +27 -12
  1421. data/spec/spec_tests/data/transactions_unified/do-not-retry-read-in-transaction.yml +64 -0
  1422. data/spec/spec_tests/data/transactions_unified/mongos-unpin.yml +172 -0
  1423. data/spec/spec_tests/data/transactions_unified/retryable-abort-handshake.yml +118 -0
  1424. data/spec/spec_tests/data/transactions_unified/retryable-commit-handshake.yml +118 -0
  1425. data/spec/spec_tests/data/unified/invalid/expectedEventsForClient-ignoreExtraEvents-type.yml +15 -0
  1426. data/spec/spec_tests/data/unified/valid-fail/operation-failure.yml +31 -0
  1427. data/spec/spec_tests/data/unified/valid-fail/operation-unsupported.yml +13 -0
  1428. data/spec/spec_tests/data/unified/valid-pass/expectedEventsForClient-ignoreExtraEvents.yml +78 -0
  1429. data/spec/spec_tests/data/unified/valid-pass/poc-change-streams.yml +223 -0
  1430. data/spec/spec_tests/data/unified/valid-pass/poc-command-monitoring.yml +102 -0
  1431. data/spec/spec_tests/data/unified/valid-pass/poc-crud.yml +184 -0
  1432. data/spec/spec_tests/data/unified/valid-pass/poc-gridfs.yml +155 -0
  1433. data/spec/spec_tests/data/unified/valid-pass/poc-retryable-reads.yml +193 -0
  1434. data/spec/spec_tests/data/unified/valid-pass/poc-retryable-writes.yml +210 -0
  1435. data/spec/spec_tests/data/unified/valid-pass/poc-sessions.yml +215 -0
  1436. data/spec/spec_tests/data/unified/valid-pass/poc-transactions-convenient-api.yml +235 -0
  1437. data/spec/spec_tests/data/unified/valid-pass/poc-transactions-mongos-pin-auto.yml +169 -0
  1438. data/spec/spec_tests/data/unified/valid-pass/poc-transactions.yml +171 -0
  1439. data/spec/spec_tests/data/uri_options/auth-options.yml +35 -0
  1440. data/spec/spec_tests/data/uri_options/compression-options.yml +7 -4
  1441. data/spec/spec_tests/data/uri_options/connection-options.yml +103 -0
  1442. data/spec/spec_tests/data/uri_options/read-preference-options.yml +24 -0
  1443. data/spec/spec_tests/data/uri_options/ruby-auth-options.yml +12 -0
  1444. data/spec/spec_tests/data/uri_options/ruby-connection-options.yml +58 -0
  1445. data/spec/spec_tests/data/uri_options/srv-options.yml +96 -0
  1446. data/spec/spec_tests/data/uri_options/tls-options.yml +233 -6
  1447. data/spec/spec_tests/data/versioned_api/crud-api-version-1-strict.yml +419 -0
  1448. data/spec/spec_tests/data/versioned_api/crud-api-version-1.yml +413 -0
  1449. data/spec/spec_tests/data/versioned_api/runcommand-helper-no-api-version-declared.yml +75 -0
  1450. data/spec/spec_tests/data/versioned_api/test-commands-deprecation-errors.yml +47 -0
  1451. data/spec/spec_tests/data/versioned_api/test-commands-strict-mode.yml +46 -0
  1452. data/spec/spec_tests/data/versioned_api/transaction-handling.yml +128 -0
  1453. data/spec/spec_tests/gridfs_spec.rb +5 -0
  1454. data/spec/spec_tests/gridfs_unified_spec.rb +13 -0
  1455. data/spec/spec_tests/load_balancers_spec.rb +15 -0
  1456. data/spec/spec_tests/max_staleness_spec.rb +7 -140
  1457. data/spec/spec_tests/read_write_concern_connection_string_spec.rb +6 -1
  1458. data/spec/spec_tests/read_write_concern_document_spec.rb +3 -0
  1459. data/spec/spec_tests/read_write_concern_operaton_spec.rb +13 -0
  1460. data/spec/spec_tests/retryable_reads_spec.rb +13 -5
  1461. data/spec/spec_tests/retryable_reads_unified_spec.rb +22 -0
  1462. data/spec/spec_tests/retryable_writes_spec.rb +16 -3
  1463. data/spec/spec_tests/retryable_writes_unified_spec.rb +21 -0
  1464. data/spec/spec_tests/sdam_integration_spec.rb +16 -0
  1465. data/spec/spec_tests/sdam_monitoring_spec.rb +16 -7
  1466. data/spec/spec_tests/sdam_spec.rb +75 -3
  1467. data/spec/spec_tests/seed_list_discovery_spec.rb +127 -0
  1468. data/spec/spec_tests/server_selection_rtt_spec.rb +5 -0
  1469. data/spec/spec_tests/server_selection_spec.rb +7 -114
  1470. data/spec/spec_tests/sessions_unified_spec.rb +13 -0
  1471. data/spec/spec_tests/transactions_api_spec.rb +8 -0
  1472. data/spec/spec_tests/transactions_spec.rb +8 -0
  1473. data/spec/spec_tests/transactions_unified_spec.rb +13 -0
  1474. data/spec/spec_tests/unified_spec.rb +23 -0
  1475. data/spec/spec_tests/uri_options_spec.rb +58 -41
  1476. data/spec/spec_tests/versioned_api_spec.rb +13 -0
  1477. data/spec/stress/cleanup_spec.rb +61 -0
  1478. data/spec/stress/connection_pool_stress_spec.rb +14 -13
  1479. data/spec/stress/connection_pool_timing_spec.rb +13 -9
  1480. data/spec/stress/fork_reconnect_stress_spec.rb +109 -0
  1481. data/spec/stress/push_monitor_close_spec.rb +44 -0
  1482. data/spec/support/authorization.rb +5 -12
  1483. data/spec/support/aws_utils/base.rb +137 -0
  1484. data/spec/support/aws_utils/inspector.rb +227 -0
  1485. data/spec/support/aws_utils/orchestrator.rb +373 -0
  1486. data/spec/support/aws_utils/provisioner.rb +363 -0
  1487. data/spec/support/aws_utils.rb +65 -0
  1488. data/spec/support/background_thread_registry.rb +12 -15
  1489. data/spec/support/certificates/README.md +7 -2
  1490. data/spec/support/certificates/atlas-ocsp-ca.crt +103 -0
  1491. data/spec/support/certificates/atlas-ocsp.crt +152 -0
  1492. data/spec/support/certificates/retrieve-atlas-cert +38 -0
  1493. data/spec/support/certificates/server-second-level-bundle.pem +77 -77
  1494. data/spec/support/certificates/server-second-level.crt +52 -52
  1495. data/spec/support/certificates/server-second-level.key +25 -25
  1496. data/spec/support/certificates/server-second-level.pem +77 -77
  1497. data/spec/support/client_registry.rb +37 -32
  1498. data/spec/support/client_registry_macros.rb +17 -5
  1499. data/spec/support/cluster_tools.rb +11 -3
  1500. data/spec/support/common_shortcuts.rb +160 -6
  1501. data/spec/support/constraints.rb +9 -217
  1502. data/spec/support/crypt/corpus/corpus-encrypted.json +9515 -0
  1503. data/spec/support/crypt/corpus/corpus-key-aws.json +33 -0
  1504. data/spec/support/crypt/corpus/corpus-key-azure.json +33 -0
  1505. data/spec/support/crypt/corpus/corpus-key-gcp.json +35 -0
  1506. data/spec/support/crypt/corpus/corpus-key-kmip.json +32 -0
  1507. data/spec/support/crypt/corpus/corpus-key-local.json +31 -0
  1508. data/spec/support/crypt/corpus/corpus-schema.json +6335 -0
  1509. data/spec/support/crypt/corpus/corpus.json +8619 -0
  1510. data/spec/support/crypt/data_keys/key_document_aws.json +34 -0
  1511. data/spec/support/crypt/data_keys/key_document_azure.json +33 -0
  1512. data/spec/support/crypt/data_keys/key_document_gcp.json +37 -0
  1513. data/spec/support/crypt/data_keys/key_document_kmip.json +32 -0
  1514. data/spec/support/crypt/data_keys/key_document_local.json +31 -0
  1515. data/spec/support/crypt/encryptedFields.json +33 -0
  1516. data/spec/support/crypt/external/external-key.json +31 -0
  1517. data/spec/support/crypt/external/external-schema.json +19 -0
  1518. data/spec/support/crypt/keys/key1-document.json +30 -0
  1519. data/spec/support/crypt/limits/limits-doc.json +102 -0
  1520. data/spec/support/crypt/limits/limits-key.json +31 -0
  1521. data/spec/support/crypt/limits/limits-schema.json +1405 -0
  1522. data/spec/support/crypt/schema_maps/schema_map_aws.json +17 -0
  1523. data/spec/support/crypt/schema_maps/schema_map_aws_key_alt_names.json +12 -0
  1524. data/spec/support/crypt/schema_maps/schema_map_azure.json +17 -0
  1525. data/spec/support/crypt/schema_maps/schema_map_azure_key_alt_names.json +12 -0
  1526. data/spec/support/crypt/schema_maps/schema_map_gcp.json +17 -0
  1527. data/spec/support/crypt/schema_maps/schema_map_gcp_key_alt_names.json +12 -0
  1528. data/spec/support/crypt/schema_maps/schema_map_kmip.json +17 -0
  1529. data/spec/support/crypt/schema_maps/schema_map_kmip_key_alt_names.json +12 -0
  1530. data/spec/support/crypt/schema_maps/schema_map_local.json +18 -0
  1531. data/spec/support/crypt/schema_maps/schema_map_local_key_alt_names.json +12 -0
  1532. data/spec/support/crypt.rb +402 -0
  1533. data/spec/support/dns.rb +3 -0
  1534. data/spec/support/json_ext_formatter.rb +3 -0
  1535. data/spec/support/keyword_struct.rb +29 -0
  1536. data/spec/support/local_resource_registry.rb +3 -0
  1537. data/spec/support/macros.rb +28 -0
  1538. data/spec/support/matchers.rb +52 -1
  1539. data/spec/support/mongos_macros.rb +17 -0
  1540. data/spec/support/monitoring_ext.rb +3 -0
  1541. data/spec/support/ocsp +1 -0
  1542. data/spec/support/primary_socket.rb +3 -0
  1543. data/spec/support/sdam_formatter_integration.rb +3 -0
  1544. data/spec/support/shared/app_metadata.rb +167 -0
  1545. data/spec/support/shared/auth_context.rb +16 -0
  1546. data/spec/support/shared/protocol.rb +5 -0
  1547. data/spec/support/shared/scram_conversation.rb +104 -0
  1548. data/spec/support/shared/server_selector.rb +99 -4
  1549. data/spec/support/shared/session.rb +47 -30
  1550. data/spec/support/spec_config.rb +339 -57
  1551. data/spec/support/spec_setup.rb +55 -38
  1552. data/spec/support/using_hash.rb +31 -0
  1553. data/spec/support/utils.rb +455 -35
  1554. data.tar.gz.sig +0 -0
  1555. metadata +2088 -838
  1556. metadata.gz.sig +0 -0
  1557. data/lib/mongo/cluster/srv_monitor.rb +0 -127
  1558. data/lib/mongo/collection/view/builder/find_command.rb +0 -142
  1559. data/lib/mongo/collection/view/builder/op_query.rb +0 -91
  1560. data/lib/mongo/cursor/builder/get_more_command.rb +0 -77
  1561. data/lib/mongo/cursor/builder/kill_cursors_command.rb +0 -108
  1562. data/lib/mongo/cursor/builder/op_get_more.rb +0 -61
  1563. data/lib/mongo/cursor/builder/op_kill_cursors.rb +0 -103
  1564. data/lib/mongo/operation/insert/legacy.rb +0 -60
  1565. data/lib/mongo/operation/shared/op_msg_or_list_indexes_command.rb +0 -45
  1566. data/lib/mongo/operation/update/legacy/result.rb +0 -102
  1567. data/lib/mongo/operation/update/legacy.rb +0 -65
  1568. data/lib/mongo/server/connectable.rb +0 -107
  1569. data/lib/mongo/server/context.rb +0 -69
  1570. data/spec/enterprise_auth/kerberos_spec.rb +0 -58
  1571. data/spec/mongo/cluster/srv_monitor_spec.rb +0 -214
  1572. data/spec/mongo/cursor/builder/op_kill_cursors_spec.rb +0 -56
  1573. data/spec/mongo/dbref_spec.rb +0 -149
  1574. data/spec/mongo/operation/kill_cursors_spec.rb +0 -41
  1575. data/spec/mongo/operation/read_preference_spec.rb +0 -245
  1576. data/spec/spec_tests/change_streams_spec.rb +0 -55
  1577. data/spec/spec_tests/command_monitoring_spec.rb +0 -53
  1578. data/spec/spec_tests/data/change_streams/change-streams-errors.yml +0 -76
  1579. data/spec/spec_tests/data/change_streams/change-streams.yml +0 -536
  1580. data/spec/spec_tests/data/command_monitoring/bulkWrite.yml +0 -49
  1581. data/spec/spec_tests/data/command_monitoring/command.yml +0 -61
  1582. data/spec/spec_tests/data/command_monitoring/deleteMany.yml +0 -55
  1583. data/spec/spec_tests/data/command_monitoring/deleteOne.yml +0 -55
  1584. data/spec/spec_tests/data/command_monitoring/find.yml +0 -266
  1585. data/spec/spec_tests/data/command_monitoring/insertMany.yml +0 -75
  1586. data/spec/spec_tests/data/command_monitoring/insertOne.yml +0 -51
  1587. data/spec/spec_tests/data/command_monitoring/unacknowledgedBulkWrite.yml +0 -34
  1588. data/spec/spec_tests/data/command_monitoring/updateMany.yml +0 -65
  1589. data/spec/spec_tests/data/command_monitoring/updateOne.yml +0 -90
  1590. data/spec/spec_tests/data/crud_v2/aggregate-merge.yml +0 -103
  1591. data/spec/spec_tests/data/crud_v2/aggregate-out-readConcern.yml +0 -110
  1592. data/spec/spec_tests/data/crud_v2/bulkWrite-arrayFilters.yml +0 -81
  1593. data/spec/spec_tests/data/crud_v2/db-aggregate.yml +0 -38
  1594. data/spec/spec_tests/data/crud_v2/updateWithPipelines.yml +0 -92
  1595. data/spec/spec_tests/data/sdam/sharded/single_mongos.yml +0 -33
  1596. data/spec/spec_tests/dns_seedlist_discovery_spec.rb +0 -66
  1597. data/spec/support/change_streams/operation.rb +0 -89
  1598. data/spec/support/change_streams.rb +0 -262
  1599. data/spec/support/cluster_config.rb +0 -194
  1600. data/spec/support/connection_string.rb +0 -354
  1601. data/spec/support/crud/requirement.rb +0 -69
  1602. data/spec/support/crud/test_base.rb +0 -22
  1603. data/spec/support/event_subscriber.rb +0 -112
  1604. data/spec/support/lite_constraints.rb +0 -76
  1605. data/spec/support/sdam_monitoring.rb +0 -89
  1606. data/spec/support/server_selection.rb +0 -148
  1607. data/spec/support/transactions/operation.rb +0 -184
  1608. data/spec/support/transactions/test.rb +0 -252
  1609. /data/spec/spec_tests/data/retryable_reads/{aggregate-merge.yml → legacy/aggregate-merge.yml} +0 -0
  1610. /data/spec/spec_tests/data/retryable_reads/{aggregate.yml → legacy/aggregate.yml} +0 -0
  1611. /data/spec/spec_tests/data/retryable_reads/{count.yml → legacy/count.yml} +0 -0
  1612. /data/spec/spec_tests/data/retryable_reads/{countDocuments.yml → legacy/countDocuments.yml} +0 -0
  1613. /data/spec/spec_tests/data/retryable_reads/{distinct.yml → legacy/distinct.yml} +0 -0
  1614. /data/spec/spec_tests/data/retryable_reads/{estimatedDocumentCount.yml → legacy/estimatedDocumentCount.yml} +0 -0
  1615. /data/spec/spec_tests/data/retryable_reads/{find.yml → legacy/find.yml} +0 -0
  1616. /data/spec/spec_tests/data/retryable_reads/{findOne.yml → legacy/findOne.yml} +0 -0
  1617. /data/spec/spec_tests/data/retryable_reads/{gridfs-download.yml → legacy/gridfs-download.yml} +0 -0
  1618. /data/spec/spec_tests/data/retryable_reads/{gridfs-downloadByName.yml → legacy/gridfs-downloadByName.yml} +0 -0
  1619. /data/spec/spec_tests/data/retryable_reads/{listCollectionNames.yml → legacy/listCollectionNames.yml} +0 -0
  1620. /data/spec/spec_tests/data/retryable_reads/{listCollectionObjects.yml → legacy/listCollectionObjects.yml} +0 -0
  1621. /data/spec/spec_tests/data/retryable_reads/{listCollections.yml → legacy/listCollections.yml} +0 -0
  1622. /data/spec/spec_tests/data/retryable_reads/{listDatabaseNames.yml → legacy/listDatabaseNames.yml} +0 -0
  1623. /data/spec/spec_tests/data/retryable_reads/{listDatabaseObjects.yml → legacy/listDatabaseObjects.yml} +0 -0
  1624. /data/spec/spec_tests/data/retryable_reads/{listDatabases.yml → legacy/listDatabases.yml} +0 -0
  1625. /data/spec/spec_tests/data/retryable_reads/{listIndexes.yml → legacy/listIndexes.yml} +0 -0
  1626. /data/spec/spec_tests/data/retryable_writes/{deleteMany.yml → legacy/deleteMany.yml} +0 -0
  1627. /data/spec/spec_tests/data/retryable_writes/{deleteOne.yml → legacy/deleteOne.yml} +0 -0
  1628. /data/spec/spec_tests/data/retryable_writes/{findOneAndDelete.yml → legacy/findOneAndDelete.yml} +0 -0
  1629. /data/spec/spec_tests/data/retryable_writes/{findOneAndReplace.yml → legacy/findOneAndReplace.yml} +0 -0
  1630. /data/spec/spec_tests/data/retryable_writes/{findOneAndUpdate.yml → legacy/findOneAndUpdate.yml} +0 -0
  1631. /data/spec/spec_tests/data/retryable_writes/{insertMany.yml → legacy/insertMany.yml} +0 -0
  1632. /data/spec/spec_tests/data/retryable_writes/{insertOne.yml → legacy/insertOne.yml} +0 -0
  1633. /data/spec/spec_tests/data/retryable_writes/{replaceOne.yml → legacy/replaceOne.yml} +0 -0
  1634. /data/spec/spec_tests/data/retryable_writes/{updateMany.yml → legacy/updateMany.yml} +0 -0
  1635. /data/spec/spec_tests/data/retryable_writes/{updateOne.yml → legacy/updateOne.yml} +0 -0
  1636. /data/spec/spec_tests/data/sdam/rs/{secondary_wrong_set_name_with_primary_second.yml → ruby_secondary_wrong_set_name_with_primary_second.yml} +0 -0
  1637. /data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/longer-parent-in-return.yml +0 -0
  1638. /data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/misformatted-option.yml +0 -0
  1639. /data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/no-results.yml +0 -0
  1640. /data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/not-enough-parts.yml +0 -0
  1641. /data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/one-result-default-port.yml +0 -0
  1642. /data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/one-txt-record-multiple-strings.yml +0 -0
  1643. /data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/one-txt-record.yml +0 -0
  1644. /data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/parent-part-mismatch1.yml +0 -0
  1645. /data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/parent-part-mismatch2.yml +0 -0
  1646. /data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/parent-part-mismatch3.yml +0 -0
  1647. /data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/parent-part-mismatch4.yml +0 -0
  1648. /data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/parent-part-mismatch5.yml +0 -0
  1649. /data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/returned-parent-too-short.yml +0 -0
  1650. /data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/returned-parent-wrong.yml +0 -0
  1651. /data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/two-results-default-port.yml +0 -0
  1652. /data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/two-results-nonstandard-port.yml +0 -0
  1653. /data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/two-txt-records.yml +0 -0
  1654. /data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/txt-record-not-allowed-option.yml +0 -0
  1655. /data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/txt-record-with-overridden-ssl-option.yml +0 -0
  1656. /data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/txt-record-with-overridden-uri-option.yml +0 -0
  1657. /data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/txt-record-with-unallowed-option.yml +0 -0
  1658. /data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/uri-with-port.yml +0 -0
  1659. /data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/uri-with-two-hosts.yml +0 -0
@@ -0,0 +1,1601 @@
1
+ # frozen_string_literal: true
2
+ # encoding: utf-8
3
+
4
+ # Copyright (C) 2019-2020 MongoDB Inc.
5
+ #
6
+ # Licensed under the Apache License, Version 2.0 (the "License");
7
+ # you may not use this file except in compliance with the License.
8
+ # You may obtain a copy of the License at
9
+ #
10
+ # http://www.apache.org/licenses/LICENSE-2.0
11
+ #
12
+ # Unless required by applicable law or agreed to in writing, software
13
+ # distributed under the License is distributed on an "AS IS" BASIS,
14
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15
+ # See the License for the specific language governing permissions and
16
+ # limitations under the License.
17
+
18
+ unless ENV['LIBMONGOCRYPT_PATH']
19
+ begin
20
+ require 'libmongocrypt_helper'
21
+ rescue LoadError => e
22
+ # It seems that MRI maintains autoload configuration for a module until
23
+ # that module is defined, but JRuby removes autoload configuration as soon
24
+ # as the referenced file is attempted to be loaded, even if the module
25
+ # never ends up being defined.
26
+ if BSON::Environment.jruby?
27
+ module Mongo
28
+ module Crypt
29
+ autoload :Binding, 'mongo/crypt/binding'
30
+ end
31
+ end
32
+ end
33
+
34
+ # JRuby 9.3.2.0 replaces a LoadError with our custom message with a
35
+ # generic NameError, when this load is attempted as part of autoloading
36
+ # process. JRuby 9.2.20.0 propagates LoadError as expected.
37
+ raise LoadError, "Cannot load Mongo::Crypt::Binding because there is no path " +
38
+ "to libmongocrypt specified in the LIBMONGOCRYPT_PATH environment variable " +
39
+ "and libmongocrypt-helper is not installed: #{e.class}: #{e}"
40
+ end
41
+ end
42
+
43
+ require 'ffi'
44
+
45
+ module Mongo
46
+ module Crypt
47
+
48
+ # @api private
49
+ def reset_autoload
50
+ remove_const(:Binding)
51
+ autoload(:Binding, 'mongo/crypt/binding')
52
+ end
53
+ module_function :reset_autoload
54
+
55
+ # A Ruby binding for the libmongocrypt C library
56
+ #
57
+ # @api private
58
+ class Binding
59
+ extend FFI::Library
60
+
61
+ if ENV['LIBMONGOCRYPT_PATH']
62
+ begin
63
+ ffi_lib ENV['LIBMONGOCRYPT_PATH']
64
+ rescue LoadError => e
65
+ Crypt.reset_autoload
66
+ raise LoadError, "Cannot load Mongo::Crypt::Binding because the path to " +
67
+ "libmongocrypt specified in the LIBMONGOCRYPT_PATH environment variable " +
68
+ "is invalid: #{ENV['LIBMONGOCRYPT_PATH']}\n\n#{e.class}: #{e.message}"
69
+ end
70
+ else
71
+ begin
72
+ ffi_lib LibmongocryptHelper.libmongocrypt_path
73
+ rescue LoadError => e
74
+ Crypt.reset_autoload
75
+ raise LoadError, "Cannot load Mongo::Crypt::Binding because the path to " +
76
+ "libmongocrypt specified in libmongocrypt-helper " +
77
+ "is invalid: #{LibmongocryptHelper.libmongocrypt_path}\n\n#{e.class}: #{e.message}"
78
+ end
79
+ end
80
+
81
+ # Minimum version of libmongocrypt required by this version of the driver.
82
+ # An attempt to use the driver with any previous version of libmongocrypt
83
+ # will cause a `LoadError`.
84
+ #
85
+ # @api private
86
+ MIN_LIBMONGOCRYPT_VERSION = Gem::Version.new("1.5.2")
87
+
88
+ # @!method self.mongocrypt_version(len)
89
+ # @api private
90
+ #
91
+ # Returns the version string of the libmongocrypt library.
92
+ # @param [ FFI::Pointer | nil ] len (out param) An optional pointer to a
93
+ # uint8 that will reference the length of the returned string.
94
+ # @return [ String ] A version string for libmongocrypt.
95
+ attach_function :mongocrypt_version, [:pointer], :string
96
+
97
+ # Validates if provided version of libmongocrypt is valid, i.e. equal or
98
+ # greater than minimum required version. Raises a LoadError if not.
99
+ #
100
+ # @param [ String ] lmc_version String representing libmongocrypt version.
101
+ #
102
+ # @raise [ LoadError ] if given version is lesser than minimum required version.
103
+ #
104
+ # @api private
105
+ def self.validate_version(lmc_version)
106
+ if (actual_version = Gem::Version.new(lmc_version)) < MIN_LIBMONGOCRYPT_VERSION
107
+ raise LoadError, "libmongocrypt version #{MIN_LIBMONGOCRYPT_VERSION} or above is required, " +
108
+ "but version #{actual_version} was found."
109
+ end
110
+ rescue ArgumentError => e
111
+ # Some lmc versions cannot be parsed with Gem::Version class,
112
+ # so we fall back to regex.
113
+ match = lmc_version.match(/\A(?<major>\d+)\.(?<minor>\d+)\.(?<patch>\d+)?(-[A-Za-z\+\d]+)?\z/)
114
+ if match.nil?
115
+ raise ArgumentError.new("Malformed version number string #{lmc_version}")
116
+ end
117
+ actual_version = Gem::Version.new(
118
+ [
119
+ match[:major],
120
+ match[:minor],
121
+ match[:patch]
122
+ ].join('.')
123
+ )
124
+ if actual_version < MIN_LIBMONGOCRYPT_VERSION
125
+ raise LoadError, "libmongocrypt version #{MIN_LIBMONGOCRYPT_VERSION} or above is required, " +
126
+ "but version #{actual_version} was found."
127
+ end
128
+ end
129
+
130
+ validate_version(mongocrypt_version(nil))
131
+
132
+ # @!method self.mongocrypt_binary_new
133
+ # @api private
134
+ #
135
+ # Creates a new mongocrypt_binary_t object (a non-owning view of a byte
136
+ # array).
137
+ # @return [ FFI::Pointer ] A pointer to the newly-created
138
+ # mongocrypt_binary_t object.
139
+ attach_function :mongocrypt_binary_new, [], :pointer
140
+
141
+ # @!method self.mongocrypt_binary_new_from_data(data, len)
142
+ # @api private
143
+ #
144
+ # Create a new mongocrypt_binary_t object that maintains a pointer to
145
+ # the specified byte array.
146
+ # @param [ FFI::Pointer ] data A pointer to an array of bytes; the data
147
+ # is not copied and must outlive the mongocrypt_binary_t object.
148
+ # @param [ Integer ] len The length of the array argument.
149
+ # @return [ FFI::Pointer ] A pointer to the newly-created
150
+ # mongocrypt_binary_t object.
151
+ attach_function(
152
+ :mongocrypt_binary_new_from_data,
153
+ [:pointer, :int],
154
+ :pointer
155
+ )
156
+
157
+ # @!method self.mongocrypt_binary_data(binary)
158
+ # @api private
159
+ #
160
+ # Get the pointer to the underlying data for the mongocrypt_binary_t.
161
+ # @param [ FFI::Pointer ] binary A pointer to a mongocrypt_binary_t object.
162
+ # @return [ FFI::Pointer ] A pointer to the data array.
163
+ attach_function :mongocrypt_binary_data, [:pointer], :pointer
164
+
165
+ # @!method self.mongocrypt_binary_len(binary)
166
+ # @api private
167
+ #
168
+ # Get the length of the underlying data array.
169
+ # @param [ FFI::Pointer ] binary A pointer to a mongocrypt_binary_t object.
170
+ # @return [ Integer ] The length of the data array.
171
+ attach_function :mongocrypt_binary_len, [:pointer], :int
172
+
173
+ # @!method self.mongocrypt_binary_destroy(binary)
174
+ # @api private
175
+ #
176
+ # Destroy the mongocrypt_binary_t object.
177
+ # @param [ FFI::Pointer ] binary A pointer to a mongocrypt_binary_t object.
178
+ # @return [ nil ] Always nil.
179
+ attach_function :mongocrypt_binary_destroy, [:pointer], :void
180
+
181
+ # Enum labeling different status types
182
+ enum :status_type, [
183
+ :ok, 0,
184
+ :error_client, 1,
185
+ :error_kms, 2,
186
+ ]
187
+
188
+ # @!method self.mongocrypt_status_new
189
+ # @api private
190
+ #
191
+ # Create a new mongocrypt_status_t object.
192
+ # @return [ FFI::Pointer ] A pointer to the new mongocrypt_status_ts.
193
+ attach_function :mongocrypt_status_new, [], :pointer
194
+
195
+ # @!method self.mongocrypt_status_set(status, type, code, message, len)
196
+ # @api private
197
+ #
198
+ # Set a message, type, and code on an existing status.
199
+ # @param [ FFI::Pointer ] status A pointer to a mongocrypt_status_t.
200
+ # @param [ Symbol ] type The status type; possible values are defined
201
+ # by the status_type enum.
202
+ # @param [ Integer ] code The status code.
203
+ # @param [ String ] message The status message.
204
+ # @param [ Integer ] len The length of the message argument (or -1 for a
205
+ # null-terminated string).
206
+ # @return [ nil ] Always nil.
207
+ attach_function(
208
+ :mongocrypt_status_set,
209
+ [:pointer, :status_type, :int, :string, :int],
210
+ :void
211
+ )
212
+
213
+ # @!method self.mongocrypt_status_type(status)
214
+ # @api private
215
+ #
216
+ # Indicates the status type.
217
+ # @param [ FFI::Pointer ] status A pointer to a mongocrypt_status_t.
218
+ # @return [ Symbol ] The status type (as defined by the status_type enum).
219
+ attach_function :mongocrypt_status_type, [:pointer], :status_type
220
+
221
+ # @!method self.mongocrypt_status_code(status)
222
+ # @api private
223
+ #
224
+ # Return the status error code.
225
+ # @param [ FFI::Pointer ] status A pointer to a mongocrypt_status_t.
226
+ # @return [ Integer ] The status code.
227
+ attach_function :mongocrypt_status_code, [:pointer], :int
228
+
229
+ # @!method self.mongocrypt_status_message(status, len=nil)
230
+ # @api private
231
+ #
232
+ # Returns the status message.
233
+ # @param [ FFI::Pointer ] status A pointer to a mongocrypt_status_t.
234
+ # @param [ FFI::Pointer | nil ] len (out param) An optional pointer to a
235
+ # uint32, where the length of the retun string will be written.
236
+ # @return [ String ] The status message.
237
+ attach_function :mongocrypt_status_message, [:pointer, :pointer], :string
238
+
239
+ # @!method self.mongocrypt_status_ok(status)
240
+ # @api private
241
+ #
242
+ # Returns whether the status is ok or an error.
243
+ # @param [ FFI::Pointer ] status A pointer to a mongocrypt_status_t.
244
+ # @return [ Boolean ] Whether the status is ok.
245
+ attach_function :mongocrypt_status_ok, [:pointer], :bool
246
+
247
+ # @!method self.mongocrypt_status_destroy(status)
248
+ # @api private
249
+ #
250
+ # Destroys the reference to the mongocrypt_status_t object.
251
+ # @param [ FFI::Pointer ] status A pointer to a mongocrypt_status_t.
252
+ # @return [ nil ] Always nil.
253
+ attach_function :mongocrypt_status_destroy, [:pointer], :void
254
+
255
+ # Enum labeling the various log levels
256
+ enum :log_level, [
257
+ :fatal, 0,
258
+ :error, 1,
259
+ :warn, 2,
260
+ :info, 3,
261
+ :debug, 4,
262
+ ]
263
+
264
+ # @!method mongocrypt_log_fn_t(level, message, len, ctx)
265
+ # @api private
266
+ #
267
+ # A callback to the mongocrypt log function. Set a custom log callback
268
+ # with the mongocrypt_setopt_log_handler method
269
+ # @param [ Symbol ] level The log level; possible values defined by the
270
+ # log_level enum
271
+ # @param [ String ] message The log message
272
+ # @param [ Integer ] len The length of the message param, or -1 if the
273
+ # string is null terminated
274
+ # @param [ FFI::Pointer | nil ] ctx An optional pointer to a context
275
+ # object when this callback was set
276
+ # @return [ nil ] Always nil.
277
+ #
278
+ # @note This defines a method signature for an FFI callback; it is not
279
+ # an instance method on the Binding class.
280
+ callback :mongocrypt_log_fn_t, [:log_level, :string, :int, :pointer], :void
281
+
282
+ # @!method self.ongocrypt_new
283
+ # @api private
284
+ #
285
+ # Creates a new mongocrypt_t object.
286
+ # @return [ FFI::Pointer ] A pointer to a new mongocrypt_t object.
287
+ attach_function :mongocrypt_new, [], :pointer
288
+
289
+ # @!method self.mongocrypt_setopt_log_handler(crypt, log_fn, log_ctx=nil)
290
+ # @api private
291
+ #
292
+ # Set the handler on the mongocrypt_t object to be called every time
293
+ # libmongocrypt logs a message.
294
+ # @param [ FFI::Pointer ] crypt A pointer to a mongocrypt_t object.
295
+ # @param [ Method ] log_fn A logging callback method.
296
+ # @param [ FFI::Pointer | nil ] log_ctx An optional pointer to a context
297
+ # to be passed into the log callback on every invocation.
298
+ # @return [ Boolean ] Whether setting the callback was successful.
299
+ attach_function(
300
+ :mongocrypt_setopt_log_handler,
301
+ [:pointer, :mongocrypt_log_fn_t, :pointer],
302
+ :bool
303
+ )
304
+
305
+ # Set the logger callback function on the Mongo::Crypt::Handle object
306
+ #
307
+ # @param [ Mongo::Crypt::Handle ] handle
308
+ # @param [ Method ] log_callback
309
+ #
310
+ # @raise [ Mongo::Error::CryptError ] If the callback is not set successfully
311
+ def self.setopt_log_handler(handle, log_callback)
312
+ check_status(handle) do
313
+ mongocrypt_setopt_log_handler(handle, log_callback, nil)
314
+ end
315
+ end
316
+
317
+ # @!method self.mongocrypt_setopt_kms_providers(crypt, kms_providers)
318
+ # @api private
319
+ #
320
+ # Configure KMS providers with a BSON document.
321
+ # @param [ FFI::Pointer ] crypt A pointer to a mongocrypt_t object.
322
+ # @param [ FFI::Pointer ] kms_providers A pointer to a
323
+ # mongocrypt_binary_t object that references a BSON document mapping
324
+ # the KMS provider names to credentials.
325
+ # @note Do not initialize ctx before calling this method.
326
+ #
327
+ # @returns [ true | false ] Returns whether the options was set successfully.
328
+ attach_function(
329
+ :mongocrypt_setopt_kms_providers,
330
+ [:pointer, :pointer],
331
+ :bool
332
+ )
333
+
334
+ # Set KMS providers options on the Mongo::Crypt::Handle object
335
+ #
336
+ # @param [ Mongo::Crypt::Handle ] handle
337
+ # @param [ BSON::Document ] kms_providers BSON document mapping
338
+ # the KMS provider names to credentials.
339
+ #
340
+ # @raise [ Mongo::Error::CryptError ] If the option is not set successfully
341
+ def self.setopt_kms_providers(handle, kms_providers)
342
+ validate_document(kms_providers)
343
+ data = kms_providers.to_bson.to_s
344
+ Binary.wrap_string(data) do |data_p|
345
+ check_status(handle) do
346
+ mongocrypt_setopt_kms_providers(handle.ref, data_p)
347
+ end
348
+ end
349
+ end
350
+
351
+ # @!method self.mongocrypt_setopt_schema_map(crypt, schema_map)
352
+ # @api private
353
+ #
354
+ # Sets a local schema map for encryption.
355
+ # @param [ FFI::Pointer ] crypt A pointer to a mongocrypt_t object.
356
+ # @param [ FFI::Pointer ] schema_map A pointer to a mongocrypt_binary_t.
357
+ # object that references the schema map as a BSON binary string.
358
+ # @return [ Boolean ] Returns whether the option was set successfully.
359
+ attach_function :mongocrypt_setopt_schema_map, [:pointer, :pointer], :bool
360
+
361
+ # Set schema map on the Mongo::Crypt::Handle object
362
+ #
363
+ # @param [ Mongo::Crypt::Handle ] handle
364
+ # @param [ BSON::Document ] schema_map_doc The schema map as a
365
+ # BSON::Document object
366
+ #
367
+ # @raise [ Mongo::Error::CryptError ] If the schema map is not set successfully
368
+ def self.setopt_schema_map(handle, schema_map_doc)
369
+ validate_document(schema_map_doc)
370
+ data = schema_map_doc.to_bson.to_s
371
+ Binary.wrap_string(data) do |data_p|
372
+ check_status(handle) do
373
+ mongocrypt_setopt_schema_map(handle.ref, data_p)
374
+ end
375
+ end
376
+ end
377
+
378
+ # @!method self.mongocrypt_init(crypt)
379
+ # @api private
380
+ #
381
+ # Initialize the mongocrypt_t object.
382
+ # @param [ FFI::Pointer ] crypt A pointer to a mongocrypt_t object.
383
+ # @return [ Boolean ] Returns whether the crypt was initialized successfully.
384
+ attach_function :mongocrypt_init, [:pointer], :bool
385
+
386
+ # Initialize the Mongo::Crypt::Handle object
387
+ #
388
+ # @param [ Mongo::Crypt::Handle ] handle
389
+ #
390
+ # @raise [ Mongo::Error::CryptError ] If initialization fails
391
+ def self.init(handle)
392
+ check_status(handle) do
393
+ mongocrypt_init(handle.ref)
394
+ end
395
+ end
396
+
397
+ # @!method self.mongocrypt_status(crypt, status)
398
+ # @api private
399
+ #
400
+ # Set the status information from the mongocrypt_t object on the
401
+ # mongocrypt_status_t object.
402
+ # @param [ FFI::Pointer ] crypt A pointer to a mongocrypt_t object.
403
+ # @param [ FFI::Pointer ] status A pointer to a mongocrypt_status_t object.
404
+ # @return [ Boolean ] Whether the status was successfully set.
405
+ attach_function :mongocrypt_status, [:pointer, :pointer], :bool
406
+
407
+ # @!method self.mongocrypt_destroy(crypt)
408
+ # @api private
409
+ #
410
+ # Destroy the reference the mongocrypt_t object.
411
+ # @param [ FFI::Pointer ] crypt A pointer to a mongocrypt_t object.
412
+ # @return [ nil ] Always nil.
413
+ attach_function :mongocrypt_destroy, [:pointer], :void
414
+
415
+ # @!method self.mongocrypt_ctx_new(crypt)
416
+ # @api private
417
+ #
418
+ # Create a new mongocrypt_ctx_t object (a wrapper for the libmongocrypt
419
+ # state machine).
420
+ # @param [ FFI::Pointer ] crypt A pointer to a mongocrypt_t object.
421
+ # @return [ FFI::Pointer ] A new mongocrypt_ctx_t object.
422
+ attach_function :mongocrypt_ctx_new, [:pointer], :pointer
423
+
424
+ # @!method self.mongocrypt_ctx_status(ctx, status)
425
+ # @api private
426
+ #
427
+ # Set the status information from the mongocrypt_ctx_t object on the
428
+ # mongocrypt_status_t object.
429
+ # @param [ FFI::Pointer ] ctx A pointer to a mongocrypt_ctx_t object.
430
+ # @param [ FFI::Pointer ] status A pointer to a mongocrypt_status_t object.
431
+ # @return [ Boolean ] Whether the status was successfully set.
432
+ attach_function :mongocrypt_ctx_status, [:pointer, :pointer], :bool
433
+
434
+ # @!method self.mongocrypt_ctx_setopt_key_id(ctx, key_id)
435
+ # @api private
436
+ #
437
+ # Set the key id used for explicit encryption.
438
+ # @param [ FFI::Pointer ] ctx A pointer to a mongocrypt_ctx_t object.
439
+ # @param [ FFI::Pointer ] key_id A pointer to a mongocrypt_binary_t object
440
+ # that references the 16-byte key-id.
441
+ # @note Do not initialize ctx before calling this method.
442
+ # @return [ Boolean ] Whether the option was successfully set.
443
+ attach_function :mongocrypt_ctx_setopt_key_id, [:pointer, :pointer], :bool
444
+
445
+ # Sets the key id option on an explicit encryption context.
446
+ #
447
+ # @param [ Mongo::Crypt::Context ] context Explicit encryption context
448
+ # @param [ String ] key_id The key id
449
+ #
450
+ # @raise [ Mongo::Error::CryptError ] If the operation failed
451
+ def self.ctx_setopt_key_id(context, key_id)
452
+ Binary.wrap_string(key_id) do |key_id_p|
453
+ check_ctx_status(context) do
454
+ mongocrypt_ctx_setopt_key_id(context.ctx_p, key_id_p)
455
+ end
456
+ end
457
+ end
458
+
459
+ # @!method self.mongocrypt_ctx_setopt_key_alt_name(ctx, binary)
460
+ # @api private
461
+ #
462
+ # When creating a data key, set an alternate name on that key. When
463
+ # performing explicit encryption, specifying which data key to use for
464
+ # encryption based on its keyAltName field.
465
+ # @param [ FFI::Pointer ] ctx A pointer to a mongocrypt_ctx_t object.
466
+ # @param [ FFI::Pointer ] binary A pointer to a mongocrypt_binary_t
467
+ # object that references a BSON document in the format
468
+ # { "keyAltName": <BSON UTF8 value> }.
469
+ # @return [ Boolean ] Whether the alternative name was successfully set.
470
+ # @note Do not initialize ctx before calling this method.
471
+ attach_function(
472
+ :mongocrypt_ctx_setopt_key_alt_name,
473
+ [:pointer, :pointer],
474
+ :bool
475
+ )
476
+
477
+ # Set multiple alternate key names on data key creation
478
+ #
479
+ # @param [ Mongo::Crypt::Context ] context A DataKeyContext
480
+ # @param [ Array ] key_alt_names An array of alternate key names as strings
481
+ #
482
+ # @raise [ Mongo::Error::CryptError ] If any of the alternate names are
483
+ # not valid UTF8 strings
484
+ def self.ctx_setopt_key_alt_names(context, key_alt_names)
485
+ key_alt_names.each do |key_alt_name|
486
+ key_alt_name_bson = { :keyAltName => key_alt_name }.to_bson.to_s
487
+
488
+ Binary.wrap_string(key_alt_name_bson) do |key_alt_name_p|
489
+ check_ctx_status(context) do
490
+ mongocrypt_ctx_setopt_key_alt_name(context.ctx_p, key_alt_name_p)
491
+ end
492
+ end
493
+ end
494
+ end
495
+
496
+ # @!method self.mongocrypt_ctx_setopt_key_material(ctx, binary)
497
+ # @api private
498
+ #
499
+ # When creating a data key, set a custom key material to use for
500
+ # encrypting data.
501
+ # @param [ FFI::Pointer ] ctx A pointer to a mongocrypt_ctx_t object.
502
+ # @param [ FFI::Pointer ] binary A pointer to a mongocrypt_binary_t
503
+ # object that references the data encryption key to use.
504
+ # @return [ Boolean ] Whether the custom key material was successfully set.
505
+ # @note Do not initialize ctx before calling this method.
506
+ attach_function(
507
+ :mongocrypt_ctx_setopt_key_material,
508
+ [:pointer, :pointer],
509
+ :bool
510
+ )
511
+
512
+ # Set set a custom key material to use for
513
+ # encrypting data.
514
+ #
515
+ # @param [ Mongo::Crypt::Context ] context A DataKeyContext
516
+ # @param [ BSON::Binary ] key_material 96 bytes of custom key material
517
+ #
518
+ # @raise [ Mongo::Error::CryptError ] If the key material is not 96 bytes.
519
+ def self.ctx_setopt_key_material(context, key_material)
520
+ data = {'keyMaterial' => key_material}.to_bson.to_s
521
+ Binary.wrap_string(data) do |data_p|
522
+ check_ctx_status(context) do
523
+ mongocrypt_ctx_setopt_key_material(context.ctx_p, data_p)
524
+ end
525
+ end
526
+ end
527
+
528
+ # @!method self.mongocrypt_ctx_setopt_algorithm(ctx, algorithm, len)
529
+ # @api private
530
+ #
531
+ # Set the algorithm used for explicit encryption.
532
+ # @param [ FFI::Pointer ] ctx A pointer to a mongocrypt_ctx_t object.
533
+ # @param [ String ] algorithm The algorithm name. Valid values are:
534
+ # - "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic"
535
+ # - "AEAD_AES_256_CBC_HMAC_SHA_512-Random"
536
+ # @param [ Integer ] len The length of the algorithm string.
537
+ # @note Do not initialize ctx before calling this method.
538
+ # @return [ Boolean ] Whether the option was successfully set.
539
+ attach_function(
540
+ :mongocrypt_ctx_setopt_algorithm,
541
+ [:pointer, :string, :int],
542
+ :bool
543
+ )
544
+
545
+ # Set the algorithm on the context
546
+ #
547
+ # @param [ Mongo::Crypt::Context ] context
548
+ # @param [ String ] name The algorithm name. Valid values are:
549
+ # - "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic"
550
+ # - "AEAD_AES_256_CBC_HMAC_SHA_512-Random"
551
+ #
552
+ # @raise [ Mongo::Error::CryptError ] If the operation failed
553
+ def self.ctx_setopt_algorithm(context, name)
554
+ check_ctx_status(context) do
555
+ mongocrypt_ctx_setopt_algorithm(context.ctx_p, name, -1)
556
+ end
557
+ end
558
+
559
+ # @!method self.mongocrypt_ctx_setopt_key_encryption_key(ctx)
560
+ # @api private
561
+ #
562
+ # Set key encryption key document for creating a data key.
563
+ # @param [ FFI::Pointer ] ctx A pointer to a mongocrypt_ctx_t object.
564
+ # @param [ FFI::Pointer ] bin A pointer to a mongocrypt_binary_t
565
+ # object that references a BSON document representing the key
566
+ # encryption key document with an additional "provider" field.
567
+ # @note Do not initialize ctx before calling this method.
568
+ # @return [ Boolean ] Whether the option was successfully set.
569
+ attach_function(
570
+ :mongocrypt_ctx_setopt_key_encryption_key,
571
+ [:pointer, :pointer],
572
+ :bool
573
+ )
574
+
575
+ # Set key encryption key document for creating a data key.
576
+ #
577
+ # @param [ Mongo::Crypt::Context ] context
578
+ # @param [ BSON::Document ] key_document BSON document representing the key
579
+ # encryption key document with an additional "provider" field.
580
+ #
581
+ # @raise [ Mongo::Error::CryptError ] If the operation failed
582
+ def self.ctx_setopt_key_encryption_key(context, key_document)
583
+ validate_document(key_document)
584
+ data = key_document.to_bson.to_s
585
+ Binary.wrap_string(data) do |data_p|
586
+ check_ctx_status(context) do
587
+ mongocrypt_ctx_setopt_key_encryption_key(context.ctx_p, data_p)
588
+ end
589
+ end
590
+ end
591
+
592
+ # @!method self.mongocrypt_ctx_datakey_init(ctx)
593
+ # @api private
594
+ #
595
+ # Initializes the ctx to create a data key.
596
+ # @param [ FFI::Pointer ] ctx A pointer to a mongocrypt_ctx_t object.
597
+ # @note Before calling this method, master key options must be set.
598
+ # Set AWS master key by calling mongocrypt_ctx_setopt_masterkey_aws
599
+ # and mongocrypt_ctx_setopt_masterkey_aws_endpoint. Set local master
600
+ # key by calling mongocrypt_ctx_setopt_masterkey_local.
601
+ # @return [ Boolean ] Whether the initialization was successful.
602
+ attach_function :mongocrypt_ctx_datakey_init, [:pointer], :bool
603
+
604
+ # Initialize the Context to create a data key
605
+ #
606
+ # @param [ Mongo::Crypt::Context ] context
607
+ #
608
+ # @raise [ Mongo::Error::CryptError ] If initialization fails
609
+ def self.ctx_datakey_init(context)
610
+ check_ctx_status(context) do
611
+ mongocrypt_ctx_datakey_init(context.ctx_p)
612
+ end
613
+ end
614
+
615
+ # @!method self.mongocrypt_ctx_datakey_init(ctx, filter)
616
+ # @api private
617
+ #
618
+ # Initialize a context to rewrap datakeys.
619
+ #
620
+ # @param [ FFI::Pointer ] ctx A pointer to a mongocrypt_ctx_t object.
621
+ # @param [ FFI::Pointer ] filter A pointer to a mongocrypt_binary_t object
622
+ # that represents filter to use for the find command on the key vault
623
+ # collection to retrieve datakeys to rewrap.
624
+ #
625
+ # @return [ Boolean ] Whether the initialization was successful.
626
+ attach_function(
627
+ :mongocrypt_ctx_rewrap_many_datakey_init,
628
+ [:pointer, :pointer],
629
+ :bool
630
+ )
631
+
632
+ # Initialize a context to rewrap datakeys.
633
+ #
634
+ # @param [ Mongo::Crypt::Context ] context
635
+ # @param [ BSON::Document ] filter BSON Document
636
+ # that represents filter to use for the find command on the key vault
637
+ # collection to retrieve datakeys to rewrap.
638
+ #
639
+ # @return [ Boolean ] Whether the initialization was successful.
640
+ def self.ctx_rewrap_many_datakey_init(context, filter)
641
+ filter_data = filter.to_bson.to_s
642
+ Binary.wrap_string(filter_data) do |data_p|
643
+ check_ctx_status(context) do
644
+ mongocrypt_ctx_rewrap_many_datakey_init(context.ctx_p, data_p)
645
+ end
646
+ end
647
+ end
648
+
649
+ # @!method self.mongocrypt_ctx_encrypt_init(ctx, db, db_len, cmd)
650
+ # @api private
651
+ #
652
+ # Initializes the ctx for auto-encryption.
653
+ # @param [ FFI::Pointer ] ctx A pointer to a mongocrypt_ctx_t object.
654
+ # @param [ String ] db The database name.
655
+ # @param [ Integer ] db_len The length of the database name argument
656
+ # (or -1 for a null-terminated string).
657
+ # @param [ FFI::Pointer ] cmd A pointer to a mongocrypt_binary_t object
658
+ # that references the database command as a binary string.
659
+ # @note This method expects the passed-in BSON to be in the format:
660
+ # { "v": BSON value to decrypt }.
661
+ # @return [ Boolean ] Whether the initialization was successful.
662
+ attach_function(
663
+ :mongocrypt_ctx_encrypt_init,
664
+ [:pointer, :string, :int, :pointer],
665
+ :bool
666
+ )
667
+
668
+ # Initialize the Context for auto-encryption
669
+ #
670
+ # @param [ Mongo::Crypt::Context ] context
671
+ # @param [ String ] db_name The name of the database against which the
672
+ # encrypted command is being performed
673
+ # @param [ Hash ] command The command to be encrypted
674
+ #
675
+ # @raise [ Mongo::Error::CryptError ] If initialization fails
676
+ def self.ctx_encrypt_init(context, db_name, command)
677
+ validate_document(command)
678
+ data = command.to_bson.to_s
679
+ Binary.wrap_string(data) do |data_p|
680
+ check_ctx_status(context) do
681
+ mongocrypt_ctx_encrypt_init(context.ctx_p, db_name, -1, data_p)
682
+ end
683
+ end
684
+ end
685
+
686
+ # @!method self.mongocrypt_ctx_explicit_encrypt_init(ctx, msg)
687
+ # @api private
688
+ #
689
+ # Initializes the ctx for explicit encryption.
690
+ # @param [ FFI::Pointer ] ctx A pointer to a mongocrypt_ctx_t object.
691
+ # @param [ FFI::Pointer ] msg A pointer to a mongocrypt_binary_t object
692
+ # that references the message to be encrypted as a binary string.
693
+ # @note Before calling this method, set a key_id, key_alt_name (optional),
694
+ # and encryption algorithm using the following methods:
695
+ # mongocrypt_ctx_setopt_key_id, mongocrypt_ctx_setopt_key_alt_name,
696
+ # and mongocrypt_ctx_setopt_algorithm.
697
+ # @return [ Boolean ] Whether the initialization was successful.
698
+ attach_function(
699
+ :mongocrypt_ctx_explicit_encrypt_init,
700
+ [:pointer, :pointer],
701
+ :bool
702
+ )
703
+
704
+ # Initialize the Context for explicit encryption
705
+ #
706
+ # @param [ Mongo::Crypt::Context ] context
707
+ # @param [ Hash ] doc A BSON document to encrypt
708
+ #
709
+ # @raise [ Mongo::Error::CryptError ] If initialization fails
710
+ def self.ctx_explicit_encrypt_init(context, doc)
711
+ validate_document(doc)
712
+ data = doc.to_bson.to_s
713
+ Binary.wrap_string(data) do |data_p|
714
+ check_ctx_status(context) do
715
+ mongocrypt_ctx_explicit_encrypt_init(context.ctx_p, data_p)
716
+ end
717
+ end
718
+ end
719
+
720
+ # @!method self.mongocrypt_ctx_decrypt_init(ctx, doc)
721
+ # @api private
722
+ #
723
+ # Initializes the ctx for auto-decryption.
724
+ # @param [ FFI::Pointer ] ctx A pointer to a mongocrypt_ctx_t object.
725
+ # @param [ FFI::Pointer ] doc A pointer to a mongocrypt_binary_t object
726
+ # that references the document to be decrypted as a BSON binary string.
727
+ # @return [ Boolean ] Whether the initialization was successful.
728
+ attach_function :mongocrypt_ctx_decrypt_init, [:pointer, :pointer], :bool
729
+
730
+ # Initialize the Context for auto-decryption
731
+ #
732
+ # @param [ Mongo::Crypt::Context ] context
733
+ # @param [ BSON::Document ] command A BSON document to decrypt
734
+ #
735
+ # @raise [ Mongo::Error::CryptError ] If initialization fails
736
+ def self.ctx_decrypt_init(context, command)
737
+ validate_document(command)
738
+ data = command.to_bson.to_s
739
+ Binary.wrap_string(data) do |data_p|
740
+ check_ctx_status(context) do
741
+ mongocrypt_ctx_decrypt_init(context.ctx_p, data_p)
742
+ end
743
+ end
744
+ end
745
+
746
+ # @!method self.mongocrypt_ctx_explicit_decrypt_init(ctx, msg)
747
+ # @api private
748
+ #
749
+ # Initializes the ctx for explicit decryption.
750
+ # @param [ FFI::Pointer ] ctx A pointer to a mongocrypt_ctx_t object.
751
+ # @param [ FFI::Pointer ] msg A pointer to a mongocrypt_binary_t object
752
+ # that references the message to be decrypted as a BSON binary string.
753
+ # @return [ Boolean ] Whether the initialization was successful.
754
+ attach_function(
755
+ :mongocrypt_ctx_explicit_decrypt_init,
756
+ [:pointer, :pointer],
757
+ :bool
758
+ )
759
+
760
+ # Initialize the Context for explicit decryption
761
+ #
762
+ # @param [ Mongo::Crypt::Context ] context
763
+ # @param [ Hash ] doc A BSON document to decrypt
764
+ #
765
+ # @raise [ Mongo::Error::CryptError ] If initialization fails
766
+ def self.ctx_explicit_decrypt_init(context, doc)
767
+ validate_document(doc)
768
+ data = doc.to_bson.to_s
769
+ Binary.wrap_string(data) do |data_p|
770
+ check_ctx_status(context) do
771
+ mongocrypt_ctx_explicit_decrypt_init(context.ctx_p, data_p)
772
+ end
773
+ end
774
+ end
775
+
776
+ # An enum labeling different libmognocrypt state machine states
777
+ enum :mongocrypt_ctx_state, [
778
+ :error, 0,
779
+ :need_mongo_collinfo, 1,
780
+ :need_mongo_markings, 2,
781
+ :need_mongo_keys, 3,
782
+ :need_kms, 4,
783
+ :ready, 5,
784
+ :done, 6,
785
+ ]
786
+
787
+ # @!method self.mongocrypt_ctx_state(ctx)
788
+ # @api private
789
+ #
790
+ # Get the current state of the ctx.
791
+ # @param [ FFI::Pointer ] ctx A pointer to a mongocrypt_ctx_t object.
792
+ # @return [ Symbol ] The current state, will be one of the values defined
793
+ # by the mongocrypt_ctx_state enum.
794
+ attach_function :mongocrypt_ctx_state, [:pointer], :mongocrypt_ctx_state
795
+
796
+ # @!method self.mongocrypt_ctx_mongo_op(ctx, op_bson)
797
+ # @api private
798
+ #
799
+ # Get a BSON operation for the driver to run against the MongoDB
800
+ # collection, the key vault database, or mongocryptd.
801
+ # @param [ FFI::Pointer ] ctx A pointer to a mongocrypt_ctx_t object.
802
+ # @param [ FFI::Pointer ] op_bson (out param) A pointer to a
803
+ # mongocrypt_binary_t object that will have a reference to the
804
+ # BSON operation written to it by libmongocrypt.
805
+ # @return [ Boolean ] A boolean indicating the success of the operation.
806
+ attach_function :mongocrypt_ctx_mongo_op, [:pointer, :pointer], :bool
807
+
808
+ # Returns a BSON::Document representing an operation that the
809
+ # driver must perform on behalf of libmongocrypt to get the
810
+ # information it needs in order to continue with
811
+ # encryption/decryption (for example, a filter for a key vault query).
812
+ #
813
+ # @param [ Mongo::Crypt::Context ] context
814
+ #
815
+ # @raise [ Mongo::Crypt ] If there is an error getting the operation
816
+ # @return [ BSON::Document ] The operation that the driver must perform
817
+ def self.ctx_mongo_op(context)
818
+ binary = Binary.new
819
+
820
+ check_ctx_status(context) do
821
+ mongocrypt_ctx_mongo_op(context.ctx_p, binary.ref)
822
+ end
823
+
824
+ # TODO since the binary references a C pointer, and ByteBuffer is
825
+ # written in C in MRI, we could omit a copy of the data by making
826
+ # ByteBuffer reference the string that is owned by libmongocrypt.
827
+ BSON::Document.from_bson(BSON::ByteBuffer.new(binary.to_s), mode: :bson)
828
+ end
829
+
830
+ # @!method self.mongocrypt_ctx_mongo_feed(ctx, reply)
831
+ # @api private
832
+ #
833
+ # Feed a BSON reply to libmongocrypt.
834
+ # @param [ FFI::Pointer ] ctx A pointer to a mongocrypt_ctx_t object.
835
+ # @param [ FFI::Pointer ] reply A mongocrypt_binary_t object that
836
+ # references the BSON reply to feed to libmongocrypt.
837
+ # @return [ Boolean ] A boolean indicating the success of the operation.
838
+ attach_function :mongocrypt_ctx_mongo_feed, [:pointer, :pointer], :bool
839
+
840
+ # Feed a response from the driver back to libmongocrypt
841
+ #
842
+ # @param [ Mongo::Crypt::Context ] context
843
+ # @param [ BSON::Document ] doc The document representing the response
844
+ #
845
+ # @raise [ Mongo::Error::CryptError ] If the response is not fed successfully
846
+ def self.ctx_mongo_feed(context, doc)
847
+ validate_document(doc)
848
+ data = doc.to_bson.to_s
849
+ Binary.wrap_string(data) do |data_p|
850
+ check_ctx_status(context) do
851
+ mongocrypt_ctx_mongo_feed(context.ctx_p, data_p)
852
+ end
853
+ end
854
+ end
855
+
856
+ # @!method self.mongocrypt_ctx_mongo_done(ctx)
857
+ # @api private
858
+ #
859
+ # Indicate to libmongocrypt that the driver is done feeding replies.
860
+ # @param [ FFI::Pointer ] ctx A pointer to a mongocrypt_ctx_t object.
861
+ # @return [ Boolean ] A boolean indicating the success of the operation.
862
+ attach_function :mongocrypt_ctx_mongo_done, [:pointer], :bool
863
+
864
+ # @!method self.mongocrypt_ctx_mongo_next_kms_ctx(ctx)
865
+ # @api private
866
+ #
867
+ # Return a pointer to a mongocrypt_kms_ctx_t object or NULL.
868
+ # @param [ FFI::Pointer ] ctx A pointer to a mongocrypt_ctx_t object.
869
+ # @return [ FFI::Pointer ] A pointer to a mongocrypt_kms_ctx_t object.
870
+ attach_function :mongocrypt_ctx_next_kms_ctx, [:pointer], :pointer
871
+
872
+ # Return a new KmsContext object needed by a Context object.
873
+ #
874
+ # @param [ Mongo::Crypt::Context ] context
875
+ #
876
+ # @return [ Mongo::Crypt::KmsContext | nil ] The KmsContext needed to
877
+ # fetch an AWS master key or nil, if no KmsContext is needed
878
+ def self.ctx_next_kms_ctx(context)
879
+ kms_ctx_p = mongocrypt_ctx_next_kms_ctx(context.ctx_p)
880
+
881
+ if kms_ctx_p.null?
882
+ nil
883
+ else
884
+ KmsContext.new(kms_ctx_p)
885
+ end
886
+ end
887
+
888
+ # @!method self.mongocrypt_kms_ctx_get_kms_provider(crypt, kms_providers)
889
+ # @api private
890
+ #
891
+ # Get the KMS provider identifier associated with this KMS request.
892
+ #
893
+ # This is used to conditionally configure TLS connections based on the KMS
894
+ # request. It is useful for KMIP, which authenticates with a client
895
+ # certificate.
896
+ #
897
+ # @param [ FFI::Pointer ] kms Pointer mongocrypt_kms_ctx_t object.
898
+ # @param [ FFI::Pointer ] len (outparam) Receives the length of the
899
+ # returned string. It may be NULL. If it is not NULL, it is set to
900
+ # the length of the returned string without the NULL terminator.
901
+ #
902
+ # @returns [ FFI::Pointer ] One of the NULL terminated static strings: "aws", "azure", "gcp", or
903
+ # "kmip".
904
+ attach_function(
905
+ :mongocrypt_kms_ctx_get_kms_provider,
906
+ [:pointer, :pointer],
907
+ :pointer
908
+ )
909
+
910
+ # Get the KMS provider identifier associated with this KMS request.
911
+ #
912
+ # This is used to conditionally configure TLS connections based on the KMS
913
+ # request. It is useful for KMIP, which authenticates with a client
914
+ # certificate.
915
+ #
916
+ # @param [ FFI::Pointer ] kms Pointer mongocrypt_kms_ctx_t object.
917
+ #
918
+ # @returns [ Symbol | nil ] KMS provider identifier.
919
+ def self.kms_ctx_get_kms_provider(kms_context)
920
+ len_ptr = FFI::MemoryPointer.new(:uint32, 1)
921
+ provider = mongocrypt_kms_ctx_get_kms_provider(
922
+ kms_context.kms_ctx_p,
923
+ len_ptr
924
+ )
925
+ if len_ptr.nil?
926
+ nil
927
+ else
928
+ len = if BSON::Environment.jruby?
929
+ # JRuby FFI implementation does not have `read(type)` method, but it
930
+ # has this `get_uint32`.
931
+ len_ptr.get_uint32
932
+ else
933
+ # For MRI we use a documented `read` method - https://www.rubydoc.info/github/ffi/ffi/FFI%2FPointer:read
934
+ len_ptr.read(:uint32)
935
+ end
936
+ provider.read_string(len).to_sym
937
+ end
938
+ end
939
+
940
+ # @!method self.mongocrypt_kms_ctx_message(kms, msg)
941
+ # @api private
942
+ #
943
+ # Get the message needed to fetch the AWS KMS master key.
944
+ # @param [ FFI::Pointer ] kms Pointer to the mongocrypt_kms_ctx_t object
945
+ # @param [ FFI::Pointer ] msg (outparam) Pointer to a mongocrypt_binary_t
946
+ # object that will have the location of the message written to it by
947
+ # libmongocrypt.
948
+ # @return [ Boolean ] Whether the operation is successful.
949
+ attach_function :mongocrypt_kms_ctx_message, [:pointer, :pointer], :bool
950
+
951
+ # Get the HTTP message needed to fetch the AWS KMS master key from a
952
+ # KmsContext object.
953
+ #
954
+ # @param [ Mongo::Crypt::KmsContext ] kms_context
955
+ #
956
+ # @raise [ Mongo::Error::CryptError ] If the response is not fed successfully
957
+ #
958
+ # @return [ String ] The HTTP message
959
+ def self.kms_ctx_message(kms_context)
960
+ binary = Binary.new
961
+
962
+ check_kms_ctx_status(kms_context) do
963
+ mongocrypt_kms_ctx_message(kms_context.kms_ctx_p, binary.ref)
964
+ end
965
+
966
+ return binary.to_s
967
+ end
968
+
969
+ # @!method self.mongocrypt_kms_ctx_endpoint(kms, endpoint)
970
+ # @api private
971
+ #
972
+ # Get the hostname with which to connect over TLS to get information about
973
+ # the AWS master key.
974
+ # @param [ FFI::Pointer ] kms A pointer to a mongocrypt_kms_ctx_t object.
975
+ # @param [ FFI::Pointer ] endpoint (out param) A pointer to which the
976
+ # endpoint string will be written by libmongocrypt.
977
+ # @return [ Boolean ] Whether the operation was successful.
978
+ attach_function :mongocrypt_kms_ctx_endpoint, [:pointer, :pointer], :bool
979
+
980
+ # Get the hostname with which to connect over TLS to get information
981
+ # about the AWS master key.
982
+ #
983
+ # @param [ Mongo::Crypt::KmsContext ] kms_context
984
+ #
985
+ # @raise [ Mongo::Error::CryptError ] If the response is not fed successfully
986
+ #
987
+ # @return [ String | nil ] The hostname, or nil if none exists
988
+ def self.kms_ctx_endpoint(kms_context)
989
+ ptr = FFI::MemoryPointer.new(:pointer, 1)
990
+
991
+ check_kms_ctx_status(kms_context) do
992
+ mongocrypt_kms_ctx_endpoint(kms_context.kms_ctx_p, ptr)
993
+ end
994
+
995
+ str_ptr = ptr.read_pointer
996
+ str_ptr.null? ? nil : str_ptr.read_string.force_encoding('UTF-8')
997
+ end
998
+
999
+ # @!method self.mongocrypt_kms_ctx_bytes_needed(kms)
1000
+ # @api private
1001
+ #
1002
+ # Get the number of bytes needed by the KMS context.
1003
+ # @param [ FFI::Pointer ] kms The mongocrypt_kms_ctx_t object.
1004
+ # @return [ Integer ] The number of bytes needed.
1005
+ attach_function :mongocrypt_kms_ctx_bytes_needed, [:pointer], :int
1006
+
1007
+ # Get the number of bytes needed by the KmsContext.
1008
+ #
1009
+ # @param [ Mongo::Crypt::KmsContext ] kms_context
1010
+ #
1011
+ # @return [ Integer ] The number of bytes needed
1012
+ def self.kms_ctx_bytes_needed(kms_context)
1013
+ mongocrypt_kms_ctx_bytes_needed(kms_context.kms_ctx_p)
1014
+ end
1015
+
1016
+ # @!method self.mongocrypt_kms_ctx_feed(kms, bytes)
1017
+ # @api private
1018
+ #
1019
+ # Feed replies from the KMS back to libmongocrypt.
1020
+ # @param [ FFI::Pointer ] kms A pointer to the mongocrypt_kms_ctx_t object.
1021
+ # @param [ FFI::Pointer ] bytes A pointer to a mongocrypt_binary_t
1022
+ # object that references the response from the KMS.
1023
+ # @return [ Boolean ] Whether the operation was successful.
1024
+ attach_function :mongocrypt_kms_ctx_feed, [:pointer, :pointer], :bool
1025
+
1026
+ # Feed replies from the KMS back to libmongocrypt.
1027
+ #
1028
+ # @param [ Mongo::Crypt::KmsContext ] kms_context
1029
+ # @param [ String ] bytes The data to feed to libmongocrypt
1030
+ #
1031
+ # @raise [ Mongo::Error::CryptError ] If the response is not fed successfully
1032
+ def self.kms_ctx_feed(kms_context, bytes)
1033
+ check_kms_ctx_status(kms_context) do
1034
+ Binary.wrap_string(bytes) do |bytes_p|
1035
+ mongocrypt_kms_ctx_feed(kms_context.kms_ctx_p, bytes_p)
1036
+ end
1037
+ end
1038
+ end
1039
+
1040
+ # @!method self.mongocrypt_kms_ctx_status(kms, status)
1041
+ # @api private
1042
+ #
1043
+ # Write status information about the mongocrypt_kms_ctx_t object
1044
+ # to the mongocrypt_status_t object.
1045
+ # @param [ FFI::Pointer ] kms A pointer to the mongocrypt_kms_ctx_t object.
1046
+ # @param [ FFI::Pointer ] status A pointer to a mongocrypt_status_t object.
1047
+ # @return [ Boolean ] Whether the operation was successful.
1048
+ attach_function :mongocrypt_kms_ctx_status, [:pointer, :pointer], :bool
1049
+
1050
+ # If the provided block returns false, raise a CryptError with the
1051
+ # status information from the provided KmsContext object.
1052
+ #
1053
+ # @param [ Mongo::Crypt::KmsContext ] kms_context
1054
+ #
1055
+ # @raise [ Mongo::Error::CryptError ] If the provided block returns false
1056
+ def self.check_kms_ctx_status(kms_context)
1057
+ unless yield
1058
+ status = Status.new
1059
+
1060
+ mongocrypt_kms_ctx_status(kms_context.kms_ctx_p, status.ref)
1061
+ status.raise_crypt_error(kms: true)
1062
+ end
1063
+ end
1064
+
1065
+ # @!method self.mongocrypt_kms_ctx_done(ctx)
1066
+ # @api private
1067
+ #
1068
+ # Indicate to libmongocrypt that it will receive no more replies from
1069
+ # mongocrypt_kms_ctx_t objects.
1070
+ # @param [ FFI::Pointer ] ctx A pointer to a mongocrypt_ctx_t object.
1071
+ # @return [ Boolean ] Whether the operation was successful.
1072
+ attach_function :mongocrypt_ctx_kms_done, [:pointer], :bool
1073
+
1074
+ # Indicate to libmongocrypt that it will receive no more KMS replies.
1075
+ #
1076
+ # @param [ Mongo::Crypt::Context ] context
1077
+ #
1078
+ # @raise [ Mongo::Error::CryptError ] If the operation is unsuccessful
1079
+ def self.ctx_kms_done(context)
1080
+ check_ctx_status(context) do
1081
+ mongocrypt_ctx_kms_done(context.ctx_p)
1082
+ end
1083
+ end
1084
+
1085
+ # @!method self.mongocrypt_ctx_finalize(ctx, op_bson)
1086
+ # @api private
1087
+ #
1088
+ # Perform the final encryption or decryption and return a BSON document.
1089
+ # @param [ FFI::Pointer ] ctx A pointer to a mongocrypt_ctx_t object.
1090
+ # @param [ FFI::Pointer ] op_bson (out param) A pointer to a
1091
+ # mongocrypt_binary_t object that will have a reference to the
1092
+ # final encrypted BSON document.
1093
+ # @return [ Boolean ] A boolean indicating the success of the operation.
1094
+ attach_function :mongocrypt_ctx_finalize, [:pointer, :pointer], :void
1095
+
1096
+ # Finalize the state machine represented by the Context
1097
+ #
1098
+ # @param [ Mongo::Crypt::Context ] context
1099
+ #
1100
+ # @raise [ Mongo::Error::CryptError ] If the state machine is not successfully
1101
+ # finalized
1102
+ def self.ctx_finalize(context)
1103
+ binary = Binary.new
1104
+
1105
+ check_ctx_status(context) do
1106
+ mongocrypt_ctx_finalize(context.ctx_p, binary.ref)
1107
+ end
1108
+
1109
+ # TODO since the binary references a C pointer, and ByteBuffer is
1110
+ # written in C in MRI, we could omit a copy of the data by making
1111
+ # ByteBuffer reference the string that is owned by libmongocrypt.
1112
+ BSON::Document.from_bson(BSON::ByteBuffer.new(binary.to_s), mode: :bson)
1113
+ end
1114
+
1115
+ # @!method self.mongocrypt_ctx_destroy(ctx)
1116
+ # @api private
1117
+ #
1118
+ # Destroy the reference to the mongocrypt_ctx_t object.
1119
+ # @param [ FFI::Pointer ] ctx A pointer to a mongocrypt_ctx_t object.
1120
+ # @return [ nil ] Always nil.
1121
+ attach_function :mongocrypt_ctx_destroy, [:pointer], :void
1122
+
1123
+ # @!method mongocrypt_crypto_fn(ctx, key, iv, input, output, status)
1124
+ # @api private
1125
+ #
1126
+ # A callback to a function that performs AES encryption or decryption.
1127
+ # @param [ FFI::Pointer | nil] ctx An optional pointer to a context object
1128
+ # that may have been set when hooks were enabled.
1129
+ # @param [ FFI::Pointer ] key A pointer to a mongocrypt_binary_t object
1130
+ # that references the 32-byte AES encryption key.
1131
+ # @param [ FFI::Pointer ] iv A pointer to a mongocrypt_binary_t object
1132
+ # that references the 16-byte AES IV.
1133
+ # @param [ FFI::Pointer ] input A pointer to a mongocrypt_binary_t object
1134
+ # that references the value to be encrypted/decrypted.
1135
+ # @param [ FFI::Pointer ] output (out param) A pointer to a
1136
+ # mongocrypt_binary_t object will have a reference to the encrypted/
1137
+ # decrypted value written to it by libmongocrypt.
1138
+ # @param [ FFI::Pointer ] status A pointer to a mongocrypt_status_t
1139
+ # object to which an error message will be written if encryption fails.
1140
+ # @return [ Bool ] Whether encryption/decryption was successful.
1141
+ #
1142
+ # @note This defines a method signature for an FFI callback; it is not
1143
+ # an instance method on the Binding class.
1144
+ callback(
1145
+ :mongocrypt_crypto_fn,
1146
+ [:pointer, :pointer, :pointer, :pointer, :pointer, :pointer, :pointer],
1147
+ :bool
1148
+ )
1149
+
1150
+ # @!method mongocrypt_hmac_fn(ctx, key, input, output, status)
1151
+ # @api private
1152
+ #
1153
+ # A callback to a function that performs HMAC SHA-512 or SHA-256.
1154
+ # @param [ FFI::Pointer | nil ] ctx An optional pointer to a context object
1155
+ # that may have been set when hooks were enabled.
1156
+ # @param [ FFI::Pointer ] key A pointer to a mongocrypt_binary_t object
1157
+ # that references the 32-byte HMAC SHA encryption key.
1158
+ # @param [ FFI::Pointer ] input A pointer to a mongocrypt_binary_t object
1159
+ # that references the input value.
1160
+ # @param [ FFI::Pointer ] output (out param) A pointer to a
1161
+ # mongocrypt_binary_t object will have a reference to the output value
1162
+ # written to it by libmongocrypt.
1163
+ # @param [ FFI::Pointer ] status A pointer to a mongocrypt_status_t
1164
+ # object to which an error message will be written if encryption fails.
1165
+ # @return [ Bool ] Whether HMAC-SHA was successful.
1166
+ #
1167
+ # @note This defines a method signature for an FFI callback; it is not
1168
+ # an instance method on the Binding class.
1169
+ callback(
1170
+ :mongocrypt_hmac_fn,
1171
+ [:pointer, :pointer, :pointer, :pointer, :pointer],
1172
+ :bool
1173
+ )
1174
+
1175
+ # @!method mongocrypt_hash_fn(ctx, input, output, status)
1176
+ # @api private
1177
+ #
1178
+ # A callback to a SHA-256 hash function.
1179
+ # @param [ FFI::Pointer | nil ] ctx An optional pointer to a context object
1180
+ # that may have been set when hooks were enabled.
1181
+ # @param [ FFI::Pointer ] input A pointer to a mongocrypt_binary_t object
1182
+ # that references the value to be hashed.
1183
+ # @param [ FFI::Pointer ] output (out param) A pointer to a
1184
+ # mongocrypt_binary_t object will have a reference to the output value
1185
+ # written to it by libmongocrypt.
1186
+ # @param [ FFI::Pointer ] status A pointer to a mongocrypt_status_t
1187
+ # object to which an error message will be written if encryption fails.
1188
+ # @return [ Bool ] Whether hashing was successful.
1189
+ #
1190
+ # @note This defines a method signature for an FFI callback; it is not
1191
+ # an instance method on the Binding class.
1192
+ callback :mongocrypt_hash_fn, [:pointer, :pointer, :pointer, :pointer], :bool
1193
+
1194
+ # @!method mongocrypt_random_fn(ctx, output, count, status)
1195
+ # @api private
1196
+ #
1197
+ # A callback to a crypto secure random function.
1198
+ # @param [ FFI::Pointer | nil ] ctx An optional pointer to a context object
1199
+ # that may have been set when hooks were enabled.
1200
+ # @param [ FFI::Pointer ] output (out param) A pointer to a
1201
+ # mongocrypt_binary_t object will have a reference to the output value
1202
+ # written to it by libmongocrypt.
1203
+ # @param [ Integer ] count The number of random bytes to return.
1204
+ # @param [ FFI::Pointer ] status A pointer to a mongocrypt_status_t
1205
+ # object to which an error message will be written if encryption fails.
1206
+ # @return [ Bool ] Whether hashing was successful.
1207
+ #
1208
+ # @note This defines a method signature for an FFI callback; it is not
1209
+ # an instance method on the Binding class.
1210
+ callback :mongocrypt_random_fn, [:pointer, :pointer, :int, :pointer], :bool
1211
+
1212
+ # @!method self.mongocrypt_setopt_crypto_hooks(crypt, aes_enc_fn, aes_dec_fn, random_fn, sha_512_fn, sha_256_fn, hash_fn, ctx=nil)
1213
+ # @api private
1214
+ #
1215
+ # Set crypto hooks on the provided mongocrypt object.
1216
+ # @param [ FFI::Pointer ] crypt A pointer to a mongocrypt_t object.
1217
+ # @param [ Proc ] aes_enc_fn An AES encryption method.
1218
+ # @param [ Proc ] aes_dec_fn An AES decryption method.
1219
+ # @param [ Proc ] random_fn A random method.
1220
+ # @param [ Proc ] sha_512_fn A HMAC SHA-512 method.
1221
+ # @param [ Proc ] sha_256_fn A HMAC SHA-256 method.
1222
+ # @param [ Proc ] hash_fn A SHA-256 hash method.
1223
+ # @param [ FFI::Pointer | nil ] ctx An optional pointer to a context object
1224
+ # that may have been set when hooks were enabled.
1225
+ # @return [ Boolean ] Whether setting this option succeeded.
1226
+ attach_function(
1227
+ :mongocrypt_setopt_crypto_hooks,
1228
+ [
1229
+ :pointer,
1230
+ :mongocrypt_crypto_fn,
1231
+ :mongocrypt_crypto_fn,
1232
+ :mongocrypt_random_fn,
1233
+ :mongocrypt_hmac_fn,
1234
+ :mongocrypt_hmac_fn,
1235
+ :mongocrypt_hash_fn,
1236
+ :pointer
1237
+ ],
1238
+ :bool
1239
+ )
1240
+
1241
+ # Set crypto callbacks on the Handle
1242
+ #
1243
+ # @param [ Mongo::Crypt::Handle ] handle
1244
+ # @param [ Method ] aes_encrypt_cb An AES encryption method
1245
+ # @param [ Method ] aes_decrypt_cb A AES decryption method
1246
+ # @param [ Method ] random_cb A method that returns a string of random bytes
1247
+ # @param [ Method ] hmac_sha_512_cb A HMAC SHA-512 method
1248
+ # @param [ Method ] hmac_sha_256_cb A HMAC SHA-256 method
1249
+ # @param [ Method ] hmac_hash_cb A SHA-256 hash method
1250
+ #
1251
+ # @raise [ Mongo::Error::CryptError ] If the callbacks aren't set successfully
1252
+ def self.setopt_crypto_hooks(handle,
1253
+ aes_encrypt_cb, aes_decrypt_cb, random_cb,
1254
+ hmac_sha_512_cb, hmac_sha_256_cb, hmac_hash_cb
1255
+ )
1256
+ check_status(handle) do
1257
+ mongocrypt_setopt_crypto_hooks(handle.ref,
1258
+ aes_encrypt_cb, aes_decrypt_cb, random_cb,
1259
+ hmac_sha_512_cb, hmac_sha_256_cb, hmac_hash_cb, nil
1260
+ )
1261
+ end
1262
+ end
1263
+
1264
+ # @!method self.mongocrypt_setopt_crypto_hook_sign_rsaes_pkcs1_v1_5(crypt, sign_rsaes_pkcs1_v1_5, ctx=nil)
1265
+ # @api private
1266
+ #
1267
+ # Set a crypto hook for the RSASSA-PKCS1-v1_5 algorithm with a SHA-256 hash.
1268
+ # @param [ FFI::Pointer ] crypt A pointer to a mongocrypt_t object.
1269
+ # @param [ Proc ] sign_rsaes_pkcs1_v1_5 A RSASSA-PKCS1-v1_5 signing method.
1270
+ # @param [ FFI::Pointer | nil ] ctx An optional pointer to a context object
1271
+ # that may have been set when hooks were enabled.
1272
+ # @return [ Boolean ] Whether setting this option succeeded.
1273
+ attach_function(
1274
+ :mongocrypt_setopt_crypto_hook_sign_rsaes_pkcs1_v1_5,
1275
+ [
1276
+ :pointer,
1277
+ :mongocrypt_hmac_fn,
1278
+ :pointer
1279
+ ],
1280
+ :bool
1281
+ )
1282
+
1283
+ # Set a crypto hook for the RSASSA-PKCS1-v1_5 algorithm with
1284
+ # a SHA-256 hash oh the Handle.
1285
+ #
1286
+ # @param [ Mongo::Crypt::Handle ] handle
1287
+ # @param [ Method ] rsaes_pkcs_signature_cb A RSASSA-PKCS1-v1_5 signing method.
1288
+ #
1289
+ # @raise [ Mongo::Error::CryptError ] If the callbacks aren't set successfully
1290
+ def self.setopt_crypto_hook_sign_rsaes_pkcs1_v1_5(
1291
+ handle,
1292
+ rsaes_pkcs_signature_cb
1293
+ )
1294
+ check_status(handle) do
1295
+ mongocrypt_setopt_crypto_hook_sign_rsaes_pkcs1_v1_5(
1296
+ handle.ref,
1297
+ rsaes_pkcs_signature_cb,
1298
+ nil
1299
+ )
1300
+ end
1301
+ end
1302
+
1303
+ # @!method self.mongocrypt_setopt_encrypted_field_config_map(crypt, efc_map)
1304
+ # @api private
1305
+ #
1306
+ # Set a local EncryptedFieldConfigMap for encryption.
1307
+ #
1308
+ # @param [ FFI::Pointer ] crypt A pointer to a mongocrypt_t object.
1309
+ # @param [ FFI::Pointer ] efc_map A pointer to mongocrypt_binary_t object that
1310
+ # references a BSON document representing the EncryptedFieldConfigMap
1311
+ # supplied by the user. The keys are collection namespaces and values are
1312
+ # EncryptedFieldConfigMap documents.
1313
+ #
1314
+ # @return [ Boolean ] Whether the operation succeeded.
1315
+ attach_function(
1316
+ :mongocrypt_setopt_encrypted_field_config_map,
1317
+ [
1318
+ :pointer,
1319
+ :pointer
1320
+ ],
1321
+ :bool
1322
+ )
1323
+
1324
+ # Set a local EncryptedFieldConfigMap for encryption.
1325
+ #
1326
+ # @param [ Mongo::Crypt::Handle ] handle
1327
+ # @param [ BSON::Document ] efc_map A BSON document representing
1328
+ # the EncryptedFieldConfigMap supplied by the user.
1329
+ # The keys are collection namespaces and values are
1330
+ # EncryptedFieldConfigMap documents.
1331
+ #
1332
+ # @raise [ Mongo::Error::CryptError ] If the operation failed.
1333
+ def self.setopt_encrypted_field_config_map(handle, efc_map)
1334
+ validate_document(efc_map)
1335
+ data = efc_map.to_bson.to_s
1336
+ Binary.wrap_string(data) do |data_p|
1337
+ check_status(handle) do
1338
+ mongocrypt_setopt_encrypted_field_config_map(
1339
+ handle.ref,
1340
+ data_p
1341
+ )
1342
+ end
1343
+ end
1344
+ end
1345
+
1346
+ # @!method self.mongocrypt_setopt_bypass_query_analysis(crypt)
1347
+ # @api private
1348
+ #
1349
+ # Opt into skipping query analysis.
1350
+ #
1351
+ # If opted in:
1352
+ # - The csfle shared library will not attempt to be loaded.
1353
+ # - A mongocrypt_ctx_t will never enter the MONGOCRYPT_CTX_NEED_MARKINGS state.
1354
+ #
1355
+ # @param [ FFI::Pointer ] crypt A pointer to a mongocrypt_t object.
1356
+ attach_function(:mongocrypt_setopt_bypass_query_analysis, [:pointer], :void)
1357
+
1358
+ # Opt-into skipping query analysis.
1359
+ #
1360
+ # If opted in:
1361
+ # - The csfle shared library will not attempt to be loaded.
1362
+ # - A mongocrypt_ctx_t will never enter the MONGOCRYPT_CTX_NEED_MARKINGS state.
1363
+ #
1364
+ # @param [ Mongo::Crypt::Handle ] handle
1365
+ def self.setopt_bypass_query_analysis(handle)
1366
+ mongocrypt_setopt_bypass_query_analysis(handle.ref)
1367
+ end
1368
+
1369
+ # @!method self.mongocrypt_setopt_aes_256_ctr(crypt, aes_256_ctr_encrypt, aes_256_ctr_decrypt, ctx)
1370
+ # @api private
1371
+ #
1372
+ # Set a crypto hook for the AES256-CTR operations.
1373
+ #
1374
+ # @param [ FFI::Pointer ] crypt A pointer to a mongocrypt_t object.
1375
+ # @param [ Proc ] aes_enc_fn An AES-CTR encryption method.
1376
+ # @param [ Proc ] aes_dec_fn An AES-CTR decryption method.
1377
+ # @param [ FFI::Pointer | nil ] ctx An optional pointer to a context object
1378
+ # that may have been set when hooks were enabled.
1379
+ # @return [ Boolean ] Whether setting this option succeeded.
1380
+ attach_function(
1381
+ :mongocrypt_setopt_aes_256_ctr,
1382
+ [
1383
+ :pointer,
1384
+ :mongocrypt_crypto_fn,
1385
+ :mongocrypt_crypto_fn,
1386
+ :pointer
1387
+ ],
1388
+ :bool
1389
+ )
1390
+
1391
+ # Set a crypto hook for the AES256-CTR operations.
1392
+ #
1393
+ # @param [ Mongo::Crypt::Handle ] handle
1394
+ # @param [ Method ] aes_encrypt_cb An AES-CTR encryption method
1395
+ # @param [ Method ] aes_decrypt_cb A AES-CTR decryption method
1396
+ #
1397
+ # @raise [ Mongo::Error::CryptError ] If the callbacks aren't set successfully
1398
+ def self.setopt_aes_256_ctr(handle, aes_ctr_encrypt_cb, aes_ctr_decrypt_cb)
1399
+ check_status(handle) do
1400
+ mongocrypt_setopt_aes_256_ctr(handle.ref,
1401
+ aes_ctr_encrypt_cb, aes_ctr_decrypt_cb, nil
1402
+ )
1403
+ end
1404
+ end
1405
+
1406
+ # @!method self.mongocrypt_setopt_append_crypt_shared_lib_search_path(crypt, path)
1407
+ # @api private
1408
+ #
1409
+ # Append an additional search directory to the search path for loading
1410
+ # the crypt_shared dynamic library.
1411
+ #
1412
+ # @param [ FFI::Pointer ] crypt A pointer to a mongocrypt_t object.
1413
+ # @param [ String ] path A path to search for the crypt shared library. If the leading element of
1414
+ # the path is the literal string "$ORIGIN", that substring will be replaced
1415
+ # with the directory path containing the executable libmongocrypt module. If
1416
+ # the path string is literal "$SYSTEM", then libmongocrypt will defer to the
1417
+ # system's library resolution mechanism to find the crypt_shared library.
1418
+ attach_function(
1419
+ :mongocrypt_setopt_append_crypt_shared_lib_search_path,
1420
+ [
1421
+ :pointer,
1422
+ :string,
1423
+ ],
1424
+ :void
1425
+ )
1426
+
1427
+ # Append an additional search directory to the search path for loading
1428
+ # the crypt_shared dynamic library.
1429
+ #
1430
+ # @param [ Mongo::Crypt::Handle ] handle
1431
+ # @param [ String ] path A search path for the crypt shared library.
1432
+ def self.setopt_append_crypt_shared_lib_search_path(handle, path)
1433
+ check_status(handle) do
1434
+ mongocrypt_setopt_append_crypt_shared_lib_search_path(handle.ref, path)
1435
+ end
1436
+ end
1437
+
1438
+ # @!method self.mongocrypt_setopt_set_crypt_shared_lib_path_override(crypt, path)
1439
+ # @api private
1440
+ #
1441
+ # Set a single override path for loading the crypt shared library.
1442
+ #
1443
+ # @param [ FFI::Pointer ] crypt A pointer to a mongocrypt_t object.
1444
+ # @param [ String ] path A path to crypt shared library file. If the leading element of
1445
+ # the path is the literal string "$ORIGIN", that substring will be replaced
1446
+ # with the directory path containing the executable libmongocrypt module.
1447
+ attach_function(
1448
+ :mongocrypt_setopt_set_crypt_shared_lib_path_override,
1449
+ [
1450
+ :pointer,
1451
+ :string,
1452
+ ],
1453
+ :void
1454
+ )
1455
+
1456
+ # Set a single override path for loading the crypt shared library.
1457
+ #
1458
+ # @param [ Mongo::Crypt::Handle ] handle
1459
+ # @param [ String ] path A path to crypt shared library file.
1460
+ def self.setopt_set_crypt_shared_lib_path_override(handle, path)
1461
+ check_status(handle) do
1462
+ mongocrypt_setopt_set_crypt_shared_lib_path_override(handle.ref, path)
1463
+ end
1464
+ end
1465
+
1466
+ # MONGOCRYPT_EXPORT
1467
+ # uint64_t
1468
+ # mongocrypt_crypt_shared_lib_version (const mongocrypt_t *crypt);
1469
+ attach_function(
1470
+ :mongocrypt_crypt_shared_lib_version,
1471
+ [ :pointer ],
1472
+ :uint64
1473
+ )
1474
+
1475
+ def self.crypt_shared_lib_version(handle)
1476
+ mongocrypt_crypt_shared_lib_version(handle.ref)
1477
+ end
1478
+
1479
+
1480
+ # @!method self.mongocrypt_ctx_setopt_query_type(ctx, mongocrypt_query_type)
1481
+ # @api private
1482
+ #
1483
+ # Set the query type to use for FLE 2 explicit encryption.
1484
+ # The query type is only used for indexed FLE 2 encryption.
1485
+ #
1486
+ # @param [ FFI::Pointer ] ctx A pointer to a mongocrypt_ctx_t object.
1487
+ # @param [ String ] query_type Type of the query.
1488
+ # @param [ Integer ] len The length of the query type string.
1489
+ #
1490
+ # @return [ Boolean ] Whether setting this option succeeded.
1491
+ attach_function(
1492
+ :mongocrypt_ctx_setopt_query_type,
1493
+ [
1494
+ :pointer,
1495
+ :string,
1496
+ :int
1497
+ ],
1498
+ :bool
1499
+ )
1500
+
1501
+ # Set the query type to use for FLE 2 explicit encryption.
1502
+ # The query type is only used for indexed FLE 2 encryption.
1503
+ #
1504
+ # @param [ Mongo::Crypt::Context ] context Explicit encryption context.
1505
+ # @param [ String ] :mongocrypt_query_type query_type Type of the query.
1506
+ #
1507
+ # @raise [ Mongo::Error::CryptError ] If the operation failed.
1508
+ def self.ctx_setopt_query_type(context, query_type)
1509
+ check_ctx_status(context) do
1510
+ mongocrypt_ctx_setopt_query_type(context.ctx_p, query_type, -1)
1511
+ end
1512
+ end
1513
+
1514
+ # @!method self.mongocrypt_ctx_setopt_contention_factor(ctx, contention_factor)
1515
+ # @api private
1516
+ #
1517
+ # Set the contention factor used for explicit encryption.
1518
+ # The contention factor is only used for indexed FLE 2 encryption.
1519
+ #
1520
+ # @param [ FFI::Pointer ] ctx A pointer to a mongocrypt_ctx_t object.
1521
+ # @param [ int64 ] contention_factor
1522
+ #
1523
+ # @return [ Boolean ] Whether setting this option succeeded.
1524
+ attach_function(
1525
+ :mongocrypt_ctx_setopt_contention_factor,
1526
+ [
1527
+ :pointer,
1528
+ :int64
1529
+ ],
1530
+ :bool
1531
+ )
1532
+
1533
+ # Set the contention factor used for explicit encryption.
1534
+ # The contention factor is only used for indexed FLE 2 encryption.
1535
+ #
1536
+ # @param [ Mongo::Crypt::Context ] context Explicit encryption context.
1537
+ # @param [ Integer ] factor Contention factor used for explicit encryption.
1538
+ #
1539
+ # @raise [ Mongo::Error::CryptError ] If the operation failed.
1540
+ def self.ctx_setopt_contention_factor(context, factor)
1541
+ check_ctx_status(context) do
1542
+ mongocrypt_ctx_setopt_contention_factor(context.ctx_p, factor)
1543
+ end
1544
+ end
1545
+
1546
+ # Raise a Mongo::Error::CryptError based on the status of the underlying
1547
+ # mongocrypt_t object.
1548
+ #
1549
+ # @return [ nil ] Always nil.
1550
+ def self.check_status(handle)
1551
+ unless yield
1552
+ status = Status.new
1553
+
1554
+ mongocrypt_status(handle.ref, status.ref)
1555
+ status.raise_crypt_error
1556
+ end
1557
+ end
1558
+
1559
+ # Raise a Mongo::Error::CryptError based on the status of the underlying
1560
+ # mongocrypt_ctx_t object.
1561
+ #
1562
+ # @return [ nil ] Always nil.
1563
+ def self.check_ctx_status(context)
1564
+ if block_given?
1565
+ do_raise = !yield
1566
+ else
1567
+ do_raise = true
1568
+ end
1569
+
1570
+ if do_raise
1571
+ status = Status.new
1572
+
1573
+ mongocrypt_ctx_status(context.ctx_p, status.ref)
1574
+ status.raise_crypt_error
1575
+ end
1576
+ end
1577
+
1578
+ # Checks that the specified data is a Hash before serializing
1579
+ # it to BSON to prevent errors from libmongocrypt
1580
+ #
1581
+ # @note All BSON::Document instances are also Hash instances
1582
+ #
1583
+ # @param [ Object ] data The data to be passed to libmongocrypt
1584
+ #
1585
+ # @raise [ Mongo::Error::CryptError ] If the data is not a Hash
1586
+ def self.validate_document(data)
1587
+ return if data.is_a?(Hash)
1588
+
1589
+ if data.nil?
1590
+ message = "Attempted to pass nil data to libmongocrypt. " +
1591
+ "Data must be a Hash"
1592
+ else
1593
+ message = "Attempted to pass invalid data to libmongocrypt: #{data} " +
1594
+ "Data must be a Hash"
1595
+ end
1596
+
1597
+ raise Error::CryptError.new(message)
1598
+ end
1599
+ end
1600
+ end
1601
+ end