mongo 2.12.4 → 2.13.0.beta1

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 (817) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data.tar.gz.sig +0 -0
  4. data/CONTRIBUTING.md +8 -36
  5. data/LICENSE +1 -1
  6. data/README.md +54 -54
  7. data/Rakefile +1 -1
  8. data/lib/mongo.rb +4 -1
  9. data/lib/mongo/active_support.rb +1 -1
  10. data/lib/mongo/address.rb +40 -13
  11. data/lib/mongo/address/ipv4.rb +32 -5
  12. data/lib/mongo/address/ipv6.rb +32 -5
  13. data/lib/mongo/address/unix.rb +3 -3
  14. data/lib/mongo/address/validator.rb +1 -1
  15. data/lib/mongo/auth.rb +36 -13
  16. data/lib/mongo/auth/aws.rb +37 -0
  17. data/lib/mongo/auth/aws/conversation.rb +128 -0
  18. data/lib/mongo/auth/aws/credentials_retriever.rb +219 -0
  19. data/lib/mongo/auth/aws/request.rb +257 -0
  20. data/lib/mongo/auth/base.rb +129 -0
  21. data/lib/mongo/auth/conversation_base.rb +52 -0
  22. data/lib/mongo/auth/cr.rb +9 -36
  23. data/lib/mongo/auth/cr/conversation.rb +24 -69
  24. data/lib/mongo/auth/credential_cache.rb +1 -1
  25. data/lib/mongo/auth/gssapi.rb +38 -0
  26. data/lib/mongo/auth/gssapi/conversation.rb +108 -0
  27. data/lib/mongo/auth/ldap.rb +9 -34
  28. data/lib/mongo/auth/ldap/conversation.rb +3 -43
  29. data/lib/mongo/auth/roles.rb +1 -1
  30. data/lib/mongo/auth/sasl_conversation_base.rb +111 -0
  31. data/lib/mongo/auth/scram.rb +39 -51
  32. data/lib/mongo/auth/scram/conversation.rb +12 -506
  33. data/lib/mongo/auth/scram256.rb +31 -0
  34. data/lib/mongo/auth/scram256/conversation.rb +63 -0
  35. data/lib/mongo/auth/scram_conversation_base.rb +402 -0
  36. data/lib/mongo/auth/stringprep.rb +5 -4
  37. data/lib/mongo/auth/stringprep/profiles/sasl.rb +2 -1
  38. data/lib/mongo/auth/stringprep/tables.rb +2 -1
  39. data/lib/mongo/auth/stringprep/unicode_normalize/normalize.rb +1 -0
  40. data/lib/mongo/auth/stringprep/unicode_normalize/tables.rb +1 -0
  41. data/lib/mongo/auth/user.rb +2 -2
  42. data/lib/mongo/auth/user/view.rb +1 -1
  43. data/lib/mongo/auth/x509.rb +14 -32
  44. data/lib/mongo/auth/x509/conversation.rb +15 -42
  45. data/lib/mongo/background_thread.rb +11 -2
  46. data/lib/mongo/bson.rb +1 -1
  47. data/lib/mongo/bulk_write.rb +61 -26
  48. data/lib/mongo/bulk_write/combineable.rb +20 -8
  49. data/lib/mongo/bulk_write/ordered_combiner.rb +1 -1
  50. data/lib/mongo/bulk_write/result.rb +1 -1
  51. data/lib/mongo/bulk_write/result_combiner.rb +1 -1
  52. data/lib/mongo/bulk_write/transformable.rb +9 -10
  53. data/lib/mongo/bulk_write/unordered_combiner.rb +1 -1
  54. data/lib/mongo/bulk_write/validatable.rb +5 -1
  55. data/lib/mongo/client.rb +38 -23
  56. data/lib/mongo/client_encryption.rb +1 -1
  57. data/lib/mongo/cluster.rb +126 -54
  58. data/lib/mongo/cluster/periodic_executor.rb +1 -1
  59. data/lib/mongo/cluster/reapers/cursor_reaper.rb +1 -1
  60. data/lib/mongo/cluster/reapers/socket_reaper.rb +1 -1
  61. data/lib/mongo/cluster/sdam_flow.rb +23 -7
  62. data/lib/mongo/cluster/topology.rb +19 -2
  63. data/lib/mongo/cluster/topology/base.rb +1 -1
  64. data/lib/mongo/cluster/topology/no_replica_set_options.rb +1 -1
  65. data/lib/mongo/cluster/topology/replica_set_no_primary.rb +1 -1
  66. data/lib/mongo/cluster/topology/replica_set_with_primary.rb +1 -1
  67. data/lib/mongo/cluster/topology/sharded.rb +1 -1
  68. data/lib/mongo/cluster/topology/single.rb +1 -1
  69. data/lib/mongo/cluster/topology/unknown.rb +1 -1
  70. data/lib/mongo/cluster_time.rb +1 -1
  71. data/lib/mongo/collection.rb +24 -8
  72. data/lib/mongo/collection/view.rb +6 -2
  73. data/lib/mongo/collection/view/aggregation.rb +6 -3
  74. data/lib/mongo/collection/view/builder.rb +1 -1
  75. data/lib/mongo/collection/view/builder/aggregation.rb +1 -1
  76. data/lib/mongo/collection/view/builder/find_command.rb +9 -1
  77. data/lib/mongo/collection/view/builder/flags.rb +1 -1
  78. data/lib/mongo/collection/view/builder/map_reduce.rb +1 -1
  79. data/lib/mongo/collection/view/builder/modifiers.rb +1 -1
  80. data/lib/mongo/collection/view/builder/op_query.rb +1 -1
  81. data/lib/mongo/collection/view/change_stream.rb +3 -6
  82. data/lib/mongo/collection/view/change_stream/retryable.rb +1 -1
  83. data/lib/mongo/collection/view/explainable.rb +1 -1
  84. data/lib/mongo/collection/view/immutable.rb +1 -1
  85. data/lib/mongo/collection/view/iterable.rb +8 -2
  86. data/lib/mongo/collection/view/map_reduce.rb +7 -4
  87. data/lib/mongo/collection/view/readable.rb +11 -5
  88. data/lib/mongo/collection/view/writable.rb +52 -8
  89. data/lib/mongo/crypt.rb +1 -1
  90. data/lib/mongo/crypt/auto_decryption_context.rb +1 -1
  91. data/lib/mongo/crypt/auto_encrypter.rb +1 -1
  92. data/lib/mongo/crypt/auto_encryption_context.rb +1 -1
  93. data/lib/mongo/crypt/binary.rb +1 -1
  94. data/lib/mongo/crypt/binding.rb +1 -1
  95. data/lib/mongo/crypt/context.rb +1 -1
  96. data/lib/mongo/crypt/data_key_context.rb +1 -1
  97. data/lib/mongo/crypt/encryption_io.rb +41 -24
  98. data/lib/mongo/crypt/explicit_decryption_context.rb +1 -1
  99. data/lib/mongo/crypt/explicit_encrypter.rb +1 -1
  100. data/lib/mongo/crypt/explicit_encryption_context.rb +1 -1
  101. data/lib/mongo/crypt/handle.rb +1 -1
  102. data/lib/mongo/crypt/hooks.rb +1 -1
  103. data/lib/mongo/crypt/kms_context.rb +1 -1
  104. data/lib/mongo/crypt/status.rb +1 -1
  105. data/lib/mongo/cursor.rb +3 -3
  106. data/lib/mongo/cursor/builder.rb +1 -1
  107. data/lib/mongo/cursor/builder/get_more_command.rb +1 -1
  108. data/lib/mongo/cursor/builder/kill_cursors_command.rb +1 -1
  109. data/lib/mongo/cursor/builder/op_get_more.rb +1 -1
  110. data/lib/mongo/cursor/builder/op_kill_cursors.rb +1 -1
  111. data/lib/mongo/database.rb +4 -1
  112. data/lib/mongo/database/view.rb +2 -2
  113. data/lib/mongo/dbref.rb +1 -1
  114. data/lib/mongo/error.rb +25 -2
  115. data/lib/mongo/error/auth_error.rb +1 -1
  116. data/lib/mongo/error/bulk_write_error.rb +1 -1
  117. data/lib/mongo/error/change_stream_resumable.rb +1 -1
  118. data/lib/mongo/error/closed_stream.rb +1 -1
  119. data/lib/mongo/error/connection_check_out_timeout.rb +1 -1
  120. data/lib/mongo/error/connection_perished.rb +23 -0
  121. data/lib/mongo/error/credential_check_error.rb +26 -0
  122. data/lib/mongo/error/extra_file_chunk.rb +1 -1
  123. data/lib/mongo/error/file_not_found.rb +1 -1
  124. data/lib/mongo/error/handshake_error.rb +1 -1
  125. data/lib/mongo/error/insufficient_iteration_count.rb +1 -1
  126. data/lib/mongo/error/invalid_address.rb +1 -1
  127. data/lib/mongo/error/invalid_application_name.rb +1 -1
  128. data/lib/mongo/error/invalid_bulk_operation.rb +1 -1
  129. data/lib/mongo/error/invalid_bulk_operation_type.rb +1 -1
  130. data/lib/mongo/error/invalid_collection_name.rb +1 -1
  131. data/lib/mongo/error/invalid_cursor_operation.rb +1 -1
  132. data/lib/mongo/error/invalid_database_name.rb +1 -1
  133. data/lib/mongo/error/invalid_document.rb +1 -1
  134. data/lib/mongo/error/invalid_file.rb +1 -1
  135. data/lib/mongo/error/invalid_file_revision.rb +1 -1
  136. data/lib/mongo/error/invalid_min_pool_size.rb +1 -1
  137. data/lib/mongo/error/invalid_nonce.rb +2 -2
  138. data/lib/mongo/error/invalid_read_option.rb +1 -1
  139. data/lib/mongo/error/invalid_replacement_document.rb +1 -1
  140. data/lib/mongo/error/invalid_server_auth_response.rb +23 -0
  141. data/lib/mongo/error/invalid_server_preference.rb +6 -1
  142. data/lib/mongo/error/invalid_session.rb +1 -1
  143. data/lib/mongo/error/invalid_signature.rb +1 -1
  144. data/lib/mongo/error/invalid_transaction_operation.rb +1 -1
  145. data/lib/mongo/error/invalid_txt_record.rb +1 -1
  146. data/lib/mongo/error/invalid_update_document.rb +1 -1
  147. data/lib/mongo/error/invalid_uri.rb +1 -1
  148. data/lib/mongo/error/invalid_write_concern.rb +1 -1
  149. data/lib/mongo/error/lint_error.rb +1 -1
  150. data/lib/mongo/error/max_bson_size.rb +1 -1
  151. data/lib/mongo/error/max_message_size.rb +1 -1
  152. data/lib/mongo/error/mismatched_domain.rb +1 -1
  153. data/lib/mongo/error/missing_file_chunk.rb +1 -1
  154. data/lib/mongo/error/missing_password.rb +1 -1
  155. data/lib/mongo/error/missing_resume_token.rb +1 -1
  156. data/lib/mongo/error/missing_scram_server_signature.rb +27 -0
  157. data/lib/mongo/error/multi_index_drop.rb +1 -1
  158. data/lib/mongo/error/need_primary_server.rb +1 -1
  159. data/lib/mongo/error/no_server_available.rb +1 -1
  160. data/lib/mongo/error/no_srv_records.rb +1 -1
  161. data/lib/mongo/error/notable.rb +18 -3
  162. data/lib/mongo/error/operation_failure.rb +62 -49
  163. data/lib/mongo/error/parser.rb +16 -5
  164. data/lib/mongo/error/pool_closed_error.rb +1 -1
  165. data/lib/mongo/error/raise_original_error.rb +29 -0
  166. data/lib/mongo/error/session_ended.rb +1 -1
  167. data/lib/mongo/error/socket_error.rb +1 -1
  168. data/lib/mongo/error/socket_timeout_error.rb +1 -1
  169. data/lib/mongo/error/unchangeable_collection_option.rb +1 -1
  170. data/lib/mongo/error/unexpected_chunk_length.rb +1 -1
  171. data/lib/mongo/error/unexpected_response.rb +1 -1
  172. data/lib/mongo/error/unknown_payload_type.rb +1 -1
  173. data/lib/mongo/error/unsupported_array_filters.rb +7 -2
  174. data/lib/mongo/error/unsupported_collation.rb +7 -2
  175. data/lib/mongo/error/unsupported_features.rb +1 -1
  176. data/lib/mongo/error/unsupported_message_type.rb +1 -1
  177. data/lib/mongo/error/unsupported_option.rb +99 -0
  178. data/lib/mongo/error/write_retryable.rb +1 -1
  179. data/lib/mongo/event.rb +1 -1
  180. data/lib/mongo/event/base.rb +1 -1
  181. data/lib/mongo/event/listeners.rb +1 -1
  182. data/lib/mongo/event/publisher.rb +1 -1
  183. data/lib/mongo/event/subscriber.rb +1 -1
  184. data/lib/mongo/grid.rb +1 -1
  185. data/lib/mongo/grid/file.rb +1 -6
  186. data/lib/mongo/grid/file/chunk.rb +1 -3
  187. data/lib/mongo/grid/file/info.rb +1 -1
  188. data/lib/mongo/grid/fs_bucket.rb +20 -17
  189. data/lib/mongo/grid/stream.rb +1 -1
  190. data/lib/mongo/grid/stream/read.rb +1 -1
  191. data/lib/mongo/grid/stream/write.rb +4 -10
  192. data/lib/mongo/id.rb +1 -1
  193. data/lib/mongo/index.rb +2 -1
  194. data/lib/mongo/index/view.rb +58 -11
  195. data/lib/mongo/lint.rb +10 -0
  196. data/lib/mongo/loggable.rb +1 -1
  197. data/lib/mongo/logger.rb +1 -1
  198. data/lib/mongo/monitoring.rb +1 -1
  199. data/lib/mongo/monitoring/cmap_log_subscriber.rb +1 -1
  200. data/lib/mongo/monitoring/command_log_subscriber.rb +12 -5
  201. data/lib/mongo/monitoring/event.rb +1 -1
  202. data/lib/mongo/monitoring/event/cmap.rb +1 -1
  203. data/lib/mongo/monitoring/event/cmap/base.rb +1 -1
  204. data/lib/mongo/monitoring/event/cmap/connection_check_out_failed.rb +1 -1
  205. data/lib/mongo/monitoring/event/cmap/connection_check_out_started.rb +1 -1
  206. data/lib/mongo/monitoring/event/cmap/connection_checked_in.rb +1 -1
  207. data/lib/mongo/monitoring/event/cmap/connection_checked_out.rb +1 -1
  208. data/lib/mongo/monitoring/event/cmap/connection_closed.rb +1 -1
  209. data/lib/mongo/monitoring/event/cmap/connection_created.rb +1 -1
  210. data/lib/mongo/monitoring/event/cmap/connection_ready.rb +1 -1
  211. data/lib/mongo/monitoring/event/cmap/pool_cleared.rb +1 -1
  212. data/lib/mongo/monitoring/event/cmap/pool_closed.rb +1 -1
  213. data/lib/mongo/monitoring/event/cmap/pool_created.rb +1 -1
  214. data/lib/mongo/monitoring/event/command_failed.rb +1 -1
  215. data/lib/mongo/monitoring/event/command_started.rb +9 -3
  216. data/lib/mongo/monitoring/event/command_succeeded.rb +1 -1
  217. data/lib/mongo/monitoring/event/secure.rb +8 -2
  218. data/lib/mongo/monitoring/event/server_closed.rb +1 -1
  219. data/lib/mongo/monitoring/event/server_description_changed.rb +1 -1
  220. data/lib/mongo/monitoring/event/server_heartbeat_failed.rb +1 -1
  221. data/lib/mongo/monitoring/event/server_heartbeat_started.rb +1 -1
  222. data/lib/mongo/monitoring/event/server_heartbeat_succeeded.rb +1 -1
  223. data/lib/mongo/monitoring/event/server_opening.rb +1 -1
  224. data/lib/mongo/monitoring/event/topology_changed.rb +1 -1
  225. data/lib/mongo/monitoring/event/topology_closed.rb +1 -1
  226. data/lib/mongo/monitoring/event/topology_opening.rb +1 -1
  227. data/lib/mongo/monitoring/publishable.rb +5 -8
  228. data/lib/mongo/monitoring/sdam_log_subscriber.rb +1 -1
  229. data/lib/mongo/monitoring/server_closed_log_subscriber.rb +1 -1
  230. data/lib/mongo/monitoring/server_description_changed_log_subscriber.rb +1 -1
  231. data/lib/mongo/monitoring/server_opening_log_subscriber.rb +1 -1
  232. data/lib/mongo/monitoring/topology_changed_log_subscriber.rb +1 -1
  233. data/lib/mongo/monitoring/topology_closed_log_subscriber.rb +1 -1
  234. data/lib/mongo/monitoring/topology_opening_log_subscriber.rb +1 -1
  235. data/lib/mongo/monitoring/unified_sdam_log_subscriber.rb +1 -1
  236. data/lib/mongo/operation.rb +1 -0
  237. data/lib/mongo/operation/aggregate.rb +1 -1
  238. data/lib/mongo/operation/aggregate/command.rb +5 -5
  239. data/lib/mongo/operation/aggregate/op_msg.rb +1 -1
  240. data/lib/mongo/operation/aggregate/result.rb +1 -1
  241. data/lib/mongo/operation/collections_info.rb +3 -36
  242. data/lib/mongo/operation/collections_info/command.rb +40 -0
  243. data/lib/mongo/operation/collections_info/result.rb +1 -1
  244. data/lib/mongo/operation/command.rb +1 -1
  245. data/lib/mongo/operation/command/command.rb +3 -3
  246. data/lib/mongo/operation/command/op_msg.rb +1 -1
  247. data/lib/mongo/operation/count.rb +1 -1
  248. data/lib/mongo/operation/count/command.rb +3 -3
  249. data/lib/mongo/operation/count/op_msg.rb +1 -1
  250. data/lib/mongo/operation/create.rb +1 -1
  251. data/lib/mongo/operation/create/command.rb +3 -3
  252. data/lib/mongo/operation/create/op_msg.rb +1 -1
  253. data/lib/mongo/operation/create_index.rb +1 -1
  254. data/lib/mongo/operation/create_index/command.rb +4 -4
  255. data/lib/mongo/operation/create_index/op_msg.rb +6 -3
  256. data/lib/mongo/operation/create_user.rb +1 -1
  257. data/lib/mongo/operation/create_user/command.rb +4 -4
  258. data/lib/mongo/operation/create_user/op_msg.rb +2 -2
  259. data/lib/mongo/operation/delete.rb +1 -1
  260. data/lib/mongo/operation/delete/bulk_result.rb +1 -1
  261. data/lib/mongo/operation/delete/command.rb +4 -4
  262. data/lib/mongo/operation/delete/legacy.rb +2 -2
  263. data/lib/mongo/operation/delete/op_msg.rb +4 -4
  264. data/lib/mongo/operation/delete/result.rb +2 -2
  265. data/lib/mongo/operation/distinct.rb +1 -1
  266. data/lib/mongo/operation/distinct/command.rb +3 -3
  267. data/lib/mongo/operation/distinct/op_msg.rb +1 -1
  268. data/lib/mongo/operation/drop.rb +1 -1
  269. data/lib/mongo/operation/drop/command.rb +3 -3
  270. data/lib/mongo/operation/drop/op_msg.rb +1 -1
  271. data/lib/mongo/operation/drop_database.rb +1 -1
  272. data/lib/mongo/operation/drop_database/command.rb +3 -3
  273. data/lib/mongo/operation/drop_database/op_msg.rb +1 -1
  274. data/lib/mongo/operation/drop_index.rb +1 -1
  275. data/lib/mongo/operation/drop_index/command.rb +4 -4
  276. data/lib/mongo/operation/drop_index/op_msg.rb +2 -2
  277. data/lib/mongo/operation/explain.rb +1 -1
  278. data/lib/mongo/operation/explain/command.rb +3 -3
  279. data/lib/mongo/operation/explain/legacy.rb +3 -3
  280. data/lib/mongo/operation/explain/op_msg.rb +1 -1
  281. data/lib/mongo/operation/explain/result.rb +1 -1
  282. data/lib/mongo/operation/find.rb +1 -1
  283. data/lib/mongo/operation/find/command.rb +3 -3
  284. data/lib/mongo/operation/find/legacy.rb +3 -3
  285. data/lib/mongo/operation/find/legacy/result.rb +1 -1
  286. data/lib/mongo/operation/find/op_msg.rb +2 -12
  287. data/lib/mongo/operation/find/result.rb +1 -1
  288. data/lib/mongo/operation/get_more.rb +1 -1
  289. data/lib/mongo/operation/get_more/command.rb +3 -3
  290. data/lib/mongo/operation/get_more/legacy.rb +2 -2
  291. data/lib/mongo/operation/get_more/op_msg.rb +2 -12
  292. data/lib/mongo/operation/get_more/result.rb +1 -1
  293. data/lib/mongo/operation/indexes.rb +1 -1
  294. data/lib/mongo/operation/indexes/command.rb +3 -3
  295. data/lib/mongo/operation/indexes/legacy.rb +4 -4
  296. data/lib/mongo/operation/indexes/op_msg.rb +1 -1
  297. data/lib/mongo/operation/indexes/result.rb +1 -1
  298. data/lib/mongo/operation/insert.rb +3 -2
  299. data/lib/mongo/operation/insert/bulk_result.rb +6 -2
  300. data/lib/mongo/operation/insert/command.rb +7 -7
  301. data/lib/mongo/operation/insert/legacy.rb +9 -5
  302. data/lib/mongo/operation/insert/op_msg.rb +6 -6
  303. data/lib/mongo/operation/insert/result.rb +7 -4
  304. data/lib/mongo/operation/kill_cursors.rb +1 -1
  305. data/lib/mongo/operation/kill_cursors/command.rb +3 -3
  306. data/lib/mongo/operation/kill_cursors/legacy.rb +2 -2
  307. data/lib/mongo/operation/kill_cursors/op_msg.rb +1 -1
  308. data/lib/mongo/operation/list_collections.rb +1 -1
  309. data/lib/mongo/operation/list_collections/command.rb +4 -4
  310. data/lib/mongo/operation/list_collections/op_msg.rb +2 -2
  311. data/lib/mongo/operation/list_collections/result.rb +1 -1
  312. data/lib/mongo/operation/map_reduce.rb +1 -1
  313. data/lib/mongo/operation/map_reduce/command.rb +3 -3
  314. data/lib/mongo/operation/map_reduce/op_msg.rb +1 -1
  315. data/lib/mongo/operation/map_reduce/result.rb +1 -1
  316. data/lib/mongo/operation/op_msg_base.rb +3 -3
  317. data/lib/mongo/operation/parallel_scan.rb +1 -1
  318. data/lib/mongo/operation/parallel_scan/command.rb +5 -5
  319. data/lib/mongo/operation/parallel_scan/op_msg.rb +2 -2
  320. data/lib/mongo/operation/parallel_scan/result.rb +1 -1
  321. data/lib/mongo/operation/remove_user.rb +1 -1
  322. data/lib/mongo/operation/remove_user/command.rb +4 -4
  323. data/lib/mongo/operation/remove_user/op_msg.rb +2 -2
  324. data/lib/mongo/operation/result.rb +28 -4
  325. data/lib/mongo/operation/shared/bypass_document_validation.rb +10 -4
  326. data/lib/mongo/operation/shared/causal_consistency_supported.rb +3 -3
  327. data/lib/mongo/operation/shared/collections_info_or_list_collections.rb +56 -0
  328. data/lib/mongo/operation/shared/executable.rb +46 -28
  329. data/lib/mongo/operation/shared/executable_no_validate.rb +3 -3
  330. data/lib/mongo/operation/shared/executable_transaction_label.rb +1 -1
  331. data/lib/mongo/operation/shared/idable.rb +1 -1
  332. data/lib/mongo/operation/shared/limited.rb +10 -2
  333. data/lib/mongo/operation/shared/object_id_generator.rb +1 -1
  334. data/lib/mongo/operation/shared/op_msg_or_command.rb +7 -5
  335. data/lib/mongo/operation/shared/op_msg_or_find_command.rb +8 -6
  336. data/lib/mongo/operation/shared/op_msg_or_list_indexes_command.rb +8 -6
  337. data/lib/mongo/operation/shared/polymorphic_lookup.rb +1 -1
  338. data/lib/mongo/operation/shared/polymorphic_result.rb +1 -1
  339. data/lib/mongo/operation/shared/read_preference_supported.rb +19 -16
  340. data/lib/mongo/operation/shared/response_handling.rb +83 -8
  341. data/lib/mongo/operation/shared/result/aggregatable.rb +1 -1
  342. data/lib/mongo/operation/shared/result/use_legacy_error_parser.rb +1 -1
  343. data/lib/mongo/operation/shared/sessions_supported.rb +50 -27
  344. data/lib/mongo/operation/shared/specifiable.rb +32 -20
  345. data/lib/mongo/operation/shared/write.rb +25 -19
  346. data/lib/mongo/operation/shared/write_concern_supported.rb +6 -6
  347. data/lib/mongo/operation/update.rb +1 -1
  348. data/lib/mongo/operation/update/bulk_result.rb +1 -1
  349. data/lib/mongo/operation/update/command.rb +4 -4
  350. data/lib/mongo/operation/update/legacy.rb +2 -2
  351. data/lib/mongo/operation/update/legacy/result.rb +1 -1
  352. data/lib/mongo/operation/update/op_msg.rb +4 -4
  353. data/lib/mongo/operation/update/result.rb +2 -2
  354. data/lib/mongo/operation/update_user.rb +1 -1
  355. data/lib/mongo/operation/update_user/command.rb +4 -4
  356. data/lib/mongo/operation/update_user/op_msg.rb +2 -2
  357. data/lib/mongo/operation/users_info.rb +1 -1
  358. data/lib/mongo/operation/users_info/command.rb +4 -4
  359. data/lib/mongo/operation/users_info/op_msg.rb +2 -2
  360. data/lib/mongo/operation/users_info/result.rb +1 -1
  361. data/lib/mongo/options.rb +1 -1
  362. data/lib/mongo/options/mapper.rb +1 -1
  363. data/lib/mongo/options/redacted.rb +1 -1
  364. data/lib/mongo/protocol/bit_vector.rb +1 -1
  365. data/lib/mongo/protocol/compressed.rb +1 -1
  366. data/lib/mongo/protocol/delete.rb +1 -1
  367. data/lib/mongo/protocol/get_more.rb +1 -1
  368. data/lib/mongo/protocol/insert.rb +1 -1
  369. data/lib/mongo/protocol/kill_cursors.rb +1 -1
  370. data/lib/mongo/protocol/message.rb +5 -14
  371. data/lib/mongo/protocol/msg.rb +5 -24
  372. data/lib/mongo/protocol/query.rb +1 -37
  373. data/lib/mongo/protocol/registry.rb +1 -1
  374. data/lib/mongo/protocol/reply.rb +1 -1
  375. data/lib/mongo/protocol/serializers.rb +3 -6
  376. data/lib/mongo/protocol/update.rb +1 -1
  377. data/lib/mongo/retryable.rb +23 -10
  378. data/lib/mongo/semaphore.rb +1 -1
  379. data/lib/mongo/server.rb +32 -7
  380. data/lib/mongo/server/app_metadata.rb +17 -4
  381. data/lib/mongo/server/connection.rb +35 -131
  382. data/lib/mongo/server/connection_base.rb +31 -42
  383. data/lib/mongo/server/connection_common.rb +75 -1
  384. data/lib/mongo/server/connection_pool.rb +20 -1
  385. data/lib/mongo/server/connection_pool/populator.rb +1 -1
  386. data/lib/mongo/server/context.rb +1 -1
  387. data/lib/mongo/server/description.rb +44 -2
  388. data/lib/mongo/server/description/features.rb +12 -3
  389. data/lib/mongo/server/monitor.rb +116 -72
  390. data/lib/mongo/server/monitor/app_metadata.rb +1 -1
  391. data/lib/mongo/server/monitor/connection.rb +62 -80
  392. data/lib/mongo/server/pending_connection.rb +205 -3
  393. data/lib/mongo/server/round_trip_time_averager.rb +12 -3
  394. data/lib/mongo/server_selector.rb +2 -1
  395. data/lib/mongo/server_selector/base.rb +40 -0
  396. data/lib/mongo/server_selector/nearest.rb +25 -15
  397. data/lib/mongo/server_selector/primary.rb +23 -22
  398. data/lib/mongo/server_selector/primary_preferred.rb +25 -15
  399. data/lib/mongo/server_selector/secondary.rb +25 -15
  400. data/lib/mongo/server_selector/secondary_preferred.rb +28 -27
  401. data/lib/mongo/server_selector/selectable.rb +30 -15
  402. data/lib/mongo/session.rb +12 -1
  403. data/lib/mongo/session/server_session.rb +1 -1
  404. data/lib/mongo/session/session_pool.rb +1 -1
  405. data/lib/mongo/socket.rb +103 -35
  406. data/lib/mongo/socket/ssl.rb +97 -34
  407. data/lib/mongo/socket/tcp.rb +39 -31
  408. data/lib/mongo/socket/unix.rb +14 -6
  409. data/lib/mongo/srv.rb +1 -1
  410. data/lib/mongo/srv/monitor.rb +1 -1
  411. data/lib/mongo/srv/resolver.rb +1 -1
  412. data/lib/mongo/srv/result.rb +1 -1
  413. data/lib/mongo/timeout.rb +9 -9
  414. data/lib/mongo/topology_version.rb +80 -0
  415. data/lib/mongo/uri.rb +61 -47
  416. data/lib/mongo/uri/srv_protocol.rb +9 -1
  417. data/lib/mongo/version.rb +2 -2
  418. data/lib/mongo/write_concern.rb +1 -1
  419. data/lib/mongo/write_concern/acknowledged.rb +1 -1
  420. data/lib/mongo/write_concern/base.rb +1 -1
  421. data/lib/mongo/write_concern/unacknowledged.rb +1 -1
  422. data/mongo.gemspec +1 -1
  423. data/spec/NOTES.aws-auth.md +291 -0
  424. data/spec/README.aws-auth.md +318 -0
  425. data/spec/README.md +64 -17
  426. data/spec/integration/auth_spec.rb +29 -9
  427. data/spec/integration/aws_auth_request_spec.rb +74 -0
  428. data/spec/integration/aws_credentials_retriever_spec.rb +103 -0
  429. data/spec/integration/change_stream_spec.rb +123 -51
  430. data/spec/integration/client_authentication_options_spec.rb +0 -37
  431. data/spec/integration/client_construction_aws_auth_spec.rb +191 -0
  432. data/spec/integration/client_construction_spec.rb +1 -1
  433. data/spec/integration/client_side_encryption/auto_encryption_bulk_writes_spec.rb +5 -9
  434. data/spec/integration/collection_indexes_prose_spec.rb +55 -0
  435. data/spec/integration/command_monitoring_spec.rb +30 -6
  436. data/spec/integration/command_spec.rb +11 -9
  437. data/spec/integration/connect_single_rs_name_spec.rb +5 -3
  438. data/spec/integration/connection_spec.rb +1 -0
  439. data/spec/integration/crud_spec.rb +28 -0
  440. data/spec/integration/cursor_reaping_spec.rb +14 -10
  441. data/spec/integration/fork_reconnect_spec.rb +143 -0
  442. data/spec/integration/get_more_spec.rb +10 -3
  443. data/spec/integration/heartbeat_events_spec.rb +1 -1
  444. data/spec/integration/read_preference_spec.rb +41 -11
  445. data/spec/integration/reconnect_spec.rb +2 -3
  446. data/spec/integration/retryable_errors_spec.rb +33 -14
  447. data/spec/integration/{retryable_writes_spec.rb → retryable_writes/retryable_writes_36_and_older_spec.rb} +55 -51
  448. data/spec/integration/retryable_writes/retryable_writes_40_and_newer_spec.rb +401 -0
  449. data/spec/integration/retryable_writes/shared/adds_diagnostics.rb +15 -0
  450. data/spec/integration/retryable_writes/shared/does_not_support_retries.rb +24 -0
  451. data/spec/integration/retryable_writes/shared/only_supports_legacy_retries.rb +25 -0
  452. data/spec/integration/retryable_writes/shared/performs_legacy_retries.rb +215 -0
  453. data/spec/integration/retryable_writes/shared/performs_modern_retries.rb +232 -0
  454. data/spec/integration/retryable_writes/shared/performs_no_retries.rb +110 -0
  455. data/spec/integration/retryable_writes/shared/supports_legacy_retries.rb +19 -0
  456. data/spec/integration/retryable_writes/shared/supports_modern_retries.rb +25 -0
  457. data/spec/integration/retryable_writes/shared/supports_retries.rb +16 -0
  458. data/spec/integration/sdam_error_handling_spec.rb +116 -18
  459. data/spec/integration/sdam_events_spec.rb +1 -0
  460. data/spec/integration/server_spec.rb +42 -26
  461. data/spec/integration/size_limit_spec.rb +2 -20
  462. data/spec/integration/step_down_spec.rb +15 -15
  463. data/spec/integration/transactions_api_examples_spec.rb +59 -0
  464. data/spec/integration/transactions_examples_spec.rb +5 -2
  465. data/spec/integration/x509_auth_spec.rb +109 -0
  466. data/spec/kerberos/kerberos_spec.rb +10 -6
  467. data/spec/lite_spec_helper.rb +21 -19
  468. data/spec/mongo/address/ipv4_spec.rb +1 -1
  469. data/spec/mongo/address_spec.rb +2 -2
  470. data/spec/mongo/auth/cr_spec.rb +7 -7
  471. data/spec/mongo/auth/gssapi/conversation_spec.rb +121 -0
  472. data/spec/mongo/auth/invalid_mechanism_spec.rb +1 -1
  473. data/spec/mongo/auth/ldap/conversation_spec.rb +1 -1
  474. data/spec/mongo/auth/ldap_spec.rb +3 -3
  475. data/spec/mongo/auth/scram/conversation_spec.rb +119 -334
  476. data/spec/mongo/auth/scram256/conversation_spec.rb +171 -0
  477. data/spec/mongo/auth/{scram/negotiation_spec.rb → scram_negotiation_spec.rb} +13 -8
  478. data/spec/mongo/auth/scram_spec.rb +28 -68
  479. data/spec/mongo/auth/user_spec.rb +1 -1
  480. data/spec/mongo/auth/x509/conversation_spec.rb +1 -1
  481. data/spec/mongo/auth/x509_spec.rb +8 -8
  482. data/spec/mongo/auth_spec.rb +4 -4
  483. data/spec/mongo/bulk_write_spec.rb +206 -2
  484. data/spec/mongo/client_construction_spec.rb +290 -86
  485. data/spec/mongo/client_spec.rb +21 -2
  486. data/spec/mongo/cluster_spec.rb +4 -2
  487. data/spec/mongo/collection/view/aggregation_spec.rb +6 -2
  488. data/spec/mongo/collection/view/builder/find_command_spec.rb +17 -6
  489. data/spec/mongo/collection/view/change_stream_resume_spec.rb +392 -0
  490. data/spec/mongo/collection/view/change_stream_spec.rb +0 -318
  491. data/spec/mongo/collection/view/iterable_spec.rb +38 -0
  492. data/spec/mongo/collection/view/map_reduce_spec.rb +6 -2
  493. data/spec/mongo/collection/view/readable_spec.rb +15 -1
  494. data/spec/mongo/collection/view/writable_spec.rb +208 -1
  495. data/spec/mongo/collection_spec.rb +31 -67
  496. data/spec/mongo/cursor/builder/get_more_command_spec.rb +6 -1
  497. data/spec/mongo/cursor/builder/op_get_more_spec.rb +6 -1
  498. data/spec/mongo/cursor/builder/op_kill_cursors_spec.rb +6 -1
  499. data/spec/mongo/cursor_spec.rb +9 -1
  500. data/spec/mongo/database_spec.rb +6 -2
  501. data/spec/mongo/error/operation_failure_heavy_spec.rb +58 -0
  502. data/spec/mongo/error/operation_failure_spec.rb +130 -72
  503. data/spec/mongo/error/unsupported_option_spec.rb +54 -0
  504. data/spec/mongo/grid/fs_bucket_spec.rb +18 -0
  505. data/spec/mongo/grid/stream/write_spec.rb +32 -0
  506. data/spec/mongo/index/view_spec.rb +166 -0
  507. data/spec/mongo/operation/aggregate/result_spec.rb +6 -1
  508. data/spec/mongo/operation/delete/bulk_spec.rb +18 -6
  509. data/spec/mongo/operation/delete/op_msg_spec.rb +22 -14
  510. data/spec/mongo/operation/find/legacy_spec.rb +27 -7
  511. data/spec/mongo/operation/get_more_spec.rb +6 -1
  512. data/spec/mongo/operation/insert/bulk_spec.rb +21 -7
  513. data/spec/mongo/operation/insert/command_spec.rb +4 -0
  514. data/spec/mongo/operation/insert/op_msg_spec.rb +22 -14
  515. data/spec/mongo/operation/limited_spec.rb +5 -3
  516. data/spec/mongo/operation/read_preference_legacy_spec.rb +16 -4
  517. data/spec/mongo/operation/read_preference_op_msg_spec.rb +115 -5
  518. data/spec/mongo/operation/result_spec.rb +6 -1
  519. data/spec/mongo/operation/update/bulk_spec.rb +18 -6
  520. data/spec/mongo/operation/update/command_spec.rb +4 -0
  521. data/spec/mongo/operation/update/op_msg_spec.rb +22 -14
  522. data/spec/mongo/retryable_spec.rb +71 -70
  523. data/spec/mongo/server/app_metadata_shared.rb +56 -0
  524. data/spec/mongo/server/app_metadata_spec.rb +8 -1
  525. data/spec/mongo/server/connection_auth_spec.rb +31 -12
  526. data/spec/mongo/server/connection_pool_spec.rb +0 -31
  527. data/spec/mongo/server/connection_spec.rb +118 -71
  528. data/spec/mongo/server/monitor/app_metadata_spec.rb +8 -1
  529. data/spec/mongo/server/monitor/connection_spec.rb +1 -82
  530. data/spec/mongo/server/monitor_spec.rb +76 -17
  531. data/spec/mongo/server/round_trip_time_averager_spec.rb +5 -3
  532. data/spec/mongo/server_selector/nearest_spec.rb +1 -0
  533. data/spec/mongo/server_selector/primary_preferred_spec.rb +1 -0
  534. data/spec/mongo/server_selector/primary_spec.rb +18 -0
  535. data/spec/mongo/server_selector/secondary_preferred_spec.rb +18 -1
  536. data/spec/mongo/server_selector/secondary_spec.rb +1 -0
  537. data/spec/mongo/server_selector_spec.rb +0 -1
  538. data/spec/mongo/session/session_pool_spec.rb +7 -3
  539. data/spec/mongo/socket/ssl_spec.rb +2 -2
  540. data/spec/mongo/socket/tcp_spec.rb +2 -2
  541. data/spec/mongo/socket/unix_spec.rb +2 -2
  542. data/spec/mongo/socket_spec.rb +9 -9
  543. data/spec/mongo/timeout_spec.rb +22 -68
  544. data/spec/mongo/uri_spec.rb +21 -6
  545. data/spec/runners/auth.rb +5 -6
  546. data/spec/runners/change_streams/outcome.rb +42 -0
  547. data/spec/runners/change_streams/spec.rb +57 -0
  548. data/spec/runners/change_streams/test.rb +229 -0
  549. data/spec/runners/cmap/verifier.rb +1 -1
  550. data/spec/runners/command_monitoring.rb +1 -1
  551. data/spec/runners/connection_string.rb +3 -2
  552. data/spec/runners/crud.rb +2 -2
  553. data/spec/runners/crud/context.rb +1 -1
  554. data/spec/runners/crud/operation.rb +120 -30
  555. data/spec/runners/crud/outcome.rb +1 -1
  556. data/spec/runners/crud/spec.rb +1 -0
  557. data/spec/runners/crud/test.rb +8 -26
  558. data/spec/runners/crud/test_base.rb +47 -0
  559. data/spec/runners/crud/verifier.rb +21 -3
  560. data/spec/runners/gridfs.rb +1 -1
  561. data/spec/runners/{server_discovery_and_monitoring.rb → sdam.rb} +41 -22
  562. data/spec/runners/sdam/verifier.rb +26 -8
  563. data/spec/runners/sdam_monitoring.rb +1 -1
  564. data/spec/runners/transactions.rb +1 -2
  565. data/spec/runners/transactions/context.rb +1 -1
  566. data/spec/runners/transactions/operation.rb +5 -1
  567. data/spec/runners/transactions/spec.rb +1 -1
  568. data/spec/runners/transactions/test.rb +48 -54
  569. data/spec/spec_tests/auth_spec.rb +2 -0
  570. data/spec/spec_tests/change_streams_spec.rb +39 -4
  571. data/spec/spec_tests/client_side_encryption_spec.rb +3 -0
  572. data/spec/spec_tests/cmap_spec.rb +5 -0
  573. data/spec/spec_tests/command_monitoring_spec.rb +3 -0
  574. data/spec/spec_tests/connection_string_spec.rb +2 -0
  575. data/spec/spec_tests/crud_spec.rb +2 -0
  576. data/spec/spec_tests/data/auth/connection-string.yml +57 -1
  577. data/spec/spec_tests/data/change_streams/change-streams-errors.yml +30 -0
  578. data/spec/spec_tests/data/change_streams/change-streams-resume-errorLabels.yml +1105 -0
  579. data/spec/spec_tests/data/change_streams/change-streams-resume-whitelist.yml +1107 -0
  580. data/spec/spec_tests/data/change_streams/change-streams.yml +5 -4
  581. data/spec/spec_tests/data/crud_v2/aggregate-merge.yml +1 -1
  582. data/spec/spec_tests/data/crud_v2/bulkWrite-arrayFilters.yml +33 -11
  583. data/spec/spec_tests/data/crud_v2/bulkWrite-delete-hint-clientError.yml +63 -0
  584. data/spec/spec_tests/data/crud_v2/bulkWrite-delete-hint-serverError.yml +92 -0
  585. data/spec/spec_tests/data/crud_v2/bulkWrite-delete-hint.yml +103 -0
  586. data/spec/spec_tests/data/crud_v2/bulkWrite-update-hint-clientError.yml +90 -0
  587. data/spec/spec_tests/data/crud_v2/bulkWrite-update-hint-serverError.yml +147 -0
  588. data/spec/spec_tests/data/crud_v2/bulkWrite-update-hint.yml +164 -0
  589. data/spec/spec_tests/data/crud_v2/deleteMany-hint-clientError.yml +43 -0
  590. data/spec/spec_tests/data/crud_v2/deleteMany-hint-serverError.yml +62 -0
  591. data/spec/spec_tests/data/crud_v2/deleteMany-hint.yml +58 -0
  592. data/spec/spec_tests/data/crud_v2/deleteOne-hint-clientError.yml +41 -0
  593. data/spec/spec_tests/data/crud_v2/deleteOne-hint-serverError.yml +60 -0
  594. data/spec/spec_tests/data/crud_v2/deleteOne-hint.yml +57 -0
  595. data/spec/spec_tests/data/crud_v2/find-allowdiskuse-clientError.yml +28 -0
  596. data/spec/spec_tests/data/crud_v2/find-allowdiskuse-serverError.yml +44 -0
  597. data/spec/spec_tests/data/crud_v2/find-allowdiskuse.yml +50 -0
  598. data/spec/spec_tests/data/crud_v2/findOneAndDelete-hint-clientError.yml +45 -0
  599. data/spec/spec_tests/data/crud_v2/findOneAndDelete-hint-serverError.yml +60 -0
  600. data/spec/spec_tests/data/crud_v2/findOneAndDelete-hint.yml +56 -0
  601. data/spec/spec_tests/data/crud_v2/findOneAndReplace-hint-clientError.yml +40 -0
  602. data/spec/spec_tests/data/crud_v2/findOneAndReplace-hint-serverError.yml +59 -0
  603. data/spec/spec_tests/data/crud_v2/findOneAndReplace-hint.yml +55 -0
  604. data/spec/spec_tests/data/crud_v2/findOneAndUpdate-hint-clientError.yml +40 -0
  605. data/spec/spec_tests/data/crud_v2/findOneAndUpdate-hint-serverError.yml +58 -0
  606. data/spec/spec_tests/data/crud_v2/findOneAndUpdate-hint.yml +55 -0
  607. data/spec/spec_tests/data/crud_v2/replaceOne-hint.yml +61 -0
  608. data/spec/spec_tests/data/crud_v2/unacknowledged-bulkWrite-delete-hint-clientError.yml +60 -0
  609. data/spec/spec_tests/data/crud_v2/unacknowledged-bulkWrite-update-hint-clientError.yml +88 -0
  610. data/spec/spec_tests/data/crud_v2/unacknowledged-deleteMany-hint-clientError.yml +40 -0
  611. data/spec/spec_tests/data/crud_v2/unacknowledged-deleteOne-hint-clientError.yml +38 -0
  612. data/spec/spec_tests/data/crud_v2/unacknowledged-findOneAndDelete-hint-clientError.yml +42 -0
  613. data/spec/spec_tests/data/crud_v2/unacknowledged-findOneAndReplace-hint-clientError.yml +40 -0
  614. data/spec/spec_tests/data/crud_v2/unacknowledged-findOneAndUpdate-hint-clientError.yml +40 -0
  615. data/spec/spec_tests/data/crud_v2/unacknowledged-replaceOne-hint-clientError.yml +40 -0
  616. data/spec/spec_tests/data/crud_v2/unacknowledged-updateMany-hint-clientError.yml +43 -0
  617. data/spec/spec_tests/data/crud_v2/unacknowledged-updateOne-hint-clientError.yml +40 -0
  618. data/spec/spec_tests/data/crud_v2/updateMany-hint-clientError.yml +45 -0
  619. data/spec/spec_tests/data/crud_v2/updateMany-hint-serverError.yml +66 -0
  620. data/spec/spec_tests/data/crud_v2/updateMany-hint.yml +65 -0
  621. data/spec/spec_tests/data/crud_v2/updateOne-hint-clientError.yml +43 -0
  622. data/spec/spec_tests/data/crud_v2/updateOne-hint-serverError.yml +62 -0
  623. data/spec/spec_tests/data/crud_v2/updateOne-hint.yml +61 -0
  624. data/spec/spec_tests/data/crud_v2/updateWithPipelines.yml +65 -0
  625. data/spec/spec_tests/data/dns_seedlist_discovery/direct-connection-false.yml +10 -0
  626. data/spec/spec_tests/data/dns_seedlist_discovery/direct-connection-true.yml +5 -0
  627. data/spec/spec_tests/data/read_write_concern/operation/default-write-concern-2.6.yml +215 -0
  628. data/spec/spec_tests/data/read_write_concern/operation/default-write-concern-3.2.yml +58 -0
  629. data/spec/spec_tests/data/read_write_concern/operation/default-write-concern-3.4.yml +95 -0
  630. data/spec/spec_tests/data/read_write_concern/operation/default-write-concern-4.2.yml +36 -0
  631. data/spec/spec_tests/data/retryable_writes/bulkWrite-errorLabels.yml +77 -0
  632. data/spec/spec_tests/data/retryable_writes/bulkWrite-serverErrors.yml +37 -0
  633. data/spec/spec_tests/data/retryable_writes/deleteOne-errorLabels.yml +48 -0
  634. data/spec/spec_tests/data/retryable_writes/deleteOne-serverErrors.yml +22 -0
  635. data/spec/spec_tests/data/retryable_writes/findOneAndDelete-errorLabels.yml +49 -0
  636. data/spec/spec_tests/data/retryable_writes/findOneAndDelete-serverErrors.yml +23 -0
  637. data/spec/spec_tests/data/retryable_writes/findOneAndReplace-errorLabels.yml +52 -0
  638. data/spec/spec_tests/data/retryable_writes/findOneAndReplace-serverErrors.yml +25 -0
  639. data/spec/spec_tests/data/retryable_writes/findOneAndUpdate-errorLabels.yml +52 -0
  640. data/spec/spec_tests/data/retryable_writes/findOneAndUpdate-serverErrors.yml +24 -0
  641. data/spec/spec_tests/data/retryable_writes/insertMany-errorLabels.yml +54 -0
  642. data/spec/spec_tests/data/retryable_writes/insertMany-serverErrors.yml +24 -0
  643. data/spec/spec_tests/data/retryable_writes/insertOne-errorLabels.yml +44 -0
  644. data/spec/spec_tests/data/retryable_writes/insertOne-serverErrors.yml +69 -0
  645. data/spec/spec_tests/data/retryable_writes/replaceOne-errorLabels.yml +53 -0
  646. data/spec/spec_tests/data/retryable_writes/replaceOne-serverErrors.yml +23 -0
  647. data/spec/spec_tests/data/retryable_writes/updateOne-errorLabels.yml +53 -0
  648. data/spec/spec_tests/data/retryable_writes/updateOne-serverErrors.yml +23 -0
  649. data/spec/spec_tests/data/sdam/errors/error_handling_handshake.yml +54 -0
  650. data/spec/spec_tests/data/sdam/errors/non-stale-network-error.yml +46 -0
  651. data/spec/spec_tests/data/sdam/errors/non-stale-network-timeout-error.yml +37 -0
  652. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-greater-InterruptedAtShutdown.yml +60 -0
  653. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-greater-InterruptedDueToReplStateChange.yml +60 -0
  654. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-greater-NotMaster.yml +60 -0
  655. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-greater-NotMasterNoSlaveOk.yml +60 -0
  656. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-greater-NotMasterOrSecondary.yml +60 -0
  657. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-greater-PrimarySteppedDown.yml +60 -0
  658. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-greater-ShutdownInProgress.yml +60 -0
  659. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-missing-InterruptedAtShutdown.yml +51 -0
  660. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-missing-InterruptedDueToReplStateChange.yml +51 -0
  661. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-missing-NotMaster.yml +51 -0
  662. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-missing-NotMasterNoSlaveOk.yml +51 -0
  663. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-missing-NotMasterOrSecondary.yml +51 -0
  664. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-missing-PrimarySteppedDown.yml +51 -0
  665. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-missing-ShutdownInProgress.yml +51 -0
  666. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-proccessId-changed-InterruptedAtShutdown.yml +60 -0
  667. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-proccessId-changed-InterruptedDueToReplStateChange.yml +60 -0
  668. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-proccessId-changed-NotMaster.yml +60 -0
  669. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-proccessId-changed-NotMasterNoSlaveOk.yml +60 -0
  670. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-proccessId-changed-NotMasterOrSecondary.yml +60 -0
  671. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-proccessId-changed-PrimarySteppedDown.yml +60 -0
  672. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-proccessId-changed-ShutdownInProgress.yml +60 -0
  673. data/spec/spec_tests/data/sdam/errors/post-42-InterruptedAtShutdown.yml +46 -0
  674. data/spec/spec_tests/data/sdam/errors/post-42-InterruptedDueToReplStateChange.yml +46 -0
  675. data/spec/spec_tests/data/sdam/errors/post-42-NotMaster.yml +46 -0
  676. data/spec/spec_tests/data/sdam/errors/post-42-NotMasterNoSlaveOk.yml +46 -0
  677. data/spec/spec_tests/data/sdam/errors/post-42-NotMasterOrSecondary.yml +46 -0
  678. data/spec/spec_tests/data/sdam/errors/post-42-PrimarySteppedDown.yml +46 -0
  679. data/spec/spec_tests/data/sdam/errors/post-42-ShutdownInProgress.yml +46 -0
  680. data/spec/spec_tests/data/sdam/errors/pre-42-InterruptedAtShutdown.yml +46 -0
  681. data/spec/spec_tests/data/sdam/errors/pre-42-InterruptedDueToReplStateChange.yml +46 -0
  682. data/spec/spec_tests/data/sdam/errors/pre-42-NotMaster.yml +46 -0
  683. data/spec/spec_tests/data/sdam/errors/pre-42-NotMasterNoSlaveOk.yml +46 -0
  684. data/spec/spec_tests/data/sdam/errors/pre-42-NotMasterOrSecondary.yml +46 -0
  685. data/spec/spec_tests/data/sdam/errors/pre-42-PrimarySteppedDown.yml +46 -0
  686. data/spec/spec_tests/data/sdam/errors/pre-42-ShutdownInProgress.yml +46 -0
  687. data/spec/spec_tests/data/sdam/errors/stale-generation-InterruptedAtShutdown.yml +89 -0
  688. data/spec/spec_tests/data/sdam/errors/stale-generation-InterruptedDueToReplStateChange.yml +89 -0
  689. data/spec/spec_tests/data/sdam/errors/stale-generation-NotMaster.yml +89 -0
  690. data/spec/spec_tests/data/sdam/errors/stale-generation-NotMasterNoSlaveOk.yml +89 -0
  691. data/spec/spec_tests/data/sdam/errors/stale-generation-NotMasterOrSecondary.yml +89 -0
  692. data/spec/spec_tests/data/sdam/errors/stale-generation-PrimarySteppedDown.yml +89 -0
  693. data/spec/spec_tests/data/sdam/errors/stale-generation-ShutdownInProgress.yml +89 -0
  694. data/spec/spec_tests/data/sdam/errors/stale-generation-afterHandshakeCompletes-InterruptedAtShutdown.yml +89 -0
  695. data/spec/spec_tests/data/sdam/errors/stale-generation-afterHandshakeCompletes-InterruptedDueToReplStateChange.yml +89 -0
  696. data/spec/spec_tests/data/sdam/errors/stale-generation-afterHandshakeCompletes-NotMaster.yml +89 -0
  697. data/spec/spec_tests/data/sdam/errors/stale-generation-afterHandshakeCompletes-NotMasterNoSlaveOk.yml +89 -0
  698. data/spec/spec_tests/data/sdam/errors/stale-generation-afterHandshakeCompletes-NotMasterOrSecondary.yml +89 -0
  699. data/spec/spec_tests/data/sdam/errors/stale-generation-afterHandshakeCompletes-PrimarySteppedDown.yml +89 -0
  700. data/spec/spec_tests/data/sdam/errors/stale-generation-afterHandshakeCompletes-ShutdownInProgress.yml +89 -0
  701. data/spec/spec_tests/data/sdam/errors/stale-generation-afterHandshakeCompletes-network.yml +80 -0
  702. data/spec/spec_tests/data/sdam/errors/stale-generation-afterHandshakeCompletes-timeout.yml +80 -0
  703. data/spec/spec_tests/data/sdam/errors/stale-generation-beforeHandshakeCompletes-InterruptedAtShutdown.yml +89 -0
  704. data/spec/spec_tests/data/sdam/errors/stale-generation-beforeHandshakeCompletes-InterruptedDueToReplStateChange.yml +89 -0
  705. data/spec/spec_tests/data/sdam/errors/stale-generation-beforeHandshakeCompletes-NotMaster.yml +89 -0
  706. data/spec/spec_tests/data/sdam/errors/stale-generation-beforeHandshakeCompletes-NotMasterNoSlaveOk.yml +89 -0
  707. data/spec/spec_tests/data/sdam/errors/stale-generation-beforeHandshakeCompletes-NotMasterOrSecondary.yml +89 -0
  708. data/spec/spec_tests/data/sdam/errors/stale-generation-beforeHandshakeCompletes-PrimarySteppedDown.yml +89 -0
  709. data/spec/spec_tests/data/sdam/errors/stale-generation-beforeHandshakeCompletes-ShutdownInProgress.yml +89 -0
  710. data/spec/spec_tests/data/sdam/errors/stale-generation-beforeHandshakeCompletes-network.yml +80 -0
  711. data/spec/spec_tests/data/sdam/errors/stale-generation-beforeHandshakeCompletes-timeout.yml +80 -0
  712. data/spec/spec_tests/data/sdam/errors/stale-topologyVersion-InterruptedAtShutdown.yml +64 -0
  713. data/spec/spec_tests/data/sdam/errors/stale-topologyVersion-InterruptedDueToReplStateChange.yml +64 -0
  714. data/spec/spec_tests/data/sdam/errors/stale-topologyVersion-NotMaster.yml +64 -0
  715. data/spec/spec_tests/data/sdam/errors/stale-topologyVersion-NotMasterNoSlaveOk.yml +64 -0
  716. data/spec/spec_tests/data/sdam/errors/stale-topologyVersion-NotMasterOrSecondary.yml +64 -0
  717. data/spec/spec_tests/data/sdam/errors/stale-topologyVersion-PrimarySteppedDown.yml +64 -0
  718. data/spec/spec_tests/data/sdam/errors/stale-topologyVersion-ShutdownInProgress.yml +64 -0
  719. data/spec/spec_tests/data/sdam/rs/compatible.yml +2 -0
  720. data/spec/spec_tests/data/sdam/rs/compatible_unknown.yml +2 -0
  721. data/spec/spec_tests/data/sdam/rs/discover_arbiters.yml +2 -2
  722. data/spec/spec_tests/data/sdam/rs/discover_arbiters_replicaset.yml +43 -0
  723. data/spec/spec_tests/data/sdam/rs/discover_ghost.yml +35 -0
  724. data/spec/spec_tests/data/sdam/rs/{ghost_discovered.yml → discover_ghost_replicaset.yml} +1 -1
  725. data/spec/spec_tests/data/sdam/rs/discover_hidden.yml +50 -0
  726. data/spec/spec_tests/data/sdam/rs/discover_hidden_replicaset.yml +50 -0
  727. data/spec/spec_tests/data/sdam/rs/discover_passives.yml +2 -2
  728. data/spec/spec_tests/data/sdam/rs/discover_passives_replicaset.yml +81 -0
  729. data/spec/spec_tests/data/sdam/rs/discover_primary.yml +2 -2
  730. data/spec/spec_tests/data/sdam/rs/discover_primary_replicaset.yml +42 -0
  731. data/spec/spec_tests/data/sdam/rs/discover_rsother.yml +49 -0
  732. data/spec/spec_tests/data/sdam/rs/{rsother_discovered.yml → discover_rsother_replicaset.yml} +1 -1
  733. data/spec/spec_tests/data/sdam/rs/discover_secondary.yml +2 -2
  734. data/spec/spec_tests/data/sdam/rs/discover_secondary_replicaset.yml +43 -0
  735. data/spec/spec_tests/data/sdam/rs/incompatible_arbiter.yml +2 -0
  736. data/spec/spec_tests/data/sdam/rs/incompatible_ghost.yml +2 -0
  737. data/spec/spec_tests/data/sdam/rs/incompatible_other.yml +2 -0
  738. data/spec/spec_tests/data/sdam/rs/primary_mismatched_me.yml +23 -27
  739. data/spec/spec_tests/data/sdam/rs/primary_to_no_primary_mismatched_me.yml +79 -55
  740. data/spec/spec_tests/data/sdam/rs/replicaset_rsnp.yml +20 -0
  741. data/spec/spec_tests/data/sdam/rs/secondary_mismatched_me.yml +3 -2
  742. data/spec/spec_tests/data/sdam/rs/too_new.yml +2 -0
  743. data/spec/spec_tests/data/sdam/rs/topology_version_equal.yml +66 -0
  744. data/spec/spec_tests/data/sdam/rs/topology_version_greater.yml +189 -0
  745. data/spec/spec_tests/data/sdam/rs/topology_version_less.yml +62 -0
  746. data/spec/spec_tests/data/sdam/sharded/discover_single_mongos.yml +23 -0
  747. data/spec/spec_tests/data/sdam/single/direct_connection_external_ip.yml +1 -1
  748. data/spec/spec_tests/data/sdam/single/direct_connection_mongos.yml +2 -2
  749. data/spec/spec_tests/data/sdam/single/direct_connection_replicaset.yml +22 -0
  750. data/spec/spec_tests/data/sdam/single/direct_connection_rsarbiter.yml +2 -2
  751. data/spec/spec_tests/data/sdam/single/direct_connection_rsprimary.yml +2 -2
  752. data/spec/spec_tests/data/sdam/single/direct_connection_rssecondary.yml +2 -2
  753. data/spec/spec_tests/data/sdam/single/direct_connection_slave.yml +1 -1
  754. data/spec/spec_tests/data/sdam/single/direct_connection_standalone.yml +2 -2
  755. data/spec/spec_tests/data/sdam/single/{unavailable_seed.yml → direct_connection_unavailable_seed.yml} +2 -2
  756. data/spec/spec_tests/data/sdam/single/direct_connection_wrong_set_name.yml +38 -0
  757. data/spec/spec_tests/data/sdam/single/discover_standalone.yml +34 -0
  758. data/spec/spec_tests/data/sdam/single/discover_unavailable_seed.yml +28 -0
  759. data/spec/spec_tests/data/sdam/single/too_old_then_upgraded.yml +46 -0
  760. data/spec/spec_tests/data/transactions/create-collection.yml +131 -0
  761. data/spec/spec_tests/data/transactions/create-index.yml +152 -0
  762. data/spec/spec_tests/data/transactions/error-labels.yml +87 -21
  763. data/spec/spec_tests/data/transactions/mongos-recovery-token.yml +1 -0
  764. data/spec/spec_tests/data/transactions/retryable-abort-errorLabels.yml +124 -0
  765. data/spec/spec_tests/data/transactions/retryable-abort.yml +17 -2
  766. data/spec/spec_tests/data/transactions/retryable-commit-errorLabels.yml +132 -0
  767. data/spec/spec_tests/data/transactions/retryable-commit.yml +24 -9
  768. data/spec/spec_tests/data/uri_options/connection-options.yml +43 -0
  769. data/spec/spec_tests/data/uri_options/ruby-auth-options.yml +12 -0
  770. data/spec/spec_tests/data/uri_options/ruby-connection-options.yml +57 -0
  771. data/spec/spec_tests/dns_seedlist_discovery_spec.rb +3 -1
  772. data/spec/spec_tests/gridfs_spec.rb +2 -0
  773. data/spec/spec_tests/max_staleness_spec.rb +3 -1
  774. data/spec/spec_tests/read_write_concern_connection_string_spec.rb +2 -0
  775. data/spec/spec_tests/read_write_concern_operaton_spec.rb +10 -0
  776. data/spec/spec_tests/retryable_reads_spec.rb +2 -0
  777. data/spec/spec_tests/retryable_writes_spec.rb +8 -1
  778. data/spec/spec_tests/sdam_monitoring_spec.rb +3 -1
  779. data/spec/spec_tests/sdam_spec.rb +70 -1
  780. data/spec/spec_tests/server_selection_rtt_spec.rb +2 -0
  781. data/spec/spec_tests/server_selection_spec.rb +2 -0
  782. data/spec/spec_tests/transactions_api_spec.rb +5 -0
  783. data/spec/spec_tests/transactions_spec.rb +5 -0
  784. data/spec/spec_tests/uri_options_spec.rb +2 -0
  785. data/spec/stress/cleanup_spec.rb +43 -0
  786. data/spec/stress/connection_pool_stress_spec.rb +1 -5
  787. data/spec/stress/connection_pool_timing_spec.rb +3 -6
  788. data/spec/stress/fork_reconnect_stress_spec.rb +109 -0
  789. data/spec/support/authorization.rb +1 -11
  790. data/spec/support/aws_utils.rb +62 -0
  791. data/spec/support/aws_utils/base.rb +134 -0
  792. data/spec/support/aws_utils/inspector.rb +224 -0
  793. data/spec/support/aws_utils/orchestrator.rb +370 -0
  794. data/spec/support/aws_utils/provisioner.rb +360 -0
  795. data/spec/support/background_thread_registry.rb +6 -2
  796. data/spec/support/client_registry.rb +5 -24
  797. data/spec/support/cluster_config.rb +1 -0
  798. data/spec/support/common_shortcuts.rb +43 -0
  799. data/spec/support/constraints.rb +27 -7
  800. data/spec/support/crypt.rb +1 -1
  801. data/spec/support/event_subscriber.rb +94 -84
  802. data/spec/support/lite_constraints.rb +47 -0
  803. data/spec/support/shared/scram_conversation.rb +100 -0
  804. data/spec/support/shared/server_selector.rb +81 -1
  805. data/spec/support/shared/session.rb +29 -21
  806. data/spec/support/spec_config.rb +39 -9
  807. data/spec/support/spec_setup.rb +8 -4
  808. data/spec/support/utils.rb +115 -24
  809. metadata +1134 -744
  810. metadata.gz.sig +0 -0
  811. data/lib/mongo/server/connectable.rb +0 -107
  812. data/spec/integration/bulk_write_spec.rb +0 -19
  813. data/spec/integration/grid_fs_bucket_spec.rb +0 -48
  814. data/spec/integration/zlib_compression_spec.rb +0 -25
  815. data/spec/runners/change_streams.rb +0 -262
  816. data/spec/runners/change_streams/operation.rb +0 -89
  817. data/spec/spec_tests/data/sdam/sharded/ruby_discovered_single_mongos.yml +0 -27
