mongo 2.17.4 → 2.21.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1580) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +70 -37
  3. data/Rakefile +87 -177
  4. data/bin/mongo_console +2 -0
  5. data/lib/mongo/active_support.rb +1 -1
  6. data/lib/mongo/address/ipv4.rb +1 -1
  7. data/lib/mongo/address/ipv6.rb +1 -1
  8. data/lib/mongo/address/unix.rb +1 -1
  9. data/lib/mongo/address/validator.rb +1 -1
  10. data/lib/mongo/address.rb +23 -4
  11. data/lib/mongo/auth/aws/conversation.rb +1 -5
  12. data/lib/mongo/{operation/drop_database/command.rb → auth/aws/credentials.rb} +15 -18
  13. data/lib/mongo/auth/aws/credentials_cache.rb +75 -0
  14. data/lib/mongo/auth/aws/credentials_retriever.rb +232 -44
  15. data/lib/mongo/auth/aws/request.rb +1 -2
  16. data/lib/mongo/auth/aws.rb +6 -6
  17. data/lib/mongo/auth/base.rb +9 -2
  18. data/lib/mongo/auth/conversation_base.rb +1 -1
  19. data/lib/mongo/auth/cr/conversation.rb +1 -1
  20. data/lib/mongo/auth/cr.rb +1 -1
  21. data/lib/mongo/auth/credential_cache.rb +1 -1
  22. data/lib/mongo/auth/gssapi/conversation.rb +1 -1
  23. data/lib/mongo/auth/gssapi.rb +1 -1
  24. data/lib/mongo/auth/ldap/conversation.rb +1 -1
  25. data/lib/mongo/auth/ldap.rb +1 -1
  26. data/lib/mongo/auth/roles.rb +17 -17
  27. data/lib/mongo/auth/sasl_conversation_base.rb +1 -1
  28. data/lib/mongo/auth/scram/conversation.rb +1 -1
  29. data/lib/mongo/auth/scram.rb +1 -1
  30. data/lib/mongo/auth/scram256/conversation.rb +1 -1
  31. data/lib/mongo/auth/scram256.rb +1 -1
  32. data/lib/mongo/auth/scram_conversation_base.rb +1 -1
  33. data/lib/mongo/auth/stringprep/profiles/sasl.rb +1 -1
  34. data/lib/mongo/auth/stringprep/tables.rb +1 -1
  35. data/lib/mongo/auth/stringprep/unicode_normalize/normalize.rb +1 -1
  36. data/lib/mongo/auth/stringprep/unicode_normalize/tables.rb +2 -1
  37. data/lib/mongo/auth/stringprep.rb +1 -1
  38. data/lib/mongo/auth/user/view.rb +1 -1
  39. data/lib/mongo/auth/user.rb +1 -1
  40. data/lib/mongo/auth/x509/conversation.rb +1 -1
  41. data/lib/mongo/auth/x509.rb +1 -1
  42. data/lib/mongo/auth.rb +13 -2
  43. data/lib/mongo/background_thread.rb +1 -1
  44. data/lib/mongo/bson.rb +1 -1
  45. data/lib/mongo/bulk_write/combineable.rb +1 -1
  46. data/lib/mongo/bulk_write/ordered_combiner.rb +1 -1
  47. data/lib/mongo/bulk_write/result.rb +11 -2
  48. data/lib/mongo/bulk_write/result_combiner.rb +3 -5
  49. data/lib/mongo/bulk_write/transformable.rb +1 -1
  50. data/lib/mongo/bulk_write/unordered_combiner.rb +1 -1
  51. data/lib/mongo/bulk_write/validatable.rb +1 -1
  52. data/lib/mongo/bulk_write.rb +152 -31
  53. data/lib/mongo/caching_cursor.rb +1 -1
  54. data/lib/mongo/client.rb +223 -27
  55. data/lib/mongo/client_encryption.rb +218 -11
  56. data/lib/mongo/cluster/periodic_executor.rb +1 -1
  57. data/lib/mongo/cluster/reapers/cursor_reaper.rb +14 -3
  58. data/lib/mongo/cluster/reapers/socket_reaper.rb +2 -2
  59. data/lib/mongo/cluster/sdam_flow.rb +62 -22
  60. data/lib/mongo/cluster/topology/base.rb +17 -1
  61. data/lib/mongo/cluster/topology/load_balanced.rb +1 -1
  62. data/lib/mongo/cluster/topology/no_replica_set_options.rb +1 -1
  63. data/lib/mongo/cluster/topology/replica_set_no_primary.rb +1 -1
  64. data/lib/mongo/cluster/topology/replica_set_with_primary.rb +1 -1
  65. data/lib/mongo/cluster/topology/sharded.rb +1 -1
  66. data/lib/mongo/cluster/topology/single.rb +1 -1
  67. data/lib/mongo/cluster/topology/unknown.rb +1 -1
  68. data/lib/mongo/cluster/topology.rb +1 -1
  69. data/lib/mongo/cluster.rb +95 -44
  70. data/lib/mongo/cluster_time.rb +1 -1
  71. data/lib/mongo/collection/helpers.rb +43 -0
  72. data/lib/mongo/collection/queryable_encryption.rb +162 -0
  73. data/lib/mongo/collection/view/aggregation/behavior.rb +131 -0
  74. data/lib/mongo/collection/view/aggregation.rb +51 -111
  75. data/lib/mongo/collection/view/builder/aggregation.rb +2 -8
  76. data/lib/mongo/collection/view/builder/map_reduce.rb +1 -1
  77. data/lib/mongo/collection/view/builder.rb +1 -1
  78. data/lib/mongo/collection/view/change_stream/retryable.rb +1 -1
  79. data/lib/mongo/collection/view/change_stream.rb +143 -48
  80. data/lib/mongo/collection/view/explainable.rb +2 -2
  81. data/lib/mongo/collection/view/immutable.rb +1 -1
  82. data/lib/mongo/collection/view/iterable.rb +79 -62
  83. data/lib/mongo/collection/view/map_reduce.rb +41 -15
  84. data/lib/mongo/collection/view/readable.rb +114 -62
  85. data/lib/mongo/collection/view/writable.rb +222 -70
  86. data/lib/mongo/collection/view.rb +44 -4
  87. data/lib/mongo/collection.rb +463 -114
  88. data/lib/mongo/condition_variable.rb +58 -0
  89. data/lib/mongo/config/options.rb +63 -0
  90. data/lib/mongo/config/validators/option.rb +27 -0
  91. data/lib/mongo/config.rb +43 -0
  92. data/lib/mongo/crypt/auto_decryption_context.rb +1 -1
  93. data/lib/mongo/crypt/auto_encrypter.rb +142 -20
  94. data/lib/mongo/crypt/auto_encryption_context.rb +1 -1
  95. data/lib/mongo/crypt/binary.rb +1 -1
  96. data/lib/mongo/crypt/binding.rb +715 -152
  97. data/lib/mongo/crypt/context.rb +83 -11
  98. data/lib/mongo/crypt/data_key_context.rb +13 -105
  99. data/lib/mongo/crypt/encryption_io.rb +133 -69
  100. data/lib/mongo/crypt/explicit_decryption_context.rb +1 -1
  101. data/lib/mongo/crypt/explicit_encrypter.rb +266 -34
  102. data/lib/mongo/crypt/explicit_encryption_context.rb +82 -22
  103. data/lib/mongo/{operation/kill_cursors/legacy.rb → crypt/explicit_encryption_expression_context.rb} +9 -20
  104. data/lib/mongo/crypt/handle.rb +169 -87
  105. data/lib/mongo/crypt/hooks.rb +26 -3
  106. data/lib/mongo/crypt/kms/aws/credentials.rb +83 -0
  107. data/lib/mongo/crypt/kms/aws/master_document.rb +78 -0
  108. data/lib/mongo/crypt/kms/aws.rb +20 -0
  109. data/lib/mongo/crypt/kms/azure/access_token.rb +54 -0
  110. data/lib/mongo/crypt/kms/azure/credentials.rb +103 -0
  111. data/lib/mongo/crypt/kms/azure/credentials_retriever.rb +138 -0
  112. data/lib/mongo/crypt/kms/azure/master_document.rb +79 -0
  113. data/lib/mongo/crypt/kms/azure.rb +21 -0
  114. data/lib/mongo/crypt/kms/credentials.rb +96 -0
  115. data/lib/mongo/crypt/kms/gcp/credentials.rb +127 -0
  116. data/lib/mongo/crypt/kms/gcp/credentials_retriever.rb +83 -0
  117. data/lib/mongo/crypt/kms/gcp/master_document.rb +99 -0
  118. data/lib/mongo/crypt/kms/gcp.rb +21 -0
  119. data/lib/mongo/crypt/kms/kmip/credentials.rb +68 -0
  120. data/lib/mongo/crypt/kms/kmip/master_document.rb +74 -0
  121. data/lib/mongo/crypt/kms/kmip.rb +19 -0
  122. data/lib/mongo/crypt/kms/local/credentials.rb +65 -0
  123. data/lib/mongo/crypt/kms/local/master_document.rb +43 -0
  124. data/lib/mongo/crypt/kms/local.rb +19 -0
  125. data/lib/mongo/crypt/kms/master_key_document.rb +65 -0
  126. data/lib/mongo/crypt/kms.rb +122 -0
  127. data/lib/mongo/crypt/kms_context.rb +1 -1
  128. data/lib/mongo/crypt/rewrap_many_data_key_context.rb +46 -0
  129. data/lib/mongo/crypt/rewrap_many_data_key_result.rb +37 -0
  130. data/lib/mongo/crypt/status.rb +9 -3
  131. data/lib/mongo/crypt.rb +16 -1
  132. data/lib/mongo/csot_timeout_holder.rb +119 -0
  133. data/lib/mongo/cursor/kill_spec.rb +31 -7
  134. data/lib/mongo/cursor/nontailable.rb +27 -0
  135. data/lib/mongo/cursor.rb +141 -35
  136. data/lib/mongo/cursor_host.rb +82 -0
  137. data/lib/mongo/database/view.rb +123 -16
  138. data/lib/mongo/database.rb +149 -35
  139. data/lib/mongo/dbref.rb +2 -106
  140. data/lib/mongo/distinguishing_semaphore.rb +2 -2
  141. data/lib/mongo/error/auth_error.rb +1 -1
  142. data/lib/mongo/error/bad_load_balancer_target.rb +1 -1
  143. data/lib/mongo/error/bulk_write_error.rb +32 -5
  144. data/lib/mongo/error/change_stream_resumable.rb +1 -1
  145. data/lib/mongo/error/client_closed.rb +24 -0
  146. data/lib/mongo/error/closed_stream.rb +1 -1
  147. data/lib/mongo/error/connection_check_out_timeout.rb +1 -1
  148. data/lib/mongo/error/connection_perished.rb +3 -1
  149. data/lib/mongo/error/connection_unavailable.rb +27 -0
  150. data/lib/mongo/error/credential_check_error.rb +1 -1
  151. data/lib/mongo/error/crypt_error.rb +1 -1
  152. data/lib/mongo/error/extra_file_chunk.rb +1 -1
  153. data/lib/mongo/error/failed_string_prep_validation.rb +1 -1
  154. data/lib/mongo/error/file_not_found.rb +1 -1
  155. data/lib/mongo/error/handshake_error.rb +1 -1
  156. data/lib/mongo/error/insufficient_iteration_count.rb +1 -1
  157. data/lib/mongo/error/internal_driver_error.rb +1 -1
  158. data/lib/mongo/error/invalid_address.rb +1 -1
  159. data/lib/mongo/error/invalid_application_name.rb +1 -1
  160. data/lib/mongo/error/invalid_bulk_operation.rb +1 -1
  161. data/lib/mongo/error/invalid_bulk_operation_type.rb +1 -1
  162. data/lib/mongo/error/invalid_collection_name.rb +1 -1
  163. data/lib/mongo/error/invalid_config_option.rb +21 -0
  164. data/lib/mongo/error/invalid_cursor_operation.rb +1 -1
  165. data/lib/mongo/error/invalid_database_name.rb +1 -1
  166. data/lib/mongo/error/invalid_document.rb +1 -1
  167. data/lib/mongo/error/invalid_file.rb +1 -1
  168. data/lib/mongo/error/invalid_file_revision.rb +1 -1
  169. data/lib/mongo/{operation/drop/command.rb → error/invalid_max_connecting.rb} +8 -21
  170. data/lib/mongo/error/invalid_min_pool_size.rb +1 -1
  171. data/lib/mongo/error/invalid_nonce.rb +1 -1
  172. data/lib/mongo/error/invalid_read_concern.rb +1 -1
  173. data/lib/mongo/error/invalid_read_option.rb +2 -2
  174. data/lib/mongo/error/invalid_replacement_document.rb +28 -10
  175. data/lib/mongo/error/invalid_server_auth_host.rb +1 -1
  176. data/lib/mongo/error/invalid_server_auth_response.rb +1 -1
  177. data/lib/mongo/error/invalid_server_preference.rb +1 -1
  178. data/lib/mongo/error/invalid_session.rb +1 -1
  179. data/lib/mongo/error/invalid_signature.rb +1 -1
  180. data/lib/mongo/error/invalid_transaction_operation.rb +1 -1
  181. data/lib/mongo/error/invalid_txt_record.rb +1 -1
  182. data/lib/mongo/error/invalid_update_document.rb +28 -8
  183. data/lib/mongo/error/invalid_uri.rb +1 -1
  184. data/lib/mongo/error/invalid_write_concern.rb +1 -1
  185. data/lib/mongo/error/kms_error.rb +1 -1
  186. data/lib/mongo/error/labelable.rb +72 -0
  187. data/lib/mongo/error/lint_error.rb +1 -1
  188. data/lib/mongo/error/max_bson_size.rb +1 -1
  189. data/lib/mongo/error/max_message_size.rb +1 -1
  190. data/lib/mongo/error/mismatched_domain.rb +1 -1
  191. data/lib/mongo/error/missing_connection.rb +27 -0
  192. data/lib/mongo/error/missing_file_chunk.rb +9 -3
  193. data/lib/mongo/error/missing_password.rb +1 -1
  194. data/lib/mongo/error/missing_resume_token.rb +1 -1
  195. data/lib/mongo/error/missing_scram_server_signature.rb +1 -1
  196. data/lib/mongo/error/missing_service_id.rb +1 -1
  197. data/lib/mongo/error/mongocryptd_spawn_error.rb +1 -1
  198. data/lib/mongo/error/multi_index_drop.rb +1 -1
  199. data/lib/mongo/error/need_primary_server.rb +1 -1
  200. data/lib/mongo/error/no_server_available.rb +1 -1
  201. data/lib/mongo/error/no_service_connection_available.rb +1 -1
  202. data/lib/mongo/error/no_srv_records.rb +1 -1
  203. data/lib/mongo/error/notable.rb +15 -1
  204. data/lib/mongo/error/operation_failure.rb +213 -260
  205. data/lib/mongo/error/parser.rb +1 -1
  206. data/lib/mongo/{operation/create_user/command.rb → error/pool_cleared_error.rb} +17 -23
  207. data/lib/mongo/error/pool_closed_error.rb +4 -17
  208. data/lib/mongo/{operation/update_user/command.rb → error/pool_error.rb} +21 -21
  209. data/lib/mongo/{operation/drop_index/command.rb → error/pool_paused_error.rb} +17 -22
  210. data/lib/mongo/error/raise_original_error.rb +1 -1
  211. data/lib/mongo/error/read_write_retryable.rb +108 -0
  212. data/lib/mongo/error/sdam_error_detection.rb +1 -1
  213. data/lib/mongo/error/server_api_conflict.rb +1 -1
  214. data/lib/mongo/error/server_api_not_supported.rb +1 -1
  215. data/lib/mongo/error/server_certificate_revoked.rb +1 -1
  216. data/lib/mongo/{operation/get_more/legacy.rb → error/server_not_usable.rb} +13 -16
  217. data/lib/mongo/error/server_timeout_error.rb +12 -0
  218. data/lib/mongo/error/session_ended.rb +1 -1
  219. data/lib/mongo/{operation/command/command.rb → error/session_not_materialized.rb} +8 -20
  220. data/lib/mongo/error/sessions_not_supported.rb +1 -1
  221. data/lib/mongo/error/snapshot_session_invalid_server_version.rb +1 -1
  222. data/lib/mongo/error/snapshot_session_transaction_prohibited.rb +1 -1
  223. data/lib/mongo/error/socket_error.rb +1 -1
  224. data/lib/mongo/error/socket_timeout_error.rb +4 -2
  225. data/lib/mongo/error/timeout_error.rb +23 -0
  226. data/lib/mongo/{operation/shared/op_msg_or_command.rb → error/transactions_not_supported.rb} +13 -20
  227. data/lib/mongo/error/unchangeable_collection_option.rb +1 -1
  228. data/lib/mongo/error/unexpected_chunk_length.rb +1 -1
  229. data/lib/mongo/error/unexpected_response.rb +1 -1
  230. data/lib/mongo/error/unknown_payload_type.rb +1 -1
  231. data/lib/mongo/error/unmet_dependency.rb +1 -1
  232. data/lib/mongo/error/unsupported_array_filters.rb +1 -1
  233. data/lib/mongo/error/unsupported_collation.rb +1 -1
  234. data/lib/mongo/error/unsupported_features.rb +1 -1
  235. data/lib/mongo/error/unsupported_message_type.rb +1 -1
  236. data/lib/mongo/error/unsupported_option.rb +1 -1
  237. data/lib/mongo/error/write_retryable.rb +1 -1
  238. data/lib/mongo/error.rb +16 -38
  239. data/lib/mongo/event/base.rb +1 -1
  240. data/lib/mongo/event/listeners.rb +1 -1
  241. data/lib/mongo/event/publisher.rb +1 -1
  242. data/lib/mongo/event/subscriber.rb +1 -1
  243. data/lib/mongo/event.rb +1 -1
  244. data/lib/mongo/grid/file/chunk.rb +3 -2
  245. data/lib/mongo/grid/file/info.rb +3 -2
  246. data/lib/mongo/grid/file.rb +1 -1
  247. data/lib/mongo/grid/fs_bucket.rb +49 -10
  248. data/lib/mongo/grid/stream/read.rb +22 -2
  249. data/lib/mongo/grid/stream/write.rb +22 -5
  250. data/lib/mongo/grid/stream.rb +1 -1
  251. data/lib/mongo/grid.rb +1 -1
  252. data/lib/mongo/id.rb +1 -1
  253. data/lib/mongo/index/view.rb +96 -19
  254. data/lib/mongo/index.rb +1 -1
  255. data/lib/mongo/lint.rb +1 -1
  256. data/lib/mongo/loggable.rb +3 -3
  257. data/lib/mongo/logger.rb +1 -1
  258. data/lib/mongo/monitoring/cmap_log_subscriber.rb +1 -1
  259. data/lib/mongo/monitoring/command_log_subscriber.rb +1 -1
  260. data/lib/mongo/monitoring/event/cmap/base.rb +1 -1
  261. data/lib/mongo/monitoring/event/cmap/connection_check_out_failed.rb +1 -1
  262. data/lib/mongo/monitoring/event/cmap/connection_check_out_started.rb +1 -1
  263. data/lib/mongo/monitoring/event/cmap/connection_checked_in.rb +1 -1
  264. data/lib/mongo/monitoring/event/cmap/connection_checked_out.rb +1 -1
  265. data/lib/mongo/monitoring/event/cmap/connection_closed.rb +1 -1
  266. data/lib/mongo/monitoring/event/cmap/connection_created.rb +1 -1
  267. data/lib/mongo/monitoring/event/cmap/connection_ready.rb +1 -1
  268. data/lib/mongo/monitoring/event/cmap/pool_cleared.rb +9 -2
  269. data/lib/mongo/monitoring/event/cmap/pool_closed.rb +1 -1
  270. data/lib/mongo/monitoring/event/cmap/pool_created.rb +1 -1
  271. data/lib/mongo/monitoring/event/cmap/pool_ready.rb +67 -0
  272. data/lib/mongo/monitoring/event/cmap.rb +2 -1
  273. data/lib/mongo/monitoring/event/command_failed.rb +9 -3
  274. data/lib/mongo/monitoring/event/command_started.rb +2 -2
  275. data/lib/mongo/monitoring/event/command_succeeded.rb +10 -3
  276. data/lib/mongo/monitoring/event/secure.rb +2 -2
  277. data/lib/mongo/monitoring/event/server_closed.rb +1 -1
  278. data/lib/mongo/monitoring/event/server_description_changed.rb +1 -1
  279. data/lib/mongo/monitoring/event/server_heartbeat_failed.rb +1 -1
  280. data/lib/mongo/monitoring/event/server_heartbeat_started.rb +1 -1
  281. data/lib/mongo/monitoring/event/server_heartbeat_succeeded.rb +1 -1
  282. data/lib/mongo/monitoring/event/server_opening.rb +1 -1
  283. data/lib/mongo/monitoring/event/topology_changed.rb +1 -1
  284. data/lib/mongo/monitoring/event/topology_closed.rb +1 -1
  285. data/lib/mongo/monitoring/event/topology_opening.rb +1 -1
  286. data/lib/mongo/monitoring/event.rb +1 -1
  287. data/lib/mongo/monitoring/publishable.rb +10 -6
  288. data/lib/mongo/monitoring/sdam_log_subscriber.rb +1 -1
  289. data/lib/mongo/monitoring/server_closed_log_subscriber.rb +1 -1
  290. data/lib/mongo/monitoring/server_description_changed_log_subscriber.rb +1 -1
  291. data/lib/mongo/monitoring/server_opening_log_subscriber.rb +1 -1
  292. data/lib/mongo/monitoring/topology_changed_log_subscriber.rb +1 -1
  293. data/lib/mongo/monitoring/topology_closed_log_subscriber.rb +1 -1
  294. data/lib/mongo/monitoring/topology_opening_log_subscriber.rb +1 -1
  295. data/lib/mongo/monitoring/unified_sdam_log_subscriber.rb +1 -1
  296. data/lib/mongo/monitoring.rb +1 -1
  297. data/lib/mongo/operation/aggregate/op_msg.rb +1 -1
  298. data/lib/mongo/operation/aggregate/result.rb +1 -1
  299. data/lib/mongo/operation/aggregate.rb +2 -3
  300. data/lib/mongo/operation/collections_info/result.rb +6 -3
  301. data/lib/mongo/operation/collections_info.rb +4 -16
  302. data/lib/mongo/operation/command/op_msg.rb +7 -1
  303. data/lib/mongo/operation/command.rb +2 -3
  304. data/lib/mongo/operation/context.rb +64 -8
  305. data/lib/mongo/operation/count/op_msg.rb +5 -2
  306. data/lib/mongo/operation/count.rb +2 -3
  307. data/lib/mongo/operation/create/op_msg.rb +5 -2
  308. data/lib/mongo/operation/create.rb +2 -3
  309. data/lib/mongo/operation/create_index/op_msg.rb +3 -2
  310. data/lib/mongo/operation/create_index.rb +2 -3
  311. data/lib/mongo/operation/create_search_indexes/op_msg.rb +31 -0
  312. data/lib/mongo/operation/create_search_indexes.rb +15 -0
  313. data/lib/mongo/operation/create_user/op_msg.rb +1 -1
  314. data/lib/mongo/operation/create_user.rb +2 -3
  315. data/lib/mongo/operation/delete/bulk_result.rb +1 -1
  316. data/lib/mongo/operation/delete/op_msg.rb +4 -2
  317. data/lib/mongo/operation/delete/result.rb +1 -1
  318. data/lib/mongo/operation/delete.rb +1 -3
  319. data/lib/mongo/operation/distinct/op_msg.rb +5 -2
  320. data/lib/mongo/operation/distinct.rb +2 -3
  321. data/lib/mongo/operation/drop/op_msg.rb +1 -1
  322. data/lib/mongo/operation/drop.rb +2 -3
  323. data/lib/mongo/operation/drop_database/op_msg.rb +1 -1
  324. data/lib/mongo/operation/drop_database.rb +2 -3
  325. data/lib/mongo/operation/drop_index/op_msg.rb +6 -2
  326. data/lib/mongo/operation/drop_index.rb +2 -3
  327. data/lib/mongo/operation/drop_search_index/op_msg.rb +33 -0
  328. data/lib/mongo/operation/drop_search_index.rb +15 -0
  329. data/lib/mongo/operation/explain/op_msg.rb +1 -1
  330. data/lib/mongo/operation/explain/result.rb +1 -1
  331. data/lib/mongo/operation/explain.rb +2 -4
  332. data/lib/mongo/operation/find/builder/command.rb +1 -1
  333. data/lib/mongo/operation/find/builder/flags.rb +1 -1
  334. data/lib/mongo/operation/find/builder/modifiers.rb +1 -1
  335. data/lib/mongo/operation/find/builder.rb +1 -2
  336. data/lib/mongo/operation/find/op_msg.rb +46 -1
  337. data/lib/mongo/operation/find/result.rb +1 -1
  338. data/lib/mongo/operation/find.rb +2 -4
  339. data/lib/mongo/operation/get_more/command_builder.rb +6 -2
  340. data/lib/mongo/operation/get_more/op_msg.rb +34 -1
  341. data/lib/mongo/operation/get_more/result.rb +1 -1
  342. data/lib/mongo/operation/get_more.rb +2 -4
  343. data/lib/mongo/operation/indexes/op_msg.rb +1 -1
  344. data/lib/mongo/operation/indexes/result.rb +1 -1
  345. data/lib/mongo/operation/indexes.rb +2 -18
  346. data/lib/mongo/operation/insert/bulk_result.rb +6 -2
  347. data/lib/mongo/operation/insert/op_msg.rb +9 -5
  348. data/lib/mongo/operation/insert/result.rb +9 -4
  349. data/lib/mongo/operation/insert.rb +1 -3
  350. data/lib/mongo/operation/kill_cursors/command_builder.rb +1 -1
  351. data/lib/mongo/operation/kill_cursors/op_msg.rb +1 -1
  352. data/lib/mongo/operation/kill_cursors.rb +2 -4
  353. data/lib/mongo/operation/list_collections/op_msg.rb +5 -2
  354. data/lib/mongo/operation/list_collections/result.rb +2 -2
  355. data/lib/mongo/operation/list_collections.rb +2 -3
  356. data/lib/mongo/operation/map_reduce/op_msg.rb +1 -1
  357. data/lib/mongo/operation/map_reduce/result.rb +18 -2
  358. data/lib/mongo/operation/map_reduce.rb +2 -3
  359. data/lib/mongo/operation/op_msg_base.rb +4 -2
  360. data/lib/mongo/operation/parallel_scan/op_msg.rb +1 -1
  361. data/lib/mongo/operation/parallel_scan/result.rb +1 -1
  362. data/lib/mongo/operation/parallel_scan.rb +2 -3
  363. data/lib/mongo/operation/remove_user/op_msg.rb +1 -1
  364. data/lib/mongo/operation/remove_user.rb +2 -3
  365. data/lib/mongo/operation/result.rb +47 -10
  366. data/lib/mongo/operation/shared/bypass_document_validation.rb +1 -1
  367. data/lib/mongo/operation/shared/causal_consistency_supported.rb +1 -1
  368. data/lib/mongo/operation/shared/executable.rb +60 -18
  369. data/lib/mongo/operation/shared/executable_no_validate.rb +1 -1
  370. data/lib/mongo/operation/shared/executable_transaction_label.rb +1 -1
  371. data/lib/mongo/operation/shared/idable.rb +1 -1
  372. data/lib/mongo/operation/shared/limited.rb +1 -1
  373. data/lib/mongo/operation/shared/object_id_generator.rb +1 -1
  374. data/lib/mongo/operation/shared/{polymorphic_operation.rb → op_msg_executable.rb} +28 -8
  375. data/lib/mongo/operation/shared/polymorphic_lookup.rb +1 -1
  376. data/lib/mongo/operation/shared/polymorphic_result.rb +1 -1
  377. data/lib/mongo/operation/shared/read_preference_supported.rb +1 -1
  378. data/lib/mongo/operation/shared/response_handling.rb +32 -33
  379. data/lib/mongo/operation/shared/result/aggregatable.rb +1 -1
  380. data/lib/mongo/operation/shared/result/use_legacy_error_parser.rb +1 -1
  381. data/lib/mongo/operation/shared/sessions_supported.rb +2 -3
  382. data/lib/mongo/operation/shared/specifiable.rb +8 -1
  383. data/lib/mongo/operation/shared/timed.rb +52 -0
  384. data/lib/mongo/operation/shared/validatable.rb +1 -1
  385. data/lib/mongo/operation/shared/write.rb +22 -13
  386. data/lib/mongo/operation/shared/write_concern_supported.rb +1 -1
  387. data/lib/mongo/operation/update/bulk_result.rb +1 -1
  388. data/lib/mongo/operation/update/op_msg.rb +5 -3
  389. data/lib/mongo/operation/update/result.rb +1 -1
  390. data/lib/mongo/operation/update.rb +1 -3
  391. data/lib/mongo/operation/update_search_index/op_msg.rb +34 -0
  392. data/lib/mongo/operation/update_search_index.rb +15 -0
  393. data/lib/mongo/operation/update_user/op_msg.rb +1 -1
  394. data/lib/mongo/operation/update_user.rb +2 -3
  395. data/lib/mongo/operation/users_info/op_msg.rb +1 -1
  396. data/lib/mongo/operation/users_info/result.rb +1 -1
  397. data/lib/mongo/operation/users_info.rb +2 -3
  398. data/lib/mongo/operation/write_command/op_msg.rb +1 -1
  399. data/lib/mongo/operation/write_command.rb +2 -3
  400. data/lib/mongo/operation.rb +6 -4
  401. data/lib/mongo/options/mapper.rb +1 -1
  402. data/lib/mongo/options/redacted.rb +1 -1
  403. data/lib/mongo/options.rb +1 -1
  404. data/lib/mongo/protocol/bit_vector.rb +4 -2
  405. data/lib/mongo/protocol/caching_hash.rb +52 -0
  406. data/lib/mongo/protocol/compressed.rb +1 -1
  407. data/lib/mongo/protocol/get_more.rb +1 -1
  408. data/lib/mongo/protocol/kill_cursors.rb +1 -1
  409. data/lib/mongo/protocol/message.rb +6 -13
  410. data/lib/mongo/protocol/msg.rb +25 -4
  411. data/lib/mongo/protocol/query.rb +1 -1
  412. data/lib/mongo/protocol/registry.rb +1 -1
  413. data/lib/mongo/protocol/reply.rb +1 -1
  414. data/lib/mongo/protocol/serializers.rb +25 -18
  415. data/lib/mongo/protocol.rb +2 -4
  416. data/lib/mongo/query_cache.rb +36 -21
  417. data/lib/mongo/retryable/base_worker.rb +116 -0
  418. data/lib/mongo/retryable/read_worker.rb +338 -0
  419. data/lib/mongo/retryable/write_worker.rb +398 -0
  420. data/lib/mongo/retryable.rb +37 -454
  421. data/lib/mongo/search_index/view.rb +232 -0
  422. data/lib/mongo/semaphore.rb +2 -2
  423. data/lib/mongo/server/app_metadata/environment.rb +314 -0
  424. data/lib/mongo/server/app_metadata/platform.rb +114 -0
  425. data/lib/mongo/server/app_metadata/truncator.rb +142 -0
  426. data/lib/mongo/server/app_metadata.rb +76 -108
  427. data/lib/mongo/server/connection.rb +102 -22
  428. data/lib/mongo/server/connection_base.rb +25 -3
  429. data/lib/mongo/server/connection_common.rb +5 -2
  430. data/lib/mongo/server/connection_pool/generation_manager.rb +56 -12
  431. data/lib/mongo/server/connection_pool/populator.rb +33 -31
  432. data/lib/mongo/server/connection_pool.rb +758 -251
  433. data/lib/mongo/server/description/features.rb +5 -2
  434. data/lib/mongo/server/description/load_balancer.rb +1 -1
  435. data/lib/mongo/server/description.rb +32 -13
  436. data/lib/mongo/server/monitor/app_metadata.rb +1 -1
  437. data/lib/mongo/server/monitor/connection.rb +2 -1
  438. data/lib/mongo/server/monitor.rb +43 -24
  439. data/lib/mongo/server/pending_connection.rb +26 -9
  440. data/lib/mongo/server/push_monitor/connection.rb +1 -1
  441. data/lib/mongo/server/push_monitor.rb +14 -4
  442. data/lib/mongo/server/{round_trip_time_averager.rb → round_trip_time_calculator.rb} +26 -8
  443. data/lib/mongo/server.rb +114 -39
  444. data/lib/mongo/server_selector/base.rb +75 -12
  445. data/lib/mongo/server_selector/nearest.rb +1 -1
  446. data/lib/mongo/server_selector/primary.rb +1 -1
  447. data/lib/mongo/server_selector/primary_preferred.rb +1 -1
  448. data/lib/mongo/server_selector/secondary.rb +1 -1
  449. data/lib/mongo/server_selector/secondary_preferred.rb +1 -1
  450. data/lib/mongo/server_selector.rb +1 -1
  451. data/lib/mongo/session/server_session/dirtyable.rb +52 -0
  452. data/lib/mongo/session/server_session.rb +4 -1
  453. data/lib/mongo/session/session_pool.rb +21 -19
  454. data/lib/mongo/session.rb +221 -44
  455. data/lib/mongo/socket/ocsp_cache.rb +1 -1
  456. data/lib/mongo/socket/ocsp_verifier.rb +5 -6
  457. data/lib/mongo/socket/ssl.rb +132 -19
  458. data/lib/mongo/socket/tcp.rb +44 -7
  459. data/lib/mongo/socket/unix.rb +1 -1
  460. data/lib/mongo/socket.rb +183 -27
  461. data/lib/mongo/srv/monitor.rb +1 -3
  462. data/lib/mongo/srv/resolver.rb +25 -4
  463. data/lib/mongo/srv/result.rb +1 -1
  464. data/lib/mongo/srv.rb +1 -1
  465. data/lib/mongo/timeout.rb +2 -2
  466. data/lib/mongo/topology_version.rb +1 -1
  467. data/lib/mongo/uri/options_mapper.rb +325 -81
  468. data/lib/mongo/uri/srv_protocol.rb +2 -2
  469. data/lib/mongo/uri.rb +61 -17
  470. data/lib/mongo/utils.rb +1 -1
  471. data/lib/mongo/version.rb +1 -5
  472. data/lib/mongo/write_concern/acknowledged.rb +1 -1
  473. data/lib/mongo/write_concern/base.rb +1 -1
  474. data/lib/mongo/write_concern/unacknowledged.rb +1 -1
  475. data/lib/mongo/write_concern.rb +1 -1
  476. data/lib/mongo.rb +26 -1
  477. data/mongo.gemspec +14 -14
  478. data/spec/README.md +23 -5
  479. data/spec/atlas/atlas_connectivity_spec.rb +10 -10
  480. data/spec/atlas/operations_spec.rb +7 -12
  481. data/spec/faas/ruby-sam-app/Gemfile +9 -0
  482. data/spec/faas/ruby-sam-app/mongodb/Gemfile +4 -0
  483. data/spec/faas/ruby-sam-app/mongodb/app.rb +149 -0
  484. data/spec/faas/ruby-sam-app/template.yaml +48 -0
  485. data/spec/integration/auth_spec.rb +1 -1
  486. data/spec/integration/awaited_ismaster_spec.rb +1 -1
  487. data/spec/integration/aws_auth_credentials_cache_spec.rb +51 -0
  488. data/spec/integration/aws_auth_request_spec.rb +2 -2
  489. data/spec/integration/aws_credentials_retriever_spec.rb +32 -2
  490. data/spec/integration/aws_lambda_examples_spec.rb +68 -0
  491. data/spec/integration/bson_symbol_spec.rb +1 -1
  492. data/spec/integration/bulk_insert_spec.rb +1 -1
  493. data/spec/integration/bulk_write_error_message_spec.rb +33 -0
  494. data/spec/integration/bulk_write_spec.rb +1 -1
  495. data/spec/integration/change_stream_examples_spec.rb +1 -1
  496. data/spec/integration/change_stream_spec.rb +12 -6
  497. data/spec/integration/check_clean_slate_spec.rb +1 -1
  498. data/spec/integration/client_authentication_options_spec.rb +1 -1
  499. data/spec/integration/client_connectivity_spec.rb +1 -1
  500. data/spec/integration/client_construction_aws_auth_spec.rb +12 -3
  501. data/spec/integration/client_construction_spec.rb +97 -9
  502. data/spec/integration/client_side_encryption/auto_encryption_bulk_writes_spec.rb +10 -10
  503. data/spec/integration/client_side_encryption/auto_encryption_command_monitoring_spec.rb +169 -169
  504. data/spec/integration/client_side_encryption/auto_encryption_mongocryptd_spawn_spec.rb +3 -3
  505. data/spec/integration/client_side_encryption/auto_encryption_old_wire_version_spec.rb +1 -1
  506. data/spec/integration/client_side_encryption/auto_encryption_reconnect_spec.rb +41 -5
  507. data/spec/integration/client_side_encryption/auto_encryption_spec.rb +537 -387
  508. data/spec/integration/client_side_encryption/automatic_data_encryption_keys_prose_spec.rb +153 -0
  509. data/spec/integration/client_side_encryption/bson_size_limit_spec.rb +3 -3
  510. data/spec/integration/client_side_encryption/bypass_mongocryptd_spawn_spec.rb +3 -3
  511. data/spec/integration/client_side_encryption/client_close_spec.rb +2 -2
  512. data/spec/integration/client_side_encryption/corpus_spec.rb +75 -38
  513. data/spec/integration/client_side_encryption/custom_endpoint_spec.rb +40 -43
  514. data/spec/integration/client_side_encryption/data_key_spec.rb +98 -8
  515. data/spec/integration/client_side_encryption/decryption_events_prose_spec.rb +159 -0
  516. data/spec/integration/client_side_encryption/explicit_encryption_spec.rb +60 -1
  517. data/spec/integration/client_side_encryption/explicit_queryable_encryption_spec.rb +150 -0
  518. data/spec/integration/client_side_encryption/external_key_vault_spec.rb +7 -7
  519. data/spec/integration/client_side_encryption/kms_tls_options_spec.rb +436 -0
  520. data/spec/integration/client_side_encryption/kms_tls_spec.rb +92 -0
  521. data/spec/integration/client_side_encryption/mongocryptd_prose_spec.rb +105 -0
  522. data/spec/integration/client_side_encryption/on_demand_aws_credentials_spec.rb +49 -0
  523. data/spec/integration/client_side_encryption/on_demand_azure_credentials_spec.rb +46 -0
  524. data/spec/integration/client_side_encryption/on_demand_gcp_credentials_spec.rb +47 -0
  525. data/spec/integration/client_side_encryption/queryable_encryption_examples_spec.rb +114 -0
  526. data/spec/integration/client_side_encryption/range_explicit_encryption_prose_spec.rb +583 -0
  527. data/spec/integration/client_side_encryption/rewrap_prose_spec.rb +114 -0
  528. data/spec/integration/client_side_encryption/unique_index_on_key_alt_names_prose_spec.rb +89 -0
  529. data/spec/integration/client_side_encryption/views_spec.rb +2 -2
  530. data/spec/integration/client_side_operations_timeout/encryption_prose_spec.rb +131 -0
  531. data/spec/integration/client_spec.rb +8 -3
  532. data/spec/integration/client_update_spec.rb +7 -3
  533. data/spec/integration/collection_indexes_prose_spec.rb +1 -1
  534. data/spec/integration/command_monitoring_spec.rb +1 -1
  535. data/spec/integration/command_spec.rb +2 -24
  536. data/spec/integration/connect_single_rs_name_spec.rb +1 -1
  537. data/spec/integration/connection/faas_env_spec.rb +62 -0
  538. data/spec/integration/connection_pool_populator_spec.rb +29 -7
  539. data/spec/integration/connection_spec.rb +1 -1
  540. data/spec/integration/crud_spec.rb +13 -1
  541. data/spec/integration/cursor_pinning_spec.rb +21 -62
  542. data/spec/integration/cursor_reaping_spec.rb +2 -2
  543. data/spec/integration/docs_examples_spec.rb +3 -3
  544. data/spec/integration/error_detection_spec.rb +1 -1
  545. data/spec/integration/fork_reconnect_spec.rb +17 -10
  546. data/spec/integration/get_more_spec.rb +1 -1
  547. data/spec/integration/grid_fs_bucket_spec.rb +4 -4
  548. data/spec/integration/heartbeat_events_spec.rb +1 -1
  549. data/spec/integration/map_reduce_spec.rb +5 -1
  550. data/spec/integration/mmapv1_spec.rb +1 -1
  551. data/spec/integration/mongos_pinning_spec.rb +1 -1
  552. data/spec/integration/ocsp_connectivity_spec.rb +1 -1
  553. data/spec/integration/ocsp_verifier_cache_spec.rb +1 -1
  554. data/spec/integration/ocsp_verifier_spec.rb +5 -2
  555. data/spec/integration/operation_failure_code_spec.rb +2 -2
  556. data/spec/integration/operation_failure_message_spec.rb +4 -3
  557. data/spec/integration/query_cache_spec.rb +124 -33
  558. data/spec/integration/query_cache_transactions_spec.rb +1 -1
  559. data/spec/integration/read_concern_spec.rb +1 -1
  560. data/spec/integration/read_preference_spec.rb +1 -1
  561. data/spec/integration/reconnect_spec.rb +6 -1
  562. data/spec/integration/retryable_errors_spec.rb +3 -3
  563. data/spec/integration/retryable_reads_errors_spec.rb +275 -0
  564. data/spec/integration/retryable_writes/retryable_writes_36_and_older_spec.rb +2 -2
  565. data/spec/integration/retryable_writes/retryable_writes_40_and_newer_spec.rb +1 -1
  566. data/spec/integration/retryable_writes/shared/adds_diagnostics.rb +1 -1
  567. data/spec/integration/retryable_writes/shared/does_not_support_retries.rb +1 -1
  568. data/spec/integration/retryable_writes/shared/only_supports_legacy_retries.rb +1 -1
  569. data/spec/integration/retryable_writes/shared/performs_legacy_retries.rb +1 -1
  570. data/spec/integration/retryable_writes/shared/performs_modern_retries.rb +1 -1
  571. data/spec/integration/retryable_writes/shared/performs_no_retries.rb +1 -1
  572. data/spec/integration/retryable_writes/shared/supports_legacy_retries.rb +1 -1
  573. data/spec/integration/retryable_writes/shared/supports_modern_retries.rb +1 -1
  574. data/spec/integration/retryable_writes/shared/supports_retries.rb +1 -1
  575. data/spec/integration/retryable_writes_errors_spec.rb +316 -2
  576. data/spec/integration/sdam_error_handling_spec.rb +69 -5
  577. data/spec/integration/sdam_events_spec.rb +1 -1
  578. data/spec/integration/sdam_prose_spec.rb +3 -3
  579. data/spec/integration/search_indexes_prose_spec.rb +172 -0
  580. data/spec/integration/secondary_reads_spec.rb +1 -0
  581. data/spec/integration/server_description_spec.rb +1 -1
  582. data/spec/integration/server_monitor_spec.rb +3 -2
  583. data/spec/integration/server_selection_spec.rb +1 -1
  584. data/spec/integration/server_selector_spec.rb +5 -3
  585. data/spec/integration/server_spec.rb +26 -28
  586. data/spec/integration/shell_examples_spec.rb +1 -1
  587. data/spec/integration/size_limit_spec.rb +5 -2
  588. data/spec/integration/snappy_compression_spec.rb +1 -1
  589. data/spec/integration/snapshot_query_examples_spec.rb +129 -0
  590. data/spec/integration/srv_monitoring_spec.rb +40 -1
  591. data/spec/integration/srv_spec.rb +4 -3
  592. data/spec/integration/ssl_uri_options_spec.rb +1 -1
  593. data/spec/integration/step_down_spec.rb +25 -7
  594. data/spec/integration/time_zone_querying_spec.rb +1 -1
  595. data/spec/integration/transaction_pinning_spec.rb +20 -6
  596. data/spec/integration/transactions_api_examples_spec.rb +3 -1
  597. data/spec/integration/transactions_examples_spec.rb +1 -1
  598. data/spec/integration/truncated_utf8_spec.rb +1 -1
  599. data/spec/integration/versioned_api_examples_spec.rb +38 -32
  600. data/spec/integration/x509_auth_spec.rb +1 -1
  601. data/spec/integration/zlib_compression_spec.rb +1 -1
  602. data/spec/integration/zstd_compression_spec.rb +1 -1
  603. data/spec/kerberos/kerberos_spec.rb +5 -1
  604. data/spec/lite_spec_helper.rb +63 -26
  605. data/spec/mongo/address/ipv4_spec.rb +1 -1
  606. data/spec/mongo/address/ipv6_spec.rb +8 -1
  607. data/spec/mongo/address/unix_spec.rb +1 -1
  608. data/spec/mongo/address/validator_spec.rb +1 -1
  609. data/spec/mongo/address_spec.rb +15 -2
  610. data/spec/mongo/auth/aws/credential_cache_spec.rb +63 -0
  611. data/spec/mongo/auth/aws/credentials_retriever_spec.rb +90 -0
  612. data/spec/mongo/auth/aws/credentials_spec.rb +46 -0
  613. data/spec/mongo/auth/aws/request_region_spec.rb +1 -1
  614. data/spec/mongo/auth/aws/request_spec.rb +1 -1
  615. data/spec/mongo/auth/cr_spec.rb +2 -22
  616. data/spec/mongo/auth/gssapi/conversation_spec.rb +1 -1
  617. data/spec/mongo/auth/invalid_mechanism_spec.rb +1 -1
  618. data/spec/mongo/auth/ldap/conversation_spec.rb +1 -1
  619. data/spec/mongo/auth/ldap_spec.rb +1 -1
  620. data/spec/mongo/auth/scram/conversation_spec.rb +24 -24
  621. data/spec/mongo/auth/scram256/conversation_spec.rb +21 -21
  622. data/spec/mongo/auth/scram_negotiation_spec.rb +2 -1
  623. data/spec/mongo/auth/scram_spec.rb +1 -1
  624. data/spec/mongo/auth/stringprep/profiles/sasl_spec.rb +1 -1
  625. data/spec/mongo/auth/stringprep_spec.rb +1 -1
  626. data/spec/mongo/auth/user/view_spec.rb +96 -1
  627. data/spec/mongo/auth/user_spec.rb +1 -1
  628. data/spec/mongo/auth/x509/conversation_spec.rb +1 -1
  629. data/spec/mongo/auth/x509_spec.rb +1 -1
  630. data/spec/mongo/auth_spec.rb +1 -1
  631. data/spec/mongo/bson_spec.rb +1 -1
  632. data/spec/mongo/bulk_write/ordered_combiner_spec.rb +1 -1
  633. data/spec/mongo/bulk_write/result_spec.rb +16 -2
  634. data/spec/mongo/bulk_write/unordered_combiner_spec.rb +1 -1
  635. data/spec/mongo/bulk_write_spec.rb +142 -21
  636. data/spec/mongo/caching_cursor_spec.rb +2 -2
  637. data/spec/mongo/client_construction_spec.rb +734 -631
  638. data/spec/mongo/client_encryption_spec.rb +12 -23
  639. data/spec/mongo/client_spec.rb +547 -156
  640. data/spec/mongo/cluster/cursor_reaper_spec.rb +22 -4
  641. data/spec/mongo/cluster/periodic_executor_spec.rb +1 -1
  642. data/spec/mongo/cluster/socket_reaper_spec.rb +1 -1
  643. data/spec/mongo/cluster/topology/replica_set_spec.rb +1 -1
  644. data/spec/mongo/cluster/topology/sharded_spec.rb +1 -1
  645. data/spec/mongo/cluster/topology/single_spec.rb +1 -1
  646. data/spec/mongo/cluster/topology/unknown_spec.rb +1 -1
  647. data/spec/mongo/cluster/topology_spec.rb +1 -1
  648. data/spec/mongo/cluster_spec.rb +193 -199
  649. data/spec/mongo/cluster_time_spec.rb +1 -1
  650. data/spec/mongo/collection/view/aggregation_spec.rb +142 -43
  651. data/spec/mongo/collection/view/builder/find_command_spec.rb +1 -1
  652. data/spec/mongo/collection/view/builder/op_query_spec.rb +1 -1
  653. data/spec/mongo/collection/view/change_stream_resume_spec.rb +1 -1
  654. data/spec/mongo/collection/view/change_stream_spec.rb +6 -6
  655. data/spec/mongo/collection/view/explainable_spec.rb +3 -1
  656. data/spec/mongo/collection/view/immutable_spec.rb +1 -1
  657. data/spec/mongo/collection/view/iterable_spec.rb +1 -1
  658. data/spec/mongo/collection/view/map_reduce_spec.rb +11 -1
  659. data/spec/mongo/collection/view/readable_spec.rb +744 -2
  660. data/spec/mongo/collection/view/writable_spec.rb +145 -33
  661. data/spec/mongo/collection/view_spec.rb +1 -1
  662. data/spec/mongo/collection_crud_spec.rb +122 -15
  663. data/spec/mongo/collection_ddl_spec.rb +116 -66
  664. data/spec/mongo/collection_spec.rb +47 -2
  665. data/spec/mongo/condition_variable_spec.rb +104 -0
  666. data/spec/mongo/config/options_spec.rb +76 -0
  667. data/spec/mongo/config_spec.rb +74 -0
  668. data/spec/mongo/crypt/auto_decryption_context_spec.rb +18 -2
  669. data/spec/mongo/crypt/auto_encrypter_spec.rb +272 -12
  670. data/spec/mongo/crypt/auto_encryption_context_spec.rb +18 -2
  671. data/spec/mongo/crypt/binary_spec.rb +1 -1
  672. data/spec/mongo/crypt/binding/binary_spec.rb +1 -1
  673. data/spec/mongo/crypt/binding/context_spec.rb +68 -18
  674. data/spec/mongo/crypt/binding/helpers_spec.rb +1 -1
  675. data/spec/mongo/crypt/binding/mongocrypt_spec.rb +18 -47
  676. data/spec/mongo/crypt/binding/status_spec.rb +1 -1
  677. data/spec/mongo/crypt/binding/version_spec.rb +48 -1
  678. data/spec/mongo/crypt/binding_unloaded_spec.rb +15 -1
  679. data/spec/mongo/crypt/data_key_context_spec.rb +46 -116
  680. data/spec/mongo/crypt/encryption_io_spec.rb +3 -1
  681. data/spec/mongo/crypt/explicit_decryption_context_spec.rb +33 -2
  682. data/spec/mongo/crypt/explicit_encryption_context_spec.rb +95 -2
  683. data/spec/mongo/crypt/handle_spec.rb +187 -156
  684. data/spec/mongo/crypt/helpers/mongo_crypt_spec_helper.rb +1 -1
  685. data/spec/mongo/crypt/hooks_spec.rb +30 -0
  686. data/spec/mongo/crypt/kms/azure/credentials_retriever_spec.rb +86 -0
  687. data/spec/mongo/crypt/kms/credentials_spec.rb +373 -0
  688. data/spec/mongo/crypt/kms_spec.rb +62 -0
  689. data/spec/mongo/crypt/status_spec.rb +1 -1
  690. data/spec/mongo/crypt_spec.rb +21 -0
  691. data/spec/mongo/cursor/builder/get_more_command_spec.rb +1 -1
  692. data/spec/mongo/cursor/builder/op_get_more_spec.rb +1 -1
  693. data/spec/mongo/cursor_spec.rb +119 -19
  694. data/spec/mongo/database_spec.rb +67 -2
  695. data/spec/mongo/distinguishing_semaphore_spec.rb +7 -7
  696. data/spec/mongo/error/bulk_write_error_spec.rb +1 -1
  697. data/spec/mongo/error/crypt_error_spec.rb +1 -1
  698. data/spec/mongo/error/max_bson_size_spec.rb +1 -1
  699. data/spec/mongo/error/no_server_available_spec.rb +1 -1
  700. data/spec/mongo/error/notable_spec.rb +1 -1
  701. data/spec/mongo/error/operation_failure_heavy_spec.rb +51 -2
  702. data/spec/mongo/error/operation_failure_spec.rb +1 -1
  703. data/spec/mongo/error/parser_spec.rb +1 -1
  704. data/spec/mongo/error/unsupported_option_spec.rb +1 -1
  705. data/spec/mongo/event/publisher_spec.rb +1 -1
  706. data/spec/mongo/event/subscriber_spec.rb +1 -1
  707. data/spec/mongo/grid/file/chunk_spec.rb +1 -1
  708. data/spec/mongo/grid/file/info_spec.rb +1 -1
  709. data/spec/mongo/grid/file_spec.rb +1 -1
  710. data/spec/mongo/grid/fs_bucket_spec.rb +1 -1
  711. data/spec/mongo/grid/stream/read_spec.rb +1 -1
  712. data/spec/mongo/grid/stream/write_spec.rb +1 -1
  713. data/spec/mongo/grid/stream_spec.rb +1 -1
  714. data/spec/mongo/id_spec.rb +2 -2
  715. data/spec/mongo/index/view_spec.rb +126 -1
  716. data/spec/mongo/lint_spec.rb +2 -2
  717. data/spec/mongo/logger_spec.rb +1 -1
  718. data/spec/mongo/monitoring/command_log_subscriber_spec.rb +1 -1
  719. data/spec/mongo/monitoring/event/cmap/connection_check_out_failed_spec.rb +2 -2
  720. data/spec/mongo/monitoring/event/cmap/connection_check_out_started_spec.rb +2 -2
  721. data/spec/mongo/monitoring/event/cmap/connection_checked_in_spec.rb +2 -2
  722. data/spec/mongo/monitoring/event/cmap/connection_checked_out_spec.rb +2 -2
  723. data/spec/mongo/monitoring/event/cmap/connection_closed_spec.rb +2 -2
  724. data/spec/mongo/monitoring/event/cmap/connection_created_spec.rb +2 -2
  725. data/spec/mongo/monitoring/event/cmap/connection_ready_spec.rb +2 -2
  726. data/spec/mongo/monitoring/event/cmap/pool_cleared_spec.rb +2 -2
  727. data/spec/mongo/monitoring/event/cmap/pool_closed_spec.rb +2 -2
  728. data/spec/mongo/monitoring/event/cmap/pool_created_spec.rb +2 -2
  729. data/spec/mongo/monitoring/event/command_failed_spec.rb +1 -1
  730. data/spec/mongo/monitoring/event/command_started_spec.rb +1 -1
  731. data/spec/mongo/monitoring/event/command_succeeded_spec.rb +1 -1
  732. data/spec/mongo/monitoring/event/secure_spec.rb +1 -1
  733. data/spec/mongo/monitoring/event/server_closed_spec.rb +1 -1
  734. data/spec/mongo/monitoring/event/server_description_changed_spec.rb +1 -1
  735. data/spec/mongo/monitoring/event/server_heartbeat_failed_spec.rb +1 -1
  736. data/spec/mongo/monitoring/event/server_heartbeat_started_spec.rb +1 -1
  737. data/spec/mongo/monitoring/event/server_heartbeat_succeeded_spec.rb +1 -1
  738. data/spec/mongo/monitoring/event/server_opening_spec.rb +1 -1
  739. data/spec/mongo/monitoring/event/topology_changed_spec.rb +1 -1
  740. data/spec/mongo/monitoring/event/topology_closed_spec.rb +1 -1
  741. data/spec/mongo/monitoring/event/topology_opening_spec.rb +1 -1
  742. data/spec/mongo/monitoring_spec.rb +1 -1
  743. data/spec/mongo/operation/aggregate/result_spec.rb +1 -1
  744. data/spec/mongo/operation/aggregate_spec.rb +1 -1
  745. data/spec/mongo/operation/collections_info_spec.rb +1 -1
  746. data/spec/mongo/operation/command_spec.rb +1 -1
  747. data/spec/mongo/operation/context_spec.rb +79 -0
  748. data/spec/mongo/operation/create/op_msg_spec.rb +240 -0
  749. data/spec/mongo/operation/create_index_spec.rb +1 -1
  750. data/spec/mongo/operation/create_user_spec.rb +1 -1
  751. data/spec/mongo/operation/delete/bulk_spec.rb +1 -1
  752. data/spec/mongo/operation/delete/op_msg_spec.rb +20 -10
  753. data/spec/mongo/operation/delete_spec.rb +1 -31
  754. data/spec/mongo/operation/drop_index_spec.rb +1 -1
  755. data/spec/mongo/operation/find/builder/flags_spec.rb +1 -1
  756. data/spec/mongo/operation/find/builder/modifiers_spec.rb +1 -1
  757. data/spec/mongo/operation/find/op_msg_spec.rb +66 -0
  758. data/spec/mongo/operation/get_more/op_msg_spec.rb +65 -0
  759. data/spec/mongo/operation/indexes_spec.rb +1 -1
  760. data/spec/mongo/operation/insert/bulk_spec.rb +1 -1
  761. data/spec/mongo/operation/insert/op_msg_spec.rb +131 -126
  762. data/spec/mongo/operation/insert_spec.rb +2 -34
  763. data/spec/mongo/operation/limited_spec.rb +1 -1
  764. data/spec/mongo/operation/map_reduce_spec.rb +1 -1
  765. data/spec/mongo/operation/read_preference_legacy_spec.rb +1 -1
  766. data/spec/mongo/operation/read_preference_op_msg_spec.rb +1 -1
  767. data/spec/mongo/operation/remove_user_spec.rb +1 -1
  768. data/spec/mongo/operation/result_spec.rb +21 -1
  769. data/spec/mongo/operation/shared/csot/examples.rb +113 -0
  770. data/spec/mongo/operation/specifiable_spec.rb +1 -1
  771. data/spec/mongo/operation/update/bulk_spec.rb +1 -1
  772. data/spec/mongo/operation/update/op_msg_spec.rb +14 -5
  773. data/spec/mongo/operation/update_spec.rb +1 -30
  774. data/spec/mongo/operation/update_user_spec.rb +1 -1
  775. data/spec/mongo/options/redacted_spec.rb +2 -2
  776. data/spec/mongo/protocol/caching_hash_spec.rb +37 -0
  777. data/spec/mongo/protocol/compressed_spec.rb +1 -1
  778. data/spec/mongo/protocol/get_more_spec.rb +1 -1
  779. data/spec/mongo/protocol/kill_cursors_spec.rb +1 -1
  780. data/spec/mongo/protocol/msg_spec.rb +45 -66
  781. data/spec/mongo/protocol/query_spec.rb +1 -1
  782. data/spec/mongo/protocol/registry_spec.rb +1 -1
  783. data/spec/mongo/protocol/reply_spec.rb +1 -1
  784. data/spec/mongo/query_cache_middleware_spec.rb +1 -1
  785. data/spec/mongo/query_cache_spec.rb +245 -226
  786. data/spec/mongo/retryable/write_worker_spec.rb +39 -0
  787. data/spec/mongo/retryable_spec.rb +38 -6
  788. data/spec/mongo/semaphore_spec.rb +7 -7
  789. data/spec/mongo/server/app_metadata/environment_spec.rb +344 -0
  790. data/spec/mongo/server/app_metadata/truncator_spec.rb +158 -0
  791. data/spec/mongo/server/app_metadata_spec.rb +53 -65
  792. data/spec/mongo/server/connection_auth_spec.rb +4 -2
  793. data/spec/mongo/server/connection_common_spec.rb +14 -2
  794. data/spec/mongo/server/connection_pool/populator_spec.rb +17 -3
  795. data/spec/mongo/server/connection_pool_spec.rb +567 -63
  796. data/spec/mongo/server/connection_spec.rb +93 -163
  797. data/spec/mongo/server/description/features_spec.rb +25 -1
  798. data/spec/mongo/server/description_query_methods_spec.rb +1 -1
  799. data/spec/mongo/server/description_spec.rb +1 -1
  800. data/spec/mongo/server/monitor/app_metadata_spec.rb +1 -1
  801. data/spec/mongo/server/monitor/connection_spec.rb +3 -3
  802. data/spec/mongo/server/monitor_spec.rb +6 -5
  803. data/spec/mongo/server/push_monitor_spec.rb +3 -9
  804. data/spec/mongo/server/round_trip_time_calculator_spec.rb +120 -0
  805. data/spec/mongo/server_selector/nearest_spec.rb +1 -1
  806. data/spec/mongo/server_selector/primary_preferred_spec.rb +1 -1
  807. data/spec/mongo/server_selector/primary_spec.rb +1 -1
  808. data/spec/mongo/server_selector/secondary_preferred_spec.rb +1 -1
  809. data/spec/mongo/server_selector/secondary_spec.rb +1 -1
  810. data/spec/mongo/server_selector_spec.rb +1 -1
  811. data/spec/mongo/server_spec.rb +32 -5
  812. data/spec/mongo/session/server_session_spec.rb +1 -1
  813. data/spec/mongo/session/session_pool_spec.rb +2 -17
  814. data/spec/mongo/session_spec.rb +27 -7
  815. data/spec/mongo/session_transaction_spec.rb +19 -3
  816. data/spec/mongo/socket/ssl_spec.rb +21 -26
  817. data/spec/mongo/socket/tcp_spec.rb +1 -1
  818. data/spec/mongo/socket/unix_spec.rb +1 -1
  819. data/spec/mongo/socket_spec.rb +1 -1
  820. data/spec/mongo/srv/monitor_spec.rb +1 -1
  821. data/spec/mongo/srv/result_spec.rb +1 -1
  822. data/spec/mongo/timeout_spec.rb +1 -1
  823. data/spec/mongo/tls_context_hooks_spec.rb +1 -1
  824. data/spec/mongo/uri/options_mapper_spec.rb +1605 -0
  825. data/spec/mongo/uri/srv_protocol_spec.rb +263 -4
  826. data/spec/mongo/uri_option_parsing_spec.rb +1 -1
  827. data/spec/mongo/uri_spec.rb +168 -11
  828. data/spec/mongo/utils_spec.rb +1 -1
  829. data/spec/mongo/write_concern/acknowledged_spec.rb +1 -1
  830. data/spec/mongo/write_concern/unacknowledged_spec.rb +1 -1
  831. data/spec/mongo/write_concern_spec.rb +1 -1
  832. data/spec/runners/auth.rb +1 -1
  833. data/spec/runners/change_streams/outcome.rb +1 -1
  834. data/spec/runners/change_streams/spec.rb +1 -1
  835. data/spec/runners/change_streams/test.rb +3 -3
  836. data/spec/runners/cmap/verifier.rb +2 -2
  837. data/spec/runners/cmap.rb +188 -45
  838. data/spec/runners/command_monitoring.rb +1 -1
  839. data/spec/runners/connection_string.rb +9 -1
  840. data/spec/runners/crud/context.rb +1 -1
  841. data/spec/runners/crud/operation.rb +15 -6
  842. data/spec/runners/crud/outcome.rb +1 -1
  843. data/spec/runners/crud/requirement.rb +12 -7
  844. data/spec/runners/crud/spec.rb +6 -1
  845. data/spec/runners/crud/test.rb +2 -10
  846. data/spec/runners/crud/test_base.rb +2 -2
  847. data/spec/runners/crud/verifier.rb +12 -4
  848. data/spec/runners/crud.rb +2 -2
  849. data/spec/runners/gridfs.rb +1 -1
  850. data/spec/runners/read_write_concern_document.rb +1 -1
  851. data/spec/runners/sdam/verifier.rb +1 -1
  852. data/spec/runners/sdam.rb +1 -1
  853. data/spec/runners/server_selection.rb +1 -1
  854. data/spec/runners/server_selection_rtt.rb +1 -1
  855. data/spec/runners/transactions/operation.rb +19 -15
  856. data/spec/runners/transactions/spec.rb +3 -3
  857. data/spec/runners/transactions/test.rb +75 -22
  858. data/spec/runners/transactions.rb +12 -9
  859. data/spec/runners/unified/ambiguous_operations.rb +13 -0
  860. data/spec/runners/unified/assertions.rb +163 -50
  861. data/spec/runners/unified/change_stream_operations.rb +22 -9
  862. data/spec/runners/unified/client_side_encryption_operations.rb +83 -0
  863. data/spec/runners/unified/crud_operations.rb +129 -22
  864. data/spec/runners/unified/ddl_operations.rb +160 -8
  865. data/spec/runners/unified/entity_map.rb +1 -1
  866. data/spec/runners/unified/error.rb +3 -2
  867. data/spec/runners/unified/event_subscriber.rb +9 -3
  868. data/spec/runners/unified/exceptions.rb +1 -1
  869. data/spec/runners/unified/grid_fs_operations.rb +59 -3
  870. data/spec/runners/unified/search_index_operations.rb +63 -0
  871. data/spec/runners/unified/support_operations.rb +115 -11
  872. data/spec/runners/unified/test.rb +204 -36
  873. data/spec/runners/unified/test_group.rb +1 -1
  874. data/spec/runners/unified/thread_operations.rb +73 -0
  875. data/spec/runners/unified.rb +15 -5
  876. data/spec/solo/clean_exit_spec.rb +7 -7
  877. data/spec/spec_helper.rb +2 -3
  878. data/spec/spec_tests/auth_spec.rb +1 -1
  879. data/spec/spec_tests/change_streams_unified_spec.rb +2 -1
  880. data/spec/spec_tests/client_side_encryption_spec.rb +25 -2
  881. data/spec/spec_tests/client_side_encryption_unified_spec.rb +26 -0
  882. data/spec/spec_tests/client_side_operations_timeout_spec.rb +15 -0
  883. data/spec/spec_tests/cmap_spec.rb +29 -15
  884. data/spec/spec_tests/collection_management_spec.rb +1 -1
  885. data/spec/spec_tests/command_monitoring_unified_spec.rb +1 -1
  886. data/spec/spec_tests/connection_string_spec.rb +1 -1
  887. data/spec/spec_tests/crud_spec.rb +1 -11
  888. data/spec/spec_tests/crud_unified_spec.rb +1 -1
  889. data/spec/spec_tests/data/change_streams_unified/change-streams-clusterTime.yml +43 -0
  890. data/spec/spec_tests/data/change_streams_unified/change-streams-disambiguatedPaths.yml +105 -0
  891. data/spec/spec_tests/data/change_streams_unified/change-streams-errors.yml +122 -0
  892. data/spec/spec_tests/data/change_streams_unified/change-streams-pre_and_post_images.yml +351 -0
  893. data/spec/spec_tests/data/change_streams_unified/change-streams-resume-allowlist.yml +1169 -0
  894. data/spec/spec_tests/data/change_streams_unified/change-streams-resume-errorLabels.yml +1069 -0
  895. data/spec/spec_tests/data/change_streams_unified/change-streams-showExpandedEvents.yml +307 -0
  896. data/spec/spec_tests/data/change_streams_unified/change-streams.yml +859 -4
  897. data/spec/spec_tests/data/client_side_encryption/aggregate.yml +3 -17
  898. data/spec/spec_tests/data/client_side_encryption/awsTemporary.yml +57 -0
  899. data/spec/spec_tests/data/client_side_encryption/azureKMS.yml +46 -0
  900. data/spec/spec_tests/data/client_side_encryption/badQueries.yml +14 -3
  901. data/spec/spec_tests/data/client_side_encryption/basic.yml +3 -17
  902. data/spec/spec_tests/data/client_side_encryption/bulk.yml +1 -8
  903. data/spec/spec_tests/data/client_side_encryption/bypassAutoEncryption.yml +2 -2
  904. data/spec/spec_tests/data/client_side_encryption/bypassedCommand.yml +5 -4
  905. data/spec/spec_tests/data/client_side_encryption/count.yml +1 -8
  906. data/spec/spec_tests/data/client_side_encryption/countDocuments.yml +1 -8
  907. data/spec/spec_tests/data/client_side_encryption/create-and-createIndexes.yml +58 -0
  908. data/spec/spec_tests/data/client_side_encryption/delete.yml +2 -16
  909. data/spec/spec_tests/data/client_side_encryption/distinct.yml +1 -8
  910. data/spec/spec_tests/data/client_side_encryption/explain.yml +3 -10
  911. data/spec/spec_tests/data/client_side_encryption/find.yml +2 -16
  912. data/spec/spec_tests/data/client_side_encryption/findOneAndDelete.yml +1 -8
  913. data/spec/spec_tests/data/client_side_encryption/findOneAndReplace.yml +1 -8
  914. data/spec/spec_tests/data/client_side_encryption/findOneAndUpdate.yml +1 -8
  915. data/spec/spec_tests/data/client_side_encryption/fle2v2-BypassQueryAnalysis.yml +90 -0
  916. data/spec/spec_tests/data/client_side_encryption/fle2v2-Compact.yml +83 -0
  917. data/spec/spec_tests/data/client_side_encryption/fle2v2-CreateCollection-OldServer.yml +61 -0
  918. data/spec/spec_tests/data/client_side_encryption/fle2v2-CreateCollection.yml +938 -0
  919. data/spec/spec_tests/data/client_side_encryption/fle2v2-DecryptExistingData.yml +67 -0
  920. data/spec/spec_tests/data/client_side_encryption/fle2v2-Delete.yml +101 -0
  921. data/spec/spec_tests/data/client_side_encryption/fle2v2-EncryptedFields-vs-EncryptedFieldsMap.yml +80 -0
  922. data/spec/spec_tests/data/client_side_encryption/fle2v2-EncryptedFields-vs-jsonSchema.yml +103 -0
  923. data/spec/spec_tests/data/client_side_encryption/fle2v2-EncryptedFieldsMap-defaults.yml +59 -0
  924. data/spec/spec_tests/data/client_side_encryption/fle2v2-FindOneAndUpdate.yml +201 -0
  925. data/spec/spec_tests/data/client_side_encryption/fle2v2-InsertFind-Indexed.yml +97 -0
  926. data/spec/spec_tests/data/client_side_encryption/fle2v2-InsertFind-Unindexed.yml +90 -0
  927. data/spec/spec_tests/data/client_side_encryption/fle2v2-MissingKey.yml +44 -0
  928. data/spec/spec_tests/data/client_side_encryption/fle2v2-NoEncryption.yml +45 -0
  929. data/spec/spec_tests/data/client_side_encryption/fle2v2-Update.yml +211 -0
  930. data/spec/spec_tests/data/client_side_encryption/fle2v2-validatorAndPartialFieldExpression.yml +170 -0
  931. data/spec/spec_tests/data/client_side_encryption/gcpKMS.yml +46 -0
  932. data/spec/spec_tests/data/client_side_encryption/getMore.yml +1 -8
  933. data/spec/spec_tests/data/client_side_encryption/insert.yml +2 -16
  934. data/spec/spec_tests/data/client_side_encryption/keyAltName.yml +1 -8
  935. data/spec/spec_tests/data/client_side_encryption/localKMS.yml +1 -8
  936. data/spec/spec_tests/data/client_side_encryption/localSchema.yml +1 -8
  937. data/spec/spec_tests/data/client_side_encryption/maxWireVersion.yml +3 -1
  938. data/spec/spec_tests/data/client_side_encryption/missingKey.yml +2 -9
  939. data/spec/spec_tests/data/client_side_encryption/noSchema.yml +39 -0
  940. data/spec/spec_tests/data/client_side_encryption/replaceOne.yml +1 -8
  941. data/spec/spec_tests/data/client_side_encryption/timeoutMS.yml +67 -0
  942. data/spec/spec_tests/data/client_side_encryption/types.yml +44 -70
  943. data/spec/spec_tests/data/client_side_encryption/unified/addKeyAltName.yml +194 -0
  944. data/spec/spec_tests/data/client_side_encryption/unified/createDataKey-kms_providers-invalid.yml +67 -0
  945. data/spec/spec_tests/data/client_side_encryption/unified/createDataKey.yml +309 -0
  946. data/spec/spec_tests/data/client_side_encryption/unified/deleteKey.yml +159 -0
  947. data/spec/spec_tests/data/client_side_encryption/unified/getKey.yml +105 -0
  948. data/spec/spec_tests/data/client_side_encryption/unified/getKeyByAltName.yml +104 -0
  949. data/spec/spec_tests/data/client_side_encryption/unified/getKeys.yml +122 -0
  950. data/spec/spec_tests/data/client_side_encryption/unified/removeKeyAltName.yml +157 -0
  951. data/spec/spec_tests/data/client_side_encryption/unified/rewrapManyDataKey-decrypt_failure.yml +69 -0
  952. data/spec/spec_tests/data/client_side_encryption/unified/rewrapManyDataKey-encrypt_failure.yml +122 -0
  953. data/spec/spec_tests/data/client_side_encryption/unified/rewrapManyDataKey.yml +432 -0
  954. data/spec/spec_tests/data/client_side_encryption/updateMany.yml +1 -8
  955. data/spec/spec_tests/data/client_side_encryption/updateOne.yml +1 -8
  956. data/spec/spec_tests/data/client_side_encryption/validatorAndPartialFieldExpression.yml +166 -0
  957. data/spec/spec_tests/data/client_side_operations_timeout/bulkWrite.yml +87 -0
  958. data/spec/spec_tests/data/client_side_operations_timeout/change-streams.yml +358 -0
  959. data/spec/spec_tests/data/client_side_operations_timeout/close-cursors.yml +129 -0
  960. data/spec/spec_tests/data/client_side_operations_timeout/command-execution.yml +250 -0
  961. data/spec/spec_tests/data/client_side_operations_timeout/convenient-transactions.yml +113 -0
  962. data/spec/spec_tests/data/client_side_operations_timeout/cursors.yml +70 -0
  963. data/spec/spec_tests/data/client_side_operations_timeout/deprecated-options.yml +3982 -0
  964. data/spec/spec_tests/data/client_side_operations_timeout/error-transformations.yml +96 -0
  965. data/spec/spec_tests/data/client_side_operations_timeout/global-timeoutMS.yml +3236 -0
  966. data/spec/spec_tests/data/client_side_operations_timeout/gridfs-advanced.yml +207 -0
  967. data/spec/spec_tests/data/client_side_operations_timeout/gridfs-delete.yml +152 -0
  968. data/spec/spec_tests/data/client_side_operations_timeout/gridfs-download.yml +182 -0
  969. data/spec/spec_tests/data/client_side_operations_timeout/gridfs-find.yml +100 -0
  970. data/spec/spec_tests/data/client_side_operations_timeout/gridfs-upload.yml +249 -0
  971. data/spec/spec_tests/data/client_side_operations_timeout/legacy-timeouts.yml +204 -0
  972. data/spec/spec_tests/data/client_side_operations_timeout/non-tailable-cursors.yml +307 -0
  973. data/spec/spec_tests/data/client_side_operations_timeout/override-collection-timeoutMS.yml +1877 -0
  974. data/spec/spec_tests/data/client_side_operations_timeout/override-operation-timeoutMS.yml +1918 -0
  975. data/spec/spec_tests/data/client_side_operations_timeout/retryability-legacy-timeouts.yml +1676 -0
  976. data/spec/spec_tests/data/client_side_operations_timeout/retryability-timeoutMS.yml +2824 -0
  977. data/spec/spec_tests/data/client_side_operations_timeout/sessions-inherit-timeoutMS.yml +168 -0
  978. data/spec/spec_tests/data/client_side_operations_timeout/sessions-override-operation-timeoutMS.yml +171 -0
  979. data/spec/spec_tests/data/client_side_operations_timeout/sessions-override-timeoutMS.yml +168 -0
  980. data/spec/spec_tests/data/client_side_operations_timeout/tailable-awaitData.yml +247 -0
  981. data/spec/spec_tests/data/client_side_operations_timeout/tailable-non-awaitData.yml +181 -0
  982. data/spec/spec_tests/data/cmap/connection-must-have-id.yml +2 -0
  983. data/spec/spec_tests/data/cmap/connection-must-order-ids.yml +2 -0
  984. data/spec/spec_tests/data/cmap/pool-checkin-destroy-closed.yml +2 -0
  985. data/spec/spec_tests/data/cmap/pool-checkin-destroy-stale.yml +2 -0
  986. data/spec/spec_tests/data/cmap/pool-checkin-make-available.yml +3 -1
  987. data/spec/spec_tests/data/cmap/pool-checkin.yml +5 -0
  988. data/spec/spec_tests/data/cmap/pool-checkout-connection.yml +2 -0
  989. data/spec/spec_tests/data/cmap/pool-checkout-custom-maxConnecting-is-enforced.yml +50 -0
  990. data/spec/spec_tests/data/cmap/pool-checkout-error-closed.yml +2 -0
  991. data/spec/spec_tests/data/cmap/pool-checkout-maxConnecting-is-enforced.yml +81 -0
  992. data/spec/spec_tests/data/cmap/pool-checkout-maxConnecting-timeout.yml +71 -0
  993. data/spec/spec_tests/data/cmap/pool-checkout-minPoolSize-connection-maxConnecting.yml +64 -0
  994. data/spec/spec_tests/data/cmap/pool-checkout-multiple.yml +2 -0
  995. data/spec/spec_tests/data/cmap/pool-checkout-no-idle.yml +6 -0
  996. data/spec/spec_tests/data/cmap/pool-checkout-no-stale.yml +8 -0
  997. data/spec/spec_tests/data/cmap/pool-checkout-returned-connection-maxConnecting.yml +88 -0
  998. data/spec/spec_tests/data/cmap/pool-clear-interrupting-pending-connections.yml +43 -0
  999. data/spec/spec_tests/data/cmap/pool-clear-min-size.yml +41 -0
  1000. data/spec/spec_tests/data/cmap/pool-clear-paused.yml +18 -0
  1001. data/spec/spec_tests/data/cmap/pool-clear-ready.yml +39 -0
  1002. data/spec/spec_tests/data/cmap/pool-clear-schedule-run-interruptInUseConnections-false.yml +48 -0
  1003. data/spec/spec_tests/data/cmap/pool-close-destroy-conns.yml +2 -0
  1004. data/spec/spec_tests/data/cmap/pool-create-max-size.yml +2 -0
  1005. data/spec/spec_tests/data/cmap/pool-create-min-size-error.yml +43 -0
  1006. data/spec/spec_tests/data/cmap/pool-create-min-size.yml +9 -0
  1007. data/spec/spec_tests/data/cmap/pool-ready-ready.yml +22 -0
  1008. data/spec/spec_tests/data/cmap/pool-ready.yml +30 -0
  1009. data/spec/spec_tests/data/cmap/wait-queue-fairness.yml +2 -0
  1010. data/spec/spec_tests/data/cmap/wait-queue-timeout.yml +6 -1
  1011. data/spec/spec_tests/data/collection_management/clustered-indexes.yml +135 -0
  1012. data/spec/spec_tests/data/collection_management/createCollection-pre_and_post_images.yml +50 -0
  1013. data/spec/spec_tests/data/collection_management/modifyCollection-errorResponse.yml +59 -0
  1014. data/spec/spec_tests/data/collection_management/modifyCollection-pre_and_post_images.yml +58 -0
  1015. data/spec/spec_tests/data/collection_management/timeseries-collection.yml +35 -0
  1016. data/spec/spec_tests/data/command_monitoring_unified/bulkWrite.yml +68 -0
  1017. data/spec/spec_tests/data/command_monitoring_unified/command.yml +50 -0
  1018. data/spec/spec_tests/data/command_monitoring_unified/deleteMany.yml +79 -0
  1019. data/spec/spec_tests/data/command_monitoring_unified/deleteOne.yml +79 -0
  1020. data/spec/spec_tests/data/command_monitoring_unified/find.yml +254 -0
  1021. data/spec/spec_tests/data/command_monitoring_unified/insertMany.yml +79 -0
  1022. data/spec/spec_tests/data/command_monitoring_unified/insertOne.yml +77 -0
  1023. data/spec/spec_tests/data/command_monitoring_unified/pre-42-server-connection-id.yml +56 -0
  1024. data/spec/spec_tests/data/command_monitoring_unified/redacted-commands.yml +8 -0
  1025. data/spec/spec_tests/data/command_monitoring_unified/server-connection-id.yml +56 -0
  1026. data/spec/spec_tests/data/command_monitoring_unified/unacknowledgedBulkWrite.yml +55 -0
  1027. data/spec/spec_tests/data/command_monitoring_unified/updateMany.yml +87 -0
  1028. data/spec/spec_tests/data/command_monitoring_unified/updateOne.yml +118 -0
  1029. data/spec/spec_tests/data/command_monitoring_unified/writeConcernError.yml +80 -0
  1030. data/spec/spec_tests/data/connection_string/invalid-uris.yml +0 -10
  1031. data/spec/spec_tests/data/connection_string/valid-options.yml +13 -0
  1032. data/spec/spec_tests/data/crud/read/aggregate-collation.yml +1 -1
  1033. data/spec/spec_tests/data/crud/read/count-collation.yml +1 -1
  1034. data/spec/spec_tests/data/crud/read/distinct-collation.yml +1 -1
  1035. data/spec/spec_tests/data/crud/read/find-collation.yml +1 -1
  1036. data/spec/spec_tests/data/crud/write/bulkWrite-collation.yml +1 -1
  1037. data/spec/spec_tests/data/crud/write/deleteMany-collation.yml +1 -1
  1038. data/spec/spec_tests/data/crud/write/deleteOne-collation.yml +1 -1
  1039. data/spec/spec_tests/data/crud/write/findOneAndDelete-collation.yml +1 -1
  1040. data/spec/spec_tests/data/crud/write/findOneAndReplace-collation.yml +1 -1
  1041. data/spec/spec_tests/data/crud/write/findOneAndUpdate-collation.yml +1 -1
  1042. data/spec/spec_tests/data/crud/write/replaceOne-collation.yml +1 -1
  1043. data/spec/spec_tests/data/crud/write/updateMany-collation.yml +1 -1
  1044. data/spec/spec_tests/data/crud/write/updateOne-collation.yml +1 -1
  1045. data/spec/spec_tests/data/crud_unified/aggregate-allowdiskuse.yml +75 -0
  1046. data/spec/spec_tests/data/crud_unified/aggregate-merge-errorResponse.yml +42 -0
  1047. data/spec/spec_tests/data/crud_unified/aggregate-merge.yml +185 -0
  1048. data/spec/spec_tests/data/crud_unified/aggregate-out-readConcern.yml +171 -0
  1049. data/spec/spec_tests/data/crud_unified/aggregate-write-readPreference.yml +6 -0
  1050. data/spec/spec_tests/data/crud_unified/aggregate.yml +215 -0
  1051. data/spec/spec_tests/data/crud_unified/bulkWrite-arrayFilters-clientError.yml +98 -0
  1052. data/spec/spec_tests/data/crud_unified/bulkWrite-arrayFilters.yml +174 -0
  1053. data/spec/spec_tests/data/crud_unified/bulkWrite-comment.yml +189 -0
  1054. data/spec/spec_tests/data/crud_unified/bulkWrite-delete-hint-clientError.yml +113 -0
  1055. data/spec/spec_tests/data/crud_unified/bulkWrite-delete-hint-serverError.yml +142 -0
  1056. data/spec/spec_tests/data/crud_unified/bulkWrite-delete-hint.yml +154 -0
  1057. data/spec/spec_tests/data/crud_unified/bulkWrite-deleteMany-hint-unacknowledged.yml +98 -0
  1058. data/spec/spec_tests/data/crud_unified/bulkWrite-deleteMany-let.yml +86 -0
  1059. data/spec/spec_tests/data/crud_unified/bulkWrite-deleteOne-hint-unacknowledged.yml +97 -0
  1060. data/spec/spec_tests/data/crud_unified/bulkWrite-deleteOne-let.yml +86 -0
  1061. data/spec/spec_tests/data/crud_unified/bulkWrite-errorResponse.yml +50 -0
  1062. data/spec/spec_tests/data/crud_unified/bulkWrite-insertOne-dots_and_dollars.yml +138 -0
  1063. data/spec/spec_tests/data/crud_unified/bulkWrite-replaceOne-dots_and_dollars.yml +165 -0
  1064. data/spec/spec_tests/data/crud_unified/bulkWrite-replaceOne-hint-unacknowledged.yml +103 -0
  1065. data/spec/spec_tests/data/crud_unified/bulkWrite-replaceOne-let.yml +93 -0
  1066. data/spec/spec_tests/data/crud_unified/bulkWrite-update-hint-clientError.yml +148 -0
  1067. data/spec/spec_tests/data/crud_unified/bulkWrite-update-hint-serverError.yml +239 -0
  1068. data/spec/spec_tests/data/crud_unified/bulkWrite-update-hint.yml +256 -0
  1069. data/spec/spec_tests/data/crud_unified/bulkWrite-update-validation.yml +73 -0
  1070. data/spec/spec_tests/data/crud_unified/bulkWrite-updateMany-dots_and_dollars.yml +150 -0
  1071. data/spec/spec_tests/data/crud_unified/bulkWrite-updateMany-hint-unacknowledged.yml +104 -0
  1072. data/spec/spec_tests/data/crud_unified/bulkWrite-updateMany-let.yml +96 -0
  1073. data/spec/spec_tests/data/crud_unified/bulkWrite-updateOne-dots_and_dollars.yml +150 -0
  1074. data/spec/spec_tests/data/crud_unified/bulkWrite-updateOne-hint-unacknowledged.yml +103 -0
  1075. data/spec/spec_tests/data/crud_unified/bulkWrite-updateOne-let.yml +95 -0
  1076. data/spec/spec_tests/data/crud_unified/countDocuments-comment.yml +92 -0
  1077. data/spec/spec_tests/data/crud_unified/db-aggregate-write-readPreference.yml +6 -0
  1078. data/spec/spec_tests/data/crud_unified/db-aggregate.yml +73 -0
  1079. data/spec/spec_tests/data/crud_unified/deleteMany-comment.yml +97 -0
  1080. data/spec/spec_tests/data/crud_unified/deleteMany-hint-clientError.yml +87 -0
  1081. data/spec/spec_tests/data/crud_unified/deleteMany-hint-serverError.yml +107 -0
  1082. data/spec/spec_tests/data/crud_unified/deleteMany-hint-unacknowledged.yml +90 -0
  1083. data/spec/spec_tests/data/crud_unified/deleteMany-hint.yml +99 -0
  1084. data/spec/spec_tests/data/crud_unified/deleteMany-let.yml +2 -0
  1085. data/spec/spec_tests/data/crud_unified/deleteOne-comment.yml +98 -0
  1086. data/spec/spec_tests/data/crud_unified/deleteOne-errorResponse.yml +46 -0
  1087. data/spec/spec_tests/data/crud_unified/deleteOne-hint-clientError.yml +80 -0
  1088. data/spec/spec_tests/data/crud_unified/deleteOne-hint-serverError.yml +100 -0
  1089. data/spec/spec_tests/data/crud_unified/deleteOne-hint-unacknowledged.yml +89 -0
  1090. data/spec/spec_tests/data/crud_unified/deleteOne-hint.yml +95 -0
  1091. data/spec/spec_tests/data/crud_unified/deleteOne-let.yml +2 -0
  1092. data/spec/spec_tests/data/crud_unified/distinct-comment.yml +98 -0
  1093. data/spec/spec_tests/data/crud_unified/estimatedDocumentCount-comment.yml +95 -0
  1094. data/spec/spec_tests/data/crud_unified/estimatedDocumentCount.yml +49 -135
  1095. data/spec/spec_tests/data/crud_unified/find-allowdiskuse-clientError.yml +55 -0
  1096. data/spec/spec_tests/data/crud_unified/find-allowdiskuse-serverError.yml +68 -0
  1097. data/spec/spec_tests/data/crud_unified/find-allowdiskuse.yml +79 -0
  1098. data/spec/spec_tests/data/crud_unified/find-comment.yml +166 -0
  1099. data/spec/spec_tests/data/crud_unified/find-test-all-options.yml +377 -0
  1100. data/spec/spec_tests/data/crud_unified/find.yml +68 -0
  1101. data/spec/spec_tests/data/crud_unified/findOneAndDelete-comment.yml +96 -0
  1102. data/spec/spec_tests/data/crud_unified/findOneAndDelete-hint-clientError.yml +91 -0
  1103. data/spec/spec_tests/data/crud_unified/findOneAndDelete-hint-serverError.yml +107 -0
  1104. data/spec/spec_tests/data/crud_unified/findOneAndDelete-hint-unacknowledged.yml +88 -0
  1105. data/spec/spec_tests/data/crud_unified/findOneAndDelete-hint.yml +102 -0
  1106. data/spec/spec_tests/data/crud_unified/findOneAndDelete-let.yml +2 -4
  1107. data/spec/spec_tests/data/crud_unified/findOneAndReplace-comment.yml +101 -0
  1108. data/spec/spec_tests/data/crud_unified/findOneAndReplace-dots_and_dollars.yml +140 -0
  1109. data/spec/spec_tests/data/crud_unified/findOneAndReplace-hint-clientError.yml +83 -0
  1110. data/spec/spec_tests/data/crud_unified/findOneAndReplace-hint-serverError.yml +99 -0
  1111. data/spec/spec_tests/data/crud_unified/findOneAndReplace-hint-unacknowledged.yml +96 -0
  1112. data/spec/spec_tests/data/crud_unified/findOneAndReplace-hint.yml +98 -0
  1113. data/spec/spec_tests/data/crud_unified/findOneAndUpdate-comment.yml +95 -0
  1114. data/spec/spec_tests/data/crud_unified/findOneAndUpdate-dots_and_dollars.yml +127 -0
  1115. data/spec/spec_tests/data/crud_unified/findOneAndUpdate-errorResponse.yml +69 -0
  1116. data/spec/spec_tests/data/crud_unified/findOneAndUpdate-hint-clientError.yml +84 -0
  1117. data/spec/spec_tests/data/crud_unified/findOneAndUpdate-hint-serverError.yml +100 -0
  1118. data/spec/spec_tests/data/crud_unified/findOneAndUpdate-hint-unacknowledged.yml +92 -0
  1119. data/spec/spec_tests/data/crud_unified/findOneAndUpdate-hint.yml +99 -0
  1120. data/spec/spec_tests/data/crud_unified/insertMany-comment.yml +93 -0
  1121. data/spec/spec_tests/data/crud_unified/insertMany-dots_and_dollars.yml +128 -0
  1122. data/spec/spec_tests/data/crud_unified/insertOne-comment.yml +91 -0
  1123. data/spec/spec_tests/data/crud_unified/insertOne-dots_and_dollars.yml +238 -0
  1124. data/spec/spec_tests/data/crud_unified/insertOne-errorResponse.yml +46 -0
  1125. data/spec/spec_tests/data/crud_unified/replaceOne-comment.yml +105 -0
  1126. data/spec/spec_tests/data/crud_unified/replaceOne-dots_and_dollars.yml +180 -0
  1127. data/spec/spec_tests/data/crud_unified/replaceOne-hint-unacknowledged.yml +95 -0
  1128. data/spec/spec_tests/data/crud_unified/replaceOne-hint.yml +108 -0
  1129. data/spec/spec_tests/data/crud_unified/replaceOne-let.yml +98 -0
  1130. data/spec/spec_tests/data/crud_unified/replaceOne-validation.yml +37 -0
  1131. data/spec/spec_tests/data/crud_unified/updateMany-comment.yml +104 -0
  1132. data/spec/spec_tests/data/crud_unified/updateMany-dots_and_dollars.yml +138 -0
  1133. data/spec/spec_tests/data/crud_unified/updateMany-hint-clientError.yml +91 -0
  1134. data/spec/spec_tests/data/crud_unified/updateMany-hint-serverError.yml +115 -0
  1135. data/spec/spec_tests/data/crud_unified/updateMany-hint-unacknowledged.yml +96 -0
  1136. data/spec/spec_tests/data/crud_unified/updateMany-hint.yml +115 -0
  1137. data/spec/spec_tests/data/crud_unified/updateMany-let.yml +5 -1
  1138. data/spec/spec_tests/data/crud_unified/updateMany-validation.yml +39 -0
  1139. data/spec/spec_tests/data/crud_unified/updateOne-comment.yml +104 -0
  1140. data/spec/spec_tests/data/crud_unified/updateOne-dots_and_dollars.yml +138 -0
  1141. data/spec/spec_tests/data/crud_unified/updateOne-errorResponse.yml +47 -0
  1142. data/spec/spec_tests/data/crud_unified/updateOne-hint-clientError.yml +85 -0
  1143. data/spec/spec_tests/data/crud_unified/updateOne-hint-serverError.yml +109 -0
  1144. data/spec/spec_tests/data/crud_unified/updateOne-hint-unacknowledged.yml +95 -0
  1145. data/spec/spec_tests/data/crud_unified/updateOne-hint.yml +109 -0
  1146. data/spec/spec_tests/data/crud_unified/updateOne-let.yml +5 -1
  1147. data/spec/spec_tests/data/crud_unified/updateOne-validation.yml +37 -0
  1148. data/spec/spec_tests/data/crud_unified/updateWithPipelines.yml +8 -14
  1149. data/spec/spec_tests/data/gridfs_unified/delete.yml +198 -0
  1150. data/spec/spec_tests/data/gridfs_unified/download.yml +241 -0
  1151. data/spec/spec_tests/data/gridfs_unified/downloadByName.yml +159 -0
  1152. data/spec/spec_tests/data/gridfs_unified/upload-disableMD5.yml +92 -0
  1153. data/spec/spec_tests/data/gridfs_unified/upload.yml +288 -0
  1154. data/spec/spec_tests/data/index_management/createSearchIndex.yml +64 -0
  1155. data/spec/spec_tests/data/index_management/createSearchIndexes.yml +86 -0
  1156. data/spec/spec_tests/data/index_management/dropSearchIndex.yml +43 -0
  1157. data/spec/spec_tests/data/index_management/listSearchIndexes.yml +91 -0
  1158. data/spec/spec_tests/data/index_management/updateSearchIndex.yml +46 -0
  1159. data/spec/spec_tests/data/retryable_reads/{estimatedDocumentCount-serverErrors-pre4.9.yml → legacy/estimatedDocumentCount-serverErrors.yml} +0 -2
  1160. data/spec/spec_tests/data/retryable_reads/{estimatedDocumentCount-pre4.9.yml → legacy/estimatedDocumentCount.yml} +0 -2
  1161. data/spec/spec_tests/data/retryable_reads/unified/handshakeError.yml +1342 -0
  1162. data/spec/spec_tests/data/retryable_writes/{bulkWrite-serverErrors.yml → legacy/bulkWrite-serverErrors.yml} +1 -1
  1163. data/spec/spec_tests/data/retryable_writes/{deleteOne-serverErrors.yml → legacy/deleteOne-serverErrors.yml} +1 -1
  1164. data/spec/spec_tests/data/retryable_writes/{findOneAndDelete-serverErrors.yml → legacy/findOneAndDelete-serverErrors.yml} +1 -1
  1165. data/spec/spec_tests/data/retryable_writes/{findOneAndReplace-serverErrors.yml → legacy/findOneAndReplace-serverErrors.yml} +1 -1
  1166. data/spec/spec_tests/data/retryable_writes/{findOneAndUpdate-serverErrors.yml → legacy/findOneAndUpdate-serverErrors.yml} +1 -1
  1167. data/spec/spec_tests/data/retryable_writes/{insertMany-serverErrors.yml → legacy/insertMany-serverErrors.yml} +1 -1
  1168. data/spec/spec_tests/data/retryable_writes/{insertOne-serverErrors.yml → legacy/insertOne-serverErrors.yml} +5 -5
  1169. data/spec/spec_tests/data/retryable_writes/{replaceOne-serverErrors.yml → legacy/replaceOne-serverErrors.yml} +1 -1
  1170. data/spec/spec_tests/data/retryable_writes/{updateOne-serverErrors.yml → legacy/updateOne-serverErrors.yml} +1 -1
  1171. data/spec/spec_tests/data/retryable_writes/unified/bulkWrite-serverErrors.yml +93 -0
  1172. data/spec/spec_tests/data/retryable_writes/unified/handshakeError.yml +785 -0
  1173. data/spec/spec_tests/data/retryable_writes/unified/insertOne-noWritesPerformedError.yml +54 -0
  1174. data/spec/spec_tests/data/retryable_writes/unified/insertOne-serverErrors.yml +75 -0
  1175. data/spec/spec_tests/data/run_command_unified/runCommand.yml +319 -0
  1176. data/spec/spec_tests/data/sdam/errors/prefer-error-code.yml +2 -2
  1177. data/spec/spec_tests/data/sdam/rs/electionId_precedence_setVersion.yml +62 -0
  1178. data/spec/spec_tests/data/sdam/rs/null_election_id-pre-6.0.yml +175 -0
  1179. data/spec/spec_tests/data/sdam/rs/null_election_id.yml +20 -18
  1180. data/spec/spec_tests/data/sdam/rs/secondary_ignore_ok_0-pre-6.0.yml +87 -0
  1181. data/spec/spec_tests/data/sdam/rs/secondary_ignore_ok_0.yml +1 -1
  1182. data/spec/spec_tests/data/sdam/rs/set_version_can_rollback.yml +101 -0
  1183. data/spec/spec_tests/data/sdam/rs/setversion_equal_max_without_electionid.yml +78 -0
  1184. data/spec/spec_tests/data/sdam/rs/setversion_greaterthan_max_without_electionid.yml +79 -0
  1185. data/spec/spec_tests/data/sdam/rs/setversion_without_electionid-pre-6.0.yml +79 -0
  1186. data/spec/spec_tests/data/sdam/rs/setversion_without_electionid.yml +9 -10
  1187. data/spec/spec_tests/data/sdam/rs/use_setversion_without_electionid-pre-6.0.yml +117 -0
  1188. data/spec/spec_tests/data/sdam/rs/use_setversion_without_electionid.yml +23 -21
  1189. data/spec/spec_tests/data/sdam_monitoring/discovered_standalone.yml +1 -1
  1190. data/spec/spec_tests/data/sdam_monitoring/replica_set_with_no_primary.yml +38 -39
  1191. data/spec/spec_tests/data/sdam_monitoring/replica_set_with_primary.yml +38 -39
  1192. data/spec/spec_tests/data/sdam_monitoring/replica_set_with_removal.yml +1 -1
  1193. data/spec/spec_tests/data/sdam_monitoring/required_replica_set.yml +1 -1
  1194. data/spec/spec_tests/data/sdam_monitoring/standalone.yml +1 -1
  1195. data/spec/spec_tests/data/sdam_monitoring/standalone_suppress_equal_description_changes.yml +2 -2
  1196. data/spec/spec_tests/data/sdam_unified/auth-error.yml +130 -0
  1197. data/spec/spec_tests/data/sdam_unified/auth-misc-command-error.yml +132 -0
  1198. data/spec/spec_tests/data/sdam_unified/auth-network-error.yml +132 -0
  1199. data/spec/spec_tests/data/sdam_unified/auth-network-timeout-error.yml +138 -0
  1200. data/spec/spec_tests/data/sdam_unified/auth-shutdown-error.yml +133 -0
  1201. data/spec/spec_tests/data/sdam_unified/cancel-server-check.yml +143 -0
  1202. data/spec/spec_tests/data/sdam_unified/connectTimeoutMS.yml +130 -0
  1203. data/spec/spec_tests/data/sdam_unified/find-network-error.yml +135 -0
  1204. data/spec/spec_tests/data/sdam_unified/find-network-timeout-error.yml +119 -0
  1205. data/spec/spec_tests/data/sdam_unified/find-shutdown-error.yml +163 -0
  1206. data/spec/spec_tests/data/sdam_unified/hello-command-error.yml +233 -0
  1207. data/spec/spec_tests/data/sdam_unified/hello-network-error.yml +228 -0
  1208. data/spec/spec_tests/data/sdam_unified/hello-timeout.yml +318 -0
  1209. data/spec/spec_tests/data/sdam_unified/insert-network-error.yml +137 -0
  1210. data/spec/spec_tests/data/sdam_unified/insert-shutdown-error.yml +162 -0
  1211. data/spec/spec_tests/data/sdam_unified/interruptInUse-pool-clear.yml +340 -0
  1212. data/spec/spec_tests/data/sdam_unified/minPoolSize-error.yml +125 -0
  1213. data/spec/spec_tests/data/sdam_unified/pool-cleared-error.yml +239 -0
  1214. data/spec/spec_tests/data/sdam_unified/rediscover-quickly-after-step-down.yml +144 -0
  1215. data/spec/spec_tests/data/seed_list_discovery/load-balanced/loadBalanced-directConnection.yml +6 -5
  1216. data/spec/spec_tests/data/seed_list_discovery/load-balanced/loadBalanced-no-results.yml +5 -0
  1217. data/spec/spec_tests/data/seed_list_discovery/load-balanced/loadBalanced-replicaSet-errors.yml +2 -2
  1218. data/spec/spec_tests/data/seed_list_discovery/load-balanced/loadBalanced-true-txt.yml +5 -4
  1219. data/spec/spec_tests/data/seed_list_discovery/load-balanced/srvMaxHosts-conflicts_with_loadBalanced-true-txt.yml +5 -0
  1220. data/spec/spec_tests/data/seed_list_discovery/load-balanced/srvMaxHosts-conflicts_with_loadBalanced-true.yml +5 -0
  1221. data/spec/spec_tests/data/seed_list_discovery/load-balanced/srvMaxHosts-zero-txt.yml +11 -0
  1222. data/spec/spec_tests/data/seed_list_discovery/load-balanced/srvMaxHosts-zero.yml +11 -0
  1223. data/spec/spec_tests/data/seed_list_discovery/replica-set/srv-service-name.yml +11 -0
  1224. data/spec/spec_tests/data/seed_list_discovery/replica-set/srvMaxHosts-conflicts_with_replicaSet-txt.yml +5 -0
  1225. data/spec/spec_tests/data/seed_list_discovery/replica-set/srvMaxHosts-conflicts_with_replicaSet.yml +5 -0
  1226. data/spec/spec_tests/data/seed_list_discovery/replica-set/srvMaxHosts-equal_to_srv_records.yml +16 -0
  1227. data/spec/spec_tests/data/seed_list_discovery/replica-set/srvMaxHosts-greater_than_srv_records.yml +15 -0
  1228. data/spec/spec_tests/data/seed_list_discovery/replica-set/srvMaxHosts-less_than_srv_records.yml +15 -0
  1229. data/spec/spec_tests/data/seed_list_discovery/replica-set/srvMaxHosts-zero-txt.yml +15 -0
  1230. data/spec/spec_tests/data/seed_list_discovery/replica-set/srvMaxHosts-zero.yml +15 -0
  1231. data/spec/spec_tests/data/seed_list_discovery/sharded/srvMaxHosts-equal_to_srv_records.yml +13 -0
  1232. data/spec/spec_tests/data/seed_list_discovery/sharded/srvMaxHosts-greater_than_srv_records.yml +12 -0
  1233. data/spec/spec_tests/data/seed_list_discovery/sharded/srvMaxHosts-less_than_srv_records.yml +10 -0
  1234. data/spec/spec_tests/data/seed_list_discovery/sharded/srvMaxHosts-zero.yml +11 -0
  1235. data/spec/spec_tests/data/server_selection/Unknown/read/ghost.yml +11 -0
  1236. data/spec/spec_tests/data/server_selection/Unknown/write/ghost.yml +11 -0
  1237. data/spec/spec_tests/data/sessions_unified/driver-sessions-dirty-session-errors.yml +351 -0
  1238. data/spec/spec_tests/data/sessions_unified/driver-sessions-server-support.yml +123 -0
  1239. data/spec/spec_tests/data/sessions_unified/implicit-sessions-default-causal-consistency.yml +119 -0
  1240. data/spec/spec_tests/data/sessions_unified/snapshot-sessions-not-supported-client-error.yml +9 -3
  1241. data/spec/spec_tests/data/sessions_unified/snapshot-sessions-unsupported-ops.yml +1 -1
  1242. data/spec/spec_tests/data/sessions_unified/snapshot-sessions.yml +1 -1
  1243. data/spec/spec_tests/data/transactions/error-labels.yml +1 -1
  1244. data/spec/spec_tests/data/transactions/errors-client.yml +8 -9
  1245. data/spec/spec_tests/data/transactions/mongos-recovery-token.yml +1 -1
  1246. data/spec/spec_tests/data/transactions/retryable-abort-errorLabels.yml +0 -2
  1247. data/spec/spec_tests/data/transactions/retryable-abort.yml +7 -9
  1248. data/spec/spec_tests/data/transactions/retryable-commit-errorLabels.yml +0 -2
  1249. data/spec/spec_tests/data/transactions/retryable-commit.yml +7 -9
  1250. data/spec/spec_tests/data/transactions/retryable-writes.yml +0 -2
  1251. data/spec/spec_tests/data/transactions_unified/do-not-retry-read-in-transaction.yml +64 -0
  1252. data/spec/spec_tests/data/transactions_unified/mongos-unpin.yml +1 -1
  1253. data/spec/spec_tests/data/transactions_unified/retryable-abort-handshake.yml +118 -0
  1254. data/spec/spec_tests/data/transactions_unified/retryable-commit-handshake.yml +118 -0
  1255. data/spec/spec_tests/data/unified/valid-fail/entity-findCursor-malformed.yml +31 -0
  1256. data/spec/spec_tests/data/unified/valid-fail/entity-findCursor.yml +31 -0
  1257. data/spec/spec_tests/data/unified/valid-fail/ignoreResultAndError-malformed.yml +34 -0
  1258. data/spec/spec_tests/data/unified/valid-fail/ignoreResultAndError.yml +35 -0
  1259. data/spec/spec_tests/data/unified/valid-fail/operation-unsupported.yml +13 -0
  1260. data/spec/spec_tests/data/unified/valid-pass/assertNumberConnectionsCheckedOut.yml +17 -0
  1261. data/spec/spec_tests/data/unified/valid-pass/collectionData-createOptions.yml +37 -0
  1262. data/spec/spec_tests/data/unified/valid-pass/entity-client-cmap-events.yml +40 -0
  1263. data/spec/spec_tests/data/unified/valid-pass/entity-client-storeEventsAsEntities.yml +37 -0
  1264. data/spec/spec_tests/data/unified/valid-pass/expectedError-errorResponse.yml +39 -0
  1265. data/spec/spec_tests/data/unified/valid-pass/expectedEventsForClient-eventType.yml +66 -0
  1266. data/spec/spec_tests/data/unified/valid-pass/expectedEventsForClient-ignoreExtraEvents.yml +78 -0
  1267. data/spec/spec_tests/data/unified/valid-pass/ignoreResultAndError.yml +34 -0
  1268. data/spec/spec_tests/data/unified/valid-pass/observeSensitiveCommands.yml +255 -0
  1269. data/spec/spec_tests/data/unified/valid-pass/poc-change-streams.yml +22 -1
  1270. data/spec/spec_tests/data/unified/valid-pass/poc-command-monitoring.yml +3 -3
  1271. data/spec/spec_tests/data/unified/valid-pass/poc-crud.yml +19 -13
  1272. data/spec/spec_tests/data/unified/valid-pass/poc-retryable-reads.yml +3 -3
  1273. data/spec/spec_tests/data/unified/valid-pass/poc-retryable-writes.yml +9 -9
  1274. data/spec/spec_tests/data/unified/valid-pass/poc-sessions.yml +3 -4
  1275. data/spec/spec_tests/data/unified/valid-pass/poc-transactions-convenient-api.yml +1 -1
  1276. data/spec/spec_tests/data/unified/valid-pass/poc-transactions-mongos-pin-auto.yml +1 -1
  1277. data/spec/spec_tests/data/unified/valid-pass/poc-transactions.yml +6 -5
  1278. data/spec/spec_tests/data/uri_options/srv-options.yml +96 -0
  1279. data/spec/spec_tests/data/versioned_api/crud-api-version-1-strict.yml +6 -4
  1280. data/spec/spec_tests/data/versioned_api/crud-api-version-1.yml +7 -5
  1281. data/spec/spec_tests/data/versioned_api/transaction-handling.yml +4 -4
  1282. data/spec/spec_tests/gridfs_spec.rb +1 -1
  1283. data/spec/spec_tests/gridfs_unified_spec.rb +13 -0
  1284. data/spec/spec_tests/index_management_unified_spec.rb +13 -0
  1285. data/spec/spec_tests/load_balancers_spec.rb +1 -1
  1286. data/spec/spec_tests/max_staleness_spec.rb +1 -1
  1287. data/spec/spec_tests/read_write_concern_connection_string_spec.rb +1 -1
  1288. data/spec/spec_tests/read_write_concern_document_spec.rb +1 -1
  1289. data/spec/spec_tests/read_write_concern_operaton_spec.rb +1 -1
  1290. data/spec/spec_tests/retryable_reads_spec.rb +7 -2
  1291. data/spec/spec_tests/retryable_reads_unified_spec.rb +22 -0
  1292. data/spec/spec_tests/retryable_writes_spec.rb +5 -2
  1293. data/spec/spec_tests/retryable_writes_unified_spec.rb +21 -0
  1294. data/spec/spec_tests/run_command_unified_spec.rb +13 -0
  1295. data/spec/spec_tests/sdam_monitoring_spec.rb +1 -1
  1296. data/spec/spec_tests/sdam_spec.rb +5 -1
  1297. data/spec/spec_tests/sdam_unified_spec.rb +15 -0
  1298. data/spec/spec_tests/seed_list_discovery_spec.rb +11 -2
  1299. data/spec/spec_tests/server_selection_rtt_spec.rb +7 -7
  1300. data/spec/spec_tests/server_selection_spec.rb +1 -1
  1301. data/spec/spec_tests/sessions_unified_spec.rb +1 -1
  1302. data/spec/spec_tests/transactions_api_spec.rb +1 -1
  1303. data/spec/spec_tests/transactions_spec.rb +1 -1
  1304. data/spec/spec_tests/transactions_unified_spec.rb +3 -2
  1305. data/spec/spec_tests/unified_spec.rb +2 -2
  1306. data/spec/spec_tests/uri_options_spec.rb +1 -1
  1307. data/spec/spec_tests/versioned_api_spec.rb +1 -1
  1308. data/spec/stress/cleanup_spec.rb +1 -1
  1309. data/spec/stress/connection_pool_stress_spec.rb +1 -62
  1310. data/spec/stress/connection_pool_timing_spec.rb +12 -36
  1311. data/spec/stress/fork_reconnect_stress_spec.rb +10 -10
  1312. data/spec/stress/push_monitor_close_spec.rb +1 -1
  1313. data/spec/support/authorization.rb +2 -2
  1314. data/spec/support/aws_utils/base.rb +1 -1
  1315. data/spec/support/aws_utils/inspector.rb +1 -1
  1316. data/spec/support/aws_utils/orchestrator.rb +20 -8
  1317. data/spec/support/aws_utils/provisioner.rb +1 -1
  1318. data/spec/support/aws_utils.rb +4 -3
  1319. data/spec/support/background_thread_registry.rb +4 -14
  1320. data/spec/support/certificates/atlas-ocsp-ca.crt +89 -79
  1321. data/spec/support/certificates/atlas-ocsp.crt +117 -122
  1322. data/spec/support/certificates/retrieve-atlas-cert +40 -0
  1323. data/spec/support/client_registry.rb +6 -2
  1324. data/spec/support/client_registry_macros.rb +1 -1
  1325. data/spec/support/cluster_tools.rb +17 -12
  1326. data/spec/support/common_shortcuts.rb +53 -6
  1327. data/spec/support/constraints.rb +21 -1
  1328. data/spec/support/crypt/corpus/corpus-encrypted.json +9515 -0
  1329. data/spec/support/crypt/corpus/corpus-key-aws.json +32 -32
  1330. data/spec/support/crypt/corpus/corpus-key-azure.json +33 -0
  1331. data/spec/support/crypt/corpus/corpus-key-gcp.json +35 -0
  1332. data/spec/support/crypt/corpus/corpus-key-kmip.json +32 -0
  1333. data/spec/support/crypt/corpus/corpus-key-local.json +30 -30
  1334. data/spec/support/crypt/corpus/corpus-schema.json +4399 -121
  1335. data/spec/support/crypt/corpus/corpus.json +4999 -37
  1336. data/spec/support/crypt/data_keys/key_document_azure.json +33 -0
  1337. data/spec/support/crypt/data_keys/key_document_gcp.json +37 -0
  1338. data/spec/support/crypt/data_keys/key_document_kmip.json +32 -0
  1339. data/spec/support/crypt/encrypted_fields/encryptedFields.json +32 -0
  1340. data/spec/support/crypt/encrypted_fields/range-encryptedFields-Date.json +30 -0
  1341. data/spec/support/crypt/encrypted_fields/range-encryptedFields-DecimalNoPrecision.json +21 -0
  1342. data/spec/support/crypt/encrypted_fields/range-encryptedFields-DecimalPrecision.json +29 -0
  1343. data/spec/support/crypt/encrypted_fields/range-encryptedFields-DoubleNoPrecision.json +21 -0
  1344. data/spec/support/crypt/encrypted_fields/range-encryptedFields-DoublePrecision.json +30 -0
  1345. data/spec/support/crypt/encrypted_fields/range-encryptedFields-Int.json +27 -0
  1346. data/spec/support/crypt/encrypted_fields/range-encryptedFields-Long.json +27 -0
  1347. data/spec/support/crypt/keys/key1-document.json +30 -0
  1348. data/spec/support/crypt/schema_maps/schema_map_azure.json +17 -0
  1349. data/spec/support/crypt/schema_maps/schema_map_azure_key_alt_names.json +12 -0
  1350. data/spec/support/crypt/schema_maps/schema_map_gcp.json +17 -0
  1351. data/spec/support/crypt/schema_maps/schema_map_gcp_key_alt_names.json +12 -0
  1352. data/spec/support/crypt/schema_maps/schema_map_kmip.json +17 -0
  1353. data/spec/support/crypt/schema_maps/schema_map_kmip_key_alt_names.json +12 -0
  1354. data/spec/support/crypt.rb +269 -14
  1355. data/spec/support/dns.rb +1 -1
  1356. data/spec/support/json_ext_formatter.rb +1 -1
  1357. data/spec/support/keyword_struct.rb +1 -1
  1358. data/spec/support/local_resource_registry.rb +1 -1
  1359. data/spec/support/macros.rb +29 -0
  1360. data/spec/support/matchers.rb +5 -5
  1361. data/spec/support/mongos_macros.rb +24 -0
  1362. data/spec/support/monitoring_ext.rb +1 -1
  1363. data/spec/support/ocsp +1 -1
  1364. data/spec/support/primary_socket.rb +1 -1
  1365. data/spec/support/recording_logger.rb +27 -0
  1366. data/spec/support/sdam_formatter_integration.rb +1 -1
  1367. data/spec/support/shared/app_metadata.rb +15 -3
  1368. data/spec/support/shared/auth_context.rb +1 -0
  1369. data/spec/support/shared/protocol.rb +1 -1
  1370. data/spec/support/shared/scram_conversation.rb +3 -2
  1371. data/spec/support/shared/server_selector.rb +1 -1
  1372. data/spec/support/shared/session.rb +16 -10
  1373. data/spec/support/spec_config.rb +133 -2
  1374. data/spec/support/spec_setup.rb +3 -3
  1375. data/spec/support/using_hash.rb +11 -2
  1376. data/spec/support/utils.rb +280 -229
  1377. metadata +1790 -1289
  1378. checksums.yaml.gz.sig +0 -0
  1379. data/lib/mongo/operation/aggregate/command.rb +0 -55
  1380. data/lib/mongo/operation/collections_info/command.rb +0 -48
  1381. data/lib/mongo/operation/count/command.rb +0 -47
  1382. data/lib/mongo/operation/create/command.rb +0 -47
  1383. data/lib/mongo/operation/create_index/command.rb +0 -61
  1384. data/lib/mongo/operation/delete/command.rb +0 -52
  1385. data/lib/mongo/operation/delete/legacy.rb +0 -64
  1386. data/lib/mongo/operation/distinct/command.rb +0 -47
  1387. data/lib/mongo/operation/explain/command.rb +0 -58
  1388. data/lib/mongo/operation/explain/legacy.rb +0 -52
  1389. data/lib/mongo/operation/find/builder/legacy.rb +0 -123
  1390. data/lib/mongo/operation/find/command.rb +0 -51
  1391. data/lib/mongo/operation/find/legacy/result.rb +0 -46
  1392. data/lib/mongo/operation/find/legacy.rb +0 -52
  1393. data/lib/mongo/operation/get_more/command.rb +0 -43
  1394. data/lib/mongo/operation/indexes/command.rb +0 -42
  1395. data/lib/mongo/operation/indexes/legacy.rb +0 -48
  1396. data/lib/mongo/operation/insert/command.rb +0 -59
  1397. data/lib/mongo/operation/insert/legacy.rb +0 -68
  1398. data/lib/mongo/operation/kill_cursors/command.rb +0 -48
  1399. data/lib/mongo/operation/list_collections/command.rb +0 -46
  1400. data/lib/mongo/operation/map_reduce/command.rb +0 -51
  1401. data/lib/mongo/operation/parallel_scan/command.rb +0 -57
  1402. data/lib/mongo/operation/remove_user/command.rb +0 -46
  1403. data/lib/mongo/operation/shared/op_msg_or_find_command.rb +0 -44
  1404. data/lib/mongo/operation/update/command.rb +0 -53
  1405. data/lib/mongo/operation/update/legacy/result.rb +0 -112
  1406. data/lib/mongo/operation/update/legacy.rb +0 -76
  1407. data/lib/mongo/operation/users_info/command.rb +0 -46
  1408. data/lib/mongo/operation/write_command/command.rb +0 -51
  1409. data/lib/mongo/protocol/delete.rb +0 -172
  1410. data/lib/mongo/protocol/insert.rb +0 -181
  1411. data/lib/mongo/protocol/update.rb +0 -214
  1412. data/spec/mongo/dbref_spec.rb +0 -152
  1413. data/spec/mongo/operation/delete/command_spec.rb +0 -115
  1414. data/spec/mongo/operation/find/legacy_spec.rb +0 -131
  1415. data/spec/mongo/operation/get_more_spec.rb +0 -63
  1416. data/spec/mongo/operation/insert/command_spec.rb +0 -118
  1417. data/spec/mongo/operation/kill_cursors_spec.rb +0 -47
  1418. data/spec/mongo/operation/update/command_spec.rb +0 -122
  1419. data/spec/mongo/protocol/delete_spec.rb +0 -185
  1420. data/spec/mongo/protocol/insert_spec.rb +0 -179
  1421. data/spec/mongo/protocol/update_spec.rb +0 -204
  1422. data/spec/mongo/server/round_trip_time_averager_spec.rb +0 -48
  1423. data/spec/shared/LICENSE +0 -20
  1424. data/spec/shared/bin/get-mongodb-download-url +0 -17
  1425. data/spec/shared/bin/s3-copy +0 -45
  1426. data/spec/shared/bin/s3-upload +0 -69
  1427. data/spec/shared/lib/mrss/child_process_helper.rb +0 -80
  1428. data/spec/shared/lib/mrss/cluster_config.rb +0 -231
  1429. data/spec/shared/lib/mrss/constraints.rb +0 -385
  1430. data/spec/shared/lib/mrss/docker_runner.rb +0 -271
  1431. data/spec/shared/lib/mrss/event_subscriber.rb +0 -200
  1432. data/spec/shared/lib/mrss/lite_constraints.rb +0 -191
  1433. data/spec/shared/lib/mrss/server_version_registry.rb +0 -120
  1434. data/spec/shared/lib/mrss/spec_organizer.rb +0 -179
  1435. data/spec/shared/lib/mrss/utils.rb +0 -15
  1436. data/spec/shared/share/Dockerfile.erb +0 -323
  1437. data/spec/shared/share/haproxy-1.conf +0 -16
  1438. data/spec/shared/share/haproxy-2.conf +0 -17
  1439. data/spec/shared/shlib/distro.sh +0 -73
  1440. data/spec/shared/shlib/server.sh +0 -367
  1441. data/spec/shared/shlib/set_env.sh +0 -131
  1442. data/spec/spec_tests/change_streams_spec.rb +0 -93
  1443. data/spec/spec_tests/command_monitoring_spec.rb +0 -71
  1444. data/spec/spec_tests/data/change_streams/change-streams-errors.yml +0 -101
  1445. data/spec/spec_tests/data/change_streams/change-streams-resume-allowlist.yml +0 -1173
  1446. data/spec/spec_tests/data/change_streams/change-streams-resume-errorLabels.yml +0 -1105
  1447. data/spec/spec_tests/data/change_streams/change-streams.yml +0 -535
  1448. data/spec/spec_tests/data/command_monitoring/bulkWrite.yml +0 -49
  1449. data/spec/spec_tests/data/command_monitoring/command.yml +0 -61
  1450. data/spec/spec_tests/data/command_monitoring/deleteMany.yml +0 -55
  1451. data/spec/spec_tests/data/command_monitoring/deleteOne.yml +0 -55
  1452. data/spec/spec_tests/data/command_monitoring/find.yml +0 -266
  1453. data/spec/spec_tests/data/command_monitoring/insertMany.yml +0 -75
  1454. data/spec/spec_tests/data/command_monitoring/insertOne.yml +0 -51
  1455. data/spec/spec_tests/data/command_monitoring/unacknowledgedBulkWrite.yml +0 -34
  1456. data/spec/spec_tests/data/command_monitoring/updateMany.yml +0 -65
  1457. data/spec/spec_tests/data/command_monitoring/updateOne.yml +0 -90
  1458. data/spec/spec_tests/data/crud_v2/aggregate-merge.yml +0 -103
  1459. data/spec/spec_tests/data/crud_v2/aggregate-out-readConcern.yml +0 -111
  1460. data/spec/spec_tests/data/crud_v2/bulkWrite-arrayFilters.yml +0 -103
  1461. data/spec/spec_tests/data/crud_v2/bulkWrite-delete-hint-clientError.yml +0 -63
  1462. data/spec/spec_tests/data/crud_v2/bulkWrite-delete-hint-serverError.yml +0 -92
  1463. data/spec/spec_tests/data/crud_v2/bulkWrite-delete-hint.yml +0 -103
  1464. data/spec/spec_tests/data/crud_v2/bulkWrite-update-hint-clientError.yml +0 -90
  1465. data/spec/spec_tests/data/crud_v2/bulkWrite-update-hint-serverError.yml +0 -147
  1466. data/spec/spec_tests/data/crud_v2/bulkWrite-update-hint.yml +0 -164
  1467. data/spec/spec_tests/data/crud_v2/db-aggregate.yml +0 -39
  1468. data/spec/spec_tests/data/crud_v2/deleteMany-hint-clientError.yml +0 -43
  1469. data/spec/spec_tests/data/crud_v2/deleteMany-hint-serverError.yml +0 -62
  1470. data/spec/spec_tests/data/crud_v2/deleteMany-hint.yml +0 -58
  1471. data/spec/spec_tests/data/crud_v2/deleteOne-hint-clientError.yml +0 -41
  1472. data/spec/spec_tests/data/crud_v2/deleteOne-hint-serverError.yml +0 -60
  1473. data/spec/spec_tests/data/crud_v2/deleteOne-hint.yml +0 -57
  1474. data/spec/spec_tests/data/crud_v2/find-allowdiskuse-clientError.yml +0 -28
  1475. data/spec/spec_tests/data/crud_v2/find-allowdiskuse-serverError.yml +0 -44
  1476. data/spec/spec_tests/data/crud_v2/find-allowdiskuse.yml +0 -50
  1477. data/spec/spec_tests/data/crud_v2/findOneAndDelete-hint-clientError.yml +0 -45
  1478. data/spec/spec_tests/data/crud_v2/findOneAndDelete-hint-serverError.yml +0 -60
  1479. data/spec/spec_tests/data/crud_v2/findOneAndDelete-hint.yml +0 -56
  1480. data/spec/spec_tests/data/crud_v2/findOneAndReplace-hint-clientError.yml +0 -40
  1481. data/spec/spec_tests/data/crud_v2/findOneAndReplace-hint-serverError.yml +0 -59
  1482. data/spec/spec_tests/data/crud_v2/findOneAndReplace-hint.yml +0 -55
  1483. data/spec/spec_tests/data/crud_v2/findOneAndUpdate-hint-clientError.yml +0 -40
  1484. data/spec/spec_tests/data/crud_v2/findOneAndUpdate-hint-serverError.yml +0 -58
  1485. data/spec/spec_tests/data/crud_v2/findOneAndUpdate-hint.yml +0 -55
  1486. data/spec/spec_tests/data/crud_v2/replaceOne-hint.yml +0 -61
  1487. data/spec/spec_tests/data/crud_v2/unacknowledged-bulkWrite-delete-hint-clientError.yml +0 -60
  1488. data/spec/spec_tests/data/crud_v2/unacknowledged-bulkWrite-update-hint-clientError.yml +0 -88
  1489. data/spec/spec_tests/data/crud_v2/unacknowledged-deleteMany-hint-clientError.yml +0 -40
  1490. data/spec/spec_tests/data/crud_v2/unacknowledged-deleteOne-hint-clientError.yml +0 -38
  1491. data/spec/spec_tests/data/crud_v2/unacknowledged-findOneAndDelete-hint-clientError.yml +0 -42
  1492. data/spec/spec_tests/data/crud_v2/unacknowledged-findOneAndReplace-hint-clientError.yml +0 -40
  1493. data/spec/spec_tests/data/crud_v2/unacknowledged-findOneAndUpdate-hint-clientError.yml +0 -40
  1494. data/spec/spec_tests/data/crud_v2/unacknowledged-replaceOne-hint-clientError.yml +0 -40
  1495. data/spec/spec_tests/data/crud_v2/unacknowledged-updateMany-hint-clientError.yml +0 -43
  1496. data/spec/spec_tests/data/crud_v2/unacknowledged-updateOne-hint-clientError.yml +0 -40
  1497. data/spec/spec_tests/data/crud_v2/updateMany-hint-clientError.yml +0 -45
  1498. data/spec/spec_tests/data/crud_v2/updateMany-hint-serverError.yml +0 -66
  1499. data/spec/spec_tests/data/crud_v2/updateMany-hint.yml +0 -65
  1500. data/spec/spec_tests/data/crud_v2/updateOne-hint-clientError.yml +0 -43
  1501. data/spec/spec_tests/data/crud_v2/updateOne-hint-serverError.yml +0 -62
  1502. data/spec/spec_tests/data/crud_v2/updateOne-hint.yml +0 -61
  1503. data/spec/spec_tests/data/crud_v2/updateWithPipelines.yml +0 -157
  1504. data/spec/spec_tests/data/retryable_reads/estimatedDocumentCount-4.9.yml +0 -60
  1505. data/spec/spec_tests/data/retryable_reads/estimatedDocumentCount-serverErrors-4.9.yml +0 -146
  1506. data/spec/spec_tests/data/sdam_integration/cancel-server-check.yml +0 -96
  1507. data/spec/spec_tests/data/sdam_integration/connectTimeoutMS.yml +0 -88
  1508. data/spec/spec_tests/data/sdam_integration/find-network-error.yml +0 -85
  1509. data/spec/spec_tests/data/sdam_integration/find-shutdown-error.yml +0 -118
  1510. data/spec/spec_tests/data/sdam_integration/hello-command-error.yml +0 -160
  1511. data/spec/spec_tests/data/sdam_integration/hello-network-error.yml +0 -158
  1512. data/spec/spec_tests/data/sdam_integration/hello-timeout.yml +0 -225
  1513. data/spec/spec_tests/data/sdam_integration/insert-network-error.yml +0 -88
  1514. data/spec/spec_tests/data/sdam_integration/insert-shutdown-error.yml +0 -117
  1515. data/spec/spec_tests/data/sdam_integration/rediscover-quickly-after-step-down.yml +0 -98
  1516. data/spec/spec_tests/sdam_integration_spec.rb +0 -16
  1517. data/spec/support/crypt/corpus/corpus_encrypted.json +0 -4152
  1518. data/spec/support/session_registry.rb +0 -55
  1519. data.tar.gz.sig +0 -0
  1520. metadata.gz.sig +0 -0
  1521. /data/spec/spec_tests/data/retryable_reads/{aggregate-merge.yml → legacy/aggregate-merge.yml} +0 -0
  1522. /data/spec/spec_tests/data/retryable_reads/{aggregate-serverErrors.yml → legacy/aggregate-serverErrors.yml} +0 -0
  1523. /data/spec/spec_tests/data/retryable_reads/{aggregate.yml → legacy/aggregate.yml} +0 -0
  1524. /data/spec/spec_tests/data/retryable_reads/{changeStreams-client.watch-serverErrors.yml → legacy/changeStreams-client.watch-serverErrors.yml} +0 -0
  1525. /data/spec/spec_tests/data/retryable_reads/{changeStreams-client.watch.yml → legacy/changeStreams-client.watch.yml} +0 -0
  1526. /data/spec/spec_tests/data/retryable_reads/{changeStreams-db.coll.watch-serverErrors.yml → legacy/changeStreams-db.coll.watch-serverErrors.yml} +0 -0
  1527. /data/spec/spec_tests/data/retryable_reads/{changeStreams-db.coll.watch.yml → legacy/changeStreams-db.coll.watch.yml} +0 -0
  1528. /data/spec/spec_tests/data/retryable_reads/{changeStreams-db.watch-serverErrors.yml → legacy/changeStreams-db.watch-serverErrors.yml} +0 -0
  1529. /data/spec/spec_tests/data/retryable_reads/{changeStreams-db.watch.yml → legacy/changeStreams-db.watch.yml} +0 -0
  1530. /data/spec/spec_tests/data/retryable_reads/{count-serverErrors.yml → legacy/count-serverErrors.yml} +0 -0
  1531. /data/spec/spec_tests/data/retryable_reads/{count.yml → legacy/count.yml} +0 -0
  1532. /data/spec/spec_tests/data/retryable_reads/{countDocuments-serverErrors.yml → legacy/countDocuments-serverErrors.yml} +0 -0
  1533. /data/spec/spec_tests/data/retryable_reads/{countDocuments.yml → legacy/countDocuments.yml} +0 -0
  1534. /data/spec/spec_tests/data/retryable_reads/{distinct-serverErrors.yml → legacy/distinct-serverErrors.yml} +0 -0
  1535. /data/spec/spec_tests/data/retryable_reads/{distinct.yml → legacy/distinct.yml} +0 -0
  1536. /data/spec/spec_tests/data/retryable_reads/{find-serverErrors.yml → legacy/find-serverErrors.yml} +0 -0
  1537. /data/spec/spec_tests/data/retryable_reads/{find.yml → legacy/find.yml} +0 -0
  1538. /data/spec/spec_tests/data/retryable_reads/{findOne-serverErrors.yml → legacy/findOne-serverErrors.yml} +0 -0
  1539. /data/spec/spec_tests/data/retryable_reads/{findOne.yml → legacy/findOne.yml} +0 -0
  1540. /data/spec/spec_tests/data/retryable_reads/{gridfs-download-serverErrors.yml → legacy/gridfs-download-serverErrors.yml} +0 -0
  1541. /data/spec/spec_tests/data/retryable_reads/{gridfs-download.yml → legacy/gridfs-download.yml} +0 -0
  1542. /data/spec/spec_tests/data/retryable_reads/{gridfs-downloadByName-serverErrors.yml → legacy/gridfs-downloadByName-serverErrors.yml} +0 -0
  1543. /data/spec/spec_tests/data/retryable_reads/{gridfs-downloadByName.yml → legacy/gridfs-downloadByName.yml} +0 -0
  1544. /data/spec/spec_tests/data/retryable_reads/{listCollectionNames-serverErrors.yml → legacy/listCollectionNames-serverErrors.yml} +0 -0
  1545. /data/spec/spec_tests/data/retryable_reads/{listCollectionNames.yml → legacy/listCollectionNames.yml} +0 -0
  1546. /data/spec/spec_tests/data/retryable_reads/{listCollectionObjects-serverErrors.yml → legacy/listCollectionObjects-serverErrors.yml} +0 -0
  1547. /data/spec/spec_tests/data/retryable_reads/{listCollectionObjects.yml → legacy/listCollectionObjects.yml} +0 -0
  1548. /data/spec/spec_tests/data/retryable_reads/{listCollections-serverErrors.yml → legacy/listCollections-serverErrors.yml} +0 -0
  1549. /data/spec/spec_tests/data/retryable_reads/{listCollections.yml → legacy/listCollections.yml} +0 -0
  1550. /data/spec/spec_tests/data/retryable_reads/{listDatabaseNames-serverErrors.yml → legacy/listDatabaseNames-serverErrors.yml} +0 -0
  1551. /data/spec/spec_tests/data/retryable_reads/{listDatabaseNames.yml → legacy/listDatabaseNames.yml} +0 -0
  1552. /data/spec/spec_tests/data/retryable_reads/{listDatabaseObjects-serverErrors.yml → legacy/listDatabaseObjects-serverErrors.yml} +0 -0
  1553. /data/spec/spec_tests/data/retryable_reads/{listDatabaseObjects.yml → legacy/listDatabaseObjects.yml} +0 -0
  1554. /data/spec/spec_tests/data/retryable_reads/{listDatabases-serverErrors.yml → legacy/listDatabases-serverErrors.yml} +0 -0
  1555. /data/spec/spec_tests/data/retryable_reads/{listDatabases.yml → legacy/listDatabases.yml} +0 -0
  1556. /data/spec/spec_tests/data/retryable_reads/{listIndexNames-serverErrors.yml → legacy/listIndexNames-serverErrors.yml} +0 -0
  1557. /data/spec/spec_tests/data/retryable_reads/{listIndexNames.yml → legacy/listIndexNames.yml} +0 -0
  1558. /data/spec/spec_tests/data/retryable_reads/{listIndexes-serverErrors.yml → legacy/listIndexes-serverErrors.yml} +0 -0
  1559. /data/spec/spec_tests/data/retryable_reads/{listIndexes.yml → legacy/listIndexes.yml} +0 -0
  1560. /data/spec/spec_tests/data/retryable_reads/{mapReduce.yml → legacy/mapReduce.yml} +0 -0
  1561. /data/spec/spec_tests/data/retryable_writes/{bulkWrite-errorLabels.yml → legacy/bulkWrite-errorLabels.yml} +0 -0
  1562. /data/spec/spec_tests/data/retryable_writes/{bulkWrite.yml → legacy/bulkWrite.yml} +0 -0
  1563. /data/spec/spec_tests/data/retryable_writes/{deleteMany.yml → legacy/deleteMany.yml} +0 -0
  1564. /data/spec/spec_tests/data/retryable_writes/{deleteOne-errorLabels.yml → legacy/deleteOne-errorLabels.yml} +0 -0
  1565. /data/spec/spec_tests/data/retryable_writes/{deleteOne.yml → legacy/deleteOne.yml} +0 -0
  1566. /data/spec/spec_tests/data/retryable_writes/{findOneAndDelete-errorLabels.yml → legacy/findOneAndDelete-errorLabels.yml} +0 -0
  1567. /data/spec/spec_tests/data/retryable_writes/{findOneAndDelete.yml → legacy/findOneAndDelete.yml} +0 -0
  1568. /data/spec/spec_tests/data/retryable_writes/{findOneAndReplace-errorLabels.yml → legacy/findOneAndReplace-errorLabels.yml} +0 -0
  1569. /data/spec/spec_tests/data/retryable_writes/{findOneAndReplace.yml → legacy/findOneAndReplace.yml} +0 -0
  1570. /data/spec/spec_tests/data/retryable_writes/{findOneAndUpdate-errorLabels.yml → legacy/findOneAndUpdate-errorLabels.yml} +0 -0
  1571. /data/spec/spec_tests/data/retryable_writes/{findOneAndUpdate.yml → legacy/findOneAndUpdate.yml} +0 -0
  1572. /data/spec/spec_tests/data/retryable_writes/{insertMany-errorLabels.yml → legacy/insertMany-errorLabels.yml} +0 -0
  1573. /data/spec/spec_tests/data/retryable_writes/{insertMany.yml → legacy/insertMany.yml} +0 -0
  1574. /data/spec/spec_tests/data/retryable_writes/{insertOne-errorLabels.yml → legacy/insertOne-errorLabels.yml} +0 -0
  1575. /data/spec/spec_tests/data/retryable_writes/{insertOne.yml → legacy/insertOne.yml} +0 -0
  1576. /data/spec/spec_tests/data/retryable_writes/{replaceOne-errorLabels.yml → legacy/replaceOne-errorLabels.yml} +0 -0
  1577. /data/spec/spec_tests/data/retryable_writes/{replaceOne.yml → legacy/replaceOne.yml} +0 -0
  1578. /data/spec/spec_tests/data/retryable_writes/{updateMany.yml → legacy/updateMany.yml} +0 -0
  1579. /data/spec/spec_tests/data/retryable_writes/{updateOne-errorLabels.yml → legacy/updateOne-errorLabels.yml} +0 -0
  1580. /data/spec/spec_tests/data/retryable_writes/{updateOne.yml → legacy/updateOne.yml} +0 -0
