mongo 2.13.1 → 2.19.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1899) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data/README.md +36 -39
  4. data/Rakefile +49 -20
  5. data/bin/mongo_console +2 -0
  6. data/lib/mongo/active_support.rb +3 -0
  7. data/lib/mongo/address/ipv4.rb +4 -1
  8. data/lib/mongo/address/ipv6.rb +4 -1
  9. data/lib/mongo/address/unix.rb +3 -0
  10. data/lib/mongo/address/validator.rb +3 -0
  11. data/lib/mongo/address.rb +4 -1
  12. data/lib/mongo/auth/aws/conversation.rb +4 -8
  13. data/lib/mongo/auth/aws/credentials.rb +38 -0
  14. data/lib/mongo/auth/aws/credentials_cache.rb +75 -0
  15. data/lib/mongo/auth/aws/credentials_retriever.rb +174 -36
  16. data/lib/mongo/auth/aws/request.rb +3 -2
  17. data/lib/mongo/auth/aws.rb +8 -5
  18. data/lib/mongo/auth/base.rb +25 -9
  19. data/lib/mongo/auth/conversation_base.rb +35 -0
  20. data/lib/mongo/auth/cr/conversation.rb +9 -29
  21. data/lib/mongo/auth/cr.rb +3 -0
  22. data/lib/mongo/auth/credential_cache.rb +3 -0
  23. data/lib/mongo/auth/gssapi/conversation.rb +7 -15
  24. data/lib/mongo/auth/gssapi.rb +3 -0
  25. data/lib/mongo/auth/ldap/conversation.rb +6 -14
  26. data/lib/mongo/auth/ldap.rb +3 -0
  27. data/lib/mongo/auth/roles.rb +19 -16
  28. data/lib/mongo/auth/sasl_conversation_base.rb +4 -13
  29. data/lib/mongo/auth/scram/conversation.rb +3 -0
  30. data/lib/mongo/auth/scram.rb +5 -2
  31. data/lib/mongo/auth/scram256/conversation.rb +3 -0
  32. data/lib/mongo/auth/scram256.rb +3 -0
  33. data/lib/mongo/auth/scram_conversation_base.rb +10 -34
  34. data/lib/mongo/auth/stringprep/profiles/sasl.rb +3 -0
  35. data/lib/mongo/auth/stringprep/tables.rb +3 -0
  36. data/lib/mongo/auth/stringprep/unicode_normalize/normalize.rb +2 -2
  37. data/lib/mongo/auth/stringprep/unicode_normalize/tables.rb +2 -1
  38. data/lib/mongo/auth/stringprep.rb +4 -1
  39. data/lib/mongo/auth/user/view.rb +19 -9
  40. data/lib/mongo/auth/user.rb +3 -0
  41. data/lib/mongo/auth/x509/conversation.rb +7 -25
  42. data/lib/mongo/auth/x509.rb +3 -0
  43. data/lib/mongo/auth.rb +16 -2
  44. data/lib/mongo/background_thread.rb +16 -2
  45. data/lib/mongo/bson.rb +3 -0
  46. data/lib/mongo/bulk_write/combineable.rb +3 -0
  47. data/lib/mongo/bulk_write/ordered_combiner.rb +3 -0
  48. data/lib/mongo/bulk_write/result.rb +13 -1
  49. data/lib/mongo/bulk_write/result_combiner.rb +5 -4
  50. data/lib/mongo/bulk_write/transformable.rb +3 -0
  51. data/lib/mongo/bulk_write/unordered_combiner.rb +3 -0
  52. data/lib/mongo/bulk_write/validatable.rb +3 -0
  53. data/lib/mongo/bulk_write.rb +156 -45
  54. data/lib/mongo/caching_cursor.rb +77 -0
  55. data/lib/mongo/client.rb +367 -41
  56. data/lib/mongo/client_encryption.rb +217 -10
  57. data/lib/mongo/cluster/periodic_executor.rb +7 -3
  58. data/lib/mongo/cluster/reapers/cursor_reaper.rb +101 -43
  59. data/lib/mongo/cluster/reapers/socket_reaper.rb +4 -1
  60. data/lib/mongo/cluster/sdam_flow.rb +67 -17
  61. data/lib/mongo/cluster/topology/base.rb +16 -9
  62. data/lib/mongo/cluster/topology/load_balanced.rb +102 -0
  63. data/lib/mongo/cluster/topology/no_replica_set_options.rb +3 -0
  64. data/lib/mongo/cluster/topology/replica_set_no_primary.rb +3 -0
  65. data/lib/mongo/cluster/topology/replica_set_with_primary.rb +3 -0
  66. data/lib/mongo/cluster/topology/sharded.rb +3 -0
  67. data/lib/mongo/cluster/topology/single.rb +4 -1
  68. data/lib/mongo/cluster/topology/unknown.rb +3 -0
  69. data/lib/mongo/cluster/topology.rb +31 -8
  70. data/lib/mongo/cluster.rb +210 -116
  71. data/lib/mongo/cluster_time.rb +3 -0
  72. data/lib/mongo/collection/helpers.rb +43 -0
  73. data/lib/mongo/collection/queryable_encryption.rb +162 -0
  74. data/lib/mongo/collection/view/aggregation.rb +94 -24
  75. data/lib/mongo/collection/view/builder/aggregation.rb +19 -17
  76. data/lib/mongo/collection/view/builder/map_reduce.rb +18 -49
  77. data/lib/mongo/collection/view/builder.rb +3 -4
  78. data/lib/mongo/collection/view/change_stream/retryable.rb +3 -0
  79. data/lib/mongo/collection/view/change_stream.rb +71 -22
  80. data/lib/mongo/collection/view/explainable.rb +30 -8
  81. data/lib/mongo/collection/view/immutable.rb +3 -0
  82. data/lib/mongo/collection/view/iterable.rb +121 -24
  83. data/lib/mongo/collection/view/map_reduce.rb +76 -25
  84. data/lib/mongo/collection/view/readable.rb +147 -67
  85. data/lib/mongo/collection/view/writable.rb +296 -162
  86. data/lib/mongo/collection/view.rb +42 -41
  87. data/lib/mongo/collection.rb +356 -89
  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 +3 -0
  93. data/lib/mongo/crypt/auto_encrypter.rb +142 -15
  94. data/lib/mongo/crypt/auto_encryption_context.rb +3 -0
  95. data/lib/mongo/crypt/binary.rb +3 -0
  96. data/lib/mongo/crypt/binding.rb +717 -151
  97. data/lib/mongo/crypt/context.rb +74 -5
  98. data/lib/mongo/crypt/data_key_context.rb +15 -104
  99. data/lib/mongo/crypt/encryption_io.rb +101 -64
  100. data/lib/mongo/crypt/explicit_decryption_context.rb +3 -0
  101. data/lib/mongo/crypt/explicit_encrypter.rb +235 -29
  102. data/lib/mongo/crypt/explicit_encryption_context.rb +78 -21
  103. data/lib/mongo/crypt/explicit_encryption_expression_context.rb +30 -0
  104. data/lib/mongo/crypt/handle.rb +171 -86
  105. data/lib/mongo/crypt/hooks.rb +28 -2
  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 +122 -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 +58 -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 +3 -0
  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 +11 -2
  131. data/lib/mongo/crypt.rb +18 -0
  132. data/lib/mongo/cursor/kill_spec.rb +76 -0
  133. data/lib/mongo/cursor.rb +150 -43
  134. data/lib/mongo/database/view.rb +55 -10
  135. data/lib/mongo/database.rb +95 -25
  136. data/lib/mongo/dbref.rb +4 -105
  137. data/lib/mongo/distinguishing_semaphore.rb +4 -1
  138. data/lib/mongo/error/auth_error.rb +3 -0
  139. data/lib/mongo/error/bad_load_balancer_target.rb +26 -0
  140. data/lib/mongo/error/bulk_write_error.rb +49 -5
  141. data/lib/mongo/error/change_stream_resumable.rb +3 -0
  142. data/lib/mongo/error/client_closed.rb +24 -0
  143. data/lib/mongo/error/closed_stream.rb +3 -0
  144. data/lib/mongo/error/connection_check_out_timeout.rb +3 -0
  145. data/lib/mongo/error/connection_perished.rb +5 -0
  146. data/lib/mongo/error/connection_unavailable.rb +27 -0
  147. data/lib/mongo/error/credential_check_error.rb +3 -0
  148. data/lib/mongo/error/crypt_error.rb +3 -0
  149. data/lib/mongo/error/extra_file_chunk.rb +3 -0
  150. data/lib/mongo/error/failed_string_prep_validation.rb +3 -0
  151. data/lib/mongo/error/file_not_found.rb +3 -0
  152. data/lib/mongo/error/handshake_error.rb +3 -0
  153. data/lib/mongo/error/insufficient_iteration_count.rb +3 -0
  154. data/lib/mongo/error/internal_driver_error.rb +25 -0
  155. data/lib/mongo/error/invalid_address.rb +3 -0
  156. data/lib/mongo/error/invalid_application_name.rb +3 -0
  157. data/lib/mongo/error/invalid_bulk_operation.rb +3 -0
  158. data/lib/mongo/error/invalid_bulk_operation_type.rb +3 -0
  159. data/lib/mongo/error/invalid_collection_name.rb +3 -0
  160. data/lib/mongo/error/invalid_config_option.rb +21 -0
  161. data/lib/mongo/error/invalid_cursor_operation.rb +3 -0
  162. data/lib/mongo/error/invalid_database_name.rb +3 -0
  163. data/lib/mongo/error/invalid_document.rb +3 -0
  164. data/lib/mongo/error/invalid_file.rb +3 -0
  165. data/lib/mongo/error/invalid_file_revision.rb +3 -0
  166. data/lib/mongo/error/invalid_max_connecting.rb +28 -0
  167. data/lib/mongo/error/invalid_min_pool_size.rb +3 -0
  168. data/lib/mongo/error/invalid_nonce.rb +3 -0
  169. data/lib/mongo/error/invalid_read_concern.rb +31 -0
  170. data/lib/mongo/error/invalid_read_option.rb +4 -1
  171. data/lib/mongo/error/invalid_replacement_document.rb +30 -9
  172. data/lib/mongo/error/invalid_server_auth_host.rb +3 -0
  173. data/lib/mongo/error/invalid_server_auth_response.rb +3 -0
  174. data/lib/mongo/error/invalid_server_preference.rb +3 -0
  175. data/lib/mongo/error/invalid_session.rb +3 -0
  176. data/lib/mongo/error/invalid_signature.rb +3 -0
  177. data/lib/mongo/error/invalid_transaction_operation.rb +3 -0
  178. data/lib/mongo/error/invalid_txt_record.rb +3 -0
  179. data/lib/mongo/error/invalid_update_document.rb +30 -7
  180. data/lib/mongo/error/invalid_uri.rb +3 -0
  181. data/lib/mongo/error/invalid_write_concern.rb +3 -0
  182. data/lib/mongo/error/kms_error.rb +3 -0
  183. data/lib/mongo/error/labelable.rb +72 -0
  184. data/lib/mongo/error/lint_error.rb +3 -0
  185. data/lib/mongo/error/max_bson_size.rb +3 -0
  186. data/lib/mongo/error/max_message_size.rb +3 -0
  187. data/lib/mongo/error/mismatched_domain.rb +3 -0
  188. data/lib/mongo/error/missing_connection.rb +27 -0
  189. data/lib/mongo/error/missing_file_chunk.rb +11 -2
  190. data/lib/mongo/error/missing_password.rb +3 -0
  191. data/lib/mongo/error/missing_resume_token.rb +3 -0
  192. data/lib/mongo/error/missing_scram_server_signature.rb +3 -0
  193. data/lib/mongo/error/missing_service_id.rb +26 -0
  194. data/lib/mongo/error/mongocryptd_spawn_error.rb +3 -0
  195. data/lib/mongo/error/multi_index_drop.rb +3 -0
  196. data/lib/mongo/error/need_primary_server.rb +3 -0
  197. data/lib/mongo/error/no_server_available.rb +3 -0
  198. data/lib/mongo/error/no_service_connection_available.rb +49 -0
  199. data/lib/mongo/error/no_srv_records.rb +3 -0
  200. data/lib/mongo/error/notable.rb +24 -0
  201. data/lib/mongo/error/operation_failure.rb +57 -87
  202. data/lib/mongo/error/parser.rb +69 -13
  203. data/lib/mongo/error/pool_cleared_error.rb +40 -0
  204. data/lib/mongo/error/pool_closed_error.rb +6 -16
  205. data/lib/mongo/error/pool_error.rb +45 -0
  206. data/lib/mongo/error/pool_paused_error.rb +40 -0
  207. data/lib/mongo/error/raise_original_error.rb +3 -0
  208. data/lib/mongo/error/read_write_retryable.rb +108 -0
  209. data/lib/mongo/error/sdam_error_detection.rb +16 -5
  210. data/lib/mongo/error/server_api_conflict.rb +26 -0
  211. data/lib/mongo/error/server_api_not_supported.rb +27 -0
  212. data/lib/mongo/error/server_certificate_revoked.rb +25 -0
  213. data/lib/mongo/error/server_not_usable.rb +36 -0
  214. data/lib/mongo/error/session_ended.rb +3 -0
  215. data/lib/mongo/error/session_not_materialized.rb +29 -0
  216. data/lib/mongo/error/sessions_not_supported.rb +3 -0
  217. data/lib/mongo/error/snapshot_session_invalid_server_version.rb +31 -0
  218. data/lib/mongo/error/snapshot_session_transaction_prohibited.rb +30 -0
  219. data/lib/mongo/error/socket_error.rb +3 -0
  220. data/lib/mongo/error/socket_timeout_error.rb +3 -0
  221. data/lib/mongo/error/unchangeable_collection_option.rb +3 -0
  222. data/lib/mongo/error/unexpected_chunk_length.rb +3 -0
  223. data/lib/mongo/error/unexpected_response.rb +3 -0
  224. data/lib/mongo/error/unknown_payload_type.rb +3 -0
  225. data/lib/mongo/error/unmet_dependency.rb +24 -0
  226. data/lib/mongo/error/unsupported_array_filters.rb +3 -0
  227. data/lib/mongo/error/unsupported_collation.rb +3 -0
  228. data/lib/mongo/error/unsupported_features.rb +3 -0
  229. data/lib/mongo/error/unsupported_message_type.rb +3 -0
  230. data/lib/mongo/error/unsupported_option.rb +17 -12
  231. data/lib/mongo/error/write_retryable.rb +3 -0
  232. data/lib/mongo/error.rb +31 -38
  233. data/lib/mongo/event/base.rb +3 -0
  234. data/lib/mongo/event/listeners.rb +3 -0
  235. data/lib/mongo/event/publisher.rb +3 -0
  236. data/lib/mongo/event/subscriber.rb +3 -0
  237. data/lib/mongo/event.rb +3 -0
  238. data/lib/mongo/grid/file/chunk.rb +6 -2
  239. data/lib/mongo/grid/file/info.rb +5 -1
  240. data/lib/mongo/grid/file.rb +3 -0
  241. data/lib/mongo/grid/fs_bucket.rb +86 -46
  242. data/lib/mongo/grid/stream/read.rb +28 -7
  243. data/lib/mongo/grid/stream/write.rb +3 -0
  244. data/lib/mongo/grid/stream.rb +3 -0
  245. data/lib/mongo/grid.rb +3 -0
  246. data/lib/mongo/id.rb +10 -5
  247. data/lib/mongo/index/view.rb +68 -58
  248. data/lib/mongo/index.rb +3 -0
  249. data/lib/mongo/lint.rb +5 -1
  250. data/lib/mongo/loggable.rb +5 -2
  251. data/lib/mongo/logger.rb +6 -3
  252. data/lib/mongo/monitoring/cmap_log_subscriber.rb +3 -0
  253. data/lib/mongo/monitoring/command_log_subscriber.rb +3 -0
  254. data/lib/mongo/monitoring/event/cmap/base.rb +3 -0
  255. data/lib/mongo/monitoring/event/cmap/connection_check_out_failed.rb +3 -0
  256. data/lib/mongo/monitoring/event/cmap/connection_check_out_started.rb +3 -0
  257. data/lib/mongo/monitoring/event/cmap/connection_checked_in.rb +3 -0
  258. data/lib/mongo/monitoring/event/cmap/connection_checked_out.rb +3 -0
  259. data/lib/mongo/monitoring/event/cmap/connection_closed.rb +3 -0
  260. data/lib/mongo/monitoring/event/cmap/connection_created.rb +3 -0
  261. data/lib/mongo/monitoring/event/cmap/connection_ready.rb +3 -0
  262. data/lib/mongo/monitoring/event/cmap/pool_cleared.rb +17 -4
  263. data/lib/mongo/monitoring/event/cmap/pool_closed.rb +3 -0
  264. data/lib/mongo/monitoring/event/cmap/pool_created.rb +3 -0
  265. data/lib/mongo/monitoring/event/cmap/pool_ready.rb +67 -0
  266. data/lib/mongo/monitoring/event/cmap.rb +4 -0
  267. data/lib/mongo/monitoring/event/command_failed.rb +38 -5
  268. data/lib/mongo/monitoring/event/command_started.rb +23 -3
  269. data/lib/mongo/monitoring/event/command_succeeded.rb +36 -3
  270. data/lib/mongo/monitoring/event/secure.rb +39 -5
  271. data/lib/mongo/monitoring/event/server_closed.rb +3 -0
  272. data/lib/mongo/monitoring/event/server_description_changed.rb +4 -1
  273. data/lib/mongo/monitoring/event/server_heartbeat_failed.rb +32 -18
  274. data/lib/mongo/monitoring/event/server_heartbeat_started.rb +3 -0
  275. data/lib/mongo/monitoring/event/server_heartbeat_succeeded.rb +30 -16
  276. data/lib/mongo/monitoring/event/server_opening.rb +3 -0
  277. data/lib/mongo/monitoring/event/topology_changed.rb +3 -0
  278. data/lib/mongo/monitoring/event/topology_closed.rb +3 -0
  279. data/lib/mongo/monitoring/event/topology_opening.rb +3 -0
  280. data/lib/mongo/monitoring/event.rb +3 -0
  281. data/lib/mongo/monitoring/publishable.rb +38 -12
  282. data/lib/mongo/monitoring/sdam_log_subscriber.rb +3 -0
  283. data/lib/mongo/monitoring/server_closed_log_subscriber.rb +3 -0
  284. data/lib/mongo/monitoring/server_description_changed_log_subscriber.rb +3 -0
  285. data/lib/mongo/monitoring/server_opening_log_subscriber.rb +3 -0
  286. data/lib/mongo/monitoring/topology_changed_log_subscriber.rb +3 -0
  287. data/lib/mongo/monitoring/topology_closed_log_subscriber.rb +3 -0
  288. data/lib/mongo/monitoring/topology_opening_log_subscriber.rb +3 -0
  289. data/lib/mongo/monitoring/unified_sdam_log_subscriber.rb +3 -0
  290. data/lib/mongo/monitoring.rb +20 -8
  291. data/lib/mongo/operation/aggregate/op_msg.rb +3 -0
  292. data/lib/mongo/operation/aggregate/result.rb +12 -8
  293. data/lib/mongo/operation/aggregate.rb +4 -2
  294. data/lib/mongo/operation/collections_info/result.rb +24 -1
  295. data/lib/mongo/operation/collections_info.rb +10 -2
  296. data/lib/mongo/operation/command/op_msg.rb +9 -0
  297. data/lib/mongo/operation/command.rb +4 -2
  298. data/lib/mongo/operation/context.rb +138 -0
  299. data/lib/mongo/operation/count/op_msg.rb +12 -0
  300. data/lib/mongo/operation/count.rb +4 -2
  301. data/lib/mongo/operation/create/op_msg.rb +13 -0
  302. data/lib/mongo/operation/create.rb +4 -2
  303. data/lib/mongo/operation/create_index/op_msg.rb +21 -4
  304. data/lib/mongo/operation/create_index.rb +4 -2
  305. data/lib/mongo/operation/create_user/op_msg.rb +3 -0
  306. data/lib/mongo/operation/create_user.rb +4 -2
  307. data/lib/mongo/operation/delete/bulk_result.rb +5 -0
  308. data/lib/mongo/operation/delete/op_msg.rb +13 -1
  309. data/lib/mongo/operation/delete/result.rb +6 -0
  310. data/lib/mongo/operation/delete.rb +3 -2
  311. data/lib/mongo/operation/distinct/op_msg.rb +13 -0
  312. data/lib/mongo/operation/distinct.rb +4 -2
  313. data/lib/mongo/operation/drop/op_msg.rb +3 -0
  314. data/lib/mongo/operation/drop.rb +4 -2
  315. data/lib/mongo/operation/drop_database/op_msg.rb +3 -0
  316. data/lib/mongo/operation/drop_database.rb +4 -2
  317. data/lib/mongo/operation/drop_index/op_msg.rb +8 -1
  318. data/lib/mongo/operation/drop_index.rb +4 -2
  319. data/lib/mongo/operation/explain/op_msg.rb +17 -0
  320. data/lib/mongo/operation/explain/result.rb +6 -0
  321. data/lib/mongo/operation/explain.rb +4 -3
  322. data/lib/mongo/operation/find/builder/command.rb +111 -0
  323. data/lib/mongo/operation/find/builder/flags.rb +61 -0
  324. data/lib/mongo/operation/find/builder/modifiers.rb +89 -0
  325. data/lib/mongo/operation/find/builder.rb +20 -0
  326. data/lib/mongo/operation/find/op_msg.rb +15 -0
  327. data/lib/mongo/operation/find/result.rb +16 -0
  328. data/lib/mongo/operation/find.rb +5 -3
  329. data/lib/mongo/operation/get_more/command_builder.rb +42 -0
  330. data/lib/mongo/operation/get_more/op_msg.rb +4 -0
  331. data/lib/mongo/operation/get_more/result.rb +6 -0
  332. data/lib/mongo/operation/get_more.rb +5 -3
  333. data/lib/mongo/operation/indexes/op_msg.rb +3 -0
  334. data/lib/mongo/operation/indexes/result.rb +8 -0
  335. data/lib/mongo/operation/indexes.rb +4 -3
  336. data/lib/mongo/operation/insert/bulk_result.rb +13 -1
  337. data/lib/mongo/operation/insert/op_msg.rb +11 -5
  338. data/lib/mongo/operation/insert/result.rb +14 -3
  339. data/lib/mongo/operation/insert.rb +3 -2
  340. data/lib/mongo/operation/kill_cursors/command_builder.rb +35 -0
  341. data/lib/mongo/operation/kill_cursors/op_msg.rb +13 -0
  342. data/lib/mongo/operation/kill_cursors.rb +5 -3
  343. data/lib/mongo/operation/list_collections/op_msg.rb +7 -1
  344. data/lib/mongo/operation/list_collections/result.rb +12 -1
  345. data/lib/mongo/operation/list_collections.rb +4 -2
  346. data/lib/mongo/operation/map_reduce/op_msg.rb +4 -1
  347. data/lib/mongo/operation/map_reduce/result.rb +29 -0
  348. data/lib/mongo/operation/map_reduce.rb +4 -2
  349. data/lib/mongo/operation/op_msg_base.rb +3 -0
  350. data/lib/mongo/operation/parallel_scan/op_msg.rb +3 -0
  351. data/lib/mongo/operation/parallel_scan/result.rb +7 -0
  352. data/lib/mongo/operation/parallel_scan.rb +4 -2
  353. data/lib/mongo/operation/remove_user/op_msg.rb +3 -0
  354. data/lib/mongo/operation/remove_user.rb +4 -2
  355. data/lib/mongo/operation/result.rb +67 -11
  356. data/lib/mongo/operation/shared/bypass_document_validation.rb +4 -0
  357. data/lib/mongo/operation/shared/causal_consistency_supported.rb +4 -0
  358. data/lib/mongo/operation/shared/executable.rb +61 -17
  359. data/lib/mongo/operation/shared/executable_no_validate.rb +5 -2
  360. data/lib/mongo/operation/shared/executable_transaction_label.rb +3 -0
  361. data/lib/mongo/operation/shared/idable.rb +5 -1
  362. data/lib/mongo/operation/shared/limited.rb +4 -0
  363. data/lib/mongo/operation/shared/object_id_generator.rb +4 -0
  364. data/lib/mongo/operation/shared/op_msg_executable.rb +59 -0
  365. data/lib/mongo/operation/shared/polymorphic_lookup.rb +3 -0
  366. data/lib/mongo/operation/shared/polymorphic_result.rb +3 -0
  367. data/lib/mongo/operation/shared/read_preference_supported.rb +44 -37
  368. data/lib/mongo/operation/shared/response_handling.rb +32 -27
  369. data/lib/mongo/operation/shared/result/aggregatable.rb +4 -0
  370. data/lib/mongo/operation/shared/result/use_legacy_error_parser.rb +3 -0
  371. data/lib/mongo/operation/shared/sessions_supported.rb +55 -20
  372. data/lib/mongo/operation/shared/specifiable.rb +15 -29
  373. data/lib/mongo/operation/shared/validatable.rb +87 -0
  374. data/lib/mongo/operation/shared/write.rb +28 -28
  375. data/lib/mongo/operation/shared/write_concern_supported.rb +4 -0
  376. data/lib/mongo/operation/update/bulk_result.rb +3 -0
  377. data/lib/mongo/operation/update/op_msg.rb +12 -4
  378. data/lib/mongo/operation/update/result.rb +11 -0
  379. data/lib/mongo/operation/update.rb +3 -2
  380. data/lib/mongo/operation/update_user/op_msg.rb +3 -0
  381. data/lib/mongo/operation/update_user.rb +4 -2
  382. data/lib/mongo/operation/users_info/op_msg.rb +3 -0
  383. data/lib/mongo/operation/users_info/result.rb +6 -0
  384. data/lib/mongo/operation/users_info.rb +4 -2
  385. data/lib/mongo/operation/write_command/op_msg.rb +43 -0
  386. data/lib/mongo/operation/write_command.rb +31 -0
  387. data/lib/mongo/operation.rb +17 -4
  388. data/lib/mongo/options/mapper.rb +3 -0
  389. data/lib/mongo/options/redacted.rb +3 -0
  390. data/lib/mongo/options.rb +3 -0
  391. data/lib/mongo/protocol/bit_vector.rb +6 -1
  392. data/lib/mongo/protocol/caching_hash.rb +52 -0
  393. data/lib/mongo/protocol/compressed.rb +54 -5
  394. data/lib/mongo/protocol/get_more.rb +3 -0
  395. data/lib/mongo/protocol/kill_cursors.rb +3 -0
  396. data/lib/mongo/protocol/message.rb +27 -10
  397. data/lib/mongo/protocol/msg.rb +61 -17
  398. data/lib/mongo/protocol/query.rb +53 -32
  399. data/lib/mongo/protocol/registry.rb +3 -0
  400. data/lib/mongo/protocol/reply.rb +3 -0
  401. data/lib/mongo/protocol/serializers.rb +27 -17
  402. data/lib/mongo/protocol.rb +4 -3
  403. data/lib/mongo/query_cache.rb +300 -0
  404. data/lib/mongo/retryable/base_worker.rb +91 -0
  405. data/lib/mongo/retryable/read_worker.rb +296 -0
  406. data/lib/mongo/retryable/write_worker.rb +364 -0
  407. data/lib/mongo/retryable.rb +33 -446
  408. data/lib/mongo/semaphore.rb +4 -1
  409. data/lib/mongo/server/app_metadata/environment.rb +259 -0
  410. data/lib/mongo/server/app_metadata/platform.rb +114 -0
  411. data/lib/mongo/server/app_metadata/truncator.rb +142 -0
  412. data/lib/mongo/server/app_metadata.rb +117 -94
  413. data/lib/mongo/server/connection.rb +126 -22
  414. data/lib/mongo/server/connection_base.rb +49 -21
  415. data/lib/mongo/server/connection_common.rb +76 -3
  416. data/lib/mongo/server/connection_pool/generation_manager.rb +115 -0
  417. data/lib/mongo/server/connection_pool/populator.rb +35 -30
  418. data/lib/mongo/server/connection_pool.rb +776 -206
  419. data/lib/mongo/server/description/features.rb +34 -25
  420. data/lib/mongo/server/description/load_balancer.rb +33 -0
  421. data/lib/mongo/server/description.rb +126 -17
  422. data/lib/mongo/server/monitor/app_metadata.rb +4 -1
  423. data/lib/mongo/server/monitor/connection.rb +66 -50
  424. data/lib/mongo/server/monitor.rb +62 -32
  425. data/lib/mongo/server/pending_connection.rb +77 -44
  426. data/lib/mongo/server/push_monitor/connection.rb +3 -0
  427. data/lib/mongo/server/push_monitor.rb +54 -20
  428. data/lib/mongo/server/round_trip_time_averager.rb +6 -3
  429. data/lib/mongo/server.rb +197 -67
  430. data/lib/mongo/server_selector/base.rb +65 -11
  431. data/lib/mongo/server_selector/nearest.rb +6 -4
  432. data/lib/mongo/server_selector/primary.rb +6 -4
  433. data/lib/mongo/server_selector/primary_preferred.rb +6 -4
  434. data/lib/mongo/server_selector/secondary.rb +6 -4
  435. data/lib/mongo/server_selector/secondary_preferred.rb +8 -11
  436. data/lib/mongo/server_selector.rb +3 -0
  437. data/lib/mongo/session/server_session.rb +3 -0
  438. data/lib/mongo/session/session_pool.rb +26 -2
  439. data/lib/mongo/session.rb +164 -38
  440. data/lib/mongo/socket/ocsp_cache.rb +99 -0
  441. data/lib/mongo/socket/ocsp_verifier.rb +344 -0
  442. data/lib/mongo/socket/ssl.rb +56 -24
  443. data/lib/mongo/socket/tcp.rb +6 -0
  444. data/lib/mongo/socket/unix.rb +3 -0
  445. data/lib/mongo/socket.rb +71 -16
  446. data/lib/mongo/srv/monitor.rb +10 -26
  447. data/lib/mongo/srv/resolver.rb +41 -13
  448. data/lib/mongo/srv/result.rb +3 -0
  449. data/lib/mongo/srv.rb +3 -0
  450. data/lib/mongo/timeout.rb +6 -1
  451. data/lib/mongo/topology_version.rb +4 -1
  452. data/lib/mongo/uri/options_mapper.rb +867 -0
  453. data/lib/mongo/uri/srv_protocol.rb +13 -11
  454. data/lib/mongo/uri.rb +100 -400
  455. data/lib/mongo/utils.rb +44 -1
  456. data/lib/mongo/version.rb +4 -1
  457. data/lib/mongo/write_concern/acknowledged.rb +3 -0
  458. data/lib/mongo/write_concern/base.rb +3 -0
  459. data/lib/mongo/write_concern/unacknowledged.rb +3 -0
  460. data/lib/mongo/write_concern.rb +3 -0
  461. data/lib/mongo.rb +58 -0
  462. data/mongo.gemspec +16 -7
  463. data/spec/NOTES.aws-auth.md +12 -7
  464. data/spec/README.md +106 -3
  465. data/spec/atlas/atlas_connectivity_spec.rb +3 -0
  466. data/spec/atlas/operations_spec.rb +5 -7
  467. data/spec/integration/auth_spec.rb +58 -15
  468. data/spec/integration/awaited_ismaster_spec.rb +9 -6
  469. data/spec/integration/aws_auth_credentials_cache_spec.rb +51 -0
  470. data/spec/integration/aws_auth_request_spec.rb +4 -1
  471. data/spec/integration/aws_credentials_retriever_spec.rb +34 -1
  472. data/spec/integration/aws_lambda_examples_spec.rb +68 -0
  473. data/spec/integration/bson_symbol_spec.rb +8 -3
  474. data/spec/integration/bulk_insert_spec.rb +3 -0
  475. data/spec/integration/bulk_write_error_message_spec.rb +74 -0
  476. data/spec/integration/bulk_write_spec.rb +67 -0
  477. data/spec/integration/change_stream_examples_spec.rb +3 -0
  478. data/spec/integration/change_stream_spec.rb +18 -9
  479. data/spec/integration/check_clean_slate_spec.rb +3 -0
  480. data/spec/integration/client_authentication_options_spec.rb +76 -36
  481. data/spec/integration/client_connectivity_spec.rb +4 -1
  482. data/spec/integration/client_construction_aws_auth_spec.rb +14 -2
  483. data/spec/integration/client_construction_spec.rb +153 -8
  484. data/spec/integration/client_side_encryption/auto_encryption_bulk_writes_spec.rb +13 -10
  485. data/spec/integration/client_side_encryption/auto_encryption_command_monitoring_spec.rb +172 -169
  486. data/spec/integration/client_side_encryption/auto_encryption_mongocryptd_spawn_spec.rb +3 -1
  487. data/spec/integration/client_side_encryption/auto_encryption_old_wire_version_spec.rb +3 -0
  488. data/spec/integration/client_side_encryption/auto_encryption_reconnect_spec.rb +43 -4
  489. data/spec/integration/client_side_encryption/auto_encryption_spec.rb +148 -2
  490. data/spec/integration/client_side_encryption/automatic_data_encryption_keys_prose_spec.rb +153 -0
  491. data/spec/integration/client_side_encryption/bson_size_limit_spec.rb +6 -3
  492. data/spec/integration/client_side_encryption/bypass_mongocryptd_spawn_spec.rb +6 -3
  493. data/spec/integration/client_side_encryption/client_close_spec.rb +4 -1
  494. data/spec/integration/client_side_encryption/corpus_spec.rb +67 -35
  495. data/spec/integration/client_side_encryption/custom_endpoint_spec.rb +42 -42
  496. data/spec/integration/client_side_encryption/data_key_spec.rb +101 -8
  497. data/spec/integration/client_side_encryption/decryption_events_prose_spec.rb +159 -0
  498. data/spec/integration/client_side_encryption/explicit_encryption_spec.rb +62 -0
  499. data/spec/integration/client_side_encryption/explicit_queryable_encryption_spec.rb +150 -0
  500. data/spec/integration/client_side_encryption/external_key_vault_spec.rb +9 -6
  501. data/spec/integration/client_side_encryption/kms_tls_options_spec.rb +436 -0
  502. data/spec/integration/client_side_encryption/kms_tls_spec.rb +92 -0
  503. data/spec/integration/client_side_encryption/mongocryptd_prose_spec.rb +105 -0
  504. data/spec/integration/client_side_encryption/on_demand_aws_credentials_spec.rb +49 -0
  505. data/spec/integration/client_side_encryption/on_demand_azure_credentials_spec.rb +46 -0
  506. data/spec/integration/client_side_encryption/on_demand_gcp_credentials_spec.rb +47 -0
  507. data/spec/integration/client_side_encryption/queryable_encryption_examples_spec.rb +114 -0
  508. data/spec/integration/client_side_encryption/range_explicit_encryption_prose_spec.rb +536 -0
  509. data/spec/integration/client_side_encryption/rewrap_prose_spec.rb +114 -0
  510. data/spec/integration/client_side_encryption/unique_index_on_key_alt_names_prose_spec.rb +89 -0
  511. data/spec/integration/client_side_encryption/views_spec.rb +4 -1
  512. data/spec/integration/client_spec.rb +14 -4
  513. data/spec/integration/client_update_spec.rb +9 -2
  514. data/spec/integration/collection_indexes_prose_spec.rb +3 -0
  515. data/spec/integration/command_monitoring_spec.rb +64 -26
  516. data/spec/integration/command_spec.rb +5 -24
  517. data/spec/integration/connect_single_rs_name_spec.rb +6 -3
  518. data/spec/integration/connection/faas_env_spec.rb +62 -0
  519. data/spec/integration/connection_pool_populator_spec.rb +33 -8
  520. data/spec/integration/connection_spec.rb +58 -36
  521. data/spec/integration/crud_spec.rb +217 -1
  522. data/spec/integration/cursor_pinning_spec.rb +125 -0
  523. data/spec/integration/cursor_reaping_spec.rb +62 -19
  524. data/spec/integration/docs_examples_spec.rb +12 -2
  525. data/spec/integration/error_detection_spec.rb +3 -0
  526. data/spec/integration/fork_reconnect_spec.rb +73 -9
  527. data/spec/integration/get_more_spec.rb +4 -1
  528. data/spec/integration/grid_fs_bucket_spec.rb +7 -4
  529. data/spec/integration/heartbeat_events_spec.rb +8 -5
  530. data/spec/integration/map_reduce_spec.rb +81 -0
  531. data/spec/integration/mmapv1_spec.rb +3 -0
  532. data/spec/integration/mongos_pinning_spec.rb +3 -0
  533. data/spec/integration/ocsp_connectivity_spec.rb +29 -0
  534. data/spec/integration/ocsp_verifier_cache_spec.rb +191 -0
  535. data/spec/integration/ocsp_verifier_spec.rb +358 -0
  536. data/spec/integration/operation_failure_code_spec.rb +4 -1
  537. data/spec/integration/operation_failure_message_spec.rb +91 -0
  538. data/spec/integration/query_cache_spec.rb +1343 -0
  539. data/spec/integration/query_cache_transactions_spec.rb +193 -0
  540. data/spec/integration/read_concern_spec.rb +4 -1
  541. data/spec/integration/read_preference_spec.rb +20 -13
  542. data/spec/integration/reconnect_spec.rb +39 -13
  543. data/spec/integration/retryable_errors_spec.rb +4 -1
  544. data/spec/integration/retryable_reads_errors_spec.rb +110 -0
  545. data/spec/integration/retryable_writes/retryable_writes_36_and_older_spec.rb +5 -2
  546. data/spec/integration/retryable_writes/retryable_writes_40_and_newer_spec.rb +5 -1
  547. data/spec/integration/retryable_writes/shared/adds_diagnostics.rb +3 -0
  548. data/spec/integration/retryable_writes/shared/does_not_support_retries.rb +3 -0
  549. data/spec/integration/retryable_writes/shared/only_supports_legacy_retries.rb +3 -0
  550. data/spec/integration/retryable_writes/shared/performs_legacy_retries.rb +5 -0
  551. data/spec/integration/retryable_writes/shared/performs_modern_retries.rb +3 -0
  552. data/spec/integration/retryable_writes/shared/performs_no_retries.rb +3 -0
  553. data/spec/integration/retryable_writes/shared/supports_legacy_retries.rb +3 -0
  554. data/spec/integration/retryable_writes/shared/supports_modern_retries.rb +3 -0
  555. data/spec/integration/retryable_writes/shared/supports_retries.rb +3 -0
  556. data/spec/integration/retryable_writes_errors_spec.rb +162 -1
  557. data/spec/integration/sdam_error_handling_spec.rb +159 -8
  558. data/spec/integration/sdam_events_spec.rb +94 -31
  559. data/spec/integration/sdam_prose_spec.rb +7 -4
  560. data/spec/integration/secondary_reads_spec.rb +103 -0
  561. data/spec/integration/server_description_spec.rb +3 -0
  562. data/spec/integration/server_monitor_spec.rb +7 -2
  563. data/spec/integration/server_selection_spec.rb +39 -0
  564. data/spec/integration/server_selector_spec.rb +29 -7
  565. data/spec/integration/server_spec.rb +27 -25
  566. data/spec/integration/shell_examples_spec.rb +3 -0
  567. data/spec/integration/size_limit_spec.rb +7 -1
  568. data/spec/integration/snappy_compression_spec.rb +28 -0
  569. data/spec/integration/snapshot_query_examples_spec.rb +129 -0
  570. data/spec/integration/srv_monitoring_spec.rb +82 -5
  571. data/spec/integration/srv_spec.rb +60 -0
  572. data/spec/integration/ssl_uri_options_spec.rb +3 -0
  573. data/spec/integration/step_down_spec.rb +28 -7
  574. data/spec/integration/time_zone_querying_spec.rb +3 -0
  575. data/spec/integration/transaction_pinning_spec.rb +134 -0
  576. data/spec/integration/transactions_api_examples_spec.rb +3 -0
  577. data/spec/integration/transactions_examples_spec.rb +26 -7
  578. data/spec/integration/truncated_utf8_spec.rb +26 -0
  579. data/spec/integration/versioned_api_examples_spec.rb +120 -0
  580. data/spec/integration/x509_auth_spec.rb +5 -2
  581. data/spec/integration/zlib_compression_spec.rb +4 -1
  582. data/spec/integration/zstd_compression_spec.rb +29 -0
  583. data/spec/kerberos/kerberos_spec.rb +3 -0
  584. data/spec/lite_spec_helper.rb +59 -16
  585. data/spec/mongo/address/ipv4_spec.rb +3 -0
  586. data/spec/mongo/address/ipv6_spec.rb +10 -0
  587. data/spec/mongo/address/unix_spec.rb +4 -0
  588. data/spec/mongo/address/validator_spec.rb +3 -0
  589. data/spec/mongo/address_spec.rb +33 -13
  590. data/spec/mongo/auth/aws/credential_cache_spec.rb +63 -0
  591. data/spec/mongo/auth/aws/credentials_retriever_spec.rb +90 -0
  592. data/spec/mongo/auth/aws/credentials_spec.rb +46 -0
  593. data/spec/mongo/auth/aws/request_region_spec.rb +3 -0
  594. data/spec/mongo/auth/aws/request_spec.rb +3 -0
  595. data/spec/mongo/auth/cr_spec.rb +6 -24
  596. data/spec/mongo/auth/gssapi/conversation_spec.rb +3 -0
  597. data/spec/mongo/auth/invalid_mechanism_spec.rb +3 -0
  598. data/spec/mongo/auth/ldap/conversation_spec.rb +4 -1
  599. data/spec/mongo/auth/ldap_spec.rb +10 -4
  600. data/spec/mongo/auth/scram/conversation_spec.rb +26 -23
  601. data/spec/mongo/auth/scram256/conversation_spec.rb +23 -20
  602. data/spec/mongo/auth/scram_negotiation_spec.rb +5 -1
  603. data/spec/mongo/auth/scram_spec.rb +5 -3
  604. data/spec/mongo/auth/stringprep/profiles/sasl_spec.rb +3 -0
  605. data/spec/mongo/auth/stringprep_spec.rb +3 -0
  606. data/spec/mongo/auth/user/view_spec.rb +99 -1
  607. data/spec/mongo/auth/user_spec.rb +4 -1
  608. data/spec/mongo/auth/x509/conversation_spec.rb +6 -3
  609. data/spec/mongo/auth/x509_spec.rb +5 -3
  610. data/spec/mongo/auth_spec.rb +3 -0
  611. data/spec/mongo/bson_spec.rb +3 -0
  612. data/spec/mongo/bulk_write/ordered_combiner_spec.rb +3 -0
  613. data/spec/mongo/bulk_write/result_spec.rb +18 -1
  614. data/spec/mongo/bulk_write/unordered_combiner_spec.rb +3 -0
  615. data/spec/mongo/bulk_write_spec.rb +149 -25
  616. data/spec/mongo/caching_cursor_spec.rb +73 -0
  617. data/spec/mongo/client_construction_spec.rb +1112 -546
  618. data/spec/mongo/client_encryption_spec.rb +27 -30
  619. data/spec/mongo/client_spec.rb +445 -139
  620. data/spec/mongo/cluster/cursor_reaper_spec.rb +66 -23
  621. data/spec/mongo/cluster/periodic_executor_spec.rb +6 -1
  622. data/spec/mongo/cluster/socket_reaper_spec.rb +3 -0
  623. data/spec/mongo/cluster/topology/replica_set_spec.rb +13 -10
  624. data/spec/mongo/cluster/topology/sharded_spec.rb +6 -3
  625. data/spec/mongo/cluster/topology/single_spec.rb +20 -8
  626. data/spec/mongo/cluster/topology/unknown_spec.rb +4 -1
  627. data/spec/mongo/cluster/topology_spec.rb +4 -1
  628. data/spec/mongo/cluster_spec.rb +183 -192
  629. data/spec/mongo/cluster_time_spec.rb +3 -0
  630. data/spec/mongo/collection/view/aggregation_spec.rb +181 -83
  631. data/spec/mongo/collection/view/builder/find_command_spec.rb +7 -0
  632. data/spec/mongo/collection/view/builder/op_query_spec.rb +7 -0
  633. data/spec/mongo/collection/view/change_stream_resume_spec.rb +8 -3
  634. data/spec/mongo/collection/view/change_stream_spec.rb +18 -2
  635. data/spec/mongo/collection/view/explainable_spec.rb +90 -4
  636. data/spec/mongo/collection/view/immutable_spec.rb +3 -0
  637. data/spec/mongo/collection/view/iterable_spec.rb +3 -0
  638. data/spec/mongo/collection/view/map_reduce_spec.rb +46 -2
  639. data/spec/mongo/collection/view/readable_spec.rb +868 -1
  640. data/spec/mongo/collection/view/writable_spec.rb +147 -32
  641. data/spec/mongo/collection/view_spec.rb +3 -0
  642. data/spec/mongo/collection_crud_spec.rb +4471 -0
  643. data/spec/mongo/collection_ddl_spec.rb +587 -0
  644. data/spec/mongo/collection_spec.rb +106 -4839
  645. data/spec/mongo/condition_variable_spec.rb +104 -0
  646. data/spec/mongo/config/options_spec.rb +76 -0
  647. data/spec/mongo/config_spec.rb +74 -0
  648. data/spec/mongo/crypt/auto_decryption_context_spec.rb +21 -2
  649. data/spec/mongo/crypt/auto_encrypter_spec.rb +266 -5
  650. data/spec/mongo/crypt/auto_encryption_context_spec.rb +21 -2
  651. data/spec/mongo/crypt/binary_spec.rb +3 -5
  652. data/spec/mongo/crypt/binding/binary_spec.rb +3 -5
  653. data/spec/mongo/crypt/binding/context_spec.rb +71 -23
  654. data/spec/mongo/crypt/binding/helpers_spec.rb +3 -5
  655. data/spec/mongo/crypt/binding/mongocrypt_spec.rb +21 -52
  656. data/spec/mongo/crypt/binding/status_spec.rb +3 -5
  657. data/spec/mongo/crypt/binding/version_spec.rb +50 -5
  658. data/spec/mongo/crypt/binding_unloaded_spec.rb +17 -0
  659. data/spec/mongo/crypt/data_key_context_spec.rb +45 -114
  660. data/spec/mongo/crypt/encryption_io_spec.rb +5 -0
  661. data/spec/mongo/crypt/explicit_decryption_context_spec.rb +36 -2
  662. data/spec/mongo/crypt/explicit_encryption_context_spec.rb +98 -2
  663. data/spec/mongo/crypt/handle_spec.rb +189 -155
  664. data/spec/mongo/crypt/helpers/mongo_crypt_spec_helper.rb +3 -0
  665. data/spec/mongo/crypt/hooks_spec.rb +30 -0
  666. data/spec/mongo/crypt/kms/azure/credentials_retriever_spec.rb +86 -0
  667. data/spec/mongo/crypt/kms/credentials_spec.rb +373 -0
  668. data/spec/mongo/crypt/kms_spec.rb +62 -0
  669. data/spec/mongo/crypt/status_spec.rb +3 -5
  670. data/spec/mongo/crypt_spec.rb +21 -0
  671. data/spec/mongo/cursor/builder/get_more_command_spec.rb +11 -2
  672. data/spec/mongo/cursor/builder/op_get_more_spec.rb +11 -2
  673. data/spec/mongo/cursor_spec.rb +230 -19
  674. data/spec/mongo/database_spec.rb +263 -25
  675. data/spec/mongo/distinguishing_semaphore_spec.rb +9 -6
  676. data/spec/mongo/error/bulk_write_error_spec.rb +6 -3
  677. data/spec/mongo/error/crypt_error_spec.rb +3 -0
  678. data/spec/mongo/error/max_bson_size_spec.rb +3 -0
  679. data/spec/mongo/error/no_server_available_spec.rb +4 -1
  680. data/spec/mongo/error/notable_spec.rb +3 -0
  681. data/spec/mongo/error/operation_failure_heavy_spec.rb +53 -1
  682. data/spec/mongo/error/operation_failure_spec.rb +94 -31
  683. data/spec/mongo/error/parser_spec.rb +40 -6
  684. data/spec/mongo/error/unsupported_option_spec.rb +3 -0
  685. data/spec/mongo/event/publisher_spec.rb +3 -0
  686. data/spec/mongo/event/subscriber_spec.rb +3 -0
  687. data/spec/mongo/grid/file/chunk_spec.rb +7 -4
  688. data/spec/mongo/grid/file/info_spec.rb +3 -0
  689. data/spec/mongo/grid/file_spec.rb +4 -1
  690. data/spec/mongo/grid/fs_bucket_spec.rb +40 -17
  691. data/spec/mongo/grid/stream/read_spec.rb +33 -10
  692. data/spec/mongo/grid/stream/write_spec.rb +6 -9
  693. data/spec/mongo/grid/stream_spec.rb +4 -1
  694. data/spec/mongo/id_spec.rb +4 -1
  695. data/spec/mongo/index/view_spec.rb +138 -4
  696. data/spec/mongo/lint_spec.rb +4 -1
  697. data/spec/mongo/logger_spec.rb +16 -11
  698. data/spec/mongo/monitoring/command_log_subscriber_spec.rb +3 -0
  699. data/spec/mongo/monitoring/event/cmap/connection_check_out_failed_spec.rb +4 -1
  700. data/spec/mongo/monitoring/event/cmap/connection_check_out_started_spec.rb +4 -1
  701. data/spec/mongo/monitoring/event/cmap/connection_checked_in_spec.rb +4 -1
  702. data/spec/mongo/monitoring/event/cmap/connection_checked_out_spec.rb +4 -1
  703. data/spec/mongo/monitoring/event/cmap/connection_closed_spec.rb +4 -1
  704. data/spec/mongo/monitoring/event/cmap/connection_created_spec.rb +4 -1
  705. data/spec/mongo/monitoring/event/cmap/connection_ready_spec.rb +4 -1
  706. data/spec/mongo/monitoring/event/cmap/pool_cleared_spec.rb +4 -1
  707. data/spec/mongo/monitoring/event/cmap/pool_closed_spec.rb +4 -1
  708. data/spec/mongo/monitoring/event/cmap/pool_created_spec.rb +4 -1
  709. data/spec/mongo/monitoring/event/command_failed_spec.rb +59 -2
  710. data/spec/mongo/monitoring/event/command_started_spec.rb +3 -0
  711. data/spec/mongo/monitoring/event/command_succeeded_spec.rb +46 -6
  712. data/spec/mongo/monitoring/event/secure_spec.rb +28 -4
  713. data/spec/mongo/monitoring/event/server_closed_spec.rb +4 -1
  714. data/spec/mongo/monitoring/event/server_description_changed_spec.rb +3 -0
  715. data/spec/mongo/monitoring/event/server_heartbeat_failed_spec.rb +4 -1
  716. data/spec/mongo/monitoring/event/server_heartbeat_started_spec.rb +3 -0
  717. data/spec/mongo/monitoring/event/server_heartbeat_succeeded_spec.rb +4 -1
  718. data/spec/mongo/monitoring/event/server_opening_spec.rb +4 -1
  719. data/spec/mongo/monitoring/event/topology_changed_spec.rb +4 -1
  720. data/spec/mongo/monitoring/event/topology_closed_spec.rb +4 -1
  721. data/spec/mongo/monitoring/event/topology_opening_spec.rb +4 -1
  722. data/spec/mongo/monitoring_spec.rb +3 -0
  723. data/spec/mongo/operation/aggregate/result_spec.rb +7 -2
  724. data/spec/mongo/operation/aggregate_spec.rb +5 -1
  725. data/spec/mongo/operation/collections_info_spec.rb +7 -1
  726. data/spec/mongo/operation/command_spec.rb +11 -5
  727. data/spec/mongo/operation/create/op_msg_spec.rb +244 -0
  728. data/spec/mongo/operation/create_index_spec.rb +9 -3
  729. data/spec/mongo/operation/create_user_spec.rb +9 -3
  730. data/spec/mongo/operation/delete/bulk_spec.rb +12 -6
  731. data/spec/mongo/operation/delete/op_msg_spec.rb +20 -8
  732. data/spec/mongo/operation/delete_spec.rb +13 -36
  733. data/spec/mongo/operation/drop_index_spec.rb +9 -2
  734. data/spec/mongo/operation/find/builder/flags_spec.rb +109 -0
  735. data/spec/mongo/operation/find/builder/modifiers_spec.rb +213 -0
  736. data/spec/mongo/operation/indexes_spec.rb +8 -1
  737. data/spec/mongo/operation/insert/bulk_spec.rb +14 -8
  738. data/spec/mongo/operation/insert/op_msg_spec.rb +25 -14
  739. data/spec/mongo/operation/insert_spec.rb +17 -43
  740. data/spec/mongo/operation/limited_spec.rb +3 -0
  741. data/spec/mongo/operation/map_reduce_spec.rb +8 -2
  742. data/spec/mongo/operation/read_preference_legacy_spec.rb +39 -42
  743. data/spec/mongo/operation/read_preference_op_msg_spec.rb +33 -5
  744. data/spec/mongo/operation/remove_user_spec.rb +9 -3
  745. data/spec/mongo/operation/result_spec.rb +30 -5
  746. data/spec/mongo/operation/specifiable_spec.rb +3 -0
  747. data/spec/mongo/operation/update/bulk_spec.rb +13 -7
  748. data/spec/mongo/operation/update/op_msg_spec.rb +20 -8
  749. data/spec/mongo/operation/update_spec.rb +12 -35
  750. data/spec/mongo/operation/update_user_spec.rb +7 -1
  751. data/spec/mongo/options/redacted_spec.rb +4 -1
  752. data/spec/mongo/protocol/caching_hash_spec.rb +37 -0
  753. data/spec/mongo/protocol/compressed_spec.rb +29 -12
  754. data/spec/mongo/protocol/get_more_spec.rb +3 -0
  755. data/spec/mongo/protocol/kill_cursors_spec.rb +3 -0
  756. data/spec/mongo/protocol/msg_spec.rb +48 -66
  757. data/spec/mongo/protocol/query_spec.rb +6 -3
  758. data/spec/mongo/protocol/registry_spec.rb +3 -0
  759. data/spec/mongo/protocol/reply_spec.rb +3 -0
  760. data/spec/mongo/query_cache_middleware_spec.rb +55 -0
  761. data/spec/mongo/query_cache_spec.rb +453 -0
  762. data/spec/mongo/retryable_spec.rb +42 -7
  763. data/spec/mongo/semaphore_spec.rb +9 -6
  764. data/spec/mongo/server/app_metadata/environment_spec.rb +209 -0
  765. data/spec/mongo/server/app_metadata/truncator_spec.rb +158 -0
  766. data/spec/mongo/server/app_metadata_spec.rb +55 -52
  767. data/spec/mongo/server/connection_auth_spec.rb +9 -10
  768. data/spec/mongo/server/connection_common_spec.rb +87 -0
  769. data/spec/mongo/server/connection_pool/populator_spec.rb +22 -3
  770. data/spec/mongo/server/connection_pool_spec.rb +635 -58
  771. data/spec/mongo/server/connection_spec.rb +226 -204
  772. data/spec/mongo/server/description/features_spec.rb +27 -0
  773. data/spec/mongo/server/description_query_methods_spec.rb +4 -1
  774. data/spec/mongo/server/description_spec.rb +625 -594
  775. data/spec/mongo/server/monitor/app_metadata_spec.rb +3 -1
  776. data/spec/mongo/server/monitor/connection_spec.rb +81 -9
  777. data/spec/mongo/server/monitor_spec.rb +31 -18
  778. data/spec/mongo/server/push_monitor_spec.rb +95 -0
  779. data/spec/mongo/server/round_trip_time_averager_spec.rb +3 -0
  780. data/spec/mongo/server_selector/nearest_spec.rb +8 -2
  781. data/spec/mongo/server_selector/primary_preferred_spec.rb +8 -2
  782. data/spec/mongo/server_selector/primary_spec.rb +8 -2
  783. data/spec/mongo/server_selector/secondary_preferred_spec.rb +14 -8
  784. data/spec/mongo/server_selector/secondary_spec.rb +8 -2
  785. data/spec/mongo/server_selector_spec.rb +143 -18
  786. data/spec/mongo/server_spec.rb +49 -6
  787. data/spec/mongo/session/server_session_spec.rb +3 -0
  788. data/spec/mongo/session/session_pool_spec.rb +45 -10
  789. data/spec/mongo/session_spec.rb +29 -6
  790. data/spec/mongo/session_transaction_spec.rb +17 -36
  791. data/spec/mongo/socket/ssl_spec.rb +91 -75
  792. data/spec/mongo/socket/tcp_spec.rb +3 -0
  793. data/spec/mongo/socket/unix_spec.rb +4 -0
  794. data/spec/mongo/socket_spec.rb +5 -2
  795. data/spec/mongo/srv/monitor_spec.rb +3 -0
  796. data/spec/mongo/srv/result_spec.rb +3 -0
  797. data/spec/mongo/timeout_spec.rb +3 -0
  798. data/spec/mongo/tls_context_hooks_spec.rb +40 -0
  799. data/spec/mongo/uri/options_mapper_spec.rb +1605 -0
  800. data/spec/mongo/uri/srv_protocol_spec.rb +330 -36
  801. data/spec/mongo/uri_option_parsing_spec.rb +52 -16
  802. data/spec/mongo/uri_spec.rb +238 -42
  803. data/spec/mongo/utils_spec.rb +42 -0
  804. data/spec/mongo/write_concern/acknowledged_spec.rb +3 -0
  805. data/spec/mongo/write_concern/unacknowledged_spec.rb +3 -0
  806. data/spec/mongo/write_concern_spec.rb +3 -0
  807. data/spec/runners/auth.rb +26 -2
  808. data/spec/runners/change_streams/outcome.rb +3 -0
  809. data/spec/runners/change_streams/spec.rb +4 -1
  810. data/spec/runners/change_streams/test.rb +5 -2
  811. data/spec/runners/cmap/verifier.rb +4 -1
  812. data/spec/runners/cmap.rb +192 -46
  813. data/spec/runners/command_monitoring.rb +4 -1
  814. data/spec/runners/connection_string.rb +48 -126
  815. data/spec/runners/crud/context.rb +3 -0
  816. data/spec/runners/crud/operation.rb +21 -7
  817. data/spec/runners/crud/outcome.rb +3 -0
  818. data/spec/runners/crud/requirement.rb +76 -6
  819. data/spec/runners/crud/spec.rb +9 -3
  820. data/spec/runners/crud/test.rb +4 -1
  821. data/spec/runners/crud/test_base.rb +4 -20
  822. data/spec/runners/crud/verifier.rb +20 -4
  823. data/spec/runners/crud.rb +23 -1
  824. data/spec/runners/gridfs.rb +4 -1
  825. data/spec/runners/read_write_concern_document.rb +4 -1
  826. data/spec/runners/sdam/verifier.rb +3 -0
  827. data/spec/runners/sdam.rb +9 -5
  828. data/spec/runners/server_selection.rb +5 -2
  829. data/spec/runners/server_selection_rtt.rb +5 -2
  830. data/spec/runners/transactions/operation.rb +30 -10
  831. data/spec/runners/transactions/spec.rb +5 -2
  832. data/spec/runners/transactions/test.rb +69 -21
  833. data/spec/runners/transactions.rb +14 -8
  834. data/spec/runners/unified/assertions.rb +379 -0
  835. data/spec/runners/unified/change_stream_operations.rb +52 -0
  836. data/spec/runners/unified/client_side_encryption_operations.rb +83 -0
  837. data/spec/runners/unified/crud_operations.rb +332 -0
  838. data/spec/runners/unified/ddl_operations.rb +255 -0
  839. data/spec/runners/unified/entity_map.rb +42 -0
  840. data/spec/runners/unified/error.rb +29 -0
  841. data/spec/runners/unified/event_subscriber.rb +110 -0
  842. data/spec/runners/unified/exceptions.rb +24 -0
  843. data/spec/runners/unified/grid_fs_operations.rb +79 -0
  844. data/spec/runners/unified/support_operations.rb +333 -0
  845. data/spec/runners/unified/test.rb +585 -0
  846. data/spec/runners/unified/test_group.rb +31 -0
  847. data/spec/runners/unified/thread_operations.rb +73 -0
  848. data/spec/runners/unified.rb +109 -0
  849. data/spec/shared/LICENSE +20 -0
  850. data/spec/shared/bin/get-mongodb-download-url +17 -0
  851. data/spec/shared/bin/s3-copy +45 -0
  852. data/spec/shared/bin/s3-upload +69 -0
  853. data/spec/shared/lib/mrss/child_process_helper.rb +80 -0
  854. data/spec/shared/lib/mrss/cluster_config.rb +231 -0
  855. data/spec/shared/lib/mrss/constraints.rb +378 -0
  856. data/spec/shared/lib/mrss/docker_runner.rb +295 -0
  857. data/spec/shared/lib/mrss/eg_config_utils.rb +51 -0
  858. data/spec/shared/lib/mrss/event_subscriber.rb +210 -0
  859. data/spec/shared/lib/mrss/lite_constraints.rb +238 -0
  860. data/spec/shared/lib/mrss/server_version_registry.rb +113 -0
  861. data/spec/shared/lib/mrss/session_registry.rb +69 -0
  862. data/spec/shared/lib/mrss/session_registry_legacy.rb +60 -0
  863. data/spec/shared/lib/mrss/spec_organizer.rb +179 -0
  864. data/spec/shared/lib/mrss/utils.rb +37 -0
  865. data/spec/shared/share/Dockerfile.erb +330 -0
  866. data/spec/shared/share/haproxy-1.conf +16 -0
  867. data/spec/shared/share/haproxy-2.conf +17 -0
  868. data/spec/shared/shlib/config.sh +27 -0
  869. data/spec/shared/shlib/distro.sh +74 -0
  870. data/spec/shared/shlib/server.sh +416 -0
  871. data/spec/shared/shlib/set_env.sh +169 -0
  872. data/spec/solo/clean_exit_spec.rb +22 -0
  873. data/spec/spec_helper.rb +11 -5
  874. data/spec/spec_tests/auth_spec.rb +30 -13
  875. data/spec/spec_tests/change_streams_unified_spec.rb +14 -0
  876. data/spec/spec_tests/client_side_encryption_spec.rb +27 -1
  877. data/spec/spec_tests/client_side_encryption_unified_spec.rb +26 -0
  878. data/spec/spec_tests/cmap_spec.rb +41 -17
  879. data/spec/spec_tests/collection_management_spec.rb +13 -0
  880. data/spec/spec_tests/command_monitoring_unified_spec.rb +13 -0
  881. data/spec/spec_tests/connection_string_spec.rb +3 -0
  882. data/spec/spec_tests/crud_spec.rb +3 -10
  883. data/spec/spec_tests/crud_unified_spec.rb +13 -0
  884. data/spec/spec_tests/data/change_streams_unified/change-streams-clusterTime.yml +41 -0
  885. data/spec/spec_tests/data/change_streams_unified/change-streams-disambiguatedPaths.yml +103 -0
  886. data/spec/spec_tests/data/change_streams_unified/change-streams-errors.yml +120 -0
  887. data/spec/spec_tests/data/change_streams_unified/change-streams-pre_and_post_images.yml +351 -0
  888. data/spec/spec_tests/data/change_streams_unified/change-streams-resume-allowlist.yml +1169 -0
  889. data/spec/spec_tests/data/change_streams_unified/change-streams-resume-errorLabels.yml +1069 -0
  890. data/spec/spec_tests/data/change_streams_unified/change-streams-showExpandedEvents.yml +307 -0
  891. data/spec/spec_tests/data/change_streams_unified/change-streams.yml +927 -0
  892. data/spec/spec_tests/data/client_side_encryption/aggregate.yml +3 -17
  893. data/spec/spec_tests/data/client_side_encryption/awsTemporary.yml +57 -0
  894. data/spec/spec_tests/data/client_side_encryption/azureKMS.yml +46 -0
  895. data/spec/spec_tests/data/client_side_encryption/badQueries.yml +12 -2
  896. data/spec/spec_tests/data/client_side_encryption/basic.yml +3 -17
  897. data/spec/spec_tests/data/client_side_encryption/bulk.yml +1 -8
  898. data/spec/spec_tests/data/client_side_encryption/bypassAutoEncryption.yml +2 -2
  899. data/spec/spec_tests/data/client_side_encryption/bypassedCommand.yml +5 -4
  900. data/spec/spec_tests/data/client_side_encryption/count.yml +1 -8
  901. data/spec/spec_tests/data/client_side_encryption/countDocuments.yml +1 -8
  902. data/spec/spec_tests/data/client_side_encryption/create-and-createIndexes.yml +58 -0
  903. data/spec/spec_tests/data/client_side_encryption/delete.yml +2 -16
  904. data/spec/spec_tests/data/client_side_encryption/distinct.yml +1 -8
  905. data/spec/spec_tests/data/client_side_encryption/explain.yml +1 -8
  906. data/spec/spec_tests/data/client_side_encryption/find.yml +2 -16
  907. data/spec/spec_tests/data/client_side_encryption/findOneAndDelete.yml +1 -8
  908. data/spec/spec_tests/data/client_side_encryption/findOneAndReplace.yml +1 -8
  909. data/spec/spec_tests/data/client_side_encryption/findOneAndUpdate.yml +1 -8
  910. data/spec/spec_tests/data/client_side_encryption/fle2v2-BypassQueryAnalysis.yml +89 -0
  911. data/spec/spec_tests/data/client_side_encryption/fle2v2-Compact.yml +82 -0
  912. data/spec/spec_tests/data/client_side_encryption/fle2v2-CreateCollection-OldServer.yml +61 -0
  913. data/spec/spec_tests/data/client_side_encryption/fle2v2-CreateCollection.yml +937 -0
  914. data/spec/spec_tests/data/client_side_encryption/fle2v2-DecryptExistingData.yml +66 -0
  915. data/spec/spec_tests/data/client_side_encryption/fle2v2-Delete.yml +100 -0
  916. data/spec/spec_tests/data/client_side_encryption/fle2v2-EncryptedFields-vs-EncryptedFieldsMap.yml +79 -0
  917. data/spec/spec_tests/data/client_side_encryption/fle2v2-EncryptedFields-vs-jsonSchema.yml +102 -0
  918. data/spec/spec_tests/data/client_side_encryption/fle2v2-EncryptedFieldsMap-defaults.yml +58 -0
  919. data/spec/spec_tests/data/client_side_encryption/fle2v2-FindOneAndUpdate.yml +200 -0
  920. data/spec/spec_tests/data/client_side_encryption/fle2v2-InsertFind-Indexed.yml +96 -0
  921. data/spec/spec_tests/data/client_side_encryption/fle2v2-InsertFind-Unindexed.yml +89 -0
  922. data/spec/spec_tests/data/client_side_encryption/fle2v2-MissingKey.yml +43 -0
  923. data/spec/spec_tests/data/client_side_encryption/fle2v2-NoEncryption.yml +44 -0
  924. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Date-Aggregate.yml +241 -0
  925. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Date-Correctness.yml +422 -0
  926. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Date-Delete.yml +182 -0
  927. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Date-FindOneAndUpdate.yml +239 -0
  928. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Date-InsertFind.yml +235 -0
  929. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Date-Update.yml +252 -0
  930. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Decimal-Aggregate.yml +1687 -0
  931. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Decimal-Correctness.yml +293 -0
  932. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Decimal-Delete.yml +905 -0
  933. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Decimal-FindOneAndUpdate.yml +1684 -0
  934. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Decimal-InsertFind.yml +1680 -0
  935. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Decimal-Update.yml +1697 -0
  936. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-DecimalPrecision-Aggregate.yml +329 -0
  937. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-DecimalPrecision-Correctness.yml +424 -0
  938. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-DecimalPrecision-Delete.yml +226 -0
  939. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-DecimalPrecision-FindOneAndUpdate.yml +327 -0
  940. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-DecimalPrecision-InsertFind.yml +319 -0
  941. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-DecimalPrecision-Update.yml +336 -0
  942. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Double-Aggregate.yml +913 -0
  943. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Double-Correctness.yml +292 -0
  944. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Double-Delete.yml +518 -0
  945. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Double-FindOneAndUpdate.yml +911 -0
  946. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Double-InsertFind.yml +907 -0
  947. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Double-Update.yml +924 -0
  948. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-DoublePrecision-Aggregate.yml +325 -0
  949. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-DoublePrecision-Correctness.yml +424 -0
  950. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-DoublePrecision-Delete.yml +224 -0
  951. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-DoublePrecision-FindOneAndUpdate.yml +323 -0
  952. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-DoublePrecision-InsertFind.yml +319 -0
  953. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-DoublePrecision-Update.yml +338 -0
  954. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Int-Aggregate.yml +241 -0
  955. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Int-Correctness.yml +423 -0
  956. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Int-Delete.yml +182 -0
  957. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Int-FindOneAndUpdate.yml +239 -0
  958. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Int-InsertFind.yml +235 -0
  959. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Int-Update.yml +254 -0
  960. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Long-Aggregate.yml +241 -0
  961. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Long-Correctness.yml +422 -0
  962. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Long-Delete.yml +182 -0
  963. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Long-FindOneAndUpdate.yml +239 -0
  964. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Long-InsertFind.yml +235 -0
  965. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Long-Update.yml +254 -0
  966. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-WrongType.yml +43 -0
  967. data/spec/spec_tests/data/client_side_encryption/fle2v2-Update.yml +210 -0
  968. data/spec/spec_tests/data/client_side_encryption/fle2v2-validatorAndPartialFieldExpression.yml +169 -0
  969. data/spec/spec_tests/data/client_side_encryption/gcpKMS.yml +46 -0
  970. data/spec/spec_tests/data/client_side_encryption/getMore.yml +1 -8
  971. data/spec/spec_tests/data/client_side_encryption/insert.yml +2 -16
  972. data/spec/spec_tests/data/client_side_encryption/keyAltName.yml +1 -8
  973. data/spec/spec_tests/data/client_side_encryption/localKMS.yml +1 -8
  974. data/spec/spec_tests/data/client_side_encryption/localSchema.yml +1 -8
  975. data/spec/spec_tests/data/client_side_encryption/maxWireVersion.yml +3 -1
  976. data/spec/spec_tests/data/client_side_encryption/missingKey.yml +2 -9
  977. data/spec/spec_tests/data/client_side_encryption/noSchema.yml +39 -0
  978. data/spec/spec_tests/data/client_side_encryption/replaceOne.yml +1 -8
  979. data/spec/spec_tests/data/client_side_encryption/types.yml +44 -70
  980. data/spec/spec_tests/data/client_side_encryption/unified/addKeyAltName.yml +194 -0
  981. data/spec/spec_tests/data/client_side_encryption/unified/createDataKey-kms_providers-invalid.yml +67 -0
  982. data/spec/spec_tests/data/client_side_encryption/unified/createDataKey.yml +309 -0
  983. data/spec/spec_tests/data/client_side_encryption/unified/deleteKey.yml +159 -0
  984. data/spec/spec_tests/data/client_side_encryption/unified/getKey.yml +105 -0
  985. data/spec/spec_tests/data/client_side_encryption/unified/getKeyByAltName.yml +104 -0
  986. data/spec/spec_tests/data/client_side_encryption/unified/getKeys.yml +122 -0
  987. data/spec/spec_tests/data/client_side_encryption/unified/removeKeyAltName.yml +157 -0
  988. data/spec/spec_tests/data/client_side_encryption/unified/rewrapManyDataKey-decrypt_failure.yml +69 -0
  989. data/spec/spec_tests/data/client_side_encryption/unified/rewrapManyDataKey-encrypt_failure.yml +122 -0
  990. data/spec/spec_tests/data/client_side_encryption/unified/rewrapManyDataKey.yml +432 -0
  991. data/spec/spec_tests/data/client_side_encryption/updateMany.yml +1 -8
  992. data/spec/spec_tests/data/client_side_encryption/updateOne.yml +1 -8
  993. data/spec/spec_tests/data/client_side_encryption/validatorAndPartialFieldExpression.yml +166 -0
  994. data/spec/spec_tests/data/cmap/connection-must-have-id.yml +2 -0
  995. data/spec/spec_tests/data/cmap/connection-must-order-ids.yml +2 -0
  996. data/spec/spec_tests/data/cmap/pool-checkin-destroy-closed.yml +2 -0
  997. data/spec/spec_tests/data/cmap/pool-checkin-destroy-stale.yml +2 -0
  998. data/spec/spec_tests/data/cmap/pool-checkin-make-available.yml +3 -1
  999. data/spec/spec_tests/data/cmap/pool-checkin.yml +5 -0
  1000. data/spec/spec_tests/data/cmap/pool-checkout-connection.yml +8 -2
  1001. data/spec/spec_tests/data/cmap/pool-checkout-custom-maxConnecting-is-enforced.yml +50 -0
  1002. data/spec/spec_tests/data/cmap/pool-checkout-error-closed.yml +2 -0
  1003. data/spec/spec_tests/data/cmap/pool-checkout-maxConnecting-is-enforced.yml +81 -0
  1004. data/spec/spec_tests/data/cmap/pool-checkout-maxConnecting-timeout.yml +71 -0
  1005. data/spec/spec_tests/data/cmap/pool-checkout-minPoolSize-connection-maxConnecting.yml +64 -0
  1006. data/spec/spec_tests/data/cmap/pool-checkout-multiple.yml +2 -0
  1007. data/spec/spec_tests/data/cmap/pool-checkout-no-idle.yml +6 -0
  1008. data/spec/spec_tests/data/cmap/pool-checkout-no-stale.yml +8 -0
  1009. data/spec/spec_tests/data/cmap/pool-checkout-returned-connection-maxConnecting.yml +88 -0
  1010. data/spec/spec_tests/data/cmap/pool-clear-interrupt-immediately.yml +49 -0
  1011. data/spec/spec_tests/data/cmap/pool-clear-interrupting-pending-connections.yml +43 -0
  1012. data/spec/spec_tests/data/cmap/pool-clear-min-size.yml +41 -0
  1013. data/spec/spec_tests/data/cmap/pool-clear-paused.yml +18 -0
  1014. data/spec/spec_tests/data/cmap/pool-clear-ready.yml +39 -0
  1015. data/spec/spec_tests/data/cmap/pool-clear-schedule-run-interruptInUseConnections-false.yml +48 -0
  1016. data/spec/spec_tests/data/cmap/pool-close-destroy-conns.yml +2 -0
  1017. data/spec/spec_tests/data/cmap/pool-create-max-size.yml +2 -0
  1018. data/spec/spec_tests/data/cmap/pool-create-min-size-error.yml +43 -0
  1019. data/spec/spec_tests/data/cmap/pool-create-min-size.yml +12 -0
  1020. data/spec/spec_tests/data/cmap/pool-ready-ready.yml +22 -0
  1021. data/spec/spec_tests/data/cmap/pool-ready.yml +30 -0
  1022. data/spec/spec_tests/data/cmap/wait-queue-fairness.yml +2 -0
  1023. data/spec/spec_tests/data/cmap/wait-queue-timeout.yml +6 -1
  1024. data/spec/spec_tests/data/collection_management/clustered-indexes.yml +135 -0
  1025. data/spec/spec_tests/data/collection_management/createCollection-pre_and_post_images.yml +50 -0
  1026. data/spec/spec_tests/data/collection_management/modifyCollection-errorResponse.yml +59 -0
  1027. data/spec/spec_tests/data/collection_management/modifyCollection-pre_and_post_images.yml +58 -0
  1028. data/spec/spec_tests/data/collection_management/timeseries-collection.yml +164 -0
  1029. data/spec/spec_tests/data/command_monitoring_unified/bulkWrite.yml +68 -0
  1030. data/spec/spec_tests/data/command_monitoring_unified/command.yml +50 -0
  1031. data/spec/spec_tests/data/command_monitoring_unified/deleteMany.yml +79 -0
  1032. data/spec/spec_tests/data/command_monitoring_unified/deleteOne.yml +79 -0
  1033. data/spec/spec_tests/data/command_monitoring_unified/find.yml +254 -0
  1034. data/spec/spec_tests/data/command_monitoring_unified/insertMany.yml +79 -0
  1035. data/spec/spec_tests/data/command_monitoring_unified/insertOne.yml +77 -0
  1036. data/spec/spec_tests/data/command_monitoring_unified/pre-42-server-connection-id.yml +56 -0
  1037. data/spec/spec_tests/data/command_monitoring_unified/redacted-commands.yml +348 -0
  1038. data/spec/spec_tests/data/command_monitoring_unified/server-connection-id.yml +56 -0
  1039. data/spec/spec_tests/data/command_monitoring_unified/unacknowledgedBulkWrite.yml +55 -0
  1040. data/spec/spec_tests/data/command_monitoring_unified/updateMany.yml +87 -0
  1041. data/spec/spec_tests/data/command_monitoring_unified/updateOne.yml +118 -0
  1042. data/spec/spec_tests/data/command_monitoring_unified/writeConcernError.yml +80 -0
  1043. data/spec/spec_tests/data/connection_string/valid-warnings.yml +24 -0
  1044. data/spec/spec_tests/data/crud/read/aggregate-collation.yml +2 -1
  1045. data/spec/spec_tests/data/crud/read/aggregate-out.yml +1 -0
  1046. data/spec/spec_tests/data/crud/read/count-collation.yml +2 -1
  1047. data/spec/spec_tests/data/crud/read/distinct-collation.yml +2 -1
  1048. data/spec/spec_tests/data/crud/read/find-collation.yml +2 -1
  1049. data/spec/spec_tests/data/crud/write/bulkWrite-collation.yml +2 -1
  1050. data/spec/spec_tests/data/crud/write/bulkWrite.yml +26 -22
  1051. data/spec/spec_tests/data/crud/write/deleteMany-collation.yml +2 -1
  1052. data/spec/spec_tests/data/crud/write/deleteOne-collation.yml +2 -1
  1053. data/spec/spec_tests/data/crud/write/findOneAndDelete-collation.yml +3 -2
  1054. data/spec/spec_tests/data/crud/write/findOneAndReplace-collation.yml +2 -1
  1055. data/spec/spec_tests/data/crud/write/findOneAndUpdate-collation.yml +3 -2
  1056. data/spec/spec_tests/data/crud/write/insertMany.yml +26 -22
  1057. data/spec/spec_tests/data/crud/write/replaceOne-collation.yml +3 -2
  1058. data/spec/spec_tests/data/crud/write/updateMany-collation.yml +2 -1
  1059. data/spec/spec_tests/data/crud/write/updateOne-collation.yml +2 -1
  1060. data/spec/spec_tests/data/crud_unified/aggregate-allowdiskuse.yml +75 -0
  1061. data/spec/spec_tests/data/crud_unified/aggregate-let.yml +138 -0
  1062. data/spec/spec_tests/data/crud_unified/aggregate-merge-errorResponse.yml +42 -0
  1063. data/spec/spec_tests/data/crud_unified/aggregate-merge.yml +185 -0
  1064. data/spec/spec_tests/data/crud_unified/aggregate-out-readConcern.yml +171 -0
  1065. data/spec/spec_tests/data/crud_unified/aggregate-write-readPreference.yml +155 -0
  1066. data/spec/spec_tests/data/crud_unified/aggregate.yml +215 -0
  1067. data/spec/spec_tests/data/crud_unified/bulkWrite-arrayFilters-clientError.yml +98 -0
  1068. data/spec/spec_tests/data/crud_unified/bulkWrite-arrayFilters.yml +174 -0
  1069. data/spec/spec_tests/data/crud_unified/bulkWrite-comment.yml +189 -0
  1070. data/spec/spec_tests/data/crud_unified/bulkWrite-delete-hint-clientError.yml +113 -0
  1071. data/spec/spec_tests/data/crud_unified/bulkWrite-delete-hint-serverError.yml +142 -0
  1072. data/spec/spec_tests/data/crud_unified/bulkWrite-delete-hint.yml +154 -0
  1073. data/spec/spec_tests/data/crud_unified/bulkWrite-deleteMany-hint-unacknowledged.yml +98 -0
  1074. data/spec/spec_tests/data/crud_unified/bulkWrite-deleteMany-let.yml +86 -0
  1075. data/spec/spec_tests/data/crud_unified/bulkWrite-deleteOne-hint-unacknowledged.yml +97 -0
  1076. data/spec/spec_tests/data/crud_unified/bulkWrite-deleteOne-let.yml +86 -0
  1077. data/spec/spec_tests/data/crud_unified/bulkWrite-errorResponse.yml +50 -0
  1078. data/spec/spec_tests/data/crud_unified/bulkWrite-insertOne-dots_and_dollars.yml +138 -0
  1079. data/spec/spec_tests/data/crud_unified/bulkWrite-replaceOne-dots_and_dollars.yml +165 -0
  1080. data/spec/spec_tests/data/crud_unified/bulkWrite-replaceOne-hint-unacknowledged.yml +103 -0
  1081. data/spec/spec_tests/data/crud_unified/bulkWrite-replaceOne-let.yml +93 -0
  1082. data/spec/spec_tests/data/crud_unified/bulkWrite-update-hint-clientError.yml +148 -0
  1083. data/spec/spec_tests/data/crud_unified/bulkWrite-update-hint-serverError.yml +239 -0
  1084. data/spec/spec_tests/data/crud_unified/bulkWrite-update-hint.yml +256 -0
  1085. data/spec/spec_tests/data/crud_unified/bulkWrite-update-validation.yml +73 -0
  1086. data/spec/spec_tests/data/crud_unified/bulkWrite-updateMany-dots_and_dollars.yml +150 -0
  1087. data/spec/spec_tests/data/crud_unified/bulkWrite-updateMany-hint-unacknowledged.yml +104 -0
  1088. data/spec/spec_tests/data/crud_unified/bulkWrite-updateMany-let.yml +96 -0
  1089. data/spec/spec_tests/data/crud_unified/bulkWrite-updateOne-dots_and_dollars.yml +150 -0
  1090. data/spec/spec_tests/data/crud_unified/bulkWrite-updateOne-hint-unacknowledged.yml +103 -0
  1091. data/spec/spec_tests/data/crud_unified/bulkWrite-updateOne-let.yml +95 -0
  1092. data/spec/spec_tests/data/crud_unified/countDocuments-comment.yml +92 -0
  1093. data/spec/spec_tests/data/crud_unified/db-aggregate-write-readPreference.yml +151 -0
  1094. data/spec/spec_tests/data/crud_unified/db-aggregate.yml +73 -0
  1095. data/spec/spec_tests/data/crud_unified/deleteMany-comment.yml +97 -0
  1096. data/spec/spec_tests/data/crud_unified/deleteMany-hint-clientError.yml +87 -0
  1097. data/spec/spec_tests/data/crud_unified/deleteMany-hint-serverError.yml +107 -0
  1098. data/spec/spec_tests/data/crud_unified/deleteMany-hint-unacknowledged.yml +90 -0
  1099. data/spec/spec_tests/data/crud_unified/deleteMany-hint.yml +99 -0
  1100. data/spec/spec_tests/data/crud_unified/deleteMany-let.yml +93 -0
  1101. data/spec/spec_tests/data/crud_unified/deleteOne-comment.yml +98 -0
  1102. data/spec/spec_tests/data/crud_unified/deleteOne-errorResponse.yml +46 -0
  1103. data/spec/spec_tests/data/crud_unified/deleteOne-hint-clientError.yml +80 -0
  1104. data/spec/spec_tests/data/crud_unified/deleteOne-hint-serverError.yml +100 -0
  1105. data/spec/spec_tests/data/crud_unified/deleteOne-hint-unacknowledged.yml +89 -0
  1106. data/spec/spec_tests/data/crud_unified/deleteOne-hint.yml +95 -0
  1107. data/spec/spec_tests/data/crud_unified/deleteOne-let.yml +91 -0
  1108. data/spec/spec_tests/data/crud_unified/distinct-comment.yml +98 -0
  1109. data/spec/spec_tests/data/crud_unified/estimatedDocumentCount-comment.yml +95 -0
  1110. data/spec/spec_tests/data/crud_unified/estimatedDocumentCount.yml +181 -0
  1111. data/spec/spec_tests/data/crud_unified/find-allowdiskuse-clientError.yml +55 -0
  1112. data/spec/spec_tests/data/crud_unified/find-allowdiskuse-serverError.yml +68 -0
  1113. data/spec/spec_tests/data/crud_unified/find-allowdiskuse.yml +79 -0
  1114. data/spec/spec_tests/data/crud_unified/find-comment.yml +166 -0
  1115. data/spec/spec_tests/data/crud_unified/find-let.yml +71 -0
  1116. data/spec/spec_tests/data/crud_unified/find.yml +68 -0
  1117. data/spec/spec_tests/data/crud_unified/findOneAndDelete-comment.yml +96 -0
  1118. data/spec/spec_tests/data/crud_unified/findOneAndDelete-hint-clientError.yml +91 -0
  1119. data/spec/spec_tests/data/crud_unified/findOneAndDelete-hint-serverError.yml +107 -0
  1120. data/spec/spec_tests/data/crud_unified/findOneAndDelete-hint-unacknowledged.yml +88 -0
  1121. data/spec/spec_tests/data/crud_unified/findOneAndDelete-hint.yml +102 -0
  1122. data/spec/spec_tests/data/crud_unified/findOneAndDelete-let.yml +86 -0
  1123. data/spec/spec_tests/data/crud_unified/findOneAndReplace-comment.yml +101 -0
  1124. data/spec/spec_tests/data/crud_unified/findOneAndReplace-dots_and_dollars.yml +140 -0
  1125. data/spec/spec_tests/data/crud_unified/findOneAndReplace-hint-clientError.yml +83 -0
  1126. data/spec/spec_tests/data/crud_unified/findOneAndReplace-hint-serverError.yml +99 -0
  1127. data/spec/spec_tests/data/crud_unified/findOneAndReplace-hint-unacknowledged.yml +96 -0
  1128. data/spec/spec_tests/data/crud_unified/findOneAndReplace-hint.yml +98 -0
  1129. data/spec/spec_tests/data/crud_unified/findOneAndReplace-let.yml +94 -0
  1130. data/spec/spec_tests/data/crud_unified/findOneAndUpdate-comment.yml +95 -0
  1131. data/spec/spec_tests/data/crud_unified/findOneAndUpdate-dots_and_dollars.yml +127 -0
  1132. data/spec/spec_tests/data/crud_unified/findOneAndUpdate-errorResponse.yml +69 -0
  1133. data/spec/spec_tests/data/crud_unified/findOneAndUpdate-hint-clientError.yml +84 -0
  1134. data/spec/spec_tests/data/crud_unified/findOneAndUpdate-hint-serverError.yml +100 -0
  1135. data/spec/spec_tests/data/crud_unified/findOneAndUpdate-hint-unacknowledged.yml +92 -0
  1136. data/spec/spec_tests/data/crud_unified/findOneAndUpdate-hint.yml +99 -0
  1137. data/spec/spec_tests/data/crud_unified/findOneAndUpdate-let.yml +96 -0
  1138. data/spec/spec_tests/data/crud_unified/insertMany-comment.yml +93 -0
  1139. data/spec/spec_tests/data/crud_unified/insertMany-dots_and_dollars.yml +128 -0
  1140. data/spec/spec_tests/data/crud_unified/insertOne-comment.yml +91 -0
  1141. data/spec/spec_tests/data/crud_unified/insertOne-dots_and_dollars.yml +238 -0
  1142. data/spec/spec_tests/data/crud_unified/insertOne-errorResponse.yml +46 -0
  1143. data/spec/spec_tests/data/crud_unified/replaceOne-comment.yml +105 -0
  1144. data/spec/spec_tests/data/crud_unified/replaceOne-dots_and_dollars.yml +180 -0
  1145. data/spec/spec_tests/data/crud_unified/replaceOne-hint-unacknowledged.yml +95 -0
  1146. data/spec/spec_tests/data/crud_unified/replaceOne-hint.yml +108 -0
  1147. data/spec/spec_tests/data/crud_unified/replaceOne-let.yml +98 -0
  1148. data/spec/spec_tests/data/crud_unified/replaceOne-validation.yml +37 -0
  1149. data/spec/spec_tests/data/crud_unified/updateMany-comment.yml +104 -0
  1150. data/spec/spec_tests/data/crud_unified/updateMany-dots_and_dollars.yml +138 -0
  1151. data/spec/spec_tests/data/crud_unified/updateMany-hint-clientError.yml +91 -0
  1152. data/spec/spec_tests/data/crud_unified/updateMany-hint-serverError.yml +115 -0
  1153. data/spec/spec_tests/data/crud_unified/updateMany-hint-unacknowledged.yml +96 -0
  1154. data/spec/spec_tests/data/crud_unified/updateMany-hint.yml +115 -0
  1155. data/spec/spec_tests/data/crud_unified/updateMany-let.yml +107 -0
  1156. data/spec/spec_tests/data/crud_unified/updateMany-validation.yml +39 -0
  1157. data/spec/spec_tests/data/crud_unified/updateOne-comment.yml +104 -0
  1158. data/spec/spec_tests/data/crud_unified/updateOne-dots_and_dollars.yml +138 -0
  1159. data/spec/spec_tests/data/crud_unified/updateOne-errorResponse.yml +47 -0
  1160. data/spec/spec_tests/data/crud_unified/updateOne-hint-clientError.yml +85 -0
  1161. data/spec/spec_tests/data/crud_unified/updateOne-hint-serverError.yml +109 -0
  1162. data/spec/spec_tests/data/crud_unified/updateOne-hint-unacknowledged.yml +95 -0
  1163. data/spec/spec_tests/data/crud_unified/updateOne-hint.yml +109 -0
  1164. data/spec/spec_tests/data/crud_unified/updateOne-let.yml +102 -0
  1165. data/spec/spec_tests/data/crud_unified/updateOne-validation.yml +37 -0
  1166. data/spec/spec_tests/data/crud_unified/updateWithPipelines.yml +299 -0
  1167. data/spec/spec_tests/data/gridfs_unified/delete.yml +198 -0
  1168. data/spec/spec_tests/data/gridfs_unified/download.yml +241 -0
  1169. data/spec/spec_tests/data/gridfs_unified/downloadByName.yml +159 -0
  1170. data/spec/spec_tests/data/gridfs_unified/upload-disableMD5.yml +92 -0
  1171. data/spec/spec_tests/data/gridfs_unified/upload.yml +288 -0
  1172. data/spec/spec_tests/data/load_balancers/event-monitoring.yml +99 -0
  1173. data/spec/spec_tests/data/load_balancers/lb-connection-establishment.yml +36 -0
  1174. data/spec/spec_tests/data/load_balancers/non-lb-connection-establishment.yml +56 -0
  1175. data/spec/spec_tests/data/load_balancers/server-selection.yml +50 -0
  1176. data/spec/spec_tests/data/max_staleness/ReplicaSetNoPrimary/DefaultNoMaxStaleness.yml +2 -2
  1177. data/spec/spec_tests/data/max_staleness/ReplicaSetNoPrimary/LastUpdateTime.yml +3 -3
  1178. data/spec/spec_tests/data/max_staleness/ReplicaSetNoPrimary/Nearest.yml +3 -3
  1179. data/spec/spec_tests/data/max_staleness/ReplicaSetNoPrimary/Nearest2.yml +3 -3
  1180. data/spec/spec_tests/data/max_staleness/ReplicaSetNoPrimary/PrimaryPreferred.yml +2 -2
  1181. data/spec/spec_tests/data/max_staleness/ReplicaSetNoPrimary/PrimaryPreferred_tags.yml +2 -2
  1182. data/spec/spec_tests/data/max_staleness/ReplicaSetNoPrimary/Secondary.yml +4 -4
  1183. data/spec/spec_tests/data/max_staleness/ReplicaSetNoPrimary/SecondaryPreferred.yml +2 -2
  1184. data/spec/spec_tests/data/max_staleness/ReplicaSetNoPrimary/SecondaryPreferred_tags.yml +4 -4
  1185. data/spec/spec_tests/data/max_staleness/ReplicaSetNoPrimary/ZeroMaxStaleness.yml +2 -2
  1186. data/spec/spec_tests/data/max_staleness/ReplicaSetWithPrimary/DefaultNoMaxStaleness.yml +2 -2
  1187. data/spec/spec_tests/data/max_staleness/ReplicaSetWithPrimary/LastUpdateTime.yml +3 -3
  1188. data/spec/spec_tests/data/max_staleness/ReplicaSetWithPrimary/LongHeartbeat.yml +2 -2
  1189. data/spec/spec_tests/data/max_staleness/ReplicaSetWithPrimary/LongHeartbeat2.yml +2 -2
  1190. data/spec/spec_tests/data/max_staleness/ReplicaSetWithPrimary/MaxStalenessTooSmall.yml +2 -2
  1191. data/spec/spec_tests/data/max_staleness/ReplicaSetWithPrimary/MaxStalenessWithModePrimary.yml +2 -2
  1192. data/spec/spec_tests/data/max_staleness/ReplicaSetWithPrimary/Nearest.yml +3 -3
  1193. data/spec/spec_tests/data/max_staleness/ReplicaSetWithPrimary/Nearest2.yml +3 -3
  1194. data/spec/spec_tests/data/max_staleness/ReplicaSetWithPrimary/Nearest_tags.yml +2 -2
  1195. data/spec/spec_tests/data/max_staleness/ReplicaSetWithPrimary/PrimaryPreferred.yml +2 -2
  1196. data/spec/spec_tests/data/max_staleness/ReplicaSetWithPrimary/SecondaryPreferred.yml +2 -2
  1197. data/spec/spec_tests/data/max_staleness/ReplicaSetWithPrimary/SecondaryPreferred_tags.yml +5 -5
  1198. data/spec/spec_tests/data/max_staleness/ReplicaSetWithPrimary/SecondaryPreferred_tags2.yml +3 -3
  1199. data/spec/spec_tests/data/max_staleness/ReplicaSetWithPrimary/Secondary_tags.yml +5 -5
  1200. data/spec/spec_tests/data/max_staleness/ReplicaSetWithPrimary/Secondary_tags2.yml +3 -3
  1201. data/spec/spec_tests/data/max_staleness/ReplicaSetWithPrimary/ZeroMaxStaleness.yml +2 -2
  1202. data/spec/spec_tests/data/max_staleness/Sharded/SmallMaxStaleness.yml +2 -2
  1203. data/spec/spec_tests/data/max_staleness/Single/SmallMaxStaleness.yml +1 -1
  1204. data/spec/spec_tests/data/max_staleness/Unknown/SmallMaxStaleness.yml +1 -1
  1205. data/spec/spec_tests/data/retryable_reads/legacy/aggregate-serverErrors.yml +157 -0
  1206. data/spec/spec_tests/data/retryable_reads/legacy/changeStreams-client.watch-serverErrors.yml +150 -0
  1207. data/spec/spec_tests/data/retryable_reads/legacy/changeStreams-client.watch.yml +62 -0
  1208. data/spec/spec_tests/data/retryable_reads/legacy/changeStreams-db.coll.watch-serverErrors.yml +150 -0
  1209. data/spec/spec_tests/data/retryable_reads/legacy/changeStreams-db.coll.watch.yml +66 -0
  1210. data/spec/spec_tests/data/retryable_reads/legacy/changeStreams-db.watch-serverErrors.yml +154 -0
  1211. data/spec/spec_tests/data/retryable_reads/legacy/changeStreams-db.watch.yml +62 -0
  1212. data/spec/spec_tests/data/retryable_reads/legacy/count-serverErrors.yml +150 -0
  1213. data/spec/spec_tests/data/retryable_reads/legacy/countDocuments-serverErrors.yml +150 -0
  1214. data/spec/spec_tests/data/retryable_reads/legacy/distinct-serverErrors.yml +156 -0
  1215. data/spec/spec_tests/data/retryable_reads/legacy/estimatedDocumentCount-serverErrors.yml +148 -0
  1216. data/spec/spec_tests/data/retryable_reads/legacy/find-serverErrors.yml +160 -0
  1217. data/spec/spec_tests/data/retryable_reads/legacy/findOne-serverErrors.yml +154 -0
  1218. data/spec/spec_tests/data/retryable_reads/legacy/gridfs-download-serverErrors.yml +173 -0
  1219. data/spec/spec_tests/data/retryable_reads/legacy/gridfs-downloadByName-serverErrors.yml +174 -0
  1220. data/spec/spec_tests/data/retryable_reads/legacy/listCollectionNames-serverErrors.yml +143 -0
  1221. data/spec/spec_tests/data/retryable_reads/legacy/listCollectionObjects-serverErrors.yml +144 -0
  1222. data/spec/spec_tests/data/retryable_reads/legacy/listCollections-serverErrors.yml +143 -0
  1223. data/spec/spec_tests/data/retryable_reads/legacy/listDatabaseNames-serverErrors.yml +143 -0
  1224. data/spec/spec_tests/data/retryable_reads/legacy/listDatabaseObjects-serverErrors.yml +144 -0
  1225. data/spec/spec_tests/data/retryable_reads/legacy/listDatabases-serverErrors.yml +144 -0
  1226. data/spec/spec_tests/data/retryable_reads/legacy/listIndexNames-serverErrors.yml +144 -0
  1227. data/spec/spec_tests/data/retryable_reads/legacy/listIndexNames.yml +60 -0
  1228. data/spec/spec_tests/data/retryable_reads/legacy/listIndexes-serverErrors.yml +145 -0
  1229. data/spec/spec_tests/data/retryable_reads/legacy/mapReduce.yml +62 -0
  1230. data/spec/spec_tests/data/retryable_reads/unified/handshakeError.yml +1342 -0
  1231. data/spec/spec_tests/data/retryable_writes/legacy/bulkWrite-serverErrors.yml +130 -0
  1232. data/spec/spec_tests/data/retryable_writes/legacy/bulkWrite.yml +402 -0
  1233. data/spec/spec_tests/data/retryable_writes/legacy/deleteOne-serverErrors.yml +73 -0
  1234. data/spec/spec_tests/data/retryable_writes/legacy/findOneAndDelete-serverErrors.yml +74 -0
  1235. data/spec/spec_tests/data/retryable_writes/legacy/findOneAndReplace-serverErrors.yml +80 -0
  1236. data/spec/spec_tests/data/retryable_writes/legacy/findOneAndUpdate-serverErrors.yml +79 -0
  1237. data/spec/spec_tests/data/retryable_writes/legacy/insertMany-serverErrors.yml +84 -0
  1238. data/spec/spec_tests/data/retryable_writes/legacy/insertOne-serverErrors.yml +527 -0
  1239. data/spec/spec_tests/data/retryable_writes/legacy/replaceOne-serverErrors.yml +82 -0
  1240. data/spec/spec_tests/data/retryable_writes/legacy/updateOne-serverErrors.yml +82 -0
  1241. data/spec/spec_tests/data/retryable_writes/unified/bulkWrite-serverErrors.yml +96 -0
  1242. data/spec/spec_tests/data/retryable_writes/unified/handshakeError.yml +785 -0
  1243. data/spec/spec_tests/data/retryable_writes/unified/insertOne-noWritesPerformedError.yml +54 -0
  1244. data/spec/spec_tests/data/retryable_writes/unified/insertOne-serverErrors.yml +78 -0
  1245. data/spec/spec_tests/data/sdam/errors/error_handling_handshake.yml +2 -1
  1246. data/spec/spec_tests/data/sdam/errors/non-stale-network-error.yml +2 -1
  1247. data/spec/spec_tests/data/sdam/errors/non-stale-network-timeout-error.yml +2 -1
  1248. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-greater-InterruptedAtShutdown.yml +2 -1
  1249. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-greater-InterruptedDueToReplStateChange.yml +2 -1
  1250. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-greater-LegacyNotPrimary.yml +61 -0
  1251. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-greater-NotPrimaryNoSecondaryOk.yml +61 -0
  1252. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-greater-NotPrimaryOrSecondary.yml +61 -0
  1253. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-greater-NotWritablePrimary.yml +61 -0
  1254. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-greater-PrimarySteppedDown.yml +2 -1
  1255. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-greater-ShutdownInProgress.yml +2 -1
  1256. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-missing-InterruptedAtShutdown.yml +2 -1
  1257. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-missing-InterruptedDueToReplStateChange.yml +2 -1
  1258. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-missing-LegacyNotPrimary.yml +52 -0
  1259. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-missing-NotPrimaryNoSecondaryOk.yml +52 -0
  1260. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-missing-NotPrimaryOrSecondary.yml +52 -0
  1261. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-missing-NotWritablePrimary.yml +52 -0
  1262. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-missing-PrimarySteppedDown.yml +2 -1
  1263. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-missing-ShutdownInProgress.yml +2 -1
  1264. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-proccessId-changed-InterruptedAtShutdown.yml +2 -1
  1265. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-proccessId-changed-InterruptedDueToReplStateChange.yml +2 -1
  1266. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-proccessId-changed-LegacyNotPrimary.yml +61 -0
  1267. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-proccessId-changed-NotPrimaryNoSecondaryOk.yml +61 -0
  1268. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-proccessId-changed-NotPrimaryOrSecondary.yml +61 -0
  1269. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-proccessId-changed-NotWritablePrimary.yml +61 -0
  1270. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-proccessId-changed-PrimarySteppedDown.yml +2 -1
  1271. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-proccessId-changed-ShutdownInProgress.yml +2 -1
  1272. data/spec/spec_tests/data/sdam/errors/post-42-InterruptedAtShutdown.yml +2 -1
  1273. data/spec/spec_tests/data/sdam/errors/post-42-InterruptedDueToReplStateChange.yml +2 -1
  1274. data/spec/spec_tests/data/sdam/errors/post-42-LegacyNotPrimary.yml +47 -0
  1275. data/spec/spec_tests/data/sdam/errors/post-42-NotPrimaryNoSecondaryOk.yml +47 -0
  1276. data/spec/spec_tests/data/sdam/errors/post-42-NotPrimaryOrSecondary.yml +47 -0
  1277. data/spec/spec_tests/data/sdam/errors/post-42-NotWritablePrimary.yml +47 -0
  1278. data/spec/spec_tests/data/sdam/errors/post-42-PrimarySteppedDown.yml +2 -1
  1279. data/spec/spec_tests/data/sdam/errors/post-42-ShutdownInProgress.yml +2 -1
  1280. data/spec/spec_tests/data/sdam/errors/pre-42-InterruptedAtShutdown.yml +2 -1
  1281. data/spec/spec_tests/data/sdam/errors/pre-42-InterruptedDueToReplStateChange.yml +2 -1
  1282. data/spec/spec_tests/data/sdam/errors/pre-42-LegacyNotPrimary.yml +47 -0
  1283. data/spec/spec_tests/data/sdam/errors/pre-42-NotPrimaryNoSecondaryOk.yml +47 -0
  1284. data/spec/spec_tests/data/sdam/errors/pre-42-NotPrimaryOrSecondary.yml +47 -0
  1285. data/spec/spec_tests/data/sdam/errors/pre-42-NotWritablePrimary.yml +47 -0
  1286. data/spec/spec_tests/data/sdam/errors/pre-42-PrimarySteppedDown.yml +2 -1
  1287. data/spec/spec_tests/data/sdam/errors/pre-42-ShutdownInProgress.yml +2 -1
  1288. data/spec/spec_tests/data/sdam/errors/prefer-error-code.yml +54 -0
  1289. data/spec/spec_tests/data/sdam/errors/stale-generation-InterruptedAtShutdown.yml +4 -2
  1290. data/spec/spec_tests/data/sdam/errors/stale-generation-InterruptedDueToReplStateChange.yml +4 -2
  1291. data/spec/spec_tests/data/sdam/errors/stale-generation-NotPrimaryNoSecondaryOk.yml +91 -0
  1292. data/spec/spec_tests/data/sdam/errors/stale-generation-NotPrimaryOrSecondary.yml +91 -0
  1293. data/spec/spec_tests/data/sdam/errors/stale-generation-NotWritablePrimary.yml +91 -0
  1294. data/spec/spec_tests/data/sdam/errors/stale-generation-PrimarySteppedDown.yml +4 -2
  1295. data/spec/spec_tests/data/sdam/errors/stale-generation-ShutdownInProgress.yml +4 -2
  1296. data/spec/spec_tests/data/sdam/errors/stale-generation-afterHandshakeCompletes-InterruptedAtShutdown.yml +4 -2
  1297. data/spec/spec_tests/data/sdam/errors/stale-generation-afterHandshakeCompletes-InterruptedDueToReplStateChange.yml +4 -2
  1298. data/spec/spec_tests/data/sdam/errors/stale-generation-afterHandshakeCompletes-LegacyNotPrimary.yml +91 -0
  1299. data/spec/spec_tests/data/sdam/errors/stale-generation-afterHandshakeCompletes-NotPrimaryNoSecondaryOk.yml +91 -0
  1300. data/spec/spec_tests/data/sdam/errors/stale-generation-afterHandshakeCompletes-NotPrimaryOrSecondary.yml +91 -0
  1301. data/spec/spec_tests/data/sdam/errors/stale-generation-afterHandshakeCompletes-NotWritablePrimary.yml +91 -0
  1302. data/spec/spec_tests/data/sdam/errors/stale-generation-afterHandshakeCompletes-PrimarySteppedDown.yml +4 -2
  1303. data/spec/spec_tests/data/sdam/errors/stale-generation-afterHandshakeCompletes-ShutdownInProgress.yml +4 -2
  1304. data/spec/spec_tests/data/sdam/errors/stale-generation-afterHandshakeCompletes-network.yml +6 -4
  1305. data/spec/spec_tests/data/sdam/errors/stale-generation-afterHandshakeCompletes-timeout.yml +6 -4
  1306. data/spec/spec_tests/data/sdam/errors/stale-generation-beforeHandshakeCompletes-InterruptedAtShutdown.yml +4 -2
  1307. data/spec/spec_tests/data/sdam/errors/stale-generation-beforeHandshakeCompletes-InterruptedDueToReplStateChange.yml +4 -2
  1308. data/spec/spec_tests/data/sdam/errors/stale-generation-beforeHandshakeCompletes-LegacyNotPrimary.yml +91 -0
  1309. data/spec/spec_tests/data/sdam/errors/stale-generation-beforeHandshakeCompletes-NotPrimaryNoSecondaryOk.yml +91 -0
  1310. data/spec/spec_tests/data/sdam/errors/stale-generation-beforeHandshakeCompletes-NotPrimaryOrSecondary.yml +91 -0
  1311. data/spec/spec_tests/data/sdam/errors/stale-generation-beforeHandshakeCompletes-NotWritablePrimary.yml +91 -0
  1312. data/spec/spec_tests/data/sdam/errors/stale-generation-beforeHandshakeCompletes-PrimarySteppedDown.yml +4 -2
  1313. data/spec/spec_tests/data/sdam/errors/stale-generation-beforeHandshakeCompletes-ShutdownInProgress.yml +4 -2
  1314. data/spec/spec_tests/data/sdam/errors/stale-generation-beforeHandshakeCompletes-network.yml +6 -4
  1315. data/spec/spec_tests/data/sdam/errors/stale-generation-beforeHandshakeCompletes-timeout.yml +6 -4
  1316. data/spec/spec_tests/data/sdam/errors/stale-topologyVersion-InterruptedAtShutdown.yml +2 -1
  1317. data/spec/spec_tests/data/sdam/errors/stale-topologyVersion-InterruptedDueToReplStateChange.yml +2 -1
  1318. data/spec/spec_tests/data/sdam/errors/stale-topologyVersion-LegacyNotPrimary.yml +65 -0
  1319. data/spec/spec_tests/data/sdam/errors/stale-topologyVersion-NotPrimaryNoSecondaryOk.yml +65 -0
  1320. data/spec/spec_tests/data/sdam/errors/stale-topologyVersion-NotPrimaryOrSecondary.yml +65 -0
  1321. data/spec/spec_tests/data/sdam/errors/stale-topologyVersion-NotWritablePrimary.yml +65 -0
  1322. data/spec/spec_tests/data/sdam/errors/stale-topologyVersion-PrimarySteppedDown.yml +2 -1
  1323. data/spec/spec_tests/data/sdam/errors/stale-topologyVersion-ShutdownInProgress.yml +2 -1
  1324. data/spec/spec_tests/data/sdam/errors/write_errors_ignored.yml +42 -0
  1325. data/spec/spec_tests/data/sdam/load-balanced/discover_load_balancer.yml +25 -0
  1326. data/spec/spec_tests/data/sdam/rs/compatible.yml +4 -2
  1327. data/spec/spec_tests/data/sdam/rs/compatible_unknown.yml +2 -1
  1328. data/spec/spec_tests/data/sdam/rs/discover_arbiters.yml +2 -1
  1329. data/spec/spec_tests/data/sdam/rs/discover_arbiters_replicaset.yml +2 -1
  1330. data/spec/spec_tests/data/sdam/rs/discover_ghost.yml +2 -1
  1331. data/spec/spec_tests/data/sdam/rs/discover_ghost_replicaset.yml +2 -1
  1332. data/spec/spec_tests/data/sdam/rs/discover_hidden.yml +2 -1
  1333. data/spec/spec_tests/data/sdam/rs/discover_hidden_replicaset.yml +2 -1
  1334. data/spec/spec_tests/data/sdam/rs/discover_passives.yml +4 -2
  1335. data/spec/spec_tests/data/sdam/rs/discover_passives_replicaset.yml +4 -2
  1336. data/spec/spec_tests/data/sdam/rs/discover_primary.yml +2 -1
  1337. data/spec/spec_tests/data/sdam/rs/discover_primary_replicaset.yml +2 -1
  1338. data/spec/spec_tests/data/sdam/rs/discover_rsother.yml +2 -1
  1339. data/spec/spec_tests/data/sdam/rs/discover_rsother_replicaset.yml +4 -2
  1340. data/spec/spec_tests/data/sdam/rs/discover_secondary.yml +2 -1
  1341. data/spec/spec_tests/data/sdam/rs/discover_secondary_replicaset.yml +2 -1
  1342. data/spec/spec_tests/data/sdam/rs/discovery.yml +8 -4
  1343. data/spec/spec_tests/data/sdam/rs/electionId_precedence_setVersion.yml +62 -0
  1344. data/spec/spec_tests/data/sdam/rs/equal_electionids.yml +4 -2
  1345. data/spec/spec_tests/data/sdam/rs/hosts_differ_from_seeds.yml +2 -1
  1346. data/spec/spec_tests/data/sdam/rs/incompatible_arbiter.yml +3 -1
  1347. data/spec/spec_tests/data/sdam/rs/incompatible_ghost.yml +3 -1
  1348. data/spec/spec_tests/data/sdam/rs/incompatible_other.yml +3 -1
  1349. data/spec/spec_tests/data/sdam/rs/ls_timeout.yml +12 -6
  1350. data/spec/spec_tests/data/sdam/rs/member_reconfig.yml +4 -2
  1351. data/spec/spec_tests/data/sdam/rs/member_standalone.yml +4 -2
  1352. data/spec/spec_tests/data/sdam/rs/new_primary.yml +4 -2
  1353. data/spec/spec_tests/data/sdam/rs/new_primary_new_electionid.yml +6 -3
  1354. data/spec/spec_tests/data/sdam/rs/new_primary_new_setversion.yml +6 -3
  1355. data/spec/spec_tests/data/sdam/rs/new_primary_wrong_set_name.yml +4 -2
  1356. data/spec/spec_tests/data/sdam/rs/non_rs_member.yml +1 -0
  1357. data/spec/spec_tests/data/sdam/rs/normalize_case.yml +2 -1
  1358. data/spec/spec_tests/data/sdam/rs/normalize_case_me.yml +4 -2
  1359. data/spec/spec_tests/data/sdam/rs/null_election_id-pre-6.0.yml +175 -0
  1360. data/spec/spec_tests/data/sdam/rs/null_election_id.yml +28 -22
  1361. data/spec/spec_tests/data/sdam/rs/primary_becomes_ghost.yml +4 -2
  1362. data/spec/spec_tests/data/sdam/rs/primary_becomes_mongos.yml +4 -2
  1363. data/spec/spec_tests/data/sdam/rs/primary_becomes_standalone.yml +2 -1
  1364. data/spec/spec_tests/data/sdam/rs/primary_changes_set_name.yml +4 -2
  1365. data/spec/spec_tests/data/sdam/rs/primary_disconnect.yml +2 -1
  1366. data/spec/spec_tests/data/sdam/rs/primary_disconnect_electionid.yml +10 -5
  1367. data/spec/spec_tests/data/sdam/rs/primary_disconnect_setversion.yml +10 -5
  1368. data/spec/spec_tests/data/sdam/rs/primary_hint_from_secondary_with_mismatched_me.yml +4 -2
  1369. data/spec/spec_tests/data/sdam/rs/primary_mismatched_me.yml +2 -1
  1370. data/spec/spec_tests/data/sdam/rs/primary_mismatched_me_not_removed.yml +5 -3
  1371. data/spec/spec_tests/data/sdam/rs/primary_reports_new_member.yml +8 -4
  1372. data/spec/spec_tests/data/sdam/rs/primary_to_no_primary_mismatched_me.yml +4 -2
  1373. data/spec/spec_tests/data/sdam/rs/primary_wrong_set_name.yml +2 -1
  1374. data/spec/spec_tests/data/sdam/rs/repeated.yml +9 -5
  1375. data/spec/spec_tests/data/sdam/rs/replicaset_rsnp.yml +2 -1
  1376. data/spec/spec_tests/data/sdam/rs/response_from_removed.yml +4 -2
  1377. data/spec/spec_tests/data/sdam/rs/sec_not_auth.yml +4 -2
  1378. data/spec/spec_tests/data/sdam/rs/secondary_ignore_ok_0-pre-6.0.yml +87 -0
  1379. data/spec/spec_tests/data/sdam/rs/secondary_ignore_ok_0.yml +5 -3
  1380. data/spec/spec_tests/data/sdam/rs/secondary_mismatched_me.yml +2 -1
  1381. data/spec/spec_tests/data/sdam/rs/secondary_wrong_set_name.yml +2 -1
  1382. data/spec/spec_tests/data/sdam/rs/secondary_wrong_set_name_with_primary.yml +4 -2
  1383. data/spec/spec_tests/data/sdam/rs/set_version_can_rollback.yml +101 -0
  1384. data/spec/spec_tests/data/sdam/rs/setversion_equal_max_without_electionid.yml +78 -0
  1385. data/spec/spec_tests/data/sdam/rs/setversion_greaterthan_max_without_electionid.yml +79 -0
  1386. data/spec/spec_tests/data/sdam/rs/setversion_without_electionid-pre-6.0.yml +79 -0
  1387. data/spec/spec_tests/data/sdam/rs/setversion_without_electionid.yml +13 -12
  1388. data/spec/spec_tests/data/sdam/rs/stepdown_change_set_name.yml +4 -2
  1389. data/spec/spec_tests/data/sdam/rs/too_new.yml +4 -2
  1390. data/spec/spec_tests/data/sdam/rs/too_old.yml +4 -2
  1391. data/spec/spec_tests/data/sdam/rs/topology_version_equal.yml +4 -2
  1392. data/spec/spec_tests/data/sdam/rs/topology_version_greater.yml +10 -5
  1393. data/spec/spec_tests/data/sdam/rs/topology_version_less.yml +4 -2
  1394. data/spec/spec_tests/data/sdam/rs/unexpected_mongos.yml +2 -1
  1395. data/spec/spec_tests/data/sdam/rs/use_setversion_without_electionid-pre-6.0.yml +117 -0
  1396. data/spec/spec_tests/data/sdam/rs/use_setversion_without_electionid.yml +29 -24
  1397. data/spec/spec_tests/data/sdam/rs/wrong_set_name.yml +2 -1
  1398. data/spec/spec_tests/data/sdam/sharded/compatible.yml +4 -2
  1399. data/spec/spec_tests/data/sdam/sharded/discover_single_mongos.yml +2 -1
  1400. data/spec/spec_tests/data/sdam/sharded/ls_timeout_mongos.yml +9 -5
  1401. data/spec/spec_tests/data/sdam/sharded/mongos_disconnect.yml +6 -3
  1402. data/spec/spec_tests/data/sdam/sharded/multiple_mongoses.yml +4 -2
  1403. data/spec/spec_tests/data/sdam/sharded/non_mongos_removed.yml +4 -2
  1404. data/spec/spec_tests/data/sdam/sharded/too_new.yml +4 -2
  1405. data/spec/spec_tests/data/sdam/sharded/too_old.yml +4 -2
  1406. data/spec/spec_tests/data/sdam/single/compatible.yml +2 -1
  1407. data/spec/spec_tests/data/sdam/single/direct_connection_external_ip.yml +2 -1
  1408. data/spec/spec_tests/data/sdam/single/direct_connection_mongos.yml +2 -1
  1409. data/spec/spec_tests/data/sdam/single/direct_connection_replicaset.yml +2 -1
  1410. data/spec/spec_tests/data/sdam/single/direct_connection_rsarbiter.yml +2 -1
  1411. data/spec/spec_tests/data/sdam/single/direct_connection_rsprimary.yml +2 -1
  1412. data/spec/spec_tests/data/sdam/single/direct_connection_rssecondary.yml +2 -1
  1413. data/spec/spec_tests/data/sdam/single/direct_connection_standalone.yml +2 -1
  1414. data/spec/spec_tests/data/sdam/single/direct_connection_wrong_set_name.yml +4 -2
  1415. data/spec/spec_tests/data/sdam/single/discover_standalone.yml +2 -1
  1416. data/spec/spec_tests/data/sdam/single/ls_timeout_standalone.yml +2 -1
  1417. data/spec/spec_tests/data/sdam/single/not_ok_response.yml +5 -3
  1418. data/spec/spec_tests/data/sdam/single/standalone_removed.yml +2 -1
  1419. data/spec/spec_tests/data/sdam/single/standalone_using_legacy_hello.yml +34 -0
  1420. data/spec/spec_tests/data/sdam/single/too_new.yml +2 -1
  1421. data/spec/spec_tests/data/sdam/single/too_old.yml +2 -1
  1422. data/spec/spec_tests/data/sdam/single/too_old_then_upgraded.yml +4 -2
  1423. data/spec/spec_tests/data/sdam_monitoring/discovered_standalone.yml +2 -4
  1424. data/spec/spec_tests/data/sdam_monitoring/load_balancer.yml +65 -0
  1425. data/spec/spec_tests/data/sdam_monitoring/replica_set_with_no_primary.yml +40 -40
  1426. data/spec/spec_tests/data/sdam_monitoring/replica_set_with_primary.yml +40 -40
  1427. data/spec/spec_tests/data/sdam_monitoring/replica_set_with_removal.yml +4 -3
  1428. data/spec/spec_tests/data/sdam_monitoring/required_replica_set.yml +3 -2
  1429. data/spec/spec_tests/data/sdam_monitoring/standalone.yml +3 -3
  1430. data/spec/spec_tests/data/sdam_monitoring/standalone_repeated.yml +2 -2
  1431. data/spec/spec_tests/data/sdam_monitoring/standalone_suppress_equal_description_changes.yml +4 -4
  1432. data/spec/spec_tests/data/sdam_monitoring/standalone_to_rs_with_me_mismatch.yml +2 -2
  1433. data/spec/spec_tests/data/sdam_unified/auth-error.yml +130 -0
  1434. data/spec/spec_tests/data/sdam_unified/auth-misc-command-error.yml +132 -0
  1435. data/spec/spec_tests/data/sdam_unified/auth-network-error.yml +132 -0
  1436. data/spec/spec_tests/data/sdam_unified/auth-network-timeout-error.yml +138 -0
  1437. data/spec/spec_tests/data/sdam_unified/auth-shutdown-error.yml +133 -0
  1438. data/spec/spec_tests/data/sdam_unified/cancel-server-check.yml +143 -0
  1439. data/spec/spec_tests/data/sdam_unified/connectTimeoutMS.yml +130 -0
  1440. data/spec/spec_tests/data/sdam_unified/find-network-error.yml +135 -0
  1441. data/spec/spec_tests/data/sdam_unified/find-network-timeout-error.yml +119 -0
  1442. data/spec/spec_tests/data/sdam_unified/find-shutdown-error.yml +163 -0
  1443. data/spec/spec_tests/data/sdam_unified/hello-command-error.yml +233 -0
  1444. data/spec/spec_tests/data/sdam_unified/hello-network-error.yml +228 -0
  1445. data/spec/spec_tests/data/sdam_unified/hello-timeout.yml +318 -0
  1446. data/spec/spec_tests/data/sdam_unified/insert-network-error.yml +137 -0
  1447. data/spec/spec_tests/data/sdam_unified/insert-shutdown-error.yml +162 -0
  1448. data/spec/spec_tests/data/sdam_unified/interruptInUse-pool-clear.yml +340 -0
  1449. data/spec/spec_tests/data/sdam_unified/minPoolSize-error.yml +125 -0
  1450. data/spec/spec_tests/data/sdam_unified/pool-cleared-error.yml +239 -0
  1451. data/spec/spec_tests/data/sdam_unified/rediscover-quickly-after-step-down.yml +144 -0
  1452. data/spec/spec_tests/data/seed_list_discovery/load-balanced/loadBalanced-directConnection.yml +14 -0
  1453. data/spec/spec_tests/data/seed_list_discovery/load-balanced/loadBalanced-no-results.yml +5 -0
  1454. data/spec/spec_tests/data/seed_list_discovery/load-balanced/loadBalanced-replicaSet-errors.yml +6 -0
  1455. data/spec/spec_tests/data/seed_list_discovery/load-balanced/loadBalanced-true-multiple-hosts.yml +5 -0
  1456. data/spec/spec_tests/data/seed_list_discovery/load-balanced/loadBalanced-true-txt.yml +11 -0
  1457. data/spec/spec_tests/data/seed_list_discovery/load-balanced/srvMaxHosts-conflicts_with_loadBalanced-true-txt.yml +5 -0
  1458. data/spec/spec_tests/data/seed_list_discovery/load-balanced/srvMaxHosts-conflicts_with_loadBalanced-true.yml +5 -0
  1459. data/spec/spec_tests/data/seed_list_discovery/load-balanced/srvMaxHosts-zero-txt.yml +11 -0
  1460. data/spec/spec_tests/data/seed_list_discovery/load-balanced/srvMaxHosts-zero.yml +11 -0
  1461. data/spec/spec_tests/data/seed_list_discovery/replica-set/encoded-userinfo-and-db.yml +15 -0
  1462. data/spec/spec_tests/data/seed_list_discovery/replica-set/loadBalanced-false-txt.yml +10 -0
  1463. data/spec/spec_tests/data/seed_list_discovery/replica-set/srv-service-name.yml +11 -0
  1464. data/spec/spec_tests/data/seed_list_discovery/replica-set/srvMaxHosts-conflicts_with_replicaSet-txt.yml +5 -0
  1465. data/spec/spec_tests/data/seed_list_discovery/replica-set/srvMaxHosts-conflicts_with_replicaSet.yml +5 -0
  1466. data/spec/spec_tests/data/seed_list_discovery/replica-set/srvMaxHosts-equal_to_srv_records.yml +16 -0
  1467. data/spec/spec_tests/data/seed_list_discovery/replica-set/srvMaxHosts-greater_than_srv_records.yml +15 -0
  1468. data/spec/spec_tests/data/seed_list_discovery/replica-set/srvMaxHosts-less_than_srv_records.yml +15 -0
  1469. data/spec/spec_tests/data/seed_list_discovery/replica-set/srvMaxHosts-zero-txt.yml +15 -0
  1470. data/spec/spec_tests/data/seed_list_discovery/replica-set/srvMaxHosts-zero.yml +15 -0
  1471. data/spec/spec_tests/data/seed_list_discovery/replica-set/uri-with-admin-database.yml +13 -0
  1472. data/spec/spec_tests/data/seed_list_discovery/replica-set/uri-with-auth.yml +12 -0
  1473. data/spec/spec_tests/data/seed_list_discovery/sharded/srvMaxHosts-equal_to_srv_records.yml +13 -0
  1474. data/spec/spec_tests/data/seed_list_discovery/sharded/srvMaxHosts-greater_than_srv_records.yml +12 -0
  1475. data/spec/spec_tests/data/seed_list_discovery/sharded/srvMaxHosts-less_than_srv_records.yml +10 -0
  1476. data/spec/spec_tests/data/seed_list_discovery/sharded/srvMaxHosts-zero.yml +11 -0
  1477. data/spec/spec_tests/data/server_selection/Unknown/read/ghost.yml +11 -0
  1478. data/spec/spec_tests/data/server_selection/Unknown/write/ghost.yml +11 -0
  1479. data/spec/spec_tests/data/sessions_unified/driver-sessions-server-support.yml +123 -0
  1480. data/spec/spec_tests/data/sessions_unified/implicit-sessions-default-causal-consistency.yml +119 -0
  1481. data/spec/spec_tests/data/sessions_unified/snapshot-sessions-not-supported-client-error.yml +75 -0
  1482. data/spec/spec_tests/data/sessions_unified/snapshot-sessions-not-supported-server-error.yml +102 -0
  1483. data/spec/spec_tests/data/sessions_unified/snapshot-sessions-unsupported-ops.yml +258 -0
  1484. data/spec/spec_tests/data/sessions_unified/snapshot-sessions.yml +482 -0
  1485. data/spec/spec_tests/data/transactions/error-labels.yml +4 -1
  1486. data/spec/spec_tests/data/transactions/errors-client.yml +8 -9
  1487. data/spec/spec_tests/data/transactions/mongos-pin-auto.yml +3 -0
  1488. data/spec/spec_tests/data/transactions/mongos-recovery-token.yml +3 -1
  1489. data/spec/spec_tests/data/transactions/pin-mongos.yml +6 -3
  1490. data/spec/spec_tests/data/transactions/retryable-abort.yml +7 -7
  1491. data/spec/spec_tests/data/transactions/retryable-commit.yml +7 -7
  1492. data/spec/spec_tests/data/transactions_unified/do-not-retry-read-in-transaction.yml +64 -0
  1493. data/spec/spec_tests/data/transactions_unified/mongos-unpin.yml +172 -0
  1494. data/spec/spec_tests/data/transactions_unified/retryable-abort-handshake.yml +118 -0
  1495. data/spec/spec_tests/data/transactions_unified/retryable-commit-handshake.yml +118 -0
  1496. data/spec/spec_tests/data/unified/valid-fail/entity-findCursor-malformed.yml +31 -0
  1497. data/spec/spec_tests/data/unified/valid-fail/entity-findCursor.yml +31 -0
  1498. data/spec/spec_tests/data/unified/valid-fail/ignoreResultAndError-malformed.yml +34 -0
  1499. data/spec/spec_tests/data/unified/valid-fail/ignoreResultAndError.yml +35 -0
  1500. data/spec/spec_tests/data/unified/valid-fail/operation-failure.yml +31 -0
  1501. data/spec/spec_tests/data/unified/valid-fail/operation-unsupported.yml +13 -0
  1502. data/spec/spec_tests/data/unified/valid-pass/assertNumberConnectionsCheckedOut.yml +17 -0
  1503. data/spec/spec_tests/data/unified/valid-pass/collectionData-createOptions.yml +37 -0
  1504. data/spec/spec_tests/data/unified/valid-pass/entity-client-cmap-events.yml +40 -0
  1505. data/spec/spec_tests/data/unified/valid-pass/entity-client-storeEventsAsEntities.yml +37 -0
  1506. data/spec/spec_tests/data/unified/valid-pass/expectedError-errorResponse.yml +39 -0
  1507. data/spec/spec_tests/data/unified/valid-pass/expectedEventsForClient-eventType.yml +66 -0
  1508. data/spec/spec_tests/data/unified/valid-pass/expectedEventsForClient-ignoreExtraEvents.yml +78 -0
  1509. data/spec/spec_tests/data/unified/valid-pass/ignoreResultAndError.yml +34 -0
  1510. data/spec/spec_tests/data/unified/valid-pass/observeSensitiveCommands.yml +255 -0
  1511. data/spec/spec_tests/data/unified/valid-pass/poc-change-streams.yml +241 -0
  1512. data/spec/spec_tests/data/unified/valid-pass/poc-command-monitoring.yml +102 -0
  1513. data/spec/spec_tests/data/unified/valid-pass/poc-crud.yml +190 -0
  1514. data/spec/spec_tests/data/unified/valid-pass/poc-gridfs.yml +155 -0
  1515. data/spec/spec_tests/data/unified/valid-pass/poc-retryable-reads.yml +193 -0
  1516. data/spec/spec_tests/data/unified/valid-pass/poc-retryable-writes.yml +210 -0
  1517. data/spec/spec_tests/data/unified/valid-pass/poc-sessions.yml +215 -0
  1518. data/spec/spec_tests/data/unified/valid-pass/poc-transactions-convenient-api.yml +235 -0
  1519. data/spec/spec_tests/data/unified/valid-pass/poc-transactions-mongos-pin-auto.yml +169 -0
  1520. data/spec/spec_tests/data/unified/valid-pass/poc-transactions.yml +171 -0
  1521. data/spec/spec_tests/data/uri_options/auth-options.yml +25 -0
  1522. data/spec/spec_tests/data/uri_options/compression-options.yml +7 -4
  1523. data/spec/spec_tests/data/uri_options/connection-options.yml +60 -0
  1524. data/spec/spec_tests/data/uri_options/read-preference-options.yml +24 -0
  1525. data/spec/spec_tests/data/uri_options/ruby-connection-options.yml +1 -0
  1526. data/spec/spec_tests/data/uri_options/srv-options.yml +96 -0
  1527. data/spec/spec_tests/data/uri_options/tls-options.yml +160 -4
  1528. data/spec/spec_tests/data/versioned_api/crud-api-version-1-strict.yml +419 -0
  1529. data/spec/spec_tests/data/versioned_api/crud-api-version-1.yml +413 -0
  1530. data/spec/spec_tests/data/versioned_api/runcommand-helper-no-api-version-declared.yml +75 -0
  1531. data/spec/spec_tests/data/versioned_api/test-commands-deprecation-errors.yml +47 -0
  1532. data/spec/spec_tests/data/versioned_api/test-commands-strict-mode.yml +46 -0
  1533. data/spec/spec_tests/data/versioned_api/transaction-handling.yml +128 -0
  1534. data/spec/spec_tests/gridfs_spec.rb +3 -0
  1535. data/spec/spec_tests/gridfs_unified_spec.rb +13 -0
  1536. data/spec/spec_tests/load_balancers_spec.rb +15 -0
  1537. data/spec/spec_tests/max_staleness_spec.rb +3 -0
  1538. data/spec/spec_tests/read_write_concern_connection_string_spec.rb +3 -0
  1539. data/spec/spec_tests/read_write_concern_document_spec.rb +3 -0
  1540. data/spec/spec_tests/read_write_concern_operaton_spec.rb +3 -0
  1541. data/spec/spec_tests/retryable_reads_spec.rb +11 -3
  1542. data/spec/spec_tests/retryable_reads_unified_spec.rb +22 -0
  1543. data/spec/spec_tests/retryable_writes_spec.rb +14 -8
  1544. data/spec/spec_tests/retryable_writes_unified_spec.rb +21 -0
  1545. data/spec/spec_tests/sdam_monitoring_spec.rb +14 -6
  1546. data/spec/spec_tests/sdam_spec.rb +9 -2
  1547. data/spec/spec_tests/sdam_unified_spec.rb +13 -0
  1548. data/spec/spec_tests/seed_list_discovery_spec.rb +127 -0
  1549. data/spec/spec_tests/server_selection_rtt_spec.rb +3 -0
  1550. data/spec/spec_tests/server_selection_spec.rb +3 -0
  1551. data/spec/spec_tests/sessions_unified_spec.rb +13 -0
  1552. data/spec/spec_tests/transactions_api_spec.rb +3 -0
  1553. data/spec/spec_tests/transactions_spec.rb +3 -0
  1554. data/spec/spec_tests/transactions_unified_spec.rb +13 -0
  1555. data/spec/spec_tests/unified_spec.rb +18 -0
  1556. data/spec/spec_tests/uri_options_spec.rb +50 -33
  1557. data/spec/spec_tests/versioned_api_spec.rb +13 -0
  1558. data/spec/stress/cleanup_spec.rb +3 -0
  1559. data/spec/stress/connection_pool_stress_spec.rb +3 -61
  1560. data/spec/stress/connection_pool_timing_spec.rb +14 -35
  1561. data/spec/stress/fork_reconnect_stress_spec.rb +17 -18
  1562. data/spec/stress/push_monitor_close_spec.rb +44 -0
  1563. data/spec/support/authorization.rb +4 -1
  1564. data/spec/support/aws_utils/base.rb +3 -0
  1565. data/spec/support/aws_utils/inspector.rb +3 -0
  1566. data/spec/support/aws_utils/orchestrator.rb +22 -7
  1567. data/spec/support/aws_utils/provisioner.rb +3 -0
  1568. data/spec/support/aws_utils.rb +6 -2
  1569. data/spec/support/background_thread_registry.rb +7 -14
  1570. data/spec/support/certificates/README.md +3 -2
  1571. data/spec/support/certificates/atlas-ocsp-ca.crt +103 -0
  1572. data/spec/support/certificates/atlas-ocsp.crt +152 -0
  1573. data/spec/support/certificates/retrieve-atlas-cert +40 -0
  1574. data/spec/support/client_registry.rb +17 -6
  1575. data/spec/support/client_registry_macros.rb +17 -5
  1576. data/spec/support/cluster_tools.rb +17 -9
  1577. data/spec/support/common_shortcuts.rb +134 -10
  1578. data/spec/support/constraints.rb +16 -246
  1579. data/spec/support/crypt/corpus/corpus-encrypted.json +9515 -0
  1580. data/spec/support/crypt/corpus/corpus-key-aws.json +32 -32
  1581. data/spec/support/crypt/corpus/corpus-key-azure.json +33 -0
  1582. data/spec/support/crypt/corpus/corpus-key-gcp.json +35 -0
  1583. data/spec/support/crypt/corpus/corpus-key-kmip.json +32 -0
  1584. data/spec/support/crypt/corpus/corpus-key-local.json +30 -30
  1585. data/spec/support/crypt/corpus/corpus-schema.json +4399 -121
  1586. data/spec/support/crypt/corpus/corpus.json +4999 -37
  1587. data/spec/support/crypt/data_keys/key_document_azure.json +33 -0
  1588. data/spec/support/crypt/data_keys/key_document_gcp.json +37 -0
  1589. data/spec/support/crypt/data_keys/key_document_kmip.json +32 -0
  1590. data/spec/support/crypt/encrypted_fields/encryptedFields.json +32 -0
  1591. data/spec/support/crypt/encrypted_fields/range-encryptedFields-Date.json +30 -0
  1592. data/spec/support/crypt/encrypted_fields/range-encryptedFields-DecimalNoPrecision.json +21 -0
  1593. data/spec/support/crypt/encrypted_fields/range-encryptedFields-DecimalPrecision.json +29 -0
  1594. data/spec/support/crypt/encrypted_fields/range-encryptedFields-DoubleNoPrecision.json +21 -0
  1595. data/spec/support/crypt/encrypted_fields/range-encryptedFields-DoublePrecision.json +30 -0
  1596. data/spec/support/crypt/encrypted_fields/range-encryptedFields-Int.json +27 -0
  1597. data/spec/support/crypt/encrypted_fields/range-encryptedFields-Long.json +27 -0
  1598. data/spec/support/crypt/keys/key1-document.json +30 -0
  1599. data/spec/support/crypt/schema_maps/schema_map_azure.json +17 -0
  1600. data/spec/support/crypt/schema_maps/schema_map_azure_key_alt_names.json +12 -0
  1601. data/spec/support/crypt/schema_maps/schema_map_gcp.json +17 -0
  1602. data/spec/support/crypt/schema_maps/schema_map_gcp_key_alt_names.json +12 -0
  1603. data/spec/support/crypt/schema_maps/schema_map_kmip.json +17 -0
  1604. data/spec/support/crypt/schema_maps/schema_map_kmip_key_alt_names.json +12 -0
  1605. data/spec/support/crypt.rb +271 -13
  1606. data/spec/support/dns.rb +3 -0
  1607. data/spec/support/json_ext_formatter.rb +3 -0
  1608. data/spec/support/keyword_struct.rb +3 -0
  1609. data/spec/support/local_resource_registry.rb +3 -0
  1610. data/spec/support/macros.rb +29 -0
  1611. data/spec/support/matchers.rb +33 -1
  1612. data/spec/support/mongos_macros.rb +24 -0
  1613. data/spec/support/monitoring_ext.rb +3 -0
  1614. data/spec/support/ocsp +1 -0
  1615. data/spec/support/primary_socket.rb +3 -0
  1616. data/spec/support/sdam_formatter_integration.rb +3 -0
  1617. data/spec/support/shared/app_metadata.rb +179 -0
  1618. data/spec/support/shared/auth_context.rb +17 -0
  1619. data/spec/support/shared/protocol.rb +3 -0
  1620. data/spec/support/shared/scram_conversation.rb +5 -1
  1621. data/spec/support/shared/server_selector.rb +6 -3
  1622. data/spec/support/shared/session.rb +20 -11
  1623. data/spec/support/spec_config.rb +248 -24
  1624. data/spec/support/spec_setup.rb +51 -38
  1625. data/spec/support/using_hash.rb +40 -0
  1626. data/spec/support/utils.rb +353 -172
  1627. data.tar.gz.sig +0 -0
  1628. metadata +2052 -1217
  1629. metadata.gz.sig +0 -0
  1630. data/lib/mongo/collection/view/builder/find_command.rb +0 -150
  1631. data/lib/mongo/collection/view/builder/flags.rb +0 -62
  1632. data/lib/mongo/collection/view/builder/modifiers.rb +0 -80
  1633. data/lib/mongo/collection/view/builder/op_query.rb +0 -91
  1634. data/lib/mongo/cursor/builder/get_more_command.rb +0 -77
  1635. data/lib/mongo/cursor/builder/kill_cursors_command.rb +0 -108
  1636. data/lib/mongo/cursor/builder/op_get_more.rb +0 -61
  1637. data/lib/mongo/cursor/builder/op_kill_cursors.rb +0 -103
  1638. data/lib/mongo/cursor/builder.rb +0 -18
  1639. data/lib/mongo/operation/aggregate/command.rb +0 -44
  1640. data/lib/mongo/operation/collections_info/command.rb +0 -40
  1641. data/lib/mongo/operation/command/command.rb +0 -38
  1642. data/lib/mongo/operation/count/command.rb +0 -38
  1643. data/lib/mongo/operation/create/command.rb +0 -38
  1644. data/lib/mongo/operation/create_index/command.rb +0 -42
  1645. data/lib/mongo/operation/create_user/command.rb +0 -43
  1646. data/lib/mongo/operation/delete/command.rb +0 -46
  1647. data/lib/mongo/operation/delete/legacy.rb +0 -54
  1648. data/lib/mongo/operation/distinct/command.rb +0 -38
  1649. data/lib/mongo/operation/drop/command.rb +0 -38
  1650. data/lib/mongo/operation/drop_database/command.rb +0 -38
  1651. data/lib/mongo/operation/drop_index/command.rb +0 -42
  1652. data/lib/mongo/operation/explain/command.rb +0 -39
  1653. data/lib/mongo/operation/explain/legacy.rb +0 -38
  1654. data/lib/mongo/operation/find/command.rb +0 -39
  1655. data/lib/mongo/operation/find/legacy/result.rb +0 -41
  1656. data/lib/mongo/operation/find/legacy.rb +0 -40
  1657. data/lib/mongo/operation/get_more/command.rb +0 -39
  1658. data/lib/mongo/operation/get_more/legacy.rb +0 -36
  1659. data/lib/mongo/operation/indexes/command.rb +0 -39
  1660. data/lib/mongo/operation/indexes/legacy.rb +0 -45
  1661. data/lib/mongo/operation/insert/command.rb +0 -56
  1662. data/lib/mongo/operation/insert/legacy.rb +0 -65
  1663. data/lib/mongo/operation/kill_cursors/command.rb +0 -37
  1664. data/lib/mongo/operation/kill_cursors/legacy.rb +0 -37
  1665. data/lib/mongo/operation/list_collections/command.rb +0 -43
  1666. data/lib/mongo/operation/map_reduce/command.rb +0 -40
  1667. data/lib/mongo/operation/parallel_scan/command.rb +0 -55
  1668. data/lib/mongo/operation/remove_user/command.rb +0 -43
  1669. data/lib/mongo/operation/shared/collections_info_or_list_collections.rb +0 -56
  1670. data/lib/mongo/operation/shared/op_msg_or_command.rb +0 -44
  1671. data/lib/mongo/operation/shared/op_msg_or_find_command.rb +0 -47
  1672. data/lib/mongo/operation/shared/op_msg_or_list_indexes_command.rb +0 -47
  1673. data/lib/mongo/operation/update/command.rb +0 -47
  1674. data/lib/mongo/operation/update/legacy/result.rb +0 -102
  1675. data/lib/mongo/operation/update/legacy.rb +0 -65
  1676. data/lib/mongo/operation/update_user/command.rb +0 -42
  1677. data/lib/mongo/operation/users_info/command.rb +0 -43
  1678. data/lib/mongo/protocol/delete.rb +0 -169
  1679. data/lib/mongo/protocol/insert.rb +0 -178
  1680. data/lib/mongo/protocol/update.rb +0 -211
  1681. data/lib/mongo/server/context.rb +0 -69
  1682. data/spec/mongo/collection/view/builder/flags_spec.rb +0 -106
  1683. data/spec/mongo/collection/view/builder/modifiers_spec.rb +0 -210
  1684. data/spec/mongo/cursor/builder/op_kill_cursors_spec.rb +0 -61
  1685. data/spec/mongo/dbref_spec.rb +0 -149
  1686. data/spec/mongo/operation/delete/command_spec.rb +0 -112
  1687. data/spec/mongo/operation/find/legacy_spec.rb +0 -125
  1688. data/spec/mongo/operation/get_more_spec.rb +0 -58
  1689. data/spec/mongo/operation/insert/command_spec.rb +0 -115
  1690. data/spec/mongo/operation/kill_cursors_spec.rb +0 -41
  1691. data/spec/mongo/operation/update/command_spec.rb +0 -119
  1692. data/spec/mongo/protocol/delete_spec.rb +0 -182
  1693. data/spec/mongo/protocol/insert_spec.rb +0 -176
  1694. data/spec/mongo/protocol/update_spec.rb +0 -201
  1695. data/spec/mongo/server/app_metadata_shared.rb +0 -136
  1696. data/spec/spec_tests/change_streams_spec.rb +0 -90
  1697. data/spec/spec_tests/command_monitoring_spec.rb +0 -66
  1698. data/spec/spec_tests/data/change_streams/change-streams-errors.yml +0 -102
  1699. data/spec/spec_tests/data/change_streams/change-streams-resume-errorLabels.yml +0 -1105
  1700. data/spec/spec_tests/data/change_streams/change-streams-resume-whitelist.yml +0 -1173
  1701. data/spec/spec_tests/data/change_streams/change-streams.yml +0 -537
  1702. data/spec/spec_tests/data/command_monitoring/bulkWrite.yml +0 -49
  1703. data/spec/spec_tests/data/command_monitoring/command.yml +0 -61
  1704. data/spec/spec_tests/data/command_monitoring/deleteMany.yml +0 -55
  1705. data/spec/spec_tests/data/command_monitoring/deleteOne.yml +0 -55
  1706. data/spec/spec_tests/data/command_monitoring/find.yml +0 -266
  1707. data/spec/spec_tests/data/command_monitoring/insertMany.yml +0 -75
  1708. data/spec/spec_tests/data/command_monitoring/insertOne.yml +0 -51
  1709. data/spec/spec_tests/data/command_monitoring/unacknowledgedBulkWrite.yml +0 -34
  1710. data/spec/spec_tests/data/command_monitoring/updateMany.yml +0 -65
  1711. data/spec/spec_tests/data/command_monitoring/updateOne.yml +0 -90
  1712. data/spec/spec_tests/data/crud_v2/aggregate-merge.yml +0 -103
  1713. data/spec/spec_tests/data/crud_v2/aggregate-out-readConcern.yml +0 -110
  1714. data/spec/spec_tests/data/crud_v2/bulkWrite-arrayFilters.yml +0 -103
  1715. data/spec/spec_tests/data/crud_v2/bulkWrite-delete-hint-clientError.yml +0 -63
  1716. data/spec/spec_tests/data/crud_v2/bulkWrite-delete-hint-serverError.yml +0 -92
  1717. data/spec/spec_tests/data/crud_v2/bulkWrite-delete-hint.yml +0 -103
  1718. data/spec/spec_tests/data/crud_v2/bulkWrite-update-hint-clientError.yml +0 -90
  1719. data/spec/spec_tests/data/crud_v2/bulkWrite-update-hint-serverError.yml +0 -147
  1720. data/spec/spec_tests/data/crud_v2/bulkWrite-update-hint.yml +0 -164
  1721. data/spec/spec_tests/data/crud_v2/db-aggregate.yml +0 -38
  1722. data/spec/spec_tests/data/crud_v2/deleteMany-hint-clientError.yml +0 -43
  1723. data/spec/spec_tests/data/crud_v2/deleteMany-hint-serverError.yml +0 -62
  1724. data/spec/spec_tests/data/crud_v2/deleteMany-hint.yml +0 -58
  1725. data/spec/spec_tests/data/crud_v2/deleteOne-hint-clientError.yml +0 -41
  1726. data/spec/spec_tests/data/crud_v2/deleteOne-hint-serverError.yml +0 -60
  1727. data/spec/spec_tests/data/crud_v2/deleteOne-hint.yml +0 -57
  1728. data/spec/spec_tests/data/crud_v2/find-allowdiskuse-clientError.yml +0 -28
  1729. data/spec/spec_tests/data/crud_v2/find-allowdiskuse-serverError.yml +0 -44
  1730. data/spec/spec_tests/data/crud_v2/find-allowdiskuse.yml +0 -50
  1731. data/spec/spec_tests/data/crud_v2/findOneAndDelete-hint-clientError.yml +0 -45
  1732. data/spec/spec_tests/data/crud_v2/findOneAndDelete-hint-serverError.yml +0 -60
  1733. data/spec/spec_tests/data/crud_v2/findOneAndDelete-hint.yml +0 -56
  1734. data/spec/spec_tests/data/crud_v2/findOneAndReplace-hint-clientError.yml +0 -40
  1735. data/spec/spec_tests/data/crud_v2/findOneAndReplace-hint-serverError.yml +0 -59
  1736. data/spec/spec_tests/data/crud_v2/findOneAndReplace-hint.yml +0 -55
  1737. data/spec/spec_tests/data/crud_v2/findOneAndUpdate-hint-clientError.yml +0 -40
  1738. data/spec/spec_tests/data/crud_v2/findOneAndUpdate-hint-serverError.yml +0 -58
  1739. data/spec/spec_tests/data/crud_v2/findOneAndUpdate-hint.yml +0 -55
  1740. data/spec/spec_tests/data/crud_v2/replaceOne-hint.yml +0 -61
  1741. data/spec/spec_tests/data/crud_v2/unacknowledged-bulkWrite-delete-hint-clientError.yml +0 -60
  1742. data/spec/spec_tests/data/crud_v2/unacknowledged-bulkWrite-update-hint-clientError.yml +0 -88
  1743. data/spec/spec_tests/data/crud_v2/unacknowledged-deleteMany-hint-clientError.yml +0 -40
  1744. data/spec/spec_tests/data/crud_v2/unacknowledged-deleteOne-hint-clientError.yml +0 -38
  1745. data/spec/spec_tests/data/crud_v2/unacknowledged-findOneAndDelete-hint-clientError.yml +0 -42
  1746. data/spec/spec_tests/data/crud_v2/unacknowledged-findOneAndReplace-hint-clientError.yml +0 -40
  1747. data/spec/spec_tests/data/crud_v2/unacknowledged-findOneAndUpdate-hint-clientError.yml +0 -40
  1748. data/spec/spec_tests/data/crud_v2/unacknowledged-replaceOne-hint-clientError.yml +0 -40
  1749. data/spec/spec_tests/data/crud_v2/unacknowledged-updateMany-hint-clientError.yml +0 -43
  1750. data/spec/spec_tests/data/crud_v2/unacknowledged-updateOne-hint-clientError.yml +0 -40
  1751. data/spec/spec_tests/data/crud_v2/updateMany-hint-clientError.yml +0 -45
  1752. data/spec/spec_tests/data/crud_v2/updateMany-hint-serverError.yml +0 -66
  1753. data/spec/spec_tests/data/crud_v2/updateMany-hint.yml +0 -65
  1754. data/spec/spec_tests/data/crud_v2/updateOne-hint-clientError.yml +0 -43
  1755. data/spec/spec_tests/data/crud_v2/updateOne-hint-serverError.yml +0 -62
  1756. data/spec/spec_tests/data/crud_v2/updateOne-hint.yml +0 -61
  1757. data/spec/spec_tests/data/crud_v2/updateWithPipelines.yml +0 -157
  1758. data/spec/spec_tests/data/retryable_reads/aggregate-serverErrors.yml +0 -157
  1759. data/spec/spec_tests/data/retryable_reads/changeStreams-client.watch-serverErrors.yml +0 -149
  1760. data/spec/spec_tests/data/retryable_reads/changeStreams-client.watch.yml +0 -61
  1761. data/spec/spec_tests/data/retryable_reads/changeStreams-db.coll.watch-serverErrors.yml +0 -149
  1762. data/spec/spec_tests/data/retryable_reads/changeStreams-db.coll.watch.yml +0 -65
  1763. data/spec/spec_tests/data/retryable_reads/changeStreams-db.watch-serverErrors.yml +0 -153
  1764. data/spec/spec_tests/data/retryable_reads/changeStreams-db.watch.yml +0 -61
  1765. data/spec/spec_tests/data/retryable_reads/count-serverErrors.yml +0 -150
  1766. data/spec/spec_tests/data/retryable_reads/countDocuments-serverErrors.yml +0 -150
  1767. data/spec/spec_tests/data/retryable_reads/distinct-serverErrors.yml +0 -156
  1768. data/spec/spec_tests/data/retryable_reads/estimatedDocumentCount-serverErrors.yml +0 -148
  1769. data/spec/spec_tests/data/retryable_reads/find-serverErrors.yml +0 -160
  1770. data/spec/spec_tests/data/retryable_reads/findOne-serverErrors.yml +0 -154
  1771. data/spec/spec_tests/data/retryable_reads/gridfs-download-serverErrors.yml +0 -173
  1772. data/spec/spec_tests/data/retryable_reads/gridfs-downloadByName-serverErrors.yml +0 -174
  1773. data/spec/spec_tests/data/retryable_reads/listCollectionNames-serverErrors.yml +0 -143
  1774. data/spec/spec_tests/data/retryable_reads/listCollectionObjects-serverErrors.yml +0 -144
  1775. data/spec/spec_tests/data/retryable_reads/listCollections-serverErrors.yml +0 -143
  1776. data/spec/spec_tests/data/retryable_reads/listDatabaseNames-serverErrors.yml +0 -143
  1777. data/spec/spec_tests/data/retryable_reads/listDatabaseObjects-serverErrors.yml +0 -144
  1778. data/spec/spec_tests/data/retryable_reads/listDatabases-serverErrors.yml +0 -144
  1779. data/spec/spec_tests/data/retryable_reads/listIndexNames-serverErrors.yml +0 -144
  1780. data/spec/spec_tests/data/retryable_reads/listIndexNames.yml +0 -60
  1781. data/spec/spec_tests/data/retryable_reads/listIndexes-serverErrors.yml +0 -145
  1782. data/spec/spec_tests/data/retryable_reads/mapReduce.yml +0 -60
  1783. data/spec/spec_tests/data/retryable_writes/bulkWrite-serverErrors.yml +0 -130
  1784. data/spec/spec_tests/data/retryable_writes/bulkWrite.yml +0 -396
  1785. data/spec/spec_tests/data/retryable_writes/deleteOne-serverErrors.yml +0 -73
  1786. data/spec/spec_tests/data/retryable_writes/findOneAndDelete-serverErrors.yml +0 -74
  1787. data/spec/spec_tests/data/retryable_writes/findOneAndReplace-serverErrors.yml +0 -80
  1788. data/spec/spec_tests/data/retryable_writes/findOneAndUpdate-serverErrors.yml +0 -79
  1789. data/spec/spec_tests/data/retryable_writes/insertMany-serverErrors.yml +0 -84
  1790. data/spec/spec_tests/data/retryable_writes/insertOne-serverErrors.yml +0 -526
  1791. data/spec/spec_tests/data/retryable_writes/replaceOne-serverErrors.yml +0 -82
  1792. data/spec/spec_tests/data/retryable_writes/updateOne-serverErrors.yml +0 -82
  1793. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-greater-NotMaster.yml +0 -60
  1794. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-greater-NotMasterNoSlaveOk.yml +0 -60
  1795. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-greater-NotMasterOrSecondary.yml +0 -60
  1796. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-missing-NotMaster.yml +0 -51
  1797. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-missing-NotMasterNoSlaveOk.yml +0 -51
  1798. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-missing-NotMasterOrSecondary.yml +0 -51
  1799. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-proccessId-changed-NotMaster.yml +0 -60
  1800. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-proccessId-changed-NotMasterNoSlaveOk.yml +0 -60
  1801. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-proccessId-changed-NotMasterOrSecondary.yml +0 -60
  1802. data/spec/spec_tests/data/sdam/errors/post-42-NotMaster.yml +0 -46
  1803. data/spec/spec_tests/data/sdam/errors/post-42-NotMasterNoSlaveOk.yml +0 -46
  1804. data/spec/spec_tests/data/sdam/errors/post-42-NotMasterOrSecondary.yml +0 -46
  1805. data/spec/spec_tests/data/sdam/errors/pre-42-NotMaster.yml +0 -46
  1806. data/spec/spec_tests/data/sdam/errors/pre-42-NotMasterNoSlaveOk.yml +0 -46
  1807. data/spec/spec_tests/data/sdam/errors/pre-42-NotMasterOrSecondary.yml +0 -46
  1808. data/spec/spec_tests/data/sdam/errors/stale-generation-NotMaster.yml +0 -89
  1809. data/spec/spec_tests/data/sdam/errors/stale-generation-NotMasterNoSlaveOk.yml +0 -89
  1810. data/spec/spec_tests/data/sdam/errors/stale-generation-NotMasterOrSecondary.yml +0 -89
  1811. data/spec/spec_tests/data/sdam/errors/stale-generation-afterHandshakeCompletes-NotMaster.yml +0 -89
  1812. data/spec/spec_tests/data/sdam/errors/stale-generation-afterHandshakeCompletes-NotMasterNoSlaveOk.yml +0 -89
  1813. data/spec/spec_tests/data/sdam/errors/stale-generation-afterHandshakeCompletes-NotMasterOrSecondary.yml +0 -89
  1814. data/spec/spec_tests/data/sdam/errors/stale-generation-beforeHandshakeCompletes-NotMaster.yml +0 -89
  1815. data/spec/spec_tests/data/sdam/errors/stale-generation-beforeHandshakeCompletes-NotMasterNoSlaveOk.yml +0 -89
  1816. data/spec/spec_tests/data/sdam/errors/stale-generation-beforeHandshakeCompletes-NotMasterOrSecondary.yml +0 -89
  1817. data/spec/spec_tests/data/sdam/errors/stale-topologyVersion-NotMaster.yml +0 -64
  1818. data/spec/spec_tests/data/sdam/errors/stale-topologyVersion-NotMasterNoSlaveOk.yml +0 -64
  1819. data/spec/spec_tests/data/sdam/errors/stale-topologyVersion-NotMasterOrSecondary.yml +0 -64
  1820. data/spec/spec_tests/data/sdam/single/direct_connection_slave.yml +0 -34
  1821. data/spec/spec_tests/data/sdam_integration/cancel-server-check.yml +0 -96
  1822. data/spec/spec_tests/data/sdam_integration/connectTimeoutMS.yml +0 -88
  1823. data/spec/spec_tests/data/sdam_integration/find-network-error.yml +0 -83
  1824. data/spec/spec_tests/data/sdam_integration/find-shutdown-error.yml +0 -116
  1825. data/spec/spec_tests/data/sdam_integration/insert-network-error.yml +0 -86
  1826. data/spec/spec_tests/data/sdam_integration/insert-shutdown-error.yml +0 -115
  1827. data/spec/spec_tests/data/sdam_integration/isMaster-command-error.yml +0 -168
  1828. data/spec/spec_tests/data/sdam_integration/isMaster-network-error.yml +0 -162
  1829. data/spec/spec_tests/data/sdam_integration/isMaster-timeout.yml +0 -229
  1830. data/spec/spec_tests/data/sdam_integration/rediscover-quickly-after-step-down.yml +0 -87
  1831. data/spec/spec_tests/dns_seedlist_discovery_spec.rb +0 -68
  1832. data/spec/spec_tests/sdam_integration_spec.rb +0 -13
  1833. data/spec/support/child_process_helper.rb +0 -78
  1834. data/spec/support/cluster_config.rb +0 -207
  1835. data/spec/support/crypt/corpus/corpus_encrypted.json +0 -4152
  1836. data/spec/support/event_subscriber.rb +0 -212
  1837. data/spec/support/lite_constraints.rb +0 -141
  1838. data/spec/support/spec_organizer.rb +0 -129
  1839. /data/spec/spec_tests/data/retryable_reads/{aggregate-merge.yml → legacy/aggregate-merge.yml} +0 -0
  1840. /data/spec/spec_tests/data/retryable_reads/{aggregate.yml → legacy/aggregate.yml} +0 -0
  1841. /data/spec/spec_tests/data/retryable_reads/{count.yml → legacy/count.yml} +0 -0
  1842. /data/spec/spec_tests/data/retryable_reads/{countDocuments.yml → legacy/countDocuments.yml} +0 -0
  1843. /data/spec/spec_tests/data/retryable_reads/{distinct.yml → legacy/distinct.yml} +0 -0
  1844. /data/spec/spec_tests/data/retryable_reads/{estimatedDocumentCount.yml → legacy/estimatedDocumentCount.yml} +0 -0
  1845. /data/spec/spec_tests/data/retryable_reads/{find.yml → legacy/find.yml} +0 -0
  1846. /data/spec/spec_tests/data/retryable_reads/{findOne.yml → legacy/findOne.yml} +0 -0
  1847. /data/spec/spec_tests/data/retryable_reads/{gridfs-download.yml → legacy/gridfs-download.yml} +0 -0
  1848. /data/spec/spec_tests/data/retryable_reads/{gridfs-downloadByName.yml → legacy/gridfs-downloadByName.yml} +0 -0
  1849. /data/spec/spec_tests/data/retryable_reads/{listCollectionNames.yml → legacy/listCollectionNames.yml} +0 -0
  1850. /data/spec/spec_tests/data/retryable_reads/{listCollectionObjects.yml → legacy/listCollectionObjects.yml} +0 -0
  1851. /data/spec/spec_tests/data/retryable_reads/{listCollections.yml → legacy/listCollections.yml} +0 -0
  1852. /data/spec/spec_tests/data/retryable_reads/{listDatabaseNames.yml → legacy/listDatabaseNames.yml} +0 -0
  1853. /data/spec/spec_tests/data/retryable_reads/{listDatabaseObjects.yml → legacy/listDatabaseObjects.yml} +0 -0
  1854. /data/spec/spec_tests/data/retryable_reads/{listDatabases.yml → legacy/listDatabases.yml} +0 -0
  1855. /data/spec/spec_tests/data/retryable_reads/{listIndexes.yml → legacy/listIndexes.yml} +0 -0
  1856. /data/spec/spec_tests/data/retryable_writes/{bulkWrite-errorLabels.yml → legacy/bulkWrite-errorLabels.yml} +0 -0
  1857. /data/spec/spec_tests/data/retryable_writes/{deleteMany.yml → legacy/deleteMany.yml} +0 -0
  1858. /data/spec/spec_tests/data/retryable_writes/{deleteOne-errorLabels.yml → legacy/deleteOne-errorLabels.yml} +0 -0
  1859. /data/spec/spec_tests/data/retryable_writes/{deleteOne.yml → legacy/deleteOne.yml} +0 -0
  1860. /data/spec/spec_tests/data/retryable_writes/{findOneAndDelete-errorLabels.yml → legacy/findOneAndDelete-errorLabels.yml} +0 -0
  1861. /data/spec/spec_tests/data/retryable_writes/{findOneAndDelete.yml → legacy/findOneAndDelete.yml} +0 -0
  1862. /data/spec/spec_tests/data/retryable_writes/{findOneAndReplace-errorLabels.yml → legacy/findOneAndReplace-errorLabels.yml} +0 -0
  1863. /data/spec/spec_tests/data/retryable_writes/{findOneAndReplace.yml → legacy/findOneAndReplace.yml} +0 -0
  1864. /data/spec/spec_tests/data/retryable_writes/{findOneAndUpdate-errorLabels.yml → legacy/findOneAndUpdate-errorLabels.yml} +0 -0
  1865. /data/spec/spec_tests/data/retryable_writes/{findOneAndUpdate.yml → legacy/findOneAndUpdate.yml} +0 -0
  1866. /data/spec/spec_tests/data/retryable_writes/{insertMany-errorLabels.yml → legacy/insertMany-errorLabels.yml} +0 -0
  1867. /data/spec/spec_tests/data/retryable_writes/{insertMany.yml → legacy/insertMany.yml} +0 -0
  1868. /data/spec/spec_tests/data/retryable_writes/{insertOne-errorLabels.yml → legacy/insertOne-errorLabels.yml} +0 -0
  1869. /data/spec/spec_tests/data/retryable_writes/{insertOne.yml → legacy/insertOne.yml} +0 -0
  1870. /data/spec/spec_tests/data/retryable_writes/{replaceOne-errorLabels.yml → legacy/replaceOne-errorLabels.yml} +0 -0
  1871. /data/spec/spec_tests/data/retryable_writes/{replaceOne.yml → legacy/replaceOne.yml} +0 -0
  1872. /data/spec/spec_tests/data/retryable_writes/{updateMany.yml → legacy/updateMany.yml} +0 -0
  1873. /data/spec/spec_tests/data/retryable_writes/{updateOne-errorLabels.yml → legacy/updateOne-errorLabels.yml} +0 -0
  1874. /data/spec/spec_tests/data/retryable_writes/{updateOne.yml → legacy/updateOne.yml} +0 -0
  1875. /data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/direct-connection-false.yml +0 -0
  1876. /data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/direct-connection-true.yml +0 -0
  1877. /data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/longer-parent-in-return.yml +0 -0
  1878. /data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/misformatted-option.yml +0 -0
  1879. /data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/no-results.yml +0 -0
  1880. /data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/not-enough-parts.yml +0 -0
  1881. /data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/one-result-default-port.yml +0 -0
  1882. /data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/one-txt-record-multiple-strings.yml +0 -0
  1883. /data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/one-txt-record.yml +0 -0
  1884. /data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/parent-part-mismatch1.yml +0 -0
  1885. /data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/parent-part-mismatch2.yml +0 -0
  1886. /data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/parent-part-mismatch3.yml +0 -0
  1887. /data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/parent-part-mismatch4.yml +0 -0
  1888. /data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/parent-part-mismatch5.yml +0 -0
  1889. /data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/returned-parent-too-short.yml +0 -0
  1890. /data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/returned-parent-wrong.yml +0 -0
  1891. /data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/two-results-default-port.yml +0 -0
  1892. /data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/two-results-nonstandard-port.yml +0 -0
  1893. /data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/two-txt-records.yml +0 -0
  1894. /data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/txt-record-not-allowed-option.yml +0 -0
  1895. /data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/txt-record-with-overridden-ssl-option.yml +0 -0
  1896. /data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/txt-record-with-overridden-uri-option.yml +0 -0
  1897. /data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/txt-record-with-unallowed-option.yml +0 -0
  1898. /data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/uri-with-port.yml +0 -0
  1899. /data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/uri-with-two-hosts.yml +0 -0
