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