@@ -2,8 +2,18 @@ require 'spec_helper'
2
2
 
3
3
  describe Mongo::Collection do
4
4
 
5
+ let(:subscriber) { EventSubscriber.new }
6
+
7
+ let(:client) do
8
+ authorized_client.tap do |client|
9
+ client.subscribe(Mongo::Monitoring::COMMAND, subscriber)
10
+ end
11
+ end
12
+
13
+ let(:authorized_collection) { client['collection_spec'] }
14
+
5
15
  before do
6
- authorized_collection.drop
16
+ authorized_client['collection_spec'].drop
7
17
  end
8
18
 
9
19
  let(:collection_invalid_write_concern) do
@@ -14,10 +24,6 @@ describe Mongo::Collection do
14
24
  authorized_client[:validating]
15
25
  end
16
26
 
17
- let(:client) do
18
- authorized_client
19
- end
20
-
21
27
  describe '#==' do
22
28
 
23
29
  let(:database) do
@@ -246,6 +252,7 @@ describe Mongo::Collection do
246
252
  authorized_client.with(client_options).tap do |client|
247
253
  expect(client.options[:read]).to eq(Mongo::Options::Redacted.new(
248
254
  mode: :primary_preferred))
255
+ client.subscribe(Mongo::Monitoring::COMMAND, subscriber)
249
256
  end