@@ -1,19 +1,35 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'spec_helper'
2
4
 
5
+ SINGLE_CLIENT = [ '127.0.0.1:27017' ].freeze
6
+
7
+ # let these existing styles stand, rather than going in for a deep refactoring
8
+ # of these specs.
9
+ #
10
+ # possible future work: re-enable these one at a time and do the hard work of
11
+ # making them right.
12
+ #
13
+ # rubocop:disable RSpec/ExpectInHook, RSpec/MessageSpies, RSpec/ExampleLength
14
+ # rubocop:disable RSpec/ContextWording, RSpec/RepeatedExampleGroupDescription
15
+ # rubocop:disable RSpec/ExampleWording, Style/BlockComments, RSpec/AnyInstance
16
+ # rubocop:disable RSpec/VerifiedDoubles
3
17
  describe Mongo::Client do
4
18
  clean_slate
5
19
 
6
- let(:subscriber) { EventSubscriber.new }
20
+ let(:subscriber) { Mrss::EventSubscriber.new }
7
21
 
8
22
  describe '.new' do
9
23
  context 'with scan: false' do
24
+ fails_on_jruby
25
+
10
26
  it 'does not perform i/o' do
11
27
  allow_any_instance_of(Mongo::Server::Monitor).to receive(:run!)
