mongo 2.12.1 → 2.13.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (856) 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 +16 -10
  8. data/lib/mongo.rb +8 -3
  9. data/lib/mongo/active_support.rb +1 -1
  10. data/lib/mongo/address.rb +78 -37
  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 +283 -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 +62 -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 +214 -31
  56. data/lib/mongo/client_encryption.rb +1 -1
  57. data/lib/mongo/cluster.rb +177 -69
  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 +36 -17
  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 +4 -3
  66. data/lib/mongo/cluster/topology/replica_set_with_primary.rb +1 -1
  67. data/lib/mongo/cluster/topology/sharded.rb +2 -2
  68. data/lib/mongo/cluster/topology/single.rb +2 -2
  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 +39 -15
  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 +13 -3
  88. data/lib/mongo/collection/view/writable.rb +93 -13
  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 +35 -5
  112. data/lib/mongo/database/view.rb +21 -6
  113. data/lib/mongo/dbref.rb +1 -1
  114. data/lib/mongo/distinguishing_semaphore.rb +55 -0
  115. data/lib/mongo/error.rb +28 -2
  116. data/lib/mongo/error/auth_error.rb +1 -1
  117. data/lib/mongo/error/bulk_write_error.rb +1 -1
  118. data/lib/mongo/error/change_stream_resumable.rb +1 -1
  119. data/lib/mongo/error/closed_stream.rb +1 -1
  120. data/lib/mongo/error/connection_check_out_timeout.rb +1 -1
  121. data/lib/mongo/error/connection_perished.rb +23 -0
  122. data/lib/mongo/error/credential_check_error.rb +26 -0
  123. data/lib/mongo/error/extra_file_chunk.rb +1 -1
  124. data/lib/mongo/error/file_not_found.rb +1 -1
  125. data/lib/mongo/error/handshake_error.rb +1 -1
  126. data/lib/mongo/error/insufficient_iteration_count.rb +1 -1
  127. data/lib/mongo/error/invalid_address.rb +1 -1
  128. data/lib/mongo/error/invalid_application_name.rb +1 -1
  129. data/lib/mongo/error/invalid_bulk_operation.rb +1 -1
  130. data/lib/mongo/error/invalid_bulk_operation_type.rb +1 -1
  131. data/lib/mongo/error/invalid_collection_name.rb +1 -1
  132. data/lib/mongo/error/invalid_cursor_operation.rb +1 -1
  133. data/lib/mongo/error/invalid_database_name.rb +1 -1
  134. data/lib/mongo/error/invalid_document.rb +1 -1
  135. data/lib/mongo/error/invalid_file.rb +1 -1
  136. data/lib/mongo/error/invalid_file_revision.rb +1 -1
  137. data/lib/mongo/error/invalid_min_pool_size.rb +1 -1
  138. data/lib/mongo/error/invalid_nonce.rb +2 -2
  139. data/lib/mongo/error/invalid_read_option.rb +1 -1
  140. data/lib/mongo/error/invalid_replacement_document.rb +1 -1
  141. data/lib/mongo/error/invalid_server_auth_host.rb +22 -0
  142. data/lib/mongo/error/invalid_server_auth_response.rb +23 -0
  143. data/lib/mongo/error/invalid_server_preference.rb +6 -1
  144. data/lib/mongo/error/invalid_session.rb +3 -2
  145. data/lib/mongo/error/invalid_signature.rb +1 -1
  146. data/lib/mongo/error/invalid_transaction_operation.rb +1 -1
  147. data/lib/mongo/error/invalid_txt_record.rb +1 -1
  148. data/lib/mongo/error/invalid_update_document.rb +1 -1
  149. data/lib/mongo/error/invalid_uri.rb +1 -1
  150. data/lib/mongo/error/invalid_write_concern.rb +1 -1
  151. data/lib/mongo/error/lint_error.rb +1 -1
  152. data/lib/mongo/error/max_bson_size.rb +1 -1
  153. data/lib/mongo/error/max_message_size.rb +1 -1
  154. data/lib/mongo/error/mismatched_domain.rb +1 -1
  155. data/lib/mongo/error/missing_file_chunk.rb +1 -1
  156. data/lib/mongo/error/missing_password.rb +1 -1
  157. data/lib/mongo/error/missing_resume_token.rb +1 -1
  158. data/lib/mongo/error/missing_scram_server_signature.rb +27 -0
  159. data/lib/mongo/error/multi_index_drop.rb +1 -1
  160. data/lib/mongo/error/need_primary_server.rb +1 -1
  161. data/lib/mongo/error/no_server_available.rb +1 -1
  162. data/lib/mongo/error/no_srv_records.rb +1 -1
  163. data/lib/mongo/error/notable.rb +18 -3
  164. data/lib/mongo/error/operation_failure.rb +63 -44
  165. data/lib/mongo/error/parser.rb +16 -5
  166. data/lib/mongo/error/pool_closed_error.rb +1 -1
  167. data/lib/mongo/error/raise_original_error.rb +29 -0
  168. data/lib/mongo/error/session_ended.rb +1 -1
  169. data/lib/mongo/error/sessions_not_supported.rb +35 -0
  170. data/lib/mongo/error/socket_error.rb +1 -1
  171. data/lib/mongo/error/socket_timeout_error.rb +1 -1
  172. data/lib/mongo/error/unchangeable_collection_option.rb +1 -1
  173. data/lib/mongo/error/unexpected_chunk_length.rb +1 -1
  174. data/lib/mongo/error/unexpected_response.rb +1 -1
  175. data/lib/mongo/error/unknown_payload_type.rb +1 -1
  176. data/lib/mongo/error/unsupported_array_filters.rb +7 -2
  177. data/lib/mongo/error/unsupported_collation.rb +7 -2
  178. data/lib/mongo/error/unsupported_features.rb +1 -1
  179. data/lib/mongo/error/unsupported_message_type.rb +1 -1
  180. data/lib/mongo/error/unsupported_option.rb +99 -0
  181. data/lib/mongo/error/write_retryable.rb +1 -1
  182. data/lib/mongo/event.rb +1 -1
  183. data/lib/mongo/event/base.rb +7 -1
  184. data/lib/mongo/event/listeners.rb +1 -1
  185. data/lib/mongo/event/publisher.rb +1 -1
  186. data/lib/mongo/event/subscriber.rb +1 -1
  187. data/lib/mongo/grid.rb +1 -1
  188. data/lib/mongo/grid/file.rb +6 -1
  189. data/lib/mongo/grid/file/chunk.rb +3 -1
  190. data/lib/mongo/grid/file/info.rb +1 -1
  191. data/lib/mongo/grid/fs_bucket.rb +22 -15
  192. data/lib/mongo/grid/stream.rb +1 -1
  193. data/lib/mongo/grid/stream/read.rb +1 -1
  194. data/lib/mongo/grid/stream/write.rb +10 -4
  195. data/lib/mongo/id.rb +1 -1
  196. data/lib/mongo/index.rb +2 -1
  197. data/lib/mongo/index/view.rb +61 -11
  198. data/lib/mongo/lint.rb +10 -0
  199. data/lib/mongo/loggable.rb +1 -1
  200. data/lib/mongo/logger.rb +1 -1
  201. data/lib/mongo/monitoring.rb +39 -1
  202. data/lib/mongo/monitoring/cmap_log_subscriber.rb +1 -1
  203. data/lib/mongo/monitoring/command_log_subscriber.rb +20 -5
  204. data/lib/mongo/monitoring/event.rb +1 -1
  205. data/lib/mongo/monitoring/event/cmap.rb +1 -1
  206. data/lib/mongo/monitoring/event/cmap/base.rb +1 -1
  207. data/lib/mongo/monitoring/event/cmap/connection_check_out_failed.rb +1 -1
  208. data/lib/mongo/monitoring/event/cmap/connection_check_out_started.rb +1 -1
  209. data/lib/mongo/monitoring/event/cmap/connection_checked_in.rb +1 -1
  210. data/lib/mongo/monitoring/event/cmap/connection_checked_out.rb +1 -1
  211. data/lib/mongo/monitoring/event/cmap/connection_closed.rb +1 -1
  212. data/lib/mongo/monitoring/event/cmap/connection_created.rb +1 -1
  213. data/lib/mongo/monitoring/event/cmap/connection_ready.rb +1 -1
  214. data/lib/mongo/monitoring/event/cmap/pool_cleared.rb +1 -1
  215. data/lib/mongo/monitoring/event/cmap/pool_closed.rb +1 -1
  216. data/lib/mongo/monitoring/event/cmap/pool_created.rb +1 -1
  217. data/lib/mongo/monitoring/event/command_failed.rb +12 -1
  218. data/lib/mongo/monitoring/event/command_started.rb +44 -3
  219. data/lib/mongo/monitoring/event/command_succeeded.rb +12 -1
  220. data/lib/mongo/monitoring/event/secure.rb +8 -2
  221. data/lib/mongo/monitoring/event/server_closed.rb +2 -2
  222. data/lib/mongo/monitoring/event/server_description_changed.rb +28 -5
  223. data/lib/mongo/monitoring/event/server_heartbeat_failed.rb +10 -3
  224. data/lib/mongo/monitoring/event/server_heartbeat_started.rb +10 -3
  225. data/lib/mongo/monitoring/event/server_heartbeat_succeeded.rb +10 -3
  226. data/lib/mongo/monitoring/event/server_opening.rb +2 -2
  227. data/lib/mongo/monitoring/event/topology_changed.rb +2 -2
  228. data/lib/mongo/monitoring/event/topology_closed.rb +2 -2
  229. data/lib/mongo/monitoring/event/topology_opening.rb +2 -2
  230. data/lib/mongo/monitoring/publishable.rb +9 -9
  231. data/lib/mongo/monitoring/sdam_log_subscriber.rb +1 -1
  232. data/lib/mongo/monitoring/server_closed_log_subscriber.rb +1 -1
  233. data/lib/mongo/monitoring/server_description_changed_log_subscriber.rb +10 -2
  234. data/lib/mongo/monitoring/server_opening_log_subscriber.rb +1 -1
  235. data/lib/mongo/monitoring/topology_changed_log_subscriber.rb +2 -2
  236. data/lib/mongo/monitoring/topology_closed_log_subscriber.rb +1 -1
  237. data/lib/mongo/monitoring/topology_opening_log_subscriber.rb +1 -1
  238. data/lib/mongo/monitoring/unified_sdam_log_subscriber.rb +1 -1
  239. data/lib/mongo/operation.rb +1 -0
  240. data/lib/mongo/operation/aggregate.rb +1 -1
  241. data/lib/mongo/operation/aggregate/command.rb +5 -5
  242. data/lib/mongo/operation/aggregate/op_msg.rb +1 -1
  243. data/lib/mongo/operation/aggregate/result.rb +1 -1
  244. data/lib/mongo/operation/collections_info.rb +3 -36
  245. data/lib/mongo/operation/collections_info/command.rb +40 -0
  246. data/lib/mongo/operation/collections_info/result.rb +1 -1
  247. data/lib/mongo/operation/command.rb +1 -1
  248. data/lib/mongo/operation/command/command.rb +3 -3
  249. data/lib/mongo/operation/command/op_msg.rb +1 -1
  250. data/lib/mongo/operation/count.rb +1 -1
  251. data/lib/mongo/operation/count/command.rb +3 -3
  252. data/lib/mongo/operation/count/op_msg.rb +1 -1
  253. data/lib/mongo/operation/create.rb +1 -1
  254. data/lib/mongo/operation/create/command.rb +3 -3
  255. data/lib/mongo/operation/create/op_msg.rb +1 -1
  256. data/lib/mongo/operation/create_index.rb +1 -1
  257. data/lib/mongo/operation/create_index/command.rb +4 -4
  258. data/lib/mongo/operation/create_index/op_msg.rb +6 -3
  259. data/lib/mongo/operation/create_user.rb +1 -1
  260. data/lib/mongo/operation/create_user/command.rb +4 -4
  261. data/lib/mongo/operation/create_user/op_msg.rb +2 -2
  262. data/lib/mongo/operation/delete.rb +1 -1
  263. data/lib/mongo/operation/delete/bulk_result.rb +1 -1
  264. data/lib/mongo/operation/delete/command.rb +4 -4
  265. data/lib/mongo/operation/delete/legacy.rb +2 -2
  266. data/lib/mongo/operation/delete/op_msg.rb +4 -4
  267. data/lib/mongo/operation/delete/result.rb +2 -2
  268. data/lib/mongo/operation/distinct.rb +1 -1
  269. data/lib/mongo/operation/distinct/command.rb +3 -3
  270. data/lib/mongo/operation/distinct/op_msg.rb +1 -1
  271. data/lib/mongo/operation/drop.rb +1 -1
  272. data/lib/mongo/operation/drop/command.rb +3 -3
  273. data/lib/mongo/operation/drop/op_msg.rb +1 -1
  274. data/lib/mongo/operation/drop_database.rb +1 -1
  275. data/lib/mongo/operation/drop_database/command.rb +3 -3
  276. data/lib/mongo/operation/drop_database/op_msg.rb +1 -1
  277. data/lib/mongo/operation/drop_index.rb +1 -1
  278. data/lib/mongo/operation/drop_index/command.rb +4 -4
  279. data/lib/mongo/operation/drop_index/op_msg.rb +2 -2
  280. data/lib/mongo/operation/explain.rb +1 -1
  281. data/lib/mongo/operation/explain/command.rb +3 -3
  282. data/lib/mongo/operation/explain/legacy.rb +3 -3
  283. data/lib/mongo/operation/explain/op_msg.rb +1 -1
  284. data/lib/mongo/operation/explain/result.rb +1 -1
  285. data/lib/mongo/operation/find.rb +1 -1
  286. data/lib/mongo/operation/find/command.rb +3 -3
  287. data/lib/mongo/operation/find/legacy.rb +3 -3
  288. data/lib/mongo/operation/find/legacy/result.rb +1 -1
  289. data/lib/mongo/operation/find/op_msg.rb +2 -12
  290. data/lib/mongo/operation/find/result.rb +1 -1
  291. data/lib/mongo/operation/get_more.rb +1 -1
  292. data/lib/mongo/operation/get_more/command.rb +3 -3
  293. data/lib/mongo/operation/get_more/legacy.rb +2 -2
  294. data/lib/mongo/operation/get_more/op_msg.rb +2 -12
  295. data/lib/mongo/operation/get_more/result.rb +1 -1
  296. data/lib/mongo/operation/indexes.rb +1 -1
  297. data/lib/mongo/operation/indexes/command.rb +3 -3
  298. data/lib/mongo/operation/indexes/legacy.rb +4 -4
  299. data/lib/mongo/operation/indexes/op_msg.rb +1 -1
  300. data/lib/mongo/operation/indexes/result.rb +1 -1
  301. data/lib/mongo/operation/insert.rb +3 -2
  302. data/lib/mongo/operation/insert/bulk_result.rb +6 -2
  303. data/lib/mongo/operation/insert/command.rb +7 -7
  304. data/lib/mongo/operation/insert/legacy.rb +9 -5
  305. data/lib/mongo/operation/insert/op_msg.rb +6 -6
  306. data/lib/mongo/operation/insert/result.rb +7 -4
  307. data/lib/mongo/operation/kill_cursors.rb +1 -1
  308. data/lib/mongo/operation/kill_cursors/command.rb +3 -3
  309. data/lib/mongo/operation/kill_cursors/legacy.rb +2 -2
  310. data/lib/mongo/operation/kill_cursors/op_msg.rb +1 -1
  311. data/lib/mongo/operation/list_collections.rb +1 -1
  312. data/lib/mongo/operation/list_collections/command.rb +4 -4
  313. data/lib/mongo/operation/list_collections/op_msg.rb +2 -2
  314. data/lib/mongo/operation/list_collections/result.rb +1 -1
  315. data/lib/mongo/operation/map_reduce.rb +1 -1
  316. data/lib/mongo/operation/map_reduce/command.rb +3 -3
  317. data/lib/mongo/operation/map_reduce/op_msg.rb +1 -1
  318. data/lib/mongo/operation/map_reduce/result.rb +1 -1
  319. data/lib/mongo/operation/op_msg_base.rb +3 -3
  320. data/lib/mongo/operation/parallel_scan.rb +1 -1
  321. data/lib/mongo/operation/parallel_scan/command.rb +5 -5
  322. data/lib/mongo/operation/parallel_scan/op_msg.rb +2 -2
  323. data/lib/mongo/operation/parallel_scan/result.rb +1 -1
  324. data/lib/mongo/operation/remove_user.rb +1 -1
  325. data/lib/mongo/operation/remove_user/command.rb +4 -4
  326. data/lib/mongo/operation/remove_user/op_msg.rb +2 -2
  327. data/lib/mongo/operation/result.rb +28 -4
  328. data/lib/mongo/operation/shared/bypass_document_validation.rb +10 -4
  329. data/lib/mongo/operation/shared/causal_consistency_supported.rb +3 -3
  330. data/lib/mongo/operation/shared/collections_info_or_list_collections.rb +56 -0
  331. data/lib/mongo/operation/shared/executable.rb +46 -28
  332. data/lib/mongo/operation/shared/executable_no_validate.rb +3 -3
  333. data/lib/mongo/operation/shared/executable_transaction_label.rb +1 -1
  334. data/lib/mongo/operation/shared/idable.rb +1 -1
  335. data/lib/mongo/operation/shared/limited.rb +10 -2
  336. data/lib/mongo/operation/shared/object_id_generator.rb +1 -1
  337. data/lib/mongo/operation/shared/op_msg_or_command.rb +7 -5
  338. data/lib/mongo/operation/shared/op_msg_or_find_command.rb +8 -6
  339. data/lib/mongo/operation/shared/op_msg_or_list_indexes_command.rb +8 -6
  340. data/lib/mongo/operation/shared/polymorphic_lookup.rb +1 -1
  341. data/lib/mongo/operation/shared/polymorphic_result.rb +1 -1
  342. data/lib/mongo/operation/shared/read_preference_supported.rb +19 -16
  343. data/lib/mongo/operation/shared/response_handling.rb +83 -8
  344. data/lib/mongo/operation/shared/result/aggregatable.rb +1 -1
  345. data/lib/mongo/operation/shared/result/use_legacy_error_parser.rb +1 -1
  346. data/lib/mongo/operation/shared/sessions_supported.rb +50 -27
  347. data/lib/mongo/operation/shared/specifiable.rb +32 -20
  348. data/lib/mongo/operation/shared/write.rb +25 -19
  349. data/lib/mongo/operation/shared/write_concern_supported.rb +6 -6
  350. data/lib/mongo/operation/update.rb +1 -1
  351. data/lib/mongo/operation/update/bulk_result.rb +1 -1
  352. data/lib/mongo/operation/update/command.rb +4 -4
  353. data/lib/mongo/operation/update/legacy.rb +2 -2
  354. data/lib/mongo/operation/update/legacy/result.rb +1 -1
  355. data/lib/mongo/operation/update/op_msg.rb +4 -4
  356. data/lib/mongo/operation/update/result.rb +2 -2
  357. data/lib/mongo/operation/update_user.rb +1 -1
  358. data/lib/mongo/operation/update_user/command.rb +4 -4
  359. data/lib/mongo/operation/update_user/op_msg.rb +2 -2
  360. data/lib/mongo/operation/users_info.rb +1 -1
  361. data/lib/mongo/operation/users_info/command.rb +4 -4
  362. data/lib/mongo/operation/users_info/op_msg.rb +2 -2
  363. data/lib/mongo/operation/users_info/result.rb +1 -1
  364. data/lib/mongo/options.rb +1 -1
  365. data/lib/mongo/options/mapper.rb +1 -1
  366. data/lib/mongo/options/redacted.rb +1 -1
  367. data/lib/mongo/protocol/bit_vector.rb +1 -1
  368. data/lib/mongo/protocol/compressed.rb +1 -1
  369. data/lib/mongo/protocol/delete.rb +1 -1
  370. data/lib/mongo/protocol/get_more.rb +1 -1
  371. data/lib/mongo/protocol/insert.rb +1 -1
  372. data/lib/mongo/protocol/kill_cursors.rb +1 -1
  373. data/lib/mongo/protocol/message.rb +37 -9
  374. data/lib/mongo/protocol/msg.rb +37 -4
  375. data/lib/mongo/protocol/query.rb +1 -1
  376. data/lib/mongo/protocol/registry.rb +1 -1
  377. data/lib/mongo/protocol/reply.rb +1 -1
  378. data/lib/mongo/protocol/serializers.rb +6 -3
  379. data/lib/mongo/protocol/update.rb +1 -1
  380. data/lib/mongo/retryable.rb +23 -10
  381. data/lib/mongo/semaphore.rb +1 -1
  382. data/lib/mongo/server.rb +40 -8
  383. data/lib/mongo/server/app_metadata.rb +44 -7
  384. data/lib/mongo/server/connection.rb +37 -133
  385. data/lib/mongo/server/connection_base.rb +56 -15
  386. data/lib/mongo/server/connection_common.rb +75 -1
  387. data/lib/mongo/server/connection_pool.rb +20 -1
  388. data/lib/mongo/server/connection_pool/populator.rb +1 -1
  389. data/lib/mongo/server/context.rb +1 -1
  390. data/lib/mongo/server/description.rb +49 -2
  391. data/lib/mongo/server/description/features.rb +12 -3
  392. data/lib/mongo/server/monitor.rb +145 -69
  393. data/lib/mongo/server/monitor/app_metadata.rb +1 -1
  394. data/lib/mongo/server/monitor/connection.rb +110 -80
  395. data/lib/mongo/server/pending_connection.rb +215 -3
  396. data/lib/mongo/server/push_monitor.rb +173 -0
  397. data/{spec/runners/transactions/context.rb → lib/mongo/server/push_monitor/connection.rb} +9 -14
  398. data/lib/mongo/server/round_trip_time_averager.rb +12 -3
  399. data/lib/mongo/server_selector.rb +2 -2
  400. data/lib/mongo/server_selector/{selectable.rb → base.rb} +159 -86
  401. data/lib/mongo/server_selector/nearest.rb +26 -21
  402. data/lib/mongo/server_selector/primary.rb +24 -28
  403. data/lib/mongo/server_selector/primary_preferred.rb +32 -25
  404. data/lib/mongo/server_selector/secondary.rb +26 -21
  405. data/lib/mongo/server_selector/secondary_preferred.rb +29 -34
  406. data/lib/mongo/session.rb +14 -1
  407. data/lib/mongo/session/server_session.rb +1 -1
  408. data/lib/mongo/session/session_pool.rb +1 -1
  409. data/lib/mongo/socket.rb +121 -41
  410. data/lib/mongo/socket/ssl.rb +98 -35
  411. data/lib/mongo/socket/tcp.rb +39 -31
  412. data/lib/mongo/socket/unix.rb +14 -6
  413. data/lib/mongo/srv.rb +1 -1
  414. data/lib/mongo/srv/monitor.rb +1 -1
  415. data/lib/mongo/srv/resolver.rb +1 -1
  416. data/lib/mongo/srv/result.rb +1 -1
  417. data/lib/mongo/timeout.rb +9 -9
  418. data/lib/mongo/topology_version.rb +89 -0
  419. data/lib/mongo/uri.rb +61 -47
  420. data/lib/mongo/uri/srv_protocol.rb +9 -1
  421. data/lib/mongo/utils.rb +62 -0
  422. data/lib/mongo/version.rb +2 -2
  423. data/lib/mongo/write_concern.rb +1 -1
  424. data/lib/mongo/write_concern/acknowledged.rb +1 -1
  425. data/lib/mongo/write_concern/base.rb +1 -1
  426. data/lib/mongo/write_concern/unacknowledged.rb +1 -1
  427. data/mongo.gemspec +1 -1
  428. data/spec/NOTES.aws-auth.md +291 -0
  429. data/spec/README.aws-auth.md +318 -0
  430. data/spec/README.md +64 -17
  431. data/spec/integration/auth_spec.rb +29 -9
  432. data/spec/integration/awaited_ismaster_spec.rb +28 -0
  433. data/spec/integration/aws_auth_request_spec.rb +74 -0
  434. data/spec/integration/aws_credentials_retriever_spec.rb +103 -0
  435. data/spec/integration/bulk_write_spec.rb +19 -0
  436. data/spec/integration/change_stream_examples_spec.rb +6 -2
  437. data/spec/integration/change_stream_spec.rb +123 -51
  438. data/spec/integration/check_clean_slate_spec.rb +16 -0
  439. data/spec/integration/client_construction_aws_auth_spec.rb +191 -0
  440. data/spec/integration/client_construction_spec.rb +2 -1
  441. data/spec/integration/client_side_encryption/auto_encryption_bulk_writes_spec.rb +3 -3
  442. data/spec/integration/collection_indexes_prose_spec.rb +55 -0
  443. data/spec/integration/command_monitoring_spec.rb +30 -6
  444. data/spec/integration/command_spec.rb +11 -9
  445. data/spec/integration/connect_single_rs_name_spec.rb +10 -5
  446. data/spec/integration/connection_spec.rb +7 -3
  447. data/spec/integration/crud_spec.rb +32 -4
  448. data/spec/integration/cursor_reaping_spec.rb +14 -10
  449. data/spec/integration/docs_examples_spec.rb +6 -0
  450. data/spec/integration/fork_reconnect_spec.rb +143 -0
  451. data/spec/integration/get_more_spec.rb +10 -3
  452. data/spec/integration/grid_fs_bucket_spec.rb +48 -0
  453. data/spec/integration/heartbeat_events_spec.rb +5 -24
  454. data/spec/integration/read_concern_spec.rb +1 -1
  455. data/spec/integration/read_preference_spec.rb +41 -11
  456. data/spec/integration/reconnect_spec.rb +2 -3
  457. data/spec/integration/retryable_errors_spec.rb +33 -14
  458. data/spec/integration/{retryable_writes_spec.rb → retryable_writes/retryable_writes_36_and_older_spec.rb} +55 -51
  459. data/spec/integration/retryable_writes/retryable_writes_40_and_newer_spec.rb +401 -0
  460. data/spec/integration/retryable_writes/shared/adds_diagnostics.rb +15 -0
  461. data/spec/integration/retryable_writes/shared/does_not_support_retries.rb +24 -0
  462. data/spec/integration/retryable_writes/shared/only_supports_legacy_retries.rb +25 -0
  463. data/spec/integration/retryable_writes/shared/performs_legacy_retries.rb +215 -0
  464. data/spec/integration/retryable_writes/shared/performs_modern_retries.rb +232 -0
  465. data/spec/integration/retryable_writes/shared/performs_no_retries.rb +110 -0
  466. data/spec/integration/retryable_writes/shared/supports_legacy_retries.rb +19 -0
  467. data/spec/integration/retryable_writes/shared/supports_modern_retries.rb +25 -0
  468. data/spec/integration/retryable_writes/shared/supports_retries.rb +16 -0
  469. data/spec/integration/sdam_error_handling_spec.rb +142 -22
  470. data/spec/integration/sdam_events_spec.rb +77 -5
  471. data/spec/integration/sdam_prose_spec.rb +64 -0
  472. data/spec/integration/server_monitor_spec.rb +25 -1
  473. data/spec/integration/server_spec.rb +42 -26
  474. data/spec/integration/size_limit_spec.rb +26 -9
  475. data/spec/integration/ssl_uri_options_spec.rb +2 -2
  476. data/spec/integration/step_down_spec.rb +15 -15
  477. data/spec/integration/transactions_api_examples_spec.rb +59 -0
  478. data/spec/integration/transactions_examples_spec.rb +5 -2
  479. data/spec/integration/x509_auth_spec.rb +109 -0
  480. data/spec/integration/zlib_compression_spec.rb +25 -0
  481. data/spec/kerberos/kerberos_spec.rb +10 -6
  482. data/spec/lite_spec_helper.rb +31 -22
  483. data/spec/mongo/address/ipv4_spec.rb +1 -1
  484. data/spec/mongo/address_spec.rb +2 -2
  485. data/spec/mongo/auth/aws/request_region_spec.rb +42 -0
  486. data/spec/mongo/auth/aws/request_spec.rb +76 -0
  487. data/spec/mongo/auth/cr_spec.rb +7 -7
  488. data/spec/mongo/auth/gssapi/conversation_spec.rb +121 -0
  489. data/spec/mongo/auth/invalid_mechanism_spec.rb +1 -1
  490. data/spec/mongo/auth/ldap/conversation_spec.rb +1 -1
  491. data/spec/mongo/auth/ldap_spec.rb +3 -3
  492. data/spec/mongo/auth/scram/conversation_spec.rb +119 -334
  493. data/spec/mongo/auth/scram256/conversation_spec.rb +171 -0
  494. data/spec/mongo/auth/{scram/negotiation_spec.rb → scram_negotiation_spec.rb} +13 -8
  495. data/spec/mongo/auth/scram_spec.rb +29 -69
  496. data/spec/mongo/auth/user_spec.rb +1 -1
  497. data/spec/mongo/auth/x509/conversation_spec.rb +1 -1
  498. data/spec/mongo/auth/x509_spec.rb +8 -8
  499. data/spec/mongo/auth_spec.rb +4 -4
  500. data/spec/mongo/bulk_write_spec.rb +206 -2
  501. data/spec/mongo/client_construction_spec.rb +609 -86
  502. data/spec/mongo/client_spec.rb +59 -5
  503. data/spec/mongo/cluster/topology/replica_set_spec.rb +52 -9
  504. data/spec/mongo/cluster/topology/single_spec.rb +4 -2
  505. data/spec/mongo/cluster_spec.rb +37 -36
  506. data/spec/mongo/collection/view/aggregation_spec.rb +6 -2
  507. data/spec/mongo/collection/view/builder/find_command_spec.rb +17 -6
  508. data/spec/mongo/collection/view/change_stream_resume_spec.rb +392 -0
  509. data/spec/mongo/collection/view/change_stream_spec.rb +0 -318
  510. data/spec/mongo/collection/view/iterable_spec.rb +38 -0
  511. data/spec/mongo/collection/view/map_reduce_spec.rb +6 -2
  512. data/spec/mongo/collection/view/readable_spec.rb +15 -1
  513. data/spec/mongo/collection/view/writable_spec.rb +208 -1
  514. data/spec/mongo/collection_spec.rb +531 -43
  515. data/spec/mongo/cursor/builder/get_more_command_spec.rb +6 -1
  516. data/spec/mongo/cursor/builder/op_get_more_spec.rb +6 -1
  517. data/spec/mongo/cursor/builder/op_kill_cursors_spec.rb +6 -1
  518. data/spec/mongo/cursor_spec.rb +9 -1
  519. data/spec/mongo/database_spec.rb +251 -10
  520. data/spec/mongo/distinguishing_semaphore_spec.rb +63 -0
  521. data/spec/mongo/error/operation_failure_heavy_spec.rb +58 -0
  522. data/spec/mongo/error/operation_failure_spec.rb +167 -69
  523. data/spec/mongo/error/unsupported_option_spec.rb +54 -0
  524. data/spec/mongo/grid/fs_bucket_spec.rb +18 -0
  525. data/spec/mongo/grid/stream/write_spec.rb +32 -0
  526. data/spec/mongo/index/view_spec.rb +312 -0
  527. data/spec/mongo/monitoring/event/server_description_changed_spec.rb +1 -4
  528. data/spec/mongo/operation/aggregate/result_spec.rb +6 -1
  529. data/spec/mongo/operation/delete/bulk_spec.rb +18 -6
  530. data/spec/mongo/operation/delete/op_msg_spec.rb +22 -14
  531. data/spec/mongo/operation/find/legacy_spec.rb +27 -7
  532. data/spec/mongo/operation/get_more_spec.rb +6 -1
  533. data/spec/mongo/operation/insert/bulk_spec.rb +21 -7
  534. data/spec/mongo/operation/insert/command_spec.rb +4 -0
  535. data/spec/mongo/operation/insert/op_msg_spec.rb +22 -14
  536. data/spec/mongo/operation/limited_spec.rb +5 -3
  537. data/spec/mongo/operation/read_preference_legacy_spec.rb +16 -4
  538. data/spec/mongo/operation/read_preference_op_msg_spec.rb +115 -5
  539. data/spec/mongo/operation/result_spec.rb +6 -1
  540. data/spec/mongo/operation/update/bulk_spec.rb +18 -6
  541. data/spec/mongo/operation/update/command_spec.rb +4 -0
  542. data/spec/mongo/operation/update/op_msg_spec.rb +22 -14
  543. data/spec/mongo/protocol/msg_spec.rb +10 -0
  544. data/spec/mongo/retryable_spec.rb +71 -70
  545. data/spec/mongo/semaphore_spec.rb +51 -0
  546. data/spec/mongo/server/app_metadata_shared.rb +136 -0
  547. data/spec/mongo/server/app_metadata_spec.rb +8 -1
  548. data/spec/mongo/server/connection_auth_spec.rb +33 -14
  549. data/spec/mongo/server/connection_pool_spec.rb +0 -31
  550. data/spec/mongo/server/connection_spec.rb +118 -71
  551. data/spec/mongo/server/monitor/app_metadata_spec.rb +8 -1
  552. data/spec/mongo/server/monitor/connection_spec.rb +1 -82
  553. data/spec/mongo/server/monitor_spec.rb +76 -17
  554. data/spec/mongo/server/round_trip_time_averager_spec.rb +5 -3
  555. data/spec/mongo/server_selector/nearest_spec.rb +24 -23
  556. data/spec/mongo/server_selector/primary_preferred_spec.rb +27 -26
  557. data/spec/mongo/server_selector/primary_spec.rb +27 -9
  558. data/spec/mongo/server_selector/secondary_preferred_spec.rb +40 -23
  559. data/spec/mongo/server_selector/secondary_spec.rb +19 -18
  560. data/spec/mongo/server_selector_spec.rb +4 -5
  561. data/spec/mongo/session/session_pool_spec.rb +7 -3
  562. data/spec/mongo/session_spec.rb +35 -0
  563. data/spec/mongo/socket/ssl_spec.rb +2 -2
  564. data/spec/mongo/socket/tcp_spec.rb +2 -2
  565. data/spec/mongo/socket/unix_spec.rb +2 -2
  566. data/spec/mongo/socket_spec.rb +9 -9
  567. data/spec/mongo/timeout_spec.rb +22 -68
  568. data/spec/mongo/uri_spec.rb +21 -6
  569. data/spec/runners/auth.rb +5 -6
  570. data/spec/runners/change_streams/outcome.rb +42 -0
  571. data/spec/runners/change_streams/spec.rb +57 -0
  572. data/spec/runners/change_streams/test.rb +229 -0
  573. data/spec/runners/cmap.rb +1 -1
  574. data/spec/runners/cmap/verifier.rb +1 -1
  575. data/spec/runners/command_monitoring.rb +4 -35
  576. data/spec/runners/connection_string.rb +3 -2
  577. data/spec/runners/crud.rb +2 -2
  578. data/spec/runners/crud/context.rb +10 -6
  579. data/spec/runners/crud/operation.rb +177 -55
  580. data/spec/runners/crud/outcome.rb +1 -1
  581. data/spec/runners/crud/spec.rb +0 -7
  582. data/spec/runners/crud/test.rb +8 -26
  583. data/spec/runners/crud/test_base.rb +47 -0
  584. data/spec/runners/crud/verifier.rb +21 -3
  585. data/spec/runners/gridfs.rb +1 -1
  586. data/spec/runners/{server_discovery_and_monitoring.rb → sdam.rb} +41 -22
  587. data/spec/runners/sdam/verifier.rb +26 -8
  588. data/spec/runners/server_selection.rb +242 -28
  589. data/spec/runners/transactions.rb +13 -14
  590. data/spec/runners/transactions/operation.rb +155 -25
  591. data/spec/runners/transactions/spec.rb +1 -1
  592. data/spec/runners/transactions/test.rb +103 -65
  593. data/spec/spec_tests/auth_spec.rb +2 -0
  594. data/spec/spec_tests/change_streams_spec.rb +39 -4
  595. data/spec/spec_tests/client_side_encryption_spec.rb +3 -0
  596. data/spec/spec_tests/cmap_spec.rb +5 -0
  597. data/spec/spec_tests/command_monitoring_spec.rb +25 -12
  598. data/spec/spec_tests/connection_string_spec.rb +2 -0
  599. data/spec/spec_tests/crud_spec.rb +3 -1
  600. data/spec/spec_tests/data/auth/connection-string.yml +57 -1
  601. data/spec/spec_tests/data/change_streams/change-streams-errors.yml +27 -1
  602. data/spec/spec_tests/data/change_streams/change-streams-resume-errorLabels.yml +1105 -0
  603. data/spec/spec_tests/data/change_streams/change-streams-resume-whitelist.yml +1173 -0
  604. data/spec/spec_tests/data/change_streams/change-streams.yml +5 -4
  605. data/spec/spec_tests/data/crud_v2/aggregate-merge.yml +1 -1
  606. data/spec/spec_tests/data/crud_v2/bulkWrite-arrayFilters.yml +33 -11
  607. data/spec/spec_tests/data/crud_v2/bulkWrite-delete-hint-clientError.yml +63 -0
  608. data/spec/spec_tests/data/crud_v2/bulkWrite-delete-hint-serverError.yml +92 -0
  609. data/spec/spec_tests/data/crud_v2/bulkWrite-delete-hint.yml +103 -0
  610. data/spec/spec_tests/data/crud_v2/bulkWrite-update-hint-clientError.yml +90 -0
  611. data/spec/spec_tests/data/crud_v2/bulkWrite-update-hint-serverError.yml +147 -0
  612. data/spec/spec_tests/data/crud_v2/bulkWrite-update-hint.yml +164 -0
  613. data/spec/spec_tests/data/crud_v2/deleteMany-hint-clientError.yml +43 -0
  614. data/spec/spec_tests/data/crud_v2/deleteMany-hint-serverError.yml +62 -0
  615. data/spec/spec_tests/data/crud_v2/deleteMany-hint.yml +58 -0
  616. data/spec/spec_tests/data/crud_v2/deleteOne-hint-clientError.yml +41 -0
  617. data/spec/spec_tests/data/crud_v2/deleteOne-hint-serverError.yml +60 -0
  618. data/spec/spec_tests/data/crud_v2/deleteOne-hint.yml +57 -0
  619. data/spec/spec_tests/data/crud_v2/find-allowdiskuse-clientError.yml +28 -0
  620. data/spec/spec_tests/data/crud_v2/find-allowdiskuse-serverError.yml +44 -0
  621. data/spec/spec_tests/data/crud_v2/find-allowdiskuse.yml +50 -0
  622. data/spec/spec_tests/data/crud_v2/findOneAndDelete-hint-clientError.yml +45 -0
  623. data/spec/spec_tests/data/crud_v2/findOneAndDelete-hint-serverError.yml +60 -0
  624. data/spec/spec_tests/data/crud_v2/findOneAndDelete-hint.yml +56 -0
  625. data/spec/spec_tests/data/crud_v2/findOneAndReplace-hint-clientError.yml +40 -0
  626. data/spec/spec_tests/data/crud_v2/findOneAndReplace-hint-serverError.yml +59 -0
  627. data/spec/spec_tests/data/crud_v2/findOneAndReplace-hint.yml +55 -0
  628. data/spec/spec_tests/data/crud_v2/findOneAndUpdate-hint-clientError.yml +40 -0
  629. data/spec/spec_tests/data/crud_v2/findOneAndUpdate-hint-serverError.yml +58 -0
  630. data/spec/spec_tests/data/crud_v2/findOneAndUpdate-hint.yml +55 -0
  631. data/spec/spec_tests/data/crud_v2/replaceOne-hint.yml +61 -0
  632. data/spec/spec_tests/data/crud_v2/unacknowledged-bulkWrite-delete-hint-clientError.yml +60 -0
  633. data/spec/spec_tests/data/crud_v2/unacknowledged-bulkWrite-update-hint-clientError.yml +88 -0
  634. data/spec/spec_tests/data/crud_v2/unacknowledged-deleteMany-hint-clientError.yml +40 -0
  635. data/spec/spec_tests/data/crud_v2/unacknowledged-deleteOne-hint-clientError.yml +38 -0
  636. data/spec/spec_tests/data/crud_v2/unacknowledged-findOneAndDelete-hint-clientError.yml +42 -0
  637. data/spec/spec_tests/data/crud_v2/unacknowledged-findOneAndReplace-hint-clientError.yml +40 -0
  638. data/spec/spec_tests/data/crud_v2/unacknowledged-findOneAndUpdate-hint-clientError.yml +40 -0
  639. data/spec/spec_tests/data/crud_v2/unacknowledged-replaceOne-hint-clientError.yml +40 -0
  640. data/spec/spec_tests/data/crud_v2/unacknowledged-updateMany-hint-clientError.yml +43 -0
  641. data/spec/spec_tests/data/crud_v2/unacknowledged-updateOne-hint-clientError.yml +40 -0
  642. data/spec/spec_tests/data/crud_v2/updateMany-hint-clientError.yml +45 -0
  643. data/spec/spec_tests/data/crud_v2/updateMany-hint-serverError.yml +66 -0
  644. data/spec/spec_tests/data/crud_v2/updateMany-hint.yml +65 -0
  645. data/spec/spec_tests/data/crud_v2/updateOne-hint-clientError.yml +43 -0
  646. data/spec/spec_tests/data/crud_v2/updateOne-hint-serverError.yml +62 -0
  647. data/spec/spec_tests/data/crud_v2/updateOne-hint.yml +61 -0
  648. data/spec/spec_tests/data/crud_v2/updateWithPipelines.yml +65 -0
  649. data/spec/spec_tests/data/dns_seedlist_discovery/direct-connection-false.yml +10 -0
  650. data/spec/spec_tests/data/dns_seedlist_discovery/direct-connection-true.yml +5 -0
  651. data/spec/spec_tests/data/max_staleness/ReplicaSetNoPrimary/MaxStalenessTooSmall.yml +15 -0
  652. data/spec/spec_tests/data/max_staleness/ReplicaSetNoPrimary/NoKnownServers.yml +4 -3
  653. data/spec/spec_tests/data/max_staleness/Unknown/SmallMaxStaleness.yml +1 -0
  654. data/spec/spec_tests/data/read_write_concern/operation/default-write-concern-2.6.yml +215 -0
  655. data/spec/spec_tests/data/read_write_concern/operation/default-write-concern-3.2.yml +58 -0
  656. data/spec/spec_tests/data/read_write_concern/operation/default-write-concern-3.4.yml +95 -0
  657. data/spec/spec_tests/data/read_write_concern/operation/default-write-concern-4.2.yml +36 -0
  658. data/spec/spec_tests/data/retryable_writes/bulkWrite-errorLabels.yml +77 -0
  659. data/spec/spec_tests/data/retryable_writes/bulkWrite-serverErrors.yml +37 -0
  660. data/spec/spec_tests/data/retryable_writes/deleteOne-errorLabels.yml +48 -0
  661. data/spec/spec_tests/data/retryable_writes/deleteOne-serverErrors.yml +22 -0
  662. data/spec/spec_tests/data/retryable_writes/findOneAndDelete-errorLabels.yml +49 -0
  663. data/spec/spec_tests/data/retryable_writes/findOneAndDelete-serverErrors.yml +23 -0
  664. data/spec/spec_tests/data/retryable_writes/findOneAndReplace-errorLabels.yml +52 -0
  665. data/spec/spec_tests/data/retryable_writes/findOneAndReplace-serverErrors.yml +25 -0
  666. data/spec/spec_tests/data/retryable_writes/findOneAndUpdate-errorLabels.yml +52 -0
  667. data/spec/spec_tests/data/retryable_writes/findOneAndUpdate-serverErrors.yml +24 -0
  668. data/spec/spec_tests/data/retryable_writes/insertMany-errorLabels.yml +54 -0
  669. data/spec/spec_tests/data/retryable_writes/insertMany-serverErrors.yml +24 -0
  670. data/spec/spec_tests/data/retryable_writes/insertOne-errorLabels.yml +44 -0
  671. data/spec/spec_tests/data/retryable_writes/insertOne-serverErrors.yml +69 -0
  672. data/spec/spec_tests/data/retryable_writes/replaceOne-errorLabels.yml +53 -0
  673. data/spec/spec_tests/data/retryable_writes/replaceOne-serverErrors.yml +23 -0
  674. data/spec/spec_tests/data/retryable_writes/updateOne-errorLabels.yml +53 -0
  675. data/spec/spec_tests/data/retryable_writes/updateOne-serverErrors.yml +23 -0
  676. data/spec/spec_tests/data/sdam/errors/error_handling_handshake.yml +54 -0
  677. data/spec/spec_tests/data/sdam/errors/non-stale-network-error.yml +46 -0
  678. data/spec/spec_tests/data/sdam/errors/non-stale-network-timeout-error.yml +37 -0
  679. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-greater-InterruptedAtShutdown.yml +60 -0
  680. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-greater-InterruptedDueToReplStateChange.yml +60 -0
  681. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-greater-NotMaster.yml +60 -0
  682. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-greater-NotMasterNoSlaveOk.yml +60 -0
  683. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-greater-NotMasterOrSecondary.yml +60 -0
  684. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-greater-PrimarySteppedDown.yml +60 -0
  685. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-greater-ShutdownInProgress.yml +60 -0
  686. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-missing-InterruptedAtShutdown.yml +51 -0
  687. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-missing-InterruptedDueToReplStateChange.yml +51 -0
  688. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-missing-NotMaster.yml +51 -0
  689. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-missing-NotMasterNoSlaveOk.yml +51 -0
  690. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-missing-NotMasterOrSecondary.yml +51 -0
  691. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-missing-PrimarySteppedDown.yml +51 -0
  692. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-missing-ShutdownInProgress.yml +51 -0
  693. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-proccessId-changed-InterruptedAtShutdown.yml +60 -0
  694. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-proccessId-changed-InterruptedDueToReplStateChange.yml +60 -0
  695. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-proccessId-changed-NotMaster.yml +60 -0
  696. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-proccessId-changed-NotMasterNoSlaveOk.yml +60 -0
  697. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-proccessId-changed-NotMasterOrSecondary.yml +60 -0
  698. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-proccessId-changed-PrimarySteppedDown.yml +60 -0
  699. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-proccessId-changed-ShutdownInProgress.yml +60 -0
  700. data/spec/spec_tests/data/sdam/errors/post-42-InterruptedAtShutdown.yml +46 -0
  701. data/spec/spec_tests/data/sdam/errors/post-42-InterruptedDueToReplStateChange.yml +46 -0
  702. data/spec/spec_tests/data/sdam/errors/post-42-NotMaster.yml +46 -0
  703. data/spec/spec_tests/data/sdam/errors/post-42-NotMasterNoSlaveOk.yml +46 -0
  704. data/spec/spec_tests/data/sdam/errors/post-42-NotMasterOrSecondary.yml +46 -0
  705. data/spec/spec_tests/data/sdam/errors/post-42-PrimarySteppedDown.yml +46 -0
  706. data/spec/spec_tests/data/sdam/errors/post-42-ShutdownInProgress.yml +46 -0
  707. data/spec/spec_tests/data/sdam/errors/pre-42-InterruptedAtShutdown.yml +46 -0
  708. data/spec/spec_tests/data/sdam/errors/pre-42-InterruptedDueToReplStateChange.yml +46 -0
  709. data/spec/spec_tests/data/sdam/errors/pre-42-NotMaster.yml +46 -0
  710. data/spec/spec_tests/data/sdam/errors/pre-42-NotMasterNoSlaveOk.yml +46 -0
  711. data/spec/spec_tests/data/sdam/errors/pre-42-NotMasterOrSecondary.yml +46 -0
  712. data/spec/spec_tests/data/sdam/errors/pre-42-PrimarySteppedDown.yml +46 -0
  713. data/spec/spec_tests/data/sdam/errors/pre-42-ShutdownInProgress.yml +46 -0
  714. data/spec/spec_tests/data/sdam/errors/stale-generation-InterruptedAtShutdown.yml +89 -0
  715. data/spec/spec_tests/data/sdam/errors/stale-generation-InterruptedDueToReplStateChange.yml +89 -0
  716. data/spec/spec_tests/data/sdam/errors/stale-generation-NotMaster.yml +89 -0
  717. data/spec/spec_tests/data/sdam/errors/stale-generation-NotMasterNoSlaveOk.yml +89 -0
  718. data/spec/spec_tests/data/sdam/errors/stale-generation-NotMasterOrSecondary.yml +89 -0
  719. data/spec/spec_tests/data/sdam/errors/stale-generation-PrimarySteppedDown.yml +89 -0
  720. data/spec/spec_tests/data/sdam/errors/stale-generation-ShutdownInProgress.yml +89 -0
  721. data/spec/spec_tests/data/sdam/errors/stale-generation-afterHandshakeCompletes-InterruptedAtShutdown.yml +89 -0
  722. data/spec/spec_tests/data/sdam/errors/stale-generation-afterHandshakeCompletes-InterruptedDueToReplStateChange.yml +89 -0
  723. data/spec/spec_tests/data/sdam/errors/stale-generation-afterHandshakeCompletes-NotMaster.yml +89 -0
  724. data/spec/spec_tests/data/sdam/errors/stale-generation-afterHandshakeCompletes-NotMasterNoSlaveOk.yml +89 -0
  725. data/spec/spec_tests/data/sdam/errors/stale-generation-afterHandshakeCompletes-NotMasterOrSecondary.yml +89 -0
  726. data/spec/spec_tests/data/sdam/errors/stale-generation-afterHandshakeCompletes-PrimarySteppedDown.yml +89 -0
  727. data/spec/spec_tests/data/sdam/errors/stale-generation-afterHandshakeCompletes-ShutdownInProgress.yml +89 -0
  728. data/spec/spec_tests/data/sdam/errors/stale-generation-afterHandshakeCompletes-network.yml +80 -0
  729. data/spec/spec_tests/data/sdam/errors/stale-generation-afterHandshakeCompletes-timeout.yml +80 -0
  730. data/spec/spec_tests/data/sdam/errors/stale-generation-beforeHandshakeCompletes-InterruptedAtShutdown.yml +89 -0
  731. data/spec/spec_tests/data/sdam/errors/stale-generation-beforeHandshakeCompletes-InterruptedDueToReplStateChange.yml +89 -0
  732. data/spec/spec_tests/data/sdam/errors/stale-generation-beforeHandshakeCompletes-NotMaster.yml +89 -0
  733. data/spec/spec_tests/data/sdam/errors/stale-generation-beforeHandshakeCompletes-NotMasterNoSlaveOk.yml +89 -0
  734. data/spec/spec_tests/data/sdam/errors/stale-generation-beforeHandshakeCompletes-NotMasterOrSecondary.yml +89 -0
  735. data/spec/spec_tests/data/sdam/errors/stale-generation-beforeHandshakeCompletes-PrimarySteppedDown.yml +89 -0
  736. data/spec/spec_tests/data/sdam/errors/stale-generation-beforeHandshakeCompletes-ShutdownInProgress.yml +89 -0
  737. data/spec/spec_tests/data/sdam/errors/stale-generation-beforeHandshakeCompletes-network.yml +80 -0
  738. data/spec/spec_tests/data/sdam/errors/stale-generation-beforeHandshakeCompletes-timeout.yml +80 -0
  739. data/spec/spec_tests/data/sdam/errors/stale-topologyVersion-InterruptedAtShutdown.yml +64 -0
  740. data/spec/spec_tests/data/sdam/errors/stale-topologyVersion-InterruptedDueToReplStateChange.yml +64 -0
  741. data/spec/spec_tests/data/sdam/errors/stale-topologyVersion-NotMaster.yml +64 -0
  742. data/spec/spec_tests/data/sdam/errors/stale-topologyVersion-NotMasterNoSlaveOk.yml +64 -0
  743. data/spec/spec_tests/data/sdam/errors/stale-topologyVersion-NotMasterOrSecondary.yml +64 -0
  744. data/spec/spec_tests/data/sdam/errors/stale-topologyVersion-PrimarySteppedDown.yml +64 -0
  745. data/spec/spec_tests/data/sdam/errors/stale-topologyVersion-ShutdownInProgress.yml +64 -0
  746. data/spec/spec_tests/data/sdam/rs/compatible.yml +2 -0
  747. data/spec/spec_tests/data/sdam/rs/compatible_unknown.yml +2 -0
  748. data/spec/spec_tests/data/sdam/rs/discover_arbiters.yml +2 -2
  749. data/spec/spec_tests/data/sdam/rs/discover_arbiters_replicaset.yml +43 -0
  750. data/spec/spec_tests/data/sdam/rs/discover_ghost.yml +35 -0
  751. data/spec/spec_tests/data/sdam/rs/{ghost_discovered.yml → discover_ghost_replicaset.yml} +1 -1
  752. data/spec/spec_tests/data/sdam/rs/discover_hidden.yml +50 -0
  753. data/spec/spec_tests/data/sdam/rs/discover_hidden_replicaset.yml +50 -0
  754. data/spec/spec_tests/data/sdam/rs/discover_passives.yml +2 -2
  755. data/spec/spec_tests/data/sdam/rs/discover_passives_replicaset.yml +81 -0
  756. data/spec/spec_tests/data/sdam/rs/discover_primary.yml +2 -2
  757. data/spec/spec_tests/data/sdam/rs/discover_primary_replicaset.yml +42 -0
  758. data/spec/spec_tests/data/sdam/rs/discover_rsother.yml +49 -0
  759. data/spec/spec_tests/data/sdam/rs/{rsother_discovered.yml → discover_rsother_replicaset.yml} +1 -1
  760. data/spec/spec_tests/data/sdam/rs/discover_secondary.yml +2 -2
  761. data/spec/spec_tests/data/sdam/rs/discover_secondary_replicaset.yml +43 -0
  762. data/spec/spec_tests/data/sdam/rs/incompatible_arbiter.yml +2 -0
  763. data/spec/spec_tests/data/sdam/rs/incompatible_ghost.yml +2 -0
  764. data/spec/spec_tests/data/sdam/rs/incompatible_other.yml +2 -0
  765. data/spec/spec_tests/data/sdam/rs/primary_mismatched_me.yml +23 -27
  766. data/spec/spec_tests/data/sdam/rs/primary_to_no_primary_mismatched_me.yml +79 -55
  767. data/spec/spec_tests/data/sdam/rs/replicaset_rsnp.yml +20 -0
  768. data/spec/spec_tests/data/sdam/rs/secondary_mismatched_me.yml +3 -2
  769. data/spec/spec_tests/data/sdam/rs/too_new.yml +2 -0
  770. data/spec/spec_tests/data/sdam/rs/topology_version_equal.yml +66 -0
  771. data/spec/spec_tests/data/sdam/rs/topology_version_greater.yml +189 -0
  772. data/spec/spec_tests/data/sdam/rs/topology_version_less.yml +62 -0
  773. data/spec/spec_tests/data/sdam/sharded/discover_single_mongos.yml +23 -0
  774. data/spec/spec_tests/data/sdam/single/direct_connection_external_ip.yml +1 -1
  775. data/spec/spec_tests/data/sdam/single/direct_connection_mongos.yml +2 -2
  776. data/spec/spec_tests/data/sdam/single/direct_connection_replicaset.yml +22 -0
  777. data/spec/spec_tests/data/sdam/single/direct_connection_rsarbiter.yml +2 -2
  778. data/spec/spec_tests/data/sdam/single/direct_connection_rsprimary.yml +2 -2
  779. data/spec/spec_tests/data/sdam/single/direct_connection_rssecondary.yml +2 -2
  780. data/spec/spec_tests/data/sdam/single/direct_connection_slave.yml +1 -1
  781. data/spec/spec_tests/data/sdam/single/direct_connection_standalone.yml +2 -2
  782. data/spec/spec_tests/data/sdam/single/{unavailable_seed.yml → direct_connection_unavailable_seed.yml} +2 -2
  783. data/spec/spec_tests/data/sdam/single/direct_connection_wrong_set_name.yml +38 -0
  784. data/spec/spec_tests/data/sdam/single/discover_standalone.yml +34 -0
  785. data/spec/spec_tests/data/sdam/single/discover_unavailable_seed.yml +28 -0
  786. data/spec/spec_tests/data/sdam/single/too_old_then_upgraded.yml +46 -0
  787. data/spec/spec_tests/data/sdam_integration/cancel-server-check.yml +96 -0
  788. data/spec/spec_tests/data/sdam_integration/connectTimeoutMS.yml +88 -0
  789. data/spec/spec_tests/data/sdam_integration/find-network-error.yml +83 -0
  790. data/spec/spec_tests/data/sdam_integration/find-shutdown-error.yml +116 -0
  791. data/spec/spec_tests/data/sdam_integration/insert-network-error.yml +86 -0
  792. data/spec/spec_tests/data/sdam_integration/insert-shutdown-error.yml +115 -0
  793. data/spec/spec_tests/data/sdam_integration/isMaster-command-error.yml +168 -0
  794. data/spec/spec_tests/data/sdam_integration/isMaster-network-error.yml +162 -0
  795. data/spec/spec_tests/data/sdam_integration/isMaster-timeout.yml +229 -0
  796. data/spec/spec_tests/data/sdam_integration/rediscover-quickly-after-step-down.yml +87 -0
  797. data/spec/spec_tests/data/transactions/create-collection.yml +131 -0
  798. data/spec/spec_tests/data/transactions/create-index.yml +152 -0
  799. data/spec/spec_tests/data/transactions/error-labels.yml +87 -21
  800. data/spec/spec_tests/data/transactions/mongos-recovery-token.yml +1 -0
  801. data/spec/spec_tests/data/transactions/retryable-abort-errorLabels.yml +124 -0
  802. data/spec/spec_tests/data/transactions/retryable-abort.yml +17 -2
  803. data/spec/spec_tests/data/transactions/retryable-commit-errorLabels.yml +132 -0
  804. data/spec/spec_tests/data/transactions/retryable-commit.yml +24 -9
  805. data/spec/spec_tests/data/uri_options/connection-options.yml +43 -0
  806. data/spec/spec_tests/data/uri_options/ruby-auth-options.yml +12 -0
  807. data/spec/spec_tests/data/uri_options/ruby-connection-options.yml +57 -0
  808. data/spec/spec_tests/dns_seedlist_discovery_spec.rb +3 -1
  809. data/spec/spec_tests/gridfs_spec.rb +2 -0
  810. data/spec/spec_tests/max_staleness_spec.rb +5 -141
  811. data/spec/spec_tests/read_write_concern_connection_string_spec.rb +2 -0
  812. data/spec/spec_tests/read_write_concern_operaton_spec.rb +10 -0
  813. data/spec/spec_tests/retryable_reads_spec.rb +4 -2
  814. data/spec/spec_tests/retryable_writes_spec.rb +8 -1
  815. data/spec/spec_tests/sdam_integration_spec.rb +13 -0
  816. data/spec/spec_tests/sdam_monitoring_spec.rb +3 -2
  817. data/spec/spec_tests/sdam_spec.rb +70 -1
  818. data/spec/spec_tests/server_selection_rtt_spec.rb +2 -0
  819. data/spec/spec_tests/server_selection_spec.rb +5 -115
  820. data/spec/spec_tests/transactions_api_spec.rb +5 -0
  821. data/spec/spec_tests/transactions_spec.rb +5 -0
  822. data/spec/spec_tests/uri_options_spec.rb +2 -0
  823. data/spec/stress/cleanup_spec.rb +58 -0
  824. data/spec/stress/connection_pool_stress_spec.rb +11 -13
  825. data/spec/stress/connection_pool_timing_spec.rb +3 -6
  826. data/spec/stress/fork_reconnect_stress_spec.rb +109 -0
  827. data/spec/support/authorization.rb +1 -11
  828. data/spec/support/aws_utils.rb +62 -0
  829. data/spec/support/aws_utils/base.rb +134 -0
  830. data/spec/support/aws_utils/inspector.rb +224 -0
  831. data/spec/support/aws_utils/orchestrator.rb +370 -0
  832. data/spec/support/aws_utils/provisioner.rb +360 -0
  833. data/spec/support/background_thread_registry.rb +6 -2
  834. data/spec/support/child_process_helper.rb +78 -0
  835. data/spec/support/client_registry.rb +6 -24
  836. data/spec/support/cluster_config.rb +5 -0
  837. data/spec/support/common_shortcuts.rb +43 -0
  838. data/spec/support/constraints.rb +27 -7
  839. data/spec/support/crypt.rb +1 -1
  840. data/spec/support/event_subscriber.rb +184 -84
  841. data/spec/support/keyword_struct.rb +26 -0
  842. data/spec/support/lite_constraints.rb +47 -0
  843. data/spec/support/shared/scram_conversation.rb +100 -0
  844. data/spec/support/shared/server_selector.rb +93 -1
  845. data/spec/support/shared/session.rb +29 -21
  846. data/spec/support/spec_config.rb +76 -21
  847. data/spec/support/spec_organizer.rb +129 -0
  848. data/spec/support/spec_setup.rb +9 -5
  849. data/spec/support/utils.rb +161 -24
  850. metadata +1189 -742
  851. metadata.gz.sig +0 -0
  852. data/lib/mongo/server/connectable.rb +0 -107
  853. data/spec/runners/change_streams.rb +0 -262
  854. data/spec/runners/change_streams/operation.rb +0 -89
  855. data/spec/runners/sdam_monitoring.rb +0 -89
  856. data/spec/spec_tests/data/sdam/sharded/ruby_discovered_single_mongos.yml +0 -27