250
257
  end
251
258
 
@@ -278,12 +285,6 @@ describe Mongo::Collection do
278
285
  {read: { mode: :primary_preferred }}
279
286
  end
280
287
 
281
- let(:subscriber) { EventSubscriber.new }
282
-
283
- before do
284
- client.subscribe(Mongo::Monitoring::COMMAND, subscriber)
285
- end
286
-
287
288
  shared_examples_for "uses collection's read preference when reading" do
288
289
  it "uses collection's read preference when reading" do
289
290
  expect do
@@ -940,30 +941,6 @@ describe Mongo::Collection do
940
941
  it_behaves_like 'a failed operation using a session'
941
942
  end
942
943
  end
943
-
944
- context 'when collation has a strength' do
945
- min_server_fcv '3.4'
946
-
947
- let(:band_collection) do
948
- described_class.new(database, :bands)
949
- end
950
-
951
- before do
952
- band_collection.delete_many
953
- band_collection.insert_many([{ name: "Depeche Mode" }, { name: "New Order" }])
954
- end
955
-
956
- let(:options) do
957
- { collation: { locale: 'en_US', strength: 2 } }
958
- end
959
- let(:band_result) do
960
- band_collection.find({ name: 'DEPECHE MODE' }, options)
961
- end
962
-
963
- it 'finds Capitalize from UPPER CASE' do
964
- expect(band_result.count_documents).to eq(1)
965
- end
966
- end
967
944
  end
