mongo 2.3.1 → 2.16.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1820) hide show
  1. checksums.yaml +5 -5
  2. checksums.yaml.gz.sig +0 -0
  3. data/CONTRIBUTING.md +12 -54
  4. data/LICENSE +1 -1
  5. data/README.md +74 -44
  6. data/Rakefile +110 -22
  7. data/lib/mongo/active_support.rb +20 -0
  8. data/lib/mongo/address/ipv4.rb +41 -8
  9. data/lib/mongo/address/ipv6.rb +64 -12
  10. data/lib/mongo/address/unix.rb +12 -6
  11. data/lib/mongo/address/validator.rb +102 -0
  12. data/lib/mongo/address.rb +163 -59
  13. data/lib/mongo/auth/aws/conversation.rb +128 -0
  14. data/lib/mongo/auth/aws/credentials_retriever.rb +222 -0
  15. data/lib/mongo/auth/aws/request.rb +286 -0
  16. data/lib/mongo/auth/aws.rb +40 -0
  17. data/lib/mongo/auth/base.rb +138 -0
  18. data/lib/mongo/auth/conversation_base.rb +87 -0
  19. data/lib/mongo/auth/cr/conversation.rb +29 -73
  20. data/lib/mongo/auth/cr.rb +17 -35
  21. data/lib/mongo/auth/credential_cache.rb +54 -0
  22. data/lib/mongo/auth/gssapi/conversation.rb +100 -0
  23. data/lib/mongo/auth/gssapi.rb +41 -0
  24. data/lib/mongo/auth/ldap/conversation.rb +14 -53
  25. data/lib/mongo/auth/ldap.rb +14 -33
  26. data/lib/mongo/auth/roles.rb +4 -1
  27. data/lib/mongo/auth/sasl_conversation_base.rb +102 -0
  28. data/lib/mongo/auth/scram/conversation.rb +13 -411
  29. data/lib/mongo/auth/scram.rb +45 -37
  30. data/lib/mongo/auth/scram256/conversation.rb +66 -0
  31. data/lib/mongo/auth/scram256.rb +34 -0
  32. data/lib/mongo/auth/scram_conversation_base.rb +378 -0
  33. data/lib/mongo/auth/stringprep/profiles/sasl.rb +77 -0
  34. data/lib/mongo/auth/stringprep/tables.rb +3236 -0
  35. data/lib/mongo/auth/stringprep/unicode_normalize/normalize.rb +175 -0
  36. data/lib/mongo/auth/stringprep/unicode_normalize/tables.rb +1171 -0
  37. data/lib/mongo/auth/stringprep.rb +118 -0
  38. data/lib/mongo/auth/user/view.rb +62 -24
  39. data/lib/mongo/auth/user.rb +76 -10
  40. data/lib/mongo/auth/x509/conversation.rb +28 -50
  41. data/lib/mongo/auth/x509.rb +29 -31
  42. data/lib/mongo/auth.rb +96 -17
  43. data/lib/mongo/background_thread.rb +173 -0
  44. data/lib/mongo/bson.rb +4 -1
  45. data/lib/mongo/bulk_write/combineable.rb +26 -2
  46. data/lib/mongo/bulk_write/ordered_combiner.rb +4 -1
  47. data/lib/mongo/bulk_write/result.rb +5 -2
  48. data/lib/mongo/bulk_write/result_combiner.rb +21 -8
  49. data/lib/mongo/bulk_write/transformable.rb +36 -12
  50. data/lib/mongo/bulk_write/unordered_combiner.rb +4 -1
  51. data/lib/mongo/bulk_write/validatable.rb +16 -2
  52. data/lib/mongo/bulk_write.rb +146 -51
  53. data/lib/mongo/caching_cursor.rb +77 -0
  54. data/lib/mongo/client.rb +1181 -92
  55. data/lib/mongo/client_encryption.rb +106 -0
  56. data/lib/mongo/cluster/periodic_executor.rb +105 -0
  57. data/lib/mongo/cluster/reapers/cursor_reaper.rb +192 -0
  58. data/lib/mongo/cluster/reapers/socket_reaper.rb +65 -0
  59. data/lib/mongo/cluster/sdam_flow.rb +626 -0
  60. data/lib/mongo/cluster/topology/base.rb +225 -0
  61. data/lib/mongo/cluster/topology/load_balanced.rb +102 -0
  62. data/lib/mongo/cluster/topology/no_replica_set_options.rb +37 -0
  63. data/lib/mongo/cluster/topology/replica_set_no_primary.rb +172 -0
  64. data/lib/mongo/cluster/topology/replica_set_with_primary.rb +30 -0
  65. data/lib/mongo/cluster/topology/sharded.rb +38 -92
  66. data/lib/mongo/cluster/topology/single.rb +46 -86
  67. data/lib/mongo/cluster/topology/unknown.rb +39 -121
  68. data/lib/mongo/cluster/topology.rb +92 -20
  69. data/lib/mongo/cluster.rb +889 -228
  70. data/lib/mongo/cluster_time.rb +142 -0
  71. data/lib/mongo/collection/view/aggregation.rb +52 -14
  72. data/lib/mongo/collection/view/builder/aggregation.rb +52 -7
  73. data/lib/mongo/collection/view/builder/map_reduce.rb +39 -37
  74. data/lib/mongo/collection/view/builder.rb +4 -5
  75. data/lib/mongo/collection/view/change_stream/retryable.rb +43 -0
  76. data/lib/mongo/collection/view/change_stream.rb +372 -0
  77. data/lib/mongo/collection/view/explainable.rb +32 -10
  78. data/lib/mongo/collection/view/immutable.rb +5 -2
  79. data/lib/mongo/collection/view/iterable.rb +145 -24
  80. data/lib/mongo/collection/view/map_reduce.rb +101 -38
  81. data/lib/mongo/collection/view/readable.rb +292 -70
  82. data/lib/mongo/collection/view/writable.rb +327 -65
  83. data/lib/mongo/collection/view.rb +74 -30
  84. data/lib/mongo/collection.rb +387 -63
  85. data/lib/mongo/crypt/auto_decryption_context.rb +43 -0
  86. data/lib/mongo/crypt/auto_encrypter.rb +182 -0
  87. data/lib/mongo/crypt/auto_encryption_context.rb +47 -0
  88. data/lib/mongo/crypt/binary.rb +158 -0
  89. data/lib/mongo/crypt/binding.rb +1232 -0
  90. data/lib/mongo/crypt/context.rb +138 -0
  91. data/lib/mongo/crypt/data_key_context.rb +165 -0
  92. data/lib/mongo/crypt/encryption_io.rb +309 -0
  93. data/lib/mongo/crypt/explicit_decryption_context.rb +43 -0
  94. data/lib/mongo/crypt/explicit_encrypter.rb +120 -0
  95. data/lib/mongo/crypt/explicit_encryption_context.rb +92 -0
  96. data/lib/mongo/crypt/handle.rb +318 -0
  97. data/lib/mongo/crypt/hooks.rb +93 -0
  98. data/lib/mongo/crypt/kms_context.rb +70 -0
  99. data/lib/mongo/crypt/status.rb +134 -0
  100. data/lib/mongo/crypt.rb +36 -0
  101. data/lib/mongo/cursor/kill_spec.rb +38 -0
  102. data/lib/mongo/cursor.rb +290 -63
  103. data/lib/mongo/database/view.rb +107 -26
  104. data/lib/mongo/database.rb +242 -31
  105. data/lib/mongo/dbref.rb +13 -3
  106. data/lib/mongo/distinguishing_semaphore.rb +58 -0
  107. data/lib/mongo/error/auth_error.rb +32 -0
  108. data/lib/mongo/error/bad_load_balancer_target.rb +26 -0
  109. data/lib/mongo/error/bulk_write_error.rb +38 -3
  110. data/lib/mongo/error/change_stream_resumable.rb +40 -0
  111. data/lib/mongo/error/closed_stream.rb +5 -2
  112. data/lib/mongo/error/connection_check_out_timeout.rb +51 -0
  113. data/lib/mongo/error/connection_perished.rb +26 -0
  114. data/lib/mongo/error/credential_check_error.rb +29 -0
  115. data/lib/mongo/error/crypt_error.rb +34 -0
  116. data/lib/mongo/error/extra_file_chunk.rb +4 -1
  117. data/lib/mongo/error/failed_string_prep_validation.rb +41 -0
  118. data/lib/mongo/error/file_not_found.rb +4 -1
  119. data/lib/mongo/error/handshake_error.rb +27 -0
  120. data/lib/mongo/error/insufficient_iteration_count.rb +41 -0
  121. data/lib/mongo/error/internal_driver_error.rb +25 -0
  122. data/lib/mongo/error/invalid_address.rb +27 -0
  123. data/lib/mongo/error/invalid_application_name.rb +41 -0
  124. data/lib/mongo/error/invalid_bulk_operation.rb +4 -1
  125. data/lib/mongo/error/invalid_bulk_operation_type.rb +4 -1
  126. data/lib/mongo/error/invalid_collection_name.rb +4 -1
  127. data/lib/mongo/error/invalid_cursor_operation.rb +30 -0
  128. data/lib/mongo/error/invalid_database_name.rb +4 -1
  129. data/lib/mongo/error/invalid_document.rb +4 -1
  130. data/lib/mongo/error/invalid_file.rb +4 -1
  131. data/lib/mongo/error/invalid_file_revision.rb +4 -1
  132. data/lib/mongo/error/invalid_min_pool_size.rb +38 -0
  133. data/lib/mongo/error/invalid_nonce.rb +5 -2
  134. data/lib/mongo/error/invalid_read_concern.rb +31 -0
  135. data/lib/mongo/error/invalid_read_option.rb +38 -0
  136. data/lib/mongo/error/invalid_replacement_document.rb +4 -1
  137. data/lib/mongo/error/invalid_server_auth_host.rb +25 -0
  138. data/lib/mongo/error/invalid_server_auth_response.rb +26 -0
  139. data/lib/mongo/error/invalid_server_preference.rb +37 -5
  140. data/lib/mongo/error/invalid_session.rb +40 -0
  141. data/lib/mongo/error/invalid_signature.rb +4 -1
  142. data/lib/mongo/error/invalid_transaction_operation.rb +85 -0
  143. data/lib/mongo/error/invalid_txt_record.rb +30 -0
  144. data/lib/mongo/error/invalid_update_document.rb +4 -1
  145. data/lib/mongo/error/invalid_uri.rb +11 -7
  146. data/lib/mongo/error/invalid_write_concern.rb +6 -3
  147. data/lib/mongo/error/kms_error.rb +25 -0
  148. data/lib/mongo/error/lint_error.rb +38 -0
  149. data/lib/mongo/error/max_bson_size.rb +18 -4
  150. data/lib/mongo/error/max_message_size.rb +4 -1
  151. data/lib/mongo/error/mismatched_domain.rb +30 -0
  152. data/lib/mongo/error/missing_file_chunk.rb +4 -1
  153. data/lib/mongo/error/missing_password.rb +32 -0
  154. data/lib/mongo/error/missing_resume_token.rb +42 -0
  155. data/lib/mongo/error/missing_scram_server_signature.rb +30 -0
  156. data/lib/mongo/error/missing_service_id.rb +26 -0
  157. data/lib/mongo/error/mongocryptd_spawn_error.rb +25 -0
  158. data/lib/mongo/error/multi_index_drop.rb +4 -1
  159. data/lib/mongo/error/need_primary_server.rb +4 -1
  160. data/lib/mongo/error/no_server_available.rb +17 -5
  161. data/lib/mongo/error/no_service_connection_available.rb +49 -0
  162. data/lib/mongo/error/no_srv_records.rb +29 -0
  163. data/lib/mongo/error/notable.rb +90 -0
  164. data/lib/mongo/error/operation_failure.rb +266 -13
  165. data/lib/mongo/error/parser.rb +220 -15
  166. data/lib/mongo/error/pool_closed_error.rb +53 -0
  167. data/lib/mongo/error/raise_original_error.rb +32 -0
  168. data/lib/mongo/error/sdam_error_detection.rb +83 -0
  169. data/lib/mongo/error/server_api_conflict.rb +26 -0
  170. data/lib/mongo/error/server_api_not_supported.rb +27 -0
  171. data/lib/mongo/error/server_certificate_revoked.rb +25 -0
  172. data/lib/mongo/error/session_ended.rb +30 -0
  173. data/lib/mongo/error/sessions_not_supported.rb +38 -0
  174. data/lib/mongo/error/socket_error.rb +8 -2
  175. data/lib/mongo/error/socket_timeout_error.rb +8 -2
  176. data/lib/mongo/error/unchangeable_collection_option.rb +4 -1
  177. data/lib/mongo/error/unexpected_chunk_length.rb +4 -1
  178. data/lib/mongo/error/unexpected_response.rb +4 -1
  179. data/lib/mongo/error/unknown_payload_type.rb +44 -0
  180. data/lib/mongo/error/unmet_dependency.rb +24 -0
  181. data/lib/mongo/error/unsupported_array_filters.rb +59 -0
  182. data/lib/mongo/error/unsupported_collation.rb +59 -0
  183. data/lib/mongo/error/unsupported_features.rb +4 -19
  184. data/lib/mongo/error/unsupported_message_type.rb +26 -0
  185. data/lib/mongo/error/unsupported_option.rb +104 -0
  186. data/lib/mongo/error/write_retryable.rb +30 -0
  187. data/lib/mongo/error.rb +147 -2
  188. data/lib/mongo/event/base.rb +45 -0
  189. data/lib/mongo/event/listeners.rb +4 -1
  190. data/lib/mongo/event/publisher.rb +4 -1
  191. data/lib/mongo/event/subscriber.rb +4 -1
  192. data/lib/mongo/event.rb +18 -8
  193. data/lib/mongo/grid/file/chunk.rb +10 -7
  194. data/lib/mongo/grid/file/info.rb +38 -5
  195. data/lib/mongo/grid/file.rb +9 -1
  196. data/lib/mongo/grid/fs_bucket.rb +147 -65
  197. data/lib/mongo/grid/stream/read.rb +68 -30
  198. data/lib/mongo/grid/stream/write.rb +37 -12
  199. data/lib/mongo/grid/stream.rb +4 -1
  200. data/lib/mongo/grid.rb +4 -1
  201. data/lib/mongo/id.rb +69 -0
  202. data/lib/mongo/index/view.rb +112 -38
  203. data/lib/mongo/index.rb +5 -1
  204. data/lib/mongo/lint.rb +105 -0
  205. data/lib/mongo/loggable.rb +9 -2
  206. data/lib/mongo/logger.rb +7 -6
  207. data/lib/mongo/monitoring/cmap_log_subscriber.rb +56 -0
  208. data/lib/mongo/monitoring/command_log_subscriber.rb +25 -5
  209. data/lib/mongo/monitoring/event/cmap/base.rb +31 -0
  210. data/lib/mongo/monitoring/event/cmap/connection_check_out_failed.rb +88 -0
  211. data/lib/mongo/monitoring/event/cmap/connection_check_out_started.rb +59 -0
  212. data/lib/mongo/monitoring/event/cmap/connection_checked_in.rb +74 -0
  213. data/lib/mongo/monitoring/event/cmap/connection_checked_out.rb +75 -0
  214. data/lib/mongo/monitoring/event/cmap/connection_closed.rb +106 -0
  215. data/lib/mongo/monitoring/event/cmap/connection_created.rb +67 -0
  216. data/lib/mongo/monitoring/event/cmap/connection_ready.rb +67 -0
  217. data/lib/mongo/monitoring/event/cmap/pool_cleared.rb +63 -0
  218. data/lib/mongo/monitoring/event/cmap/pool_closed.rb +68 -0
  219. data/lib/mongo/monitoring/event/cmap/pool_created.rb +75 -0
  220. data/lib/mongo/monitoring/event/cmap.rb +28 -0
  221. data/lib/mongo/monitoring/event/command_failed.rb +59 -8
  222. data/lib/mongo/monitoring/event/command_started.rb +102 -6
  223. data/lib/mongo/monitoring/event/command_succeeded.rb +45 -6
  224. data/lib/mongo/monitoring/event/secure.rb +59 -5
  225. data/lib/mongo/monitoring/event/server_closed.rb +62 -0
  226. data/lib/mongo/monitoring/event/server_description_changed.rb +99 -0
  227. data/lib/mongo/monitoring/event/server_heartbeat_failed.rb +92 -0
  228. data/lib/mongo/monitoring/event/server_heartbeat_started.rb +65 -0
  229. data/lib/mongo/monitoring/event/server_heartbeat_succeeded.rb +84 -0
  230. data/lib/mongo/monitoring/event/server_opening.rb +62 -0
  231. data/lib/mongo/monitoring/event/topology_changed.rb +63 -0
  232. data/lib/mongo/monitoring/event/topology_closed.rb +57 -0
  233. data/lib/mongo/monitoring/event/topology_opening.rb +57 -0
  234. data/lib/mongo/monitoring/event.rb +15 -1
  235. data/lib/mongo/monitoring/publishable.rb +60 -44
  236. data/lib/mongo/monitoring/sdam_log_subscriber.rb +57 -0
  237. data/lib/mongo/monitoring/server_closed_log_subscriber.rb +33 -0
  238. data/lib/mongo/monitoring/server_description_changed_log_subscriber.rb +44 -0
  239. data/lib/mongo/monitoring/server_opening_log_subscriber.rb +33 -0
  240. data/lib/mongo/monitoring/topology_changed_log_subscriber.rb +43 -0
  241. data/lib/mongo/monitoring/topology_closed_log_subscriber.rb +33 -0
  242. data/lib/mongo/monitoring/topology_opening_log_subscriber.rb +33 -0
  243. data/lib/mongo/monitoring/unified_sdam_log_subscriber.rb +65 -0
  244. data/lib/mongo/monitoring.rb +245 -61
  245. data/lib/mongo/operation/aggregate/command.rb +55 -0
  246. data/lib/mongo/operation/aggregate/op_msg.rb +34 -0
  247. data/lib/mongo/operation/aggregate/result.rb +104 -0
  248. data/lib/mongo/operation/aggregate.rb +39 -0
  249. data/lib/mongo/operation/collections_info/command.rb +48 -0
  250. data/lib/mongo/operation/collections_info/result.rb +59 -0
  251. data/lib/mongo/operation/collections_info.rb +51 -0
  252. data/lib/mongo/operation/command/command.rb +41 -0
  253. data/lib/mongo/operation/command/op_msg.rb +31 -0
  254. data/lib/mongo/operation/command.rb +34 -0
  255. data/lib/mongo/operation/context.rb +120 -0
  256. data/lib/mongo/operation/count/command.rb +47 -0
  257. data/lib/mongo/operation/count/op_msg.rb +38 -0
  258. data/lib/mongo/operation/count.rb +34 -0
  259. data/lib/mongo/operation/create/command.rb +47 -0
  260. data/lib/mongo/operation/create/op_msg.rb +39 -0
  261. data/lib/mongo/operation/create.rb +34 -0
  262. data/lib/mongo/operation/create_index/command.rb +61 -0
  263. data/lib/mongo/operation/create_index/op_msg.rb +54 -0
  264. data/lib/mongo/operation/create_index.rb +34 -0
  265. data/lib/mongo/operation/create_user/command.rb +46 -0
  266. data/lib/mongo/operation/create_user/op_msg.rb +38 -0
  267. data/lib/mongo/operation/create_user.rb +34 -0
  268. data/lib/mongo/operation/delete/bulk_result.rb +51 -0
  269. data/lib/mongo/operation/delete/command.rb +52 -0
  270. data/lib/mongo/operation/delete/legacy.rb +64 -0
  271. data/lib/mongo/operation/delete/op_msg.rb +55 -0
  272. data/lib/mongo/operation/delete/result.rb +48 -0
  273. data/lib/mongo/operation/delete.rb +41 -0
  274. data/lib/mongo/operation/distinct/command.rb +47 -0
  275. data/lib/mongo/operation/distinct/op_msg.rb +40 -0
  276. data/lib/mongo/operation/distinct.rb +34 -0
  277. data/lib/mongo/operation/drop/command.rb +41 -0
  278. data/lib/mongo/operation/drop/op_msg.rb +32 -0
  279. data/lib/mongo/operation/drop.rb +34 -0
  280. data/lib/mongo/operation/drop_database/command.rb +41 -0
  281. data/lib/mongo/operation/drop_database/op_msg.rb +32 -0
  282. data/lib/mongo/operation/drop_database.rb +34 -0
  283. data/lib/mongo/operation/drop_index/command.rb +45 -0
  284. data/lib/mongo/operation/drop_index/op_msg.rb +38 -0
  285. data/lib/mongo/operation/drop_index.rb +34 -0
  286. data/lib/mongo/operation/explain/command.rb +58 -0
  287. data/lib/mongo/operation/explain/legacy.rb +52 -0
  288. data/lib/mongo/operation/explain/op_msg.rb +48 -0
  289. data/lib/mongo/operation/explain/result.rb +56 -0
  290. data/lib/mongo/operation/explain.rb +36 -0
  291. data/lib/mongo/operation/find/builder/command.rb +110 -0
  292. data/lib/mongo/operation/find/builder/flags.rb +61 -0
  293. data/lib/mongo/operation/find/builder/legacy.rb +123 -0
  294. data/lib/mongo/operation/find/builder/modifiers.rb +89 -0
  295. data/lib/mongo/operation/find/builder.rb +21 -0
  296. data/lib/mongo/operation/find/command.rb +51 -0
  297. data/lib/mongo/operation/find/legacy/result.rb +46 -0
  298. data/lib/mongo/operation/find/legacy.rb +52 -0
  299. data/lib/mongo/operation/find/op_msg.rb +46 -0
  300. data/lib/mongo/operation/find/result.rb +76 -0
  301. data/lib/mongo/operation/find.rb +37 -0
  302. data/lib/mongo/operation/get_more/command.rb +43 -0
  303. data/lib/mongo/operation/get_more/command_builder.rb +38 -0
  304. data/lib/mongo/operation/get_more/legacy.rb +39 -0
  305. data/lib/mongo/operation/get_more/op_msg.rb +34 -0
  306. data/lib/mongo/operation/get_more/result.rb +75 -0
  307. data/lib/mongo/operation/get_more.rb +37 -0
  308. data/lib/mongo/operation/indexes/command.rb +42 -0
  309. data/lib/mongo/operation/indexes/legacy.rb +48 -0
  310. data/lib/mongo/operation/indexes/op_msg.rb +34 -0
  311. data/lib/mongo/operation/indexes/result.rb +105 -0
  312. data/lib/mongo/operation/indexes.rb +50 -0
  313. data/lib/mongo/operation/insert/bulk_result.rb +112 -0
  314. data/lib/mongo/operation/insert/command.rb +59 -0
  315. data/lib/mongo/operation/insert/legacy.rb +68 -0
  316. data/lib/mongo/operation/insert/op_msg.rb +54 -0
  317. data/lib/mongo/operation/insert/result.rb +75 -0
  318. data/lib/mongo/operation/insert.rb +44 -0
  319. data/lib/mongo/operation/kill_cursors/command.rb +48 -0
  320. data/lib/mongo/operation/kill_cursors/command_builder.rb +35 -0
  321. data/lib/mongo/operation/kill_cursors/legacy.rb +41 -0
  322. data/lib/mongo/operation/kill_cursors/op_msg.rb +42 -0
  323. data/lib/mongo/operation/kill_cursors.rb +12 -16
  324. data/lib/mongo/operation/list_collections/command.rb +46 -0
  325. data/lib/mongo/operation/list_collections/op_msg.rb +39 -0
  326. data/lib/mongo/operation/list_collections/result.rb +113 -0
  327. data/lib/mongo/operation/list_collections.rb +35 -0
  328. data/lib/mongo/operation/map_reduce/command.rb +51 -0
  329. data/lib/mongo/operation/map_reduce/op_msg.rb +34 -0
  330. data/lib/mongo/operation/map_reduce/result.rb +142 -0
  331. data/lib/mongo/operation/map_reduce.rb +35 -0
  332. data/lib/mongo/operation/op_msg_base.rb +33 -0
  333. data/lib/mongo/operation/parallel_scan/command.rb +57 -0
  334. data/lib/mongo/operation/parallel_scan/op_msg.rb +46 -0
  335. data/lib/mongo/operation/parallel_scan/result.rb +68 -0
  336. data/lib/mongo/operation/parallel_scan.rb +35 -0
  337. data/lib/mongo/operation/remove_user/command.rb +46 -0
  338. data/lib/mongo/operation/remove_user/op_msg.rb +38 -0
  339. data/lib/mongo/operation/remove_user.rb +34 -0
  340. data/lib/mongo/operation/result.rb +195 -39
  341. data/lib/mongo/operation/shared/bypass_document_validation.rb +46 -0
  342. data/lib/mongo/operation/shared/causal_consistency_supported.rb +45 -0
  343. data/lib/mongo/operation/shared/executable.rb +130 -0
  344. data/lib/mongo/operation/shared/executable_no_validate.rb +32 -0
  345. data/lib/mongo/operation/shared/executable_transaction_label.rb +30 -0
  346. data/lib/mongo/operation/shared/idable.rb +68 -0
  347. data/lib/mongo/operation/shared/limited.rb +42 -0
  348. data/lib/mongo/operation/shared/object_id_generator.rb +40 -0
  349. data/lib/mongo/operation/shared/op_msg_or_command.rb +41 -0
  350. data/lib/mongo/operation/shared/op_msg_or_find_command.rb +44 -0
  351. data/lib/mongo/operation/shared/polymorphic_lookup.rb +36 -0
  352. data/lib/mongo/operation/shared/polymorphic_operation.rb +42 -0
  353. data/lib/mongo/operation/shared/polymorphic_result.rb +50 -0
  354. data/lib/mongo/operation/shared/read_preference_supported.rb +116 -0
  355. data/lib/mongo/operation/shared/response_handling.rb +173 -0
  356. data/lib/mongo/operation/shared/result/aggregatable.rb +74 -0
  357. data/lib/mongo/operation/shared/result/use_legacy_error_parser.rb +32 -0
  358. data/lib/mongo/operation/shared/sessions_supported.rb +254 -0
  359. data/lib/mongo/operation/shared/specifiable.rb +567 -0
  360. data/lib/mongo/operation/shared/validatable.rb +87 -0
  361. data/lib/mongo/operation/shared/write.rb +90 -0
  362. data/lib/mongo/operation/shared/write_concern_supported.rb +43 -0
  363. data/lib/mongo/operation/update/bulk_result.rb +129 -0
  364. data/lib/mongo/operation/update/command.rb +53 -0
  365. data/lib/mongo/operation/update/legacy/result.rb +112 -0
  366. data/lib/mongo/operation/update/legacy.rb +76 -0
  367. data/lib/mongo/operation/update/op_msg.rb +51 -0
  368. data/lib/mongo/operation/update/result.rb +113 -0
  369. data/lib/mongo/operation/update.rb +41 -0
  370. data/lib/mongo/operation/update_user/command.rb +45 -0
  371. data/lib/mongo/operation/update_user/op_msg.rb +38 -0
  372. data/lib/mongo/operation/update_user.rb +34 -0
  373. data/lib/mongo/operation/users_info/command.rb +46 -0
  374. data/lib/mongo/operation/users_info/op_msg.rb +39 -0
  375. data/lib/mongo/operation/users_info/result.rb +48 -0
  376. data/lib/mongo/operation/users_info.rb +35 -0
  377. data/lib/mongo/operation/write_command/command.rb +51 -0
  378. data/lib/mongo/operation/write_command/op_msg.rb +43 -0
  379. data/lib/mongo/operation/write_command.rb +32 -0
  380. data/lib/mongo/operation.rb +83 -21
  381. data/lib/mongo/options/mapper.rb +13 -3
  382. data/lib/mongo/options/redacted.rb +4 -1
  383. data/lib/mongo/options.rb +4 -1
  384. data/lib/mongo/protocol/bit_vector.rb +8 -4
  385. data/lib/mongo/protocol/compressed.rb +184 -0
  386. data/lib/mongo/protocol/delete.rb +16 -8
  387. data/lib/mongo/protocol/get_more.rb +24 -15
  388. data/lib/mongo/protocol/insert.rb +20 -10
  389. data/lib/mongo/protocol/kill_cursors.rb +22 -21
  390. data/lib/mongo/protocol/message.rb +187 -23
  391. data/lib/mongo/protocol/msg.rb +404 -0
  392. data/lib/mongo/protocol/query.rb +120 -41
  393. data/lib/mongo/protocol/registry.rb +79 -0
  394. data/lib/mongo/protocol/reply.rb +23 -15
  395. data/lib/mongo/protocol/serializers.rb +283 -12
  396. data/lib/mongo/protocol/update.rb +22 -10
  397. data/lib/mongo/protocol.rb +6 -0
  398. data/lib/mongo/query_cache.rb +275 -0
  399. data/lib/mongo/retryable.rb +414 -47
  400. data/lib/mongo/semaphore.rb +49 -0
  401. data/lib/mongo/server/app_metadata.rb +267 -0
  402. data/lib/mongo/server/connection.rb +251 -101
  403. data/lib/mongo/server/connection_base.rb +276 -0
  404. data/lib/mongo/server/connection_common.rb +205 -0
  405. data/lib/mongo/server/connection_pool/generation_manager.rb +71 -0
  406. data/lib/mongo/server/connection_pool/populator.rb +61 -0
  407. data/lib/mongo/server/connection_pool.rb +796 -57
  408. data/lib/mongo/server/description/features.rb +84 -20
  409. data/lib/mongo/server/description/load_balancer.rb +33 -0
  410. data/lib/mongo/server/description.rb +398 -73
  411. data/lib/mongo/server/monitor/app_metadata.rb +37 -0
  412. data/lib/mongo/server/monitor/connection.rb +192 -61
  413. data/lib/mongo/server/monitor.rb +251 -92
  414. data/lib/mongo/server/pending_connection.rb +288 -0
  415. data/lib/mongo/server/push_monitor/connection.rb +31 -0
  416. data/lib/mongo/server/push_monitor.rb +194 -0
  417. data/lib/mongo/server/round_trip_time_averager.rb +76 -0
  418. data/lib/mongo/server.rb +454 -76
  419. data/lib/mongo/server_selector/base.rb +629 -0
  420. data/lib/mongo/server_selector/nearest.rb +44 -28
  421. data/lib/mongo/server_selector/primary.rb +40 -18
  422. data/lib/mongo/server_selector/primary_preferred.rb +47 -26
  423. data/lib/mongo/server_selector/secondary.rb +41 -23
  424. data/lib/mongo/server_selector/secondary_preferred.rb +42 -25
  425. data/lib/mongo/server_selector.rb +27 -8
  426. data/lib/mongo/session/server_session.rb +122 -0
  427. data/lib/mongo/session/session_pool.rb +166 -0
  428. data/lib/mongo/session.rb +1094 -0
  429. data/lib/mongo/socket/ocsp_cache.rb +100 -0
  430. data/lib/mongo/socket/ocsp_verifier.rb +345 -0
  431. data/lib/mongo/socket/ssl.rb +299 -61
  432. data/lib/mongo/socket/tcp.rb +48 -32
  433. data/lib/mongo/socket/unix.rb +24 -34
  434. data/lib/mongo/socket.rb +310 -48
  435. data/lib/mongo/srv/monitor.rb +113 -0
  436. data/lib/mongo/srv/resolver.rb +137 -0
  437. data/lib/mongo/srv/result.rb +128 -0
  438. data/lib/mongo/srv.rb +20 -0
  439. data/lib/mongo/timeout.rb +54 -0
  440. data/lib/mongo/topology_version.rb +92 -0
  441. data/lib/mongo/uri/options_mapper.rb +624 -0
  442. data/lib/mongo/uri/srv_protocol.rb +239 -0
  443. data/lib/mongo/uri.rb +291 -316
  444. data/lib/mongo/utils.rb +111 -0
  445. data/lib/mongo/version.rb +5 -2
  446. data/lib/mongo/write_concern/acknowledged.rb +17 -4
  447. data/lib/mongo/write_concern/base.rb +70 -0
  448. data/lib/mongo/write_concern/unacknowledged.rb +17 -4
  449. data/lib/mongo/write_concern.rb +19 -34
  450. data/lib/mongo.rb +69 -5
  451. data/mongo.gemspec +14 -6
  452. data/spec/NOTES.aws-auth.md +296 -0
  453. data/spec/README.aws-auth.md +318 -0
  454. data/spec/README.md +715 -0
  455. data/spec/USERS.md +72 -0
  456. data/spec/atlas/atlas_connectivity_spec.rb +27 -0
  457. data/spec/atlas/operations_spec.rb +28 -0
  458. data/spec/integration/auth_spec.rb +309 -0
  459. data/spec/integration/awaited_ismaster_spec.rb +31 -0
  460. data/spec/integration/aws_auth_request_spec.rb +77 -0
  461. data/spec/integration/aws_credentials_retriever_spec.rb +106 -0
  462. data/spec/integration/bson_symbol_spec.rb +39 -0
  463. data/spec/integration/bulk_insert_spec.rb +83 -0
  464. data/spec/integration/bulk_write_error_message_spec.rb +41 -0
  465. data/spec/integration/bulk_write_spec.rb +70 -0
  466. data/spec/integration/change_stream_examples_spec.rb +208 -0
  467. data/spec/integration/change_stream_spec.rb +808 -0
  468. data/spec/integration/check_clean_slate_spec.rb +19 -0
  469. data/spec/integration/client_authentication_options_spec.rb +514 -0
  470. data/spec/integration/client_connectivity_spec.rb +41 -0
  471. data/spec/integration/client_construction_aws_auth_spec.rb +194 -0
  472. data/spec/integration/client_construction_spec.rb +293 -0
  473. data/spec/integration/client_side_encryption/auto_encryption_bulk_writes_spec.rb +360 -0
  474. data/spec/integration/client_side_encryption/auto_encryption_command_monitoring_spec.rb +306 -0
  475. data/spec/integration/client_side_encryption/auto_encryption_mongocryptd_spawn_spec.rb +75 -0
  476. data/spec/integration/client_side_encryption/auto_encryption_old_wire_version_spec.rb +82 -0
  477. data/spec/integration/client_side_encryption/auto_encryption_reconnect_spec.rb +224 -0
  478. data/spec/integration/client_side_encryption/auto_encryption_spec.rb +604 -0
  479. data/spec/integration/client_side_encryption/bson_size_limit_spec.rb +190 -0
  480. data/spec/integration/client_side_encryption/bypass_mongocryptd_spawn_spec.rb +81 -0
  481. data/spec/integration/client_side_encryption/client_close_spec.rb +66 -0
  482. data/spec/integration/client_side_encryption/corpus_spec.rb +236 -0
  483. data/spec/integration/client_side_encryption/custom_endpoint_spec.rb +135 -0
  484. data/spec/integration/client_side_encryption/data_key_spec.rb +168 -0
  485. data/spec/integration/client_side_encryption/explicit_encryption_spec.rb +117 -0
  486. data/spec/integration/client_side_encryption/external_key_vault_spec.rb +144 -0
  487. data/spec/integration/client_side_encryption/views_spec.rb +47 -0
  488. data/spec/integration/client_spec.rb +49 -0
  489. data/spec/integration/client_update_spec.rb +157 -0
  490. data/spec/integration/collection_indexes_prose_spec.rb +58 -0
  491. data/spec/integration/command_monitoring_spec.rb +184 -0
  492. data/spec/integration/command_spec.rb +179 -0
  493. data/spec/integration/connect_single_rs_name_spec.rb +75 -0
  494. data/spec/integration/connection_pool_populator_spec.rb +305 -0
  495. data/spec/integration/connection_spec.rb +353 -0
  496. data/spec/integration/crud_spec.rb +366 -0
  497. data/spec/integration/cursor_pinning_spec.rb +121 -0
  498. data/spec/integration/cursor_reaping_spec.rb +143 -0
  499. data/spec/integration/docs_examples_spec.rb +207 -0
  500. data/spec/integration/error_detection_spec.rb +42 -0
  501. data/spec/integration/fork_reconnect_spec.rb +200 -0
  502. data/spec/integration/get_more_spec.rb +42 -0
  503. data/spec/integration/grid_fs_bucket_spec.rb +51 -0
  504. data/spec/integration/heartbeat_events_spec.rb +102 -0
  505. data/spec/integration/map_reduce_spec.rb +77 -0
  506. data/spec/integration/mmapv1_spec.rb +31 -0
  507. data/spec/integration/mongos_pinning_spec.rb +37 -0
  508. data/spec/integration/ocsp_connectivity_spec.rb +29 -0
  509. data/spec/integration/ocsp_verifier_cache_spec.rb +191 -0
  510. data/spec/integration/ocsp_verifier_spec.rb +355 -0
  511. data/spec/integration/operation_failure_code_spec.rb +29 -0
  512. data/spec/integration/operation_failure_message_spec.rb +90 -0
  513. data/spec/integration/query_cache_spec.rb +1093 -0
  514. data/spec/integration/query_cache_transactions_spec.rb +193 -0
  515. data/spec/integration/read_concern_spec.rb +92 -0
  516. data/spec/integration/read_preference_spec.rb +544 -0
  517. data/spec/integration/reconnect_spec.rb +195 -0
  518. data/spec/integration/retryable_errors_spec.rb +286 -0
  519. data/spec/integration/retryable_writes/retryable_writes_36_and_older_spec.rb +764 -0
  520. data/spec/integration/retryable_writes/retryable_writes_40_and_newer_spec.rb +405 -0
  521. data/spec/integration/retryable_writes/shared/adds_diagnostics.rb +18 -0
  522. data/spec/integration/retryable_writes/shared/does_not_support_retries.rb +27 -0
  523. data/spec/integration/retryable_writes/shared/only_supports_legacy_retries.rb +28 -0
  524. data/spec/integration/retryable_writes/shared/performs_legacy_retries.rb +220 -0
  525. data/spec/integration/retryable_writes/shared/performs_modern_retries.rb +235 -0
  526. data/spec/integration/retryable_writes/shared/performs_no_retries.rb +113 -0
  527. data/spec/integration/retryable_writes/shared/supports_legacy_retries.rb +22 -0
  528. data/spec/integration/retryable_writes/shared/supports_modern_retries.rb +28 -0
  529. data/spec/integration/retryable_writes/shared/supports_retries.rb +19 -0
  530. data/spec/integration/retryable_writes_errors_spec.rb +34 -0
  531. data/spec/integration/sdam_error_handling_spec.rb +426 -0
  532. data/spec/integration/sdam_events_spec.rb +138 -0
  533. data/spec/integration/sdam_prose_spec.rb +67 -0
  534. data/spec/integration/secondary_reads_spec.rb +102 -0
  535. data/spec/integration/server_description_spec.rb +48 -0
  536. data/spec/integration/server_monitor_spec.rb +56 -0
  537. data/spec/integration/server_selection_spec.rb +39 -0
  538. data/spec/integration/server_selector_spec.rb +105 -0
  539. data/spec/integration/server_spec.rb +69 -0
  540. data/spec/integration/shell_examples_spec.rb +984 -0
  541. data/spec/integration/size_limit_spec.rb +115 -0
  542. data/spec/integration/snappy_compression_spec.rb +28 -0
  543. data/spec/integration/srv_monitoring_spec.rb +406 -0
  544. data/spec/integration/srv_spec.rb +59 -0
  545. data/spec/integration/ssl_uri_options_spec.rb +28 -0
  546. data/spec/integration/step_down_spec.rb +207 -0
  547. data/spec/integration/time_zone_querying_spec.rb +55 -0
  548. data/spec/integration/transaction_pinning_spec.rb +120 -0
  549. data/spec/integration/transactions_api_examples_spec.rb +62 -0
  550. data/spec/integration/transactions_examples_spec.rb +235 -0
  551. data/spec/integration/truncated_utf8_spec.rb +26 -0
  552. data/spec/integration/versioned_api_examples_spec.rb +114 -0
  553. data/spec/integration/x509_auth_spec.rb +112 -0
  554. data/spec/integration/zlib_compression_spec.rb +28 -0
  555. data/spec/integration/zstd_compression_spec.rb +29 -0
  556. data/spec/kerberos/kerberos_spec.rb +94 -0
  557. data/spec/lite_spec_helper.rb +167 -0
  558. data/spec/mongo/address/ipv4_spec.rb +8 -1
  559. data/spec/mongo/address/ipv6_spec.rb +36 -1
  560. data/spec/mongo/address/unix_spec.rb +5 -1
  561. data/spec/mongo/address/validator_spec.rb +54 -0
  562. data/spec/mongo/address_spec.rb +120 -7
  563. data/spec/mongo/auth/aws/request_region_spec.rb +45 -0
  564. data/spec/mongo/auth/aws/request_spec.rb +79 -0
  565. data/spec/mongo/auth/cr_spec.rb +34 -23
  566. data/spec/mongo/auth/gssapi/conversation_spec.rb +124 -0
  567. data/spec/mongo/auth/invalid_mechanism_spec.rb +14 -0
  568. data/spec/mongo/auth/ldap/conversation_spec.rb +6 -3
  569. data/spec/mongo/auth/ldap_spec.rb +19 -21
  570. data/spec/mongo/auth/scram/conversation_spec.rb +66 -58
  571. data/spec/mongo/auth/scram256/conversation_spec.rb +174 -0
  572. data/spec/mongo/auth/scram_negotiation_spec.rb +531 -0
  573. data/spec/mongo/auth/scram_spec.rb +97 -39
  574. data/spec/mongo/auth/stringprep/profiles/sasl_spec.rb +116 -0
  575. data/spec/mongo/auth/stringprep_spec.rb +191 -0
  576. data/spec/mongo/auth/user/view_spec.rb +404 -70
  577. data/spec/mongo/auth/user_spec.rb +165 -12
  578. data/spec/mongo/auth/x509/conversation_spec.rb +72 -0
  579. data/spec/mongo/auth/x509_spec.rb +46 -22
  580. data/spec/mongo/auth_spec.rb +7 -4
  581. data/spec/mongo/bson_spec.rb +3 -0
  582. data/spec/mongo/bulk_write/ordered_combiner_spec.rb +9 -6
  583. data/spec/mongo/bulk_write/result_spec.rb +127 -0
  584. data/spec/mongo/bulk_write/unordered_combiner_spec.rb +7 -4
  585. data/spec/mongo/bulk_write_spec.rb +1534 -254
  586. data/spec/mongo/caching_cursor_spec.rb +73 -0
  587. data/spec/mongo/client_construction_spec.rb +2620 -0
  588. data/spec/mongo/client_encryption_spec.rb +414 -0
  589. data/spec/mongo/client_spec.rb +525 -358
  590. data/spec/mongo/cluster/cursor_reaper_spec.rb +77 -88
  591. data/spec/mongo/cluster/periodic_executor_spec.rb +21 -0
  592. data/spec/mongo/cluster/socket_reaper_spec.rb +46 -0
  593. data/spec/mongo/cluster/topology/replica_set_spec.rb +414 -175
  594. data/spec/mongo/cluster/topology/sharded_spec.rb +72 -47
  595. data/spec/mongo/cluster/topology/single_spec.rb +112 -28
  596. data/spec/mongo/cluster/topology/unknown_spec.rb +44 -108
  597. data/spec/mongo/cluster/topology_spec.rb +139 -19
  598. data/spec/mongo/cluster_spec.rb +509 -144
  599. data/spec/mongo/cluster_time_spec.rb +151 -0
  600. data/spec/mongo/collection/view/aggregation_spec.rb +308 -20
  601. data/spec/mongo/collection/view/builder/find_command_spec.rb +88 -10
  602. data/spec/mongo/collection/view/builder/op_query_spec.rb +7 -0
  603. data/spec/mongo/collection/view/change_stream_resume_spec.rb +397 -0
  604. data/spec/mongo/collection/view/change_stream_spec.rb +547 -0
  605. data/spec/mongo/collection/view/explainable_spec.rb +91 -5
  606. data/spec/mongo/collection/view/immutable_spec.rb +4 -1
  607. data/spec/mongo/collection/view/iterable_spec.rb +41 -0
  608. data/spec/mongo/collection/view/map_reduce_spec.rb +462 -23
  609. data/spec/mongo/collection/view/readable_spec.rb +461 -48
  610. data/spec/mongo/collection/view/writable_spec.rb +1232 -47
  611. data/spec/mongo/collection/view_spec.rb +81 -7
  612. data/spec/mongo/collection_crud_spec.rb +4365 -0
  613. data/spec/mongo/collection_ddl_spec.rb +537 -0
  614. data/spec/mongo/collection_spec.rb +485 -1982
  615. data/spec/mongo/crypt/auto_decryption_context_spec.rb +93 -0
  616. data/spec/mongo/crypt/auto_encrypter_spec.rb +190 -0
  617. data/spec/mongo/crypt/auto_encryption_context_spec.rb +110 -0
  618. data/spec/mongo/crypt/binary_spec.rb +113 -0
  619. data/spec/mongo/crypt/binding/binary_spec.rb +54 -0
  620. data/spec/mongo/crypt/binding/context_spec.rb +255 -0
  621. data/spec/mongo/crypt/binding/helpers_spec.rb +44 -0
  622. data/spec/mongo/crypt/binding/mongocrypt_spec.rb +142 -0
  623. data/spec/mongo/crypt/binding/status_spec.rb +97 -0
  624. data/spec/mongo/crypt/binding/version_spec.rb +20 -0
  625. data/spec/mongo/crypt/binding_unloaded_spec.rb +23 -0
  626. data/spec/mongo/crypt/data_key_context_spec.rb +216 -0
  627. data/spec/mongo/crypt/encryption_io_spec.rb +139 -0
  628. data/spec/mongo/crypt/explicit_decryption_context_spec.rb +75 -0
  629. data/spec/mongo/crypt/explicit_encryption_context_spec.rb +173 -0
  630. data/spec/mongo/crypt/handle_spec.rb +235 -0
  631. data/spec/mongo/crypt/helpers/mongo_crypt_spec_helper.rb +111 -0
  632. data/spec/mongo/crypt/status_spec.rb +150 -0
  633. data/spec/mongo/cursor/builder/get_more_command_spec.rb +46 -11
  634. data/spec/mongo/cursor/builder/op_get_more_spec.rb +20 -4
  635. data/spec/mongo/cursor_spec.rb +395 -47
  636. data/spec/mongo/database_spec.rb +905 -68
  637. data/spec/mongo/dbref_spec.rb +3 -0
  638. data/spec/mongo/distinguishing_semaphore_spec.rb +66 -0
  639. data/spec/mongo/error/bulk_write_error_spec.rb +52 -0
  640. data/spec/mongo/error/crypt_error_spec.rb +29 -0
  641. data/spec/mongo/error/max_bson_size_spec.rb +38 -0
  642. data/spec/mongo/error/no_server_available_spec.rb +35 -0
  643. data/spec/mongo/error/notable_spec.rb +62 -0
  644. data/spec/mongo/error/operation_failure_heavy_spec.rb +61 -0
  645. data/spec/mongo/error/operation_failure_spec.rb +553 -0
  646. data/spec/mongo/error/parser_spec.rb +432 -11
  647. data/spec/mongo/error/unsupported_option_spec.rb +57 -0
  648. data/spec/mongo/event/publisher_spec.rb +3 -0
  649. data/spec/mongo/event/subscriber_spec.rb +3 -0
  650. data/spec/mongo/grid/file/chunk_spec.rb +7 -4
  651. data/spec/mongo/grid/file/info_spec.rb +6 -3
  652. data/spec/mongo/grid/file_spec.rb +4 -1
  653. data/spec/mongo/grid/fs_bucket_spec.rb +336 -205
  654. data/spec/mongo/grid/stream/read_spec.rb +44 -27
  655. data/spec/mongo/grid/stream/write_spec.rb +93 -36
  656. data/spec/mongo/grid/stream_spec.rb +4 -1
  657. data/spec/mongo/id_spec.rb +38 -0
  658. data/spec/mongo/index/view_spec.rb +832 -70
  659. data/spec/mongo/lint_spec.rb +231 -0
  660. data/spec/mongo/logger_spec.rb +17 -12
  661. data/spec/mongo/monitoring/command_log_subscriber_spec.rb +3 -0
  662. data/spec/mongo/monitoring/event/cmap/connection_check_out_failed_spec.rb +26 -0
  663. data/spec/mongo/monitoring/event/cmap/connection_check_out_started_spec.rb +22 -0
  664. data/spec/mongo/monitoring/event/cmap/connection_checked_in_spec.rb +33 -0
  665. data/spec/mongo/monitoring/event/cmap/connection_checked_out_spec.rb +33 -0
  666. data/spec/mongo/monitoring/event/cmap/connection_closed_spec.rb +30 -0
  667. data/spec/mongo/monitoring/event/cmap/connection_created_spec.rb +27 -0
  668. data/spec/mongo/monitoring/event/cmap/connection_ready_spec.rb +27 -0
  669. data/spec/mongo/monitoring/event/cmap/pool_cleared_spec.rb +22 -0
  670. data/spec/mongo/monitoring/event/cmap/pool_closed_spec.rb +29 -0
  671. data/spec/mongo/monitoring/event/cmap/pool_created_spec.rb +36 -0
  672. data/spec/mongo/monitoring/event/command_failed_spec.rb +87 -0
  673. data/spec/mongo/monitoring/event/command_started_spec.rb +30 -5
  674. data/spec/mongo/monitoring/event/command_succeeded_spec.rb +71 -9
  675. data/spec/mongo/monitoring/event/secure_spec.rb +71 -5
  676. data/spec/mongo/monitoring/event/server_closed_spec.rb +38 -0
  677. data/spec/mongo/monitoring/event/server_description_changed_spec.rb +38 -0
  678. data/spec/mongo/monitoring/event/server_heartbeat_failed_spec.rb +34 -0
  679. data/spec/mongo/monitoring/event/server_heartbeat_started_spec.rb +34 -0
  680. data/spec/mongo/monitoring/event/server_heartbeat_succeeded_spec.rb +34 -0
  681. data/spec/mongo/monitoring/event/server_opening_spec.rb +38 -0
  682. data/spec/mongo/monitoring/event/topology_changed_spec.rb +44 -0
  683. data/spec/mongo/monitoring/event/topology_closed_spec.rb +38 -0
  684. data/spec/mongo/monitoring/event/topology_opening_spec.rb +38 -0
  685. data/spec/mongo/monitoring_spec.rb +33 -5
  686. data/spec/mongo/operation/aggregate/result_spec.rb +90 -0
  687. data/spec/mongo/operation/aggregate_spec.rb +76 -0
  688. data/spec/mongo/operation/collections_info_spec.rb +48 -0
  689. data/spec/mongo/operation/command_spec.rb +86 -0
  690. data/spec/mongo/operation/create_index_spec.rb +62 -0
  691. data/spec/mongo/operation/create_user_spec.rb +53 -0
  692. data/spec/mongo/operation/delete/bulk_spec.rb +245 -0
  693. data/spec/mongo/operation/delete/command_spec.rb +115 -0
  694. data/spec/mongo/operation/delete/op_msg_spec.rb +257 -0
  695. data/spec/mongo/operation/delete_spec.rb +233 -0
  696. data/spec/mongo/operation/drop_index_spec.rb +61 -0
  697. data/spec/mongo/operation/find/builder/flags_spec.rb +109 -0
  698. data/spec/mongo/operation/find/builder/modifiers_spec.rb +213 -0
  699. data/spec/mongo/operation/find/legacy_spec.rb +131 -0
  700. data/spec/mongo/operation/get_more_spec.rb +63 -0
  701. data/spec/mongo/operation/indexes_spec.rb +41 -0
  702. data/spec/mongo/operation/insert/bulk_spec.rb +273 -0
  703. data/spec/mongo/operation/insert/command_spec.rb +118 -0
  704. data/spec/mongo/operation/insert/op_msg_spec.rb +288 -0
  705. data/spec/mongo/operation/insert_spec.rb +290 -0
  706. data/spec/mongo/operation/kill_cursors_spec.rb +10 -4
  707. data/spec/mongo/operation/limited_spec.rb +8 -3
  708. data/spec/mongo/operation/map_reduce_spec.rb +131 -0
  709. data/spec/mongo/operation/read_preference_legacy_spec.rb +360 -0
  710. data/spec/mongo/operation/read_preference_op_msg_spec.rb +309 -0
  711. data/spec/mongo/operation/remove_user_spec.rb +52 -0
  712. data/spec/mongo/operation/result_spec.rb +46 -6
  713. data/spec/mongo/operation/specifiable_spec.rb +5 -2
  714. data/spec/mongo/operation/update/bulk_spec.rb +239 -0
  715. data/spec/mongo/operation/update/command_spec.rb +122 -0
  716. data/spec/mongo/operation/update/op_msg_spec.rb +263 -0
  717. data/spec/mongo/operation/update_spec.rb +264 -0
  718. data/spec/mongo/operation/update_user_spec.rb +52 -0
  719. data/spec/mongo/options/redacted_spec.rb +3 -0
  720. data/spec/mongo/protocol/compressed_spec.rb +83 -0
  721. data/spec/mongo/protocol/delete_spec.rb +27 -9
  722. data/spec/mongo/protocol/get_more_spec.rb +29 -11
  723. data/spec/mongo/protocol/insert_spec.rb +27 -9
  724. data/spec/mongo/protocol/kill_cursors_spec.rb +24 -6
  725. data/spec/mongo/protocol/msg_spec.rb +528 -0
  726. data/spec/mongo/protocol/query_spec.rb +62 -14
  727. data/spec/mongo/protocol/registry_spec.rb +34 -0
  728. data/spec/mongo/protocol/reply_spec.rb +18 -1
  729. data/spec/mongo/protocol/update_spec.rb +28 -10
  730. data/spec/mongo/query_cache_middleware_spec.rb +55 -0
  731. data/spec/mongo/query_cache_spec.rb +287 -0
  732. data/spec/mongo/retryable_spec.rb +468 -97
  733. data/spec/mongo/semaphore_spec.rb +54 -0
  734. data/spec/mongo/server/app_metadata_spec.rb +170 -0
  735. data/spec/mongo/server/connection_auth_spec.rb +136 -0
  736. data/spec/mongo/server/connection_common_spec.rb +75 -0
  737. data/spec/mongo/server/connection_pool/populator_spec.rb +106 -0
  738. data/spec/mongo/server/connection_pool_spec.rb +970 -88
  739. data/spec/mongo/server/connection_spec.rb +939 -172
  740. data/spec/mongo/server/description/features_spec.rb +96 -29
  741. data/spec/mongo/server/description_query_methods_spec.rb +291 -0
  742. data/spec/mongo/server/description_spec.rb +627 -575
  743. data/spec/mongo/server/monitor/app_metadata_spec.rb +25 -0
  744. data/spec/mongo/server/monitor/connection_spec.rb +175 -0
  745. data/spec/mongo/server/monitor_spec.rb +180 -103
  746. data/spec/mongo/server/round_trip_time_averager_spec.rb +48 -0
  747. data/spec/mongo/server_selector/nearest_spec.rb +107 -27
  748. data/spec/mongo/server_selector/primary_preferred_spec.rb +110 -30
  749. data/spec/mongo/server_selector/primary_spec.rb +73 -13
  750. data/spec/mongo/server_selector/secondary_preferred_spec.rb +125 -29
  751. data/spec/mongo/server_selector/secondary_spec.rb +102 -22
  752. data/spec/mongo/server_selector_spec.rb +325 -4
  753. data/spec/mongo/server_spec.rb +315 -76
  754. data/spec/mongo/session/server_session_spec.rb +62 -0
  755. data/spec/mongo/session/session_pool_spec.rb +272 -0
  756. data/spec/mongo/session_spec.rb +348 -0
  757. data/spec/mongo/session_transaction_spec.rb +206 -0
  758. data/spec/mongo/socket/ssl_spec.rb +742 -72
  759. data/spec/mongo/socket/tcp_spec.rb +17 -0
  760. data/spec/mongo/socket/unix_spec.rb +13 -9
  761. data/spec/mongo/socket_spec.rb +119 -0
  762. data/spec/mongo/srv/monitor_spec.rb +233 -0
  763. data/spec/mongo/srv/result_spec.rb +57 -0
  764. data/spec/mongo/timeout_spec.rb +42 -0
  765. data/spec/mongo/tls_context_hooks_spec.rb +40 -0
  766. data/spec/mongo/uri/srv_protocol_spec.rb +1108 -0
  767. data/spec/mongo/uri_option_parsing_spec.rb +625 -0
  768. data/spec/mongo/uri_spec.rb +514 -82
  769. data/spec/mongo/utils_spec.rb +56 -0
  770. data/spec/mongo/write_concern/acknowledged_spec.rb +14 -0
  771. data/spec/mongo/write_concern/unacknowledged_spec.rb +14 -0
  772. data/spec/mongo/write_concern_spec.rb +90 -4
  773. data/spec/runners/auth.rb +140 -0
  774. data/spec/runners/change_streams/outcome.rb +45 -0
  775. data/spec/runners/change_streams/spec.rb +60 -0
  776. data/spec/runners/change_streams/test.rb +232 -0
  777. data/spec/runners/cmap/verifier.rb +48 -0
  778. data/spec/runners/cmap.rb +373 -0
  779. data/spec/runners/command_monitoring.rb +346 -0
  780. data/spec/runners/connection_string.rb +385 -0
  781. data/spec/runners/crud/context.rb +30 -0
  782. data/spec/runners/crud/operation.rb +471 -0
  783. data/spec/runners/crud/outcome.rb +56 -0
  784. data/spec/runners/crud/requirement.rb +134 -0
  785. data/spec/runners/crud/spec.rb +73 -0
  786. data/spec/runners/crud/test.rb +123 -0
  787. data/spec/runners/crud/test_base.rb +53 -0
  788. data/spec/runners/crud/verifier.rb +217 -0
  789. data/spec/runners/crud.rb +257 -0
  790. data/spec/runners/gridfs.rb +641 -0
  791. data/spec/runners/read_write_concern_document.rb +70 -0
  792. data/spec/runners/sdam/verifier.rb +112 -0
  793. data/spec/runners/sdam.rb +279 -0
  794. data/spec/runners/server_selection.rb +365 -0
  795. data/spec/runners/server_selection_rtt.rb +41 -0
  796. data/spec/runners/transactions/operation.rb +328 -0
  797. data/spec/runners/transactions/spec.rb +29 -0
  798. data/spec/runners/transactions/test.rb +326 -0
  799. data/spec/runners/transactions.rb +104 -0
  800. data/spec/runners/unified/assertions.rb +281 -0
  801. data/spec/runners/unified/change_stream_operations.rb +29 -0
  802. data/spec/runners/unified/crud_operations.rb +206 -0
  803. data/spec/runners/unified/ddl_operations.rb +106 -0
  804. data/spec/runners/unified/entity_map.rb +42 -0
  805. data/spec/runners/unified/error.rb +28 -0
  806. data/spec/runners/unified/event_subscriber.rb +104 -0
  807. data/spec/runners/unified/exceptions.rb +24 -0
  808. data/spec/runners/unified/grid_fs_operations.rb +58 -0
  809. data/spec/runners/unified/support_operations.rb +261 -0
  810. data/spec/runners/unified/test.rb +426 -0
  811. data/spec/runners/unified/test_group.rb +31 -0
  812. data/spec/runners/unified.rb +99 -0
  813. data/spec/shared/LICENSE +20 -0
  814. data/spec/shared/bin/get-mongodb-download-url +17 -0
  815. data/spec/shared/bin/s3-copy +45 -0
  816. data/spec/shared/bin/s3-upload +69 -0
  817. data/spec/shared/lib/mrss/child_process_helper.rb +80 -0
  818. data/spec/shared/lib/mrss/cluster_config.rb +231 -0
  819. data/spec/shared/lib/mrss/constraints.rb +385 -0
  820. data/spec/shared/lib/mrss/docker_runner.rb +271 -0
  821. data/spec/shared/lib/mrss/event_subscriber.rb +200 -0
  822. data/spec/shared/lib/mrss/lite_constraints.rb +191 -0
  823. data/spec/shared/lib/mrss/server_version_registry.rb +120 -0
  824. data/spec/shared/lib/mrss/spec_organizer.rb +179 -0
  825. data/spec/shared/lib/mrss/utils.rb +15 -0
  826. data/spec/shared/share/Dockerfile.erb +323 -0
  827. data/spec/shared/share/haproxy-1.conf +16 -0
  828. data/spec/shared/share/haproxy-2.conf +17 -0
  829. data/spec/shared/shlib/distro.sh +73 -0
  830. data/spec/shared/shlib/server.sh +367 -0
  831. data/spec/shared/shlib/set_env.sh +131 -0
  832. data/spec/solo/clean_exit_spec.rb +24 -0
  833. data/spec/spec_helper.rb +20 -175
  834. data/spec/spec_tests/auth_spec.rb +58 -0
  835. data/spec/spec_tests/change_streams_spec.rb +93 -0
  836. data/spec/spec_tests/change_streams_unified_spec.rb +13 -0
  837. data/spec/spec_tests/client_side_encryption_spec.rb +14 -0
  838. data/spec/spec_tests/cmap_spec.rb +112 -0
  839. data/spec/spec_tests/collection_management_spec.rb +13 -0
  840. data/spec/spec_tests/command_monitoring_spec.rb +71 -0
  841. data/spec/spec_tests/command_monitoring_unified_spec.rb +13 -0
  842. data/spec/spec_tests/connection_string_spec.rb +10 -0
  843. data/spec/spec_tests/crud_spec.rb +22 -0
  844. data/spec/spec_tests/crud_unified_spec.rb +13 -0
  845. data/spec/spec_tests/data/auth/connection-string.yml +366 -0
  846. data/spec/spec_tests/data/change_streams/change-streams-errors.yml +101 -0
  847. data/spec/spec_tests/data/change_streams/change-streams-resume-allowlist.yml +1173 -0
  848. data/spec/spec_tests/data/change_streams/change-streams-resume-errorLabels.yml +1105 -0
  849. data/spec/spec_tests/data/change_streams/change-streams.yml +535 -0
  850. data/spec/spec_tests/data/change_streams_unified/change-streams.yml +72 -0
  851. data/spec/spec_tests/data/client_side_encryption/aggregate.yml +134 -0
  852. data/spec/spec_tests/data/client_side_encryption/badQueries.yml +526 -0
  853. data/spec/spec_tests/data/client_side_encryption/badSchema.yml +73 -0
  854. data/spec/spec_tests/data/client_side_encryption/basic.yml +116 -0
  855. data/spec/spec_tests/data/client_side_encryption/bulk.yml +88 -0
  856. data/spec/spec_tests/data/client_side_encryption/bypassAutoEncryption.yml +100 -0
  857. data/spec/spec_tests/data/client_side_encryption/bypassedCommand.yml +42 -0
  858. data/spec/spec_tests/data/client_side_encryption/count.yml +61 -0
  859. data/spec/spec_tests/data/client_side_encryption/countDocuments.yml +59 -0
  860. data/spec/spec_tests/data/client_side_encryption/delete.yml +105 -0
  861. data/spec/spec_tests/data/client_side_encryption/distinct.yml +73 -0
  862. data/spec/spec_tests/data/client_side_encryption/explain.yml +64 -0
  863. data/spec/spec_tests/data/client_side_encryption/find.yml +119 -0
  864. data/spec/spec_tests/data/client_side_encryption/findOneAndDelete.yml +57 -0
  865. data/spec/spec_tests/data/client_side_encryption/findOneAndReplace.yml +57 -0
  866. data/spec/spec_tests/data/client_side_encryption/findOneAndUpdate.yml +57 -0
  867. data/spec/spec_tests/data/client_side_encryption/getMore.yml +68 -0
  868. data/spec/spec_tests/data/client_side_encryption/insert.yml +102 -0
  869. data/spec/spec_tests/data/client_side_encryption/keyAltName.yml +71 -0
  870. data/spec/spec_tests/data/client_side_encryption/localKMS.yml +54 -0
  871. data/spec/spec_tests/data/client_side_encryption/localSchema.yml +72 -0
  872. data/spec/spec_tests/data/client_side_encryption/malformedCiphertext.yml +69 -0
  873. data/spec/spec_tests/data/client_side_encryption/maxWireVersion.yml +20 -0
  874. data/spec/spec_tests/data/client_side_encryption/missingKey.yml +49 -0
  875. data/spec/spec_tests/data/client_side_encryption/replaceOne.yml +64 -0
  876. data/spec/spec_tests/data/client_side_encryption/types.yml +527 -0
  877. data/spec/spec_tests/data/client_side_encryption/unsupportedCommand.yml +25 -0
  878. data/spec/spec_tests/data/client_side_encryption/updateMany.yml +77 -0
  879. data/spec/spec_tests/data/client_side_encryption/updateOne.yml +171 -0
  880. data/spec/spec_tests/data/cmap/connection-must-have-id.yml +27 -0
  881. data/spec/spec_tests/data/cmap/connection-must-order-ids.yml +27 -0
  882. data/spec/spec_tests/data/cmap/pool-checkin-destroy-closed.yml +27 -0
  883. data/spec/spec_tests/data/cmap/pool-checkin-destroy-stale.yml +27 -0
  884. data/spec/spec_tests/data/cmap/pool-checkin-make-available.yml +24 -0
  885. data/spec/spec_tests/data/cmap/pool-checkin.yml +19 -0
  886. data/spec/spec_tests/data/cmap/pool-checkout-connection.yml +19 -0
  887. data/spec/spec_tests/data/cmap/pool-checkout-error-closed.yml +36 -0
  888. data/spec/spec_tests/data/cmap/pool-checkout-multiple.yml +37 -0
  889. data/spec/spec_tests/data/cmap/pool-checkout-no-idle.yml +35 -0
  890. data/spec/spec_tests/data/cmap/pool-checkout-no-stale.yml +33 -0
  891. data/spec/spec_tests/data/cmap/pool-close-destroy-conns.yml +28 -0
  892. data/spec/spec_tests/data/cmap/pool-close.yml +11 -0
  893. data/spec/spec_tests/data/cmap/pool-create-max-size.yml +71 -0
  894. data/spec/spec_tests/data/cmap/pool-create-min-size.yml +34 -0
  895. data/spec/spec_tests/data/cmap/pool-create-with-options.yml +21 -0
  896. data/spec/spec_tests/data/cmap/pool-create.yml +12 -0
  897. data/spec/spec_tests/data/cmap/wait-queue-fairness.yml +124 -0
  898. data/spec/spec_tests/data/cmap/wait-queue-timeout.yml +46 -0
  899. data/spec/spec_tests/data/collection_management/timeseries-collection.yml +129 -0
  900. data/spec/spec_tests/data/command_monitoring/bulkWrite.yml +49 -0
  901. data/spec/spec_tests/data/command_monitoring/command.yml +61 -0
  902. data/spec/{support → spec_tests/data}/command_monitoring/deleteMany.yml +0 -0
  903. data/spec/{support → spec_tests/data}/command_monitoring/deleteOne.yml +0 -0
  904. data/spec/spec_tests/data/command_monitoring/find.yml +266 -0
  905. data/spec/spec_tests/data/command_monitoring/insertMany.yml +75 -0
  906. data/spec/{support → spec_tests/data}/command_monitoring/insertOne.yml +0 -0
  907. data/spec/spec_tests/data/command_monitoring/unacknowledgedBulkWrite.yml +34 -0
  908. data/spec/spec_tests/data/command_monitoring/updateMany.yml +65 -0
  909. data/spec/spec_tests/data/command_monitoring/updateOne.yml +90 -0
  910. data/spec/spec_tests/data/command_monitoring_unified/redacted-commands.yml +340 -0
  911. data/spec/spec_tests/data/connection_string/invalid-uris.yml +261 -0
  912. data/spec/spec_tests/data/connection_string/valid-auth.yml +257 -0
  913. data/spec/spec_tests/data/connection_string/valid-db-with-dotted-name.yml +77 -0
  914. data/spec/{support/connection_string_tests → spec_tests/data/connection_string}/valid-host_identifiers.yml +0 -0
  915. data/spec/spec_tests/data/connection_string/valid-options.yml +17 -0
  916. data/spec/spec_tests/data/connection_string/valid-unix_socket-absolute.yml +197 -0
  917. data/spec/spec_tests/data/connection_string/valid-unix_socket-relative.yml +213 -0
  918. data/spec/spec_tests/data/connection_string/valid-warnings.yml +75 -0
  919. data/spec/spec_tests/data/crud/read/aggregate-collation.yml +18 -0
  920. data/spec/spec_tests/data/crud/read/aggregate-out.yml +44 -0
  921. data/spec/spec_tests/data/crud/read/aggregate.yml +21 -0
  922. data/spec/spec_tests/data/crud/read/count-collation.yml +26 -0
  923. data/spec/spec_tests/data/crud/read/count-empty.yml +29 -0
  924. data/spec/spec_tests/data/crud/read/count.yml +74 -0
  925. data/spec/spec_tests/data/crud/read/distinct-collation.yml +18 -0
  926. data/spec/spec_tests/data/crud/read/distinct.yml +32 -0
  927. data/spec/spec_tests/data/crud/read/find-collation.yml +16 -0
  928. data/spec/spec_tests/data/crud/read/find.yml +49 -0
  929. data/spec/spec_tests/data/crud/write/bulkWrite-arrayFilters.yml +45 -0
  930. data/spec/spec_tests/data/crud/write/bulkWrite-collation.yml +102 -0
  931. data/spec/spec_tests/data/crud/write/bulkWrite.yml +405 -0
  932. data/spec/spec_tests/data/crud/write/deleteMany-collation.yml +23 -0
  933. data/spec/spec_tests/data/crud/write/deleteMany.yml +35 -0
  934. data/spec/spec_tests/data/crud/write/deleteOne-collation.yml +23 -0
  935. data/spec/spec_tests/data/crud/write/deleteOne.yml +48 -0
  936. data/spec/spec_tests/data/crud/write/findOneAndDelete-collation.yml +24 -0
  937. data/spec/spec_tests/data/crud/write/findOneAndDelete.yml +53 -0
  938. data/spec/spec_tests/data/crud/write/findOneAndReplace-collation.yml +25 -0
  939. data/spec/spec_tests/data/crud/write/findOneAndReplace-upsert.yml +91 -0
  940. data/spec/spec_tests/data/crud/write/findOneAndReplace-upsert_pre_2.6.yml +88 -0
  941. data/spec/spec_tests/data/crud/write/findOneAndReplace.yml +113 -0
  942. data/spec/spec_tests/data/crud/write/findOneAndUpdate-arrayFilters.yml +69 -0
  943. data/spec/spec_tests/data/crud/write/findOneAndUpdate-collation.yml +28 -0
  944. data/spec/spec_tests/data/crud/write/findOneAndUpdate.yml +163 -0
  945. data/spec/spec_tests/data/crud/write/insertMany.yml +81 -0
  946. data/spec/spec_tests/data/crud/write/insertOne.yml +18 -0
  947. data/spec/spec_tests/data/crud/write/replaceOne-collation.yml +25 -0
  948. data/spec/spec_tests/data/crud/write/replaceOne-pre_2.6.yml +98 -0
  949. data/spec/spec_tests/data/crud/write/replaceOne-upsert.yml +48 -0
  950. data/spec/spec_tests/data/crud/write/replaceOne.yml +102 -0
  951. data/spec/spec_tests/data/crud/write/updateMany-arrayFilters.yml +66 -0
  952. data/spec/spec_tests/data/crud/write/updateMany-collation.yml +29 -0
  953. data/spec/spec_tests/data/crud/write/updateMany-pre_2.6.yml +86 -0
  954. data/spec/spec_tests/data/crud/write/updateMany.yml +87 -0
  955. data/spec/spec_tests/data/crud/write/updateOne-arrayFilters.yml +114 -0
  956. data/spec/spec_tests/data/crud/write/updateOne-collation.yml +26 -0
  957. data/spec/spec_tests/data/crud/write/updateOne-pre_2.6.yml +83 -0
  958. data/spec/spec_tests/data/crud/write/updateOne.yml +84 -0
  959. data/spec/spec_tests/data/crud_unified/estimatedDocumentCount.yml +267 -0
  960. data/spec/spec_tests/data/crud_unified/updateWithPipelines.yml +305 -0
  961. data/spec/spec_tests/data/crud_v2/aggregate-merge.yml +103 -0
  962. data/spec/spec_tests/data/crud_v2/aggregate-out-readConcern.yml +111 -0
  963. data/spec/spec_tests/data/crud_v2/bulkWrite-arrayFilters.yml +103 -0
  964. data/spec/spec_tests/data/crud_v2/bulkWrite-delete-hint-clientError.yml +63 -0
  965. data/spec/spec_tests/data/crud_v2/bulkWrite-delete-hint-serverError.yml +92 -0
  966. data/spec/spec_tests/data/crud_v2/bulkWrite-delete-hint.yml +103 -0
  967. data/spec/spec_tests/data/crud_v2/bulkWrite-update-hint-clientError.yml +90 -0
  968. data/spec/spec_tests/data/crud_v2/bulkWrite-update-hint-serverError.yml +147 -0
  969. data/spec/spec_tests/data/crud_v2/bulkWrite-update-hint.yml +164 -0
  970. data/spec/spec_tests/data/crud_v2/db-aggregate.yml +39 -0
  971. data/spec/spec_tests/data/crud_v2/deleteMany-hint-clientError.yml +43 -0
  972. data/spec/spec_tests/data/crud_v2/deleteMany-hint-serverError.yml +62 -0
  973. data/spec/spec_tests/data/crud_v2/deleteMany-hint.yml +58 -0
  974. data/spec/spec_tests/data/crud_v2/deleteOne-hint-clientError.yml +41 -0
  975. data/spec/spec_tests/data/crud_v2/deleteOne-hint-serverError.yml +60 -0
  976. data/spec/spec_tests/data/crud_v2/deleteOne-hint.yml +57 -0
  977. data/spec/spec_tests/data/crud_v2/find-allowdiskuse-clientError.yml +28 -0
  978. data/spec/spec_tests/data/crud_v2/find-allowdiskuse-serverError.yml +44 -0
  979. data/spec/spec_tests/data/crud_v2/find-allowdiskuse.yml +50 -0
  980. data/spec/spec_tests/data/crud_v2/findOneAndDelete-hint-clientError.yml +45 -0
  981. data/spec/spec_tests/data/crud_v2/findOneAndDelete-hint-serverError.yml +60 -0
  982. data/spec/spec_tests/data/crud_v2/findOneAndDelete-hint.yml +56 -0
  983. data/spec/spec_tests/data/crud_v2/findOneAndReplace-hint-clientError.yml +40 -0
  984. data/spec/spec_tests/data/crud_v2/findOneAndReplace-hint-serverError.yml +59 -0
  985. data/spec/spec_tests/data/crud_v2/findOneAndReplace-hint.yml +55 -0
  986. data/spec/spec_tests/data/crud_v2/findOneAndUpdate-hint-clientError.yml +40 -0
  987. data/spec/spec_tests/data/crud_v2/findOneAndUpdate-hint-serverError.yml +58 -0
  988. data/spec/spec_tests/data/crud_v2/findOneAndUpdate-hint.yml +55 -0
  989. data/spec/spec_tests/data/crud_v2/replaceOne-hint.yml +61 -0
  990. data/spec/spec_tests/data/crud_v2/unacknowledged-bulkWrite-delete-hint-clientError.yml +60 -0
  991. data/spec/spec_tests/data/crud_v2/unacknowledged-bulkWrite-update-hint-clientError.yml +88 -0
  992. data/spec/spec_tests/data/crud_v2/unacknowledged-deleteMany-hint-clientError.yml +40 -0
  993. data/spec/spec_tests/data/crud_v2/unacknowledged-deleteOne-hint-clientError.yml +38 -0
  994. data/spec/spec_tests/data/crud_v2/unacknowledged-findOneAndDelete-hint-clientError.yml +42 -0
  995. data/spec/spec_tests/data/crud_v2/unacknowledged-findOneAndReplace-hint-clientError.yml +40 -0
  996. data/spec/spec_tests/data/crud_v2/unacknowledged-findOneAndUpdate-hint-clientError.yml +40 -0
  997. data/spec/spec_tests/data/crud_v2/unacknowledged-replaceOne-hint-clientError.yml +40 -0
  998. data/spec/spec_tests/data/crud_v2/unacknowledged-updateMany-hint-clientError.yml +43 -0
  999. data/spec/spec_tests/data/crud_v2/unacknowledged-updateOne-hint-clientError.yml +40 -0
  1000. data/spec/spec_tests/data/crud_v2/updateMany-hint-clientError.yml +45 -0
  1001. data/spec/spec_tests/data/crud_v2/updateMany-hint-serverError.yml +66 -0
  1002. data/spec/spec_tests/data/crud_v2/updateMany-hint.yml +65 -0
  1003. data/spec/spec_tests/data/crud_v2/updateOne-hint-clientError.yml +43 -0
  1004. data/spec/spec_tests/data/crud_v2/updateOne-hint-serverError.yml +62 -0
  1005. data/spec/spec_tests/data/crud_v2/updateOne-hint.yml +61 -0
  1006. data/spec/spec_tests/data/crud_v2/updateWithPipelines.yml +157 -0
  1007. data/spec/spec_tests/data/gridfs/delete.yml +123 -0
  1008. data/spec/spec_tests/data/gridfs/download.yml +192 -0
  1009. data/spec/{support/gridfs_tests → spec_tests/data/gridfs}/download_by_name.yml +0 -0
  1010. data/spec/{support/gridfs_tests → spec_tests/data/gridfs}/upload.yml +0 -0
  1011. data/spec/spec_tests/data/load_balancers/event-monitoring.yml +99 -0
  1012. data/spec/spec_tests/data/load_balancers/lb-connection-establishment.yml +36 -0
  1013. data/spec/spec_tests/data/load_balancers/non-lb-connection-establishment.yml +56 -0
  1014. data/spec/spec_tests/data/load_balancers/server-selection.yml +50 -0
  1015. data/spec/spec_tests/data/max_staleness/ReplicaSetNoPrimary/DefaultNoMaxStaleness.yml +26 -0
  1016. data/spec/spec_tests/data/max_staleness/ReplicaSetNoPrimary/Incompatible.yml +25 -0
  1017. data/spec/spec_tests/data/max_staleness/ReplicaSetNoPrimary/LastUpdateTime.yml +33 -0
  1018. data/spec/spec_tests/data/max_staleness/ReplicaSetNoPrimary/MaxStalenessTooSmall.yml +15 -0
  1019. data/spec/spec_tests/data/max_staleness/ReplicaSetNoPrimary/Nearest.yml +33 -0
  1020. data/spec/spec_tests/data/max_staleness/ReplicaSetNoPrimary/Nearest2.yml +33 -0
  1021. data/spec/spec_tests/data/max_staleness/ReplicaSetNoPrimary/NoKnownServers.yml +16 -0
  1022. data/spec/spec_tests/data/max_staleness/ReplicaSetNoPrimary/PrimaryPreferred.yml +27 -0
  1023. data/spec/spec_tests/data/max_staleness/ReplicaSetNoPrimary/PrimaryPreferred_tags.yml +36 -0
  1024. data/spec/spec_tests/data/max_staleness/ReplicaSetNoPrimary/Secondary.yml +51 -0
  1025. data/spec/spec_tests/data/max_staleness/ReplicaSetNoPrimary/SecondaryPreferred.yml +26 -0
  1026. data/spec/spec_tests/data/max_staleness/ReplicaSetNoPrimary/SecondaryPreferred_tags.yml +51 -0
  1027. data/spec/spec_tests/data/max_staleness/ReplicaSetNoPrimary/ZeroMaxStaleness.yml +23 -0
  1028. data/spec/spec_tests/data/max_staleness/ReplicaSetWithPrimary/DefaultNoMaxStaleness.yml +26 -0
  1029. data/spec/spec_tests/data/max_staleness/ReplicaSetWithPrimary/Incompatible.yml +25 -0
  1030. data/spec/spec_tests/data/max_staleness/ReplicaSetWithPrimary/LastUpdateTime.yml +35 -0
  1031. data/spec/spec_tests/data/max_staleness/ReplicaSetWithPrimary/LongHeartbeat.yml +29 -0
  1032. data/spec/spec_tests/data/max_staleness/ReplicaSetWithPrimary/LongHeartbeat2.yml +25 -0
  1033. data/spec/spec_tests/data/max_staleness/ReplicaSetWithPrimary/MaxStalenessTooSmall.yml +26 -0
  1034. data/spec/spec_tests/data/max_staleness/ReplicaSetWithPrimary/MaxStalenessWithModePrimary.yml +23 -0
  1035. data/spec/spec_tests/data/max_staleness/ReplicaSetWithPrimary/Nearest.yml +33 -0
  1036. data/spec/spec_tests/data/max_staleness/ReplicaSetWithPrimary/Nearest2.yml +33 -0
  1037. data/spec/spec_tests/data/max_staleness/ReplicaSetWithPrimary/Nearest_tags.yml +36 -0
  1038. data/spec/spec_tests/data/max_staleness/ReplicaSetWithPrimary/PrimaryPreferred.yml +27 -0
  1039. data/spec/spec_tests/data/max_staleness/ReplicaSetWithPrimary/PrimaryPreferred_incompatible.yml +27 -0
  1040. data/spec/spec_tests/data/max_staleness/ReplicaSetWithPrimary/SecondaryPreferred.yml +26 -0
  1041. data/spec/spec_tests/data/max_staleness/ReplicaSetWithPrimary/SecondaryPreferred_tags.yml +59 -0
  1042. data/spec/spec_tests/data/max_staleness/ReplicaSetWithPrimary/SecondaryPreferred_tags2.yml +43 -0
  1043. data/spec/spec_tests/data/max_staleness/ReplicaSetWithPrimary/Secondary_tags.yml +59 -0
  1044. data/spec/spec_tests/data/max_staleness/ReplicaSetWithPrimary/Secondary_tags2.yml +43 -0
  1045. data/spec/spec_tests/data/max_staleness/ReplicaSetWithPrimary/ZeroMaxStaleness.yml +23 -0
  1046. data/spec/spec_tests/data/max_staleness/Sharded/Incompatible.yml +25 -0
  1047. data/spec/spec_tests/data/max_staleness/Sharded/SmallMaxStaleness.yml +28 -0
  1048. data/spec/spec_tests/data/max_staleness/Single/Incompatible.yml +18 -0
  1049. data/spec/spec_tests/data/max_staleness/Single/SmallMaxStaleness.yml +20 -0
  1050. data/spec/spec_tests/data/max_staleness/Unknown/SmallMaxStaleness.yml +15 -0
  1051. data/spec/spec_tests/data/read_write_concern/connection-string/read-concern.yml +32 -0
  1052. data/spec/spec_tests/data/read_write_concern/connection-string/write-concern.yml +79 -0
  1053. data/spec/spec_tests/data/read_write_concern/document/read-concern.yml +37 -0
  1054. data/spec/spec_tests/data/read_write_concern/document/write-concern.yml +100 -0
  1055. data/spec/spec_tests/data/read_write_concern/operation/default-write-concern-2.6.yml +215 -0
  1056. data/spec/spec_tests/data/read_write_concern/operation/default-write-concern-3.2.yml +58 -0
  1057. data/spec/spec_tests/data/read_write_concern/operation/default-write-concern-3.4.yml +95 -0
  1058. data/spec/spec_tests/data/read_write_concern/operation/default-write-concern-4.2.yml +36 -0
  1059. data/spec/spec_tests/data/retryable_reads/aggregate-merge.yml +39 -0
  1060. data/spec/spec_tests/data/retryable_reads/aggregate-serverErrors.yml +157 -0
  1061. data/spec/spec_tests/data/retryable_reads/aggregate.yml +87 -0
  1062. data/spec/spec_tests/data/retryable_reads/changeStreams-client.watch-serverErrors.yml +150 -0
  1063. data/spec/spec_tests/data/retryable_reads/changeStreams-client.watch.yml +62 -0
  1064. data/spec/spec_tests/data/retryable_reads/changeStreams-db.coll.watch-serverErrors.yml +150 -0
  1065. data/spec/spec_tests/data/retryable_reads/changeStreams-db.coll.watch.yml +66 -0
  1066. data/spec/spec_tests/data/retryable_reads/changeStreams-db.watch-serverErrors.yml +154 -0
  1067. data/spec/spec_tests/data/retryable_reads/changeStreams-db.watch.yml +62 -0
  1068. data/spec/spec_tests/data/retryable_reads/count-serverErrors.yml +150 -0
  1069. data/spec/spec_tests/data/retryable_reads/count.yml +64 -0
  1070. data/spec/spec_tests/data/retryable_reads/countDocuments-serverErrors.yml +150 -0
  1071. data/spec/spec_tests/data/retryable_reads/countDocuments.yml +64 -0
  1072. data/spec/spec_tests/data/retryable_reads/distinct-serverErrors.yml +156 -0
  1073. data/spec/spec_tests/data/retryable_reads/distinct.yml +71 -0
  1074. data/spec/spec_tests/data/retryable_reads/estimatedDocumentCount-4.9.yml +60 -0
  1075. data/spec/spec_tests/data/retryable_reads/estimatedDocumentCount-pre4.9.yml +64 -0
  1076. data/spec/spec_tests/data/retryable_reads/estimatedDocumentCount-serverErrors-4.9.yml +146 -0
  1077. data/spec/spec_tests/data/retryable_reads/estimatedDocumentCount-serverErrors-pre4.9.yml +150 -0
  1078. data/spec/spec_tests/data/retryable_reads/find-serverErrors.yml +160 -0
  1079. data/spec/spec_tests/data/retryable_reads/find.yml +86 -0
  1080. data/spec/spec_tests/data/retryable_reads/findOne-serverErrors.yml +154 -0
  1081. data/spec/spec_tests/data/retryable_reads/findOne.yml +68 -0
  1082. data/spec/spec_tests/data/retryable_reads/gridfs-download-serverErrors.yml +173 -0
  1083. data/spec/spec_tests/data/retryable_reads/gridfs-download.yml +79 -0
  1084. data/spec/spec_tests/data/retryable_reads/gridfs-downloadByName-serverErrors.yml +174 -0
  1085. data/spec/spec_tests/data/retryable_reads/gridfs-downloadByName.yml +79 -0
  1086. data/spec/spec_tests/data/retryable_reads/listCollectionNames-serverErrors.yml +143 -0
  1087. data/spec/spec_tests/data/retryable_reads/listCollectionNames.yml +59 -0
  1088. data/spec/spec_tests/data/retryable_reads/listCollectionObjects-serverErrors.yml +144 -0
  1089. data/spec/spec_tests/data/retryable_reads/listCollectionObjects.yml +59 -0
  1090. data/spec/spec_tests/data/retryable_reads/listCollections-serverErrors.yml +143 -0
  1091. data/spec/spec_tests/data/retryable_reads/listCollections.yml +59 -0
  1092. data/spec/spec_tests/data/retryable_reads/listDatabaseNames-serverErrors.yml +143 -0
  1093. data/spec/spec_tests/data/retryable_reads/listDatabaseNames.yml +59 -0
  1094. data/spec/spec_tests/data/retryable_reads/listDatabaseObjects-serverErrors.yml +144 -0
  1095. data/spec/spec_tests/data/retryable_reads/listDatabaseObjects.yml +59 -0
  1096. data/spec/spec_tests/data/retryable_reads/listDatabases-serverErrors.yml +144 -0
  1097. data/spec/spec_tests/data/retryable_reads/listDatabases.yml +59 -0
  1098. data/spec/spec_tests/data/retryable_reads/listIndexNames-serverErrors.yml +144 -0
  1099. data/spec/spec_tests/data/retryable_reads/listIndexNames.yml +60 -0
  1100. data/spec/spec_tests/data/retryable_reads/listIndexes-serverErrors.yml +145 -0
  1101. data/spec/spec_tests/data/retryable_reads/listIndexes.yml +60 -0
  1102. data/spec/spec_tests/data/retryable_reads/mapReduce.yml +62 -0
  1103. data/spec/spec_tests/data/retryable_writes/bulkWrite-errorLabels.yml +77 -0
  1104. data/spec/spec_tests/data/retryable_writes/bulkWrite-serverErrors.yml +130 -0
  1105. data/spec/spec_tests/data/retryable_writes/bulkWrite.yml +402 -0
  1106. data/spec/spec_tests/data/retryable_writes/deleteMany.yml +22 -0
  1107. data/spec/spec_tests/data/retryable_writes/deleteOne-errorLabels.yml +48 -0
  1108. data/spec/spec_tests/data/retryable_writes/deleteOne-serverErrors.yml +73 -0
  1109. data/spec/spec_tests/data/retryable_writes/deleteOne.yml +57 -0
  1110. data/spec/spec_tests/data/retryable_writes/findOneAndDelete-errorLabels.yml +49 -0
  1111. data/spec/spec_tests/data/retryable_writes/findOneAndDelete-serverErrors.yml +74 -0
  1112. data/spec/spec_tests/data/retryable_writes/findOneAndDelete.yml +58 -0
  1113. data/spec/spec_tests/data/retryable_writes/findOneAndReplace-errorLabels.yml +52 -0
  1114. data/spec/spec_tests/data/retryable_writes/findOneAndReplace-serverErrors.yml +80 -0
  1115. data/spec/spec_tests/data/retryable_writes/findOneAndReplace.yml +63 -0
  1116. data/spec/spec_tests/data/retryable_writes/findOneAndUpdate-errorLabels.yml +52 -0
  1117. data/spec/spec_tests/data/retryable_writes/findOneAndUpdate-serverErrors.yml +79 -0
  1118. data/spec/spec_tests/data/retryable_writes/findOneAndUpdate.yml +62 -0
  1119. data/spec/spec_tests/data/retryable_writes/insertMany-errorLabels.yml +54 -0
  1120. data/spec/spec_tests/data/retryable_writes/insertMany-serverErrors.yml +84 -0
  1121. data/spec/spec_tests/data/retryable_writes/insertMany.yml +74 -0
  1122. data/spec/spec_tests/data/retryable_writes/insertOne-errorLabels.yml +44 -0
  1123. data/spec/spec_tests/data/retryable_writes/insertOne-serverErrors.yml +527 -0
  1124. data/spec/spec_tests/data/retryable_writes/insertOne.yml +61 -0
  1125. data/spec/spec_tests/data/retryable_writes/replaceOne-errorLabels.yml +53 -0
  1126. data/spec/spec_tests/data/retryable_writes/replaceOne-serverErrors.yml +82 -0
  1127. data/spec/spec_tests/data/retryable_writes/replaceOne.yml +66 -0
  1128. data/spec/spec_tests/data/retryable_writes/updateMany.yml +27 -0
  1129. data/spec/spec_tests/data/retryable_writes/updateOne-errorLabels.yml +53 -0
  1130. data/spec/spec_tests/data/retryable_writes/updateOne-serverErrors.yml +82 -0
  1131. data/spec/spec_tests/data/retryable_writes/updateOne.yml +129 -0
  1132. data/spec/spec_tests/data/sdam/errors/error_handling_handshake.yml +55 -0
  1133. data/spec/spec_tests/data/sdam/errors/non-stale-network-error.yml +47 -0
  1134. data/spec/spec_tests/data/sdam/errors/non-stale-network-timeout-error.yml +38 -0
  1135. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-greater-InterruptedAtShutdown.yml +61 -0
  1136. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-greater-InterruptedDueToReplStateChange.yml +61 -0
  1137. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-greater-LegacyNotPrimary.yml +61 -0
  1138. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-greater-NotPrimaryNoSecondaryOk.yml +61 -0
  1139. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-greater-NotPrimaryOrSecondary.yml +61 -0
  1140. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-greater-NotWritablePrimary.yml +61 -0
  1141. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-greater-PrimarySteppedDown.yml +61 -0
  1142. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-greater-ShutdownInProgress.yml +61 -0
  1143. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-missing-InterruptedAtShutdown.yml +52 -0
  1144. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-missing-InterruptedDueToReplStateChange.yml +52 -0
  1145. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-missing-LegacyNotPrimary.yml +52 -0
  1146. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-missing-NotPrimaryNoSecondaryOk.yml +52 -0
  1147. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-missing-NotPrimaryOrSecondary.yml +52 -0
  1148. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-missing-NotWritablePrimary.yml +52 -0
  1149. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-missing-PrimarySteppedDown.yml +52 -0
  1150. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-missing-ShutdownInProgress.yml +52 -0
  1151. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-proccessId-changed-InterruptedAtShutdown.yml +61 -0
  1152. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-proccessId-changed-InterruptedDueToReplStateChange.yml +61 -0
  1153. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-proccessId-changed-LegacyNotPrimary.yml +61 -0
  1154. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-proccessId-changed-NotPrimaryNoSecondaryOk.yml +61 -0
  1155. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-proccessId-changed-NotPrimaryOrSecondary.yml +61 -0
  1156. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-proccessId-changed-NotWritablePrimary.yml +61 -0
  1157. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-proccessId-changed-PrimarySteppedDown.yml +61 -0
  1158. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-proccessId-changed-ShutdownInProgress.yml +61 -0
  1159. data/spec/spec_tests/data/sdam/errors/post-42-InterruptedAtShutdown.yml +47 -0
  1160. data/spec/spec_tests/data/sdam/errors/post-42-InterruptedDueToReplStateChange.yml +47 -0
  1161. data/spec/spec_tests/data/sdam/errors/post-42-LegacyNotPrimary.yml +47 -0
  1162. data/spec/spec_tests/data/sdam/errors/post-42-NotPrimaryNoSecondaryOk.yml +47 -0
  1163. data/spec/spec_tests/data/sdam/errors/post-42-NotPrimaryOrSecondary.yml +47 -0
  1164. data/spec/spec_tests/data/sdam/errors/post-42-NotWritablePrimary.yml +47 -0
  1165. data/spec/spec_tests/data/sdam/errors/post-42-PrimarySteppedDown.yml +47 -0
  1166. data/spec/spec_tests/data/sdam/errors/post-42-ShutdownInProgress.yml +47 -0
  1167. data/spec/spec_tests/data/sdam/errors/pre-42-InterruptedAtShutdown.yml +47 -0
  1168. data/spec/spec_tests/data/sdam/errors/pre-42-InterruptedDueToReplStateChange.yml +47 -0
  1169. data/spec/spec_tests/data/sdam/errors/pre-42-LegacyNotPrimary.yml +47 -0
  1170. data/spec/spec_tests/data/sdam/errors/pre-42-NotPrimaryNoSecondaryOk.yml +47 -0
  1171. data/spec/spec_tests/data/sdam/errors/pre-42-NotPrimaryOrSecondary.yml +47 -0
  1172. data/spec/spec_tests/data/sdam/errors/pre-42-NotWritablePrimary.yml +47 -0
  1173. data/spec/spec_tests/data/sdam/errors/pre-42-PrimarySteppedDown.yml +47 -0
  1174. data/spec/spec_tests/data/sdam/errors/pre-42-ShutdownInProgress.yml +47 -0
  1175. data/spec/spec_tests/data/sdam/errors/prefer-error-code.yml +54 -0
  1176. data/spec/spec_tests/data/sdam/errors/stale-generation-InterruptedAtShutdown.yml +91 -0
  1177. data/spec/spec_tests/data/sdam/errors/stale-generation-InterruptedDueToReplStateChange.yml +91 -0
  1178. data/spec/spec_tests/data/sdam/errors/stale-generation-NotPrimaryNoSecondaryOk.yml +91 -0
  1179. data/spec/spec_tests/data/sdam/errors/stale-generation-NotPrimaryOrSecondary.yml +91 -0
  1180. data/spec/spec_tests/data/sdam/errors/stale-generation-NotWritablePrimary.yml +91 -0
  1181. data/spec/spec_tests/data/sdam/errors/stale-generation-PrimarySteppedDown.yml +91 -0
  1182. data/spec/spec_tests/data/sdam/errors/stale-generation-ShutdownInProgress.yml +91 -0
  1183. data/spec/spec_tests/data/sdam/errors/stale-generation-afterHandshakeCompletes-InterruptedAtShutdown.yml +91 -0
  1184. data/spec/spec_tests/data/sdam/errors/stale-generation-afterHandshakeCompletes-InterruptedDueToReplStateChange.yml +91 -0
  1185. data/spec/spec_tests/data/sdam/errors/stale-generation-afterHandshakeCompletes-LegacyNotPrimary.yml +91 -0
  1186. data/spec/spec_tests/data/sdam/errors/stale-generation-afterHandshakeCompletes-NotPrimaryNoSecondaryOk.yml +91 -0
  1187. data/spec/spec_tests/data/sdam/errors/stale-generation-afterHandshakeCompletes-NotPrimaryOrSecondary.yml +91 -0
  1188. data/spec/spec_tests/data/sdam/errors/stale-generation-afterHandshakeCompletes-NotWritablePrimary.yml +91 -0
  1189. data/spec/spec_tests/data/sdam/errors/stale-generation-afterHandshakeCompletes-PrimarySteppedDown.yml +91 -0
  1190. data/spec/spec_tests/data/sdam/errors/stale-generation-afterHandshakeCompletes-ShutdownInProgress.yml +91 -0
  1191. data/spec/spec_tests/data/sdam/errors/stale-generation-afterHandshakeCompletes-network.yml +82 -0
  1192. data/spec/spec_tests/data/sdam/errors/stale-generation-afterHandshakeCompletes-timeout.yml +82 -0
  1193. data/spec/spec_tests/data/sdam/errors/stale-generation-beforeHandshakeCompletes-InterruptedAtShutdown.yml +91 -0
  1194. data/spec/spec_tests/data/sdam/errors/stale-generation-beforeHandshakeCompletes-InterruptedDueToReplStateChange.yml +91 -0
  1195. data/spec/spec_tests/data/sdam/errors/stale-generation-beforeHandshakeCompletes-LegacyNotPrimary.yml +91 -0
  1196. data/spec/spec_tests/data/sdam/errors/stale-generation-beforeHandshakeCompletes-NotPrimaryNoSecondaryOk.yml +91 -0
  1197. data/spec/spec_tests/data/sdam/errors/stale-generation-beforeHandshakeCompletes-NotPrimaryOrSecondary.yml +91 -0
  1198. data/spec/spec_tests/data/sdam/errors/stale-generation-beforeHandshakeCompletes-NotWritablePrimary.yml +91 -0
  1199. data/spec/spec_tests/data/sdam/errors/stale-generation-beforeHandshakeCompletes-PrimarySteppedDown.yml +91 -0
  1200. data/spec/spec_tests/data/sdam/errors/stale-generation-beforeHandshakeCompletes-ShutdownInProgress.yml +91 -0
  1201. data/spec/spec_tests/data/sdam/errors/stale-generation-beforeHandshakeCompletes-network.yml +82 -0
  1202. data/spec/spec_tests/data/sdam/errors/stale-generation-beforeHandshakeCompletes-timeout.yml +82 -0
  1203. data/spec/spec_tests/data/sdam/errors/stale-topologyVersion-InterruptedAtShutdown.yml +65 -0
  1204. data/spec/spec_tests/data/sdam/errors/stale-topologyVersion-InterruptedDueToReplStateChange.yml +65 -0
  1205. data/spec/spec_tests/data/sdam/errors/stale-topologyVersion-LegacyNotPrimary.yml +65 -0
  1206. data/spec/spec_tests/data/sdam/errors/stale-topologyVersion-NotPrimaryNoSecondaryOk.yml +65 -0
  1207. data/spec/spec_tests/data/sdam/errors/stale-topologyVersion-NotPrimaryOrSecondary.yml +65 -0
  1208. data/spec/spec_tests/data/sdam/errors/stale-topologyVersion-NotWritablePrimary.yml +65 -0
  1209. data/spec/spec_tests/data/sdam/errors/stale-topologyVersion-PrimarySteppedDown.yml +65 -0
  1210. data/spec/spec_tests/data/sdam/errors/stale-topologyVersion-ShutdownInProgress.yml +65 -0
  1211. data/spec/spec_tests/data/sdam/errors/write_errors_ignored.yml +42 -0
  1212. data/spec/spec_tests/data/sdam/load-balanced/discover_load_balancer.yml +25 -0
  1213. data/spec/spec_tests/data/sdam/rs/compatible.yml +45 -0
  1214. data/spec/spec_tests/data/sdam/rs/compatible_unknown.yml +34 -0
  1215. data/spec/spec_tests/data/sdam/rs/discover_arbiters.yml +44 -0
  1216. data/spec/spec_tests/data/sdam/rs/discover_arbiters_replicaset.yml +44 -0
  1217. data/spec/spec_tests/data/sdam/rs/discover_ghost.yml +36 -0
  1218. data/spec/spec_tests/data/sdam/rs/discover_ghost_replicaset.yml +42 -0
  1219. data/spec/spec_tests/data/sdam/rs/discover_hidden.yml +51 -0
  1220. data/spec/spec_tests/data/sdam/rs/discover_hidden_replicaset.yml +51 -0
  1221. data/spec/spec_tests/data/sdam/rs/discover_passives.yml +83 -0
  1222. data/spec/spec_tests/data/sdam/rs/discover_passives_replicaset.yml +83 -0
  1223. data/spec/spec_tests/data/sdam/rs/discover_primary.yml +43 -0
  1224. data/spec/spec_tests/data/sdam/rs/discover_primary_replicaset.yml +43 -0
  1225. data/spec/spec_tests/data/sdam/rs/discover_rsother.yml +50 -0
  1226. data/spec/spec_tests/data/sdam/rs/discover_rsother_replicaset.yml +68 -0
  1227. data/spec/spec_tests/data/sdam/rs/discover_secondary.yml +44 -0
  1228. data/spec/spec_tests/data/sdam/rs/discover_secondary_replicaset.yml +44 -0
  1229. data/spec/spec_tests/data/sdam/rs/discovery.yml +207 -0
  1230. data/spec/spec_tests/data/sdam/rs/equal_electionids.yml +57 -0
  1231. data/spec/spec_tests/data/sdam/rs/hosts_differ_from_seeds.yml +37 -0
  1232. data/spec/spec_tests/data/sdam/rs/incompatible_arbiter.yml +36 -0
  1233. data/spec/spec_tests/data/sdam/rs/incompatible_ghost.yml +34 -0
  1234. data/spec/spec_tests/data/sdam/rs/incompatible_other.yml +36 -0
  1235. data/spec/spec_tests/data/sdam/rs/ls_timeout.yml +249 -0
  1236. data/spec/spec_tests/data/sdam/rs/member_reconfig.yml +74 -0
  1237. data/spec/spec_tests/data/sdam/rs/member_standalone.yml +66 -0
  1238. data/spec/spec_tests/data/sdam/rs/new_primary.yml +80 -0
  1239. data/spec/spec_tests/data/sdam/rs/new_primary_new_electionid.yml +119 -0
  1240. data/spec/spec_tests/data/sdam/rs/new_primary_new_setversion.yml +119 -0
  1241. data/spec/spec_tests/data/sdam/rs/new_primary_wrong_set_name.yml +77 -0
  1242. data/spec/spec_tests/data/sdam/rs/non_rs_member.yml +33 -0
  1243. data/spec/spec_tests/data/sdam/rs/normalize_case.yml +52 -0
  1244. data/spec/spec_tests/data/sdam/rs/normalize_case_me.yml +102 -0
  1245. data/spec/spec_tests/data/sdam/rs/null_election_id.yml +175 -0
  1246. data/spec/spec_tests/data/sdam/rs/primary_becomes_ghost.yml +65 -0
  1247. data/spec/spec_tests/data/sdam/rs/primary_becomes_mongos.yml +58 -0
  1248. data/spec/spec_tests/data/sdam/rs/primary_becomes_standalone.yml +55 -0
  1249. data/spec/spec_tests/data/sdam/rs/primary_changes_set_name.yml +63 -0
  1250. data/spec/spec_tests/data/sdam/rs/primary_disconnect.yml +59 -0
  1251. data/spec/spec_tests/data/sdam/rs/primary_disconnect_electionid.yml +189 -0
  1252. data/spec/spec_tests/data/sdam/rs/primary_disconnect_setversion.yml +189 -0
  1253. data/spec/spec_tests/data/sdam/rs/primary_hint_from_secondary_with_mismatched_me.yml +64 -0
  1254. data/spec/spec_tests/data/sdam/rs/primary_mismatched_me.yml +27 -0
  1255. data/spec/spec_tests/data/sdam/rs/primary_mismatched_me_not_removed.yml +75 -0
  1256. data/spec/spec_tests/data/sdam/rs/primary_reports_new_member.yml +175 -0
  1257. data/spec/spec_tests/data/sdam/rs/primary_to_no_primary_mismatched_me.yml +81 -0
  1258. data/spec/spec_tests/data/sdam/rs/primary_wrong_set_name.yml +30 -0
  1259. data/spec/spec_tests/data/sdam/rs/repeated.yml +105 -0
  1260. data/spec/spec_tests/data/sdam/rs/replicaset_rsnp.yml +21 -0
  1261. data/spec/spec_tests/data/sdam/rs/response_from_removed.yml +69 -0
  1262. data/spec/spec_tests/data/sdam/rs/ruby_primary_address_change.yml +31 -0
  1263. data/spec/spec_tests/data/sdam/rs/ruby_secondary_wrong_set_name_with_primary_second.yml +73 -0
  1264. data/spec/spec_tests/data/sdam/rs/sec_not_auth.yml +55 -0
  1265. data/spec/spec_tests/data/sdam/rs/secondary_ignore_ok_0.yml +87 -0
  1266. data/spec/spec_tests/data/sdam/rs/secondary_mismatched_me.yml +28 -0
  1267. data/spec/spec_tests/data/sdam/rs/secondary_wrong_set_name.yml +31 -0
  1268. data/spec/spec_tests/data/sdam/rs/secondary_wrong_set_name_with_primary.yml +75 -0
  1269. data/spec/spec_tests/data/sdam/rs/setversion_without_electionid.yml +79 -0
  1270. data/spec/spec_tests/data/sdam/rs/stepdown_change_set_name.yml +65 -0
  1271. data/spec/spec_tests/data/sdam/rs/too_new.yml +45 -0
  1272. data/spec/spec_tests/data/sdam/rs/too_old.yml +41 -0
  1273. data/spec/spec_tests/data/sdam/rs/topology_version_equal.yml +68 -0
  1274. data/spec/spec_tests/data/sdam/rs/topology_version_greater.yml +194 -0
  1275. data/spec/spec_tests/data/sdam/rs/topology_version_less.yml +64 -0
  1276. data/spec/spec_tests/data/sdam/rs/unexpected_mongos.yml +29 -0
  1277. data/spec/spec_tests/data/sdam/rs/use_setversion_without_electionid.yml +117 -0
  1278. data/spec/spec_tests/data/sdam/rs/wrong_set_name.yml +38 -0
  1279. data/spec/spec_tests/data/sdam/sharded/compatible.yml +40 -0
  1280. data/spec/spec_tests/data/sdam/sharded/discover_single_mongos.yml +24 -0
  1281. data/spec/spec_tests/data/sdam/sharded/ls_timeout_mongos.yml +101 -0
  1282. data/spec/spec_tests/data/sdam/sharded/mongos_disconnect.yml +113 -0
  1283. data/spec/spec_tests/data/sdam/sharded/multiple_mongoses.yml +52 -0
  1284. data/spec/spec_tests/data/sdam/sharded/non_mongos_removed.yml +47 -0
  1285. data/spec/spec_tests/data/sdam/sharded/normalize_uri_case.yml +32 -0
  1286. data/spec/spec_tests/data/sdam/sharded/ruby_primary_different_address.yml +21 -0
  1287. data/spec/spec_tests/data/sdam/sharded/ruby_primary_mismatched_me.yml +22 -0
  1288. data/spec/spec_tests/data/sdam/sharded/too_new.yml +38 -0
  1289. data/spec/spec_tests/data/sdam/sharded/too_old.yml +38 -0
  1290. data/spec/spec_tests/data/sdam/single/compatible.yml +27 -0
  1291. data/spec/spec_tests/data/sdam/single/direct_connection_external_ip.yml +37 -0
  1292. data/spec/spec_tests/data/sdam/single/direct_connection_mongos.yml +36 -0
  1293. data/spec/spec_tests/data/sdam/single/direct_connection_replicaset.yml +23 -0
  1294. data/spec/spec_tests/data/sdam/single/direct_connection_rsarbiter.yml +38 -0
  1295. data/spec/spec_tests/data/sdam/single/direct_connection_rsprimary.yml +37 -0
  1296. data/spec/spec_tests/data/sdam/single/direct_connection_rssecondary.yml +38 -0
  1297. data/spec/spec_tests/data/sdam/single/direct_connection_standalone.yml +35 -0
  1298. data/spec/spec_tests/data/sdam/single/direct_connection_unavailable_seed.yml +28 -0
  1299. data/spec/spec_tests/data/sdam/single/direct_connection_wrong_set_name.yml +40 -0
  1300. data/spec/spec_tests/data/sdam/single/discover_standalone.yml +35 -0
  1301. data/spec/spec_tests/data/sdam/single/discover_unavailable_seed.yml +28 -0
  1302. data/spec/spec_tests/data/sdam/single/ls_timeout_standalone.yml +36 -0
  1303. data/spec/spec_tests/data/sdam/single/not_ok_response.yml +44 -0
  1304. data/spec/spec_tests/data/sdam/single/ruby_primary_different_address.yml +24 -0
  1305. data/spec/spec_tests/data/sdam/single/ruby_primary_mismatched_me.yml +25 -0
  1306. data/spec/spec_tests/data/sdam/single/standalone_removed.yml +35 -0
  1307. data/spec/spec_tests/data/sdam/single/standalone_using_legacy_hello.yml +34 -0
  1308. data/spec/spec_tests/data/sdam/single/too_new.yml +27 -0
  1309. data/spec/spec_tests/data/sdam/single/too_old.yml +25 -0
  1310. data/spec/spec_tests/data/sdam/single/too_old_then_upgraded.yml +48 -0
  1311. data/spec/spec_tests/data/sdam_integration/cancel-server-check.yml +96 -0
  1312. data/spec/spec_tests/data/sdam_integration/connectTimeoutMS.yml +88 -0
  1313. data/spec/spec_tests/data/sdam_integration/find-network-error.yml +85 -0
  1314. data/spec/spec_tests/data/sdam_integration/find-shutdown-error.yml +118 -0
  1315. data/spec/spec_tests/data/sdam_integration/hello-command-error.yml +160 -0
  1316. data/spec/spec_tests/data/sdam_integration/hello-network-error.yml +158 -0
  1317. data/spec/spec_tests/data/sdam_integration/hello-timeout.yml +225 -0
  1318. data/spec/spec_tests/data/sdam_integration/insert-network-error.yml +88 -0
  1319. data/spec/spec_tests/data/sdam_integration/insert-shutdown-error.yml +117 -0
  1320. data/spec/spec_tests/data/sdam_integration/rediscover-quickly-after-step-down.yml +98 -0
  1321. data/spec/spec_tests/data/sdam_monitoring/discovered_standalone.yml +70 -0
  1322. data/spec/spec_tests/data/sdam_monitoring/load_balancer.yml +65 -0
  1323. data/spec/spec_tests/data/sdam_monitoring/replica_set_other_chain.yml +222 -0
  1324. data/spec/spec_tests/data/sdam_monitoring/replica_set_other_change.yml +225 -0
  1325. data/spec/spec_tests/data/sdam_monitoring/replica_set_primary_address_change.yml +251 -0
  1326. data/spec/spec_tests/data/sdam_monitoring/replica_set_with_me_mismatch.yml +111 -0
  1327. data/spec/spec_tests/data/sdam_monitoring/replica_set_with_no_primary.yml +113 -0
  1328. data/spec/spec_tests/data/sdam_monitoring/replica_set_with_primary.yml +112 -0
  1329. data/spec/spec_tests/data/sdam_monitoring/replica_set_with_primary_and_secondary.yml +198 -0
  1330. data/spec/spec_tests/data/sdam_monitoring/replica_set_with_primary_removal.yml +175 -0
  1331. data/spec/spec_tests/data/sdam_monitoring/replica_set_with_removal.yml +111 -0
  1332. data/spec/spec_tests/data/sdam_monitoring/replica_set_with_second_seed_removal.yml +106 -0
  1333. data/spec/spec_tests/data/sdam_monitoring/required_replica_set.yml +108 -0
  1334. data/spec/spec_tests/data/sdam_monitoring/standalone.yml +70 -0
  1335. data/spec/spec_tests/data/sdam_monitoring/standalone_repeated.yml +86 -0
  1336. data/spec/spec_tests/data/sdam_monitoring/standalone_suppress_equal_description_changes.yml +73 -0
  1337. data/spec/spec_tests/data/sdam_monitoring/standalone_to_rs_with_me_mismatch.yml +90 -0
  1338. data/spec/spec_tests/data/seed_list_discovery/load-balanced/loadBalanced-directConnection.yml +13 -0
  1339. data/spec/spec_tests/data/seed_list_discovery/load-balanced/loadBalanced-replicaSet-errors.yml +6 -0
  1340. data/spec/spec_tests/data/seed_list_discovery/load-balanced/loadBalanced-true-multiple-hosts.yml +5 -0
  1341. data/spec/spec_tests/data/seed_list_discovery/load-balanced/loadBalanced-true-txt.yml +10 -0
  1342. data/spec/spec_tests/data/seed_list_discovery/replica-set/direct-connection-false.yml +10 -0
  1343. data/spec/spec_tests/data/seed_list_discovery/replica-set/direct-connection-true.yml +5 -0
  1344. data/spec/spec_tests/data/seed_list_discovery/replica-set/encoded-userinfo-and-db.yml +15 -0
  1345. data/spec/spec_tests/data/seed_list_discovery/replica-set/loadBalanced-false-txt.yml +10 -0
  1346. data/spec/spec_tests/data/seed_list_discovery/replica-set/longer-parent-in-return.yml +11 -0
  1347. data/spec/spec_tests/data/seed_list_discovery/replica-set/misformatted-option.yml +5 -0
  1348. data/spec/spec_tests/data/seed_list_discovery/replica-set/no-results.yml +5 -0
  1349. data/spec/spec_tests/data/seed_list_discovery/replica-set/not-enough-parts.yml +5 -0
  1350. data/spec/spec_tests/data/seed_list_discovery/replica-set/one-result-default-port.yml +10 -0
  1351. data/spec/spec_tests/data/seed_list_discovery/replica-set/one-txt-record-multiple-strings.yml +10 -0
  1352. data/spec/spec_tests/data/seed_list_discovery/replica-set/one-txt-record.yml +11 -0
  1353. data/spec/spec_tests/data/seed_list_discovery/replica-set/parent-part-mismatch1.yml +5 -0
  1354. data/spec/spec_tests/data/seed_list_discovery/replica-set/parent-part-mismatch2.yml +5 -0
  1355. data/spec/spec_tests/data/seed_list_discovery/replica-set/parent-part-mismatch3.yml +5 -0
  1356. data/spec/spec_tests/data/seed_list_discovery/replica-set/parent-part-mismatch4.yml +5 -0
  1357. data/spec/spec_tests/data/seed_list_discovery/replica-set/parent-part-mismatch5.yml +5 -0
  1358. data/spec/spec_tests/data/seed_list_discovery/replica-set/returned-parent-too-short.yml +5 -0
  1359. data/spec/spec_tests/data/seed_list_discovery/replica-set/returned-parent-wrong.yml +5 -0
  1360. data/spec/spec_tests/data/seed_list_discovery/replica-set/two-results-default-port.yml +11 -0
  1361. data/spec/spec_tests/data/seed_list_discovery/replica-set/two-results-nonstandard-port.yml +11 -0
  1362. data/spec/spec_tests/data/seed_list_discovery/replica-set/two-txt-records.yml +5 -0
  1363. data/spec/spec_tests/data/seed_list_discovery/replica-set/txt-record-not-allowed-option.yml +5 -0
  1364. data/spec/spec_tests/data/seed_list_discovery/replica-set/txt-record-with-overridden-ssl-option.yml +11 -0
  1365. data/spec/spec_tests/data/seed_list_discovery/replica-set/txt-record-with-overridden-uri-option.yml +11 -0
  1366. data/spec/spec_tests/data/seed_list_discovery/replica-set/txt-record-with-unallowed-option.yml +5 -0
  1367. data/spec/spec_tests/data/seed_list_discovery/replica-set/uri-with-admin-database.yml +13 -0
  1368. data/spec/spec_tests/data/seed_list_discovery/replica-set/uri-with-auth.yml +12 -0
  1369. data/spec/spec_tests/data/seed_list_discovery/replica-set/uri-with-port.yml +5 -0
  1370. data/spec/spec_tests/data/seed_list_discovery/replica-set/uri-with-two-hosts.yml +5 -0
  1371. data/spec/spec_tests/data/server_selection/ReplicaSetNoPrimary/read/Nearest.yml +25 -0
  1372. data/spec/spec_tests/data/server_selection/ReplicaSetNoPrimary/read/Nearest_multiple.yml +26 -0
  1373. data/spec/spec_tests/data/server_selection/ReplicaSetNoPrimary/read/Nearest_non_matching.yml +20 -0
  1374. data/spec/spec_tests/data/server_selection/ReplicaSetNoPrimary/read/PossiblePrimary.yml +15 -0
  1375. data/spec/spec_tests/data/server_selection/ReplicaSetNoPrimary/read/PossiblePrimaryNearest.yml +15 -0
  1376. data/spec/spec_tests/data/server_selection/ReplicaSetNoPrimary/read/Primary.yml +18 -0
  1377. data/spec/spec_tests/data/server_selection/ReplicaSetNoPrimary/read/PrimaryPreferred.yml +25 -0
  1378. data/spec/spec_tests/data/server_selection/ReplicaSetNoPrimary/read/PrimaryPreferred_non_matching.yml +20 -0
  1379. data/spec/spec_tests/data/server_selection/ReplicaSetNoPrimary/read/Secondary.yml +25 -0
  1380. data/spec/spec_tests/data/server_selection/ReplicaSetNoPrimary/read/SecondaryPreferred.yml +25 -0
  1381. data/spec/spec_tests/data/server_selection/ReplicaSetNoPrimary/read/SecondaryPreferred_non_matching.yml +20 -0
  1382. data/spec/spec_tests/data/server_selection/ReplicaSetNoPrimary/read/Secondary_multi_tags.yml +31 -0
  1383. data/spec/spec_tests/data/server_selection/ReplicaSetNoPrimary/read/Secondary_multi_tags2.yml +31 -0
  1384. data/spec/spec_tests/data/server_selection/ReplicaSetNoPrimary/read/Secondary_non_matching.yml +20 -0
  1385. data/spec/spec_tests/data/server_selection/ReplicaSetWithPrimary/read/Nearest.yml +32 -0
  1386. data/spec/spec_tests/data/server_selection/ReplicaSetWithPrimary/read/Nearest_multiple.yml +33 -0
  1387. data/spec/spec_tests/data/server_selection/ReplicaSetWithPrimary/read/Nearest_non_matching.yml +25 -0
  1388. data/spec/spec_tests/data/server_selection/ReplicaSetWithPrimary/read/Primary.yml +26 -0
  1389. data/spec/spec_tests/data/server_selection/ReplicaSetWithPrimary/read/PrimaryPreferred.yml +28 -0
  1390. data/spec/spec_tests/data/server_selection/ReplicaSetWithPrimary/read/PrimaryPreferred_non_matching.yml +28 -0
  1391. data/spec/spec_tests/data/server_selection/ReplicaSetWithPrimary/read/Secondary.yml +30 -0
  1392. data/spec/spec_tests/data/server_selection/ReplicaSetWithPrimary/read/SecondaryPreferred.yml +30 -0
  1393. data/spec/spec_tests/data/server_selection/ReplicaSetWithPrimary/read/SecondaryPreferred_non_matching.yml +28 -0
  1394. data/spec/spec_tests/data/server_selection/ReplicaSetWithPrimary/read/SecondaryPreferred_tags.yml +28 -0
  1395. data/spec/spec_tests/data/server_selection/ReplicaSetWithPrimary/read/Secondary_non_matching.yml +25 -0
  1396. data/spec/spec_tests/data/server_selection/Sharded/read/Nearest.yml +21 -0
  1397. data/spec/spec_tests/data/server_selection/Sharded/read/Primary.yml +19 -0
  1398. data/spec/spec_tests/data/server_selection/Sharded/read/PrimaryPreferred.yml +21 -0
  1399. data/spec/spec_tests/data/server_selection/Sharded/read/Secondary.yml +21 -0
  1400. data/spec/spec_tests/data/server_selection/Sharded/read/SecondaryPreferred.yml +21 -0
  1401. data/spec/spec_tests/data/server_selection/Single/read/SecondaryPreferred.yml +18 -0
  1402. data/spec/spec_tests/data/server_selection/Unknown/read/SecondaryPreferred.yml +10 -0
  1403. data/spec/{support/server_selection/rtt → spec_tests/data/server_selection_rtt}/first_value.yml +0 -0
  1404. data/spec/{support/server_selection/rtt → spec_tests/data/server_selection_rtt}/first_value_zero.yml +0 -0
  1405. data/spec/{support/server_selection/rtt → spec_tests/data/server_selection_rtt}/value_test_1.yml +0 -0
  1406. data/spec/{support/server_selection/rtt → spec_tests/data/server_selection_rtt}/value_test_2.yml +0 -0
  1407. data/spec/{support/server_selection/rtt → spec_tests/data/server_selection_rtt}/value_test_3.yml +0 -0
  1408. data/spec/{support/server_selection/rtt → spec_tests/data/server_selection_rtt}/value_test_4.yml +0 -0
  1409. data/spec/{support/server_selection/rtt → spec_tests/data/server_selection_rtt}/value_test_5.yml +0 -0
  1410. data/spec/spec_tests/data/transactions/abort.yml +413 -0
  1411. data/spec/spec_tests/data/transactions/bulk.yml +267 -0
  1412. data/spec/spec_tests/data/transactions/causal-consistency.yml +175 -0
  1413. data/spec/spec_tests/data/transactions/commit.yml +603 -0
  1414. data/spec/spec_tests/data/transactions/count.yml +67 -0
  1415. data/spec/spec_tests/data/transactions/create-collection.yml +131 -0
  1416. data/spec/spec_tests/data/transactions/create-index.yml +152 -0
  1417. data/spec/spec_tests/data/transactions/delete.yml +192 -0
  1418. data/spec/spec_tests/data/transactions/error-labels.yml +1030 -0
  1419. data/spec/spec_tests/data/transactions/errors-client.yml +56 -0
  1420. data/spec/spec_tests/data/transactions/errors.yml +133 -0
  1421. data/spec/spec_tests/data/transactions/findOneAndDelete.yml +134 -0
  1422. data/spec/spec_tests/data/transactions/findOneAndReplace.yml +148 -0
  1423. data/spec/spec_tests/data/transactions/findOneAndUpdate.yml +236 -0
  1424. data/spec/spec_tests/data/transactions/insert.yml +390 -0
  1425. data/spec/spec_tests/data/transactions/isolation.yml +133 -0
  1426. data/spec/spec_tests/data/transactions/mongos-pin-auto.yml +1674 -0
  1427. data/spec/spec_tests/data/transactions/mongos-recovery-token.yml +350 -0
  1428. data/spec/spec_tests/data/transactions/pin-mongos.yml +559 -0
  1429. data/spec/spec_tests/data/transactions/read-concern.yml +623 -0
  1430. data/spec/spec_tests/data/transactions/read-pref.yml +348 -0
  1431. data/spec/spec_tests/data/transactions/reads.yml +261 -0
  1432. data/spec/spec_tests/data/transactions/retryable-abort-errorLabels.yml +126 -0
  1433. data/spec/spec_tests/data/transactions/retryable-abort.yml +1317 -0
  1434. data/spec/spec_tests/data/transactions/retryable-commit-errorLabels.yml +134 -0
  1435. data/spec/spec_tests/data/transactions/retryable-commit.yml +1462 -0
  1436. data/spec/spec_tests/data/transactions/retryable-writes.yml +218 -0
  1437. data/spec/spec_tests/data/transactions/run-command.yml +197 -0
  1438. data/spec/spec_tests/data/transactions/transaction-options-repl.yml +117 -0
  1439. data/spec/spec_tests/data/transactions/transaction-options.yml +781 -0
  1440. data/spec/spec_tests/data/transactions/update.yml +246 -0
  1441. data/spec/spec_tests/data/transactions/write-concern.yml +554 -0
  1442. data/spec/spec_tests/data/transactions_api/callback-aborts.yml +170 -0
  1443. data/spec/spec_tests/data/transactions_api/callback-commits.yml +204 -0
  1444. data/spec/spec_tests/data/transactions_api/callback-retry.yml +215 -0
  1445. data/spec/spec_tests/data/transactions_api/commit-retry.yml +324 -0
  1446. data/spec/spec_tests/data/transactions_api/commit-transienttransactionerror-4.2.yml +139 -0
  1447. data/spec/spec_tests/data/transactions_api/commit-transienttransactionerror.yml +175 -0
  1448. data/spec/spec_tests/data/transactions_api/commit-writeconcernerror.yml +216 -0
  1449. data/spec/spec_tests/data/transactions_api/commit.yml +193 -0
  1450. data/spec/spec_tests/data/transactions_api/transaction-options.yml +274 -0
  1451. data/spec/spec_tests/data/transactions_unified/mongos-unpin.yml +172 -0
  1452. data/spec/spec_tests/data/unified/valid-fail/operation-failure.yml +31 -0
  1453. data/spec/spec_tests/data/unified/valid-pass/poc-change-streams.yml +220 -0
  1454. data/spec/spec_tests/data/unified/valid-pass/poc-command-monitoring.yml +102 -0
  1455. data/spec/spec_tests/data/unified/valid-pass/poc-crud.yml +184 -0
  1456. data/spec/spec_tests/data/unified/valid-pass/poc-gridfs.yml +155 -0
  1457. data/spec/spec_tests/data/unified/valid-pass/poc-retryable-reads.yml +193 -0
  1458. data/spec/spec_tests/data/unified/valid-pass/poc-retryable-writes.yml +210 -0
  1459. data/spec/spec_tests/data/unified/valid-pass/poc-sessions.yml +215 -0
  1460. data/spec/spec_tests/data/unified/valid-pass/poc-transactions-convenient-api.yml +235 -0
  1461. data/spec/spec_tests/data/unified/valid-pass/poc-transactions-mongos-pin-auto.yml +169 -0
  1462. data/spec/spec_tests/data/unified/valid-pass/poc-transactions.yml +170 -0
  1463. data/spec/spec_tests/data/uri_options/auth-options.yml +49 -0
  1464. data/spec/spec_tests/data/uri_options/compression-options.yml +51 -0
  1465. data/spec/spec_tests/data/uri_options/concern-options.yml +55 -0
  1466. data/spec/spec_tests/data/uri_options/connection-options.yml +209 -0
  1467. data/spec/spec_tests/data/uri_options/connection-pool-options.yml +26 -0
  1468. data/spec/spec_tests/data/uri_options/read-preference-options.yml +66 -0
  1469. data/spec/spec_tests/data/uri_options/ruby-auth-options.yml +12 -0
  1470. data/spec/spec_tests/data/uri_options/ruby-connection-options.yml +58 -0
  1471. data/spec/spec_tests/data/uri_options/tls-options.yml +364 -0
  1472. data/spec/spec_tests/data/versioned_api/crud-api-version-1-strict.yml +417 -0
  1473. data/spec/spec_tests/data/versioned_api/crud-api-version-1.yml +411 -0
  1474. data/spec/spec_tests/data/versioned_api/runcommand-helper-no-api-version-declared.yml +75 -0
  1475. data/spec/spec_tests/data/versioned_api/test-commands-deprecation-errors.yml +47 -0
  1476. data/spec/spec_tests/data/versioned_api/test-commands-strict-mode.yml +46 -0
  1477. data/spec/spec_tests/data/versioned_api/transaction-handling.yml +128 -0
  1478. data/spec/spec_tests/gridfs_spec.rb +55 -0
  1479. data/spec/spec_tests/load_balancers_spec.rb +15 -0
  1480. data/spec/spec_tests/max_staleness_spec.rb +12 -0
  1481. data/spec/spec_tests/read_write_concern_connection_string_spec.rb +13 -0
  1482. data/spec/spec_tests/read_write_concern_document_spec.rb +77 -0
  1483. data/spec/spec_tests/read_write_concern_operaton_spec.rb +13 -0
  1484. data/spec/spec_tests/retryable_reads_spec.rb +50 -0
  1485. data/spec/spec_tests/retryable_writes_spec.rb +22 -0
  1486. data/spec/spec_tests/sdam_integration_spec.rb +16 -0
  1487. data/spec/spec_tests/sdam_monitoring_spec.rb +101 -0
  1488. data/spec/spec_tests/sdam_spec.rb +242 -0
  1489. data/spec/spec_tests/seed_list_discovery_spec.rb +118 -0
  1490. data/spec/spec_tests/server_selection_rtt_spec.rb +33 -0
  1491. data/spec/spec_tests/server_selection_spec.rb +12 -0
  1492. data/spec/spec_tests/transactions_api_spec.rb +13 -0
  1493. data/spec/spec_tests/transactions_spec.rb +13 -0
  1494. data/spec/spec_tests/transactions_unified_spec.rb +13 -0
  1495. data/spec/spec_tests/unified_spec.rb +18 -0
  1496. data/spec/spec_tests/uri_options_spec.rb +93 -0
  1497. data/spec/spec_tests/versioned_api_spec.rb +13 -0
  1498. data/spec/stress/cleanup_spec.rb +61 -0
  1499. data/spec/stress/connection_pool_stress_spec.rb +204 -0
  1500. data/spec/stress/connection_pool_timing_spec.rb +184 -0
  1501. data/spec/stress/fork_reconnect_stress_spec.rb +108 -0
  1502. data/spec/stress/push_monitor_close_spec.rb +44 -0
  1503. data/spec/support/authorization.rb +61 -153
  1504. data/spec/support/aws_utils/base.rb +137 -0
  1505. data/spec/support/aws_utils/inspector.rb +227 -0
  1506. data/spec/support/aws_utils/orchestrator.rb +373 -0
  1507. data/spec/support/aws_utils/provisioner.rb +363 -0
  1508. data/spec/support/aws_utils.rb +65 -0
  1509. data/spec/support/background_thread_registry.rb +70 -0
  1510. data/spec/support/certificates/README.md +106 -0
  1511. data/spec/support/certificates/atlas-ocsp-ca.crt +110 -0
  1512. data/spec/support/certificates/atlas-ocsp.crt +157 -0
  1513. data/spec/support/certificates/ca.crt +76 -0
  1514. data/spec/support/certificates/client-encrypted.key +30 -0
  1515. data/spec/support/certificates/client-int.crt +78 -0
  1516. data/spec/support/certificates/client-second-level-bundle.pem +179 -0
  1517. data/spec/support/certificates/client-second-level.crt +74 -0
  1518. data/spec/support/certificates/client-second-level.key +27 -0
  1519. data/spec/support/certificates/client-second-level.pem +101 -0
  1520. data/spec/support/certificates/client-x509.crt +78 -0
  1521. data/spec/support/certificates/client-x509.key +27 -0
  1522. data/spec/support/certificates/client-x509.pem +105 -0
  1523. data/spec/support/certificates/client.crt +74 -0
  1524. data/spec/support/certificates/client.key +27 -0
  1525. data/spec/support/certificates/client.pem +90 -90
  1526. data/spec/support/certificates/crl.pem +10 -8
  1527. data/spec/support/certificates/crl_client_revoked.pem +11 -10
  1528. data/spec/support/certificates/multi-ca.crt +152 -0
  1529. data/spec/support/certificates/python-ca.crt +76 -0
  1530. data/spec/support/certificates/server-int.crt +78 -0
  1531. data/spec/support/certificates/server-second-level-bundle.pem +179 -0
  1532. data/spec/support/certificates/server-second-level.crt +74 -0
  1533. data/spec/support/certificates/server-second-level.key +27 -0
  1534. data/spec/support/certificates/server-second-level.pem +101 -0
  1535. data/spec/support/certificates/server.pem +99 -32
  1536. data/spec/support/client_registry.rb +254 -0
  1537. data/spec/support/client_registry_macros.rb +26 -0
  1538. data/spec/support/cluster_tools.rb +379 -0
  1539. data/spec/support/common_shortcuts.rb +374 -0
  1540. data/spec/support/constraints.rb +19 -0
  1541. data/spec/support/crypt/corpus/corpus-key-aws.json +33 -0
  1542. data/spec/support/crypt/corpus/corpus-key-local.json +31 -0
  1543. data/spec/support/crypt/corpus/corpus-schema.json +2057 -0
  1544. data/spec/support/crypt/corpus/corpus.json +3657 -0
  1545. data/spec/support/crypt/corpus/corpus_encrypted.json +4152 -0
  1546. data/spec/support/crypt/data_keys/key_document_aws.json +34 -0
  1547. data/spec/support/crypt/data_keys/key_document_local.json +31 -0
  1548. data/spec/support/crypt/external/external-key.json +31 -0
  1549. data/spec/support/crypt/external/external-schema.json +19 -0
  1550. data/spec/support/crypt/limits/limits-doc.json +102 -0
  1551. data/spec/support/crypt/limits/limits-key.json +31 -0
  1552. data/spec/support/crypt/limits/limits-schema.json +1405 -0
  1553. data/spec/support/crypt/schema_maps/schema_map_aws.json +17 -0
  1554. data/spec/support/crypt/schema_maps/schema_map_aws_key_alt_names.json +12 -0
  1555. data/spec/support/crypt/schema_maps/schema_map_local.json +18 -0
  1556. data/spec/support/crypt/schema_maps/schema_map_local_key_alt_names.json +12 -0
  1557. data/spec/support/crypt.rb +157 -0
  1558. data/spec/support/dns.rb +16 -0
  1559. data/spec/support/json_ext_formatter.rb +16 -0
  1560. data/spec/support/keyword_struct.rb +29 -0
  1561. data/spec/support/local_resource_registry.rb +37 -0
  1562. data/spec/support/matchers.rb +52 -1
  1563. data/spec/support/monitoring_ext.rb +19 -0
  1564. data/spec/support/ocsp +1 -0
  1565. data/spec/support/primary_socket.rb +24 -0
  1566. data/spec/support/sdam_formatter_integration.rb +119 -0
  1567. data/spec/support/session_registry.rb +55 -0
  1568. data/spec/support/shared/app_metadata.rb +167 -0
  1569. data/spec/support/shared/auth_context.rb +16 -0
  1570. data/spec/support/shared/protocol.rb +5 -0
  1571. data/spec/support/shared/scram_conversation.rb +103 -0
  1572. data/spec/support/shared/server_selector.rb +119 -63
  1573. data/spec/support/shared/session.rb +910 -0
  1574. data/spec/support/spec_config.rb +636 -0
  1575. data/spec/support/spec_setup.rb +83 -0
  1576. data/spec/support/using_hash.rb +31 -0
  1577. data/spec/support/utils.rb +598 -0
  1578. data.tar.gz.sig +0 -0
  1579. metadata +2470 -519
  1580. metadata.gz.sig +2 -2
  1581. data/lib/csasl/csasl.bundle +0 -0
  1582. data/lib/mongo/cluster/cursor_reaper.rb +0 -174
  1583. data/lib/mongo/cluster/topology/replica_set.rb +0 -271
  1584. data/lib/mongo/collection/view/builder/find_command.rb +0 -136
  1585. data/lib/mongo/collection/view/builder/flags.rb +0 -62
  1586. data/lib/mongo/collection/view/builder/modifiers.rb +0 -80
  1587. data/lib/mongo/collection/view/builder/op_query.rb +0 -83
  1588. data/lib/mongo/cursor/builder/get_more_command.rb +0 -72
  1589. data/lib/mongo/cursor/builder/kill_cursors_command.rb +0 -90
  1590. data/lib/mongo/cursor/builder/op_get_more.rb +0 -61
  1591. data/lib/mongo/cursor/builder/op_kill_cursors.rb +0 -84
  1592. data/lib/mongo/cursor/builder.rb +0 -18
  1593. data/lib/mongo/event/description_changed.rb +0 -54
  1594. data/lib/mongo/event/primary_elected.rb +0 -53
  1595. data/lib/mongo/event/standalone_discovered.rb +0 -53
  1596. data/lib/mongo/operation/commands/aggregate/result.rb +0 -89
  1597. data/lib/mongo/operation/commands/aggregate.rb +0 -64
  1598. data/lib/mongo/operation/commands/collections_info/result.rb +0 -41
  1599. data/lib/mongo/operation/commands/collections_info.rb +0 -71
  1600. data/lib/mongo/operation/commands/command.rb +0 -47
  1601. data/lib/mongo/operation/commands/find/result.rb +0 -62
  1602. data/lib/mongo/operation/commands/find.rb +0 -27
  1603. data/lib/mongo/operation/commands/get_more/result.rb +0 -62
  1604. data/lib/mongo/operation/commands/get_more.rb +0 -27
  1605. data/lib/mongo/operation/commands/indexes.rb +0 -73
  1606. data/lib/mongo/operation/commands/list_collections/result.rb +0 -94
  1607. data/lib/mongo/operation/commands/list_collections.rb +0 -48
  1608. data/lib/mongo/operation/commands/list_indexes/result.rb +0 -98
  1609. data/lib/mongo/operation/commands/list_indexes.rb +0 -48
  1610. data/lib/mongo/operation/commands/map_reduce/result.rb +0 -119
  1611. data/lib/mongo/operation/commands/map_reduce.rb +0 -49
  1612. data/lib/mongo/operation/commands/parallel_scan/result.rb +0 -64
  1613. data/lib/mongo/operation/commands/parallel_scan.rb +0 -52
  1614. data/lib/mongo/operation/commands/user_query.rb +0 -72
  1615. data/lib/mongo/operation/commands/users_info/result.rb +0 -44
  1616. data/lib/mongo/operation/commands/users_info.rb +0 -48
  1617. data/lib/mongo/operation/commands.rb +0 -26
  1618. data/lib/mongo/operation/executable.rb +0 -42
  1619. data/lib/mongo/operation/limited.rb +0 -37
  1620. data/lib/mongo/operation/object_id_generator.rb +0 -36
  1621. data/lib/mongo/operation/read/get_more.rb +0 -52
  1622. data/lib/mongo/operation/read/query/result.rb +0 -40
  1623. data/lib/mongo/operation/read/query.rb +0 -55
  1624. data/lib/mongo/operation/read.rb +0 -16
  1625. data/lib/mongo/operation/read_preference.rb +0 -61
  1626. data/lib/mongo/operation/specifiable.rb +0 -473
  1627. data/lib/mongo/operation/write/bulk/bulkable.rb +0 -83
  1628. data/lib/mongo/operation/write/bulk/delete/result.rb +0 -71
  1629. data/lib/mongo/operation/write/bulk/delete.rb +0 -71
  1630. data/lib/mongo/operation/write/bulk/insert/result.rb +0 -129
  1631. data/lib/mongo/operation/write/bulk/insert.rb +0 -96
  1632. data/lib/mongo/operation/write/bulk/legacy_mergable.rb +0 -87
  1633. data/lib/mongo/operation/write/bulk/mergable.rb +0 -71
  1634. data/lib/mongo/operation/write/bulk/update/result.rb +0 -205
  1635. data/lib/mongo/operation/write/bulk/update.rb +0 -81
  1636. data/lib/mongo/operation/write/bulk.rb +0 -20
  1637. data/lib/mongo/operation/write/command/create_index.rb +0 -49
  1638. data/lib/mongo/operation/write/command/create_user.rb +0 -42
  1639. data/lib/mongo/operation/write/command/delete.rb +0 -56
  1640. data/lib/mongo/operation/write/command/drop_index.rb +0 -50
  1641. data/lib/mongo/operation/write/command/insert.rb +0 -66
  1642. data/lib/mongo/operation/write/command/remove_user.rb +0 -41
  1643. data/lib/mongo/operation/write/command/update.rb +0 -62
  1644. data/lib/mongo/operation/write/command/update_user.rb +0 -42
  1645. data/lib/mongo/operation/write/command/writable.rb +0 -57
  1646. data/lib/mongo/operation/write/command.rb +0 -23
  1647. data/lib/mongo/operation/write/create_index.rb +0 -67
  1648. data/lib/mongo/operation/write/create_user.rb +0 -50
  1649. data/lib/mongo/operation/write/delete/result.rb +0 -40
  1650. data/lib/mongo/operation/write/delete.rb +0 -71
  1651. data/lib/mongo/operation/write/drop_index.rb +0 -63
  1652. data/lib/mongo/operation/write/gle.rb +0 -49
  1653. data/lib/mongo/operation/write/idable.rb +0 -63
  1654. data/lib/mongo/operation/write/insert/result.rb +0 -62
  1655. data/lib/mongo/operation/write/insert.rb +0 -71
  1656. data/lib/mongo/operation/write/remove_user.rb +0 -48
  1657. data/lib/mongo/operation/write/update/result.rb +0 -160
  1658. data/lib/mongo/operation/write/update.rb +0 -81
  1659. data/lib/mongo/operation/write/update_user.rb +0 -50
  1660. data/lib/mongo/operation/write/write_command_enabled.rb +0 -54
  1661. data/lib/mongo/operation/write.rb +0 -27
  1662. data/lib/mongo/server/connectable.rb +0 -113
  1663. data/lib/mongo/server/connection_pool/queue.rb +0 -197
  1664. data/lib/mongo/server/context.rb +0 -69
  1665. data/lib/mongo/server/description/inspector/description_changed.rb +0 -57
  1666. data/lib/mongo/server/description/inspector/primary_elected.rb +0 -58
  1667. data/lib/mongo/server/description/inspector/standalone_discovered.rb +0 -56
  1668. data/lib/mongo/server/description/inspector.rb +0 -79
  1669. data/lib/mongo/server_selector/selectable.rb +0 -222
  1670. data/lib/mongo/write_concern/normalizable.rb +0 -52
  1671. data/spec/mongo/collection/view/builder/flags_spec.rb +0 -106
  1672. data/spec/mongo/collection/view/builder/modifiers_spec.rb +0 -210
  1673. data/spec/mongo/command_monitoring_spec.rb +0 -64
  1674. data/spec/mongo/connection_string_spec.rb +0 -115
  1675. data/spec/mongo/crud_spec.rb +0 -42
  1676. data/spec/mongo/gridfs_spec.rb +0 -50
  1677. data/spec/mongo/operation/commands/aggregate/result_spec.rb +0 -80
  1678. data/spec/mongo/operation/commands/aggregate_spec.rb +0 -72
  1679. data/spec/mongo/operation/commands/collections_info_spec.rb +0 -40
  1680. data/spec/mongo/operation/commands/command_spec.rb +0 -80
  1681. data/spec/mongo/operation/commands/indexes_spec.rb +0 -31
  1682. data/spec/mongo/operation/commands/map_reduce_spec.rb +0 -125
  1683. data/spec/mongo/operation/read/get_more_spec.rb +0 -53
  1684. data/spec/mongo/operation/read/query_spec.rb +0 -102
  1685. data/spec/mongo/operation/read_preference_spec.rb +0 -245
  1686. data/spec/mongo/operation/write/bulk/delete_spec.rb +0 -223
  1687. data/spec/mongo/operation/write/bulk/insert_spec.rb +0 -250
  1688. data/spec/mongo/operation/write/bulk/update_spec.rb +0 -220
  1689. data/spec/mongo/operation/write/command/delete_spec.rb +0 -106
  1690. data/spec/mongo/operation/write/command/insert_spec.rb +0 -105
  1691. data/spec/mongo/operation/write/command/update_spec.rb +0 -110
  1692. data/spec/mongo/operation/write/create_index_spec.rb +0 -63
  1693. data/spec/mongo/operation/write/create_user_spec.rb +0 -44
  1694. data/spec/mongo/operation/write/delete_spec.rb +0 -215
  1695. data/spec/mongo/operation/write/drop_index_spec.rb +0 -51
  1696. data/spec/mongo/operation/write/insert_spec.rb +0 -291
  1697. data/spec/mongo/operation/write/remove_user_spec.rb +0 -46
  1698. data/spec/mongo/operation/write/update_spec.rb +0 -256
  1699. data/spec/mongo/operation/write/update_user_spec.rb +0 -46
  1700. data/spec/mongo/server/connection_pool/queue_spec.rb +0 -190
  1701. data/spec/mongo/server/description/inspector/description_changed_spec.rb +0 -78
  1702. data/spec/mongo/server/description/inspector/primary_elected_spec.rb +0 -94
  1703. data/spec/mongo/server_discovery_and_monitoring_spec.rb +0 -115
  1704. data/spec/mongo/server_selection_rtt_spec.rb +0 -85
  1705. data/spec/mongo/server_selection_spec.rb +0 -90
  1706. data/spec/support/certificates/ca.pem +0 -17
  1707. data/spec/support/certificates/password_protected.pem +0 -51
  1708. data/spec/support/command_monitoring/bulkWrite.yml +0 -73
  1709. data/spec/support/command_monitoring/command.yml +0 -42
  1710. data/spec/support/command_monitoring/find.yml +0 -268
  1711. data/spec/support/command_monitoring/insertMany.yml +0 -81
  1712. data/spec/support/command_monitoring/updateMany.yml +0 -67
  1713. data/spec/support/command_monitoring/updateOne.yml +0 -95
  1714. data/spec/support/command_monitoring.rb +0 -376
  1715. data/spec/support/connection_string.rb +0 -228
  1716. data/spec/support/connection_string_tests/invalid-uris.yml +0 -193
  1717. data/spec/support/connection_string_tests/valid-auth.yml +0 -256
  1718. data/spec/support/connection_string_tests/valid-options.yml +0 -30
  1719. data/spec/support/connection_string_tests/valid-unix_socket-absolute.yml +0 -197
  1720. data/spec/support/connection_string_tests/valid-unix_socket-relative.yml +0 -213
  1721. data/spec/support/connection_string_tests/valid-warnings.yml +0 -55
  1722. data/spec/support/crud/read.rb +0 -164
  1723. data/spec/support/crud/write.rb +0 -243
  1724. data/spec/support/crud.rb +0 -211
  1725. data/spec/support/crud_tests/read/aggregate.yml +0 -43
  1726. data/spec/support/crud_tests/read/count.yml +0 -37
  1727. data/spec/support/crud_tests/read/distinct.yml +0 -33
  1728. data/spec/support/crud_tests/read/find.yml +0 -50
  1729. data/spec/support/crud_tests/write/deleteMany.yml +0 -36
  1730. data/spec/support/crud_tests/write/deleteOne.yml +0 -49
  1731. data/spec/support/crud_tests/write/findOneAndDelete.yml +0 -54
  1732. data/spec/support/crud_tests/write/findOneAndReplace.yml +0 -153
  1733. data/spec/support/crud_tests/write/findOneAndUpdate.yml +0 -161
  1734. data/spec/support/crud_tests/write/insertMany.yml +0 -24
  1735. data/spec/support/crud_tests/write/insertOne.yml +0 -19
  1736. data/spec/support/crud_tests/write/replaceOne.yml +0 -96
  1737. data/spec/support/crud_tests/write/updateMany.yml +0 -83
  1738. data/spec/support/crud_tests/write/updateOne.yml +0 -80
  1739. data/spec/support/gridfs.rb +0 -637
  1740. data/spec/support/gridfs_tests/delete.yml +0 -157
  1741. data/spec/support/gridfs_tests/download.yml +0 -210
  1742. data/spec/support/helpers.rb +0 -140
  1743. data/spec/support/sdam/rs/discover_arbiters.yml +0 -41
  1744. data/spec/support/sdam/rs/discover_passives.yml +0 -77
  1745. data/spec/support/sdam/rs/discover_primary.yml +0 -40
  1746. data/spec/support/sdam/rs/discover_secondary.yml +0 -41
  1747. data/spec/support/sdam/rs/discovery.yml +0 -195
  1748. data/spec/support/sdam/rs/equal_electionids.yml +0 -48
  1749. data/spec/support/sdam/rs/ghost_discovered.yml +0 -39
  1750. data/spec/support/sdam/rs/hosts_differ_from_seeds.yml +0 -34
  1751. data/spec/support/sdam/rs/member_reconfig.yml +0 -68
  1752. data/spec/support/sdam/rs/member_standalone.yml +0 -60
  1753. data/spec/support/sdam/rs/new_primary.yml +0 -74
  1754. data/spec/support/sdam/rs/new_primary_new_electionid.yml +0 -101
  1755. data/spec/support/sdam/rs/new_primary_new_setversion.yml +0 -101
  1756. data/spec/support/sdam/rs/new_primary_wrong_set_name.yml +0 -71
  1757. data/spec/support/sdam/rs/non_rs_member.yml +0 -31
  1758. data/spec/support/sdam/rs/normalize_case.yml +0 -49
  1759. data/spec/support/sdam/rs/null_election_id.yml +0 -151
  1760. data/spec/support/sdam/rs/primary_becomes_standalone.yml +0 -52
  1761. data/spec/support/sdam/rs/primary_changes_set_name.yml +0 -57
  1762. data/spec/support/sdam/rs/primary_disconnect.yml +0 -56
  1763. data/spec/support/sdam/rs/primary_disconnect_electionid.yml +0 -160
  1764. data/spec/support/sdam/rs/primary_disconnect_setversion.yml +0 -160
  1765. data/spec/support/sdam/rs/primary_mismatched_me.yml +0 -37
  1766. data/spec/support/sdam/rs/primary_reports_new_member.yml +0 -163
  1767. data/spec/support/sdam/rs/primary_to_no_primary_mismatched_me.yml +0 -75
  1768. data/spec/support/sdam/rs/primary_wrong_set_name.yml +0 -27
  1769. data/spec/support/sdam/rs/response_from_removed.yml +0 -63
  1770. data/spec/support/sdam/rs/rsother_discovered.yml +0 -62
  1771. data/spec/support/sdam/rs/sec_not_auth.yml +0 -49
  1772. data/spec/support/sdam/rs/secondary_mismatched_me.yml +0 -37
  1773. data/spec/support/sdam/rs/secondary_wrong_set_name.yml +0 -28
  1774. data/spec/support/sdam/rs/secondary_wrong_set_name_with_primary.yml +0 -69
  1775. data/spec/support/sdam/rs/set_version_without_electionid.yml +0 -69
  1776. data/spec/support/sdam/rs/setversion_without_electionid.yml +0 -69
  1777. data/spec/support/sdam/rs/stepdown_change_set_name.yml +0 -59
  1778. data/spec/support/sdam/rs/unexpected_mongos.yml +0 -26
  1779. data/spec/support/sdam/rs/use_setversion_without_electionid.yml +0 -99
  1780. data/spec/support/sdam/rs/wrong_set_name.yml +0 -35
  1781. data/spec/support/sdam/sharded/mongos_disconnect.yml +0 -104
  1782. data/spec/support/sdam/sharded/multiple_mongoses.yml +0 -46
  1783. data/spec/support/sdam/sharded/non_mongos_removed.yml +0 -41
  1784. data/spec/support/sdam/sharded/normalize_uri_case.yml +0 -32
  1785. data/spec/support/sdam/sharded/single_mongos.yml +0 -33
  1786. data/spec/support/sdam/single/direct_connection_external_ip.yml +0 -34
  1787. data/spec/support/sdam/single/direct_connection_mongos.yml +0 -33
  1788. data/spec/support/sdam/single/direct_connection_rsarbiter.yml +0 -35
  1789. data/spec/support/sdam/single/direct_connection_rsprimary.yml +0 -34
  1790. data/spec/support/sdam/single/direct_connection_rssecondary.yml +0 -35
  1791. data/spec/support/sdam/single/direct_connection_slave.yml +0 -32
  1792. data/spec/support/sdam/single/direct_connection_standalone.yml +0 -32
  1793. data/spec/support/sdam/single/not_ok_response.yml +0 -38
  1794. data/spec/support/sdam/single/standalone_removed.yml +0 -32
  1795. data/spec/support/sdam/single/unavailable_seed.yml +0 -28
  1796. data/spec/support/server_discovery_and_monitoring.rb +0 -186
  1797. data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/Nearest.yml +0 -26
  1798. data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/Nearest_non_matching.yml +0 -21
  1799. data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/Primary.yml +0 -21
  1800. data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/PrimaryPreferred.yml +0 -26
  1801. data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/PrimaryPreferred_non_matching.yml +0 -21
  1802. data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/Secondary.yml +0 -26
  1803. data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/SecondaryPreferred.yml +0 -26
  1804. data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/SecondaryPreferred_non_matching.yml +0 -21
  1805. data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/Secondary_non_matching.yml +0 -21
  1806. data/spec/support/server_selection/selection/ReplicaSetWithPrimary/read/Nearest.yml +0 -33
  1807. data/spec/support/server_selection/selection/ReplicaSetWithPrimary/read/Nearest_non_matching.yml +0 -26
  1808. data/spec/support/server_selection/selection/ReplicaSetWithPrimary/read/Primary.yml +0 -29
  1809. data/spec/support/server_selection/selection/ReplicaSetWithPrimary/read/PrimaryPreferred.yml +0 -29
  1810. data/spec/support/server_selection/selection/ReplicaSetWithPrimary/read/PrimaryPreferred_non_matching.yml +0 -29
  1811. data/spec/support/server_selection/selection/ReplicaSetWithPrimary/read/Secondary.yml +0 -31
  1812. data/spec/support/server_selection/selection/ReplicaSetWithPrimary/read/SecondaryPreferred.yml +0 -31
  1813. data/spec/support/server_selection/selection/ReplicaSetWithPrimary/read/SecondaryPreferred_non_matching.yml +0 -29
  1814. data/spec/support/server_selection/selection/ReplicaSetWithPrimary/read/Secondary_non_matching.yml +0 -26
  1815. data/spec/support/server_selection/selection/Sharded/read/SecondaryPreferred.yml +0 -26
  1816. data/spec/support/server_selection/selection/Single/read/SecondaryPreferred.yml +0 -19
  1817. data/spec/support/server_selection/selection/Unknown/read/SecondaryPreferred.yml +0 -11
  1818. data/spec/support/server_selection.rb +0 -135
  1819. data/spec/support/server_selection_rtt.rb +0 -41
  1820. data/spec/support/travis.rb +0 -14