@@ -0,0 +1,26 @@
1
+ # Intermediate step between a Struct and an OpenStruct. Allows only designated
2
+ # field names to be read or written but allows passing fields to constructor
3
+ # as keyword arguments.
4
+ class KeywordStruct
5
+ def self.new(*field_names, &block)
6
+ Class.new.tap do |cls|
7
+ cls.class_exec do
8
+ define_method(:initialize) do |**fields|
9
+ fields.each do |field, value|
10
+ unless field_names.include?(field)
11
+ raise ArgumentError, "Unknown field #{field}"
12
+ end
13
+
14
+ instance_variable_set("@#{field}", value)
15
+ end
16
+ end
17
+
18
+ attr_accessor *field_names
19
+ end
20
+
21
+ if block_given?
22
+ cls.class_exec(&block)
23
+ end
24
+ end
25
+ end
26
+ end
@@ -91,4 +91,51 @@ module LiteConstraints
91
91
  end
92
92
  end
93
93
  end
94
+
95
+ def require_aws_auth
96
+ before(:all) do
97
+ unless (ENV['AUTH'] || '') =~ /^aws/
98
+ skip 'This test requires AUTH=aws* and an appropriately configured runtime environment'
99
+ end
100
+ end
101
+ end
102
+
103
+ def require_ec2_host
104
+ before(:all) do
105
+ if $have_aws.nil?
106
+ $have_aws = begin
107
+ require 'open-uri'
108
+ begin
109
+ Timeout.timeout(3.81) do
110
+ URI.parse('http://169.254.169.254/latest/meta-data/profile').open.read
111
+ end
112
+ true
113
+ # When trying to use the EC2 metadata endpoint on ECS:
114
+ # Errno::EINVAL: Failed to open TCP connection to 169.254.169.254:80 (Invalid argument - connect(2) for "169.254.169.254" port 80)
115
+ rescue Timeout::Error, Errno::ETIMEDOUT, Errno::EINVAL, OpenURI::HTTPError => $aws_error
116
+ false
117
+ end
118
+ end
119
+ end
120
+ unless $have_aws
121
+ skip "EC2 instance metadata is not available - assuming not running on an EC2 instance: #{$aws_error.class}: #{$aws_error}"
122
+ end
123
+ end
124
+ end
125
+
126
+ def require_stress
127
+ before(:all) do
128
+ if !SpecConfig.instance.stress?
129
+ skip 'Set STRESS=1 in environment to run stress tests'
130
+ end
131
+ end
132
+ end
133
+
134
+ def require_fork
135
+ before(:all) do
136
+ if !SpecConfig.instance.fork?
137
+ skip 'Set FORK=1 in environment to run fork tests'
138
+ end
139
+ end
140
+ end
94
141
  end
