mongo 1.8.6 → 2.15.1

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