@@ -0,0 +1,232 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Mongo
4
+ module SearchIndex
5
+ # A class representing a view of search indexes.
6
+ class View
7
+ include Enumerable
8
+ include Retryable
9
+ include Collection::Helpers
10
+
11
+ # @return [ Mongo::Collection ] the collection this view belongs to
12
+ attr_reader :collection
13
+
14
+ # @return [ nil | String ] the index id to query
15
+ attr_reader :requested_index_id
16
+
17
+ # @return [ nil | String ] the index name to query
18
+ attr_reader :requested_index_name
19
+
20
+ # @return [ Hash ] the options hash to use for the aggregate command
21
+ # when querying the available indexes.
22
+ attr_reader :aggregate_options
23
+
24
+ # Create the new search index view.
25
+ #
26
+ # @param [ Collection ] collection The collection.
27
+ # @param [ Hash ] options The options that configure the behavior of the view.
28
+ #
29
+ # @option options [ String ] :id The specific index id to query (optional)
30
+ # @option options [ String ] :name The name of the specific index to query (optional)
31
+ # @option options [ Hash ] :aggregate The options hash to send to the
32
+ # aggregate command when querying the available indexes.
33
+ def initialize(collection, options = {})
34
+ @collection = collection
35
+ @requested_index_id = options[:id]
36
+ @requested_index_name = options[:name]
37
+ @aggregate_options = options[:aggregate] || {}
38
+
39
+ return if @aggregate_options.is_a?(Hash)
40
+
41
+ raise ArgumentError, "The :aggregate option must be a Hash (got a #{@aggregate_options.class})"
42
+ end
43
+
44
+ # Create a single search index with the given definition. If the name is
45
+ # provided, the new index will be given that name.
46
+ #
47
+ # @param [ Hash ] definition The definition of the search index.
48
+ # @param [ nil | String ] name The name to give the new search index.
49
+ #
50
+ # @return [ String ] the name of the new search index.
51
+ def create_one(definition, name: nil)
52
+ create_many([ { name: name, definition: definition } ]).first
53
+ end
54
+
55
+ # Create multiple search indexes with a single command.
56
+ #
57
+ # @param [ Array<Hash> ] indexes The description of the indexes to
58
+ # create. Each element of the list must be a hash with a definition
59
+ # key, and an optional name key.
60
+ #
61
+ # @return [ Array<String> ] the names of the new search indexes.
62
+ def create_many(indexes)
63
+ spec = spec_with(indexes: indexes.map { |v| validate_search_index!(v) })
64
+ result = Operation::CreateSearchIndexes.new(spec).execute(next_primary, context: execution_context)
65
+ result.first['indexesCreated'].map { |idx| idx['name'] }
66
+ end
67
+
68
+ # Drop the search index with the given id, or name. One or the other must
69
+ # be specified, but not both.
70
+ #
71
+ # @param [ String ] id the id of the index to drop
72
+ # @param [ String ] name the name of the index to drop
73
+ #
74
+ # @return [ Mongo::Operation::Result | false ] the result of the
75
+ # operation, or false if the given index does not exist.
76
+ def drop_one(id: nil, name: nil)
77
+ validate_id_or_name!(id, name)
78
+
79
+ spec = spec_with(index_id: id, index_name: name)
80
+ op = Operation::DropSearchIndex.new(spec)
81
+
82
+ # per the spec:
83
+ # Drivers MUST suppress NamespaceNotFound errors for the
84
+ # ``dropSearchIndex`` helper. Drop operations should be idempotent.
85
+ do_drop(op, nil, execution_context)
86
+ end
87
+
88
+ # Iterate over the search indexes.
89
+ #
90
+ # @param [ Proc ] block if given, each search index will be yieleded to
91
+ # the block.
92
+ #
93
+ # @return [ self | Enumerator ] if a block is given, self is returned.
94
+ # Otherwise, an enumerator will be returned.
95
+ def each(&block)
96
+ @result ||= begin
97
+ spec = {}.tap do |s|
98
+ s[:id] = requested_index_id if requested_index_id
99
+ s[:name] = requested_index_name if requested_index_name
100
+ end
101
+
102
+ collection.aggregate(
103
+ [ { '$listSearchIndexes' => spec } ],
104
+ aggregate_options
105
+ )
106
+ end
107
+
108
+ return @result.to_enum unless block
109
+
110
+ @result.each(&block)
111
+ self
112
+ end
113
+
114
+ # Update the search index with the given id or name. One or the other
115
+ # must be provided, but not both.
116
+ #
117
+ # @param [ Hash ] definition the definition to replace the given search
118
+ # index with.
119
+ # @param [ nil | String ] id the id of the search index to update
120
+ # @param [ nil | String ] name the name of the search index to update
121
+ #
122
+ # @return [ Mongo::Operation::Result ] the result of the operation
123
+ def update_one(definition, id: nil, name: nil)
124
+ validate_id_or_name!(id, name)
125
+
126
+ spec = spec_with(index_id: id, index_name: name, index: definition)
127
+ Operation::UpdateSearchIndex.new(spec).execute(next_primary, context: execution_context)
128
+ end
129
+
130
+ # The following methods are to make the view act more like an array,
131
+ # without having to explicitly make it an array...
132
+
133
+ # Queries whether the search index enumerable is empty.
134
+ #
135
+ # @return [ true | false ] whether the enumerable is empty or not.
136
+ def empty?
137
+ count.zero?
138
+ end
139
+
140
+ private
141
+
142
+ # A helper method for building the specification document with certain
143
+ # values pre-populated.
144
+ #
145
+ # @param [ Hash ] extras the values to put into the specification
146
+ #
147
+ # @return [ Hash ] the specification document
148
+ def spec_with(extras)
149
+ {
150
+ coll_name: collection.name,
151
+ db_name: collection.database.name,
152
+ }.merge(extras)
153
+ end
154
+
155
+ # A helper method for retrieving the primary server from the cluster.
156
+ #
157
+ # @return [ Mongo::Server ] the server to use
158
+ def next_primary(ping = nil, session = nil)
159
+ collection.cluster.next_primary(ping, session)
160
+ end
161
+
162
+ # A helper method for constructing a new operation context for executing
163
+ # an operation.
164
+ #
165
+ # @return [ Mongo::Operation::Context ] the operation context
166
+ def execution_context
167
+ Operation::Context.new(client: collection.client)
168
+ end
169
+
170
+ # Validates the given id and name, ensuring that exactly one of them
171
+ # is non-nil.
172
+ #
173
+ # @param [ nil | String ] id the id to validate
174
+ # @param [ nil | String ] name the name to validate
175
+ #
176
+ # @raise [ ArgumentError ] if neither or both arguments are nil
177
+ def validate_id_or_name!(id, name)
178
+ return unless (id.nil? && name.nil?) || (!id.nil? && !name.nil?)
179
+
180
+ raise ArgumentError, 'exactly one of id or name must be specified'
181
+ end
182
+
183
+ # Validates the given search index document, ensuring that it has no
184
+ # extra keys, and that the name and definition are valid.
185
+ #
186
+ # @param [ Hash ] doc the document to validate
187
+ #
188
+ # @raise [ ArgumentError ] if the document is invalid.
189
+ def validate_search_index!(doc)
190
+ validate_search_index_keys!(doc.keys)
191
+ validate_search_index_name!(doc[:name] || doc['name'])
192
+ validate_search_index_definition!(doc[:definition] || doc['definition'])
193
+ doc
194
+ end
195
+
196
+ # Validates the keys of a search index document, ensuring that
197
+ # they are all valid.
198
+ #
199
+ # @param [ Array<String | Hash> ] keys the keys of a search index document
200
+ #
201
+ # @raise [ ArgumentError ] if the list contains any invalid keys
202
+ def validate_search_index_keys!(keys)
203
+ extras = keys - [ 'name', 'definition', :name, :definition ]
204
+
205
+ raise ArgumentError, "invalid keys in search index creation: #{extras.inspect}" if extras.any?
206
+ end
207
+
208
+ # Validates the name of a search index, ensuring that it is either a
209
+ # String or nil.
210
+ #
211
+ # @param [ nil | String ] name the name of a search index
212
+ #
213
+ # @raise [ ArgumentError ] if the name is not valid
214
+ def validate_search_index_name!(name)
215
+ return if name.nil? || name.is_a?(String)
216
+
217
+ raise ArgumentError, "search index name must be nil or a string (got #{name.inspect})"
218
+ end
219
+
220
+ # Validates the definition of a search index.
221
+ #
222
+ # @param [ Hash ] definition the definition of a search index
223
+ #
224
+ # @raise [ ArgumentError ] if the definition is not valid
225
+ def validate_search_index_definition!(definition)
226
+ return if definition.is_a?(Hash)
227
+
228
+ raise ArgumentError, "search index definition must be a Hash (got #{definition.inspect})"
229
+ end
230
+ end
231
+ end
232
+ end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
- # encoding: utf-8
2
+ # rubocop:todo all
3
3
 