968
945
 
969
946
  describe '#drop' do
@@ -1230,10 +1207,6 @@ describe Mongo::Collection do
1230
1207
  { session: session }
1231
1208
  end
1232
1209
 
1233
- let(:client) do
1234
- subscribed_client
1235
- end
1236
-
1237
1210
  let(:session) do
1238
1211
  client.start_session
1239
1212
  end
@@ -1244,7 +1217,7 @@ describe Mongo::Collection do
1244
1217
 
1245
1218
  let(:command) do
1246
1219
  client[TEST_COLL].find({}, session: session).explain
1247
- EventSubscriber.started_events.find { |c| c.command_name == 'explain' }.command
1220
+ subscriber.started_events.find { |c| c.command_name == 'explain' }.command
1248
1221
  end
1249
1222
 
1250
1223
  it 'sends the session id' do
@@ -1261,7 +1234,7 @@ describe Mongo::Collection do
1261
1234
 
1262
1235
  let(:command) do
1263
1236
  operation
1264
- EventSubscriber.started_events.find { |cmd| cmd.command_name == 'find' }.command
1237
+ subscriber.started_events.find { |cmd| cmd.command_name == 'find' }.command
1265
1238
  end
1266
1239
 
1267
1240
  it_behaves_like 'an operation supporting causally consistent reads'
