mongo 2.18.2 → 2.19.3

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