@@ -1,29 +1,45 @@
1
+ # frozen_string_literal: true
2
+ # encoding: utf-8
3
+
1
4
  require 'spec_helper'
2
5
 
3
6
  describe Mongo::BulkWrite do
4
7
 
5
8
  before do
6
- authorized_collection.delete_many
9
+ authorized_collection.drop
7
10
  end
8
11
 
9
- after do
10
- authorized_collection.delete_many
11
- collection_with_validator.drop
12
+ let(:collection_invalid_write_concern) do
13
+ authorized_collection.client.with(write: INVALID_WRITE_CONCERN)[authorized_collection.name]
12
14
  end
13
15
 
14
- let(:collection_with_validator) do
15
- authorized_client[:validating,
16
- :validator => { :a => { '$exists' => true } }].tap do |c|
17
- c.create
18
- end
16
+ let(:collation) do
17
+ { locale: 'en_US', strength: 2 }
19
18
  end
20
19
 
21
- let(:collection_invalid_write_concern) do
22
- authorized_collection.client.with(write: { w: (WRITE_CONCERN[:w] + 1) })[authorized_collection.name]
20
+ let(:array_filters) do
21
+ [{ 'i.y' => 3}]
23
22
  end
24
23
 
25
- describe '#execute' do
24
+ let(:collection) do
25
+ authorized_collection
26
+ end
27
+
28
+ let(:client) do
29
+ authorized_client
30
+ end
26
31
 