12
28
  expect_any_instance_of(Mongo::Server::Monitor).not_to receive(:scan!)
13
- start_time = Time.now
29
+
14
30
  # return should be instant
15
31
  c = Timeout.timeout(1) do
16
- ClientRegistry.instance.new_local_client(['1.1.1.1'], scan: false)
32
+ ClientRegistry.instance.new_local_client([ '1.1.1.1' ], scan: false)
17
33
  end
18
34
  expect(c.cluster.servers).to be_empty
19
35
  c.close
@@ -21,41 +37,21 @@ describe Mongo::Client do
21
37
  end
22
38
 
23
39
  context 'with default scan: true' do
24
- # TODO this test requires there being no outstanding background
25
- # monitoring threads running, as otherwise the scan! expectation
26
- # can be executed on a thread that belongs to one of the global
27
- # clients for instance
28
- it 'performs one round of sdam' do
29
- # Does not work due to
30
- # https://github.com/rspec/rspec-mocks/issues/1242.
31
- #expect_any_instance_of(Mongo::Server::Monitor).to receive(:scan!).
32
- # exactly(SpecConfig.instance.addresses.length).times.and_call_original
33
- c = new_local_client(
34
- SpecConfig.instance.addresses, SpecConfig.instance.test_options)
35
- expect(c.cluster.servers).not_to be_empty
36
- end
37
-
38
- # This checks the case of all initial seeds being removed from
39
- # cluster during SDAM
40
- context 'me mismatch on the only initial seed' do
41
- let(:address) do
42
- ClusterConfig.instance.alternate_address.to_s
43
- end
44
-
40
+ shared_examples 'does not wait for server selection timeout' do
45
41
  let(:logger) do