@@ -0,0 +1,100 @@
1
+ shared_context 'scram conversation context' do
2
+ let(:connection) do
3
+ double('connection').tap do |connection|
4
+ features = double('features')
5
+ allow(features).to receive(:op_msg_enabled?)
6
+ allow(connection).to receive(:features).and_return(features)
7
+ allow(connection).to receive(:server)
8
+ end
9
+ end
10
+ end
11
+
12
+ shared_examples 'scram conversation' do
13
+
14
+ describe '#parse_payload' do
15
+ let(:user) { double('user') }
16
+ let(:mechanism) { :scram }
17
+
18
+ shared_examples_for 'parses as expected' do
19
+ it 'parses as expected' do
20
+ conversation.send(:parse_payload, payload).should == expected
21
+ end
22
+ end
23
+
24
+ context 'regular payload' do
25
+ let(:payload) { 'foo=bar,hello=world' }
26
+ let(:expected) do
27
+ {'foo' => 'bar', 'hello' => 'world'}
28
+ end
29
+
30
+ it_behaves_like 'parses as expected'
31
+ end
32
+
33
+ context 'equal signs in value' do
34
+ let(:payload) { 'foo=bar==,hello=world=is=great' }
35
+ let(:expected) do
36
+ {'foo' => 'bar==', 'hello' => 'world=is=great'}
37
+ end
38
+
39
+ it_behaves_like 'parses as expected'
40
+ end
41
+
42
+ context 'missing value' do
43
+ let(:payload) { 'foo=,hello=' }
44
+ let(:expected) do
45
+ {'foo' => '', 'hello' => ''}
46
+ end
47
+
48
+ it_behaves_like 'parses as expected'
49
+ end
50
+
51
+ context 'missing key/value pair' do
52
+ let(:payload) { 'foo=,,hello=' }
53
+ let(:expected) do
54
+ {'foo' => '', 'hello' => ''}
55
+ end
56
+
57
+ it_behaves_like 'parses as expected'
58
+ end
59
+
60
+ context 'missing key' do
61
+ let(:payload) { '=bar' }
62
+
63
+ it 'raises an exception' do
64
+ lambda do
65
+ conversation.send(:parse_payload, payload)
66
+ end.should raise_error(Mongo::Error::InvalidServerAuthResponse, /Payload malformed: missing key/)
67
+ end
68
+ end
69
+
70
+ context 'all keys missing' do
71
+ let(:payload) { ',,,' }
72
+ let(:expected) do
73
+ {}
74
+ end
75
+
76
+ it_behaves_like 'parses as expected'
77
+ end
78
+ end
79
+ end
80
+
81
+ shared_context 'scram continue and finalize replies' do
82
+
83
+ let(:continue_document) do
84
+ BSON::Document.new(
85
+ 'conversationId' => 1,
86
+ 'done' => false,
87
+ 'payload' => continue_payload,
88
+ 'ok' => 1.0
89
+ )
90
+ end
91
+
92
+ let(:finalize_document) do
93
+ BSON::Document.new(
94
+ 'conversationId' => 1,
95
+ 'done' => false,
96
+ 'payload' => finalize_payload,
97
+ 'ok' => 1.0
98
+ )
99
+ end
100
+ end
@@ -2,6 +2,8 @@ shared_context 'server selector' do
2
2
 
