mongo 2.18.2 → 2.19.0

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