32
+ shared_examples_for 'bulk write with write concern yielding operation failure' do
33
+ require_topology :single
34
+
35
+ it 'raises an OperationFailure' do
36
+ expect {
37
+ bulk_write_invalid_write_concern.execute
38
+ }.to raise_error(Mongo::Error::OperationFailure)
39
+ end
40
+ end
41
+
42
+ describe '#execute' do
27
43
  shared_examples_for 'an executable bulk write' do
28
44
 
29
45
  context 'when providing a bad operation' do
@@ -67,7 +83,24 @@ describe Mongo::BulkWrite do
67
83
  end
68
84
 
69
85
  it 'sets the document index on the error' do
70
- expect(error.result[Mongo::Error::WRITE_ERRORS].first['index']).to eq(2)
86
+ expect(error.result['writeErrors'].first['index']).to eq(2)
87
+ end
88
+
89
+ context 'when a session is provided' do
90
+
91
+ let(:extra_options) do
92
+ { session: session }
93
+ end
94
+
95
+ let(:client) do
96
+ authorized_client
97
+ end
98
+
99
+ let(:failed_operation) do
100
+ bulk_write.execute
101
+ end
102
+
103
+ it_behaves_like 'a failed operation using a session'
71
104
  end
72
105
  end
73
106
 
@@ -91,24 +124,42 @@ describe Mongo::BulkWrite do
91
124
  expect(authorized_collection.find.first['_id']).to eq(0)