46
- Logger.new(STDOUT, level: Logger::DEBUG)
42
+ Logger.new($stdout, level: Logger::DEBUG)
47
43
  end
48
44
 
49
45
  let(:subscriber) do
50
46
  Mongo::Monitoring::UnifiedSdamLogSubscriber.new(
51
47
  logger: logger,
52
- log_prefix: 'CCS-SDAM',
48
+ log_prefix: 'CCS-SDAM'
53
49
  )
54
50
  end
55
51
 
56
52
  let(:client) do
57
53
  ClientRegistry.instance.new_local_client(
58
- [address],
54
+ [ address ],
59
55
  # Specify server selection timeout here because test suite sets
60
56
  # one by default and it's fairly low
61
57
  SpecConfig.instance.test_options.merge(
@@ -64,10 +60,9 @@ describe Mongo::Client do
64
60
  server_selection_timeout: 8,
65
61
  logger: logger,
66
62
  log_prefix: 'CCS-CLIENT',
67
- sdam_proc: lambda do |client|
68
- subscriber.subscribe(client)
69
- end
70
- ))
63
+ sdam_proc: ->(client) { subscriber.subscribe(client) }
64
+ )
65
+ )
71
66
  end
72
67
 
73
68
  it 'does not wait for server selection timeout' do