3
3
  let(:max_staleness) { nil }
4
4
  let(:tag_sets) { [] }
5
+ let(:hedge) { nil }
6
+
5
7
  let(:tag_set) do
6
8
  { 'test' => 'tag' }
7
9
  end
@@ -20,7 +22,19 @@ shared_context 'server selector' do
20
22
  expect(server.unknown?).to be true
21
23
  end
22
24
  end
23
- let(:options) { { :mode => name, :tag_sets => tag_sets, max_staleness: max_staleness } }
25
+ let(:server_selection_timeout_options) do
26
+ {
27
+ server_selection_timeout: 0.1,
28
+ }
29
+ end
30
+ let(:options) do
31
+ {
32
+ mode: name,
33
+ tag_sets: tag_sets,
34
+ max_staleness: max_staleness,
35
+ hedge: hedge,
36
+ }
37
+ end
24
38
  let(:selector) { described_class.new(options) }
25
39
  let(:monitoring) do
26
40
  Mongo::Monitoring.new(monitoring: false)
@@ -120,6 +134,84 @@ shared_examples 'a server selector accepting tag sets' do
120
134
  end
121
135
  end
122
136
 
137
+ shared_examples 'a server selector accepting hedge' do
138
+ describe '#initialize' do
139
+ context 'when hedge is not provided' do
140
+ it 'initializes successfully' do
141
+ expect do
142
+ selector
143
+ end.not_to raise_error
144
+ end
145
+ end
146
+
147
+ context 'when hedge is not a Hash' do
148
+ let(:hedge) { true }
149
+
150
+ it 'raises an exception' do
151
+ expect do
152
+ selector
153
+ end.to raise_error(Mongo::Error::InvalidServerPreference, /`hedge` value \(true\) is invalid/)
154
+ end
155
+ end
156
+
157
+ context 'when hedge is an empty Hash' do
158
+ let(:hedge) { {} }
159
+
160
+ it 'raises an exception' do
161
+ expect do
162
+ selector
163
+ end.to raise_error(Mongo::Error::InvalidServerPreference, /`hedge` value \({}\) is invalid/)
164
+ end
165
+ end
166
+
167
+ context 'when hedge is a Hash with data' do
168
+ let(:hedge) { { enabled: false } }
169
+
170
+ it 'initializes successfully' do
171
+ expect do
172
+ selector
173
+ end.not_to raise_error
174
+ end
175
+ end
176
+ end
177
+
178
+ describe '#hedge' do
179
+ context 'when hedge is not provided' do
180
+ it 'returns nil' do
181
+ expect(selector.hedge).to be_nil
182
+ end
183
+ end
184
+
185
+ context 'when hedge is a Hash with data' do
186
+ let(:hedge) { { enabled: false } }
187
+
188
+ it 'returns the same Hash' do
189
+ expect(selector.hedge).to eq({ enabled: false })
190
+ end
191
+ end
192
+ end
193
+
194
+ describe '#==' do
195
+ let(:other_selector) { described_class.new(hedge: { enabled: false }) }
196
+
197
+ context 'when hedges are the same' do
198
+ let(:hedge) { { enabled: false } }
199
+
200
+ it 'returns true' do
201
+ expect(selector).to eq(other_selector)
202
+ end
203
+ end
204
+
205
+ context 'when hedges are different' do
206
+ let(:hedge) { { enabled: true } }
207
+
208
+ it 'returns false' do
209
+ expect(selector).not_to eq(other_selector)
210
+ end
211
+ end
212
+ end
213
+ end
214
+
123
215
  shared_examples 'a server selector with sensitive data in its options' do
