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