92
125
  end
93
126
 
127
+ context 'when a session is provided' do
128
+
129
+ let(:operation) do
130
+ result
131
+ end
132
+
133
+ let(:extra_options) do
134
+ { session: session }
135
+ end
136
+
137
+ let(:client) do
138
+ authorized_client
139
+ end
140
+
141
+ it_behaves_like 'an operation using a session'
142
+ end
143
+
94
144
  context 'when there is a write concern error' do
95
145
 
96
- context 'when the server version is < 2.6' do
146
+ it_behaves_like 'bulk write with write concern yielding operation failure'
97
147
 
98
- it 'raises a BulkWriteError', if: !write_command_enabled? && standalone? do
99
- expect {
100
- bulk_write_invalid_write_concern.execute
101
- }.to raise_error(Mongo::Error::BulkWriteError)
148
+ context 'when a session is provided' do
149
+
150
+ let(:extra_options) do
151
+ {session: session}
102
152
  end
103
- end
104
153
 
105
- context 'when the server version has write commands enabled' do
154
+ let(:client) do
155
+ collection_invalid_write_concern.client
156
+ end
106
157
 
107
- it 'raises an OperationFailure', if: write_command_enabled? && standalone? do
108
- expect {
109
- bulk_write_invalid_write_concern.execute
110
- }.to raise_error(Mongo::Error::OperationFailure)
158
+ let(:failed_operation) do
159
+ bulk_write_invalid_write_concern.execute
111
160
  end
