mongo 2.11.4 → 2.18.1

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