@@ -1461,7 +1434,7 @@ describe Mongo::Collection do
1461
1434
  context 'when unacknowledged writes is used with an implicit session' do
1462
1435
 
1463
1436
  let(:collection_with_unacknowledged_write_concern) do
1464
- subscribed_client.with(write: { w: 0 })[TEST_COLL]
1437
+ client.with(write: { w: 0 })[TEST_COLL]
1465
1438
  end
1466
1439
 
1467
1440
  let(:operation) do
@@ -1543,20 +1516,16 @@ describe Mongo::Collection do
1543
1516
  context 'when the documents are sent with OP_MSG' do
1544
1517
  min_server_fcv '3.6'
1545
1518
 
1546
- let(:client) do
1547
- subscribed_client
1548
- end
1549
-
1550
1519
  let(:documents) do
1551
1520
  [{ '_id' => 1, 'name' => '1'*16777191 }, { '_id' => 'y' }]
1552
1521
  end
1553
1522
 
1554
1523
  before do
1555
- client[TEST_COLL].insert_many(documents)
1524
+ authorized_collection.insert_many(documents)
1556
1525
  end
1557
1526
 
1558
1527
  let(:insert_events) do
1559
- EventSubscriber.started_events.select { |e| e.command_name == 'insert' }
1528
+ subscriber.started_events.select { |e| e.command_name == 'insert' }
1560
1529
  end