@@ -88,21 +83,60 @@ describe Mongo::Client do
88
83
 
89
84
  actual_class = client.cluster.topology.class
90
85
  expect([
91
- Mongo::Cluster::Topology::ReplicaSetWithPrimary,
92
- Mongo::Cluster::Topology::Single,
93
- Mongo::Cluster::Topology::Sharded,
94
- ]).to include(actual_class)
86
+ Mongo::Cluster::Topology::ReplicaSetWithPrimary,
87
+ Mongo::Cluster::Topology::Single,
88
+ Mongo::Cluster::Topology::Sharded,
89
+ Mongo::Cluster::Topology::LoadBalanced,
90
+ ]).to include(actual_class)
95
91
  expect(time_taken).to be < 5
96
92
 
97
93
  # run a command to ensure the client is a working one
98
- client.database.command(ismaster: 1)
94
+ client.database.command(ping: 1)
95
+ end
96
+ end
97
+
98
+ context 'when cluster is monitored' do
99
+ require_topology :single, :replica_set, :sharded
100
+
101
+ # TODO: this test requires there being no outstanding background
102
+ # monitoring threads running, as otherwise the scan! expectation
103
+ # can be executed on a thread that belongs to one of the global
104
+ # clients for instance
105
+ it 'performs one round of sdam' do
106
+ # Does not work due to
107
+ # https://github.com/rspec/rspec-mocks/issues/1242.
108
+ #
109
+ # expect_any_instance_of(Mongo::Server::Monitor).to receive(:scan!).
110
+ # exactly(SpecConfig.instance.addresses.length).times.and_call_original
111
+ c = new_local_client(SpecConfig.instance.addresses, SpecConfig.instance.test_options)
112
+ expect(c.cluster.servers).not_to be_empty
113
+ end
114
+
115
+ # This checks the case of all initial seeds being removed from
116
+ # cluster during SDAM
117
+ context 'me mismatch on the only initial seed' do
118
+ let(:address) do
119
+ ClusterConfig.instance.alternate_address.to_s
120
+ end
121
+
122
+ include_examples 'does not wait for server selection timeout'
123
+ end
124
+ end
125
+
126
+ context 'when cluster is not monitored' do
127
+ require_topology :load_balanced
128
+
129
+ let(:address) do
130
+ ClusterConfig.instance.alternate_address.to_s
99
131
  end
132
+
133
+ include_examples 'does not wait for server selection timeout'
100
134
  end
101
135
  end
102
136
 
103
137
  context 'with monitoring_io: false' do
104
138
  let(:client) do
105
- new_local_client(['127.0.0.1:27017'], monitoring_io: false)
139
+ new_local_client(SINGLE_CLIENT, monitoring_io: false)
106
140
  end
107
141
 
108
142
  it 'passes monitoring_io: false to cluster' do
@@ -154,7 +188,7 @@ describe Mongo::Client do
154
188
  let(:mongocryptd_uri) { 'mongodb://localhost:27021' }
155
189
  let(:mongocryptd_bypass_spawn) { true }
156
190
  let(:mongocryptd_spawn_path) { '/spawn/path' }
157
- let(:mongocryptd_spawn_args) { ['--idleShutdownTimeoutSecs=100'] }
191
+ let(:mongocryptd_spawn_args) { [ '--idleShutdownTimeoutSecs=100' ] }
158
192
 
159
193
  shared_examples 'a functioning auto encryption client' do
160
194
  let(:encryption_options) { client.encrypter.options }
@@ -179,7 +213,10 @@ describe Mongo::Client do
179
213
  let(:key_vault_namespace) { 'not.good.formatting' }
180
214
 
181
215
  it 'raises an exception' do
182
- expect { client }.to raise_error(ArgumentError, /key_vault_namespace option must be in the format database.collection/)
216
+ expect { client }.to raise_error(
217
+ ArgumentError,
218
+ /key_vault_namespace option must be in the format database.collection/
219
+ )
183
220
  end
184
221
  end
185
222
 
@@ -187,7 +224,7 @@ describe Mongo::Client do
187
224
  let(:kms_providers) { nil }
188
225
 
189
226
  it 'raises an exception' do
190
- expect { client }.to raise_error(ArgumentError, /kms_providers option must not be nil/)
227
+ expect { client }.to raise_error(ArgumentError, /KMS providers options must not be nil/)
191
228
  end
192
229
  end
193
230
 
@@ -195,7 +232,10 @@ describe Mongo::Client do
195
232
  let(:kms_providers) { { random_key: 'hello' } }
196
233
 
197
234
  it 'raises an exception' do
198
- expect { client }.to raise_error(ArgumentError, /kms_providers option must have one of the following keys: :aws, :local/)
235
+ expect { client }.to raise_error(
236
+ ArgumentError,
237
+ /KMS providers options must have one of the following keys: :aws, :azure, :gcp, :kmip, :local/
238
+ )
199
239
  end
200
240
  end
201
241
 
@@ -203,15 +243,25 @@ describe Mongo::Client do
203
243
  let(:kms_providers) { { local: { wrong_key: 'hello' } } }
204
244
 
205
245
  it 'raises an exception' do
206
- expect { client }.to raise_error(ArgumentError, /kms_providers with :local key must be in the format: { local: { key: 'MASTER-KEY' } }/)
246
+ expect { client }.to raise_error(
247
+ ArgumentError,
248
+ /Local KMS provider options must be in the format: { key: 'MASTER-KEY' }/
249
+ )
207
250
  end
208
251
  end
209
252
 
210
253
  context 'when aws kms_provider is incorrectly formatted' do
211
254
  let(:kms_providers) { { aws: { wrong_key: 'hello' } } }
212
255
 
256
+ let(:expected_options_format) do
257
+ "{ access_key_id: 'YOUR-ACCESS-KEY-ID', secret_access_key: 'SECRET-ACCESS-KEY' }"
258
+ end
259
+
213
260
  it 'raises an exception' do
214
- expect { client }.to raise_error(ArgumentError, /kms_providers with :aws key must be in the format: { aws: { access_key_id: 'YOUR-ACCESS-KEY-ID', secret_access_key: 'SECRET-ACCESS-KEY' } }/)
261
+ expect { client }.to raise_error(
262
+ ArgumentError,
263
+ / AWS KMS provider options must be in the format: #{expected_options_format}/
264
+ )
215
265
  end