124
216
 
125
217
  describe '#inspect' do
@@ -123,10 +123,6 @@ end
123
123
 
124
124
  shared_examples 'an explicit session with an unacknowledged write' do
125
125
 
126
- before do
127
- EventSubscriber.clear_events!
128
- end
129
-
130
126
  context 'when sessions are supported' do
131
127
  min_server_fcv '3.6'
132
128
 
@@ -135,8 +131,10 @@ shared_examples 'an explicit session with an unacknowledged write' do
135
131
  end
136
132
 
137
133
  it 'does not add a session id to the operation' do
134
+ subscriber.clear_events!
138
135
  operation
139
- expect(EventSubscriber.started_events.collect(&:command).collect { |cmd| cmd['lsid'] }.compact).to be_empty
136
+ subscriber.non_auth_command_started_events.length.should == 1
137
+ expect(subscriber.non_auth_command_started_events.collect(&:command).collect { |cmd| cmd['lsid'] }.compact).to be_empty
140
138
  end
141
139
  end
142
140
 
@@ -149,24 +147,24 @@ shared_examples 'an explicit session with an unacknowledged write' do
149
147
 
150
148
  it 'does not add a session id to the operation' do
151
149
  expect(Mongo::Session).not_to receive(:new)
150
+ subscriber.clear_events!
152
151
  operation