1561
1530
 
1562
1531
  it 'sends the documents in one OP_MSG' do
@@ -1704,7 +1673,7 @@ describe Mongo::Collection do
1704
1673
  context 'when unacknowledged writes is used with an implicit session' do
1705
1674
 
1706
1675
  let(:collection_with_unacknowledged_write_concern) do
1707
- subscribed_client.with(write: { w: 0 })[TEST_COLL]
1676
+ client.with(write: { w: 0 })[TEST_COLL]
1708
1677
  end
1709
1678
 
1710
1679
  let(:operation) do
@@ -1914,7 +1883,7 @@ describe Mongo::Collection do
1914
1883
 
1915
1884
  let(:command) do
1916
1885
  operation
1917
- EventSubscriber.started_events.find { |cmd| cmd.command_name == 'aggregate' }.command
1886
+ subscriber.started_events.find { |cmd| cmd.command_name == 'aggregate' }.command
1918
1887
  end
1919
1888
 
1920
1889
  it_behaves_like 'an operation supporting causally consistent reads'
@@ -2119,7 +2088,7 @@ describe Mongo::Collection do
2119
2088
 
2120
2089
  let(:command) do
2121
2090
  operation
2122
- EventSubscriber.started_events.find { |cmd| cmd.command_name == 'count' }.command
2091
+ subscriber.started_events.find { |cmd| cmd.command_name == 'count' }.command
2123
2092
  end
