mongo 2.17.4 → 2.21.0

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