153
- expect(EventSubscriber.started_events.collect(&:command).collect { |cmd| cmd['lsid'] }.compact).to be_empty
152
+ subscriber.non_auth_command_started_events.length.should == 1
153
+ expect(subscriber.non_auth_command_started_events.collect(&:command).collect { |cmd| cmd['lsid'] }.compact).to be_empty
154
154
  end
155
155
  end
156
156
  end
157
157
 
158
158
  shared_examples 'an implicit session with an unacknowledged write' do
159
159
 
160
- before do
161
- EventSubscriber.clear_events!
162
- end
163
-
164
160
  context 'when sessions are supported' do
165
161
  min_server_fcv '3.6'
166
162
 
167
163
  it 'does not add a session id to the operation' do
164
+ subscriber.clear_events!
168
165
  operation
169
- expect(EventSubscriber.started_events.collect(&:command).collect { |cmd| cmd['lsid'] }.compact).to be_empty
166
+ subscriber.non_auth_command_started_events.length.should == 1
167
+ expect(subscriber.non_auth_command_started_events.collect(&:command).collect { |cmd| cmd['lsid'] }.compact).to be_empty
170
168
  end
171
169
  end
172
170
 
@@ -174,16 +172,22 @@ shared_examples 'an implicit session with an unacknowledged write' do
174
172
  max_server_version '3.4'