2124
2093
 
2125
2094
  it_behaves_like 'an operation supporting causally consistent reads'
@@ -2237,7 +2206,7 @@ describe Mongo::Collection do
2237
2206
 
2238
2207
  let(:command) do
2239
2208
  operation
2240
- EventSubscriber.started_events.find { |cmd| cmd.command_name == 'distinct' }.command
2209
+ subscriber.started_events.find { |cmd| cmd.command_name == 'distinct' }.command
2241
2210
  end
2242
2211
 
2243
2212
  it_behaves_like 'an operation supporting causally consistent reads'
@@ -2399,7 +2368,7 @@ describe Mongo::Collection do
2399
2368
  context 'when unacknowledged writes is used with an implicit session' do
2400
2369
 
2401
2370
  let(:collection_with_unacknowledged_write_concern) do
2402
- subscribed_client.with(write: { w: 0 })[TEST_COLL]
2371
+ client.with(write: { w: 0 })[TEST_COLL]
2403
2372
  end
2404
2373
 
2405
2374
  let(:operation) do
@@ -2571,7 +2540,7 @@ describe Mongo::Collection do
2571
2540
  it_behaves_like 'a failed operation using a session'
2572
2541
  end
2573
2542
 
2574
- context 'when unacknowledged writes is used with an explicit session' do
2543
+ context 'when unacknowledged writes are used with an explicit session' do
2575
2544
 
2576
2545
  let(:collection_with_unacknowledged_write_concern) do
2577
2546
  authorized_collection.with(write: { w: 0 })
@@ -2584,10 +2553,10 @@ describe Mongo::Collection do
2584
2553
  it_behaves_like 'an explicit session with an unacknowledged write'
2585
2554
  end
2586
2555
 
2587
- context 'when unacknowledged writes is used with an implicit session' do
2556
+ context 'when unacknowledged writes are used with an implicit session' do
2588
2557
 
2589
2558
  let(:collection_with_unacknowledged_write_concern) do
2590
- subscribed_client.with(write: { w: 0 })[TEST_COLL]
2559
+ client.with(write: { w: 0 })[TEST_COLL]
2591
2560
  end
2592
2561
 
2593
2562
  let(:operation) do
@@ -2755,7 +2724,6 @@ describe Mongo::Collection do
2755
2724
  end
2756
2725
 
2757
2726
  context 'when a session is not provided' do
2758
- let(:client) { subscribed_client }
2759
2727
  let(:collection) { client['test'] }
2760
2728
 
2761
2729
  let(:cursors) do
@@ -2772,7 +2740,7 @@ describe Mongo::Collection do
2772
2740
 
2773
2741
  let(:command) do
2774
2742
  operation
2775
- event = EventSubscriber.started_events.find { |cmd| cmd.command_name == 'parallelCollectionScan' }
2743
+ event = subscriber.started_events.find { |cmd| cmd.command_name == 'parallelCollectionScan' }
2776
2744
  expect(event).not_to be_nil
2777
2745
  event.command
2778
2746
  end
@@ -2794,7 +2762,7 @@ describe Mongo::Collection do
2794
2762
 
2795
2763
  let(:command) do
2796
2764
  operation
2797
- event = EventSubscriber.started_events.find { |cmd| cmd.command_name == 'parallelCollectionScan' }
2765
+ event = subscriber.started_events.find { |cmd| cmd.command_name == 'parallelCollectionScan' }
2798
2766
  expect(event).not_to be_nil
2799
2767
  event.command
2800
2768
  end
@@ -3197,7 +3165,7 @@ describe Mongo::Collection do
3197
3165
  context 'when unacknowledged writes is used with an implicit session' do
3198
3166
 
3199
3167
  let(:collection_with_unacknowledged_write_concern) do
3200
- subscribed_client.with(write: { w: 0 })[TEST_COLL]
3168
+ client.with(write: { w: 0 })[TEST_COLL]
3201
3169
  end
3202
3170
 
3203
3171
  let(:operation) do
@@ -3619,7 +3587,7 @@ describe Mongo::Collection do
3619
3587
  context 'when unacknowledged writes is used with an implicit session' do
3620
3588
 
3621
3589
  let(:collection_with_unacknowledged_write_concern) do
3622
- subscribed_client.with(write: { w: 0 })[TEST_COLL]
3590
+ client.with(write: { w: 0 })[TEST_COLL]
3623
3591
  end
3624
3592
 
3625
3593
  let(:operation) do
@@ -3977,10 +3945,6 @@ describe Mongo::Collection do
3977
3945
  context 'when the documents are sent with OP_MSG' do
3978
3946
  min_server_fcv '3.6'
3979
3947
 
3980
- let(:client) do
3981
- subscribed_client
3982
- end
3983
-
3984
3948
  let(:documents) do
3985
3949
  [{ '_id' => 1, 'name' => '1'*16777191 }, { '_id' => 'y' }]
3986
3950
  end
@@ -3991,7 +3955,7 @@ describe Mongo::Collection do
3991
3955
  end
3992
3956
 
3993
3957
  let(:update_events) do
3994
- EventSubscriber.started_events.select { |e| e.command_name == 'update' }
3958
+ subscriber.started_events.select { |e| e.command_name == 'update' }
3995
3959
  end
3996
3960
 
3997
3961
  it 'sends the documents in one OP_MSG' do
@@ -4041,7 +4005,7 @@ describe Mongo::Collection do
4041
4005
  context 'when unacknowledged writes is used with an implicit session' do
4042
4006
 
4043
4007
  let(:collection_with_unacknowledged_write_concern) do
4044
- subscribed_client.with(write: { w: 0 })[TEST_COLL]
4008
+ client.with(write: { w: 0 })[TEST_COLL]
4045
4009
  end
4046
4010
 
4047
4011
  let(:operation) do
@@ -10,8 +10,13 @@ describe Mongo::Cursor::Builder::GetMoreCommand do
10
10
  end
11
11
  end
12
12
 
13
+ let(:description) do
14
+ Mongo::Server::Description.new(double('description address'),
15
+ 'minWireVersion' => 0, 'maxWireVersion' => 2)
16
+ end
17
+
13
18
  let(:result) do
14
- Mongo::Operation::Result.new(reply)
19
+ Mongo::Operation::Result.new(reply, description)
15
20
  end
16
21
 
17
22
  let(:cursor) do
@@ -10,8 +10,13 @@ describe Mongo::Cursor::Builder::OpGetMore do
10
10
  end
11
11
  end
12
12
 
13
+ let(:description) do
14
+ Mongo::Server::Description.new(double('description address'),
15
+ 'minWireVersion' => 0, 'maxWireVersion' => 2)
16
+ end
17
+
13
18
  let(:result) do
14
- Mongo::Operation::Result.new(reply)
19
+ Mongo::Operation::Result.new(reply, description)
15
20
  end
16
21
 
17
22
  let(:view) do
@@ -8,8 +8,13 @@ describe Mongo::Cursor::Builder::OpKillCursors do
8
8
  end
9
9
  end
10
10
 
11
+ let(:description) do
12
+ Mongo::Server::Description.new(double('description address'),
13
+ 'minWireVersion' => 0, 'maxWireVersion' => 2)
14
+ end
15
+
11
16
  let(:result) do
12
- Mongo::Operation::Result.new(reply)
17
+ Mongo::Operation::Result.new(reply, description)
13
18
  end
14
19
 
15
20
  let(:view) do
@@ -434,6 +434,14 @@ describe Mongo::Cursor do
434
434
  context 'when an implicit session is used' do
435
435
  min_server_fcv '3.6'
436
436
 
437
+ let(:subscriber) { EventSubscriber.new }
438
+
439
+ let(:subscribed_client) do
440
+ authorized_client.tap do |client|
441
+ client.subscribe(Mongo::Monitoring::COMMAND, subscriber)
442
+ end
443
+ end
444
+
437
445
  let(:collection) do
438
446
  subscribed_client[TEST_COLL]
439
447
  end
@@ -456,7 +464,7 @@ describe Mongo::Cursor do
456
464
  end
457
465
 
458
466
  let(:find_events) do
459
- EventSubscriber.started_events.select { |e| e.command_name == "find" }
467
+ subscriber.started_events.select { |e| e.command_name == "find" }
460
468
  end
461
469
 
462
470
  context 'when all results are retrieved in the first response' do
@@ -335,8 +335,12 @@ describe Mongo::Database do
335
335
  client.start_session
336
336
  end
337
337
 
338
+ let(:subscriber) { EventSubscriber.new }
339
+
338
340
  let(:client) do
339
- subscribed_client
341
+ authorized_client.tap do |client|
342
+ client.subscribe(Mongo::Monitoring::COMMAND, subscriber)
343
+ end
340
344
  end
341
345
 
342
346
  it_behaves_like 'an operation using a session'
@@ -344,7 +348,7 @@ describe Mongo::Database do
344
348
 
345
349
 
346
350
  let(:full_command) do
347
- EventSubscriber.started_events.find { |cmd| cmd.command_name == 'ismaster' }.command
351
+ subscriber.started_events.find { |cmd| cmd.command_name == 'ismaster' }.command
348
352
  end
349
353
 
350
354
  it 'does not add a afterClusterTime field' do
