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