216
266
  end
217
267
 
@@ -241,7 +291,7 @@ describe Mongo::Client do
241
291
  expect(encryption_options[:key_vault_namespace]).to eq(key_vault_namespace)
242
292
  # Don't explicitly expect kms_providers to avoid accidentally exposing
243
293
  # sensitive data in evergreen logs
244
- expect(encryption_options[:kms_providers]).to be_a_kind_of(Hash)
294
+ expect(encryption_options[:kms_providers]).to be_a(Hash)
245
295
  expect(encryption_options[:schema_map]).to eq(schema_map)
246
296
  expect(encryption_options[:bypass_auto_encryption]).to eq(bypass_auto_encryption)
247
297
  expect(encryption_options[:extra_options][:mongocryptd_uri]).to eq(mongocryptd_uri)
@@ -261,9 +311,9 @@ describe Mongo::Client do
261
311
  }
262
312
  end
263
313
 
264
- it 'sets key_vault_client as a clone of self with no encryption options' do
314
+ it 'sets key_vault_client with no encryption options' do
265
315
  key_vault_client = client.encrypter.key_vault_client
266
- expect(key_vault_client).to eq(client)
316
+ expect(key_vault_client.options['auto_encryption_options']).to be_nil
267
317
  end
268
318
 
269
319
  it 'sets bypass_auto_encryption to false' do
@@ -274,20 +324,22 @@ describe Mongo::Client do
274
324
  expect(encryption_options[:extra_options][:mongocryptd_uri]).to eq('mongodb://localhost:27020')
275
325
  expect(encryption_options[:extra_options][:mongocryptd_bypass_spawn]).to be false
276
326
  expect(encryption_options[:extra_options][:mongocryptd_spawn_path]).to eq('mongocryptd')
277
- expect(encryption_options[:extra_options][:mongocryptd_spawn_args]).to eq(['--idleShutdownTimeoutSecs=60'])
327
+ expect(encryption_options[:extra_options][:mongocryptd_spawn_args])
328
+ .to eq([ '--idleShutdownTimeoutSecs=60' ])
278
329
  end
279
330
  end
280
331
 
281
332
  context 'with mongocryptd_spawn_args that don\'t include idleShutdownTimeoutSecs' do
282
- let(:mongocryptd_spawn_args) { ['--otherArgument=true'] }
333
+ let(:mongocryptd_spawn_args) { [ '--otherArgument=true' ] }
283
334
 
284
335
  it 'adds a default value to mongocryptd_spawn_args' do
285
- expect(encryption_options[:extra_options][:mongocryptd_spawn_args]).to eq(mongocryptd_spawn_args + ['--idleShutdownTimeoutSecs=60'])
336
+ expect(encryption_options[:extra_options][:mongocryptd_spawn_args])
337
+ .to eq(mongocryptd_spawn_args + [ '--idleShutdownTimeoutSecs=60' ])
286
338
  end
287
339
  end
288
340
 
289
341
  context 'with mongocryptd_spawn_args that has idleShutdownTimeoutSecs as two arguments' do
290
- let(:mongocryptd_spawn_args) { ['--idleShutdownTimeoutSecs', 100] }
342
+ let(:mongocryptd_spawn_args) { [ '--idleShutdownTimeoutSecs', 100 ] }
291
343
 
292
344
  it 'does not modify mongocryptd_spawn_args' do
293
345
  expect(encryption_options[:extra_options][:mongocryptd_spawn_args]).to eq(mongocryptd_spawn_args)
@@ -300,7 +352,7 @@ describe Mongo::Client do
300
352
  it 'creates a key_vault_client' do
301
353
  key_vault_client = encryption_options[:key_vault_client]
302
354
 
303
- expect(key_vault_client).to be_a_kind_of(Mongo::Client)
355
+ expect(key_vault_client).to be_a(described_class)
304
356
  end
305
357
  end
306
358
  end
@@ -321,54 +373,47 @@ describe Mongo::Client do
321
373
 
322
374
  context 'timeout options' do
323
375
  let(:client) do
324
- new_local_client(SpecConfig.instance.addresses,
325
- SpecConfig.instance.authorized_test_options.merge(options))
376
+ new_local_client(
377
+ SpecConfig.instance.addresses,
378
+ SpecConfig.instance.authorized_test_options.merge(options)
379
+ )
326
380
  end
327
381
 
328
382
  context 'when network timeouts are zero' do
329
- let(:options) do
330
- { socket_timeout: 0, connect_timeout: 0 }
331
- end
383
+ let(:options) { { socket_timeout: 0, connect_timeout: 0 } }
332
384
 
333
385
  it 'sets options to zeros' do
334
- client.options[:socket_timeout].should == 0
335
- client.options[:connect_timeout].should == 0
386
+ expect(client.options[:socket_timeout]).to be == 0
387
+ expect(client.options[:connect_timeout]).to be == 0
336
388
  end
337
389
 
338
390
  it 'connects and performs operations successfully' do
339
- lambda do
340
- client.database.command(ping: 1)
341
- end.should_not raise_error
391
+ expect { client.database.command(ping: 1) }
392
+ .not_to raise_error
342
393
  end
343
394
  end
344
395
 
345
- %i(socket_timeout connect_timeout).each do |option|
396
+ %i[ socket_timeout connect_timeout ].each do |option|
346
397
  context "when #{option} is negative" do
347
- let(:options) do
348
- { option => -1 }
349
- end
398
+ let(:options) { { option => -1 } }
350
399
 
351
400
  it 'fails client creation' do