161
+
162
+ it_behaves_like 'a failed operation using a session'
112
163
  end
113
164
  end
114
165
  end
@@ -147,22 +198,23 @@ describe Mongo::BulkWrite do
147
198
 
148
199
  context 'when there is a write concern error' do
149
200
 
150
- context 'when the server version is < 2.6' do
201
+ it_behaves_like 'bulk write with write concern yielding operation failure'
151
202
 
152
- it 'raises a BulkWriteError', if: !write_command_enabled? && standalone? do
153
- expect {
154
- bulk_write_invalid_write_concern.execute
155
- }.to raise_error(Mongo::Error::BulkWriteError)
203
+ context 'when a session is provided' do
204
+
205
+ let(:extra_options) do
206
+ {session: session}
156
207
  end
157
- end
158
208
 
159
- context 'when the server version has write commands enabled' do
209
+ let(:client) do
210
+ collection_invalid_write_concern.client
211
+ end
160
212
 
161
- it 'raises an OperationFailure', if: write_command_enabled? && standalone? do
162
- expect {
163
- bulk_write_invalid_write_concern.execute
164
- }.to raise_error(Mongo::Error::OperationFailure)
213
+ let(:failed_operation) do
214
+ bulk_write_invalid_write_concern.execute
165
215
  end
216
+
217
+ it_behaves_like 'a failed operation using a session'
166
218
  end