175
173
 
176
174
  it 'does not add a session id to the operation' do
175
+ subscriber.clear_events!
177
176
  operation
178
- expect(EventSubscriber.started_events.collect(&:command).collect { |cmd| cmd['lsid'] }.compact).to be_empty
177
+ subscriber.non_auth_command_started_events.length.should == 1
178
+ expect(subscriber.non_auth_command_started_events.collect(&:command).collect { |cmd| cmd['lsid'] }.compact).to be_empty
179
179
  end
180
180
  end
181
181
  end
182
182
 
183
183
  shared_examples 'an operation supporting causally consistent reads' do
184
184
 
185
+ let(:subscriber) { EventSubscriber.new }
186
+
185
187
  let(:client) do
186
- subscribed_client
188
+ authorized_client.tap do |client|
189
+ client.subscribe(Mongo::Monitoring::COMMAND, subscriber)
190
+ end
187
191
  end
188
192
 
189
193
  context 'when connected to a standalone' do
@@ -615,8 +619,12 @@ shared_examples 'an operation updating cluster time' do
615
619
  client.start_session
616
620
  end
617
621
 
622
+ let(:subscriber) { EventSubscriber.new }
623
+
618
624
  let(:client) do
619
- subscribed_client
625
+ authorized_client.tap do |client|
626
+ client.subscribe(Mongo::Monitoring::COMMAND, subscriber)
627
+ end
620
628
  end