4
4
  # Copyright (C) 2018-2020 MongoDB Inc.
5
5
  #
@@ -23,7 +23,7 @@ module Mongo
23
23
  class Semaphore
24
24
  def initialize
25
25
  @lock = Mutex.new
26
- @cv = ConditionVariable.new
26
+ @cv = ::ConditionVariable.new
27
27
  end
28
28
 
29
29
  # Waits for the semaphore to be signaled up to timeout seconds.
@@ -0,0 +1,314 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Copyright (C) 2016-2023 MongoDB Inc.
4
+ #
5
+ # Licensed under the Apache License, Version 2.0 (the "License");
6
+ # you may not use this file except in compliance with the License.
7
+ # You may obtain a copy of the License at
8
+ #
9
+ # http://www.apache.org/licenses/LICENSE-2.0
10
+ #
11
+ # Unless required by applicable law or agreed to in writing, software
12
+ # distributed under the License is distributed on an "AS IS" BASIS,
13
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ # See the License for the specific language governing permissions and
15
+ # limitations under the License.
16
+
17
+ module Mongo
18
+ class Server
19
+ class AppMetadata
20
+ # Implements the logic from the handshake spec, for deducing and
21
+ # reporting the current environment in which the program is
22
+ # executing.
23
+ #
24
+ # This includes FaaS environment checks, as well as checks for the
25
+ # presence of a container (Docker) and/or orchestrator (Kubernetes).
26
+ #
27
+ # @api private
28
+ class Environment
29
+ # Error class for reporting that too many discriminators were found
30
+ # in the environment. (E.g. if the environment reports that it is
31
+ # running under both AWS and Azure.)
32
+ class TooManyEnvironments < Mongo::Error; end
33
+
34
+ # Error class for reporting that a required environment variable is
35
+ # missing.
36
+ class MissingVariable < Mongo::Error; end
37
+
38
+ # Error class for reporting that the wrong type was given for a
39
+ # field.
40
+ class TypeMismatch < Mongo::Error; end
41
+
42
+ # Error class for reporting that the value for a field is too long.
43
+ class ValueTooLong < Mongo::Error; end
44
+
45
+ # The name and location of the .dockerenv file that will signal the
46
+ # presence of Docker.
47
+ DOCKERENV_PATH = '/.dockerenv'
48
+
49
+ # This value is not explicitly specified in the spec, only implied to be
50
+ # less than 512.
51
+ MAXIMUM_VALUE_LENGTH = 500
52
+
53
+ # The mapping that determines which FaaS environment is active, based
54
+ # on which environment variable(s) are present.
55
+ DISCRIMINATORS = {
56
+ 'AWS_EXECUTION_ENV' => { pattern: /^AWS_Lambda_/, name: 'aws.lambda' },
57
+ 'AWS_LAMBDA_RUNTIME_API' => { name: 'aws.lambda' },
58
+ 'FUNCTIONS_WORKER_RUNTIME' => { name: 'azure.func' },
59
+ 'K_SERVICE' => { name: 'gcp.func' },
60
+ 'FUNCTION_NAME' => { name: 'gcp.func' },
61
+ 'VERCEL' => { name: 'vercel' },
62
+ }.freeze
63
+
64
+ # Describes how to coerce values of the specified type.
65
+ COERCIONS = {
66
+ string: ->(v) { String(v) },
67
+ integer: ->(v) { Integer(v) }
68
+ }.freeze
69
+
70
+ # Describes which fields are required for each FaaS environment,
71
+ # along with their expected types, and how they should be named in
72
+ # the handshake document.
73
+ FIELDS = {
74
+ 'aws.lambda' => {
75
+ 'AWS_REGION' => { field: :region, type: :string },
76
+ 'AWS_LAMBDA_FUNCTION_MEMORY_SIZE' => { field: :memory_mb, type: :integer },
77
+ },
78
+
79
+ 'azure.func' => {},
80
+
81
+ 'gcp.func' => {
82
+ 'FUNCTION_MEMORY_MB' => { field: :memory_mb, type: :integer },
83
+ 'FUNCTION_TIMEOUT_SEC' => { field: :timeout_sec, type: :integer },
84
+ 'FUNCTION_REGION' => { field: :region, type: :string },
85
+ },
86
+
87
+ 'vercel' => {
88
+ 'VERCEL_REGION' => { field: :region, type: :string },
89
+ },
90
+ }.freeze
91
+
92
+ # @return [ String | nil ] the name of the FaaS environment that was
93
+ # detected, or nil if no valid FaaS environment was detected.
94
+ attr_reader :name
95
+
96
+ # @return [ Hash | nil ] the fields describing the detected FaaS
97
+ # environment.
98
+ attr_reader :fields
99
+
100
+ # @return [ String | nil ] the error message explaining why a valid
101
+ # FaaS environment was not detected, or nil if no error occurred.
102
+ #
103
+ # @note These error messagess are not to be propogated to the
104
+ # user; they are intended only for troubleshooting and debugging.)
105
+ attr_reader :error
106
+
107
+ # Create a new AppMetadata::Environment object, initializing it from
108
+ # the current ENV variables. If no FaaS environment is detected, or
109
+ # if the environment contains invalid or contradictory state, it will
110
+ # be initialized with {{name}} set to {{nil}}.
111
+ def initialize
112
+ @fields = {}
113
+ @error = nil
114
+ @name = detect_environment
115
+ populate_faas_fields
116
+ detect_container
117
+ rescue TooManyEnvironments => e
118
+ self.error = "too many environments detected: #{e.message}"
119
+ rescue MissingVariable => e
120
+ self.error = "missing environment variable: #{e.message}"
121
+ rescue TypeMismatch => e
122
+ self.error = e.message
123
+ rescue ValueTooLong => e
124
+ self.error = "value for #{e.message} is too long"
125
+ end
126
+
127
+ # Queries the detected container information.
128
+ #
129
+ # @return [ Hash | nil ] the detected container information, or
130
+ # nil if no container was detected.
131
+ def container
132
+ fields[:container]
133
+ end
134
+
135
+ # Queries whether any environment information was able to be
136
+ # detected.
137
+ #
138
+ # @return [ true | false ] if any environment information was
139
+ # detected.
140
+ def present?
141
+ @name || fields.any?
142
+ end
143
+
144
+ # Queries whether the current environment is a valid FaaS environment.
145
+ #
146
+ # @return [ true | false ] whether the environment is a FaaS
147
+ # environment or not.
148
+ def faas?
149
+ @name != nil
150
+ end
151
+
152
+ # Queries whether the current environment is a valid AWS Lambda
153
+ # environment.
154
+ #
155
+ # @return [ true | false ] whether the environment is a AWS Lambda
156
+ # environment or not.
157
+ def aws?
158
+ @name == 'aws.lambda'
159
+ end
160
+
161
+ # Queries whether the current environment is a valid Azure
162
+ # environment.
163
+ #
164
+ # @return [ true | false ] whether the environment is a Azure
165
+ # environment or not.
166
+ def azure?
167
+ @name == 'azure.func'
168
+ end
169
+
170
+ # Queries whether the current environment is a valid GCP
171
+ # environment.
172
+ #
173
+ # @return [ true | false ] whether the environment is a GCP
174
+ # environment or not.
175
+ def gcp?
176
+ @name == 'gcp.func'
177
+ end
178
+
179
+ # Queries whether the current environment is a valid Vercel
180
+ # environment.
181
+ #
182
+ # @return [ true | false ] whether the environment is a Vercel
183
+ # environment or not.
184
+ def vercel?
185
+ @name == 'vercel'
186
+ end
187
+
188
+ # Compiles the detected environment information into a Hash.
189
+ #
190
+ # @return [ Hash ] the detected environment information.
191
+ def to_h
192
+ name ? fields.merge(name: name) : fields
193
+ end
194
+
195
+ private
196
+
197
+ # Searches the DESCRIMINATORS list to see which (if any) apply to
198
+ # the current environment.
199
+ #
200
+ # @return [ String | nil ] the name of the detected FaaS provider.
201
+ #
202
+ # @raise [ TooManyEnvironments ] if the environment contains
203
+ # discriminating variables for more than one FaaS provider.
204
+ def detect_environment
205
+ matches = DISCRIMINATORS.keys.select { |k| discriminator_matches?(k) }
206
+ names = matches.map { |m| DISCRIMINATORS[m][:name] }.uniq
207
+
208
+ # From the spec:
209
+ # When variables for multiple ``client.env.name`` values are present,
210
+ # ``vercel`` takes precedence over ``aws.lambda``; any other
211
+ # combination MUST cause ``client.env`` to be entirely omitted.
212
+ return 'vercel' if names.sort == %w[ aws.lambda vercel ]
213
+ raise TooManyEnvironments, names.join(', ') if names.length > 1
214
+
215
+ names.first
216
+ end
217
+
218
+ # Looks for the presence of a container. Currently can detect
219
+ # Docker (by the existence of a .dockerenv file in the root
220
+ # directory) and Kubernetes (by the existence of the KUBERNETES_SERVICE_HOST
221
+ # environment variable).
222
+ def detect_container
223
+ runtime = docker_present? && 'docker'
224
+ orchestrator = kubernetes_present? && 'kubernetes'
225
+
226
+ return unless runtime || orchestrator
227
+
228
+ fields[:container] = {}
229
+ fields[:container][:runtime] = runtime if runtime
230
+ fields[:container][:orchestrator] = orchestrator if orchestrator
231
+ end
232
+
233
+ # Checks for the existence of a .dockerenv in the root directory.
234
+ def docker_present?
235
+ File.exist?(dockerenv_path)
236
+ end
237
+
238
+ # Implementing this as a method so that it can be mocked in tests, to
239
+ # test the presence or absence of Docker.
240
+ def dockerenv_path
241
+ DOCKERENV_PATH
242
+ end
243
+
244
+ # Checks for the presence of a non-empty KUBERNETES_SERVICE_HOST
245
+ # environment variable.
246
+ def kubernetes_present?
247
+ !ENV['KUBERNETES_SERVICE_HOST'].to_s.empty?
248
+ end
249
+
250
+ # Determines whether the named environment variable exists, and (if
251
+ # a pattern has been declared for that descriminator) whether the
252
+ # pattern matches the value of the variable.
253
+ #
254
+ # @param [ String ] var the name of the environment variable
255
+ #
256
+ # @return [ true | false ] if the variable describes the current
257
+ # environment or not.
258
+ def discriminator_matches?(var)
259
+ return false unless ENV[var]
260
+
261
+ disc = DISCRIMINATORS[var]
262
+ return true unless disc[:pattern]
263
+
264
+ disc[:pattern].match?(ENV[var])
265
+ end
266
+
267
+ # Extracts environment information from the current environment
268
+ # variables, based on the detected FaaS environment. Populates the
269
+ # {{@fields}} instance variable.
270
+ def populate_faas_fields
271
+ return unless name
272
+
273
+ FIELDS[name].each_with_object(@fields) do |(var, defn), fields|
274
+ fields[defn[:field]] = extract_field(var, defn)
275
+ end
276
+ end
277
+
278
+ # Extracts the named variable from the environment and validates it
279
+ # against its declared definition.
280
+ #
281
+ # @param [ String ] var The name of the environment variable to look
282
+ # for.
283
+ # @param [ Hash ] definition The definition of the field that applies
284
+ # to the named variable.
285
+ #
286
+ # @return [ Integer | String ] the validated and coerced value of the
287
+ # given environment variable.
288
+ #
289
+ # @raise [ MissingVariable ] if the environment does not include a
290
+ # variable required by the current FaaS provider.
291
+ # @raise [ ValueTooLong ] if a required variable is too long.
292
+ # @raise [ TypeMismatch ] if a required variable cannot be coerced to
293
+ # the expected type.
294
+ def extract_field(var, definition)
295
+ raise MissingVariable, var unless ENV[var]
296
+ raise ValueTooLong, var if ENV[var].length > MAXIMUM_VALUE_LENGTH
297
+
298
+ COERCIONS[definition[:type]].call(ENV[var])
299
+ rescue ArgumentError
300
+ raise TypeMismatch,
301
+ "#{var} must be #{definition[:type]} (got #{ENV[var].inspect})"
302
+ end
303
+
304
+ # Sets the error message to the given value and sets the name to nil.
305
+ #
306
+ # @param [ String ] msg The error message to store.
307
+ def error=(msg)
308
+ @name = nil
309
+ @error = msg
310
+ end
311
+ end
312
+ end
313
+ end
314
+ end
@@ -0,0 +1,114 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Copyright (C) 2016-2023 MongoDB Inc.
4
+ #
5
+ # Licensed under the Apache License, Version 2.0 (the "License");
6
+ # you may not use this file except in compliance with the License.
7
+ # You may obtain a copy of the License at
8
+ #
9
+ # http://www.apache.org/licenses/LICENSE-2.0
10
+ #
11
+ # Unless required by applicable law or agreed to in writing, software
12
+ # distributed under the License is distributed on an "AS IS" BASIS,
13
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ # See the License for the specific language governing permissions and
15
+ # limitations under the License.
16
+
17
+ module Mongo
18
+ class Server
19
+ class AppMetadata
20
+ # Implements the logic for building the platform string for the
21
+ # handshake.
22
+ #
23
+ # @api private
24
+ class Platform
25
+ # @return [ Mongo::Server::AppMetadata ] the metadata object to
26
+ # reference when building the platform string.
27
+ attr_reader :metadata
28
+
29
+ # Create a new Platform object, referencing the given metadata object.
30
+ #
31
+ # @param [ Mongo::Server::AppMetadata ] metadata the metadata object
32
+ # the reference when building the platform string.
33
+ def initialize(metadata)
34
+ @metadata = metadata
35
+ end
36
+
37
+ # Queries whether the current runtime is JRuby or not.
38
+ #
39
+ # @return [ true | false ] whether the runtime is JRuby or not.
40
+ def jruby?
41
+ BSON::Environment.jruby?
42
+ end
43
+
44
+ # Returns the list of Ruby versions that identify this runtime.
45
+ #
46
+ # @return [ Array<String> ] the list of ruby versions
47
+ def ruby_versions
48
+ if jruby?
49
+ [ "JRuby #{JRUBY_VERSION}", "like Ruby #{RUBY_VERSION}" ]
50
+ else
51
+ [ "Ruby #{RUBY_VERSION}" ]
52
+ end
53
+ end
54
+
55
+ # Returns the list of platform identifiers that identify this runtime.
56
+ #
57
+ # @return [ Array<String> ] the list of platform identifiers.
58
+ def platforms
59
+ [ RUBY_PLATFORM ].tap do |list|
60
+ list.push "JVM #{java_version}" if jruby?
61
+ end
62
+ end
63
+
64
+ # Returns the version of the current Java environment, or nil if not
65
+ # invoked with JRuby.
66
+ #
67
+ # @return [ String | nil ] the current Java version
68
+ def java_version
69
+ return nil unless jruby?
70
+
71
+ java.lang.System.get_property('java.version')
72
+ end
73
+
74
+ # Builds and returns the default platform list, for use when building
75
+ # the platform string.
76
+ #
77
+ # @return [ Array<String> ] the list of platform identifiers
78
+ def default_platform_list
79
+ [
80
+ metadata.platform,
81
+ *ruby_versions,
82
+ *platforms,
83
+ RbConfig::CONFIG['build']
84
+ ]
85
+ end
86
+
87
+ # Returns a single letter representing the purpose reported to the
88
+ # metadata, or nil if no purpose was specified.
89
+ #
90
+ # @return [ String | nil ] the code representing the purpose
91
+ def purpose
92
+ return nil unless metadata.purpose
93
+
94
+ metadata.purpose.to_s[0].upcase
95
+ end
96
+
97
+ # Builds and returns the platform string by concatenating relevant
98
+ # values together.
99
+ #
100
+ # @return [ String ] the platform string
101
+ def to_s
102
+ primary = [ *default_platform_list, purpose ].compact.join(', ')
103
+ list = [ primary ]
104
+
105
+ metadata.wrapping_libraries&.each do |library|
106
+ list << (library[:platform] || '')
107
+ end
108
+
109
+ list.join('|')
110
+ end
111
+ end
112
+ end
113
+ end
114
+ end