352
- lambda do
353
- client
354
- end.should raise_error(ArgumentError, /#{option} must be a non-negative number/)
401
+ expect { client }
402
+ .to raise_error(ArgumentError, /#{option} must be a non-negative number/)
355
403
  end
356
404
  end
357
405
 
358
406
  context "when #{option} is of the wrong type" do
359
- let(:options) do
360
- { option => '42' }
361
- end
407
+ let(:options) { { option => '42' } }
362
408
 
363
409
  it 'fails client creation' do
364
- lambda do
365
- client
366
- end.should raise_error(ArgumentError, /#{option} must be a non-negative number/)
410
+ expect { client }
411
+ .to raise_error(ArgumentError, /#{option} must be a non-negative number/)
367
412
  end
368
413
  end
369
414
  end
370
415
 
371
- context "when :connect_timeout is very small" do
416
+ context 'when :connect_timeout is very small' do
372
417
  # The driver reads first and checks the deadline second.
373
418
  # This means the read (in a monitor) can technically take more than
374
419
  # the connect timeout. Restrict to TLS configurations to make
@@ -380,19 +425,29 @@ describe Mongo::Client do
380
425
  end
381
426
 
382
427
  it 'allows client creation' do
383
- lambda do
384
- client
385
- end.should_not raise_error
428
+ expect { client }.not_to raise_error
429
+ end
430
+
431
+ context 'non-lb' do
432
+ require_topology :single, :replica_set, :sharded
433
+
434
+ it 'fails server selection due to very small timeout' do
435
+ expect { client.database.command(ping: 1) }
436
+ .to raise_error(Mongo::Error::NoServerAvailable)
437
+ end
386
438
  end
387
439
 
388
- it 'fails server selection due to very small timeout' do
389
- lambda do
390
- client.database.command(ping: 1)
391
- end.should raise_error(Mongo::Error::NoServerAvailable)
440
+ context 'lb' do
441
+ require_topology :load_balanced
442
+
443
+ it 'fails the operation after successful server selection' do
444
+ expect { client.database.command(ping: 1) }
445
+ .to raise_error(Mongo::Error::SocketTimeoutError, /socket took over.*to connect/)
446
+ end
392
447
  end
393
448
  end
394
449
 
395
- context "when :socket_timeout is very small" do
450
+ context 'when :socket_timeout is very small' do
396
451
  # The driver reads first and checks the deadline second.
397
452
  # This means the read (in a monitor) can technically take more than
398
453
  # the connect timeout. Restrict to TLS configurations to make
@@ -404,15 +459,13 @@ describe Mongo::Client do
404
459
  end
405
460
 
406
461
  it 'allows client creation' do
407
- lambda do
408
- client
409
- end.should_not raise_error
462
+ expect { client }.not_to raise_error
410
463
  end
411
464
 
465
+ retry_test
412
466
  it 'fails operations due to very small timeout' do
413
- lambda do
414
- client.database.command(ping: 1)
415
- end.should raise_error(Mongo::Error::SocketTimeoutError)
467
+ expect { client.database.command(ping: 1) }
468
+ .to raise_error(Mongo::Error::SocketTimeoutError)
416
469
  end
417
470
  end
418
471
  end
@@ -423,7 +476,6 @@ describe Mongo::Client do
423
476
  end
424
477
 
425
478
  context 'when retry_writes is true' do
426
-
427
479
  let(:options) do
428
480
  { retry_writes: true }
429
481
  end
@@ -434,7 +486,6 @@ describe Mongo::Client do
434
486
  end
435
487
 
436
488
  context 'when retry_writes is false' do
437
-
438
489
  let(:options) do
439
490
  { retry_writes: false }
440
491
  end
@@ -445,10 +496,7 @@ describe Mongo::Client do
445
496
  end
446
497
 
447
498
  context 'when retry_writes is not given' do
448
-
449
- let(:options) do
450
- { }
451
- end
499
+ let(:options) { {} }
452
500
 
453
501
  it 'sets retry_writes to true' do
454
502
  expect(client.options['retry_writes']).to be true
@@ -457,16 +505,66 @@ describe Mongo::Client do
457
505
  end
458
506
 
459
507
  context 'when compressors are provided' do
460
-
461
508
  let(:client) do
462
- new_local_client(SpecConfig.instance.addresses,
463
- SpecConfig.instance.all_test_options.merge(options))
509
+ new_local_client(
510
+ SpecConfig.instance.addresses,
511
+ SpecConfig.instance.all_test_options.merge(options)
512
+ )
513
+ end
514
+
515
+ context 'when the compressor is not supported by the driver' do
516
+ require_warning_clean
517
+
518
+ let(:options) do
519
+ { compressors: %w[ snoopy ] }
520
+ end
521
+
522
+ it 'does not set the compressor and warns' do
523
+ expect(Mongo::Logger.logger).to receive(:warn).with(/Unsupported compressor/)
524
+ expect(client.options['compressors']).to be_nil
525
+ end
526
+
527
+ it 'sets the compression key of the handshake document to an empty array' do
528
+ expect(client.cluster.app_metadata.send(:document)[:compression]).to eq([])
529
+ end
530
+
531
+ context 'when one supported compressor and one unsupported compressor are provided' do
532
+ require_compression
533
+ min_server_fcv '3.6'
534
+
535
+ let(:options) do
536
+ { compressors: %w[ zlib snoopy ] }
537
+ end
538
+
539
+ it 'does not set the unsupported compressor and warns' do
540
+ expect(Mongo::Logger.logger).to receive(:warn).at_least(:once)
541
+ expect(client.options['compressors']).to eq(%w[ zlib ])
542
+ end
543
+
544
+ it 'sets the compression key of the handshake document to the list of supported compressors' do
545
+ expect(client.cluster.app_metadata.send(:document)[:compression]).to eq(%w[ zlib ])
546
+ end
547
+ end
548
+ end
549
+
550
+ context 'when the compressor is not supported by the server' do
551
+ max_server_version '3.4'
552
+
553
+ let(:options) do
554
+ { compressors: %w[ zlib ] }
555
+ end
556
+
557
+ it 'does not set the compressor and warns' do
558
+ expect(Mongo::Logger.logger).to receive(:warn).at_least(:once)
559
+ expect(client.cluster.next_primary.monitor.compressor).to be_nil
560
+ end
464
561
  end
465
562
 
466
- context 'when the compressor is supported' do
563
+ context 'when zlib compression is requested' do
564
+ require_zlib_compression
467
565
 
468
566
  let(:options) do
469
- { compressors: ['zlib'] }
567
+ { compressors: %w[ zlib ] }
470
568
  end
471
569
 
472
570
  it 'sets the compressor' do
@@ -478,7 +576,6 @@ describe Mongo::Client do
478
576
  end
479
577
 
480
578
  context 'when server supports compression' do
481
- require_compression
482
579
  min_server_fcv '3.6'
483
580
 
484
581
  it 'uses compression for messages' do
@@ -489,56 +586,59 @@ describe Mongo::Client do
489
586
 
490
587
  it 'does not use compression for authentication messages' do
491
588
  expect(Mongo::Protocol::Compressed).not_to receive(:new)
492
- client.cluster.next_primary.send(:with_connection) do |conn|
493
- conn.connect!
494
- end
589
+ client.cluster.next_primary.send(:with_connection, &:connect!)
495
590
  end
496
591
  end
497
592
 
498
- context 'when the compressor is not supported by the driver' do
593
+ context 'when snappy compression is requested and supported by the server' do
594
+ min_server_version '3.6'
499
595
 
500
596
  let(:options) do
501
- { compressors: ['snoopy'] }
597
+ { compressors: %w[ snappy ] }
502
598
  end
503
599
 
504
- it 'does not set the compressor and warns' do
505
- expect(Mongo::Logger.logger).to receive(:warn)
506
- expect(client.options['compressors']).to be_nil
507
- end
508
-
509
- it 'sets the compression key of the handshake document to an empty array' do
510
- expect(client.cluster.app_metadata.send(:document)[:compression]).to eq([])
511
- end
512
-
513
- context 'when one supported compressor and one unsupported compressor are provided' do
514
- require_compression
515
- min_server_fcv '3.6'
600
+ context 'when snappy gem is installed' do
601
+ require_snappy_compression
516
602
 
517
- let(:options) do
518
- { compressors: ['zlib', 'snoopy'] }
603
+ it 'creates the client' do
604
+ expect(client.options['compressors']).to eq(%w[ snappy ])
519
605
  end
606
+ end
520
607
 
521
- it 'does not set the unsupported compressor and warns' do
522
- expect(Mongo::Logger.logger).to receive(:warn).at_least(:once)
523
- expect(client.options['compressors']).to eq(['zlib'])
524
- end
608
+ context 'when snappy gem is not installed' do
609
+ require_no_snappy_compression
525
610
 
526
- it 'sets the compression key of the handshake document to the list of supported compressors' do
527
- expect(client.cluster.app_metadata.send(:document)[:compression]).to eq(['zlib'])
611
+ it 'raises an exception' do
612
+ expect do
613
+ client
614
+ end.to raise_error(Mongo::Error::UnmetDependency, /Cannot enable snappy compression/)
528
615
  end
529
616
  end
530
617
  end
531
618
 
532
- context 'when the compressor is not supported by the server' do
533
- max_server_version '3.4'
619
+ context 'when zstd compression is requested and supported by the server' do
620
+ min_server_version '4.2'
534
621
 
535
622
  let(:options) do
536
- { compressors: ['zlib'] }
623
+ { compressors: %w[ zstd ] }
537
624
  end
538
625
 
539
- it 'does not set the compressor and warns' do
540
- expect(Mongo::Logger.logger).to receive(:warn).at_least(:once)
541
- expect(client.cluster.next_primary.monitor.compressor).to be_nil
626
+ context 'when zstd gem is installed' do
627
+ require_zstd_compression
628
+
629
+ it 'creates the client' do
630
+ expect(client.options['compressors']).to eq(%w[ zstd ])
631
+ end
632
+ end
633
+
634
+ context 'when zstd gem is not installed' do
635
+ require_no_zstd_compression
636
+
637
+ it 'raises an exception' do
638
+ expect do
639
+ client
640
+ end.to raise_error(Mongo::Error::UnmetDependency, /Cannot enable zstd compression/)
641
+ end
542
642
  end
543
643
  end
544
644
  end
@@ -569,7 +669,10 @@ describe Mongo::Client do
569
669
  min_server_fcv '3.6'
570
670
 
571
671
  let(:client) do
572
- new_local_client_nmio(SpecConfig.instance.addresses, SpecConfig.instance.test_options.merge(zlib_compression_level: 1))
672
+ new_local_client_nmio(
673
+ SpecConfig.instance.addresses,
674
+ SpecConfig.instance.test_options.merge(zlib_compression_level: 1)
675
+ )
573
676
  end
574
677
 
575
678
  it 'sets the option on the client' do
@@ -578,26 +681,25 @@ describe Mongo::Client do
578
681
  end
579
682
 
580
683
  context 'when ssl options are provided' do
581
-
582
684
  let(:options) do
583
685
  {
584
- :ssl => true,
585
- :ssl_ca_cert => SpecConfig.instance.ca_cert_path,
586
- :ssl_ca_cert_string => 'ca cert string',
587
- :ssl_ca_cert_object => 'ca cert object',
588
- :ssl_cert => SpecConfig.instance.client_cert_path,
589
- :ssl_cert_string => 'cert string',
590
- :ssl_cert_object => 'cert object',
591
- :ssl_key => SpecConfig.instance.client_key_path,
592
- :ssl_key_string => 'key string',
593
- :ssl_key_object => 'key object',
594
- :ssl_key_pass_phrase => 'passphrase',
595
- :ssl_verify => true
686
+ ssl: true,
687
+ ssl_ca_cert: SpecConfig.instance.ca_cert_path,
688
+ ssl_ca_cert_string: 'ca cert string',
689
+ ssl_ca_cert_object: 'ca cert object',
690
+ ssl_cert: SpecConfig.instance.client_cert_path,
691
+ ssl_cert_string: 'cert string',
692
+ ssl_cert_object: 'cert object',
693
+ ssl_key: SpecConfig.instance.client_key_path,
694
+ ssl_key_string: 'key string',
695
+ ssl_key_object: 'key object',
696
+ ssl_key_pass_phrase: 'passphrase',
697
+ ssl_verify: true,
596
698
  }
597
699
  end
598
700
 
599
701
  let(:client) do
600
- new_local_client_nmio(['127.0.0.1:27017'], options)
702
+ new_local_client_nmio(SINGLE_CLIENT, options)
601
703
  end
602
704
 
603
705
  it 'sets the ssl option' do
@@ -650,9 +752,8 @@ describe Mongo::Client do
650
752
  end
651
753
 
652
754
  context 'when no database is provided' do
653
-
654
755
  let(:client) do
655
- new_local_client_nmio(['127.0.0.1:27017'], :read => { :mode => :secondary })
756
+ new_local_client_nmio(SINGLE_CLIENT, read: { mode: :secondary })
656
757
  end
657
758
 
658
759
  it 'defaults the database to admin' do
@@ -661,9 +762,8 @@ describe Mongo::Client do
661
762
  end
662
763
 
663
764
  context 'when a database is provided' do
664
-
665
765
  let(:client) do
666
- new_local_client_nmio(['127.0.0.1:27017'], :database => :testdb)
766
+ new_local_client_nmio(SINGLE_CLIENT, database: :testdb)
667
767
  end
668
768
 
669
769
  it 'sets the current database' do
@@ -672,7 +772,6 @@ describe Mongo::Client do
672
772
  end
673
773
 
674
774
  context 'when providing a custom logger' do
675
-
676
775
  let(:logger) do
677
776
  Logger.new($stdout).tap do |l|
678
777
  l.level = Logger::FATAL
@@ -684,14 +783,13 @@ describe Mongo::Client do
684
783
  end
685
784
 
686
785
  it 'does not use the global logger' do
687
- expect(client.cluster.logger).to_not eq(Mongo::Logger.logger)
786
+ expect(client.cluster.logger).not_to eq(Mongo::Logger.logger)
688
787
  end
689
788
  end
690
789
 
691
790
  context 'when providing a heartbeat_frequency' do
692
-
693
791
  let(:client) do
694
- new_local_client_nmio(['127.0.0.1:27017'], :heartbeat_frequency => 2)
792
+ new_local_client_nmio(SINGLE_CLIENT, heartbeat_frequency: 2)
695
793
  end
696
794
 
697
795
  it 'sets the heartbeat frequency' do
@@ -699,38 +797,47 @@ describe Mongo::Client do
699
797
  end
700
798
  end
701
799
 
702
- context 'when min_pool_size is provided' do
703
-
800
+ context 'when max_connecting is provided' do
704
801
  let(:client) do
705
- new_local_client_nmio(['127.0.0.1:27017'], options)
802
+ new_local_client_nmio(SINGLE_CLIENT, options)
706
803
  end
707
804
 
708
- context 'when max_pool_size is provided' do
805
+ context 'when max_connecting is a positive integer' do
806
+ let(:options) do
807
+ { max_connecting: 5 }
808
+ end
709
809
 
710
- context 'when the min_pool_size is greater than the max_pool_size' do
810
+ it 'sets the max connecting' do
811
+ expect(client.options[:max_connecting]).to eq(options[:max_connecting])
812
+ end
813
+ end
711
814
 
712
- let(:options) do
713
- {
714
- :min_pool_size => 20,
715
- :max_pool_size => 10
716
- }
717
- end
815
+ context 'when max_connecting is a negative integer' do
816
+ let(:options) do
817
+ { max_connecting: -5 }
818
+ end
819
+
820
+ it 'raises an exception' do
821
+ expect { client }.to raise_error(Mongo::Error::InvalidMaxConnecting)
822
+ end
823
+ end
824
+ end
825
+
826
+ context 'when min_pool_size is provided' do
827
+ let(:client) { new_local_client_nmio(SINGLE_CLIENT, options) }
828
+
829
+ context 'when max_pool_size is provided' do
830
+ context 'when the min_pool_size is greater than the max_pool_size' do
831
+ let(:options) { { min_pool_size: 20, max_pool_size: 10 } }
718
832
 
719
833
  it 'raises an Exception' do
720
- expect {
721
- client
722
- }.to raise_exception(Mongo::Error::InvalidMinPoolSize)
834
+ expect { client }
835
+ .to raise_exception(Mongo::Error::InvalidMinPoolSize)
723
836
  end
724
837
  end
725
838
 
726
839
  context 'when the min_pool_size is less than the max_pool_size' do
727
-
728
- let(:options) do
729
- {
730
- :min_pool_size => 10,
731
- :max_pool_size => 20
732
- }
733
- end
840
+ let(:options) { { min_pool_size: 10, max_pool_size: 20 } }
734
841
 
735
842
  it 'sets the option' do
736
843
  expect(client.options[:min_pool_size]).to eq(options[:min_pool_size])
@@ -739,13 +846,16 @@ describe Mongo::Client do
739
846
  end
740
847
 
741
848
  context 'when the min_pool_size is equal to the max_pool_size' do
849
+ let(:options) { { min_pool_size: 10, max_pool_size: 10 } }
742
850
 
743
- let(:options) do
744
- {
745
- :min_pool_size => 10,
746
- :max_pool_size => 10
747
- }
851
+ it 'sets the option' do
852
+ expect(client.options[:min_pool_size]).to eq(options[:min_pool_size])
853
+ expect(client.options[:max_pool_size]).to eq(options[:max_pool_size])
748
854
  end
855
+ end
856
+
857
+ context 'when max_pool_size is zero (unlimited)' do
858
+ let(:options) { { min_pool_size: 10, max_pool_size: 0 } }
749
859
 
750
860
  it 'sets the option' do
751
861
  expect(client.options[:min_pool_size]).to eq(options[:min_pool_size])
@@ -755,29 +865,17 @@ describe Mongo::Client do
755
865
  end
756
866
 
757
867
  context 'when max_pool_size is not provided' do
758
-
759
868
  context 'when the min_pool_size is greater than the default max_pool_size' do
760
-
761
- let(:options) do
762
- {
763
- :min_pool_size => 10
764
- }
765
- end
869
+ let(:options) { { min_pool_size: 30 } }
766
870
 
767
871
  it 'raises an Exception' do
768
- expect {
769
- client
770
- }.to raise_exception(Mongo::Error::InvalidMinPoolSize)
872
+ expect { client }
873
+ .to raise_exception(Mongo::Error::InvalidMinPoolSize)
771
874
  end
772
875
  end
773
876
 
774
877
  context 'when the min_pool_size is less than the default max_pool_size' do
775
-
776
- let(:options) do
777
- {
778
- :min_pool_size => 3
779
- }
780
- end
878
+ let(:options) { { min_pool_size: 3 } }
781
879
 
782
880
  it 'sets the option' do
783
881
  expect(client.options[:min_pool_size]).to eq(options[:min_pool_size])
@@ -785,10 +883,9 @@ describe Mongo::Client do
785
883
  end
786
884
 
787
885
  context 'when the min_pool_size is equal to the max_pool_size' do
788
-
789
886
  let(:options) do
790
887
  {
791
- :min_pool_size => Mongo::Server::ConnectionPool::DEFAULT_MAX_SIZE
888
+ min_pool_size: Mongo::Server::ConnectionPool::DEFAULT_MAX_SIZE
792
889
  }
793
890
  end
794
891
 
@@ -799,18 +896,18 @@ describe Mongo::Client do
799
896
  end
800
897
  end
801
898
 
802
- context 'when max_pool_size and min_pool_size are both nil' do
899
+ context 'when max_pool_size is 0 (unlimited)' do
900
+ let(:client) { new_local_client_nmio(SINGLE_CLIENT, options) }
901
+ let(:options) { { max_pool_size: 0 } }
803
902
 
804
- let(:client) do
805
- new_local_client_nmio(['127.0.0.1:27017'], options)
903
+ it 'sets the option' do
904
+ expect(client.options[:max_pool_size]).to eq(options[:max_pool_size])
806
905
  end
906
+ end
807
907
 
808
- let(:options) do
809
- {
810
- :min_pool_size => nil,
811
- :max_pool_size => nil
812
- }
813
- end
908
+ context 'when max_pool_size and min_pool_size are both nil' do
909
+ let(:options) { { min_pool_size: nil, max_pool_size: nil } }
910
+ let(:client) { new_local_client_nmio(SINGLE_CLIENT, options) }
814
911
 
815
912
  it 'does not set either option' do
816
913
  expect(client.options[:max_pool_size]).to be_nil
@@ -819,43 +916,42 @@ describe Mongo::Client do
819
916
  end
820
917
 
821
918
  context 'when platform details are specified' do
822
-
823
919
  let(:app_metadata) do
824
920
  client.cluster.app_metadata
825
921
  end
826
922
 
827
923
  let(:client) do
828
- new_local_client_nmio(['127.0.0.1:27017'], :platform => 'mongoid-6.0.2')
924
+ new_local_client_nmio(SINGLE_CLIENT, platform: 'mongoid-6.0.2')
829
925
  end
830
926
 
831
927
  it 'includes the platform info in the app metadata' do
832
- expect(app_metadata.send(:full_client_document)[:platform]).to match(/mongoid-6\.0\.2/)
928
+ expect(app_metadata.client_document[:platform]).to match(/mongoid-6\.0\.2/)
833
929
  end
834
930
  end
835
931
 
836
932
  context 'when platform details are not specified' do
837
-
838
933
  let(:app_metadata) do
839
934
  client.cluster.app_metadata
840
935
  end
841
936
 
842
937
  let(:client) do
843
- new_local_client_nmio(['127.0.0.1:27017'])
938
+ new_local_client_nmio(SINGLE_CLIENT)
844
939
  end
845
940
 
846
941
  context 'mri' do
847
- only_mri
942
+ require_mri
848
943
 
849
944
  let(:platform_string) do
850
945
  [
851
946
  "Ruby #{RUBY_VERSION}",
852
947
  RUBY_PLATFORM,
853
- RbConfig::CONFIG['build']
948
+ RbConfig::CONFIG['build'],
949
+ 'A',
854
950
  ].join(', ')
855
951
  end
856
952
 
857
953
  it 'does not include the platform info in the app metadata' do
858
- expect(app_metadata.send(:full_client_document)[:platform]).to eq(platform_string)
954
+ expect(app_metadata.client_document[:platform]).to eq(platform_string)
859
955
  end
860
956
  end
861
957
 
@@ -868,29 +964,24 @@ describe Mongo::Client do
868
964
  "like Ruby #{RUBY_VERSION}",
869
965
  RUBY_PLATFORM,
870
966
  "JVM #{java.lang.System.get_property('java.version')}",
871
- RbConfig::CONFIG['build']
967
+ RbConfig::CONFIG['build'],
968
+ 'A',
872
969
  ].join(', ')
873
970
  end
874
971
 
875
972
  it 'does not include the platform info in the app metadata' do
876
- expect(app_metadata.send(:full_client_document)[:platform]).to eq(platform_string)
973
+ expect(app_metadata.client_document[:platform]).to eq(platform_string)
877
974
  end
878
975
  end
879
976
  end
880
977
  end
881
978
 
882
979
  context 'when providing a connection string' do
883
-
884
980
  context 'when the string uses the SRV Protocol' do
885
981
  require_external_connectivity
886
982
 
887
- let!(:uri) do
888
- 'mongodb+srv://test5.test.build.10gen.cc/testdb'
889
- end
890
-
891
- let(:client) do
892
- new_local_client_nmio(uri)
893
- end
983
+ let(:uri) { 'mongodb+srv://test5.test.build.10gen.cc/testdb' }
984
+ let(:client) { new_local_client_nmio(uri) }
894
985
 
895
986
  it 'sets the database' do
896
987
  expect(client.options[:database]).to eq('testdb')
@@ -898,29 +989,17 @@ describe Mongo::Client do
898
989
  end
899
990
 
900
991
  context 'when a database is provided' do
901
-
902
- let!(:uri) do
903
- 'mongodb://127.0.0.1:27017/testdb'
904
- end
905
-
906
- let(:client) do
907
- new_local_client_nmio(uri)
908
- end
992
+ let(:uri) { 'mongodb://127.0.0.1:27017/testdb' }
993
+ let(:client) { new_local_client_nmio(uri) }
909
994
 
910
995
  it 'sets the database' do
911
- expect { client[:users] }.to_not raise_error
996
+ expect { client[:users] }.not_to raise_error
912
997
  end
913
998
  end
914
999
 
915
1000
  context 'when a database is not provided' do
916
-
917
- let!(:uri) do
918
- 'mongodb://127.0.0.1:27017'
919
- end
920
-
921
- let(:client) do
922
- new_local_client_nmio(uri)
923
- end
1001
+ let(:uri) { 'mongodb://127.0.0.1:27017' }
1002
+ let(:client) { new_local_client_nmio(uri) }
924
1003
 
925
1004
  it 'defaults the database to admin' do
926
1005
  expect(client.database.name).to eq('admin')
@@ -928,44 +1007,59 @@ describe Mongo::Client do
928
1007
  end
929
1008
 
930
1009
  context 'when URI options are provided' do
931
-
932
- let!(:uri) do
933
- 'mongodb://127.0.0.1:27017/testdb?w=3'
934
- end
935
-
936
- let(:client) do
937
- new_local_client_nmio(uri)
938
- end
1010
+ let(:uri) { 'mongodb://127.0.0.1:27017/testdb?w=3' }
1011
+ let(:client) { new_local_client_nmio(uri) }
939
1012
 
940
1013
  let(:expected_options) do
941
- Mongo::Options::Redacted.new(write_concern: { :w => 3 },
942
- monitoring_io: false, :database => 'testdb', retry_writes: true,
943
- retry_reads: true)
1014
+ Mongo::Options::Redacted.new(
1015
+ write_concern: { w: 3 },
1016
+ monitoring_io: false,
1017
+ database: 'testdb',
1018
+ retry_writes: true,
1019
+ retry_reads: true
1020
+ )
944
1021
  end
945
1022
 
946
1023
  it 'sets the options' do
947
1024
  expect(client.options).to eq(expected_options)
948
1025
  end
949
1026
 
950
- context 'when min_pool_size is provided' do
1027
+ context 'when max_connecting is provided' do
1028
+ context 'when max_connecting is a positive integer' do
1029
+ let(:uri) do
1030
+ 'mongodb://127.0.0.1:27017/?maxConnecting=10'
1031
+ end
951
1032
 
952
- context 'when max_pool_size is provided' do
1033
+ it 'sets the max connecting' do
1034
+ expect(client.options[:max_connecting]).to eq(10)
1035
+ end
1036
+ end
953
1037
 
954
- context 'when the min_pool_size is greater than the max_pool_size' do
1038
+ context 'when max_connecting is a negative integer' do
1039
+ let(:uri) do
1040
+ 'mongodb://127.0.0.1:27017/?maxConnecting=0'
1041
+ end
1042
+
1043
+ it 'raises an exception' do
1044
+ expect { client }.to raise_error(Mongo::Error::InvalidMaxConnecting)
1045
+ end
1046
+ end
1047
+ end
955
1048
 
1049
+ context 'when min_pool_size is provided' do
1050
+ context 'when max_pool_size is provided' do
1051
+ context 'when the min_pool_size is greater than the max_pool_size' do
956
1052
  let(:uri) do
957
1053
  'mongodb://127.0.0.1:27017/?minPoolSize=20&maxPoolSize=10'
958
1054
  end
959
1055
 
960
1056
  it 'raises an Exception' do
961
- expect {
962
- client
963
- }.to raise_exception(Mongo::Error::InvalidMinPoolSize)
1057
+ expect { client }
1058
+ .to raise_exception(Mongo::Error::InvalidMinPoolSize)
964
1059
  end
965
1060
  end
966
1061
 
967
1062
  context 'when the min_pool_size is less than the max_pool_size' do
968
-
969
1063
  let(:uri) do
970
1064
  'mongodb://127.0.0.1:27017/?minPoolSize=10&maxPoolSize=20'
971
1065
  end
@@ -977,7 +1071,6 @@ describe Mongo::Client do
977
1071
  end
978
1072
 
979
1073
  context 'when the min_pool_size is equal to the max_pool_size' do
980
-
981
1074
  let(:uri) do
982
1075
  'mongodb://127.0.0.1:27017/?minPoolSize=10&maxPoolSize=10'
983
1076
  end
@@ -987,28 +1080,31 @@ describe Mongo::Client do
987
1080
  expect(client.options[:max_pool_size]).to eq(10)
988
1081
  end
989
1082
  end
1083
+
1084
+ context 'when max_pool_size is 0 (unlimited)' do
1085
+ let(:uri) do
1086
+ 'mongodb://127.0.0.1:27017/?minPoolSize=10&maxPoolSize=0'
1087
+ end
1088
+
1089
+ it 'sets the option' do
1090
+ expect(client.options[:min_pool_size]).to eq(10)
1091
+ expect(client.options[:max_pool_size]).to eq(0)
1092
+ end
1093
+ end
990
1094
  end
991
1095
 
992
1096
  context 'when max_pool_size is not provided' do
993
-
994
1097
  context 'when the min_pool_size is greater than the default max_pool_size' do
995
-
996
- let(:uri) do
997
- 'mongodb://127.0.0.1:27017/?minPoolSize=10'
998
- end
1098
+ let(:uri) { 'mongodb://127.0.0.1:27017/?minPoolSize=30' }
999
1099
 
1000
1100
  it 'raises an Exception' do
1001
- expect {
1002
- client
1003
- }.to raise_exception(Mongo::Error::InvalidMinPoolSize)
1101
+ expect { client }
1102
+ .to raise_exception(Mongo::Error::InvalidMinPoolSize)
1004
1103
  end
1005
1104
  end
1006
1105
 
1007
1106
  context 'when the min_pool_size is less than the default max_pool_size' do
1008
-
1009
- let(:uri) do
1010
- 'mongodb://127.0.0.1:27017/?minPoolSize=3'
1011
- end
1107
+ let(:uri) { 'mongodb://127.0.0.1:27017/?minPoolSize=3' }
1012
1108
 
1013
1109
  it 'sets the option' do
1014
1110
  expect(client.options[:min_pool_size]).to eq(3)
@@ -1016,10 +1112,7 @@ describe Mongo::Client do
1016
1112
  end
1017
1113
 
1018
1114
  context 'when the min_pool_size is equal to the max_pool_size' do
1019
-
1020
- let(:uri) do
1021
- 'mongodb://127.0.0.1:27017/?minPoolSize=5'
1022
- end
1115
+ let(:uri) { 'mongodb://127.0.0.1:27017/?minPoolSize=5' }
1023
1116
 
1024
1117
  it 'sets the option' do
1025
1118
  expect(client.options[:min_pool_size]).to eq(5)
@@ -1029,11 +1122,8 @@ describe Mongo::Client do
1029
1122
  end
1030
1123
 
1031
1124
  context 'when retryReads URI option is given' do
1032
-
1033
1125
  context 'it is false' do
1034
- let!(:uri) do
1035
- 'mongodb://127.0.0.1:27017/testdb?retryReads=false'
1036
- end
1126
+ let(:uri) { 'mongodb://127.0.0.1:27017/testdb?retryReads=false' }
1037
1127
 
1038
1128
  it 'sets the option on the client' do
1039
1129
  expect(client.options[:retry_reads]).to be false
@@ -1041,9 +1131,7 @@ describe Mongo::Client do
1041
1131
  end
1042
1132
 
1043
1133
  context 'it is true' do
1044
- let!(:uri) do
1045
- 'mongodb://127.0.0.1:27017/testdb?retryReads=true'
1046
- end
1134
+ let(:uri) { 'mongodb://127.0.0.1:27017/testdb?retryReads=true' }
1047
1135
 
1048
1136
  it 'sets the option on the client' do
1049
1137
  expect(client.options[:retry_reads]).to be true
@@ -1052,11 +1140,8 @@ describe Mongo::Client do
1052
1140
  end
1053
1141
 
1054
1142
  context 'when retryWrites URI option is given' do
1055
-
1056
1143
  context 'it is false' do
1057
- let!(:uri) do
1058
- 'mongodb://127.0.0.1:27017/testdb?retryWrites=false'
1059
- end
1144
+ let(:uri) { 'mongodb://127.0.0.1:27017/testdb?retryWrites=false' }
1060
1145
 
1061
1146
  it 'sets the option on the client' do
1062
1147
  expect(client.options[:retry_writes]).to be false
@@ -1064,9 +1149,7 @@ describe Mongo::Client do
1064
1149
  end
1065
1150
 
1066
1151
  context 'it is true' do
1067
- let!(:uri) do
1068
- 'mongodb://127.0.0.1:27017/testdb?retryWrites=true'
1069
- end
1152
+ let(:uri) { 'mongodb://127.0.0.1:27017/testdb?retryWrites=true' }
1070
1153
 
1071
1154
  it 'sets the option on the client' do
1072
1155
  expect(client.options[:retry_writes]).to be true
@@ -1076,19 +1159,20 @@ describe Mongo::Client do
1076
1159
  end
1077
1160
 
1078
1161
  context 'when options are provided not in the string' do
1079
-
1080
- let!(:uri) do
1081
- 'mongodb://127.0.0.1:27017/testdb'
1082
- end
1162
+ let(:uri) { 'mongodb://127.0.0.1:27017/testdb' }
1083
1163
 
1084
1164
  let(:client) do
1085
- new_local_client_nmio(uri, :write => { :w => 3 })
1165
+ new_local_client_nmio(uri, write: { w: 3 })
1086
1166
  end
1087
1167
 
1088
1168
  let(:expected_options) do
1089
- Mongo::Options::Redacted.new(:write => { :w => 3 },
1090
- monitoring_io: false, :database => 'testdb', retry_writes: true,
1091
- retry_reads: true)
1169
+ Mongo::Options::Redacted.new(
1170
+ write: { w: 3 },
1171
+ monitoring_io: false,
1172
+ database: 'testdb',
1173
+ retry_writes: true,
1174
+ retry_reads: true
1175
+ )
1092
1176
  end
1093
1177
 
1094
1178
  it 'sets the options' do
@@ -1097,19 +1181,20 @@ describe Mongo::Client do
1097
1181
  end
1098
1182
 
1099
1183
  context 'when options are provided in the URI and as Ruby options' do
1100
-
1101
- let!(:uri) do
1102
- 'mongodb://127.0.0.1:27017/testdb?w=3'
1103
- end
1184
+ let(:uri) { 'mongodb://127.0.0.1:27017/testdb?w=3' }
1104
1185
 
1105
1186
  let(:client) do
1106
- new_local_client_nmio(uri, option_name => { :w => 4 })
1187
+ new_local_client_nmio(uri, option_name => { w: 4 })
1107
1188
  end
1108
1189
 
1109
1190
  let(:expected_options) do
1110
- Mongo::Options::Redacted.new(option_name => { :w => 4 },
1111
- monitoring_io: false, :database => 'testdb', retry_writes: true,
1112
- retry_reads: true)
1191
+ Mongo::Options::Redacted.new(
1192
+ option_name => { w: 4 },
1193
+ monitoring_io: false,
1194
+ database: 'testdb',
1195
+ retry_writes: true,
1196
+ retry_reads: true
1197
+ )
1113
1198
  end
1114
1199
 
1115
1200
  shared_examples_for 'allows explicit options to take preference' do
@@ -1132,14 +1217,8 @@ describe Mongo::Client do
1132
1217
  end
1133
1218
 
1134
1219
  context 'when a replica set name is provided' do
1135
-
1136
- let!(:uri) do
1137
- 'mongodb://127.0.0.1:27017/testdb?replicaSet=testing'
1138
- end
1139
-
1140
- let(:client) do
1141
- new_local_client_nmio(uri)
1142
- end
1220
+ let(:uri) { 'mongodb://127.0.0.1:27017/testdb?replicaSet=testing' }
1221
+ let(:client) { new_local_client_nmio(uri) }
1143
1222
 
1144
1223
  it 'sets the correct cluster topology' do
1145
1224
  expect(client.cluster.topology).to be_a(Mongo::Cluster::Topology::ReplicaSetNoPrimary)
@@ -1149,129 +1228,404 @@ describe Mongo::Client do
1149
1228
 
1150
1229
  context 'when Ruby options are provided' do
1151
1230
  let(:client) do
1152
- new_local_client_nmio(['127.0.0.1:27017'], options)
1231
+ new_local_client_nmio(SINGLE_CLIENT, options)
1153
1232
  end
1154
1233
 
1155
1234
  describe 'connection option conflicts' do
1156
1235
  context 'direct_connection: true and multiple seeds' do
1157
1236
  let(:client) do
1158
- new_local_client_nmio(['127.0.0.1:27017', '127.0.0.2:27017'],
1159
- direct_connection: true)
1237
+ new_local_client_nmio([ '127.0.0.1:27017', '127.0.0.2:27017' ], direct_connection: true)
1160
1238
  end
1161
1239
 
1162
1240
  it 'is rejected' do
1163
- lambda do
1164
- client
1165
- end.should raise_error(ArgumentError, /direct_connection=true cannot be used with multiple seeds/)
1241
+ expect { client }
1242
+ .to raise_error(ArgumentError, /direct_connection=true cannot be used with multiple seeds/)
1166
1243
  end
1167
1244
  end
1168
1245
 
1169
1246
  context 'direct_connection: true and connect: :direct' do
1170
1247
  let(:options) do
1171
- {direct_connection: true, connect: :direct}
1248
+ { direct_connection: true, connect: :direct }
1172
1249
  end
1173
1250
 
1174
1251
  it 'is accepted' do
1175
- client.options[:direct_connection].should be true
1176
- client.options[:connect].should be :direct
1252
+ expect(client.options[:direct_connection]).to be true
1253
+ expect(client.options[:connect]).to be :direct
1177
1254
  end
1178
1255
  end
1179
1256
 
1180
1257
  context 'direct_connection: true and connect: :replica_set' do
1181
1258
  let(:options) do
1182
- {direct_connection: true, connect: :replica_set}
1259
+ { direct_connection: true, connect: :replica_set }
1183
1260
  end
1184
1261
 
1185
1262
  it 'is rejected' do
1186
- lambda do
1187
- client
1188
- end.should raise_error(ArgumentError, /Conflicting client options: direct_connection=true and connect=replica_set/)
1263
+ expect { client }
1264
+ .to raise_error(
1265
+ ArgumentError,
1266
+ /Conflicting client options: direct_connection=true and connect=replica_set/
1267
+ )
1189
1268
  end
1190
1269
  end
1191
1270
 
1192
1271
  context 'direct_connection: true and connect: :sharded' do
1193
1272
  let(:options) do
1194
- {direct_connection: true, connect: :sharded}
1273
+ { direct_connection: true, connect: :sharded }
1195
1274
  end
1196
1275
 
1197
1276
  it 'is rejected' do
1198
- lambda do
1199
- client
1200
- end.should raise_error(ArgumentError, /Conflicting client options: direct_connection=true and connect=sharded/)
1277
+ expect { client }
1278
+ .to raise_error(ArgumentError, /Conflicting client options: direct_connection=true and connect=sharded/)
1201
1279
  end
1202
1280
  end
1203
1281
 
1204
1282
  context 'direct_connection: false and connect: :direct' do
1205
1283
  let(:options) do
1206
- {direct_connection: false, connect: :direct}
1284
+ { direct_connection: false, connect: :direct }
1207
1285
  end
1208
1286
 
1209
1287
  it 'is rejected' do
1210
- lambda do
1211
- client
1212
- end.should raise_error(ArgumentError, /Conflicting client options: direct_connection=false and connect=direct/)
1288
+ expect { client }
1289
+ .to raise_error(ArgumentError, /Conflicting client options: direct_connection=false and connect=direct/)
1213
1290
  end
1214
1291
  end
1215
1292
 
1216
1293
  context 'direct_connection: false and connect: :replica_set' do
1217
1294
  let(:options) do
1218
- {direct_connection: false, connect: :replica_set, replica_set: 'foo'}
1295
+ { direct_connection: false, connect: :replica_set, replica_set: 'foo' }
1219
1296
  end
1220
1297
 
1221
1298
  it 'is accepted' do
1222
- client.options[:direct_connection].should be false
1223
- client.options[:connect].should be :replica_set
1299
+ expect(client.options[:direct_connection]).to be false
1300
+ expect(client.options[:connect]).to be :replica_set
1224
1301
  end
1225
1302
  end
1226
1303
 
1227
1304
  context 'direct_connection: false and connect: :sharded' do
1228
1305
  let(:options) do
1229
- {direct_connection: false, connect: :sharded}
1306
+ { direct_connection: false, connect: :sharded }
1307
+ end
1308
+
1309
+ it 'is accepted' do
1310
+ expect(client.options[:direct_connection]).to be false
1311
+ expect(client.options[:connect]).to be :sharded
1312
+ end
1313
+ end
1314
+
1315
+ context 'load_balanced: true and multiple seeds' do
1316
+ let(:client) do
1317
+ new_local_client_nmio([ '127.0.0.1:27017', '127.0.0.2:27017' ], load_balanced: true)
1318
+ end
1319
+
1320
+ it 'is rejected' do
1321
+ expect { client }
1322
+ .to raise_error(ArgumentError, /load_balanced=true cannot be used with multiple seeds/)
1323
+ end
1324
+ end
1325
+
1326
+ context 'load_balanced: false and multiple seeds' do
1327
+ let(:client) do
1328
+ new_local_client_nmio([ '127.0.0.1:27017', '127.0.0.2:27017' ], load_balanced: false)
1329
+ end
1330
+
1331
+ it 'is accepted' do
1332
+ expect { client }.not_to raise_error
1333
+ expect(client.options[:load_balanced]).to be false
1334
+ end
1335
+ end
1336
+
1337
+ context 'load_balanced: true and direct_connection: true' do
1338
+ let(:client) do
1339
+ new_local_client_nmio(SINGLE_CLIENT, load_balanced: true, direct_connection: true)
1340
+ end
1341
+
1342
+ it 'is rejected' do
1343
+ expect { client }
1344
+ .to raise_error(ArgumentError, /direct_connection=true cannot be used with load_balanced=true/)
1345
+ end
1346
+ end
1347
+
1348
+ context 'load_balanced: true and direct_connection: false' do
1349
+ let(:client) do
1350
+ new_local_client_nmio(SINGLE_CLIENT, load_balanced: true, direct_connection: false)
1230
1351
  end
1231
1352
 
1232
1353
  it 'is accepted' do
1233
- client.options[:direct_connection].should be false
1234
- client.options[:connect].should be :sharded
1354
+ expect { client }.not_to raise_error
1355
+ expect(client.options[:load_balanced]).to be true
1356
+ expect(client.options[:direct_connection]).to be false
1357
+ end
1358
+ end
1359
+
1360
+ context 'load_balanced: false and direct_connection: true' do
1361
+ let(:client) do
1362
+ new_local_client_nmio(SINGLE_CLIENT, load_balanced: false, direct_connection: true)
1363
+ end
1364
+
1365
+ it 'is accepted' do
1366
+ expect { client }.not_to raise_error
1367
+ expect(client.options[:load_balanced]).to be false
1368
+ expect(client.options[:direct_connection]).to be true
1369
+ end
1370
+ end
1371
+
1372
+ [ :direct, 'direct', :sharded, 'sharded' ].each do |v|
1373
+ context "load_balanced: true and connect: #{v.inspect}" do
1374
+ let(:client) do
1375
+ new_local_client_nmio(SINGLE_CLIENT, load_balanced: true, connect: v)
1376
+ end
1377
+
1378
+ it 'is rejected' do
1379
+ expect { client }
1380
+ .to raise_error(ArgumentError, /connect=#{v} cannot be used with load_balanced=true/)
1381
+ end
1382
+ end
1383
+ end
1384
+
1385
+ [ nil ].each do |v|
1386
+ context "load_balanced: true and connect: #{v.inspect}" do
1387
+ let(:client) do
1388
+ new_local_client_nmio(SINGLE_CLIENT, load_balanced: true, connect: v)
1389
+ end
1390
+
1391
+ it 'is accepted' do
1392
+ expect { client }.not_to raise_error
1393
+ expect(client.options[:load_balanced]).to be true
1394
+ expect(client.options[:connect]).to eq v
1395
+ end
1396
+ end
1397
+ end
1398
+
1399
+ [ :load_balanced, 'load_balanced' ].each do |v|
1400
+ context "load_balanced: true and connect: #{v.inspect}" do
1401
+ let(:client) do
1402
+ new_local_client_nmio(SINGLE_CLIENT, load_balanced: true, connect: v)
1403
+ end
1404
+
1405
+ it 'is accepted' do
1406
+ expect { client }.not_to raise_error
1407
+ expect(client.options[:load_balanced]).to be true
1408
+ expect(client.options[:connect]).to eq v
1409
+ end
1410
+ end
1411
+
1412
+ context "replica_set and connect: #{v.inspect}" do
1413
+ let(:client) do
1414
+ new_local_client_nmio(SINGLE_CLIENT, replica_set: 'foo', connect: v)
1415
+ end
1416
+
1417
+ it 'is rejected' do
1418
+ expect { client }
1419
+ .to raise_error(ArgumentError, /connect=load_balanced cannot be used with replica_set option/)
1420
+ end
1421
+ end
1422
+
1423
+ context "direct_connection=true and connect: #{v.inspect}" do
1424
+ let(:client) do
1425
+ new_local_client_nmio(SINGLE_CLIENT, direct_connection: true, connect: v)
1426
+ end
1427
+
1428
+ it 'is rejected' do
1429
+ expect { client }
1430
+ .to raise_error(
1431
+ ArgumentError,
1432
+ /Conflicting client options: direct_connection=true and connect=load_balanced/
1433
+ )
1434
+ end
1435
+ end
1436
+
1437
+ context "multiple seed addresses and connect: #{v.inspect}" do
1438
+ let(:client) do
1439
+ new_local_client_nmio([ '127.0.0.1:27017', '127.0.0.1:1234' ], connect: v)
1440
+ end
1441
+
1442
+ it 'is rejected' do
1443
+ expect { client }
1444
+ .to raise_error(ArgumentError, /connect=load_balanced cannot be used with multiple seeds/)
1445
+ end
1446
+ end
1447
+ end
1448
+
1449
+ [ :replica_set, 'replica_set' ].each do |v|
1450
+ context "load_balanced: true and connect: #{v.inspect}" do
1451
+ let(:client) do
1452
+ new_local_client_nmio(SINGLE_CLIENT, load_balanced: true, connect: v, replica_set: 'x')
1453
+ end
1454
+
1455
+ it 'is rejected' do
1456
+ expect { client }
1457
+ .to raise_error(ArgumentError, /connect=replica_set cannot be used with load_balanced=true/)
1458
+ end
1459
+ end
1460
+
1461
+ context "load_balanced: true and #{v.inspect} option" do
1462
+ let(:client) do
1463
+ new_local_client_nmio(SINGLE_CLIENT, load_balanced: true, v => 'rs')
1464
+ end
1465
+
1466
+ it 'is rejected' do
1467
+ expect { client }
1468
+ .to raise_error(ArgumentError, /load_balanced=true cannot be used with replica_set option/)
1469
+ end
1470
+ end
1471
+ end
1472
+
1473
+ context 'srv_max_hosts > 0 and load_balanced: true' do
1474
+ let(:client) do
1475
+ new_local_client_nmio(SINGLE_CLIENT, srv_max_hosts: 1, load_balanced: true)
1476
+ end
1477
+
1478
+ it 'it is rejected' do
1479
+ expect { client }
1480
+ .to raise_error(ArgumentError, /:srv_max_hosts > 0 cannot be used with :load_balanced=true/)
1481
+ end
1482
+ end
1483
+
1484
+ context 'srv_max_hosts > 0 and replica_set' do
1485
+ let(:client) do
1486
+ new_local_client_nmio(SINGLE_CLIENT, srv_max_hosts: 1, replica_set: 'rs')
1487
+ end
1488
+
1489
+ it 'it is rejected' do
1490
+ expect do
1491
+ client
1492
+ end.to raise_error(ArgumentError, /:srv_max_hosts > 0 cannot be used with :replica_set option/)
1493
+ end
1494
+ end
1495
+
1496
+ context 'srv_max_hosts < 0' do
1497
+ let(:client) do
1498
+ new_local_client_nmio(SINGLE_CLIENT, srv_max_hosts: -1)
1499
+ end
1500
+
1501
+ it 'is accepted and does not add the srv_max_hosts to uri_options' do
1502
+ expect { client }.not_to raise_error
1503
+ expect(client.options).not_to have_key(:srv_max_hosts)
1504
+ end
1505
+ end
1506
+
1507
+ context 'srv_max_hosts invalid type' do
1508
+ let(:client) do
1509
+ new_local_client_nmio(SINGLE_CLIENT, srv_max_hosts: 'foo')
1510
+ end
1511
+
1512
+ it 'is accepted and does not add the srv_max_hosts to uri_options' do
1513
+ expect { client }.not_to raise_error
1514
+ expect(client.options).not_to have_key(:srv_max_hosts)
1515
+ end
1516
+ end
1517
+
1518
+ context 'srv_max_hosts with non-SRV URI' do
1519
+ let(:client) do
1520
+ new_local_client_nmio(SINGLE_CLIENT, srv_max_hosts: 1)
1521
+ end
1522
+
1523
+ it 'is rejected' do
1524
+ expect { client }
1525
+ .to raise_error(ArgumentError, /:srv_max_hosts cannot be used on non-SRV URI/)
1526
+ end
1527
+ end
1528
+
1529
+ context 'srv_service_name with non-SRV URI' do
1530
+ let(:client) do
1531
+ new_local_client_nmio(SINGLE_CLIENT, srv_service_name: 'customname')
1532
+ end
1533
+
1534
+ it 'is rejected' do
1535
+ expect { client }
1536
+ .to raise_error(ArgumentError, /:srv_service_name cannot be used on non-SRV URI/)
1537
+ end
1538
+ end
1539
+ end
1540
+
1541
+ context 'with SRV lookups mocked at Resolver' do
1542
+ let(:srv_result) do
1543
+ double('srv result').tap do |result|
1544
+ allow(result).to receive(:empty?).and_return(false)
1545
+ allow(result).to receive(:address_strs).and_return(
1546
+ [ ClusterConfig.instance.primary_address_str ]
1547
+ )
1548
+ end
1549
+ end
1550
+
1551
+ let(:client) do
1552
+ allow_any_instance_of(Mongo::Srv::Resolver).to receive(:get_records).and_return(srv_result)
1553
+ allow_any_instance_of(Mongo::Srv::Resolver).to receive(:get_txt_options_string)
1554
+
1555
+ new_local_client_nmio('mongodb+srv://foo.a.b', options)
1556
+ end
1557
+
1558
+ context 'when setting srv_max_hosts' do
1559
+ let(:srv_max_hosts) { 1 }
1560
+ let(:options) { { srv_max_hosts: srv_max_hosts } }
1561
+
1562
+ it 'is accepted and sets srv_max_hosts' do
1563
+ expect { client }.not_to raise_error
1564
+ expect(client.options[:srv_max_hosts]).to eq(srv_max_hosts)
1565
+ end
1566
+ end
1567
+
1568
+ context 'when setting srv_max_hosts to 0' do
1569
+ let(:srv_max_hosts) { 0 }
1570
+ let(:options) { { srv_max_hosts: srv_max_hosts } }
1571
+
1572
+ it 'is accepted sets srv_max_hosts' do
1573
+ expect { client }.not_to raise_error
1574
+ expect(client.options[:srv_max_hosts]).to eq(srv_max_hosts)
1575
+ end
1576
+ end
1577
+
1578
+ context 'when setting srv_service_name' do
1579
+ let(:srv_service_name) { 'customname' }
1580
+ let(:options) { { srv_service_name: srv_service_name } }
1581
+
1582
+ it 'is accepted and sets srv_service_name' do
1583
+ expect { client }.not_to raise_error
1584
+ expect(client.options[:srv_service_name]).to eq(srv_service_name)
1235
1585
  end
1236
1586
  end
1237
1587
  end
1238
1588
 
1239
1589
  context ':bg_error_backtrace option' do
1240
- [true, false, nil, 42].each do |valid_value|
1590
+ [ true, false, nil, 42 ].each do |valid_value|
1241
1591
  context "valid value: #{valid_value.inspect}" do
1242
1592
  let(:options) do
1243
- {bg_error_backtrace: valid_value}
1593
+ { bg_error_backtrace: valid_value }
1244
1594
  end
1245
1595
 
1246
1596
  it 'is accepted' do
1247
- client.options[:bg_error_backtrace].should == valid_value
1597
+ expect(client.options[:bg_error_backtrace]).to be == valid_value
1248
1598
  end
1249
1599
  end
1250
1600
  end
1251
1601
 
1252
1602
  context 'invalid value type' do
1253
1603
  let(:options) do
1254
- {bg_error_backtrace: 'yes'}
1604
+ { bg_error_backtrace: 'yes' }
1255
1605
  end
1256
1606
 
1257
1607
  it 'is rejected' do
1258
- lambda do
1259
- client
1260
- end.should raise_error(ArgumentError, /:bg_error_backtrace option value must be true, false, nil or a positive integer/)
1608
+ expect { client }
1609
+ .to raise_error(
1610
+ ArgumentError,
1611
+ /:bg_error_backtrace option value must be true, false, nil or a positive integer/
1612
+ )
1261
1613
  end
1262
1614
  end
1263
1615
 
1264
1616
  context 'invalid value' do
1265
- [0, -1, 42.0].each do |invalid_value|
1617
+ [ 0, -1, 42.0 ].each do |invalid_value|
1266
1618
  context "invalid value: #{invalid_value.inspect}" do
1267
1619
  let(:options) do
1268
- {bg_error_backtrace: invalid_value}
1620
+ { bg_error_backtrace: invalid_value }
1269
1621
  end
1270
1622
 
1271
1623
  it 'is rejected' do
1272
- lambda do
1273
- client
1274
- end.should raise_error(ArgumentError, /:bg_error_backtrace option value must be true, false, nil or a positive integer/)
1624
+ expect { client }
1625
+ .to raise_error(
1626
+ ArgumentError,
1627
+ /:bg_error_backtrace option value must be true, false, nil or a positive integer/
1628
+ )
1275
1629
  end
1276
1630
  end
1277
1631
  end
@@ -1279,74 +1633,125 @@ describe Mongo::Client do
1279
1633
  end
1280
1634
 
1281
1635
  describe ':read option' do
1282
- [
1283
- :primary, :primary_preferred, :secondary, :secondary_preferred, :nearest
1284
- ].each do |sym|
1285
- describe "#{sym}" do
1636
+ %i[ primary primary_preferred secondary secondary_preferred nearest ].each do |sym|
1637
+ describe sym.to_s do
1286
1638
  context 'when given as symbol' do
1287
1639
  let(:options) do
1288
- {read: {mode: sym}}
1640
+ { read: { mode: sym } }
1289
1641
  end
1290
1642
 
1291
- it "is accepted" do
1643
+ it 'is accepted' do
1292
1644
  # the key got converted to a string here
1293
- expect(client.read_preference).to eq({'mode' => sym})
1645
+ expect(client.read_preference).to eq({ 'mode' => sym })
1294
1646
  end
1295
1647
  end
1296
1648
 
1297
1649
  context 'when given as string' do
1298
1650
  let(:options) do
1299
- {read: {mode: sym.to_s}}
1651
+ { read: { mode: sym.to_s } }
1300
1652
  end
1301
1653
 
1302
1654
  # string keys are not documented as being allowed
1303
1655
  # but the code accepts them
1304
- it "is accepted" do
1656
+ it 'is accepted' do
1305
1657
  # the key got converted to a string here
1306
1658
  # the value remains a string
1307
- expect(client.read_preference).to eq({'mode' => sym.to_s})
1659
+ expect(client.read_preference).to eq({ 'mode' => sym.to_s })
1308
1660
  end
1309
1661
  end
1310
1662
  end
1311
1663
  end
1312
1664
 
1313
1665
  context 'when not linting' do
1314
- skip_if_linting
1666
+ require_no_linting
1315
1667
 
1316
1668
  it 'rejects bogus read preference as symbol' do
1317
1669
  expect do
1318
- client = new_local_client_nmio(['127.0.0.1:27017'],
1319
- :read => {:mode => :bogus})
1320
- end.to raise_error(Mongo::Error::InvalidReadOption, 'Invalid read option: {"mode"=>:bogus}: mode bogus is not one of recognized modes')
1670
+ new_local_client_nmio(SINGLE_CLIENT, read: { mode: :bogus })
1671
+ end.to raise_error(
1672
+ Mongo::Error::InvalidReadOption,
1673
+ 'Invalid read preference value: {"mode"=>:bogus}: ' \
1674
+ 'mode bogus is not one of recognized modes'
1675
+ )
1321
1676
  end
1322
1677
 
1323
1678
  it 'rejects bogus read preference as string' do
1324
1679
  expect do
1325
- client = new_local_client_nmio(['127.0.0.1:27017'],
1326
- :read => {:mode => 'bogus'})
1327
- end.to raise_error(Mongo::Error::InvalidReadOption, 'Invalid read option: {"mode"=>"bogus"}: mode bogus is not one of recognized modes')
1680
+ new_local_client_nmio(SINGLE_CLIENT, read: { mode: 'bogus' })
1681
+ end.to raise_error(
1682
+ Mongo::Error::InvalidReadOption,
1683
+ 'Invalid read preference value: {"mode"=>"bogus"}: mode bogus is not one of recognized modes'
1684
+ )
1328
1685
  end
1329
1686
 
1330
1687
  it 'rejects read option specified as a string' do
1331
1688
  expect do
1332
- client = new_local_client_nmio(['127.0.0.1:27017'],
1333
- :read => 'primary')
1334
- end.to raise_error(Mongo::Error::InvalidReadOption, 'Invalid read option: primary: must be a hash')
1689
+ new_local_client_nmio(SINGLE_CLIENT, read: 'primary')
1690
+ end.to raise_error(
1691
+ Mongo::Error::InvalidReadOption,
1692
+ 'Invalid read preference value: "primary": ' \
1693
+ 'the read preference must be specified as a hash: { mode: "primary" }'
1694
+ )
1335
1695
  end
1336
1696
 
1337
1697
  it 'rejects read option specified as a symbol' do
1338
1698
  expect do
1339
- client = new_local_client_nmio(['127.0.0.1:27017'],
1340
- :read => :primary)
1341
- end.to raise_error(Mongo::Error::InvalidReadOption, 'Invalid read option: primary: must be a hash')
1699
+ new_local_client_nmio(SINGLE_CLIENT, read: :primary)
1700
+ end.to raise_error(
1701
+ Mongo::Error::InvalidReadOption,
1702
+ 'Invalid read preference value: :primary: ' \
1703
+ 'the read preference must be specified as a hash: { mode: :primary }'
1704
+ )
1342
1705
  end
1343
1706
  end
1344
1707
  end
1345
1708
 
1346
- context 'when an invalid option is provided' do
1709
+ context 'when setting read concern options' do
1710
+ min_server_fcv '3.2'
1711
+
1712
+ context 'when read concern is valid' do
1713
+ let(:options) do
1714
+ { read_concern: { level: :local } }
1715
+ end
1716
+
1717
+ it 'does not warn' do
1718
+ expect(Mongo::Logger.logger).not_to receive(:warn)
1719
+ new_local_client_nmio(SpecConfig.instance.addresses, options)
1720
+ end
1721
+ end
1722
+
1723
+ context 'when read concern has an invalid key' do
1724
+ require_no_linting
1347
1725
 
1726
+ let(:options) do
1727
+ { read_concern: { hello: :local } }
1728
+ end
1729
+
1730
+ it 'logs a warning' do
1731
+ expect(Mongo::Logger.logger).to receive(:warn).with(/Read concern has invalid keys: hello/)
1732
+ new_local_client_nmio(SpecConfig.instance.addresses, options)
1733
+ end
1734
+ end
1735
+
1736
+ context 'when read concern has a non-user-settable key' do
1737
+ let(:options) do
1738
+ { read_concern: { after_cluster_time: 100 } }
1739
+ end
1740
+
1741
+ it 'raises an exception' do
1742
+ expect do
1743
+ new_local_client_nmio(SpecConfig.instance.addresses, options)
1744
+ end.to raise_error(
1745
+ Mongo::Error::InvalidReadConcern,
1746
+ 'The after_cluster_time read_concern option cannot be specified by the user'
1747
+ )
1748
+ end
1749
+ end
1750
+ end
1751
+
1752
+ context 'when an invalid option is provided' do
1348
1753
  let(:options) do
1349
- {ssl: false, invalid: :test}
1754
+ { ssl: false, invalid: :test }
1350
1755
  end
1351
1756
 
1352
1757
  it 'does not set the option' do
@@ -1365,9 +1770,8 @@ describe Mongo::Client do
1365
1770
 
1366
1771
  =begin WriteConcern object support
1367
1772
  context 'when write concern is provided via a WriteConcern object' do
1368
-
1369
1773
  let(:options) do
1370
- {write_concern: wc}
1774
+ { write_concern: wc }
1371
1775
  end
1372
1776
 
1373
1777
  let(:wc) { Mongo::WriteConcern.get(w: 2) }
@@ -1385,52 +1789,52 @@ describe Mongo::Client do
1385
1789
 
1386
1790
  context ':wrapping_libraries option' do
1387
1791
  let(:options) do
1388
- {wrapping_libraries: wrapping_libraries}
1792
+ { wrapping_libraries: wrapping_libraries }
1389
1793
  end
1390
1794
 
1391
1795
  context 'valid input' do
1392
1796
  context 'symbol keys' do
1393
1797
  let(:wrapping_libraries) do
1394
- [name: 'Mongoid', version: '7.1.2'].freeze
1798
+ [ { name: 'Mongoid', version: '7.1.2' } ].freeze
1395
1799
  end
1396
1800
 
1397
1801
  it 'works' do
1398
- client.options[:wrapping_libraries].should == ['name' => 'Mongoid', 'version' => '7.1.2']
1802
+ expect(client.options[:wrapping_libraries]).to be == [ { 'name' => 'Mongoid', 'version' => '7.1.2' } ]
1399
1803
  end
1400
1804
  end
1401
1805
 
1402
1806
  context 'string keys' do
1403
1807
  let(:wrapping_libraries) do
1404
- ['name' => 'Mongoid', 'version' => '7.1.2'].freeze
1808
+ [ { 'name' => 'Mongoid', 'version' => '7.1.2' } ].freeze
1405
1809
  end
1406
1810
 
1407
1811
  it 'works' do
1408
- client.options[:wrapping_libraries].should == ['name' => 'Mongoid', 'version' => '7.1.2']
1812
+ expect(client.options[:wrapping_libraries]).to be == [ { 'name' => 'Mongoid', 'version' => '7.1.2' } ]
1409
1813
  end
1410
1814
  end
1411
1815
 
1412
1816
  context 'Redacted keys' do
1413
1817
  let(:wrapping_libraries) do
1414
- [Mongo::Options::Redacted.new(name: 'Mongoid', version: '7.1.2')].freeze
1818
+ [ Mongo::Options::Redacted.new(name: 'Mongoid', version: '7.1.2') ].freeze
1415
1819
  end
1416
1820
 
1417
1821
  it 'works' do
1418
- client.options[:wrapping_libraries].should == ['name' => 'Mongoid', 'version' => '7.1.2']
1822
+ expect(client.options[:wrapping_libraries]).to be == [ { 'name' => 'Mongoid', 'version' => '7.1.2' } ]
1419
1823
  end
1420
1824
  end
1421
1825
 
1422
1826
  context 'two libraries' do
1423
1827
  let(:wrapping_libraries) do
1424
1828
  [
1425
- {name: 'Mongoid', version: '7.1.2'},
1426
- {name: 'Rails', version: '4.0', platform: 'Foobar'},
1829
+ { name: 'Mongoid', version: '7.1.2' },
1830
+ { name: 'Rails', version: '4.0', platform: 'Foobar' },
1427
1831
  ].freeze
1428
1832
  end
1429
1833
 
1430
1834
  it 'works' do
1431
- client.options[:wrapping_libraries].should == [
1432
- {'name' => 'Mongoid', 'version' => '7.1.2'},
1433
- {'name' => 'Rails', 'version' => '4.0', 'platform' => 'Foobar'},
1835
+ expect(client.options[:wrapping_libraries]).to be == [
1836
+ { 'name' => 'Mongoid', 'version' => '7.1.2' },
1837
+ { 'name' => 'Rails', 'version' => '4.0', 'platform' => 'Foobar' },
1434
1838
  ]
1435
1839
  end
1436
1840
  end
@@ -1441,7 +1845,7 @@ describe Mongo::Client do
1441
1845
  end
1442
1846
 
1443
1847
  it 'works' do
1444
- client.options[:wrapping_libraries].should == []
1848
+ expect(client.options[:wrapping_libraries]).to be == []
1445
1849
  end
1446
1850
  end
1447
1851
 
@@ -1451,7 +1855,7 @@ describe Mongo::Client do
1451
1855
  end
1452
1856
 
1453
1857
  it 'works' do
1454
- client.options[:wrapping_libraries].should be nil
1858
+ expect(client.options[:wrapping_libraries]).to be_nil
1455
1859
  end
1456
1860
  end
1457
1861
  end
@@ -1459,39 +1863,133 @@ describe Mongo::Client do
1459
1863
  context 'valid input' do
1460
1864
  context 'hash given instead of an array' do
1461
1865
  let(:wrapping_libraries) do
1462
- {name: 'Mongoid', version: '7.1.2'}.freeze
1866
+ { name: 'Mongoid', version: '7.1.2' }.freeze
1463
1867
  end
1464
1868
 
1465
1869
  it 'is rejected' do
1466
- lambda do
1467
- client
1468
- end.should raise_error(ArgumentError, /:wrapping_libraries must be an array of hashes/)
1870
+ expect { client }
1871
+ .to raise_error(ArgumentError, /:wrapping_libraries must be an array of hashes/)
1469
1872
  end
1470
1873
  end
1471
1874
 
1472
1875
  context 'invalid keys' do
1473
1876
  let(:wrapping_libraries) do
1474
- [name: 'Mongoid', invalid: '7.1.2'].freeze
1877
+ [ { name: 'Mongoid', invalid: '7.1.2' } ].freeze
1475
1878
  end
1476
1879
 
1477
1880
  it 'is rejected' do
1478
- lambda do
1479
- client
1480
- end.should raise_error(ArgumentError, /:wrapping_libraries element has invalid keys/)
1881
+ expect { client }
1882
+ .to raise_error(ArgumentError, /:wrapping_libraries element has invalid keys/)
1481
1883
  end
1482
1884
  end
1483
1885
 
1484
1886
  context 'value includes |' do
1485
1887
  let(:wrapping_libraries) do
1486
- [name: 'Mongoid|on|Rails', version: '7.1.2'].freeze
1888
+ [ { name: 'Mongoid|on|Rails', version: '7.1.2' } ].freeze
1487
1889
  end
1488
1890
 
1489
1891
  it 'is rejected' do
1490
- lambda do
1491
- client
1492
- end.should raise_error(ArgumentError, /:wrapping_libraries element value cannot include '|'/)
1892
+ expect { client }
1893
+ .to raise_error(ArgumentError, /:wrapping_libraries element value cannot include '|'/)
1894
+ end
1895
+ end
1896
+ end
1897
+ end
1898
+
1899
+ context ':auth_mech_properties option' do
1900
+ context 'is nil' do
1901
+ let(:options) { { auth_mech_properties: nil } }
1902
+
1903
+ it 'creates the client without the option' do
1904
+ expect(client.options).not_to have_key(:auth_mech_properties)
1905
+ end
1906
+ end
1907
+ end
1908
+
1909
+ context ':server_api parameter' do
1910
+ context 'is a hash with symbol keys' do
1911
+ context 'using known keys' do
1912
+ let(:options) do
1913
+ {
1914
+ server_api: {
1915
+ version: '1',
1916
+ strict: true,
1917
+ deprecation_errors: false,
1918
+ }
1919
+ }
1920
+ end
1921
+
1922
+ it 'is accepted' do
1923
+ expect(client.options[:server_api]).to be == {
1924
+ 'version' => '1',
1925
+ 'strict' => true,
1926
+ 'deprecation_errors' => false,
1927
+ }
1928
+ end
1929
+ end
1930
+
1931
+ context 'using an unknown version' do
1932
+ let(:options) do
1933
+ { server_api: { version: '42' } }
1934
+ end
1935
+
1936
+ it 'is rejected' do
1937
+ expect { client }
1938
+ .to raise_error(ArgumentError, 'Unknown server API version: 42')
1939
+ end
1940
+ end
1941
+
1942
+ context 'using an unknown option' do
1943
+ let(:options) do
1944
+ { server_api: { vversion: '1' } }
1945
+ end
1946
+
1947
+ it 'is rejected' do
1948
+ expect { client }
1949
+ .to raise_error(ArgumentError, 'Unknown keys under :server_api: "vversion"')
1950
+ end
1951
+ end
1952
+
1953
+ context 'using a value which is not a hash' do
1954
+ let(:options) do
1955
+ { server_api: 42 }
1956
+ end
1957
+
1958
+ it 'is rejected' do
1959
+ expect { client }
1960
+ .to raise_error(ArgumentError, ':server_api value must be a hash: 42')
1961
+ end
1962
+ end
1963
+ end
1964
+
1965
+ context 'when connected to a pre-OP_MSG server' do
1966
+ max_server_version '3.4'
1967
+
1968
+ let(:options) do
1969
+ { server_api: { version: 1 } }
1970
+ end
1971
+
1972
+ let(:client) do
1973
+ new_local_client(
1974
+ SpecConfig.instance.addresses,
1975
+ SpecConfig.instance.all_test_options.merge(options)
1976
+ )
1977
+ end
1978
+
1979
+ it 'constructs the client' do
1980
+ expect(client).to be_a(described_class)
1981
+ end
1982
+
1983
+ it 'does not discover servers' do
1984
+ client.cluster.servers_list.each do |s|
1985
+ expect(s.status).to eq('UNKNOWN')
1493
1986
  end
1494
1987
  end
1988
+
1989
+ it 'fails operations' do
1990
+ expect { client.command(ping: 1) }
1991
+ .to raise_error(Mongo::Error::NoServerAvailable)
1992
+ end
1495
1993
  end
1496
1994
  end
1497
1995
  end
@@ -1500,9 +1998,9 @@ describe Mongo::Client do
1500
1998
  context 'when the block doesn\'t raise an error' do
1501
1999
  let(:block_client) do
1502
2000
  c = nil
1503
- Mongo::Client.new(
2001
+ described_class.new(
1504
2002
  SpecConfig.instance.addresses,
1505
- SpecConfig.instance.test_options.merge(database: SpecConfig.instance.test_db),
2003
+ SpecConfig.instance.test_options.merge(database: SpecConfig.instance.test_db)
1506
2004
  ) do |client|
1507
2005
  c = client
1508
2006
  end
@@ -1510,55 +2008,112 @@ describe Mongo::Client do
1510
2008
  end
1511
2009
 
1512
2010
  it 'is closed after block' do
1513
- expect(block_client.cluster.connected?).to eq(false)
2011
+ expect(block_client.cluster.connected?).to be false
2012
+ end
2013
+
2014
+ context 'with auto encryption options' do
2015
+ require_libmongocrypt
2016
+ min_server_fcv '4.2'
2017
+ require_enterprise
2018
+ clean_slate
2019
+
2020
+ include_context 'define shared FLE helpers'
2021
+ include_context 'with local kms_providers'
2022
+
2023
+ let(:auto_encryption_options) do
2024
+ {
2025
+ key_vault_client: key_vault_client,
2026
+ key_vault_namespace: key_vault_namespace,
2027
+ kms_providers: kms_providers,
2028
+ schema_map: schema_map,
2029
+ extra_options: extra_options,
2030
+ }
2031
+ end
2032
+
2033
+ let(:key_vault_client) { new_local_client_nmio(SpecConfig.instance.addresses) }
2034
+
2035
+ let(:block_client) do
2036
+ c = nil
2037
+ described_class.new(
2038
+ SpecConfig.instance.addresses,
2039
+ SpecConfig.instance.test_options.merge(
2040
+ auto_encryption_options: auto_encryption_options,
2041
+ database: SpecConfig.instance.test_db
2042
+ )
2043
+ ) do |client|
2044
+ c = client
2045
+ end
2046
+ c
2047
+ end
2048
+
2049
+ it 'closes all clients after block' do
2050
+ expect(block_client.cluster.connected?).to be false
2051
+ [
2052
+ block_client.encrypter.mongocryptd_client,
2053
+ block_client.encrypter.key_vault_client,
2054
+ block_client.encrypter.metadata_client
2055
+ ].each do |crypt_client|
2056
+ expect(crypt_client.cluster.connected?).to be false
2057
+ end
2058
+ end
1514
2059
  end
1515
2060
  end
1516
2061
 
1517
2062
  context 'when the block raises an error' do
1518
- it 'it is closed after the block' do
2063
+ it 'is closed after the block' do
1519
2064
  block_client_raise = nil
1520
2065
  expect do
1521
- Mongo::Client.new(
2066
+ described_class.new(
1522
2067
  SpecConfig.instance.addresses,
1523
- SpecConfig.instance.test_options.merge(database: SpecConfig.instance.test_db),
2068
+ SpecConfig.instance.test_options.merge(database: SpecConfig.instance.test_db)
1524
2069
  ) do |client|
1525
2070
  block_client_raise = client
1526
- raise "This is an error!"
2071
+ raise 'This is an error!'
1527
2072
  end
1528
- end.to raise_error(StandardError, "This is an error!")
1529
- expect(block_client_raise.cluster.connected?).to eq(false)
2073
+ end.to raise_error(StandardError, 'This is an error!')
2074
+ expect(block_client_raise.cluster.connected?).to be false
1530
2075
  end
1531
2076
  end
1532
2077
 
1533
2078
  context 'when the hosts given include the protocol' do
1534
2079
  it 'raises an error on mongodb://' do
1535
2080
  expect do
1536
- Mongo::Client.new(['mongodb://127.0.0.1:27017/test'])
1537
- end.to raise_error(ArgumentError, "Host 'mongodb://127.0.0.1:27017/test' should not contain protocol. Did you mean to not use an array?")
2081
+ described_class.new([ 'mongodb://127.0.0.1:27017/test' ])
2082
+ end.to raise_error(ArgumentError,
2083
+ "Host 'mongodb://127.0.0.1:27017/test' should not contain protocol. " \
2084
+ 'Did you mean to not use an array?')
1538
2085
  end
1539
2086
 
1540
2087
  it 'raises an error on mongodb+srv://' do
1541
2088
  expect do
1542
- Mongo::Client.new(['mongodb+srv://127.0.0.1:27017/test'])
1543
- end.to raise_error(ArgumentError, "Host 'mongodb+srv://127.0.0.1:27017/test' should not contain protocol. Did you mean to not use an array?")
2089
+ described_class.new([ 'mongodb+srv://127.0.0.1:27017/test' ])
2090
+ end.to raise_error(ArgumentError,
2091
+ "Host 'mongodb+srv://127.0.0.1:27017/test' should not contain protocol. " \
2092
+ 'Did you mean to not use an array?')
1544
2093
  end
1545
2094
 
1546
2095
  it 'raises an error on multiple items' do
1547
2096
  expect do
1548
- Mongo::Client.new(['127.0.0.1:27017', 'mongodb+srv://127.0.0.1:27017/test'])
1549
- end.to raise_error(ArgumentError, "Host 'mongodb+srv://127.0.0.1:27017/test' should not contain protocol. Did you mean to not use an array?")
2097
+ described_class.new([ '127.0.0.1:27017', 'mongodb+srv://127.0.0.1:27017/test' ])
2098
+ end.to raise_error(ArgumentError,
2099
+ "Host 'mongodb+srv://127.0.0.1:27017/test' should not contain protocol. " \
2100
+ 'Did you mean to not use an array?')
1550
2101
  end
1551
2102
 
1552
2103
  it 'raises an error only at beginning of string' do
1553
2104
  expect do
1554
- Mongo::Client.new(['somethingmongodb://127.0.0.1:27017/test', 'mongodb+srv://127.0.0.1:27017/test'])
1555
- end.to raise_error(ArgumentError, "Host 'mongodb+srv://127.0.0.1:27017/test' should not contain protocol. Did you mean to not use an array?")
2105
+ described_class
2106
+ .new([ 'somethingmongodb://127.0.0.1:27017/test', 'mongodb+srv://127.0.0.1:27017/test' ])
2107
+ end.to raise_error(ArgumentError,
2108
+ "Host 'mongodb+srv://127.0.0.1:27017/test' should not contain protocol. " \
2109
+ 'Did you mean to not use an array?')
1556
2110
  end
1557
2111
 
1558
2112
  it 'raises an error with different case' do
1559
- expect do
1560
- Mongo::Client.new(['MongOdB://127.0.0.1:27017/test'])
1561
- end.to raise_error(ArgumentError, "Host 'MongOdB://127.0.0.1:27017/test' should not contain protocol. Did you mean to not use an array?")
2113
+ expect { described_class.new([ 'MongOdB://127.0.0.1:27017/test' ]) }
2114
+ .to raise_error(ArgumentError,
2115
+ "Host 'MongOdB://127.0.0.1:27017/test' should not contain protocol. " \
2116
+ 'Did you mean to not use an array?')
1562
2117
  end
1563
2118
  end
1564
2119
  end
@@ -1648,13 +2203,11 @@ describe Mongo::Client do
1648
2203
  end
1649
2204
 
1650
2205
  describe '#use' do
1651
-
1652
2206
  let(:client) do
1653
- new_local_client_nmio(['127.0.0.1:27017'], :database => SpecConfig.instance.test_db)
2207
+ new_local_client_nmio(SINGLE_CLIENT, database: SpecConfig.instance.test_db)
1654
2208
  end
1655
2209
 
1656
2210
  shared_examples_for 'a database switching object' do
1657
-
1658
2211
  it 'returns the new client' do
1659
2212
  expect(client.send(:database).name).to eq('ruby-driver')
1660
2213
  end
@@ -1665,7 +2218,6 @@ describe Mongo::Client do
1665
2218
  end
1666
2219
 
1667
2220
  context 'when provided a string' do
1668
-
1669
2221
  let(:database) do
1670
2222
  client.use('testdb')
1671
2223
  end
@@ -1674,7 +2226,6 @@ describe Mongo::Client do
1674
2226
  end
1675
2227
 
1676
2228
  context 'when provided a symbol' do
1677
-
1678
2229
  let(:database) do
1679
2230
  client.use(:testdb)
1680
2231
  end
@@ -1683,45 +2234,29 @@ describe Mongo::Client do
1683
2234
  end
1684
2235
 
1685
2236
  context 'when providing nil' do
1686
-
1687
2237
  it 'raises an exception' do
1688
- expect {
1689
- client.use(nil)
1690
- }.to raise_error(Mongo::Error::InvalidDatabaseName)
2238
+ expect { client.use(nil) }
2239
+ .to raise_error(Mongo::Error::InvalidDatabaseName)
1691
2240
  end
1692
2241
  end
1693
2242
  end
1694
2243
 
1695
2244
  describe '#with' do
1696
-
1697
2245
  let(:client) do
1698
- new_local_client_nmio(['127.0.0.1:27017'], :database => SpecConfig.instance.test_db)
2246
+ new_local_client_nmio(SINGLE_CLIENT, database: SpecConfig.instance.test_db)
1699
2247
  end
1700
2248
 
1701
2249
  context 'when providing nil' do
1702
-
1703
2250
  it 'returns the cloned client' do
1704
2251
  expect(client.with(nil)).to eq(client)
1705
2252
  end
1706
2253
  end
1707
2254
 
1708
2255
  context 'when the app_name is changed' do
1709
-
1710
- let(:client) do
1711
- authorized_client
1712
- end
1713
-
1714
- let!(:original_options) do
1715
- client.options
1716
- end
1717
-
1718
- let(:new_options) do
1719
- { app_name: 'client_test' }
1720
- end
1721
-
1722
- let!(:new_client) do
1723
- authorized_client.with(new_options)
1724
- end
2256
+ let(:client) { authorized_client }
2257
+ let(:original_options) { client.options }
2258
+ let(:new_options) { { app_name: 'client_test' } }
2259
+ let(:new_client) { authorized_client.with(new_options) }
1725
2260
 
1726
2261
  it 'returns a new client' do
1727
2262
  expect(new_client).not_to equal(client)
@@ -1747,27 +2282,25 @@ describe Mongo::Client do
1747
2282
  new_local_client(SpecConfig.instance.addresses, options)
1748
2283
  end
1749
2284
 
1750
- before do
1751
- client.options[:direct_connection].should be nil
1752
- end
1753
-
1754
2285
  let(:new_client) do
1755
2286
  client.with(new_options)
1756
2287
  end
1757
2288
 
1758
- context 'direct_connection set to false' do
2289
+ before do
2290
+ expect(client.options[:direct_connection]).to be_nil
2291
+ end
1759
2292
 
2293
+ context 'direct_connection set to false' do
1760
2294
  let(:new_options) do
1761
2295
  { direct_connection: false }
1762
2296
  end
1763
2297
 
1764
2298
  it 'is accepted' do
1765
- new_client.options[:direct_connection].should be false
2299
+ expect(new_client.options[:direct_connection]).to be false
1766
2300
  end
1767
2301
  end
1768
2302
 
1769
2303
  context 'direct_connection set to true' do
1770
-
1771
2304
  let(:new_options) do
1772
2305
  { direct_connection: true }
1773
2306
  end
@@ -1775,10 +2308,9 @@ describe Mongo::Client do
1775
2308
  context 'in single topology' do
1776
2309
  require_topology :single
1777
2310
 
1778
-
1779
2311
  it 'is accepted' do
1780
- new_client.options[:direct_connection].should be true
1781
- new_client.cluster.topology.should be_a(Mongo::Cluster::Topology::Single)
2312
+ expect(new_client.options[:direct_connection]).to be true
2313
+ expect(new_client.cluster.topology).to be_a(Mongo::Cluster::Topology::Single)
1782
2314
  end
1783
2315
  end
1784
2316
 
@@ -1786,21 +2318,19 @@ describe Mongo::Client do
1786
2318
  require_topology :replica_set, :sharded
1787
2319
 
1788
2320
  it 'is rejected' do
1789
- lambda do
1790
- new_client
1791
- end.should raise_error(ArgumentError, /direct_connection=true cannot be used with topologies other than Single/)
2321
+ expect { new_client }
2322
+ .to raise_error(ArgumentError, /direct_connection=true cannot be used with topologies other than Single/)
1792
2323
  end
1793
2324
 
1794
2325
  context 'when a new cluster is created' do
1795
-
1796
2326
  let(:new_options) do
1797
2327
  { direct_connection: true, app_name: 'new-client' }
1798
2328
  end
1799
2329
 
1800
2330
  it 'is rejected' do
1801
- lambda do
1802
- new_client
1803
- end.should raise_error(ArgumentError, /direct_connection=true cannot be used with topologies other than Single/)
2331
+ expect { new_client }
2332
+ .to raise_error(ArgumentError,
2333
+ /direct_connection=true cannot be used with topologies other than Single/)
1804
2334
  end
1805
2335
  end
1806
2336
  end
@@ -1808,28 +2338,37 @@ describe Mongo::Client do
1808
2338
  end
1809
2339
 
1810
2340
  context 'when the write concern is not changed' do
1811
-
1812
2341
  let(:client) do
1813
2342
  new_local_client_nmio(
1814
- ['127.0.0.1:27017'],
1815
- :read => { :mode => :secondary }, :write => { :w => 1 }, :database => SpecConfig.instance.test_db
2343
+ SINGLE_CLIENT,
2344
+ read: { mode: :secondary },
2345
+ write: { w: 1 },
2346
+ database: SpecConfig.instance.test_db
1816
2347
  )
1817
2348
  end
1818
2349
 
1819
- let!(:new_client) do
1820
- client.with(:read => { :mode => :primary })
1821
- end
2350
+ let(:new_client) { client.with(read: { mode: :primary }) }
1822
2351
 
1823
2352
  let(:new_options) do
1824
- Mongo::Options::Redacted.new(:read => { :mode => :primary },
1825
- :write => { :w => 1 }, monitoring_io: false,
1826
- :database => SpecConfig.instance.test_db, retry_writes: true, retry_reads: true)
2353
+ Mongo::Options::Redacted.new(
2354
+ read: { mode: :primary },
2355
+ write: { w: 1 },
2356
+ monitoring_io: false,
2357
+ database: SpecConfig.instance.test_db,
2358
+ retry_writes: true,
2359
+ retry_reads: true
2360
+ )
1827
2361
  end
1828
2362
 
1829
2363
  let(:original_options) do
1830
- Mongo::Options::Redacted.new(:read => { :mode => :secondary },
1831
- :write => { :w => 1 }, monitoring_io: false,
1832
- :database => SpecConfig.instance.test_db, retry_writes: true, retry_reads: true)
2364
+ Mongo::Options::Redacted.new(
2365
+ read: { mode: :secondary },
2366
+ write: { w: 1 },
2367
+ monitoring_io: false,
2368
+ database: SpecConfig.instance.test_db,
2369
+ retry_writes: true,
2370
+ retry_reads: true
2371
+ )
1833
2372
  end
1834
2373
 
1835
2374
  it 'returns a new client' do
@@ -1850,21 +2389,19 @@ describe Mongo::Client do
1850
2389
  end
1851
2390
 
1852
2391
  context 'when the write concern is changed' do
1853
-
1854
2392
  let(:client) do
1855
- new_local_client(['127.0.0.1:27017'],
1856
- {monitoring_io: false}.merge(client_options))
2393
+ new_local_client(
2394
+ SINGLE_CLIENT,
2395
+ { monitoring_io: false }.merge(client_options)
2396
+ )
1857
2397
  end
1858
2398
 
1859
2399
  let(:client_options) do
1860
- { :write => { :w => 1 } }
2400
+ { write: { w: 1 } }
1861
2401
  end
1862
2402
 
1863
2403
  context 'when the write concern has not been accessed' do
1864
-
1865
- let!(:new_client) do
1866
- client.with(:write => { :w => 0 })
1867
- end
2404
+ let(:new_client) { client.with(write: { w: 0 }) }
1868
2405
 
1869
2406
  let(:get_last_error) do
1870
2407
  new_client.write_concern.get_last_error
@@ -1876,10 +2413,9 @@ describe Mongo::Client do
1876
2413
  end
1877
2414
 
1878
2415
  context 'when the write concern has been accessed' do
1879
-
1880
- let!(:new_client) do
2416
+ let(:new_client) do
1881
2417
  client.write_concern
1882
- client.with(:write => { :w => 0 })
2418
+ client.with(write: { w: 0 })
1883
2419
  end
1884
2420
 
1885
2421
  let(:get_last_error) do
@@ -1892,9 +2428,8 @@ describe Mongo::Client do
1892
2428
  end
1893
2429
 
1894
2430
  context 'when write concern is given as :write' do
1895
-
1896
2431
  let(:client_options) do
1897
- { :write => { :w => 1 } }
2432
+ { write: { w: 1 } }
1898
2433
  end
1899
2434
 
1900
2435
  it 'sets :write option' do
@@ -1902,7 +2437,7 @@ describe Mongo::Client do
1902
2437
  end
1903
2438
 
1904
2439
  it 'does not set :write_concern option' do
1905
- expect(client.options[:write_concern]).to be nil
2440
+ expect(client.options[:write_concern]).to be_nil
1906
2441
  end
1907
2442
 
1908
2443
  it 'returns correct write concern' do
@@ -1912,9 +2447,8 @@ describe Mongo::Client do
1912
2447
  end
1913
2448
 
1914
2449
  context 'when write concern is given as :write_concern' do
1915
-
1916
2450
  let(:client_options) do
1917
- { :write_concern => { :w => 1 } }
2451
+ { write_concern: { w: 1 } }
1918
2452
  end
1919
2453
 
1920
2454
  it 'sets :write_concern option' do
@@ -1922,20 +2456,19 @@ describe Mongo::Client do
1922
2456
  end
1923
2457
 
1924
2458
  it 'does not set :write option' do
1925
- expect(client.options[:write]).to be nil
2459
+ expect(client.options[:write]).to be_nil
1926
2460
  end
1927
2461
 
1928
2462
  it 'returns correct write concern' do
1929
- expect(client.write_concern).to be_a(Mongo::WriteConcern::Acknowledged)
1930
- expect(client.write_concern.options).to eq(w: 1)
2463
+ expect(client.write_concern).to be_a(Mongo::WriteConcern::Acknowledged)
2464
+ expect(client.write_concern.options).to eq(w: 1)
1931
2465
  end
1932
2466
  end
1933
2467
 
1934
2468
  context 'when write concern is given as both :write and :write_concern' do
1935
2469
  context 'with identical values' do
1936
-
1937
2470
  let(:client_options) do
1938
- { write: {w: 1}, write_concern: { w: 1 } }
2471
+ { write: { w: 1 }, write_concern: { w: 1 } }
1939
2472
  end
1940
2473
 
1941
2474
  it 'sets :write_concern option' do
@@ -1953,9 +2486,8 @@ describe Mongo::Client do
1953
2486
  end
1954
2487
 
1955
2488
  context 'with different values' do
1956
-
1957
2489
  let(:client_options) do
1958
- { write: {w: 1}, write_concern: { w: 2 } }
2490
+ { write: { w: 1 }, write_concern: { w: 2 } }
1959
2491
  end
1960
2492
 
1961
2493
  it 'raises an exception' do
@@ -1967,43 +2499,35 @@ describe Mongo::Client do
1967
2499
  end
1968
2500
 
1969
2501
  context 'when #with uses a different write concern option name' do
1970
-
1971
2502
  context 'from :write_concern to :write' do
1972
-
1973
2503
  let(:client_options) do
1974
- { :write_concern => { :w => 1 } }
2504
+ { write_concern: { w: 1 } }
1975
2505
  end
1976
2506
 
1977
- let!(:new_client) do
1978
- client.with(:write => { :w => 2 })
1979
- end
2507
+ let(:new_client) { client.with(write: { w: 2 }) }
1980
2508
 
1981
2509
  it 'uses the new option' do
1982
2510
  expect(new_client.options[:write]).to eq(Mongo::Options::Redacted.new(w: 2))
1983
- expect(new_client.options[:write_concern]).to be nil
2511
+ expect(new_client.options[:write_concern]).to be_nil
1984
2512
  end
1985
2513
  end
1986
2514
 
1987
2515
  context 'from :write to :write_concern' do
1988
-
1989
2516
  let(:client_options) do
1990
- { :write => { :w => 1 } }
2517
+ { write: { w: 1 } }
1991
2518
  end
1992
2519
 
1993
- let!(:new_client) do
1994
- client.with(:write_concern => { :w => 2 })
1995
- end
2520
+ let(:new_client) { client.with(write_concern: { w: 2 }) }
1996
2521
 
1997
2522
  it 'uses the new option' do
1998
2523
  expect(new_client.options[:write_concern]).to eq(Mongo::Options::Redacted.new(w: 2))
1999
- expect(new_client.options[:write]).to be nil
2524
+ expect(new_client.options[:write]).to be_nil
2000
2525
  end
2001
2526
  end
2002
2527
  end
2003
2528
  end
2004
2529
 
2005
2530
  context 'when an invalid option is provided' do
2006
-
2007
2531
  let(:new_client) do
2008
2532
  client.with(invalid: :option, ssl: false)
2009
2533
  end
@@ -2024,24 +2548,18 @@ describe Mongo::Client do
2024
2548
 
2025
2549
  context 'when client is created with ipv6 address' do
2026
2550
  let(:client) do
2027
- new_local_client_nmio(['[::1]:27017'], :database => SpecConfig.instance.test_db)
2551
+ new_local_client_nmio([ '[::1]:27017' ], database: SpecConfig.instance.test_db)
2028
2552
  end
2029
2553
 
2030
2554
  context 'when providing nil' do
2031
-
2032
2555
  it 'returns the cloned client' do
2033
2556
  expect(client.with(nil)).to eq(client)
2034
2557
  end
2035
2558
  end
2036
2559
 
2037
2560
  context 'when changing options' do
2038
- let(:new_options) do
2039
- { app_name: 'client_test' }
2040
- end
2041
-
2042
- let!(:new_client) do
2043
- client.with(new_options)
2044
- end
2561
+ let(:new_options) { { app_name: 'client_test' } }
2562
+ let(:new_client) { client.with(new_options) }
2045
2563
 
2046
2564
  it 'returns a new client' do
2047
2565
  expect(new_client).not_to equal(client)
@@ -2051,11 +2569,14 @@ describe Mongo::Client do
2051
2569
 
2052
2570
  context 'when new client has a new cluster' do
2053
2571
  let(:client) do
2054
- new_local_client(['127.0.0.1:27017'],
2572
+ new_local_client(
2573
+ SINGLE_CLIENT,
2055
2574
  database: SpecConfig.instance.test_db,
2056
2575
  server_selection_timeout: 0.5,
2057
- socket_timeout: 0.1, connect_timeout: 0.1)
2576
+ socket_timeout: 0.1, connect_timeout: 0.1, populator_io: false
2577
+ )
2058
2578
  end
2579
+
2059
2580
  let(:new_client) do
2060
2581
  client.with(app_name: 'client_construction_spec').tap do |new_client|
2061
2582
  expect(new_client.cluster).not_to eql(client.cluster)
@@ -2079,37 +2600,44 @@ describe Mongo::Client do
2079
2600
  # in #with, the consistent behavior is to never transfer sdam_proc to
2080
2601
  # the new client.
2081
2602
  context 'when sdam_proc is given on original client' do
2082
-
2083
2603
  let(:sdam_proc) do
2084
- Proc.new do |client|
2604
+ proc do |client|
2085
2605
  client.subscribe(Mongo::Monitoring::SERVER_HEARTBEAT, subscriber)
2086
2606
  end
2087
2607
  end
2088
2608
 
2089
2609
  let(:client) do
2090
- new_local_client(SpecConfig.instance.addresses,
2610
+ new_local_client(
2611
+ SpecConfig.instance.addresses,
2091
2612
  SpecConfig.instance.test_options.merge(
2092
2613
  sdam_proc: sdam_proc,
2093
2614
  connect_timeout: 3.08, socket_timeout: 3.09,
2094
2615
  server_selection_timeout: 2.92,
2095
2616
  heartbeat_frequency: 100,
2096
- database: SpecConfig.instance.test_db))
2617
+ database: SpecConfig.instance.test_db
2618
+ )
2619
+ )
2097
2620
  end
2098
2621
 
2099
2622
  let(:new_client) do
2100
2623
  client.with(app_name: 'foo').tap do |new_client|
2101
- new_client.cluster.should_not == client.cluster
2624
+ expect(new_client.cluster).not_to be == client.cluster
2102
2625
  end
2103
2626
  end
2104
2627
 
2105
2628
  before do
2106
2629
  client.cluster.next_primary
2107
2630
  events = subscriber.select_started_events(Mongo::Monitoring::Event::ServerHeartbeatStarted)
2108
- events.length.should > 0
2631
+ if ClusterConfig.instance.topology == :load_balanced
2632
+ # No server monitoring in LB topology
2633
+ expect(events.length).to be == 0
2634
+ else
2635
+ expect(events.length).to be > 0
2636
+ end
2109
2637
  end
2110
2638
 
2111
2639
  it 'does not copy sdam_proc option to new client' do
2112
- expect(new_client.options[:sdam_proc]).to be nil
2640
+ expect(new_client.options[:sdam_proc]).to be_nil
2113
2641
  end
2114
2642
 
2115
2643
  it 'does not notify subscribers set up by sdam_proc' do
@@ -2117,7 +2645,12 @@ describe Mongo::Client do
2117
2645
  # Give those some time to be processed.
2118
2646
  sleep 2
2119
2647
 
2120
- expect(subscriber.started_events.length).to be > 0
2648
+ if ClusterConfig.instance.topology == :load_balanced
2649
+ # No server monitoring in LB topology
2650
+ expect(subscriber.started_events.length).to eq 0
2651
+ else
2652
+ expect(subscriber.started_events.length).to be > 0
2653
+ end
2121
2654
  subscriber.started_events.clear
2122
2655
 
2123
2656
  # If this test takes longer than heartbeat interval,
@@ -2126,23 +2659,52 @@ describe Mongo::Client do
2126
2659
  new_client.cluster.next_primary
2127
2660
 
2128
2661
  # Diagnostics
2662
+ # rubocop:disable Style/IfUnlessModifier, Lint/Debugger
2129
2663
  unless subscriber.started_events.empty?
2130
2664
  p subscriber.started_events
2131
2665
  end
2666
+ # rubocop:enable Style/IfUnlessModifier, Lint/Debugger
2132
2667
 
2133
2668
  expect(subscriber.started_events.length).to eq 0
2134
- new_client.cluster.topology.class.should_not be Mongo::Cluster::Topology::Unknown
2669
+ expect(new_client.cluster.topology.class).not_to be Mongo::Cluster::Topology::Unknown
2670
+ end
2671
+ end
2672
+
2673
+ context 'when :server_api is changed' do
2674
+ let(:client) do
2675
+ new_local_client_nmio(SINGLE_CLIENT)
2676
+ end
2677
+
2678
+ let(:new_client) do
2679
+ client.with(server_api: { version: '1' })
2680
+ end
2681
+
2682
+ it 'changes :server_api' do
2683
+ expect(new_client.options[:server_api]).to be == { 'version' => '1' }
2684
+ end
2685
+ end
2686
+
2687
+ context 'when :server_api is cleared' do
2688
+ let(:client) do
2689
+ new_local_client_nmio(SINGLE_CLIENT, server_api: { version: '1' })
2690
+ end
2691
+
2692
+ let(:new_client) do
2693
+ client.with(server_api: nil)
2694
+ end
2695
+
2696
+ it 'clears :server_api' do
2697
+ expect(new_client.options[:server_api]).to be_nil
2135
2698
  end
2136
2699
  end
2137
2700
  end
2138
2701
 
2139
2702
  describe '#dup' do
2140
-
2141
2703
  let(:client) do
2142
2704
  new_local_client_nmio(
2143
- ['127.0.0.1:27017'],
2144
- :read => { :mode => :primary },
2145
- :database => SpecConfig.instance.test_db
2705
+ SINGLE_CLIENT,
2706
+ read: { mode: :primary },
2707
+ database: SpecConfig.instance.test_db
2146
2708
  )
2147
2709
  end
2148
2710
 
@@ -2155,3 +2717,7 @@ describe Mongo::Client do
2155
2717
  it_behaves_like 'duplicated client with reused monitoring'
2156
2718
  end
2157
2719
  end
2720
+ # rubocop:enable RSpec/ExpectInHook, RSpec/MessageSpies, RSpec/ExampleLength
2721
+ # rubocop:enable RSpec/ContextWording, RSpec/RepeatedExampleGroupDescription
2722
+ # rubocop:enable RSpec/ExampleWording, Style/BlockComments, RSpec/AnyInstance
2723
+ # rubocop:enable RSpec/VerifiedDoubles