@@ -0,0 +1,58 @@
1
+ require 'spec_helper'
2
+
3
+ describe Mongo::Error::OperationFailure do
4
+
5
+ describe '#write_concern_error' do
6
+ # Fail point will work on 4.0 mongod but requires 4.2 for mongos
7
+ min_server_fcv '4.2'
8
+ # Fail point must be set on the same server to which the query is sent
9
+ require_no_multi_shard
10
+
11
+ # https://github.com/mongodb/specifications/commit/7745234f93039a83ae42589a6c0cdbefcffa32fa
12
+ let(:fail_point_command) do
13
+ {
14
+ "configureFailPoint": "failCommand",
15
+ "data": {
16
+ "failCommands": ["insert"],
17
+ "writeConcernError": {
18
+ "code": 100,
19
+ "codeName": "UnsatisfiableWriteConcern",
20
+ "errmsg": "Not enough data-bearing nodes",
21
+ "errInfo": {
22
+ "writeConcern": {
23
+ "w": 2,
24
+ "wtimeout": 0,
25
+ "provenance": "clientSupplied"
26
+ }
27
+ }
28
+ }
29
+ },
30
+ "mode": { "times": 1 }
31
+ }
32
+ end
33
+
34
+ it 'exposes all server-provided fields' do
35
+ authorized_client.use('admin').command(fail_point_command)
36
+
37
+ begin
38
+ authorized_client['foo'].insert_one(test: 1)
39
+ rescue Mongo::Error::OperationFailure => exc
40
+ else
41
+ fail 'Expected an OperationFailure'
42
+ end
43
+
44
+ exc.write_concern_error_document.should == {
45
+ 'code' => 100,
46
+ 'codeName' => 'UnsatisfiableWriteConcern',
47
+ 'errmsg' => 'Not enough data-bearing nodes',
48
+ 'errInfo' => {
49
+ 'writeConcern' => {
50
+ 'w' => 2,
51
+ 'wtimeout' => 0,
52
+ 'provenance' => 'clientSupplied',
53
+ },
54
+ },
55
+ }
56
+ end
57
+ end
58
+ end
@@ -69,77 +69,113 @@ describe Mongo::Error::OperationFailure do
69
69
  end
70
70
 
71
71
  describe '#change_stream_resumable?' do
72
- context 'when there is a network error' do
73
- context 'getMore' do
74
- let(:error) { Mongo::Error::OperationFailure.new('problem: socket exception',
75
- Mongo::Operation::GetMore::Result.new(nil)) }
76
-
77
- it 'returns true' do
78
- expect(error.change_stream_resumable?).to be true
72
+ context 'when there is a resumable code' do
73
+ context 'getMore response' do
74
+ let(:result) do
75
+ Mongo::Operation::GetMore::Result.new(
76
+ Mongo::Protocol::Message.new, description)
79
77
  end
80
- end
81
78
 
82
- context 'not getMore' do
83
- let(:error) { Mongo::Error::OperationFailure.new('problem: socket exception', nil) }
79
+ let(:error) { Mongo::Error::OperationFailure.new('no message',
80
+ result,
81
+ :code => 91, :code_name => 'ShutdownInProgress') }
84
82
 
85
- it 'returns false' do
86
- expect(error.change_stream_resumable?).to be false
83
+ context 'wire protocol version < 9' do
84
+ let(:description) do
85
+ Mongo::Server::Description.new('',
86
+ 'minWireVersion' => 0,
87
+ 'maxWireVersion' => 8,
88
+ )
89
+ end
90
+
91
+ it 'returns true' do
92
+ expect(error.change_stream_resumable?).to eql(true)
93
+ end
87
94
  end
88
- end
89
- end
90
-
91
- context 'when there is a resumable message' do
92
- context 'getMore response' do
93
- let(:error) { Mongo::Error::OperationFailure.new('problem: node is recovering',
94
- Mongo::Operation::GetMore::Result.new(nil)) }
95
95
 
96
- it 'returns true' do
97
- expect(error.change_stream_resumable?).to eql(true)
96
+ context 'wire protocol version >= 9' do
97
+ let(:description) do
98
+ Mongo::Server::Description.new('',
99
+ 'minWireVersion' => 0,
100
+ 'maxWireVersion' => 9,
101
+ )
102
+ end
103
+
104
+ it 'returns false' do
105
+ # Error code is not consulted with wire version >= 9
106
+ expect(error.change_stream_resumable?).to eql(false)
107
+ end
98
108
  end
99
109
  end
100
110
 
101
111
  context 'not a getMore response' do
102
- let(:error) { Mongo::Error::OperationFailure.new('problem: node is recovering', nil) }
103
-
104
- it 'returns false' do
105
- expect(error.change_stream_resumable?).to eql(false)
106
- end
107
- end
108
- end
109
-
110
- context 'when there is a resumable code' do
111
- context 'getMore response' do
112
- let(:error) { Mongo::Error::OperationFailure.new('no message',
113
- Mongo::Operation::GetMore::Result.new(nil),
114
- :code => 91, :code_name => 'ShutdownInProgress') }
115
-
116
- it 'returns true' do
117
- expect(error.change_stream_resumable?).to eql(true)
112
+ let(:result) do
113
+ Mongo::Operation::Result.new(
114
+ Mongo::Protocol::Message.new, description)
118
115
  end
119
- end
120
116
 
121
- context 'not a getMore response' do
122
117
  let(:error) { Mongo::Error::OperationFailure.new('no message', nil,
123
118
  :code => 91, :code_name => 'ShutdownInProgress') }
124
119
 
125
- it 'returns false' do
126
- expect(error.change_stream_resumable?).to eql(false)
120
+ context 'wire protocol version < 9' do
121
+ let(:description) do
122
+ Mongo::Server::Description.new('',
123
+ 'minWireVersion' => 0,
124
+ 'maxWireVersion' => 8,
125
+ )
126
+ end
127
+
128
+ it 'returns false' do
129
+ expect(error.change_stream_resumable?).to eql(false)
130
+ end
127
131
  end
128
132
  end
129
133
  end
130
134
 
131
135
  context 'when there is a non-resumable code' do
132
136
  context 'getMore response' do
137
+ let(:result) do
138
+ Mongo::Operation::GetMore::Result.new(
139
+ Mongo::Protocol::Message.new, description)
140
+ end
141
+
133
142
  let(:error) { Mongo::Error::OperationFailure.new('no message',
134
- Mongo::Operation::GetMore::Result.new(nil),
143
+ result,
135
144
  :code => 136, :code_name => 'CappedPositionLost') }
136
145
 
137
- it 'returns false' do
138
- expect(error.change_stream_resumable?).to eql(false)
146
+ context 'wire protocol version < 9' do
147
+ let(:description) do
148
+ Mongo::Server::Description.new('',
149
+ 'minWireVersion' => 0,
150
+ 'maxWireVersion' => 8,
151
+ )
152
+ end
153
+
154
+ it 'returns false' do
155
+ expect(error.change_stream_resumable?).to eql(false)
156
+ end
157
+ end
158
+
159
+ context 'wire protocol version >= 9' do
160
+ let(:description) do
161
+ Mongo::Server::Description.new('',
162
+ 'minWireVersion' => 0,
163
+ 'maxWireVersion' => 9,
164
+ )
165
+ end
166
+
167
+ it 'returns false' do
168
+ expect(error.change_stream_resumable?).to eql(false)
169
+ end
139
170
  end
140
171
  end
141
172
 
142
173
  context 'not a getMore response' do
174
+ let(:result) do
175
+ Mongo::Operation::Result.new(
176
+ Mongo::Protocol::Message.new, description)
177
+ end
178
+
143
179
  let(:error) { Mongo::Error::OperationFailure.new('no message', nil,
144
180
  :code => 136, :code_name => 'CappedPositionLost') }
145
181
 
@@ -151,46 +187,68 @@ describe Mongo::Error::OperationFailure do
151
187
 
152
188
  context 'when there is a non-resumable label' do
153
189
  context 'getMore response' do
154
- let(:error) { Mongo::Error::OperationFailure.new('no message',
155
- Mongo::Operation::GetMore::Result.new(nil),
156
- :code => 91, :code_name => 'ShutdownInProgress',
157
- :labels => ['NonResumableChangeStreamError']) }
158
-
159
- it 'returns false' do
160
- expect(error.change_stream_resumable?).to eql(false)
190
+ let(:result) do
191
+ Mongo::Operation::GetMore::Result.new(
192
+ Mongo::Protocol::Message.new, description)
161
193
  end
162
- end
163
194
 
164
- context 'not a getMore response' do
165
- let(:error) { Mongo::Error::OperationFailure.new('no message', nil,
195
+ let(:error) { Mongo::Error::OperationFailure.new('no message',
196
+ result,
166
197
  :code => 91, :code_name => 'ShutdownInProgress',
167
198
  :labels => ['NonResumableChangeStreamError']) }
168
199
 
169
- it 'returns false' do
170
- expect(error.change_stream_resumable?).to eql(false)
200
+ context 'wire protocol version < 9' do
201
+ let(:description) do
202
+ Mongo::Server::Description.new('',
203
+ 'minWireVersion' => 0,
204
+ 'maxWireVersion' => 8,
205
+ )
206
+ end
207
+
208
+ it 'returns true' do
209
+ # Error code is consulted => error is resumable
210
+ expect(error.change_stream_resumable?).to eql(true)
211
+ end
171
212
  end
172
- end
173
- end
174
-
175
- context 'when there is another label' do
176
- context 'getMore response' do
177
- let(:error) { Mongo::Error::OperationFailure.new('no message',
178
- Mongo::Operation::GetMore::Result.new(nil),
179
- :code => 91, :code_name => 'ShutdownInProgress',
180
- :labels => %w(TransientTransactionError)) }
181
213
 
182
- it 'returns true' do
183
- expect(error.change_stream_resumable?).to eql(true)
214
+ context 'wire protocol version >= 9' do
215
+ let(:description) do
216
+ Mongo::Server::Description.new('',
217
+ 'minWireVersion' => 0,
218
+ 'maxWireVersion' => 9,
219
+ )
220
+ end
221
+
222
+ it 'returns false' do
223
+ # Error code is not consulted, there is no resumable label =>
224
+ # error is not resumable
225
+ expect(error.change_stream_resumable?).to eql(false)
226
+ end
184
227
  end
185
228
  end
186
229
 
187
230
  context 'not a getMore response' do
188
- let(:error) { Mongo::Error::OperationFailure.new('no message', nil,
231
+ let(:result) do
232
+ Mongo::Operation::Result.new(
233
+ Mongo::Protocol::Message.new, description)
234
+ end
235
+
236
+ let(:error) { Mongo::Error::OperationFailure.new('no message',
237
+ result,
189
238
  :code => 91, :code_name => 'ShutdownInProgress',
190
- :labels => %w(TransientTransactionError)) }
239
+ :labels => ['NonResumableChangeStreamError']) }
191
240
 
192
- it 'returns false' do
193
- expect(error.change_stream_resumable?).to eql(false)
241
+ context 'wire protocol version < 9' do
242
+ let(:description) do
243
+ Mongo::Server::Description.new('',
244
+ 'minWireVersion' => 0,
245
+ 'maxWireVersion' => 8,
246
+ )
247
+ end
248
+
249
+ it 'returns false' do
250
+ expect(error.change_stream_resumable?).to eql(false)
251
+ end
194
252
  end
195
253
  end
196
254
  end
@@ -230,7 +288,7 @@ describe Mongo::Error::OperationFailure do
230
288
  end
231
289
 
232
290
  let(:result) do
233
- Mongo::Operation::Result.new(reply)
291
+ Mongo::Operation::Result.new(reply, Mongo::Server::Description.new(''))
234
292
  end
235
293
 
236
294
  subject do