167
219
  end
168
220
  end
@@ -186,23 +238,338 @@ describe Mongo::BulkWrite do
186
238
  expect(authorized_collection.find(_id: 0).count).to eq(0)
187
239
  end
188
240
 
241
+ context 'when the write has specified a hint option' do
242
+ let(:requests) do
243
+ [{
244
+ delete_one: {
245
+ filter: { _id: 1 },
246
+ hint: '_id_',
247
+ }
248
+ }]
249
+ end
250
+
251
+ context 'with unacknowledged write concern' do
252
+ let(:bulk_write) do
253
+ described_class.new(
254
+ collection,
255
+ requests,
256
+ options.merge(write_concern: { w: 0 })
257
+ )
258
+ end
259
+
260
+ it 'raises a client-side error' do
261
+ expect do
262
+ bulk_write.execute
263
+ end.to raise_error(Mongo::Error::UnsupportedOption, /The hint option cannot be specified on an unacknowledged write operation/)
264
+ end
265
+ end
266
+
267
+ # Functionality on more recent servers is sufficiently covered by spec tests.
268
+ context 'on server versions < 3.4' do
269
+ max_server_fcv '3.2'
270
+
271
+ it 'raises a client-side error' do
272
+ expect do
273
+ bulk_write.execute
274
+ end.to raise_error(Mongo::Error::UnsupportedOption, /The MongoDB server handling this request does not support the hint option on this command./)
275
+ end
276
+ end
277
+ end
278
+
279
+ context 'when a session is provided' do
280
+
281
+ let(:operation) do
282
+ result
283
+ end
284
+
285
+ let(:client) do
286
+ authorized_client
287
+ end
288
+
289
+ let(:extra_options) do
290
+ { session: session }
291
+ end
292
+
293
+ it_behaves_like 'an operation using a session'
294
+ end
295
+
189
296
  context 'when there is a write concern error' do
190
297
 
191
- context 'when the server version is < 2.6' do
298
+ it_behaves_like 'bulk write with write concern yielding operation failure'
192
299
 
193
- it 'raises a BulkWriteError', if: !write_command_enabled? && standalone? do
194
- expect {
195
- bulk_write_invalid_write_concern.execute
196
- }.to raise_error(Mongo::Error::BulkWriteError)
300
+ context 'when a session is provided' do
301
+
302
+ let(:extra_options) do
303
+ {session: session}
304
+ end
305
+
306
+ let(:client) do
307
+ collection_invalid_write_concern.client
308
+ end
309
+
310
+ let(:failed_operation) do
311
+ bulk_write_invalid_write_concern.execute
197
312
  end
313
+
314
+ it_behaves_like 'a failed operation using a session'
198
315
  end
199
316
 
200
- context 'when the server version has write commands enabled' do
317
+ context 'when the write has a collation specified' do
201
318
 
202
- it 'raises an OperationFailure', if: write_command_enabled? && standalone? do
203
- expect {
204
- bulk_write_invalid_write_concern.execute
205
- }.to raise_error(Mongo::Error::OperationFailure)
319
+ before do
320
+ authorized_collection.insert_one(name: 'bang')
321
+ end
322
+
323
+ let(:requests) do
324
+ [{ delete_one: { filter: { name: 'BANG' }, collation: collation } }]
325
+ end
326
+
327
+ context 'when the server selected supports collations' do
328
+ min_server_fcv '3.4'
329
+
330
+ let!(:result) do
331
+ bulk_write.execute
332
+ end
333
+
334
+ it 'applies the collation' do
335
+ expect(authorized_collection.find(name: 'bang').count).to eq(0)
336
+ end
337
+
338
+ it 'reports the deleted count' do
339
+ expect(result.deleted_count).to eq(1)
340
+ end
341
+ end
342
+
343
+ context 'when the server selected does not support collations' do
344
+ max_server_version '3.2'
345
+
346
+ it 'raises an exception' do
347
+ expect {
348
+ bulk_write.execute
349
+ }.to raise_exception(Mongo::Error::UnsupportedCollation)
350
+ end
351
+
352
+ context 'when a String key is used' do
353
+
354
+ let(:requests) do
355
+ [{ delete_one: { filter: { name: 'BANG' }, 'collation' => collation } }]
356
+ end
357
+
358
+ it 'raises an exception' do
359
+ expect {
360
+ bulk_write.execute
361
+ }.to raise_exception(Mongo::Error::UnsupportedCollation)
362
+ end
363
+ end
364
+ end
365
+ end
366
+
367
+ context 'when a collation is not specified' do
368
+
369
+ before do
370
+ authorized_collection.insert_one(name: 'bang')
371
+ end
372
+
373
+ let(:requests) do
374
+ [{ delete_one: { filter: { name: 'BANG' }}}]
375
+ end
376
+
377
+ let!(:result) do
378
+ bulk_write.execute
379
+ end
380
+
381
+ it 'does not apply the collation' do
382
+ expect(authorized_collection.find(name: 'bang').count).to eq(1)
383
+ end
384
+
385
+ it 'reports the deleted count' do
386
+ expect(result.deleted_count).to eq(0)
387
+ end
388
+ end
389
+ end
390
+
391
+ context 'when bulk executing update_one' do
392
+ context 'when the write has specified a hint option' do
393
+ let(:requests) do
394
+ [{
395
+ update_one: {
396
+ filter: { _id: 1 },
397
+ update: { '$set' => { 'x.$[i].y' => 5 } },
398
+ hint: '_id_',
399
+ }
400
+ }]
401
+ end
402
+
403
+ # Functionality on more recent servers is sufficiently covered by spec tests.
404
+ context 'on server versions < 3.4' do
405
+ max_server_fcv '3.2'
406
+
407
+ it 'raises a client-side error' do
408
+ expect do
409
+ bulk_write.execute
410
+ end.to raise_error(Mongo::Error::UnsupportedOption, /The MongoDB server handling this request does not support the hint option on this command./)
411
+ end
412
+ end
413
+
414
+ context 'with unacknowledged write concern' do
415
+ let(:bulk_write) do
416
+ described_class.new(
417
+ collection,
418
+ requests,
419
+ options.merge(write_concern: { w: 0 })
420
+ )
421
+ end
422
+
423
+ it 'raises a client-side error' do
424
+ expect do
425
+ bulk_write.execute
426
+ end.to raise_error(Mongo::Error::UnsupportedOption, /The hint option cannot be specified on an unacknowledged write operation/)
427
+ end
428
+ end
429
+ end
430
+
431
+ context 'when the write has specified arrayFilters' do
432
+
433
+ before do
434
+ authorized_collection.insert_one(_id: 1, x: [{ y: 1 }, { y: 2 }, { y: 3 }])
435
+ end
436
+
437
+ let(:requests) do
438
+ [{
439
+ update_one: {
440
+ filter: { _id: 1 },
441
+ update: { '$set' => { 'x.$[i].y' => 5 } },
442
+ array_filters: array_filters,
443
+ }
444
+ }]
445
+ end
446
+
447
+ context 'when the server selected supports arrayFilters' do
448
+ min_server_fcv '3.6'
449
+
450
+ let!(:result) do
451
+ bulk_write.execute
452
+ end
453
+
454
+ it 'applies the arrayFilters' do
455
+ expect(result.matched_count).to eq(1)
456
+ expect(result.modified_count).to eq(1)
457
+ expect(authorized_collection.find(_id: 1).first['x'].last['y']).to eq(5)
458
+ end
459
+ end
460
+
461
+ context 'when the server selected does not support arrayFilters' do
462
+ max_server_version '3.4'
463
+
464
+ it 'raises an exception' do
465
+ expect {
466
+ bulk_write.execute
467
+ }.to raise_exception(Mongo::Error::UnsupportedArrayFilters)
468
+ end
469
+ end
470
+ end
471
+ end
472
+
473
+ context 'when bulk executing update_many' do
474
+ context 'when the write has specified a hint option' do
475
+ let(:requests) do
476
+ [{
477
+ update_many: {
478
+ filter: { '$or' => [{ _id: 1 }, { _id: 2 }]},
479
+ update: { '$set' => { 'x.$[i].y' => 5 } },
480
+ hint: '_id_',
481
+ }
482
+ }]
483
+ end
484
+
485
+ # Functionality on more recent servers is sufficiently covered by spec tests.
486
+ context 'on server versions < 3.4' do
487
+ max_server_fcv '3.2'
488
+
489
+ it 'raises a client-side error' do
490
+ expect do
491
+ bulk_write.execute
492
+ end.to raise_error(Mongo::Error::UnsupportedOption, /The MongoDB server handling this request does not support the hint option on this command./)
493
+ end
494
+ end
495
+
496
+ context 'with unacknowledged write concern' do
497
+ let(:bulk_write) do
498
+ described_class.new(
499
+ collection,
500
+ requests,
501
+ options.merge(write_concern: { w: 0 })
502
+ )
503
+ end
504
+
505
+ it 'raises a client-side error' do
506
+ expect do
507
+ bulk_write.execute
508
+ end.to raise_error(Mongo::Error::UnsupportedOption, /The hint option cannot be specified on an unacknowledged write operation/)
509
+ end
510
+ end
511
+ end
512
+
513
+
514
+ context 'when the write has specified arrayFilters' do
515
+
516
+ before do
517
+ authorized_collection.insert_many([{
518
+ _id: 1, x: [
519
+ { y: 1 },
520
+ { y: 2 },
521
+ { y: 3 }
522
+ ]
523
+ },
524
+ {
525
+ _id: 2,
526
+ x: [
527
+ { y: 3 },
528
+ { y: 2 },
529
+ { y: 1 }
530
+ ]
531
+ }])
532
+ end
533
+
534
+ let(:selector) do
535
+ { '$or' => [{ _id: 1 }, { _id: 2 }]}
536
+ end
537
+
538
+ let(:requests) do
539
+ [{
540
+ update_many: {
541
+ filter: { '$or' => [{ _id: 1 }, { _id: 2 }]},
542
+ update: { '$set' => { 'x.$[i].y' => 5 } },
543
+ array_filters: array_filters,
544
+ }
545
+ }]
546
+ end
547
+
548
+ context 'when the server selected supports arrayFilters' do
549
+ min_server_fcv '3.6'
550
+
551
+ let!(:result) do
552
+ bulk_write.execute
553
+ end
554
+
555
+ it 'applies the arrayFilters' do
556
+ expect(result.matched_count).to eq(2)
557
+ expect(result.modified_count).to eq(2)
558
+
559
+ docs = authorized_collection.find(selector, sort: { _id: 1 }).to_a
560
+ expect(docs[0]['x']).to eq ([{ 'y' => 1 }, { 'y' => 2 }, { 'y' => 5}])
561
+ expect(docs[1]['x']).to eq ([{ 'y' => 5 }, { 'y' => 2 }, { 'y' => 1}])
562
+ end
563
+ end
564
+
565
+ context 'when the server selected does not support arrayFilters' do
566
+ max_server_version '3.4'
567
+
568
+ it 'raises an exception' do
569
+ expect {
570
+ bulk_write.execute
571
+ }.to raise_exception(Mongo::Error::UnsupportedArrayFilters)
572
+ end
206
573
  end