621
629
 
622
630
  shared_examples_for 'does not update the cluster time of the cluster' do
@@ -637,7 +645,7 @@ shared_examples 'an operation updating cluster time' do
637
645
 
638
646
  let(:reply_cluster_time) do
639
647
  operation_with_session
640
- EventSubscriber.succeeded_events[-1].reply['$clusterTime']
648
+ subscriber.succeeded_events[-1].reply['$clusterTime']
641
649
  end
642
650
 
643
651
  it 'updates the cluster time of the cluster', retry: 3 do
@@ -660,7 +668,7 @@ shared_examples 'an operation updating cluster time' do
660
668
 
661
669
  let!(:reply_cluster_time) do
662
670
  operation_with_session
663
- EventSubscriber.succeeded_events[-1].reply['$clusterTime']
671
+ subscriber.succeeded_events[-1].reply['$clusterTime']
664
672
  end
665
673
 
666
674
  it_behaves_like 'does not update the cluster time of the cluster'
@@ -681,7 +689,7 @@ shared_examples 'an operation updating cluster time' do
681
689
 
682
690
  let(:reply_cluster_time) do
683
691
  operation
684
- EventSubscriber.succeeded_events[-1].reply['$clusterTime']
692
+ subscriber.succeeded_events[-1].reply['$clusterTime']
685
693
  end
686
694
 
687
695
  it_behaves_like 'does not update the cluster time of the cluster'
@@ -692,7 +700,7 @@ shared_examples 'an operation updating cluster time' do
692
700
 
693
701
  let(:reply_cluster_time) do
694
702
  operation_with_session
695
- EventSubscriber.succeeded_events[-1].reply['$clusterTime']
703
+ subscriber.succeeded_events[-1].reply['$clusterTime']
696
704
  end
697
705
 
698
706
  context 'when the cluster is sharded or a replica set' do
@@ -707,7 +715,7 @@ shared_examples 'an operation updating cluster time' do
707
715
 
708
716
  let(:second_command_cluster_time) do
709
717
  second_operation
710
- EventSubscriber.started_events[-1].command['$clusterTime']
718
+ subscriber.non_auth_command_started_events[-1].command['$clusterTime']
711
719
  end
712
720
 
713
721
  context 'when the advanced cluster time is greater than the existing cluster time' do
@@ -745,7 +753,7 @@ shared_examples 'an operation updating cluster time' do
745
753
 
746
754
  let(:second_command_cluster_time) do
747
755
  second_operation
748
- EventSubscriber.started_events[-1].command['$clusterTime']
756
+ subscriber.non_auth_command_started_events[-1].command['$clusterTime']
749
757
  end
750
758
 
751
759
  it 'includes the received cluster time in the second command', retry: 3 do
@@ -765,7 +773,7 @@ shared_examples 'an operation updating cluster time' do
765
773
 
766
774
  let(:second_command_cluster_time) do
767
775
  second_operation
768
- EventSubscriber.started_events[-1].command['$clusterTime']
776
+ subscriber.non_auth_command_started_events[-1].command['$clusterTime']
769
777
  end
770
778
 
771
779
  it 'does not update the cluster time of the cluster' do
@@ -74,7 +74,7 @@ class SpecConfig
74
74
  # TLS options need to be merged for evergreen due to
75
75
  # https://github.com/10gen/mongo-orchestration/issues/268
76
76
  client = Mongo::Client.new(addresses, Mongo::Options::Redacted.new(
77
- server_selection_timeout: 5,
77
+ server_selection_timeout: 5.03,
78
78
  ).merge(ssl_options))
79
79
 
80
80
  begin
@@ -99,7 +99,7 @@ class SpecConfig
99
99
  # Environment
100
100
 
101
101
  def ci?
102
- !!ENV['CI']
102
+ %w(1 true yes).include?(ENV['CI']&.downcase)
103
103
  end
104
104
 
105
105
  def mri?
@@ -114,14 +114,18 @@ class SpecConfig
114
114
  RUBY_PLATFORM
115
115
  end
116
116
 
117
- def stress_spec?
118
- !!ENV['STRESS_SPEC']
117
+ def stress?
118
+ %w(1 true yes).include?(ENV['STRESS']&.downcase)
119
+ end
120
+
121
+ def fork?
122
+ %w(1 true yes).include?(ENV['FORK']&.downcase)
119
123
  end
120
124
 
121
125
  # Test suite configuration
122
126
 
123
127
  def client_debug?
124
- %w(1 true yes).include?((ENV['CLIENT_DEBUG'] || '').downcase)
128
+ %w(1 true yes).include?(ENV['MONGO_RUBY_DRIVER_CLIENT_DEBUG']&.downcase)
125
129
  end
126
130
 
127
131
  def drivers_tools?
@@ -354,6 +358,11 @@ EOT
354
358
  if auth_source
355
359
  options[:auth_source] = auth_source
356
360
  end
361
+ %i(auth_mech auth_mech_properties).each do |key|
362
+ if uri_options[key]
363
+ options[key] = uri_options[key]
364
+ end
365
+ end
357
366
  end
358
367
  end
359
368
  end
@@ -405,11 +414,19 @@ EOT
405
414
  # means the test suite hangs for about 4 seconds before
406
415
  # failing.
407
416
  # Server selection timeout of 1 is insufficient for evergreen.
408
- server_selection_timeout: uri_options[:server_selection_timeout] || (ssl? ? 4.01 : 2.01),
409
-
410
- wait_queue_timeout: 2,
411
- connect_timeout: 3,
412
- max_idle_time: 5
417
+ server_selection_timeout: uri_options[:server_selection_timeout] || (ssl? ? 8.01 : 7.01),
418
+
419
+ # Since connections are established under the wait queue timeout,
420
+ # the wait queue timeout should be at least as long as the
421
+ # connect timeout.
422
+ wait_queue_timeout: 6.04,
423
+ connect_timeout: 2.91,
424
+ socket_timeout: 5.09,
425
+ max_idle_time: 100.02,
426
+
427
+ # Uncomment to have exceptions in background threads log complete
428
+ # backtraces.
429
+ #bg_error_backtrace: true,
413
430
  }
414
431
  end
415
432
 
@@ -424,6 +441,14 @@ EOT
424
441
  test_options.merge(auth_options)
425
442
  end
426
443
 
444
+ def authorized_test_options
445
+ test_options.merge(credentials_or_external_user(
446
+ user: test_user.name,
447
+ password: test_user.password,
448
+ auth_source: auth_options[:auth_source],
449
+ ))
450
+ end
451
+
427
452
  # User objects
428
453
 
429
454
  # Gets the root system administrator user.
@@ -444,8 +469,8 @@ EOT
444
469
  # Get the default test user for the suite on versions 2.6 and higher.
445
470
  def test_user
446
471
  Mongo::Auth::User.new(
447
- database: test_db,
448
- user: 'test-user',
472
+ database: 'admin',
473
+ user: 'ruby-test-user',
449
474
  password: 'password',
450
475
  roles: [
451
476
  { role: Mongo::Auth::Roles::READ_WRITE, db: test_db },
@@ -459,10 +484,23 @@ EOT
459
484
  { role: Mongo::Auth::Roles::READ_WRITE, db: 'reporting' },
460
485
  { role: Mongo::Auth::Roles::DATABASE_ADMIN, db: 'reporting' },
461
486
 
462
- # For transaction api spec tests
463
- #{ role: Mongo::Auth::Roles::READ_WRITE, db: 'withTransaction-tests' },
464
- #{ role: Mongo::Auth::Roles::DATABASE_ADMIN, db: 'withTransaction-tests' },
465
-
487
+ # For spec tests
488
+ { role: Mongo::Auth::Roles::READ_WRITE, db: 'crud-tests' },
489
+ { role: Mongo::Auth::Roles::DATABASE_ADMIN, db: 'crud-tests' },
490
+ { role: Mongo::Auth::Roles::READ_WRITE, db: 'crud-default' },
491
+ { role: Mongo::Auth::Roles::DATABASE_ADMIN, db: 'crud-default' },
492
+ { role: Mongo::Auth::Roles::READ_WRITE, db: 'default_write_concern_db' },
493
+ { role: Mongo::Auth::Roles::DATABASE_ADMIN, db: 'default_write_concern_db' },
494
+ { role: Mongo::Auth::Roles::READ_WRITE, db: 'retryable-reads-tests' },
495
+ { role: Mongo::Auth::Roles::DATABASE_ADMIN, db: 'retryable-reads-tests' },
496
+ { role: Mongo::Auth::Roles::READ_WRITE, db: 'sdam-tests' },
497
+ { role: Mongo::Auth::Roles::DATABASE_ADMIN, db: 'sdam-tests' },
498
+ { role: Mongo::Auth::Roles::READ_WRITE, db: 'transaction-tests' },
499
+ { role: Mongo::Auth::Roles::DATABASE_ADMIN, db: 'transaction-tests' },
500
+ { role: Mongo::Auth::Roles::READ_WRITE, db: 'withTransaction-tests' },
501
+ { role: Mongo::Auth::Roles::DATABASE_ADMIN, db: 'withTransaction-tests' },
502
+ { role: Mongo::Auth::Roles::READ_WRITE, db: 'admin' },
503
+ { role: Mongo::Auth::Roles::DATABASE_ADMIN, db: 'admin' },
466
504
  ]
467
505
  )
468
506
  end
@@ -471,11 +509,28 @@ EOT
471
509
  uri_options[:auth_mech] == :mongodb_x509
472
510
  end
473
511
 
474
- # When we use x.509 authentication, omit all of the users we normally create
475
- # and authenticate with x.509.
476
- def credentials_or_x509(creds)
477
- if x509_auth?
478
- {auth_mech: :mongodb_x509}
512
+ # When we authenticate with a username & password mechanism (scram, cr)
513
+ # we create a variety of users in the test suite for different purposes.
514
+ # When we authenticate with passwordless mechanisms (x509, aws) we use
515
+ # the globally specified user for all operations.
516
+ def external_user?
517
+ case uri_options[:auth_mech]
518
+ when :mongodb_x509, :aws
519
+ true
520
+ when nil, :scram, :scram256
521
+ false
522
+ else
523
+ raise "Unknown auth mechanism value: #{uri_options[:auth_mech]}"
524
+ end
525
+ end
526
+
527
+ # When we use external authentication, omit all of the users we normally
528
+ # create and authenticate with the external mechanism. This also ensures
529
+ # our various helpers work correctly when the only users available are
530
+ # the external ones.
531
+ def credentials_or_external_user(creds)
532
+ if external_user?
533
+ auth_options
479
534
  else
480
535
  creds
481
536
  end