207
574
  end
208
575
  end
@@ -253,26 +620,122 @@ describe Mongo::BulkWrite do
253
620
  expect(authorized_collection.find(_id: { '$in'=> [ 0, 1, 2 ]}).count).to eq(0)
254
621
  end
255
622
 
623
+ context 'when a session is provided' do
624
+
625
+ let(:operation) do
626
+ result
627
+ end
628
+
629
+ let(:client) do
630
+ authorized_client
631
+ end
632
+
633
+ let(:extra_options) do
634
+ { session: session }
635
+ end
636
+
637
+ it_behaves_like 'an operation using a session'
638
+ end
639
+
256
640
  context 'when there is a write concern error' do
257
641
 
258
- context 'when the server version is < 2.6' do
642
+ it_behaves_like 'bulk write with write concern yielding operation failure'
259
643
 
260
- it 'raises a BulkWriteError', if: !write_command_enabled? && standalone? do
261
- expect {
262
- bulk_write_invalid_write_concern.execute
263
- }.to raise_error(Mongo::Error::BulkWriteError)
644
+ context 'when a session is provided' do
645
+
646
+ let(:extra_options) do
647
+ {session: session}
648
+ end
649
+
650
+ let(:client) do
651
+ collection_invalid_write_concern.client
652
+ end
653
+
654
+ let(:failed_operation) do
655
+ bulk_write_invalid_write_concern.execute
656
+ end
657
+
658
+ it_behaves_like 'a failed operation using a session'
659
+ end
660
+ end
661
+
662
+ context 'when the write has a collation specified' do
663
+
664
+ before do
665
+ authorized_collection.insert_one(name: 'bang')
666
+ authorized_collection.insert_one(name: 'doink')
667
+ end
668
+
669
+ let(:requests) do
670
+ [{ delete_one: { filter: { name: 'BANG' }, collation: collation }},
671
+ { delete_one: { filter: { name: 'DOINK' }, collation: collation }}]
672
+ end
673
+
674
+ context 'when the server selected supports collations' do
675
+ min_server_fcv '3.4'
676
+
677
+ let!(:result) do
678
+ bulk_write.execute
679
+ end
680
+
681
+ it 'applies the collation' do
682
+ expect(authorized_collection.find(name: { '$in' => ['bang', 'doink']}).count).to eq(0)
683
+ end
684
+
685
+ it 'reports the deleted count' do
686
+ expect(result.deleted_count).to eq(2)
264
687
  end
265
688
  end
266
689
 
267
- context 'when the server version has write commands enabled' do
690
+ context 'when the server selected does not support collations' do
691
+ max_server_version '3.2'
268
692
 
269
- it 'raises an OperationFailure', if: write_command_enabled? && standalone? do
693
+ it 'raises an exception' do
270
694
  expect {
271
- bulk_write_invalid_write_concern.execute
272
- }.to raise_error(Mongo::Error::OperationFailure)
695
+ bulk_write.execute
696
+ }.to raise_exception(Mongo::Error::UnsupportedCollation)
697
+ end
698
+
699
+ context 'when a String key is used' do
700
+
701
+ let(:requests) do
702
+ [{ delete_one: { filter: { name: 'BANG' }, 'collation' => collation }},
703
+ { delete_one: { filter: { name: 'DOINK' }, 'collation' => collation }}]
704
+ end
705
+
706
+ it 'raises an exception' do
707
+ expect {
708
+ bulk_write.execute
709
+ }.to raise_exception(Mongo::Error::UnsupportedCollation)
710
+ end
273
711
  end
274
712
  end
275
713
  end
714
+
715
+ context 'when the write does not have a collation specified' do
716
+
717
+ before do
718
+ authorized_collection.insert_one(name: 'bang')
719
+ authorized_collection.insert_one(name: 'doink')
720
+ end
721
+
722
+ let(:requests) do
723
+ [{ delete_one: { filter: { name: 'BANG' }}},
724
+ { delete_one: { filter: { name: 'DOINK' }}}]
725
+ end
726
+
727
+ let!(:result) do
728
+ bulk_write.execute
729
+ end
730
+
731
+ it 'does not apply the collation' do
732
+ expect(authorized_collection.find(name: { '$in' => ['bang', 'doink']}).count).to eq(2)
733
+ end
734
+
735
+ it 'reports the deleted count' do
736
+ expect(result.deleted_count).to eq(0)
737
+ end
738
+ end
276
739
  end
277
740
 
278
741
  context 'when provided a single delete many' do
@@ -294,31 +757,162 @@ describe Mongo::BulkWrite do
294
757
  expect(authorized_collection.find(_id: 0).count).to eq(0)
295
758
  end
296
759
 
297
- context 'when there is a write concern error' do
298
-
299
- context 'when the server version is < 2.6' do
300
-
301
- it 'raises a BulkWriteError', if: !write_command_enabled? && standalone? do
302
- expect {
303
- bulk_write_invalid_write_concern.execute
304
- }.to raise_error(Mongo::Error::BulkWriteError)
760
+ context 'when the write has specified a hint option' do
761
+ let(:requests) do
762
+ [{
763
+ delete_many: {
764
+ filter: { _id: 1 },
765
+ hint: '_id_',
766
+ }
767
+ }]
768
+ end
769
+
770
+ # Functionality on more recent servers is sufficiently covered by spec tests.
771
+ context 'on server versions < 3.4' do
772
+ max_server_fcv '3.2'
773
+
774
+ it 'raises a client-side error' do
775
+ expect do
776
+ bulk_write.execute
777
+ end.to raise_error(Mongo::Error::UnsupportedOption, /The MongoDB server handling this request does not support the hint option on this command./)
305
778
  end
306
779
  end
307
780
 
308
- context 'when the server version has write commands enabled' do
781
+ context 'with unacknowledged write concern' do
782
+ let(:bulk_write) do
783
+ described_class.new(
784
+ collection,
785
+ requests,
786
+ options.merge(write_concern: { w: 0 })
787
+ )
788
+ end
309
789
 
310
- it 'raises an OperationFailure', if: write_command_enabled? && standalone? do
311
- expect {
312
- bulk_write_invalid_write_concern.execute
313
- }.to raise_error(Mongo::Error::OperationFailure)
790
+ it 'raises a client-side error' do
791
+ expect do
792
+ bulk_write.execute
793
+ end.to raise_error(Mongo::Error::UnsupportedOption, /The hint option cannot be specified on an unacknowledged write operation/)
314
794
  end
315
795
  end
316
796
  end
317
- end
318
797
 
319
- context 'when provided multiple delete many ops' do
798
+ context 'when a session is provided' do
320
799
 
321
- let(:requests) do
800
+ let(:operation) do
801
+ result
802
+ end
803
+
804
+ let(:client) do
805
+ authorized_client
806
+ end
807
+
808
+ let(:extra_options) do
809
+ { session: session }
810
+ end
811
+
812
+ it_behaves_like 'an operation using a session'
813
+ end
814
+
815
+ context 'when there is a write concern error' do
816
+
817
+ it_behaves_like 'bulk write with write concern yielding operation failure'
818
+
819
+ context 'when a session is provided' do
820
+
821
+ let(:extra_options) do
822
+ {session: session}
823
+ end
824
+
825
+ let(:client) do
826
+ collection_invalid_write_concern.client
827
+ end
828
+
829
+ let(:failed_operation) do
830
+ bulk_write_invalid_write_concern.execute
831
+ end
832
+
833
+ it_behaves_like 'a failed operation using a session'
834
+ end
835
+ end
836
+
837
+ context 'when the write has a collation specified' do
838
+
839
+ before do
840
+ authorized_collection.insert_one(name: 'bang')
841
+ authorized_collection.insert_one(name: 'bang')
842
+ end
843
+
844
+ let(:requests) do
845
+ [{ delete_many: { filter: { name: 'BANG' }, collation: collation }}]
846
+ end
847
+
848
+ context 'when the server selected supports collations' do
849
+ min_server_fcv '3.4'
850
+
851
+ let!(:result) do
852
+ bulk_write.execute
853
+ end
854
+
855
+ it 'applies the collation' do
856
+ expect(authorized_collection.find(name: 'bang').count).to eq(0)
857
+ end
858
+
859
+ it 'reports the deleted count' do
860
+ expect(result.deleted_count).to eq(2)
861
+ end
862
+ end
863
+
864
+ context 'when the server selected does not support collations' do
865
+ max_server_version '3.2'
866
+
867
+ it 'raises an exception' do
868
+ expect {
869
+ bulk_write.execute
870
+ }.to raise_exception(Mongo::Error::UnsupportedCollation)
871
+ end
872
+
873
+ context 'when a String key is used' do
874
+
875
+ let(:requests) do
876
+ [{ delete_many: { filter: { name: 'BANG' }, 'collation' => collation }}]
877
+ end
878
+
879
+ it 'raises an exception' do
880
+ expect {
881
+ bulk_write.execute
882
+ }.to raise_exception(Mongo::Error::UnsupportedCollation)
883
+ end
884
+ end
885
+ end
886
+ end
887
+
888
+ context 'when a collation is not specified' do
889
+
890
+ before do
891
+ authorized_collection.insert_one(name: 'bang')
892
+ authorized_collection.insert_one(name: 'bang')
893
+ end
894
+
895
+ let(:requests) do
896
+ [{ delete_many: { filter: { name: 'BANG' }}}]
897
+ end
898
+
899
+ let!(:result) do
900
+ bulk_write.execute
901
+ end
902
+
903
+ it 'does not apply the collation' do
904
+ expect(authorized_collection.find(name: 'bang').count).to eq(2)
905
+ end
906
+
907
+ it 'reports the deleted count' do
908
+ expect(result.deleted_count).to eq(0)
909
+ end
910
+ end
911
+ end
912
+
913
+ context 'when provided multiple delete many ops' do
914
+
915
+ let(:requests) do
322
916
  [
323
917
  { delete_many: { filter: { _id: 0 }}},
324
918
  { delete_many: { filter: { _id: 1 }}},
@@ -341,26 +935,124 @@ describe Mongo::BulkWrite do
341
935
  expect(authorized_collection.find(_id: { '$in'=> [ 0, 1, 2 ]}).count).to eq(0)
342
936
  end
343
937
 
938
+ context 'when a session is provided' do
939
+
940
+ let(:operation) do
941
+ result
942
+ end
943
+
944
+ let(:client) do
945
+ authorized_client
946
+ end
947
+
948
+ let(:extra_options) do
949
+ { session: session }
950
+ end
951
+
952
+ it_behaves_like 'an operation using a session'
953
+ end
954
+
344
955
  context 'when there is a write concern error' do
345
956
 
346
- context 'when the server version is < 2.6' do
957
+ it_behaves_like 'bulk write with write concern yielding operation failure'
347
958
 
348
- it 'raises a BulkWriteError', if: !write_command_enabled? && standalone? do
349
- expect {
350
- bulk_write_invalid_write_concern.execute
351
- }.to raise_error(Mongo::Error::BulkWriteError)
959
+ context 'when a session is provided' do
960
+
961
+ let(:operation) do
962
+ result
963
+ end
964
+
965
+ let(:client) do
966
+ authorized_client
967
+ end
968
+
969
+ let(:extra_options) do
970
+ {session: session}
971
+ end
972
+
973
+ it_behaves_like 'an operation using a session'
974
+ end
975
+ end
976
+
977
+ context 'when the write has a collation specified' do
978
+
979
+ before do
980
+ authorized_collection.insert_one(name: 'bang')
981
+ authorized_collection.insert_one(name: 'bang')
982
+ authorized_collection.insert_one(name: 'doink')
983
+ end
984
+
985
+ let(:requests) do
986
+ [{ delete_many: { filter: { name: 'BANG' }, collation: collation }},
987
+ { delete_many: { filter: { name: 'DOINK' }, collation: collation }}]
988
+ end
989
+
990
+ context 'when the server selected supports collations' do
991
+ min_server_fcv '3.4'
992
+
993
+ let!(:result) do
994
+ bulk_write.execute
995
+ end
996
+
997
+ it 'applies the collation' do
998
+ expect(authorized_collection.find(name: { '$in' => ['bang', 'doink'] }).count).to eq(0)
999
+ end
1000
+
1001
+ it 'reports the deleted count' do
1002
+ expect(result.deleted_count).to eq(3)
352
1003
  end
353
1004
  end
354
1005
 
355
- context 'when the server version has write commands enabled' do
1006
+ context 'when the server selected does not support collations' do
1007
+ max_server_version '3.2'
356
1008
 
357
- it 'raises an OperationFailure', if: write_command_enabled? && standalone? do
1009
+ it 'raises an exception' do
358
1010
  expect {
359
- bulk_write_invalid_write_concern.execute
360
- }.to raise_error(Mongo::Error::OperationFailure)
1011
+ bulk_write.execute
1012
+ }.to raise_exception(Mongo::Error::UnsupportedCollation)
1013
+ end
1014
+
1015
+ context 'when a String key is used' do
1016
+
1017
+ let(:requests) do
1018
+ [{ delete_many: { filter: { name: 'BANG' }, 'collation' => collation }},
1019
+ { delete_many: { filter: { name: 'DOINK' }, 'collation' => collation }}]
1020
+ end
1021
+
1022
+ it 'raises an exception' do
1023
+ expect {
1024
+ bulk_write.execute
1025
+ }.to raise_exception(Mongo::Error::UnsupportedCollation)
1026
+ end
361
1027
  end
362
1028
  end
363
1029
  end
1030
+
1031
+ context 'when a collation is not specified' do
1032
+
1033
+ before do
1034
+ authorized_collection.insert_one(name: 'bang')
1035
+ authorized_collection.insert_one(name: 'bang')
1036
+ authorized_collection.insert_one(name: 'doink')
1037
+ end
1038
+
1039
+ let(:requests) do
1040
+ [{ delete_many: { filter: { name: 'BANG' }}},
1041
+ { delete_many: { filter: { name: 'DOINK' }}}]
1042
+ end
1043
+
1044
+ let!(:result) do
1045
+ bulk_write.execute
1046
+ end
1047
+
1048
+ it 'does not apply the collation' do
1049
+ expect(authorized_collection.find(name: { '$in' => ['bang', 'doink'] }).count).to eq(3)
1050
+ end
1051
+
1052
+ it 'reports the deleted count' do
1053
+ expect(result.deleted_count).to eq(0)
1054
+ end
1055
+ end
364
1056
  end
365
1057
 
366
1058
  context 'when providing a single replace one' do
@@ -382,26 +1074,184 @@ describe Mongo::BulkWrite do
382
1074
  expect(authorized_collection.find(_id: 0).first[:name]).to eq('test')
383
1075
  end
384
1076
 
1077
+ context 'when a hint option is provided' do
1078
+ let(:requests) do
1079
+ [{
1080
+ replace_one: {
1081
+ filter: { _id: 0 },
1082
+ replacements: { name: 'test' },
1083
+ hint: '_id_'
1084
+ }
1085
+ }]
1086
+ end
1087
+
1088
+ # Functionality on more recent servers is sufficiently covered by spec tests.
1089
+ context 'on server versions < 3.4' do
1090
+ max_server_fcv '3.2'
1091
+
1092
+ it 'raises a client-side error' do
1093
+ expect do
1094
+ bulk_write.execute
1095
+ end.to raise_error(Mongo::Error::UnsupportedOption, /The MongoDB server handling this request does not support the hint option on this command./)
1096
+ end
1097
+ end
1098
+
1099
+ context 'with unacknowledged write concern' do
1100
+ let(:bulk_write) do
1101
+ described_class.new(
1102
+ collection,
1103
+ requests,
1104
+ options.merge(write_concern: { w: 0 })
1105
+ )
1106
+ end
1107
+
1108
+ it 'raises a client-side error' do
1109
+ expect do
1110
+ bulk_write.execute
1111
+ end.to raise_error(Mongo::Error::UnsupportedOption, /The hint option cannot be specified on an unacknowledged write operation/)
1112
+ end
1113
+ end
1114
+ end
1115
+
1116
+ context 'when a session is provided' do
1117
+
1118
+ let(:operation) do
1119
+ result
1120
+ end
1121
+
1122
+ let(:client) do
1123
+ authorized_client
1124
+ end
1125
+
1126
+ let(:extra_options) do
1127
+ { session: session }
1128
+ end
1129
+
1130
+ it_behaves_like 'an operation using a session'
1131
+ end
1132
+
385
1133
  context 'when there is a write concern error' do
386
1134
 
387
- context 'when the server version is < 2.6' do
1135
+ it_behaves_like 'bulk write with write concern yielding operation failure'
388
1136
 
389
- it 'raises a BulkWriteError', if: !write_command_enabled? && standalone? do
390
- expect {
391
- bulk_write_invalid_write_concern.execute
392
- }.to raise_error(Mongo::Error::BulkWriteError)
1137
+ context 'when a session is provided' do
1138
+
1139
+ let(:extra_options) do
1140
+ {session: session}
393
1141
  end
1142
+
1143
+ let(:client) do
1144
+ collection_invalid_write_concern.client
1145
+ end
1146
+
1147
+ let(:failed_operation) do
1148
+ bulk_write_invalid_write_concern.execute
1149
+ end
1150
+
1151
+ it_behaves_like 'a failed operation using a session'
394
1152
  end
1153
+ end
395
1154
 
396
- context 'when the server version has write commands enabled' do
1155
+ context 'when the write has a collation specified' do
397
1156
 
398
- it 'raises an OperationFailure', if: write_command_enabled? && standalone? do
1157
+ before do
1158
+ authorized_collection.insert_one(name: 'bang')
1159
+ end
1160
+
1161
+ let(:requests) do
1162
+ [{ replace_one: { filter: { name: 'BANG' },
1163
+ replacement: { other: 'pong' },
1164
+ collation: collation }}]
1165
+ end
1166
+
1167
+ context 'when the server selected supports collations' do
1168
+ min_server_fcv '3.4'
1169
+
1170
+ let!(:result) do
1171
+ bulk_write.execute
1172
+ end
1173
+
1174
+ it 'applies the collation' do
1175
+ expect(authorized_collection.find(other: 'pong').count).to eq(1)
1176
+ end
1177
+
1178
+ it 'reports the upserted id' do
1179
+ expect(result.upserted_ids).to eq([])
1180
+ end
1181
+
1182
+ it 'reports the upserted count' do
1183
+ expect(result.upserted_count).to eq(0)
1184
+ end
1185
+
1186
+ it 'reports the modified count' do
1187
+ expect(result.modified_count).to eq(1)
1188
+ end
1189
+
1190
+ it 'reports the matched count' do
1191
+ expect(result.matched_count).to eq(1)
1192
+ end
1193
+ end
1194
+
1195
+ context 'when the server selected does not support collations' do
1196
+ max_server_version '3.2'
1197
+
1198
+ it 'raises an exception' do
399
1199
  expect {
400
- bulk_write_invalid_write_concern.execute
401
- }.to raise_error(Mongo::Error::OperationFailure)
1200
+ bulk_write.execute
1201
+ }.to raise_exception(Mongo::Error::UnsupportedCollation)
1202
+ end
1203
+
1204
+ context 'when a String key is used' do
1205
+
1206
+ let(:requests) do
1207
+ [{ replace_one: { filter: { name: 'BANG' },
1208
+ replacement: { other: 'pong' },
1209
+ 'collation' => collation }}]
1210
+ end
1211
+
1212
+ it 'raises an exception' do
1213
+ expect {
1214
+ bulk_write.execute
1215
+ }.to raise_exception(Mongo::Error::UnsupportedCollation)
1216
+ end
402
1217
  end
403
1218
  end
404
1219
  end
1220
+
1221
+ context 'when the write does not have a collation specified' do
1222
+
1223
+ before do
1224
+ authorized_collection.insert_one(name: 'bang')
1225
+ end
1226
+
1227
+ let(:requests) do
1228
+ [{ replace_one: { filter: { name: 'BANG' }, replacement: { other: 'pong' }}}]
1229
+ end
1230
+
1231
+ let!(:result) do
1232
+ bulk_write.execute
1233
+ end
1234
+
1235
+ it 'does not apply the collation' do
1236
+ expect(authorized_collection.find(other: 'pong').count).to eq(0)
1237
+ end
1238
+
1239
+ it 'reports the upserted id' do
1240
+ expect(result.upserted_ids).to eq([])
1241
+ end
1242
+
1243
+ it 'reports the upserted count' do
1244
+ expect(result.upserted_count).to eq(0)
1245
+ end
1246
+
1247
+ it 'reports the modified count' do
1248
+ expect(result.modified_count).to eq(0)
1249
+ end
1250
+
1251
+ it 'reports the matched count' do
1252
+ expect(result.matched_count).to eq(0)
1253
+ end
1254
+ end
405
1255
  end
406
1256
 
407
1257
  context 'when providing a single update one' do
@@ -420,9 +1270,275 @@ describe Mongo::BulkWrite do
420
1270
  authorized_collection.insert_one({ _id: 0 })
421
1271
  end
422
1272
 
423
- it 'updates the document' do
424
- result
425
- expect(authorized_collection.find(_id: 0).first[:name]).to eq('test')
1273
+ it 'updates the document' do
1274
+ result
1275
+ expect(authorized_collection.find(_id: 0).first[:name]).to eq('test')
1276
+ end
1277
+
1278
+ it 'reports the upserted id' do
1279
+ expect(result.upserted_ids).to eq([])
1280
+ end
1281
+
1282
+ it 'reports the upserted count' do
1283
+ expect(result.upserted_count).to eq(0)
1284
+ end
1285
+
1286
+ it 'reports the modified count' do
1287
+ expect(result.modified_count).to eq(1)
1288
+ end
1289
+
1290
+ it 'reports the matched count' do
1291
+ expect(result.matched_count).to eq(1)
1292
+ end
1293
+
1294
+ context 'when a session is provided' do
1295
+
1296
+ let(:operation) do
1297
+ result
1298
+ end
1299
+
1300
+ let(:client) do
1301
+ authorized_client
1302
+ end
1303
+
1304
+ let(:extra_options) do
1305
+ { session: session }
1306
+ end
1307
+
1308
+ it_behaves_like 'an operation using a session'
1309
+ end
1310
+
1311
+ context 'when documents match but are not modified' do
1312
+
1313
+ before do
1314
+ authorized_collection.insert_one({ a: 0 })
1315
+ end
1316
+
1317
+ let(:requests) do
1318
+ [{ update_one: { filter: { a: 0 }, update: { "$set" => { a: 0 }}}}]
1319
+ end
1320
+
1321
+ it 'reports the upserted id' do
1322
+ expect(result.upserted_ids).to eq([])
1323
+ end
1324
+
1325
+ it 'reports the upserted count' do
1326
+ expect(result.upserted_count).to eq(0)
1327
+ end
1328
+
1329
+ it 'reports the modified count' do
1330
+ expect(result.modified_count).to eq(0)
1331
+ end
1332
+
1333
+ it 'reports the matched count' do
1334
+ expect(result.matched_count).to eq(1)
1335
+ end
1336
+ end
1337
+
1338
+ context 'when the number of updates exceeds the max batch size' do
1339
+ # Test uses doubles for server descriptions, doubles are
1340
+ # incompatible with freezing which linting does for descriptions
1341
+ require_no_linting
1342
+
1343
+ let(:batch_size) do
1344
+ 11
1345
+ end
1346
+
1347
+ before do
1348
+ allow_any_instance_of(Mongo::Server::Description).to \
1349
+ receive(:max_write_batch_size).and_return(batch_size - 1)
1350
+ end
1351
+
1352
+ let(:requests) do
1353
+ batch_size.times.collect do |i|
1354
+ { update_one: { filter: { a: i }, update: { "$set" => { a: i, b: 3 }}, upsert: true }}
1355
+ end
1356
+ end
1357
+
1358
+ it 'updates the documents and reports the correct number of upserted ids' do
1359
+ expect(result.upserted_ids.size).to eq(batch_size)
1360
+ expect(authorized_collection.find(b: 3).count).to eq(batch_size)
1361
+ end
1362
+ end
1363
+
1364
+ context 'when there is a write concern error' do
1365
+
1366
+ it_behaves_like 'bulk write with write concern yielding operation failure'
1367
+
1368
+ context 'when a session is provided' do
1369
+
1370
+ let(:extra_options) do
1371
+ {session: session}
1372
+ end
1373
+
1374
+ let(:client) do
1375
+ collection_invalid_write_concern.client
1376
+ end
1377
+
1378
+ let(:failed_operation) do
1379
+ bulk_write_invalid_write_concern.execute
1380
+ end
1381
+
1382
+ it_behaves_like 'a failed operation using a session'
1383
+ end
1384
+ end
1385
+ end
1386
+
1387
+ context 'when upsert is true' do
1388
+
1389
+ let(:requests) do
1390
+ [{ update_one: { filter: { _id: 0 }, update: { "$set" => { name: 'test' } }, upsert: true }}]
1391
+ end
1392
+
1393
+ let(:result) do
1394
+ bulk_write.execute
1395
+ end
1396
+
1397
+ it 'updates the document' do
1398
+ result
1399
+ expect(authorized_collection.find(_id: 0).first[:name]).to eq('test')
1400
+ end
1401
+
1402
+ it 'reports the upserted count' do
1403
+ expect(result.upserted_count).to eq(1)
1404
+ end
1405
+
1406
+ it 'reports the modified_count count' do
1407
+ expect(result.modified_count).to eq(0)
1408
+ end
1409
+
1410
+ it 'reports the matched count' do
1411
+ expect(result.matched_count).to eq(0)
1412
+ end
1413
+
1414
+ it 'reports the upserted id' do
1415
+ expect(result.upserted_ids).to eq([0])
1416
+ end
1417
+
1418
+ context 'when there is a write concern error' do
1419
+
1420
+ it_behaves_like 'bulk write with write concern yielding operation failure'
1421
+ end
1422
+
1423
+ context 'when write_concern is specified as an option' do
1424
+
1425
+ # In a multi-sharded cluster, the write seems to go to a
1426
+ # different shard from the read
1427
+ require_no_multi_mongos
1428
+
1429
+ let(:extra_options) do
1430
+ { write_concern: { w: 0 } }
1431
+ end
1432
+
1433
+ let(:result) do
1434
+ bulk_write.execute
1435
+ end
1436
+
1437
+ it 'updates the document' do
1438
+ result
1439
+ expect(authorized_collection.find(_id: 0).first[:name]).to eq('test')
1440
+ end
1441
+
1442
+ it 'does not report the upserted count' do
1443
+ expect(result.upserted_count).to eq(0)
1444
+ end
1445
+
1446
+ it 'does not report the modified_count count' do
1447
+ expect(result.modified_count).to eq(0)
1448
+ end
1449
+
1450
+ it 'does not report the matched count' do
1451
+ expect(result.matched_count).to eq(0)
1452
+ end
1453
+
1454
+ it 'does not report the upserted id' do
1455
+ expect(result.upserted_ids).to eq([])
1456
+ end
1457
+ end
1458
+ end
1459
+
1460
+ context 'when the write has a collation specified' do
1461
+
1462
+ before do
1463
+ authorized_collection.insert_one(name: 'bang')
1464
+ end
1465
+
1466
+ let(:requests) do
1467
+ [{ update_one: { filter: { name: 'BANG' },
1468
+ update: { "$set" => { name: 'pong' }},
1469
+ collation: collation }}]
1470
+ end
1471
+
1472
+ context 'when the server selected supports collations' do
1473
+ min_server_fcv '3.4'
1474
+
1475
+ let!(:result) do
1476
+ bulk_write.execute
1477
+ end
1478
+
1479
+ it 'applies the collation' do
1480
+ expect(authorized_collection.find(name: 'pong').count).to eq(1)
1481
+ end
1482
+
1483
+ it 'reports the upserted id' do
1484
+ expect(result.upserted_ids).to eq([])
1485
+ end
1486
+
1487
+ it 'reports the upserted count' do
1488
+ expect(result.upserted_count).to eq(0)
1489
+ end
1490
+
1491
+ it 'reports the modified count' do
1492
+ expect(result.modified_count).to eq(1)
1493
+ end
1494
+
1495
+ it 'reports the matched count' do
1496
+ expect(result.matched_count).to eq(1)
1497
+ end
1498
+ end
1499
+
1500
+ context 'when the server selected does not support collations' do
1501
+ max_server_version '3.2'
1502
+
1503
+ it 'raises an exception' do
1504
+ expect {
1505
+ bulk_write.execute
1506
+ }.to raise_exception(Mongo::Error::UnsupportedCollation)
1507
+ end
1508
+
1509
+ context 'when a String key is used' do
1510
+
1511
+ let(:requests) do
1512
+ [{ update_one: { filter: { name: 'BANG' },
1513
+ update: { "$set" => { name: 'pong' }},
1514
+ 'collation' => collation }}]
1515
+ end
1516
+
1517
+ it 'raises an exception' do
1518
+ expect {
1519
+ bulk_write.execute
1520
+ }.to raise_exception(Mongo::Error::UnsupportedCollation)
1521
+ end
1522
+ end
1523
+ end
1524
+ end
1525
+
1526
+ context 'when the write does not have a collation specified' do
1527
+
1528
+ before do
1529
+ authorized_collection.insert_one(name: 'bang')
1530
+ end
1531
+
1532
+ let(:requests) do
1533
+ [{ update_one: { filter: { name: 'BANG' }, update: { "$set" => { name: 'pong' }}}}]
1534
+ end
1535
+
1536
+ let!(:result) do
1537
+ bulk_write.execute
1538
+ end
1539
+
1540
+ it 'does not apply the collation' do
1541
+ expect(authorized_collection.find(name: 'pong').count).to eq(0)
426
1542
  end
427
1543
 
428
1544
  it 'reports the upserted id' do
@@ -434,21 +1550,42 @@ describe Mongo::BulkWrite do
434
1550
  end
435
1551
 
436
1552
  it 'reports the modified count' do
437
- expect(result.modified_count).to eq(1)
1553
+ expect(result.modified_count).to eq(0)
438
1554
  end
439
1555
 
440
1556
  it 'reports the matched count' do
441
- expect(result.matched_count).to eq(1)
1557
+ expect(result.matched_count).to eq(0)
442
1558
  end
1559
+ end
1560
+ end
443
1561
 
444
- context 'when documents match but are not modified' do
1562
+ context 'when providing multiple update ones' do
445
1563
 
446
- before do
447
- authorized_collection.insert_one({ a: 0 })
1564
+ context 'when the write has a collation specified' do
1565
+
1566
+ before do
1567
+ authorized_collection.insert_one(name: 'bang')
1568
+ authorized_collection.insert_one(name: 'doink')
1569
+ end
1570
+
1571
+ let(:requests) do
1572
+ [{ update_one: { filter: { name: 'BANG' },
1573
+ update: { "$set" => { name: 'pong' }},
1574
+ collation: collation }},
1575
+ { update_one: { filter: { name: 'DOINK' },
1576
+ update: { "$set" => { name: 'pong' }},
1577
+ collation: collation }}]
1578
+ end
1579
+
1580
+ context 'when the server selected supports collations' do
1581
+ min_server_fcv '3.4'
1582
+
1583
+ let!(:result) do
1584
+ bulk_write.execute
448
1585
  end
449
1586
 
450
- let(:requests) do
451
- [{ update_one: { filter: { a: 0 }, update: { "$set" => { a: 0 }}}}]
1587
+ it 'applies the collation' do
1588
+ expect(authorized_collection.find(name: 'pong').count).to eq(2)
452
1589
  end
453
1590
 
454
1591
  it 'reports the upserted id' do
@@ -459,106 +1596,80 @@ describe Mongo::BulkWrite do
459
1596
  expect(result.upserted_count).to eq(0)
460
1597
  end
461
1598
 
462
- it 'reports the modified count', if: write_command_enabled? do
463
- expect(result.modified_count).to eq(0)
1599
+ it 'reports the modified count' do
1600
+ expect(result.modified_count).to eq(2)
464
1601
  end
465
1602
 
466
1603
  it 'reports the matched count' do
467
- expect(result.matched_count).to eq(1)
1604
+ expect(result.matched_count).to eq(2)
468
1605
  end
469
1606
  end
470
1607
 
471
- context 'when the number of updates exceeds the max batch size', if: write_command_enabled? do
472
-
473
- let(:requests) do
474
- 1001.times.collect do |i|
475
- { update_one: { filter: { a: i }, update: { "$set" => { a: i, b: 3 }}, upsert: true }}
476
- end
477
- end
1608
+ context 'when the server selected does not support collations' do
1609
+ max_server_version '3.2'
478
1610
 
479
- it 'updates the documents and reports the correct number of upserted ids' do
480
- expect(result.upserted_ids.size).to eq(1001)
481
- expect(authorized_collection.find(b: 3).count).to eq(1001)
1611
+ it 'raises an exception' do
1612
+ expect {
1613
+ bulk_write.execute
1614
+ }.to raise_exception(Mongo::Error::UnsupportedCollation)
482
1615
  end
483
- end
484
-
485
- context 'when there is a write concern error' do
486
1616
 
487
- context 'when the server version is < 2.6' do
1617
+ context 'when a String key is used' do
488
1618
 
489
- it 'raises a BulkWriteError', if: !write_command_enabled? && standalone? do
490
- expect {
491
- bulk_write_invalid_write_concern.execute
492
- }.to raise_error(Mongo::Error::BulkWriteError)
1619
+ let(:requests) do
1620
+ [{ update_one: { filter: { name: 'BANG' },
1621
+ update: { "$set" => { name: 'pong' }},
1622
+ 'collation' => collation }},
1623
+ { update_one: { filter: { name: 'DOINK' },
1624
+ update: { "$set" => { name: 'pong' }},
1625
+ 'collation' => collation }}]
493
1626
  end
494
- end
495
-
496
- context 'when the server version has write commands enabled' do
497
1627
 
498
- it 'raises an OperationFailure', if: write_command_enabled? && standalone? do
1628
+ it 'raises an exception' do
499
1629
  expect {
500
- bulk_write_invalid_write_concern.execute
501
- }.to raise_error(Mongo::Error::OperationFailure)
1630
+ bulk_write.execute
1631
+ }.to raise_exception(Mongo::Error::UnsupportedCollation)
502
1632
  end
503
1633
  end
504
1634
  end
505
1635
  end
506
1636
 
507
- context 'when upsert is true' do
1637
+ context 'when the write does not have a collation specified' do
1638
+
1639
+ before do
1640
+ authorized_collection.insert_one(name: 'bang')
1641
+ authorized_collection.insert_one(name: 'doink')
1642
+ end
508
1643
 
509
1644
  let(:requests) do
510
- [{ update_one: { filter: { _id: 0 }, update: { "$set" => { name: 'test' } }, upsert: true }}]
1645
+ [{ update_one: { filter: { name: 'BANG' }, update: { "$set" => { name: 'pong' }}}},
1646
+ { update_one: { filter: { name: 'DOINK' }, update: { "$set" => { name: 'pong' }}}}]
511
1647
  end
512
1648
 
513
- let(:result) do
1649
+ let!(:result) do
514
1650
  bulk_write.execute
515
1651
  end
516
1652
 
517
- it 'updates the document' do
518
- result
519
- expect(authorized_collection.find(_id: 0).first[:name]).to eq('test')
1653
+ it 'does not apply the collation' do
1654
+ expect(authorized_collection.find(name: 'pong').count).to eq(0)
520
1655
  end
521
1656
 
522
- it 'reports the upserted count' do
523
- expect(result.upserted_count).to eq(1)
1657
+ it 'reports the upserted id' do
1658
+ expect(result.upserted_ids).to eq([])
524
1659
  end
525
1660
 
526
- it 'reports the matched count' do
527
- expect(result.modified_count).to eq(0)
1661
+ it 'reports the upserted count' do
1662
+ expect(result.upserted_count).to eq(0)
528
1663
  end
529
1664
 
530
1665
  it 'reports the modified count' do
531
1666
  expect(result.modified_count).to eq(0)
532
1667
  end
533
1668
 
534
- it 'reports the upserted id', if: write_command_enabled? do
535
- expect(result.upserted_ids).to eq([0])
536
- end
537
-
538
- context 'when there is a write concern error' do
539
-
540
- context 'when the server version is < 2.6' do
541
-
542
- it 'raises a BulkWriteError', if: !write_command_enabled? && standalone? do
543
- expect {
544
- bulk_write_invalid_write_concern.execute
545
- }.to raise_error(Mongo::Error::BulkWriteError)
546
- end
547
- end
548
-
549
- context 'when the server version has write commands enabled' do
550
-
551
- it 'raises an OperationFailure', if: write_command_enabled? && standalone? do
552
- expect {
553
- bulk_write_invalid_write_concern.execute
554
- }.to raise_error(Mongo::Error::OperationFailure)
555
- end
556
- end
1669
+ it 'reports the matched count' do
1670
+ expect(result.matched_count).to eq(0)
557
1671
  end
558
1672
  end
559
- end
560
-
561
- context 'when providing multiple update ones' do
562
1673
 
563
1674
  context 'when upsert is false' do
564
1675
 
@@ -593,10 +1704,9 @@ describe Mongo::BulkWrite do
593
1704
  end
594
1705
 
595
1706
  it 'reports the matched count' do
596
- expect(result.modified_count).to eq(2)
1707
+ expect(result.matched_count).to eq(2)
597
1708
  end
598
1709
 
599
-
600
1710
  context 'when there is a mix of updates and matched without an update' do
601
1711
 
602
1712
  let(:requests) do
@@ -625,14 +1735,10 @@ describe Mongo::BulkWrite do
625
1735
  expect(result.upserted_count).to eq(0)
626
1736
  end
627
1737
 
628
- it 'reports the modified count', if: write_command_enabled? do
1738
+ it 'reports the modified count' do
629
1739
  expect(result.modified_count).to eq(1)
630
1740
  end
631
1741
 
632
- it 'reports the modified count', unless: write_command_enabled? do
633
- expect(result.modified_count).to eq(2)
634
- end
635
-
636
1742
  it 'reports the matched count' do
637
1743
  expect(result.matched_count).to eq(2)
638
1744
  end
@@ -640,23 +1746,7 @@ describe Mongo::BulkWrite do
640
1746
 
641
1747
  context 'when there is a write concern error' do
642
1748
 
643
- context 'when the server version is < 2.6' do
644
-
645
- it 'raises a BulkWriteError', if: !write_command_enabled? && standalone? do
646
- expect {
647
- bulk_write_invalid_write_concern.execute
648
- }.to raise_error(Mongo::Error::BulkWriteError)
649
- end
650
- end
651
-
652
- context 'when the server version has write commands enabled' do
653
-
654
- it 'raises an OperationFailure', if: write_command_enabled? && standalone? do
655
- expect {
656
- bulk_write_invalid_write_concern.execute
657
- }.to raise_error(Mongo::Error::OperationFailure)
658
- end
659
- end
1749
+ it_behaves_like 'bulk write with write concern yielding operation failure'
660
1750
  end
661
1751
  end
662
1752
 
@@ -688,7 +1778,7 @@ describe Mongo::BulkWrite do
688
1778
  expect(result.matched_count).to eq(0)
689
1779
  end
690
1780
 
691
- it 'reports the upserted id', if: write_command_enabled? do
1781
+ it 'reports the upserted id' do
692
1782
  expect(result.upserted_ids).to eq([0, 1])
693
1783
  end
694
1784
 
@@ -714,7 +1804,7 @@ describe Mongo::BulkWrite do
714
1804
  expect(authorized_collection.find(a: 4).count).to eq(1)
715
1805
  end
716
1806
 
717
- it 'reports the upserted id', if: write_command_enabled? do
1807
+ it 'reports the upserted id' do
718
1808
  expect(result.upserted_ids).to eq([3])
719
1809
  end
720
1810
 
@@ -722,11 +1812,57 @@ describe Mongo::BulkWrite do
722
1812
  expect(result.upserted_count).to eq(1)
723
1813
  end
724
1814
 
725
- it 'reports the modified count', if: write_command_enabled? do
1815
+ it 'reports the modified count' do
726
1816
  expect(result.modified_count).to eq(1)
727
1817
  end
728
1818
 
729
- it 'reports the modified count', unless: write_command_enabled? do
1819
+ it 'reports the matched count' do
1820
+ expect(result.matched_count).to eq(2)
1821
+ end
1822
+ end
1823
+
1824
+ context 'when there is a write concern error' do
1825
+
1826
+ it_behaves_like 'bulk write with write concern yielding operation failure'
1827
+ end
1828
+ end
1829
+ end
1830
+
1831
+ context 'when providing a single update many' do
1832
+
1833
+ context 'when the write has a collation specified' do
1834
+
1835
+ before do
1836
+ authorized_collection.insert_one(name: 'bang')
1837
+ authorized_collection.insert_one(name: 'bang')
1838
+ end
1839
+
1840
+ let(:requests) do
1841
+ [{ update_many: { filter: { name: 'BANG' },
1842
+ update: { "$set" => { name: 'pong' }},
1843
+ collation: collation }}]
1844
+ end
1845
+
1846
+ context 'when the server selected supports collations' do
1847
+ min_server_fcv '3.4'
1848
+
1849
+ let!(:result) do
1850
+ bulk_write.execute
1851
+ end
1852
+
1853
+ it 'applies the collation' do
1854
+ expect(authorized_collection.find(name: 'pong').count).to eq(2)
1855
+ end
1856
+
1857
+ it 'reports the upserted id' do
1858
+ expect(result.upserted_ids).to eq([])
1859
+ end
1860
+
1861
+ it 'reports the upserted count' do
1862
+ expect(result.upserted_count).to eq(0)
1863
+ end
1864
+
1865
+ it 'reports the modified count' do
730
1866
  expect(result.modified_count).to eq(2)
731
1867
  end
732
1868
 
@@ -735,30 +1871,67 @@ describe Mongo::BulkWrite do
735
1871
  end
736
1872
  end
737
1873
 
738
- context 'when there is a write concern error' do
739
-
740
- context 'when the server version is < 2.6' do
1874
+ context 'when the server selected does not support collations' do
1875
+ max_server_version '3.2'
741
1876
 
742
- it 'raises a BulkWriteError', if: !write_command_enabled? && standalone? do
743
- expect {
744
- bulk_write_invalid_write_concern.execute
745
- }.to raise_error(Mongo::Error::BulkWriteError)
746
- end
1877
+ it 'raises an exception' do
1878
+ expect {
1879
+ bulk_write.execute
1880
+ }.to raise_exception(Mongo::Error::UnsupportedCollation)
747
1881
  end
748
1882
 
749
- context 'when the server version has write commands enabled' do
1883
+ context 'when a String key is used' do
1884
+
1885
+ let(:requests) do
1886
+ [{ update_many: { filter: { name: 'BANG' },
1887
+ update: { "$set" => { name: 'pong' }},
1888
+ 'collation' => collation }}]
1889
+ end
750
1890
 
751
- it 'raises an OperationFailure', if: write_command_enabled? && standalone? do
1891
+ it 'raises an exception' do
752
1892
  expect {
753
- bulk_write_invalid_write_concern.execute
754
- }.to raise_error(Mongo::Error::OperationFailure)
1893
+ bulk_write.execute
1894
+ }.to raise_exception(Mongo::Error::UnsupportedCollation)
755
1895
  end
756
1896
  end
757
1897
  end
758
1898
  end
759
- end
760
1899
 
761
- context 'when providing a single update many' do
1900
+ context 'when the write does not have a collation specified' do
1901
+
1902
+ before do
1903
+ authorized_collection.insert_one(name: 'bang')
1904
+ authorized_collection.insert_one(name: 'bang')
1905
+ end
1906
+
1907
+ let(:requests) do
1908
+ [{ update_many: { filter: { name: 'BANG' }, update: { "$set" => { name: 'pong' }}}}]
1909
+ end
1910
+
1911
+ let!(:result) do
1912
+ bulk_write.execute
1913
+ end
1914
+
1915
+ it 'does not apply the collation' do
1916
+ expect(authorized_collection.find(name: 'pong').count).to eq(0)
1917
+ end
1918
+
1919
+ it 'reports the upserted id' do
1920
+ expect(result.upserted_ids).to eq([])
1921
+ end
1922
+
1923
+ it 'reports the upserted count' do
1924
+ expect(result.upserted_count).to eq(0)
1925
+ end
1926
+
1927
+ it 'reports the modified count' do
1928
+ expect(result.modified_count).to eq(0)
1929
+ end
1930
+
1931
+ it 'reports the matched count' do
1932
+ expect(result.matched_count).to be(0)
1933
+ end
1934
+ end
762
1935
 
763
1936
  context 'when upsert is false' do
764
1937
 
@@ -791,28 +1964,12 @@ describe Mongo::BulkWrite do
791
1964
  end
792
1965
 
793
1966
  it 'reports the matched count' do
794
- expect(result.modified_count).to eq(2)
1967
+ expect(result.matched_count).to eq(2)
795
1968
  end
796
1969
 
797
1970
  context 'when there is a write concern error' do
798
1971
 
799
- context 'when the server version is < 2.6' do
800
-
801
- it 'raises a BulkWriteError', if: !write_command_enabled? && standalone? do
802
- expect {
803
- bulk_write_invalid_write_concern.execute
804
- }.to raise_error(Mongo::Error::BulkWriteError)
805
- end
806
- end
807
-
808
- context 'when the server version has write commands enabled' do
809
-
810
- it 'raises an OperationFailure', if: write_command_enabled? && standalone? do
811
- expect {
812
- bulk_write_invalid_write_concern.execute
813
- }.to raise_error(Mongo::Error::OperationFailure)
814
- end
815
- end
1972
+ it_behaves_like 'bulk write with write concern yielding operation failure'
816
1973
  end
817
1974
  end
818
1975
 
@@ -843,40 +2000,40 @@ describe Mongo::BulkWrite do
843
2000
  expect(result.modified_count).to eq(0)
844
2001
  end
845
2002
 
846
- it 'reports the upserted id', if: write_command_enabled? do
2003
+ it 'reports the upserted id' do
847
2004
  expect(result.upserted_ids).to eq([0])
848
2005
  end
849
2006
 
850
2007
  context 'when there is a write concern error' do
851
2008
 
852
- context 'when the server version is < 2.6' do
853
-
854
- it 'raises a BulkWriteError', if: !write_command_enabled? && standalone? do
855
- expect {
856
- bulk_write_invalid_write_concern.execute
857
- }.to raise_error(Mongo::Error::BulkWriteError)
858
- end
859
- end
860
-
861
- context 'when the server version has write commands enabled' do
862
-
863
- it 'raises an OperationFailure', if: write_command_enabled? && standalone? do
864
- expect {
865
- bulk_write_invalid_write_concern.execute
866
- }.to raise_error(Mongo::Error::OperationFailure)
867
- end
868
- end
2009
+ it_behaves_like 'bulk write with write concern yielding operation failure'
869
2010
  end
870
2011
  end
871
2012
  end
872
2013
  end
873
2014
 
874
2015
  context 'when the operations need to be split' do
2016
+ # Test uses doubles for server descriptions, doubles are
2017
+ # incompatible with freezing which linting does for descriptions
2018
+ require_no_linting
2019
+
2020
+ let(:batch_size) do
2021
+ 11
2022
+ end
2023
+
2024
+ let(:connection) do
2025
+ server = client.cluster.next_primary
2026
+ end
2027
+
2028
+ before do
2029
+ allow_any_instance_of(Mongo::Server::Description).to \
2030
+ receive(:max_write_batch_size).and_return(batch_size - 1)
2031
+ end
875
2032
 
876
2033
  context 'when a write error occurs' do
877
2034
 
878
2035
  let(:requests) do
879
- 1001.times.map do |i|
2036
+ batch_size.times.map do |i|
880
2037
  { insert_one: { _id: i }}
881
2038
  end
882
2039
  end
@@ -898,14 +2055,14 @@ describe Mongo::BulkWrite do
898
2055
 
899
2056
  it 'sets the document index on the error' do
900
2057
  requests.push({ insert_one: { _id: 5 }})
901
- expect(error.result[Mongo::Error::WRITE_ERRORS].first['index']).to eq(1001)
2058
+ expect(error.result['writeErrors'].first['index']).to eq(batch_size)
902
2059
  end
903
2060
  end
904
2061
 
905
2062
  context 'when no write errors occur' do
906
2063
 
907
2064
  let(:requests) do
908
- 1001.times.map do |i|
2065
+ batch_size.times.map do |i|
909
2066
  { insert_one: { _id: i }}
910
2067
  end
911
2068
  end
@@ -915,11 +2072,87 @@ describe Mongo::BulkWrite do
915
2072
  end
916
2073
 
917
2074
  it 'inserts the documents' do
918
- expect(result.inserted_count).to eq(1001)
2075
+ expect(result.inserted_count).to eq(batch_size)
919
2076
  end
920
2077
 
921
2078
  it 'combines the inserted ids' do
922
- expect(result.inserted_ids.size).to eq(1001)
2079
+ expect(result.inserted_ids.size).to eq(batch_size)
2080
+ end
2081
+
2082
+ context 'when a session is provided' do
2083
+
2084
+ let(:operation) do
2085
+ result
2086
+ end
2087
+
2088
+ let(:client) do
2089
+ authorized_client
2090
+ end
2091
+
2092
+ let(:extra_options) do
2093
+ { session: session }
2094
+ end
2095
+
2096
+ it_behaves_like 'an operation using a session'
2097
+ end
2098
+
2099
+ context 'when retryable writes are supported' do
2100
+ require_wired_tiger
2101
+ min_server_fcv '3.6'
2102
+ require_topology :replica_set, :sharded
2103
+
2104
+ # In a multi-shard cluster, retries may go to a different server
2105
+ # than original command which these tests are not prepared to handle
2106
+ require_no_multi_mongos
2107
+
2108
+
2109
+ let(:subscriber) { Mrss::EventSubscriber.new }
2110
+
2111
+ let(:client) do
2112
+ authorized_client_with_retry_writes.tap do |client|
2113
+ # We do not unsubscribe any of these subscribers.
2114
+ # This is harmless since they simply store the events in themselves.
2115
+ client.subscribe(Mongo::Monitoring::COMMAND, subscriber)
2116
+ end
2117
+ end
2118
+
2119
+ let(:collection) do
2120
+ client[authorized_collection.name]
2121
+ end
2122
+
2123
+ let!(:result) do
2124
+ bulk_write.execute
2125
+ end
2126
+
2127
+ let(:started_events) do
2128
+ subscriber.started_events.select do |event|
2129
+ event.command['insert']
2130
+ end
2131
+ end
2132
+
2133
+ let(:first_txn_number) do
2134
+ Utils.int64_value(started_events[-2].command['txnNumber'])
2135
+ end
2136
+
2137
+ let(:second_txn_number) do
2138
+ Utils.int64_value(started_events[-1].command['txnNumber'])
2139
+ end
2140
+
2141
+ it 'inserts the documents' do
2142
+ expect(result.inserted_count).to eq(batch_size)
2143
+ end
2144
+
2145
+ it 'combines the inserted ids' do
2146
+ expect(result.inserted_ids.size).to eq(batch_size)
2147
+ end
2148
+
2149
+ it 'publishes the expected number of events' do
2150
+ expect(started_events.length).to eq 2
2151
+ end
2152
+
2153
+ it 'increments the transaction number' do
2154
+ expect(second_txn_number). to eq(first_txn_number + 1)
2155
+ end
923
2156
  end
924
2157
  end
925
2158
  end
@@ -939,17 +2172,42 @@ describe Mongo::BulkWrite do
939
2172
  it 'inserts the documents' do
940
2173
  expect(result.inserted_count).to eq(5)
941
2174
  end
2175
+
2176
+ context 'when a session is provided' do
2177
+
2178
+ let(:operation) do
2179
+ result
2180
+ end
2181
+
2182
+ let(:client) do
2183
+ authorized_client
2184
+ end
2185
+
2186
+ let(:extra_options) do
2187
+ { session: session }
2188
+ end
2189
+
2190
+ it_behaves_like 'an operation using a session'
2191
+ end
942
2192
  end
943
2193
  end
944
2194
 
945
2195
  context 'when the bulk write is unordered' do
946
2196
 
947
2197
  let(:bulk_write) do
948
- described_class.new(authorized_collection, requests, ordered: false)
2198
+ described_class.new(collection, requests, options)
2199
+ end
2200
+
2201
+ let(:options) do
2202
+ { ordered: false }.merge(extra_options)
2203
+ end
2204
+
2205
+ let(:extra_options) do
2206
+ {}
949
2207
  end
950
2208
 
951
2209
  let(:bulk_write_invalid_write_concern) do
952
- described_class.new(collection_invalid_write_concern, requests, ordered: false)
2210
+ described_class.new(collection_invalid_write_concern, requests, options)
953
2211
  end
954
2212
 
955
2213
  it_behaves_like 'an executable bulk write'
@@ -958,11 +2216,19 @@ describe Mongo::BulkWrite do
958
2216
  context 'when the bulk write is ordered' do
959
2217
 
960
2218
  let(:bulk_write) do
961
- described_class.new(authorized_collection, requests, ordered: true)
2219
+ described_class.new(collection, requests, options)
2220
+ end
2221
+
2222
+ let(:options) do
2223
+ { ordered: true }.merge(extra_options)
2224
+ end
2225
+
2226
+ let(:extra_options) do
2227
+ {}
962
2228
  end
963
2229
 
964
2230
  let(:bulk_write_invalid_write_concern) do
965
- described_class.new(collection_invalid_write_concern, requests, ordered: true)
2231
+ described_class.new(collection_invalid_write_concern, requests, options)
966
2232
  end
967
2233
 
968
2234
  it_behaves_like 'an executable bulk write'
@@ -1039,8 +2305,12 @@ describe Mongo::BulkWrite do
1039
2305
 
1040
2306
  context 'when the option is true' do
1041
2307
 
2308
+ let(:options) do
2309
+ { ordered: true }
2310
+ end
2311
+
1042
2312
  let(:bulk_write) do
1043
- described_class.new(authorized_collection, [], ordered: true)
2313
+ described_class.new(authorized_collection, [], options)
1044
2314
  end
1045
2315
 
1046
2316
  it 'returns true' do
@@ -1050,8 +2320,12 @@ describe Mongo::BulkWrite do
1050
2320
 
1051
2321
  context 'when the option is false' do
1052
2322
 
2323
+ let(:options) do
2324
+ { ordered: false }
2325
+ end
2326
+
1053
2327
  let(:bulk_write) do
1054
- described_class.new(authorized_collection, [], ordered: false)
2328
+ described_class.new(authorized_collection, [], options)
1055
2329
  end
1056
2330
 
1057
2331
  it 'returns false' do
@@ -1061,14 +2335,20 @@ describe Mongo::BulkWrite do
1061
2335
  end
1062
2336
  end
1063
2337
 
1064
- describe 'when the collection has a validator', if: find_command_enabled? do
2338
+ describe 'when the collection has a validator' do
2339
+ min_server_fcv '3.2'
1065
2340
 
1066
- before do
1067
- collection_with_validator.insert_many([{ :a => 1 }, { :a => 2 }])
2341
+ let(:collection_with_validator) do
2342
+ authorized_client[:validating,
2343
+ :validator => { :a => { '$exists' => true } }].tap do |c|
2344
+ c.create
2345
+ end
1068
2346
  end
1069
2347
 
1070
- after do
2348
+ before do
2349
+ begin; authorized_client[:validating].drop; rescue; end
1071
2350
  collection_with_validator.delete_many
2351
+ collection_with_validator.insert_many([{ :a => 1 }, { :a => 2 }])
1072
2352
  end
1073
2353
 
1074
2354
  context 'when the documents are invalid' do