mongo 2.13.2 → 2.15.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 (1150) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +1 -2
  3. data.tar.gz.sig +0 -0
  4. data/README.md +5 -2
  5. data/Rakefile +46 -18
  6. data/lib/mongo.rb +35 -0
  7. data/lib/mongo/active_support.rb +3 -0
  8. data/lib/mongo/address.rb +3 -0
  9. data/lib/mongo/address/ipv4.rb +4 -1
  10. data/lib/mongo/address/ipv6.rb +4 -1
  11. data/lib/mongo/address/unix.rb +3 -0
  12. data/lib/mongo/address/validator.rb +3 -0
  13. data/lib/mongo/auth.rb +4 -1
  14. data/lib/mongo/auth/aws.rb +3 -0
  15. data/lib/mongo/auth/aws/conversation.rb +4 -4
  16. data/lib/mongo/auth/aws/credentials_retriever.rb +3 -0
  17. data/lib/mongo/auth/aws/request.rb +3 -0
  18. data/lib/mongo/auth/base.rb +17 -8
  19. data/lib/mongo/auth/conversation_base.rb +35 -0
  20. data/lib/mongo/auth/cr.rb +3 -0
  21. data/lib/mongo/auth/cr/conversation.rb +9 -29
  22. data/lib/mongo/auth/credential_cache.rb +3 -0
  23. data/lib/mongo/auth/gssapi.rb +3 -0
  24. data/lib/mongo/auth/gssapi/conversation.rb +7 -15
  25. data/lib/mongo/auth/ldap.rb +3 -0
  26. data/lib/mongo/auth/ldap/conversation.rb +6 -14
  27. data/lib/mongo/auth/roles.rb +3 -0
  28. data/lib/mongo/auth/sasl_conversation_base.rb +4 -13
  29. data/lib/mongo/auth/scram.rb +5 -2
  30. data/lib/mongo/auth/scram/conversation.rb +3 -0
  31. data/lib/mongo/auth/scram256.rb +3 -0
  32. data/lib/mongo/auth/scram256/conversation.rb +3 -0
  33. data/lib/mongo/auth/scram_conversation_base.rb +10 -34
  34. data/lib/mongo/auth/stringprep.rb +4 -1
  35. data/lib/mongo/auth/stringprep/profiles/sasl.rb +3 -0
  36. data/lib/mongo/auth/stringprep/tables.rb +3 -0
  37. data/lib/mongo/auth/stringprep/unicode_normalize/normalize.rb +2 -2
  38. data/lib/mongo/auth/stringprep/unicode_normalize/tables.rb +1 -1
  39. data/lib/mongo/auth/user.rb +3 -0
  40. data/lib/mongo/auth/user/view.rb +19 -9
  41. data/lib/mongo/auth/x509.rb +3 -0
  42. data/lib/mongo/auth/x509/conversation.rb +7 -25
  43. data/lib/mongo/background_thread.rb +16 -2
  44. data/lib/mongo/bson.rb +3 -0
  45. data/lib/mongo/bulk_write.rb +41 -18
  46. data/lib/mongo/bulk_write/combineable.rb +3 -0
  47. data/lib/mongo/bulk_write/ordered_combiner.rb +3 -0
  48. data/lib/mongo/bulk_write/result.rb +3 -0
  49. data/lib/mongo/bulk_write/result_combiner.rb +3 -0
  50. data/lib/mongo/bulk_write/transformable.rb +3 -0
  51. data/lib/mongo/bulk_write/unordered_combiner.rb +3 -0
  52. data/lib/mongo/bulk_write/validatable.rb +3 -0
  53. data/lib/mongo/caching_cursor.rb +77 -0
  54. data/lib/mongo/client.rb +133 -15
  55. data/lib/mongo/client_encryption.rb +3 -0
  56. data/lib/mongo/cluster.rb +32 -38
  57. data/lib/mongo/cluster/periodic_executor.rb +3 -0
  58. data/lib/mongo/cluster/reapers/cursor_reaper.rb +9 -2
  59. data/lib/mongo/cluster/reapers/socket_reaper.rb +3 -0
  60. data/lib/mongo/cluster/sdam_flow.rb +17 -0
  61. data/lib/mongo/cluster/topology.rb +3 -0
  62. data/lib/mongo/cluster/topology/base.rb +3 -0
  63. data/lib/mongo/cluster/topology/no_replica_set_options.rb +3 -0
  64. data/lib/mongo/cluster/topology/replica_set_no_primary.rb +3 -0
  65. data/lib/mongo/cluster/topology/replica_set_with_primary.rb +3 -0
  66. data/lib/mongo/cluster/topology/sharded.rb +3 -0
  67. data/lib/mongo/cluster/topology/single.rb +4 -1
  68. data/lib/mongo/cluster/topology/unknown.rb +3 -0
  69. data/lib/mongo/cluster_time.rb +3 -0
  70. data/lib/mongo/collection.rb +74 -17
  71. data/lib/mongo/collection/view.rb +27 -20
  72. data/lib/mongo/collection/view/aggregation.rb +29 -5
  73. data/lib/mongo/collection/view/builder.rb +3 -0
  74. data/lib/mongo/collection/view/builder/aggregation.rb +3 -0
  75. data/lib/mongo/collection/view/builder/find_command.rb +41 -18
  76. data/lib/mongo/collection/view/builder/flags.rb +3 -0
  77. data/lib/mongo/collection/view/builder/map_reduce.rb +3 -0
  78. data/lib/mongo/collection/view/builder/modifiers.rb +3 -0
  79. data/lib/mongo/collection/view/builder/op_query.rb +3 -0
  80. data/lib/mongo/collection/view/change_stream.rb +5 -2
  81. data/lib/mongo/collection/view/change_stream/retryable.rb +3 -0
  82. data/lib/mongo/collection/view/explainable.rb +30 -8
  83. data/lib/mongo/collection/view/immutable.rb +3 -0
  84. data/lib/mongo/collection/view/iterable.rb +76 -13
  85. data/lib/mongo/collection/view/map_reduce.rb +5 -2
  86. data/lib/mongo/collection/view/readable.rb +68 -23
  87. data/lib/mongo/collection/view/writable.rb +32 -15
  88. data/lib/mongo/crypt.rb +3 -0
  89. data/lib/mongo/crypt/auto_decryption_context.rb +3 -0
  90. data/lib/mongo/crypt/auto_encrypter.rb +4 -1
  91. data/lib/mongo/crypt/auto_encryption_context.rb +3 -0
  92. data/lib/mongo/crypt/binary.rb +3 -0
  93. data/lib/mongo/crypt/binding.rb +4 -1
  94. data/lib/mongo/crypt/context.rb +3 -0
  95. data/lib/mongo/crypt/data_key_context.rb +3 -0
  96. data/lib/mongo/crypt/encryption_io.rb +9 -6
  97. data/lib/mongo/crypt/explicit_decryption_context.rb +3 -0
  98. data/lib/mongo/crypt/explicit_encrypter.rb +3 -0
  99. data/lib/mongo/crypt/explicit_encryption_context.rb +3 -0
  100. data/lib/mongo/crypt/handle.rb +3 -0
  101. data/lib/mongo/crypt/hooks.rb +3 -0
  102. data/lib/mongo/crypt/kms_context.rb +3 -0
  103. data/lib/mongo/crypt/status.rb +3 -0
  104. data/lib/mongo/cursor.rb +22 -5
  105. data/lib/mongo/cursor/builder.rb +3 -0
  106. data/lib/mongo/cursor/builder/get_more_command.rb +3 -0
  107. data/lib/mongo/cursor/builder/kill_cursors_command.rb +3 -0
  108. data/lib/mongo/cursor/builder/op_get_more.rb +3 -0
  109. data/lib/mongo/cursor/builder/op_kill_cursors.rb +3 -0
  110. data/lib/mongo/database.rb +32 -6
  111. data/lib/mongo/database/view.rb +4 -1
  112. data/lib/mongo/dbref.rb +3 -0
  113. data/lib/mongo/distinguishing_semaphore.rb +3 -0
  114. data/lib/mongo/error.rb +14 -1
  115. data/lib/mongo/error/auth_error.rb +3 -0
  116. data/lib/mongo/error/bulk_write_error.rb +20 -3
  117. data/lib/mongo/error/change_stream_resumable.rb +3 -0
  118. data/lib/mongo/error/closed_stream.rb +3 -0
  119. data/lib/mongo/error/connection_check_out_timeout.rb +3 -0
  120. data/lib/mongo/error/connection_perished.rb +3 -0
  121. data/lib/mongo/error/credential_check_error.rb +3 -0
  122. data/lib/mongo/error/crypt_error.rb +3 -0
  123. data/lib/mongo/error/extra_file_chunk.rb +3 -0
  124. data/lib/mongo/error/failed_string_prep_validation.rb +3 -0
  125. data/lib/mongo/error/file_not_found.rb +3 -0
  126. data/lib/mongo/error/handshake_error.rb +3 -0
  127. data/lib/mongo/error/insufficient_iteration_count.rb +3 -0
  128. data/lib/mongo/error/internal_driver_error.rb +25 -0
  129. data/lib/mongo/error/invalid_address.rb +3 -0
  130. data/lib/mongo/error/invalid_application_name.rb +3 -0
  131. data/lib/mongo/error/invalid_bulk_operation.rb +3 -0
  132. data/lib/mongo/error/invalid_bulk_operation_type.rb +3 -0
  133. data/lib/mongo/error/invalid_collection_name.rb +3 -0
  134. data/lib/mongo/error/invalid_cursor_operation.rb +3 -0
  135. data/lib/mongo/error/invalid_database_name.rb +3 -0
  136. data/lib/mongo/error/invalid_document.rb +3 -0
  137. data/lib/mongo/error/invalid_file.rb +3 -0
  138. data/lib/mongo/error/invalid_file_revision.rb +3 -0
  139. data/lib/mongo/error/invalid_min_pool_size.rb +3 -0
  140. data/lib/mongo/error/invalid_nonce.rb +3 -0
  141. data/lib/mongo/error/invalid_read_concern.rb +31 -0
  142. data/lib/mongo/error/invalid_read_option.rb +3 -0
  143. data/lib/mongo/error/invalid_replacement_document.rb +3 -0
  144. data/lib/mongo/error/invalid_server_auth_host.rb +3 -0
  145. data/lib/mongo/error/invalid_server_auth_response.rb +3 -0
  146. data/lib/mongo/error/invalid_server_preference.rb +3 -0
  147. data/lib/mongo/error/invalid_session.rb +3 -0
  148. data/lib/mongo/error/invalid_signature.rb +3 -0
  149. data/lib/mongo/error/invalid_transaction_operation.rb +3 -0
  150. data/lib/mongo/error/invalid_txt_record.rb +3 -0
  151. data/lib/mongo/error/invalid_update_document.rb +3 -0
  152. data/lib/mongo/error/invalid_uri.rb +3 -0
  153. data/lib/mongo/error/invalid_write_concern.rb +3 -0
  154. data/lib/mongo/error/kms_error.rb +3 -0
  155. data/lib/mongo/error/lint_error.rb +3 -0
  156. data/lib/mongo/error/max_bson_size.rb +3 -0
  157. data/lib/mongo/error/max_message_size.rb +3 -0
  158. data/lib/mongo/error/mismatched_domain.rb +3 -0
  159. data/lib/mongo/error/missing_file_chunk.rb +3 -0
  160. data/lib/mongo/error/missing_password.rb +3 -0
  161. data/lib/mongo/error/missing_resume_token.rb +3 -0
  162. data/lib/mongo/error/missing_scram_server_signature.rb +3 -0
  163. data/lib/mongo/error/mongocryptd_spawn_error.rb +3 -0
  164. data/lib/mongo/error/multi_index_drop.rb +3 -0
  165. data/lib/mongo/error/need_primary_server.rb +3 -0
  166. data/lib/mongo/error/no_server_available.rb +3 -0
  167. data/lib/mongo/error/no_srv_records.rb +3 -0
  168. data/lib/mongo/error/notable.rb +3 -0
  169. data/lib/mongo/error/operation_failure.rb +26 -4
  170. data/lib/mongo/error/parser.rb +69 -13
  171. data/lib/mongo/error/pool_closed_error.rb +3 -0
  172. data/lib/mongo/error/raise_original_error.rb +3 -0
  173. data/lib/mongo/error/sdam_error_detection.rb +16 -5
  174. data/lib/mongo/error/server_api_conflict.rb +26 -0
  175. data/lib/mongo/error/server_api_not_supported.rb +27 -0
  176. data/lib/mongo/error/server_certificate_revoked.rb +25 -0
  177. data/lib/mongo/error/session_ended.rb +3 -0
  178. data/lib/mongo/error/sessions_not_supported.rb +3 -0
  179. data/lib/mongo/error/socket_error.rb +3 -0
  180. data/lib/mongo/error/socket_timeout_error.rb +3 -0
  181. data/lib/mongo/error/unchangeable_collection_option.rb +3 -0
  182. data/lib/mongo/error/unexpected_chunk_length.rb +3 -0
  183. data/lib/mongo/error/unexpected_response.rb +3 -0
  184. data/lib/mongo/error/unknown_payload_type.rb +3 -0
  185. data/lib/mongo/error/unmet_dependency.rb +24 -0
  186. data/lib/mongo/error/unsupported_array_filters.rb +3 -0
  187. data/lib/mongo/error/unsupported_collation.rb +3 -0
  188. data/lib/mongo/error/unsupported_features.rb +3 -0
  189. data/lib/mongo/error/unsupported_message_type.rb +3 -0
  190. data/lib/mongo/error/unsupported_option.rb +17 -12
  191. data/lib/mongo/error/write_retryable.rb +3 -0
  192. data/lib/mongo/event.rb +3 -0
  193. data/lib/mongo/event/base.rb +3 -0
  194. data/lib/mongo/event/listeners.rb +3 -0
  195. data/lib/mongo/event/publisher.rb +3 -0
  196. data/lib/mongo/event/subscriber.rb +3 -0
  197. data/lib/mongo/grid.rb +3 -0
  198. data/lib/mongo/grid/file.rb +3 -0
  199. data/lib/mongo/grid/file/chunk.rb +4 -1
  200. data/lib/mongo/grid/file/info.rb +3 -0
  201. data/lib/mongo/grid/fs_bucket.rb +65 -44
  202. data/lib/mongo/grid/stream.rb +3 -0
  203. data/lib/mongo/grid/stream/read.rb +22 -7
  204. data/lib/mongo/grid/stream/write.rb +3 -0
  205. data/lib/mongo/id.rb +3 -0
  206. data/lib/mongo/index.rb +3 -0
  207. data/lib/mongo/index/view.rb +24 -11
  208. data/lib/mongo/lint.rb +5 -1
  209. data/lib/mongo/loggable.rb +3 -0
  210. data/lib/mongo/logger.rb +6 -3
  211. data/lib/mongo/monitoring.rb +20 -8
  212. data/lib/mongo/monitoring/cmap_log_subscriber.rb +3 -0
  213. data/lib/mongo/monitoring/command_log_subscriber.rb +3 -0
  214. data/lib/mongo/monitoring/event.rb +3 -0
  215. data/lib/mongo/monitoring/event/cmap.rb +3 -0
  216. data/lib/mongo/monitoring/event/cmap/base.rb +3 -0
  217. data/lib/mongo/monitoring/event/cmap/connection_check_out_failed.rb +3 -0
  218. data/lib/mongo/monitoring/event/cmap/connection_check_out_started.rb +3 -0
  219. data/lib/mongo/monitoring/event/cmap/connection_checked_in.rb +3 -0
  220. data/lib/mongo/monitoring/event/cmap/connection_checked_out.rb +3 -0
  221. data/lib/mongo/monitoring/event/cmap/connection_closed.rb +3 -0
  222. data/lib/mongo/monitoring/event/cmap/connection_created.rb +3 -0
  223. data/lib/mongo/monitoring/event/cmap/connection_ready.rb +3 -0
  224. data/lib/mongo/monitoring/event/cmap/pool_cleared.rb +3 -0
  225. data/lib/mongo/monitoring/event/cmap/pool_closed.rb +3 -0
  226. data/lib/mongo/monitoring/event/cmap/pool_created.rb +3 -0
  227. data/lib/mongo/monitoring/event/command_failed.rb +32 -5
  228. data/lib/mongo/monitoring/event/command_started.rb +20 -2
  229. data/lib/mongo/monitoring/event/command_succeeded.rb +29 -3
  230. data/lib/mongo/monitoring/event/secure.rb +39 -5
  231. data/lib/mongo/monitoring/event/server_closed.rb +3 -0
  232. data/lib/mongo/monitoring/event/server_description_changed.rb +4 -1
  233. data/lib/mongo/monitoring/event/server_heartbeat_failed.rb +32 -18
  234. data/lib/mongo/monitoring/event/server_heartbeat_started.rb +3 -0
  235. data/lib/mongo/monitoring/event/server_heartbeat_succeeded.rb +30 -16
  236. data/lib/mongo/monitoring/event/server_opening.rb +3 -0
  237. data/lib/mongo/monitoring/event/topology_changed.rb +3 -0
  238. data/lib/mongo/monitoring/event/topology_closed.rb +3 -0
  239. data/lib/mongo/monitoring/event/topology_opening.rb +3 -0
  240. data/lib/mongo/monitoring/publishable.rb +32 -10
  241. data/lib/mongo/monitoring/sdam_log_subscriber.rb +3 -0
  242. data/lib/mongo/monitoring/server_closed_log_subscriber.rb +3 -0
  243. data/lib/mongo/monitoring/server_description_changed_log_subscriber.rb +3 -0
  244. data/lib/mongo/monitoring/server_opening_log_subscriber.rb +3 -0
  245. data/lib/mongo/monitoring/topology_changed_log_subscriber.rb +3 -0
  246. data/lib/mongo/monitoring/topology_closed_log_subscriber.rb +3 -0
  247. data/lib/mongo/monitoring/topology_opening_log_subscriber.rb +3 -0
  248. data/lib/mongo/monitoring/unified_sdam_log_subscriber.rb +3 -0
  249. data/lib/mongo/operation.rb +7 -2
  250. data/lib/mongo/operation/aggregate.rb +3 -0
  251. data/lib/mongo/operation/aggregate/command.rb +3 -0
  252. data/lib/mongo/operation/aggregate/op_msg.rb +3 -0
  253. data/lib/mongo/operation/aggregate/result.rb +12 -8
  254. data/lib/mongo/operation/collections_info.rb +21 -1
  255. data/lib/mongo/operation/collections_info/command.rb +5 -2
  256. data/lib/mongo/operation/collections_info/result.rb +5 -0
  257. data/lib/mongo/operation/command.rb +3 -0
  258. data/lib/mongo/operation/command/command.rb +3 -0
  259. data/lib/mongo/operation/command/op_msg.rb +3 -0
  260. data/lib/mongo/operation/context.rb +102 -0
  261. data/lib/mongo/operation/count.rb +3 -0
  262. data/lib/mongo/operation/count/command.rb +3 -0
  263. data/lib/mongo/operation/count/op_msg.rb +3 -0
  264. data/lib/mongo/operation/create.rb +3 -0
  265. data/lib/mongo/operation/create/command.rb +3 -0
  266. data/lib/mongo/operation/create/op_msg.rb +3 -0
  267. data/lib/mongo/operation/create_index.rb +3 -0
  268. data/lib/mongo/operation/create_index/command.rb +3 -0
  269. data/lib/mongo/operation/create_index/op_msg.rb +3 -0
  270. data/lib/mongo/operation/create_user.rb +3 -0
  271. data/lib/mongo/operation/create_user/command.rb +3 -0
  272. data/lib/mongo/operation/create_user/op_msg.rb +3 -0
  273. data/lib/mongo/operation/delete.rb +3 -0
  274. data/lib/mongo/operation/delete/bulk_result.rb +5 -0
  275. data/lib/mongo/operation/delete/command.rb +3 -0
  276. data/lib/mongo/operation/delete/legacy.rb +3 -0
  277. data/lib/mongo/operation/delete/op_msg.rb +3 -0
  278. data/lib/mongo/operation/delete/result.rb +6 -0
  279. data/lib/mongo/operation/distinct.rb +3 -0
  280. data/lib/mongo/operation/distinct/command.rb +3 -0
  281. data/lib/mongo/operation/distinct/op_msg.rb +3 -0
  282. data/lib/mongo/operation/drop.rb +3 -0
  283. data/lib/mongo/operation/drop/command.rb +3 -0
  284. data/lib/mongo/operation/drop/op_msg.rb +3 -0
  285. data/lib/mongo/operation/drop_database.rb +3 -0
  286. data/lib/mongo/operation/drop_database/command.rb +3 -0
  287. data/lib/mongo/operation/drop_database/op_msg.rb +3 -0
  288. data/lib/mongo/operation/drop_index.rb +3 -0
  289. data/lib/mongo/operation/drop_index/command.rb +3 -0
  290. data/lib/mongo/operation/drop_index/op_msg.rb +3 -0
  291. data/lib/mongo/operation/explain.rb +3 -0
  292. data/lib/mongo/operation/explain/command.rb +7 -0
  293. data/lib/mongo/operation/explain/legacy.rb +7 -0
  294. data/lib/mongo/operation/explain/op_msg.rb +9 -0
  295. data/lib/mongo/operation/explain/result.rb +6 -0
  296. data/lib/mongo/operation/find.rb +3 -0
  297. data/lib/mongo/operation/find/command.rb +3 -0
  298. data/lib/mongo/operation/find/legacy.rb +3 -0
  299. data/lib/mongo/operation/find/legacy/result.rb +5 -0
  300. data/lib/mongo/operation/find/op_msg.rb +3 -0
  301. data/lib/mongo/operation/find/result.rb +16 -0
  302. data/lib/mongo/operation/get_more.rb +3 -0
  303. data/lib/mongo/operation/get_more/command.rb +3 -0
  304. data/lib/mongo/operation/get_more/legacy.rb +3 -0
  305. data/lib/mongo/operation/get_more/op_msg.rb +3 -0
  306. data/lib/mongo/operation/get_more/result.rb +6 -0
  307. data/lib/mongo/operation/indexes.rb +18 -1
  308. data/lib/mongo/operation/indexes/command.rb +3 -0
  309. data/lib/mongo/operation/indexes/legacy.rb +3 -0
  310. data/lib/mongo/operation/indexes/op_msg.rb +3 -0
  311. data/lib/mongo/operation/indexes/result.rb +8 -0
  312. data/lib/mongo/operation/insert.rb +3 -0
  313. data/lib/mongo/operation/insert/bulk_result.rb +8 -0
  314. data/lib/mongo/operation/insert/command.rb +5 -2
  315. data/lib/mongo/operation/insert/legacy.rb +5 -2
  316. data/lib/mongo/operation/insert/op_msg.rb +5 -2
  317. data/lib/mongo/operation/insert/result.rb +8 -0
  318. data/lib/mongo/operation/kill_cursors.rb +3 -0
  319. data/lib/mongo/operation/kill_cursors/command.rb +3 -0
  320. data/lib/mongo/operation/kill_cursors/legacy.rb +3 -0
  321. data/lib/mongo/operation/kill_cursors/op_msg.rb +3 -0
  322. data/lib/mongo/operation/list_collections.rb +3 -0
  323. data/lib/mongo/operation/list_collections/command.rb +3 -0
  324. data/lib/mongo/operation/list_collections/op_msg.rb +3 -0
  325. data/lib/mongo/operation/list_collections/result.rb +12 -1
  326. data/lib/mongo/operation/map_reduce.rb +3 -0
  327. data/lib/mongo/operation/map_reduce/command.rb +3 -0
  328. data/lib/mongo/operation/map_reduce/op_msg.rb +3 -0
  329. data/lib/mongo/operation/map_reduce/result.rb +13 -0
  330. data/lib/mongo/operation/op_msg_base.rb +3 -0
  331. data/lib/mongo/operation/parallel_scan.rb +3 -0
  332. data/lib/mongo/operation/parallel_scan/command.rb +4 -2
  333. data/lib/mongo/operation/parallel_scan/op_msg.rb +3 -0
  334. data/lib/mongo/operation/parallel_scan/result.rb +7 -0
  335. data/lib/mongo/operation/remove_user.rb +3 -0
  336. data/lib/mongo/operation/remove_user/command.rb +3 -0
  337. data/lib/mongo/operation/remove_user/op_msg.rb +3 -0
  338. data/lib/mongo/operation/result.rb +40 -6
  339. data/lib/mongo/operation/shared/bypass_document_validation.rb +4 -0
  340. data/lib/mongo/operation/shared/causal_consistency_supported.rb +4 -0
  341. data/lib/mongo/operation/shared/executable.rb +25 -14
  342. data/lib/mongo/operation/shared/executable_no_validate.rb +5 -2
  343. data/lib/mongo/operation/shared/executable_transaction_label.rb +3 -0
  344. data/lib/mongo/operation/shared/idable.rb +5 -1
  345. data/lib/mongo/operation/shared/limited.rb +4 -0
  346. data/lib/mongo/operation/shared/object_id_generator.rb +4 -0
  347. data/lib/mongo/operation/shared/op_msg_or_command.rb +4 -7
  348. data/lib/mongo/operation/shared/op_msg_or_find_command.rb +4 -7
  349. data/lib/mongo/operation/shared/polymorphic_lookup.rb +3 -0
  350. data/lib/mongo/operation/shared/polymorphic_operation.rb +42 -0
  351. data/lib/mongo/operation/shared/polymorphic_result.rb +3 -0
  352. data/lib/mongo/operation/shared/read_preference_supported.rb +41 -36
  353. data/lib/mongo/operation/shared/response_handling.rb +26 -23
  354. data/lib/mongo/operation/shared/result/aggregatable.rb +4 -0
  355. data/lib/mongo/operation/shared/result/use_legacy_error_parser.rb +3 -0
  356. data/lib/mongo/operation/shared/sessions_supported.rb +20 -4
  357. data/lib/mongo/operation/shared/specifiable.rb +4 -0
  358. data/lib/mongo/operation/shared/write.rb +12 -18
  359. data/lib/mongo/operation/shared/write_concern_supported.rb +4 -0
  360. data/lib/mongo/operation/update.rb +3 -0
  361. data/lib/mongo/operation/update/bulk_result.rb +3 -0
  362. data/lib/mongo/operation/update/command.rb +3 -0
  363. data/lib/mongo/operation/update/legacy.rb +3 -0
  364. data/lib/mongo/operation/update/legacy/result.rb +10 -0
  365. data/lib/mongo/operation/update/op_msg.rb +3 -0
  366. data/lib/mongo/operation/update/result.rb +11 -0
  367. data/lib/mongo/operation/update_user.rb +3 -0
  368. data/lib/mongo/operation/update_user/command.rb +3 -0
  369. data/lib/mongo/operation/update_user/op_msg.rb +3 -0
  370. data/lib/mongo/operation/users_info.rb +3 -0
  371. data/lib/mongo/operation/users_info/command.rb +3 -0
  372. data/lib/mongo/operation/users_info/op_msg.rb +3 -0
  373. data/lib/mongo/operation/users_info/result.rb +6 -0
  374. data/lib/mongo/options.rb +3 -0
  375. data/lib/mongo/options/mapper.rb +3 -0
  376. data/lib/mongo/options/redacted.rb +3 -0
  377. data/lib/mongo/protocol.rb +3 -0
  378. data/lib/mongo/protocol/bit_vector.rb +3 -0
  379. data/lib/mongo/protocol/compressed.rb +54 -5
  380. data/lib/mongo/protocol/delete.rb +3 -0
  381. data/lib/mongo/protocol/get_more.rb +3 -0
  382. data/lib/mongo/protocol/insert.rb +3 -0
  383. data/lib/mongo/protocol/kill_cursors.rb +3 -0
  384. data/lib/mongo/protocol/message.rb +23 -2
  385. data/lib/mongo/protocol/msg.rb +39 -16
  386. data/lib/mongo/protocol/query.rb +18 -14
  387. data/lib/mongo/protocol/registry.rb +3 -0
  388. data/lib/mongo/protocol/reply.rb +3 -0
  389. data/lib/mongo/protocol/serializers.rb +3 -0
  390. data/lib/mongo/protocol/update.rb +3 -0
  391. data/lib/mongo/query_cache.rb +275 -0
  392. data/lib/mongo/retryable.rb +12 -2
  393. data/lib/mongo/semaphore.rb +3 -0
  394. data/lib/mongo/server.rb +29 -16
  395. data/lib/mongo/server/app_metadata.rb +89 -33
  396. data/lib/mongo/server/connection.rb +9 -1
  397. data/lib/mongo/server/connection_base.rb +35 -20
  398. data/lib/mongo/server/connection_common.rb +36 -3
  399. data/lib/mongo/server/connection_pool.rb +14 -6
  400. data/lib/mongo/server/connection_pool/populator.rb +3 -0
  401. data/lib/mongo/server/context.rb +3 -0
  402. data/lib/mongo/server/description.rb +35 -11
  403. data/lib/mongo/server/description/features.rb +13 -9
  404. data/lib/mongo/server/monitor.rb +27 -14
  405. data/lib/mongo/server/monitor/app_metadata.rb +4 -1
  406. data/lib/mongo/server/monitor/connection.rb +60 -50
  407. data/lib/mongo/server/pending_connection.rb +39 -22
  408. data/lib/mongo/server/push_monitor.rb +33 -18
  409. data/lib/mongo/server/push_monitor/connection.rb +3 -0
  410. data/lib/mongo/server/round_trip_time_averager.rb +6 -3
  411. data/lib/mongo/server_selector.rb +3 -0
  412. data/lib/mongo/server_selector/base.rb +11 -4
  413. data/lib/mongo/server_selector/nearest.rb +6 -4
  414. data/lib/mongo/server_selector/primary.rb +6 -4
  415. data/lib/mongo/server_selector/primary_preferred.rb +6 -4
  416. data/lib/mongo/server_selector/secondary.rb +6 -4
  417. data/lib/mongo/server_selector/secondary_preferred.rb +8 -11
  418. data/lib/mongo/session.rb +23 -12
  419. data/lib/mongo/session/server_session.rb +3 -0
  420. data/lib/mongo/session/session_pool.rb +7 -2
  421. data/lib/mongo/socket.rb +42 -10
  422. data/lib/mongo/socket/ocsp_cache.rb +100 -0
  423. data/lib/mongo/socket/ocsp_verifier.rb +376 -0
  424. data/lib/mongo/socket/ssl.rb +56 -24
  425. data/lib/mongo/socket/tcp.rb +3 -0
  426. data/lib/mongo/socket/unix.rb +3 -0
  427. data/lib/mongo/srv.rb +3 -0
  428. data/lib/mongo/srv/monitor.rb +10 -24
  429. data/lib/mongo/srv/resolver.rb +17 -10
  430. data/lib/mongo/srv/result.rb +3 -0
  431. data/lib/mongo/timeout.rb +5 -0
  432. data/lib/mongo/topology_version.rb +4 -1
  433. data/lib/mongo/uri.rb +24 -390
  434. data/lib/mongo/uri/options_mapper.rb +623 -0
  435. data/lib/mongo/uri/srv_protocol.rb +6 -2
  436. data/lib/mongo/utils.rb +57 -1
  437. data/lib/mongo/version.rb +4 -1
  438. data/lib/mongo/write_concern.rb +3 -0
  439. data/lib/mongo/write_concern/acknowledged.rb +3 -0
  440. data/lib/mongo/write_concern/base.rb +3 -0
  441. data/lib/mongo/write_concern/unacknowledged.rb +3 -0
  442. data/spec/NOTES.aws-auth.md +12 -7
  443. data/spec/README.md +87 -2
  444. data/spec/atlas/atlas_connectivity_spec.rb +3 -0
  445. data/spec/atlas/operations_spec.rb +3 -0
  446. data/spec/integration/auth_spec.rb +28 -15
  447. data/spec/integration/awaited_ismaster_spec.rb +8 -5
  448. data/spec/integration/aws_auth_request_spec.rb +3 -0
  449. data/spec/integration/aws_credentials_retriever_spec.rb +3 -0
  450. data/spec/integration/bson_symbol_spec.rb +4 -1
  451. data/spec/integration/bulk_insert_spec.rb +3 -0
  452. data/spec/integration/bulk_write_error_message_spec.rb +41 -0
  453. data/spec/integration/bulk_write_spec.rb +51 -0
  454. data/spec/integration/change_stream_examples_spec.rb +3 -0
  455. data/spec/integration/change_stream_spec.rb +8 -5
  456. data/spec/integration/check_clean_slate_spec.rb +3 -0
  457. data/spec/integration/client_authentication_options_spec.rb +76 -36
  458. data/spec/integration/client_connectivity_spec.rb +4 -1
  459. data/spec/integration/client_construction_aws_auth_spec.rb +3 -0
  460. data/spec/integration/client_construction_spec.rb +3 -0
  461. data/spec/integration/client_side_encryption/auto_encryption_bulk_writes_spec.rb +3 -0
  462. data/spec/integration/client_side_encryption/auto_encryption_command_monitoring_spec.rb +3 -0
  463. data/spec/integration/client_side_encryption/auto_encryption_mongocryptd_spawn_spec.rb +3 -0
  464. data/spec/integration/client_side_encryption/auto_encryption_old_wire_version_spec.rb +3 -0
  465. data/spec/integration/client_side_encryption/auto_encryption_reconnect_spec.rb +3 -0
  466. data/spec/integration/client_side_encryption/auto_encryption_spec.rb +3 -0
  467. data/spec/integration/client_side_encryption/bson_size_limit_spec.rb +3 -0
  468. data/spec/integration/client_side_encryption/bypass_mongocryptd_spawn_spec.rb +4 -1
  469. data/spec/integration/client_side_encryption/client_close_spec.rb +3 -0
  470. data/spec/integration/client_side_encryption/corpus_spec.rb +3 -0
  471. data/spec/integration/client_side_encryption/custom_endpoint_spec.rb +3 -0
  472. data/spec/integration/client_side_encryption/data_key_spec.rb +3 -0
  473. data/spec/integration/client_side_encryption/explicit_encryption_spec.rb +3 -0
  474. data/spec/integration/client_side_encryption/external_key_vault_spec.rb +3 -0
  475. data/spec/integration/client_side_encryption/views_spec.rb +3 -0
  476. data/spec/integration/client_spec.rb +5 -2
  477. data/spec/integration/client_update_spec.rb +3 -0
  478. data/spec/integration/collection_indexes_prose_spec.rb +3 -0
  479. data/spec/integration/command_monitoring_spec.rb +63 -25
  480. data/spec/integration/command_spec.rb +3 -0
  481. data/spec/integration/connect_single_rs_name_spec.rb +6 -3
  482. data/spec/integration/connection_pool_populator_spec.rb +7 -2
  483. data/spec/integration/connection_spec.rb +12 -7
  484. data/spec/integration/crud_spec.rb +31 -0
  485. data/spec/integration/cursor_reaping_spec.rb +57 -18
  486. data/spec/integration/docs_examples_spec.rb +11 -1
  487. data/spec/integration/error_detection_spec.rb +3 -0
  488. data/spec/integration/fork_reconnect_spec.rb +64 -3
  489. data/spec/integration/get_more_spec.rb +3 -0
  490. data/spec/integration/grid_fs_bucket_spec.rb +4 -1
  491. data/spec/integration/heartbeat_events_spec.rb +7 -4
  492. data/spec/integration/mmapv1_spec.rb +3 -0
  493. data/spec/integration/mongos_pinning_spec.rb +3 -0
  494. data/spec/integration/ocsp_connectivity_spec.rb +29 -0
  495. data/spec/integration/ocsp_verifier_cache_spec.rb +191 -0
  496. data/spec/integration/ocsp_verifier_spec.rb +355 -0
  497. data/spec/integration/operation_failure_code_spec.rb +4 -1
  498. data/spec/integration/operation_failure_message_spec.rb +90 -0
  499. data/spec/integration/query_cache_spec.rb +1048 -0
  500. data/spec/integration/query_cache_transactions_spec.rb +193 -0
  501. data/spec/integration/read_concern_spec.rb +3 -0
  502. data/spec/integration/read_preference_spec.rb +3 -0
  503. data/spec/integration/reconnect_spec.rb +4 -1
  504. data/spec/integration/retryable_errors_spec.rb +3 -0
  505. data/spec/integration/retryable_writes/retryable_writes_36_and_older_spec.rb +3 -0
  506. data/spec/integration/retryable_writes/retryable_writes_40_and_newer_spec.rb +4 -0
  507. data/spec/integration/retryable_writes/shared/adds_diagnostics.rb +3 -0
  508. data/spec/integration/retryable_writes/shared/does_not_support_retries.rb +3 -0
  509. data/spec/integration/retryable_writes/shared/only_supports_legacy_retries.rb +3 -0
  510. data/spec/integration/retryable_writes/shared/performs_legacy_retries.rb +5 -0
  511. data/spec/integration/retryable_writes/shared/performs_modern_retries.rb +3 -0
  512. data/spec/integration/retryable_writes/shared/performs_no_retries.rb +3 -0
  513. data/spec/integration/retryable_writes/shared/supports_legacy_retries.rb +3 -0
  514. data/spec/integration/retryable_writes/shared/supports_modern_retries.rb +3 -0
  515. data/spec/integration/retryable_writes/shared/supports_retries.rb +3 -0
  516. data/spec/integration/retryable_writes_errors_spec.rb +3 -0
  517. data/spec/integration/sdam_error_handling_spec.rb +74 -3
  518. data/spec/integration/sdam_events_spec.rb +14 -10
  519. data/spec/integration/sdam_prose_spec.rb +4 -1
  520. data/spec/integration/secondary_reads_spec.rb +102 -0
  521. data/spec/integration/server_description_spec.rb +3 -0
  522. data/spec/integration/server_monitor_spec.rb +4 -1
  523. data/spec/integration/server_selection_spec.rb +39 -0
  524. data/spec/integration/server_selector_spec.rb +3 -0
  525. data/spec/integration/server_spec.rb +3 -0
  526. data/spec/integration/shell_examples_spec.rb +3 -0
  527. data/spec/integration/size_limit_spec.rb +3 -0
  528. data/spec/integration/snappy_compression_spec.rb +28 -0
  529. data/spec/integration/srv_monitoring_spec.rb +42 -4
  530. data/spec/integration/srv_spec.rb +59 -0
  531. data/spec/integration/ssl_uri_options_spec.rb +3 -0
  532. data/spec/integration/step_down_spec.rb +3 -0
  533. data/spec/integration/time_zone_querying_spec.rb +3 -0
  534. data/spec/integration/transactions_api_examples_spec.rb +3 -0
  535. data/spec/integration/transactions_examples_spec.rb +26 -7
  536. data/spec/integration/truncated_utf8_spec.rb +26 -0
  537. data/spec/integration/versioned_api_examples_spec.rb +69 -0
  538. data/spec/integration/x509_auth_spec.rb +4 -1
  539. data/spec/integration/zlib_compression_spec.rb +4 -1
  540. data/spec/integration/zstd_compression_spec.rb +29 -0
  541. data/spec/kerberos/kerberos_spec.rb +3 -0
  542. data/spec/lite_spec_helper.rb +18 -4
  543. data/spec/mongo/address/ipv4_spec.rb +3 -0
  544. data/spec/mongo/address/ipv6_spec.rb +3 -0
  545. data/spec/mongo/address/unix_spec.rb +3 -0
  546. data/spec/mongo/address/validator_spec.rb +3 -0
  547. data/spec/mongo/address_spec.rb +19 -12
  548. data/spec/mongo/auth/aws/request_region_spec.rb +3 -0
  549. data/spec/mongo/auth/aws/request_spec.rb +3 -0
  550. data/spec/mongo/auth/cr_spec.rb +3 -0
  551. data/spec/mongo/auth/gssapi/conversation_spec.rb +3 -0
  552. data/spec/mongo/auth/invalid_mechanism_spec.rb +3 -0
  553. data/spec/mongo/auth/ldap/conversation_spec.rb +4 -1
  554. data/spec/mongo/auth/ldap_spec.rb +8 -1
  555. data/spec/mongo/auth/scram/conversation_spec.rb +3 -0
  556. data/spec/mongo/auth/scram256/conversation_spec.rb +3 -0
  557. data/spec/mongo/auth/scram_negotiation_spec.rb +4 -1
  558. data/spec/mongo/auth/scram_spec.rb +4 -1
  559. data/spec/mongo/auth/stringprep/profiles/sasl_spec.rb +3 -0
  560. data/spec/mongo/auth/stringprep_spec.rb +3 -0
  561. data/spec/mongo/auth/user/view_spec.rb +3 -0
  562. data/spec/mongo/auth/user_spec.rb +4 -1
  563. data/spec/mongo/auth/x509/conversation_spec.rb +6 -3
  564. data/spec/mongo/auth/x509_spec.rb +3 -0
  565. data/spec/mongo/auth_spec.rb +3 -0
  566. data/spec/mongo/bson_spec.rb +3 -0
  567. data/spec/mongo/bulk_write/ordered_combiner_spec.rb +3 -0
  568. data/spec/mongo/bulk_write/result_spec.rb +3 -0
  569. data/spec/mongo/bulk_write/unordered_combiner_spec.rb +3 -0
  570. data/spec/mongo/bulk_write_spec.rb +5 -2
  571. data/spec/mongo/caching_cursor_spec.rb +73 -0
  572. data/spec/mongo/client_construction_spec.rb +268 -36
  573. data/spec/mongo/client_encryption_spec.rb +3 -0
  574. data/spec/mongo/client_spec.rb +67 -0
  575. data/spec/mongo/cluster/cursor_reaper_spec.rb +3 -0
  576. data/spec/mongo/cluster/periodic_executor_spec.rb +3 -0
  577. data/spec/mongo/cluster/socket_reaper_spec.rb +3 -0
  578. data/spec/mongo/cluster/topology/replica_set_spec.rb +13 -10
  579. data/spec/mongo/cluster/topology/sharded_spec.rb +6 -3
  580. data/spec/mongo/cluster/topology/single_spec.rb +20 -8
  581. data/spec/mongo/cluster/topology/unknown_spec.rb +4 -1
  582. data/spec/mongo/cluster/topology_spec.rb +4 -1
  583. data/spec/mongo/cluster_spec.rb +10 -18
  584. data/spec/mongo/cluster_time_spec.rb +3 -0
  585. data/spec/mongo/collection/view/aggregation_spec.rb +3 -0
  586. data/spec/mongo/collection/view/builder/find_command_spec.rb +3 -0
  587. data/spec/mongo/collection/view/builder/flags_spec.rb +3 -0
  588. data/spec/mongo/collection/view/builder/modifiers_spec.rb +3 -0
  589. data/spec/mongo/collection/view/builder/op_query_spec.rb +3 -0
  590. data/spec/mongo/collection/view/change_stream_resume_spec.rb +8 -3
  591. data/spec/mongo/collection/view/change_stream_spec.rb +16 -0
  592. data/spec/mongo/collection/view/explainable_spec.rb +90 -4
  593. data/spec/mongo/collection/view/immutable_spec.rb +3 -0
  594. data/spec/mongo/collection/view/iterable_spec.rb +3 -0
  595. data/spec/mongo/collection/view/map_reduce_spec.rb +5 -0
  596. data/spec/mongo/collection/view/readable_spec.rb +69 -0
  597. data/spec/mongo/collection/view/writable_spec.rb +3 -0
  598. data/spec/mongo/collection/view_spec.rb +3 -0
  599. data/spec/mongo/collection_crud_spec.rb +4360 -0
  600. data/spec/mongo/collection_ddl_spec.rb +537 -0
  601. data/spec/mongo/collection_spec.rb +8 -4787
  602. data/spec/mongo/crypt/auto_decryption_context_spec.rb +4 -1
  603. data/spec/mongo/crypt/auto_encrypter_spec.rb +3 -0
  604. data/spec/mongo/crypt/auto_encryption_context_spec.rb +4 -1
  605. data/spec/mongo/crypt/binary_spec.rb +3 -5
  606. data/spec/mongo/crypt/binding/binary_spec.rb +3 -5
  607. data/spec/mongo/crypt/binding/context_spec.rb +4 -6
  608. data/spec/mongo/crypt/binding/helpers_spec.rb +3 -5
  609. data/spec/mongo/crypt/binding/mongocrypt_spec.rb +4 -6
  610. data/spec/mongo/crypt/binding/status_spec.rb +3 -5
  611. data/spec/mongo/crypt/binding/version_spec.rb +3 -5
  612. data/spec/mongo/crypt/binding_unloaded_spec.rb +3 -0
  613. data/spec/mongo/crypt/data_key_context_spec.rb +3 -0
  614. data/spec/mongo/crypt/encryption_io_spec.rb +3 -0
  615. data/spec/mongo/crypt/explicit_decryption_context_spec.rb +4 -1
  616. data/spec/mongo/crypt/explicit_encryption_context_spec.rb +4 -1
  617. data/spec/mongo/crypt/handle_spec.rb +3 -0
  618. data/spec/mongo/crypt/helpers/mongo_crypt_spec_helper.rb +3 -0
  619. data/spec/mongo/crypt/status_spec.rb +3 -5
  620. data/spec/mongo/cursor/builder/get_more_command_spec.rb +7 -2
  621. data/spec/mongo/cursor/builder/op_get_more_spec.rb +7 -2
  622. data/spec/mongo/cursor/builder/op_kill_cursors_spec.rb +7 -2
  623. data/spec/mongo/cursor_spec.rb +74 -7
  624. data/spec/mongo/database_spec.rb +119 -10
  625. data/spec/mongo/dbref_spec.rb +3 -0
  626. data/spec/mongo/distinguishing_semaphore_spec.rb +3 -0
  627. data/spec/mongo/error/bulk_write_error_spec.rb +6 -3
  628. data/spec/mongo/error/crypt_error_spec.rb +3 -0
  629. data/spec/mongo/error/max_bson_size_spec.rb +3 -0
  630. data/spec/mongo/error/no_server_available_spec.rb +4 -1
  631. data/spec/mongo/error/notable_spec.rb +3 -0
  632. data/spec/mongo/error/operation_failure_heavy_spec.rb +3 -0
  633. data/spec/mongo/error/operation_failure_spec.rb +94 -31
  634. data/spec/mongo/error/parser_spec.rb +40 -6
  635. data/spec/mongo/error/unsupported_option_spec.rb +3 -0
  636. data/spec/mongo/event/publisher_spec.rb +3 -0
  637. data/spec/mongo/event/subscriber_spec.rb +3 -0
  638. data/spec/mongo/grid/file/chunk_spec.rb +7 -4
  639. data/spec/mongo/grid/file/info_spec.rb +3 -0
  640. data/spec/mongo/grid/file_spec.rb +4 -1
  641. data/spec/mongo/grid/fs_bucket_spec.rb +22 -5
  642. data/spec/mongo/grid/stream/read_spec.rb +33 -10
  643. data/spec/mongo/grid/stream/write_spec.rb +3 -0
  644. data/spec/mongo/grid/stream_spec.rb +3 -0
  645. data/spec/mongo/id_spec.rb +3 -0
  646. data/spec/mongo/index/view_spec.rb +11 -2
  647. data/spec/mongo/lint_spec.rb +3 -0
  648. data/spec/mongo/logger_spec.rb +16 -11
  649. data/spec/mongo/monitoring/command_log_subscriber_spec.rb +3 -0
  650. data/spec/mongo/monitoring/event/cmap/connection_check_out_failed_spec.rb +3 -0
  651. data/spec/mongo/monitoring/event/cmap/connection_check_out_started_spec.rb +3 -0
  652. data/spec/mongo/monitoring/event/cmap/connection_checked_in_spec.rb +3 -0
  653. data/spec/mongo/monitoring/event/cmap/connection_checked_out_spec.rb +3 -0
  654. data/spec/mongo/monitoring/event/cmap/connection_closed_spec.rb +3 -0
  655. data/spec/mongo/monitoring/event/cmap/connection_created_spec.rb +3 -0
  656. data/spec/mongo/monitoring/event/cmap/connection_ready_spec.rb +3 -0
  657. data/spec/mongo/monitoring/event/cmap/pool_cleared_spec.rb +3 -0
  658. data/spec/mongo/monitoring/event/cmap/pool_closed_spec.rb +3 -0
  659. data/spec/mongo/monitoring/event/cmap/pool_created_spec.rb +3 -0
  660. data/spec/mongo/monitoring/event/command_failed_spec.rb +59 -2
  661. data/spec/mongo/monitoring/event/command_started_spec.rb +3 -0
  662. data/spec/mongo/monitoring/event/command_succeeded_spec.rb +46 -6
  663. data/spec/mongo/monitoring/event/secure_spec.rb +28 -4
  664. data/spec/mongo/monitoring/event/server_closed_spec.rb +4 -1
  665. data/spec/mongo/monitoring/event/server_description_changed_spec.rb +3 -0
  666. data/spec/mongo/monitoring/event/server_heartbeat_failed_spec.rb +4 -1
  667. data/spec/mongo/monitoring/event/server_heartbeat_started_spec.rb +3 -0
  668. data/spec/mongo/monitoring/event/server_heartbeat_succeeded_spec.rb +4 -1
  669. data/spec/mongo/monitoring/event/server_opening_spec.rb +4 -1
  670. data/spec/mongo/monitoring/event/topology_changed_spec.rb +4 -1
  671. data/spec/mongo/monitoring/event/topology_closed_spec.rb +4 -1
  672. data/spec/mongo/monitoring/event/topology_opening_spec.rb +4 -1
  673. data/spec/mongo/monitoring_spec.rb +3 -0
  674. data/spec/mongo/operation/aggregate/result_spec.rb +7 -2
  675. data/spec/mongo/operation/aggregate_spec.rb +5 -1
  676. data/spec/mongo/operation/collections_info_spec.rb +7 -1
  677. data/spec/mongo/operation/command_spec.rb +11 -5
  678. data/spec/mongo/operation/create_index_spec.rb +9 -3
  679. data/spec/mongo/operation/create_user_spec.rb +9 -3
  680. data/spec/mongo/operation/delete/bulk_spec.rb +12 -6
  681. data/spec/mongo/operation/delete/command_spec.rb +3 -0
  682. data/spec/mongo/operation/delete/op_msg_spec.rb +6 -3
  683. data/spec/mongo/operation/delete_spec.rb +14 -7
  684. data/spec/mongo/operation/drop_index_spec.rb +9 -2
  685. data/spec/mongo/operation/find/legacy_spec.rb +7 -2
  686. data/spec/mongo/operation/get_more_spec.rb +6 -1
  687. data/spec/mongo/operation/indexes_spec.rb +8 -1
  688. data/spec/mongo/operation/insert/bulk_spec.rb +13 -7
  689. data/spec/mongo/operation/insert/command_spec.rb +5 -2
  690. data/spec/mongo/operation/insert/op_msg_spec.rb +6 -3
  691. data/spec/mongo/operation/insert_spec.rb +18 -12
  692. data/spec/mongo/operation/kill_cursors_spec.rb +3 -0
  693. data/spec/mongo/operation/limited_spec.rb +3 -0
  694. data/spec/mongo/operation/map_reduce_spec.rb +8 -2
  695. data/spec/mongo/operation/read_preference_legacy_spec.rb +35 -42
  696. data/spec/mongo/operation/read_preference_op_msg_spec.rb +7 -4
  697. data/spec/mongo/operation/remove_user_spec.rb +9 -3
  698. data/spec/mongo/operation/result_spec.rb +10 -5
  699. data/spec/mongo/operation/specifiable_spec.rb +3 -0
  700. data/spec/mongo/operation/update/bulk_spec.rb +12 -6
  701. data/spec/mongo/operation/update/command_spec.rb +5 -2
  702. data/spec/mongo/operation/update/op_msg_spec.rb +6 -3
  703. data/spec/mongo/operation/update_spec.rb +13 -7
  704. data/spec/mongo/operation/update_user_spec.rb +7 -1
  705. data/spec/mongo/options/redacted_spec.rb +3 -0
  706. data/spec/mongo/protocol/compressed_spec.rb +29 -12
  707. data/spec/mongo/protocol/delete_spec.rb +3 -0
  708. data/spec/mongo/protocol/get_more_spec.rb +3 -0
  709. data/spec/mongo/protocol/insert_spec.rb +3 -0
  710. data/spec/mongo/protocol/kill_cursors_spec.rb +3 -0
  711. data/spec/mongo/protocol/msg_spec.rb +4 -1
  712. data/spec/mongo/protocol/query_spec.rb +6 -3
  713. data/spec/mongo/protocol/registry_spec.rb +3 -0
  714. data/spec/mongo/protocol/reply_spec.rb +3 -0
  715. data/spec/mongo/protocol/update_spec.rb +3 -0
  716. data/spec/mongo/query_cache_middleware_spec.rb +55 -0
  717. data/spec/mongo/query_cache_spec.rb +283 -0
  718. data/spec/mongo/retryable_spec.rb +6 -2
  719. data/spec/mongo/semaphore_spec.rb +3 -0
  720. data/spec/mongo/server/app_metadata_spec.rb +46 -21
  721. data/spec/mongo/server/connection_auth_spec.rb +6 -9
  722. data/spec/mongo/server/connection_common_spec.rb +24 -0
  723. data/spec/mongo/server/connection_pool/populator_spec.rb +6 -1
  724. data/spec/mongo/server/connection_pool_spec.rb +11 -4
  725. data/spec/mongo/server/connection_spec.rb +48 -25
  726. data/spec/mongo/server/description/features_spec.rb +3 -0
  727. data/spec/mongo/server/description_query_methods_spec.rb +4 -1
  728. data/spec/mongo/server/description_spec.rb +625 -594
  729. data/spec/mongo/server/monitor/app_metadata_spec.rb +3 -1
  730. data/spec/mongo/server/monitor/connection_spec.rb +57 -7
  731. data/spec/mongo/server/monitor_spec.rb +22 -11
  732. data/spec/mongo/server/round_trip_time_averager_spec.rb +3 -0
  733. data/spec/mongo/server_selector/nearest_spec.rb +8 -2
  734. data/spec/mongo/server_selector/primary_preferred_spec.rb +8 -2
  735. data/spec/mongo/server_selector/primary_spec.rb +8 -2
  736. data/spec/mongo/server_selector/secondary_preferred_spec.rb +14 -8
  737. data/spec/mongo/server_selector/secondary_spec.rb +8 -2
  738. data/spec/mongo/server_selector_spec.rb +7 -3
  739. data/spec/mongo/server_spec.rb +18 -2
  740. data/spec/mongo/session/server_session_spec.rb +3 -0
  741. data/spec/mongo/session/session_pool_spec.rb +3 -0
  742. data/spec/mongo/session_spec.rb +3 -0
  743. data/spec/mongo/session_transaction_spec.rb +7 -12
  744. data/spec/mongo/socket/ssl_spec.rb +47 -4
  745. data/spec/mongo/socket/tcp_spec.rb +3 -0
  746. data/spec/mongo/socket/unix_spec.rb +3 -0
  747. data/spec/mongo/socket_spec.rb +5 -2
  748. data/spec/mongo/srv/monitor_spec.rb +3 -0
  749. data/spec/mongo/srv/result_spec.rb +3 -0
  750. data/spec/mongo/timeout_spec.rb +3 -0
  751. data/spec/mongo/tls_context_hooks_spec.rb +40 -0
  752. data/spec/mongo/uri/srv_protocol_spec.rb +68 -33
  753. data/spec/mongo/uri_option_parsing_spec.rb +14 -11
  754. data/spec/mongo/uri_spec.rb +71 -41
  755. data/spec/mongo/utils_spec.rb +56 -0
  756. data/spec/mongo/write_concern/acknowledged_spec.rb +3 -0
  757. data/spec/mongo/write_concern/unacknowledged_spec.rb +3 -0
  758. data/spec/mongo/write_concern_spec.rb +3 -0
  759. data/spec/runners/auth.rb +25 -1
  760. data/spec/runners/change_streams/outcome.rb +3 -0
  761. data/spec/runners/change_streams/spec.rb +3 -0
  762. data/spec/runners/change_streams/test.rb +4 -1
  763. data/spec/runners/cmap.rb +3 -0
  764. data/spec/runners/cmap/verifier.rb +3 -0
  765. data/spec/runners/command_monitoring.rb +3 -0
  766. data/spec/runners/connection_string.rb +34 -124
  767. data/spec/runners/crud.rb +22 -0
  768. data/spec/runners/crud/context.rb +3 -0
  769. data/spec/runners/crud/operation.rb +3 -0
  770. data/spec/runners/crud/outcome.rb +3 -0
  771. data/spec/runners/crud/requirement.rb +67 -3
  772. data/spec/runners/crud/spec.rb +3 -0
  773. data/spec/runners/crud/test.rb +3 -0
  774. data/spec/runners/crud/test_base.rb +3 -19
  775. data/spec/runners/crud/verifier.rb +11 -0
  776. data/spec/runners/gridfs.rb +3 -0
  777. data/spec/runners/read_write_concern_document.rb +3 -0
  778. data/spec/runners/sdam.rb +6 -3
  779. data/spec/runners/sdam/verifier.rb +3 -0
  780. data/spec/runners/server_selection.rb +4 -1
  781. data/spec/runners/server_selection_rtt.rb +4 -1
  782. data/spec/runners/transactions.rb +3 -0
  783. data/spec/runners/transactions/operation.rb +16 -2
  784. data/spec/runners/transactions/spec.rb +3 -0
  785. data/spec/runners/transactions/test.rb +6 -2
  786. data/spec/runners/unified.rb +99 -0
  787. data/spec/runners/unified/assertions.rb +282 -0
  788. data/spec/runners/unified/change_stream_operations.rb +29 -0
  789. data/spec/runners/unified/crud_operations.rb +206 -0
  790. data/spec/runners/unified/ddl_operations.rb +106 -0
  791. data/spec/runners/unified/entity_map.rb +42 -0
  792. data/spec/runners/unified/error.rb +28 -0
  793. data/spec/runners/unified/event_subscriber.rb +104 -0
  794. data/spec/runners/unified/exceptions.rb +24 -0
  795. data/spec/runners/unified/grid_fs_operations.rb +58 -0
  796. data/spec/runners/unified/support_operations.rb +253 -0
  797. data/spec/runners/unified/test.rb +423 -0
  798. data/spec/runners/unified/test_group.rb +31 -0
  799. data/spec/runners/unified/using_hash.rb +34 -0
  800. data/spec/shared/bin/get-mongodb-download-url +17 -0
  801. data/spec/shared/bin/s3-copy +45 -0
  802. data/spec/shared/bin/s3-upload +69 -0
  803. data/spec/shared/lib/mrss/cluster_config.rb +226 -0
  804. data/spec/shared/lib/mrss/constraints.rb +82 -6
  805. data/spec/shared/lib/mrss/docker_runner.rb +271 -0
  806. data/spec/shared/lib/mrss/lite_constraints.rb +16 -0
  807. data/spec/shared/lib/mrss/server_version_registry.rb +115 -0
  808. data/spec/shared/lib/mrss/spec_organizer.rb +32 -2
  809. data/spec/shared/lib/mrss/utils.rb +15 -0
  810. data/spec/shared/share/Dockerfile.erb +322 -0
  811. data/spec/shared/share/haproxy-1.conf +16 -0
  812. data/spec/shared/share/haproxy-2.conf +17 -0
  813. data/spec/shared/shlib/distro.sh +73 -0
  814. data/spec/shared/shlib/server.sh +317 -0
  815. data/spec/shared/shlib/set_env.sh +131 -0
  816. data/spec/solo/clean_exit_spec.rb +24 -0
  817. data/spec/spec_helper.rb +11 -4
  818. data/spec/spec_tests/auth_spec.rb +30 -13
  819. data/spec/spec_tests/change_streams_spec.rb +3 -0
  820. data/spec/spec_tests/change_streams_unified_spec.rb +13 -0
  821. data/spec/spec_tests/client_side_encryption_spec.rb +3 -0
  822. data/spec/spec_tests/cmap_spec.rb +10 -3
  823. data/spec/spec_tests/collection_management_spec.rb +13 -0
  824. data/spec/spec_tests/command_monitoring_spec.rb +31 -26
  825. data/spec/spec_tests/command_monitoring_unified_spec.rb +13 -0
  826. data/spec/spec_tests/connection_string_spec.rb +3 -0
  827. data/spec/spec_tests/crud_spec.rb +3 -0
  828. data/spec/spec_tests/crud_unified_spec.rb +13 -0
  829. data/spec/spec_tests/data/change_streams/change-streams-errors.yml +5 -6
  830. data/spec/spec_tests/data/change_streams/{change-streams-resume-whitelist.yml → change-streams-resume-allowlist.yml} +58 -58
  831. data/spec/spec_tests/data/change_streams/change-streams-resume-errorLabels.yml +46 -46
  832. data/spec/spec_tests/data/change_streams/change-streams.yml +0 -2
  833. data/spec/spec_tests/data/change_streams_unified/change-streams.yml +72 -0
  834. data/spec/spec_tests/data/cmap/pool-checkout-connection.yml +6 -2
  835. data/spec/spec_tests/data/cmap/pool-create-min-size.yml +3 -0
  836. data/spec/spec_tests/data/collection_management/timeseries-collection.yml +129 -0
  837. data/spec/spec_tests/data/command_monitoring_unified/redacted-commands.yml +340 -0
  838. data/spec/spec_tests/data/connection_string/valid-warnings.yml +24 -0
  839. data/spec/spec_tests/data/crud/write/bulkWrite.yml +26 -22
  840. data/spec/spec_tests/data/crud/write/insertMany.yml +26 -22
  841. data/spec/spec_tests/data/crud_unified/estimatedDocumentCount.yml +267 -0
  842. data/spec/spec_tests/data/crud_unified/updateWithPipelines.yml +305 -0
  843. data/spec/spec_tests/data/crud_v2/aggregate-out-readConcern.yml +1 -0
  844. data/spec/spec_tests/data/crud_v2/db-aggregate.yml +1 -0
  845. data/spec/spec_tests/data/retryable_reads/aggregate-serverErrors.yml +1 -1
  846. data/spec/spec_tests/data/retryable_reads/changeStreams-client.watch-serverErrors.yml +6 -5
  847. data/spec/spec_tests/data/retryable_reads/changeStreams-client.watch.yml +1 -0
  848. data/spec/spec_tests/data/retryable_reads/changeStreams-db.coll.watch-serverErrors.yml +6 -5
  849. data/spec/spec_tests/data/retryable_reads/changeStreams-db.coll.watch.yml +1 -0
  850. data/spec/spec_tests/data/retryable_reads/changeStreams-db.watch-serverErrors.yml +6 -5
  851. data/spec/spec_tests/data/retryable_reads/changeStreams-db.watch.yml +1 -0
  852. data/spec/spec_tests/data/retryable_reads/count-serverErrors.yml +1 -1
  853. data/spec/spec_tests/data/retryable_reads/countDocuments-serverErrors.yml +1 -1
  854. data/spec/spec_tests/data/retryable_reads/distinct-serverErrors.yml +1 -1
  855. data/spec/spec_tests/data/retryable_reads/estimatedDocumentCount-4.9.yml +60 -0
  856. data/spec/spec_tests/data/retryable_reads/{estimatedDocumentCount.yml → estimatedDocumentCount-pre4.9.yml} +2 -0
  857. data/spec/spec_tests/data/retryable_reads/estimatedDocumentCount-serverErrors-4.9.yml +146 -0
  858. data/spec/spec_tests/data/retryable_reads/{estimatedDocumentCount-serverErrors.yml → estimatedDocumentCount-serverErrors-pre4.9.yml} +3 -1
  859. data/spec/spec_tests/data/retryable_reads/find-serverErrors.yml +1 -1
  860. data/spec/spec_tests/data/retryable_reads/findOne-serverErrors.yml +1 -1
  861. data/spec/spec_tests/data/retryable_reads/gridfs-download-serverErrors.yml +1 -1
  862. data/spec/spec_tests/data/retryable_reads/gridfs-downloadByName-serverErrors.yml +1 -1
  863. data/spec/spec_tests/data/retryable_reads/listCollectionNames-serverErrors.yml +1 -1
  864. data/spec/spec_tests/data/retryable_reads/listCollectionObjects-serverErrors.yml +1 -1
  865. data/spec/spec_tests/data/retryable_reads/listCollections-serverErrors.yml +1 -1
  866. data/spec/spec_tests/data/retryable_reads/listDatabaseNames-serverErrors.yml +1 -1
  867. data/spec/spec_tests/data/retryable_reads/listDatabaseObjects-serverErrors.yml +1 -1
  868. data/spec/spec_tests/data/retryable_reads/listDatabases-serverErrors.yml +1 -1
  869. data/spec/spec_tests/data/retryable_reads/listIndexNames-serverErrors.yml +1 -1
  870. data/spec/spec_tests/data/retryable_reads/listIndexNames.yml +1 -1
  871. data/spec/spec_tests/data/retryable_reads/listIndexes-serverErrors.yml +1 -1
  872. data/spec/spec_tests/data/retryable_writes/bulkWrite.yml +30 -24
  873. data/spec/spec_tests/data/retryable_writes/insertOne-serverErrors.yml +5 -4
  874. data/spec/spec_tests/data/sdam/errors/error_handling_handshake.yml +2 -1
  875. data/spec/spec_tests/data/sdam/errors/non-stale-network-error.yml +2 -1
  876. data/spec/spec_tests/data/sdam/errors/non-stale-network-timeout-error.yml +2 -1
  877. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-greater-InterruptedAtShutdown.yml +2 -1
  878. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-greater-InterruptedDueToReplStateChange.yml +2 -1
  879. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-greater-LegacyNotPrimary.yml +61 -0
  880. data/spec/spec_tests/data/sdam/errors/{non-stale-topologyVersion-greater-NotMasterNoSlaveOk.yml → non-stale-topologyVersion-greater-NotPrimaryNoSecondaryOk.yml} +5 -4
  881. data/spec/spec_tests/data/sdam/errors/{non-stale-topologyVersion-greater-NotMasterOrSecondary.yml → non-stale-topologyVersion-greater-NotPrimaryOrSecondary.yml} +5 -4
  882. data/spec/spec_tests/data/sdam/errors/{non-stale-topologyVersion-greater-NotMaster.yml → non-stale-topologyVersion-greater-NotWritablePrimary.yml} +5 -4
  883. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-greater-PrimarySteppedDown.yml +2 -1
  884. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-greater-ShutdownInProgress.yml +2 -1
  885. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-missing-InterruptedAtShutdown.yml +2 -1
  886. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-missing-InterruptedDueToReplStateChange.yml +2 -1
  887. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-missing-LegacyNotPrimary.yml +52 -0
  888. data/spec/spec_tests/data/sdam/errors/{non-stale-topologyVersion-missing-NotMasterNoSlaveOk.yml → non-stale-topologyVersion-missing-NotPrimaryNoSecondaryOk.yml} +5 -4
  889. data/spec/spec_tests/data/sdam/errors/{non-stale-topologyVersion-missing-NotMasterOrSecondary.yml → non-stale-topologyVersion-missing-NotPrimaryOrSecondary.yml} +5 -4
  890. data/spec/spec_tests/data/sdam/errors/{non-stale-topologyVersion-missing-NotMaster.yml → non-stale-topologyVersion-missing-NotWritablePrimary.yml} +5 -4
  891. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-missing-PrimarySteppedDown.yml +2 -1
  892. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-missing-ShutdownInProgress.yml +2 -1
  893. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-proccessId-changed-InterruptedAtShutdown.yml +2 -1
  894. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-proccessId-changed-InterruptedDueToReplStateChange.yml +2 -1
  895. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-proccessId-changed-LegacyNotPrimary.yml +61 -0
  896. data/spec/spec_tests/data/sdam/errors/{non-stale-topologyVersion-proccessId-changed-NotMasterNoSlaveOk.yml → non-stale-topologyVersion-proccessId-changed-NotPrimaryNoSecondaryOk.yml} +5 -4
  897. data/spec/spec_tests/data/sdam/errors/{non-stale-topologyVersion-proccessId-changed-NotMasterOrSecondary.yml → non-stale-topologyVersion-proccessId-changed-NotPrimaryOrSecondary.yml} +5 -4
  898. data/spec/spec_tests/data/sdam/errors/{non-stale-topologyVersion-proccessId-changed-NotMaster.yml → non-stale-topologyVersion-proccessId-changed-NotWritablePrimary.yml} +5 -4
  899. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-proccessId-changed-PrimarySteppedDown.yml +2 -1
  900. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-proccessId-changed-ShutdownInProgress.yml +2 -1
  901. data/spec/spec_tests/data/sdam/errors/post-42-InterruptedAtShutdown.yml +2 -1
  902. data/spec/spec_tests/data/sdam/errors/post-42-InterruptedDueToReplStateChange.yml +2 -1
  903. data/spec/spec_tests/data/sdam/errors/post-42-LegacyNotPrimary.yml +47 -0
  904. data/spec/spec_tests/data/sdam/errors/{post-42-NotMasterNoSlaveOk.yml → post-42-NotPrimaryNoSecondaryOk.yml} +5 -4
  905. data/spec/spec_tests/data/sdam/errors/{post-42-NotMasterOrSecondary.yml → post-42-NotPrimaryOrSecondary.yml} +5 -4
  906. data/spec/spec_tests/data/sdam/errors/{post-42-NotMaster.yml → post-42-NotWritablePrimary.yml} +5 -4
  907. data/spec/spec_tests/data/sdam/errors/post-42-PrimarySteppedDown.yml +2 -1
  908. data/spec/spec_tests/data/sdam/errors/post-42-ShutdownInProgress.yml +2 -1
  909. data/spec/spec_tests/data/sdam/errors/pre-42-InterruptedAtShutdown.yml +2 -1
  910. data/spec/spec_tests/data/sdam/errors/pre-42-InterruptedDueToReplStateChange.yml +2 -1
  911. data/spec/spec_tests/data/sdam/errors/{pre-42-NotMaster.yml → pre-42-LegacyNotPrimary.yml} +6 -5
  912. data/spec/spec_tests/data/sdam/errors/pre-42-NotPrimaryNoSecondaryOk.yml +47 -0
  913. data/spec/spec_tests/data/sdam/errors/{pre-42-NotMasterOrSecondary.yml → pre-42-NotPrimaryOrSecondary.yml} +5 -4
  914. data/spec/spec_tests/data/sdam/errors/{pre-42-NotMasterNoSlaveOk.yml → pre-42-NotWritablePrimary.yml} +6 -5
  915. data/spec/spec_tests/data/sdam/errors/pre-42-PrimarySteppedDown.yml +2 -1
  916. data/spec/spec_tests/data/sdam/errors/pre-42-ShutdownInProgress.yml +2 -1
  917. data/spec/spec_tests/data/sdam/errors/prefer-error-code.yml +54 -0
  918. data/spec/spec_tests/data/sdam/errors/stale-generation-InterruptedAtShutdown.yml +4 -2
  919. data/spec/spec_tests/data/sdam/errors/stale-generation-InterruptedDueToReplStateChange.yml +4 -2
  920. data/spec/spec_tests/data/sdam/errors/{stale-generation-NotMasterNoSlaveOk.yml → stale-generation-NotPrimaryNoSecondaryOk.yml} +7 -5
  921. data/spec/spec_tests/data/sdam/errors/{stale-generation-NotMasterOrSecondary.yml → stale-generation-NotPrimaryOrSecondary.yml} +7 -5
  922. data/spec/spec_tests/data/sdam/errors/{stale-generation-NotMaster.yml → stale-generation-NotWritablePrimary.yml} +7 -5
  923. data/spec/spec_tests/data/sdam/errors/stale-generation-PrimarySteppedDown.yml +4 -2
  924. data/spec/spec_tests/data/sdam/errors/stale-generation-ShutdownInProgress.yml +4 -2
  925. data/spec/spec_tests/data/sdam/errors/stale-generation-afterHandshakeCompletes-InterruptedAtShutdown.yml +4 -2
  926. data/spec/spec_tests/data/sdam/errors/stale-generation-afterHandshakeCompletes-InterruptedDueToReplStateChange.yml +4 -2
  927. data/spec/spec_tests/data/sdam/errors/{stale-generation-afterHandshakeCompletes-NotMaster.yml → stale-generation-afterHandshakeCompletes-LegacyNotPrimary.yml} +8 -6
  928. data/spec/spec_tests/data/sdam/errors/stale-generation-afterHandshakeCompletes-NotPrimaryNoSecondaryOk.yml +91 -0
  929. data/spec/spec_tests/data/sdam/errors/{stale-generation-afterHandshakeCompletes-NotMasterOrSecondary.yml → stale-generation-afterHandshakeCompletes-NotPrimaryOrSecondary.yml} +7 -5
  930. data/spec/spec_tests/data/sdam/errors/{stale-generation-afterHandshakeCompletes-NotMasterNoSlaveOk.yml → stale-generation-afterHandshakeCompletes-NotWritablePrimary.yml} +8 -6
  931. data/spec/spec_tests/data/sdam/errors/stale-generation-afterHandshakeCompletes-PrimarySteppedDown.yml +4 -2
  932. data/spec/spec_tests/data/sdam/errors/stale-generation-afterHandshakeCompletes-ShutdownInProgress.yml +4 -2
  933. data/spec/spec_tests/data/sdam/errors/stale-generation-afterHandshakeCompletes-network.yml +6 -4
  934. data/spec/spec_tests/data/sdam/errors/stale-generation-afterHandshakeCompletes-timeout.yml +6 -4
  935. data/spec/spec_tests/data/sdam/errors/stale-generation-beforeHandshakeCompletes-InterruptedAtShutdown.yml +4 -2
  936. data/spec/spec_tests/data/sdam/errors/stale-generation-beforeHandshakeCompletes-InterruptedDueToReplStateChange.yml +4 -2
  937. data/spec/spec_tests/data/sdam/errors/{stale-generation-beforeHandshakeCompletes-NotMaster.yml → stale-generation-beforeHandshakeCompletes-LegacyNotPrimary.yml} +8 -6
  938. data/spec/spec_tests/data/sdam/errors/stale-generation-beforeHandshakeCompletes-NotPrimaryNoSecondaryOk.yml +91 -0
  939. data/spec/spec_tests/data/sdam/errors/{stale-generation-beforeHandshakeCompletes-NotMasterOrSecondary.yml → stale-generation-beforeHandshakeCompletes-NotPrimaryOrSecondary.yml} +7 -5
  940. data/spec/spec_tests/data/sdam/errors/{stale-generation-beforeHandshakeCompletes-NotMasterNoSlaveOk.yml → stale-generation-beforeHandshakeCompletes-NotWritablePrimary.yml} +8 -6
  941. data/spec/spec_tests/data/sdam/errors/stale-generation-beforeHandshakeCompletes-PrimarySteppedDown.yml +4 -2
  942. data/spec/spec_tests/data/sdam/errors/stale-generation-beforeHandshakeCompletes-ShutdownInProgress.yml +4 -2
  943. data/spec/spec_tests/data/sdam/errors/stale-generation-beforeHandshakeCompletes-network.yml +6 -4
  944. data/spec/spec_tests/data/sdam/errors/stale-generation-beforeHandshakeCompletes-timeout.yml +6 -4
  945. data/spec/spec_tests/data/sdam/errors/stale-topologyVersion-InterruptedAtShutdown.yml +2 -1
  946. data/spec/spec_tests/data/sdam/errors/stale-topologyVersion-InterruptedDueToReplStateChange.yml +2 -1
  947. data/spec/spec_tests/data/sdam/errors/stale-topologyVersion-LegacyNotPrimary.yml +65 -0
  948. data/spec/spec_tests/data/sdam/errors/{stale-topologyVersion-NotMasterNoSlaveOk.yml → stale-topologyVersion-NotPrimaryNoSecondaryOk.yml} +7 -6
  949. data/spec/spec_tests/data/sdam/errors/{stale-topologyVersion-NotMasterOrSecondary.yml → stale-topologyVersion-NotPrimaryOrSecondary.yml} +7 -6
  950. data/spec/spec_tests/data/sdam/errors/{stale-topologyVersion-NotMaster.yml → stale-topologyVersion-NotWritablePrimary.yml} +7 -6
  951. data/spec/spec_tests/data/sdam/errors/stale-topologyVersion-PrimarySteppedDown.yml +2 -1
  952. data/spec/spec_tests/data/sdam/errors/stale-topologyVersion-ShutdownInProgress.yml +2 -1
  953. data/spec/spec_tests/data/sdam/errors/write_errors_ignored.yml +42 -0
  954. data/spec/spec_tests/data/sdam/rs/compatible.yml +4 -2
  955. data/spec/spec_tests/data/sdam/rs/compatible_unknown.yml +2 -1
  956. data/spec/spec_tests/data/sdam/rs/discover_arbiters.yml +2 -1
  957. data/spec/spec_tests/data/sdam/rs/discover_arbiters_replicaset.yml +2 -1
  958. data/spec/spec_tests/data/sdam/rs/discover_ghost.yml +2 -1
  959. data/spec/spec_tests/data/sdam/rs/discover_ghost_replicaset.yml +2 -1
  960. data/spec/spec_tests/data/sdam/rs/discover_hidden.yml +2 -1
  961. data/spec/spec_tests/data/sdam/rs/discover_hidden_replicaset.yml +2 -1
  962. data/spec/spec_tests/data/sdam/rs/discover_passives.yml +4 -2
  963. data/spec/spec_tests/data/sdam/rs/discover_passives_replicaset.yml +4 -2
  964. data/spec/spec_tests/data/sdam/rs/discover_primary.yml +2 -1
  965. data/spec/spec_tests/data/sdam/rs/discover_primary_replicaset.yml +2 -1
  966. data/spec/spec_tests/data/sdam/rs/discover_rsother.yml +2 -1
  967. data/spec/spec_tests/data/sdam/rs/discover_rsother_replicaset.yml +4 -2
  968. data/spec/spec_tests/data/sdam/rs/discover_secondary.yml +2 -1
  969. data/spec/spec_tests/data/sdam/rs/discover_secondary_replicaset.yml +2 -1
  970. data/spec/spec_tests/data/sdam/rs/discovery.yml +8 -4
  971. data/spec/spec_tests/data/sdam/rs/equal_electionids.yml +4 -2
  972. data/spec/spec_tests/data/sdam/rs/hosts_differ_from_seeds.yml +2 -1
  973. data/spec/spec_tests/data/sdam/rs/incompatible_arbiter.yml +3 -1
  974. data/spec/spec_tests/data/sdam/rs/incompatible_ghost.yml +3 -1
  975. data/spec/spec_tests/data/sdam/rs/incompatible_other.yml +3 -1
  976. data/spec/spec_tests/data/sdam/rs/ls_timeout.yml +12 -6
  977. data/spec/spec_tests/data/sdam/rs/member_reconfig.yml +4 -2
  978. data/spec/spec_tests/data/sdam/rs/member_standalone.yml +4 -2
  979. data/spec/spec_tests/data/sdam/rs/new_primary.yml +4 -2
  980. data/spec/spec_tests/data/sdam/rs/new_primary_new_electionid.yml +6 -3
  981. data/spec/spec_tests/data/sdam/rs/new_primary_new_setversion.yml +6 -3
  982. data/spec/spec_tests/data/sdam/rs/new_primary_wrong_set_name.yml +4 -2
  983. data/spec/spec_tests/data/sdam/rs/non_rs_member.yml +1 -0
  984. data/spec/spec_tests/data/sdam/rs/normalize_case.yml +2 -1
  985. data/spec/spec_tests/data/sdam/rs/normalize_case_me.yml +4 -2
  986. data/spec/spec_tests/data/sdam/rs/null_election_id.yml +8 -4
  987. data/spec/spec_tests/data/sdam/rs/primary_becomes_ghost.yml +4 -2
  988. data/spec/spec_tests/data/sdam/rs/primary_becomes_mongos.yml +4 -2
  989. data/spec/spec_tests/data/sdam/rs/primary_becomes_standalone.yml +2 -1
  990. data/spec/spec_tests/data/sdam/rs/primary_changes_set_name.yml +4 -2
  991. data/spec/spec_tests/data/sdam/rs/primary_disconnect.yml +2 -1
  992. data/spec/spec_tests/data/sdam/rs/primary_disconnect_electionid.yml +10 -5
  993. data/spec/spec_tests/data/sdam/rs/primary_disconnect_setversion.yml +10 -5
  994. data/spec/spec_tests/data/sdam/rs/primary_hint_from_secondary_with_mismatched_me.yml +4 -2
  995. data/spec/spec_tests/data/sdam/rs/primary_mismatched_me.yml +2 -1
  996. data/spec/spec_tests/data/sdam/rs/primary_mismatched_me_not_removed.yml +5 -3
  997. data/spec/spec_tests/data/sdam/rs/primary_reports_new_member.yml +8 -4
  998. data/spec/spec_tests/data/sdam/rs/primary_to_no_primary_mismatched_me.yml +4 -2
  999. data/spec/spec_tests/data/sdam/rs/primary_wrong_set_name.yml +2 -1
  1000. data/spec/spec_tests/data/sdam/rs/repeated.yml +9 -5
  1001. data/spec/spec_tests/data/sdam/rs/replicaset_rsnp.yml +2 -1
  1002. data/spec/spec_tests/data/sdam/rs/response_from_removed.yml +4 -2
  1003. data/spec/spec_tests/data/sdam/rs/sec_not_auth.yml +4 -2
  1004. data/spec/spec_tests/data/sdam/rs/secondary_ignore_ok_0.yml +4 -2
  1005. data/spec/spec_tests/data/sdam/rs/secondary_mismatched_me.yml +2 -1
  1006. data/spec/spec_tests/data/sdam/rs/secondary_wrong_set_name.yml +2 -1
  1007. data/spec/spec_tests/data/sdam/rs/secondary_wrong_set_name_with_primary.yml +4 -2
  1008. data/spec/spec_tests/data/sdam/rs/setversion_without_electionid.yml +4 -2
  1009. data/spec/spec_tests/data/sdam/rs/stepdown_change_set_name.yml +4 -2
  1010. data/spec/spec_tests/data/sdam/rs/too_new.yml +4 -2
  1011. data/spec/spec_tests/data/sdam/rs/too_old.yml +4 -2
  1012. data/spec/spec_tests/data/sdam/rs/topology_version_equal.yml +4 -2
  1013. data/spec/spec_tests/data/sdam/rs/topology_version_greater.yml +10 -5
  1014. data/spec/spec_tests/data/sdam/rs/topology_version_less.yml +4 -2
  1015. data/spec/spec_tests/data/sdam/rs/unexpected_mongos.yml +2 -1
  1016. data/spec/spec_tests/data/sdam/rs/use_setversion_without_electionid.yml +6 -3
  1017. data/spec/spec_tests/data/sdam/rs/wrong_set_name.yml +2 -1
  1018. data/spec/spec_tests/data/sdam/sharded/compatible.yml +4 -2
  1019. data/spec/spec_tests/data/sdam/sharded/discover_single_mongos.yml +2 -1
  1020. data/spec/spec_tests/data/sdam/sharded/ls_timeout_mongos.yml +9 -5
  1021. data/spec/spec_tests/data/sdam/sharded/mongos_disconnect.yml +6 -3
  1022. data/spec/spec_tests/data/sdam/sharded/multiple_mongoses.yml +4 -2
  1023. data/spec/spec_tests/data/sdam/sharded/non_mongos_removed.yml +4 -2
  1024. data/spec/spec_tests/data/sdam/sharded/too_new.yml +4 -2
  1025. data/spec/spec_tests/data/sdam/sharded/too_old.yml +4 -2
  1026. data/spec/spec_tests/data/sdam/single/compatible.yml +2 -1
  1027. data/spec/spec_tests/data/sdam/single/direct_connection_external_ip.yml +2 -1
  1028. data/spec/spec_tests/data/sdam/single/direct_connection_mongos.yml +2 -1
  1029. data/spec/spec_tests/data/sdam/single/direct_connection_replicaset.yml +2 -1
  1030. data/spec/spec_tests/data/sdam/single/direct_connection_rsarbiter.yml +2 -1
  1031. data/spec/spec_tests/data/sdam/single/direct_connection_rsprimary.yml +2 -1
  1032. data/spec/spec_tests/data/sdam/single/direct_connection_rssecondary.yml +2 -1
  1033. data/spec/spec_tests/data/sdam/single/direct_connection_standalone.yml +2 -1
  1034. data/spec/spec_tests/data/sdam/single/direct_connection_wrong_set_name.yml +4 -2
  1035. data/spec/spec_tests/data/sdam/single/discover_standalone.yml +2 -1
  1036. data/spec/spec_tests/data/sdam/single/ls_timeout_standalone.yml +2 -1
  1037. data/spec/spec_tests/data/sdam/single/not_ok_response.yml +5 -3
  1038. data/spec/spec_tests/data/sdam/single/standalone_removed.yml +2 -1
  1039. data/spec/spec_tests/data/sdam/single/{direct_connection_slave.yml → standalone_using_legacy_hello.yml} +3 -3
  1040. data/spec/spec_tests/data/sdam/single/too_new.yml +2 -1
  1041. data/spec/spec_tests/data/sdam/single/too_old.yml +2 -1
  1042. data/spec/spec_tests/data/sdam/single/too_old_then_upgraded.yml +4 -2
  1043. data/spec/spec_tests/data/sdam_integration/cancel-server-check.yml +1 -1
  1044. data/spec/spec_tests/data/sdam_integration/connectTimeoutMS.yml +2 -2
  1045. data/spec/spec_tests/data/sdam_integration/{isMaster-command-error.yml → hello-command-error.yml} +19 -29
  1046. data/spec/spec_tests/data/sdam_integration/{isMaster-network-error.yml → hello-network-error.yml} +9 -15
  1047. data/spec/spec_tests/data/sdam_integration/{isMaster-timeout.yml → hello-timeout.yml} +7 -13
  1048. data/spec/spec_tests/data/sdam_integration/rediscover-quickly-after-step-down.yml +14 -3
  1049. data/spec/spec_tests/data/sdam_monitoring/discovered_standalone.yml +2 -4
  1050. data/spec/spec_tests/data/sdam_monitoring/replica_set_with_no_primary.yml +2 -1
  1051. data/spec/spec_tests/data/sdam_monitoring/replica_set_with_primary.yml +2 -1
  1052. data/spec/spec_tests/data/sdam_monitoring/replica_set_with_removal.yml +3 -2
  1053. data/spec/spec_tests/data/sdam_monitoring/required_replica_set.yml +2 -1
  1054. data/spec/spec_tests/data/sdam_monitoring/standalone.yml +3 -3
  1055. data/spec/spec_tests/data/sdam_monitoring/standalone_repeated.yml +2 -2
  1056. data/spec/spec_tests/data/sdam_monitoring/standalone_suppress_equal_description_changes.yml +4 -4
  1057. data/spec/spec_tests/data/sdam_monitoring/standalone_to_rs_with_me_mismatch.yml +2 -2
  1058. data/spec/spec_tests/data/transactions/error-labels.yml +3 -0
  1059. data/spec/spec_tests/data/transactions/mongos-pin-auto.yml +3 -0
  1060. data/spec/spec_tests/data/transactions/mongos-recovery-token.yml +2 -0
  1061. data/spec/spec_tests/data/transactions/pin-mongos.yml +6 -3
  1062. data/spec/spec_tests/data/transactions_unified/mongos-unpin.yml +172 -0
  1063. data/spec/spec_tests/data/unified/valid-fail/operation-failure.yml +31 -0
  1064. data/spec/spec_tests/data/unified/valid-pass/poc-change-streams.yml +220 -0
  1065. data/spec/spec_tests/data/unified/valid-pass/poc-command-monitoring.yml +102 -0
  1066. data/spec/spec_tests/data/unified/valid-pass/poc-crud.yml +184 -0
  1067. data/spec/spec_tests/data/unified/valid-pass/poc-gridfs.yml +155 -0
  1068. data/spec/spec_tests/data/unified/valid-pass/poc-retryable-reads.yml +193 -0
  1069. data/spec/spec_tests/data/unified/valid-pass/poc-retryable-writes.yml +210 -0
  1070. data/spec/spec_tests/data/unified/valid-pass/poc-sessions.yml +215 -0
  1071. data/spec/spec_tests/data/unified/valid-pass/poc-transactions-convenient-api.yml +235 -0
  1072. data/spec/spec_tests/data/unified/valid-pass/poc-transactions-mongos-pin-auto.yml +169 -0
  1073. data/spec/spec_tests/data/unified/valid-pass/poc-transactions.yml +170 -0
  1074. data/spec/spec_tests/data/uri_options/auth-options.yml +25 -0
  1075. data/spec/spec_tests/data/uri_options/compression-options.yml +7 -4
  1076. data/spec/spec_tests/data/uri_options/read-preference-options.yml +24 -0
  1077. data/spec/spec_tests/data/uri_options/ruby-connection-options.yml +1 -0
  1078. data/spec/spec_tests/data/uri_options/tls-options.yml +160 -4
  1079. data/spec/spec_tests/data/versioned_api/crud-api-version-1-strict.yml +417 -0
  1080. data/spec/spec_tests/data/versioned_api/crud-api-version-1.yml +411 -0
  1081. data/spec/spec_tests/data/versioned_api/runcommand-helper-no-api-version-declared.yml +75 -0
  1082. data/spec/spec_tests/data/versioned_api/test-commands-deprecation-errors.yml +47 -0
  1083. data/spec/spec_tests/data/versioned_api/test-commands-strict-mode.yml +46 -0
  1084. data/spec/spec_tests/data/versioned_api/transaction-handling.yml +128 -0
  1085. data/spec/spec_tests/dns_seedlist_discovery_spec.rb +12 -1
  1086. data/spec/spec_tests/gridfs_spec.rb +3 -0
  1087. data/spec/spec_tests/max_staleness_spec.rb +3 -0
  1088. data/spec/spec_tests/read_write_concern_connection_string_spec.rb +3 -0
  1089. data/spec/spec_tests/read_write_concern_document_spec.rb +3 -0
  1090. data/spec/spec_tests/read_write_concern_operaton_spec.rb +3 -0
  1091. data/spec/spec_tests/retryable_reads_spec.rb +3 -0
  1092. data/spec/spec_tests/retryable_writes_spec.rb +9 -6
  1093. data/spec/spec_tests/sdam_integration_spec.rb +3 -0
  1094. data/spec/spec_tests/sdam_monitoring_spec.rb +4 -1
  1095. data/spec/spec_tests/sdam_spec.rb +4 -1
  1096. data/spec/spec_tests/server_selection_rtt_spec.rb +3 -0
  1097. data/spec/spec_tests/server_selection_spec.rb +3 -0
  1098. data/spec/spec_tests/transactions_api_spec.rb +3 -0
  1099. data/spec/spec_tests/transactions_spec.rb +3 -0
  1100. data/spec/spec_tests/transactions_unified_spec.rb +13 -0
  1101. data/spec/spec_tests/unified_spec.rb +18 -0
  1102. data/spec/spec_tests/uri_options_spec.rb +50 -33
  1103. data/spec/spec_tests/versioned_api_spec.rb +13 -0
  1104. data/spec/stress/cleanup_spec.rb +3 -0
  1105. data/spec/stress/connection_pool_stress_spec.rb +3 -0
  1106. data/spec/stress/connection_pool_timing_spec.rb +3 -0
  1107. data/spec/stress/fork_reconnect_stress_spec.rb +7 -4
  1108. data/spec/support/authorization.rb +3 -0
  1109. data/spec/support/aws_utils.rb +3 -0
  1110. data/spec/support/aws_utils/base.rb +3 -0
  1111. data/spec/support/aws_utils/inspector.rb +3 -0
  1112. data/spec/support/aws_utils/orchestrator.rb +3 -0
  1113. data/spec/support/aws_utils/provisioner.rb +3 -0
  1114. data/spec/support/background_thread_registry.rb +4 -1
  1115. data/spec/support/certificates/README.md +3 -2
  1116. data/spec/support/certificates/atlas-ocsp-ca.crt +118 -0
  1117. data/spec/support/certificates/atlas-ocsp.crt +152 -0
  1118. data/spec/support/client_registry.rb +12 -5
  1119. data/spec/support/client_registry_macros.rb +17 -5
  1120. data/spec/support/cluster_tools.rb +4 -1
  1121. data/spec/support/common_shortcuts.rb +84 -6
  1122. data/spec/support/constraints.rb +9 -253
  1123. data/spec/support/crypt.rb +3 -0
  1124. data/spec/support/dns.rb +3 -0
  1125. data/spec/support/event_subscriber.rb +9 -0
  1126. data/spec/support/json_ext_formatter.rb +3 -0
  1127. data/spec/support/keyword_struct.rb +3 -0
  1128. data/spec/support/local_resource_registry.rb +3 -0
  1129. data/spec/support/matchers.rb +20 -1
  1130. data/spec/support/monitoring_ext.rb +3 -0
  1131. data/spec/support/ocsp +1 -0
  1132. data/spec/support/primary_socket.rb +3 -0
  1133. data/spec/support/sdam_formatter_integration.rb +3 -0
  1134. data/spec/support/session_registry.rb +55 -0
  1135. data/spec/{mongo/server/app_metadata_shared.rb → support/shared/app_metadata.rb} +39 -8
  1136. data/spec/support/shared/protocol.rb +3 -0
  1137. data/spec/support/shared/scram_conversation.rb +3 -0
  1138. data/spec/support/shared/server_selector.rb +6 -3
  1139. data/spec/support/shared/session.rb +5 -2
  1140. data/spec/support/spec_config.rb +111 -12
  1141. data/spec/support/spec_setup.rb +51 -38
  1142. data/spec/support/utils.rb +106 -5
  1143. metadata +1177 -982
  1144. metadata.gz.sig +3 -2
  1145. data/lib/mongo/operation/shared/collections_info_or_list_collections.rb +0 -56
  1146. data/lib/mongo/operation/shared/op_msg_or_list_indexes_command.rb +0 -47
  1147. data/spec/support/child_process_helper.rb +0 -78
  1148. data/spec/support/cluster_config.rb +0 -207
  1149. data/spec/support/lite_constraints.rb +0 -141
  1150. data/spec/support/spec_organizer.rb +0 -129
@@ -0,0 +1,623 @@
1
+ # frozen_string_literal: true
2
+ # encoding: utf-8
3
+
4
+ # Copyright (C) 2020 MongoDB Inc.
5
+ #
6
+ # Licensed under the Apache License, Version 2.0 (the 'License');
7
+ # you may not use this file except in compliance with the License.
8
+ # You may obtain a copy of the License at
9
+ #
10
+ # http://www.apache.org/licenses/LICENSE-2.0
11
+ #
12
+ # Unless required by applicable law or agreed to in writing, software
13
+ # distributed under the License is distributed on an 'AS IS' BASIS,
14
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15
+ # See the License for the specific language governing permissions and
16
+ # limitations under the License.
17
+
18
+ module Mongo
19
+ class URI
20
+
21
+ # Performs mapping between URI options and Ruby options.
22
+ #
23
+ # This class contains:
24
+ #
25
+ # - The mapping defining how URI options are converted to Ruby options.
26
+ # - The mapping from downcased URI option names to canonical-cased URI
27
+ # option names.
28
+ # - Methods to perform conversion of URI option values to Ruby option
29
+ # values (the convert_* methods). These generally warn and return nil
30
+ # when input given is invalid.
31
+ # - Methods to perform conversion of Ruby option values to standardized
32
+ # MongoClient options (revert_* methods). These assume the input is valid
33
+ # and generally do not perform validation.
34
+ #
35
+ # URI option names are case insensitive. Ruby options are specified as
36
+ # symbols (though in Client options use indifferent access).
37
+ #
38
+ # @api private
39
+ class OptionsMapper
40
+
41
+ include Loggable
42
+
43
+ # Instantates the options mapper.
44
+ #
45
+ # @option opts [ Logger ] :logger A custom logger to use.
46
+ def initialize(**opts)
47
+ @options = opts
48
+ end
49
+
50
+ # @return [ Hash ] The options.
51
+ attr_reader :options
52
+
53
+ # Adds an option to the uri options hash.
54
+ #
55
+ # Acquires a target for the option based on group.
56
+ # Transforms the value.
57
+ # Merges the option into the target.
58
+ #
59
+ # @param [ String ] key URI option name.
60
+ # @param [ String ] value The value of the option.
61
+ # @param [ Hash ] uri_options The base option target.
62
+ def add_uri_option(key, value, uri_options)
63
+ strategy = URI_OPTION_MAP[key.downcase]
64
+ if strategy.nil?
65
+ log_warn("Unsupported URI option '#{key}' on URI '#{@string}'. It will be ignored.")
66
+ return
67
+ end
68
+
69
+ group = strategy[:group]
70
+ target = if group
71
+ uri_options[group] || {}
72
+ else
73
+ uri_options
74
+ end
75
+ value = apply_transform(key, value, strategy[:type])
76
+ # Sometimes the value here would be nil, for example if we are processing
77
+ # read preference tags or auth mechanism properties and all of the
78
+ # data within is invalid. Ignore such options.
79
+ unless value.nil?
80
+ merge_uri_option(target, value, strategy[:name])
81
+ end
82
+
83
+ if group && !target.empty? && !uri_options.key?(group)
84
+ uri_options[group] = target
85
+ end
86
+ end
87
+
88
+ def smc_to_ruby(opts)
89
+ uri_options = {}
90
+
91
+ opts.each do |key, value|
92
+ strategy = URI_OPTION_MAP[key.downcase]
93
+ if strategy.nil?
94
+ log_warn("Unsupported URI option '#{key}' on URI '#{@string}'. It will be ignored.")
95
+ return
96
+ end
97
+
98
+ group = strategy[:group]
99
+ target = if group
100
+ uri_options[group] || {}
101
+ else
102
+ uri_options
103
+ end
104
+
105
+ if key == 'readConcernLevel'
106
+ value = value.to_sym
107
+ end
108
+
109
+ #value = apply_transform(key, value, strategy[:type])
110
+ # Sometimes the value here would be nil, for example if we are processing
111
+ # read preference tags or auth mechanism properties and all of the
112
+ # data within is invalid. Ignore such options.
113
+ unless value.nil?
114
+ merge_uri_option(target, value, strategy[:name])
115
+ end
116
+
117
+ if group && !target.empty? && !uri_options.key?(group)
118
+ uri_options[group] = target
119
+ end
120
+ end
121
+
122
+ #p uri_options
123
+ uri_options
124
+ end
125
+
126
+ # Converts Ruby options provided to "standardized MongoClient options".
127
+ #
128
+ # @param [ Hash ] opts Ruby options to convert.
129
+ #
130
+ # @return [ Hash ] Standardized MongoClient options.
131
+ def ruby_to_smc(opts)
132
+ rv = {}
133
+ URI_OPTION_MAP.each do |uri_key, spec|
134
+ if spec[:group]
135
+ v = opts[spec[:group]]
136
+ v = v && v[spec[:name]]
137
+ else
138
+ v = opts[spec[:name]]
139
+ end
140
+ unless v.nil?
141
+ if spec[:type]
142
+ v = send("revert_#{spec[:type]}", v)
143
+ end
144
+ canonical_key = URI_OPTION_CANONICAL_NAMES[uri_key]
145
+ unless canonical_key
146
+ raise ArgumentError, "Option #{uri_key} is not known"
147
+ end
148
+ rv[canonical_key] = v
149
+ end
150
+ end
151
+ # For options that default to true, remove the value if it is true.
152
+ %w(retryReads retryWrites).each do |k|
153
+ if rv[k]
154
+ rv.delete(k)
155
+ end
156
+ end
157
+ # Remove auth source when it is $external for mechanisms that default
158
+ # (or require) that auth source.
159
+ if %w(MONGODB-AWS).include?(rv['authMechanism']) && rv['authSource'] == '$external'
160
+ rv.delete('authSource')
161
+ end
162
+ # ssl and tls are aliases, remove ssl ones
163
+ rv.delete('ssl')
164
+ # TODO remove authSource if it is the same as the database,
165
+ # requires this method to know the database specified in the client.
166
+ rv
167
+ end
168
+
169
+ private
170
+
171
+ # Applies URI value transformation by either using the default cast
172
+ # or a transformation appropriate for the given type.
173
+ #
174
+ # @param key [String] URI option name.
175
+ # @param value [String] The value to be transformed.
176
+ # @param type [Symbol] The transform method.
177
+ def apply_transform(key, value, type)
178
+ if type
179
+ send("convert_#{type}", key, value)
180
+ else
181
+ value
182
+ end
183
+ end
184
+
185
+ # Merges a new option into the target.
186
+ #
187
+ # If the option exists at the target destination the merge will
188
+ # be an addition.
189
+ #
190
+ # Specifically required to append an additional tag set
191
+ # to the array of tag sets without overwriting the original.
192
+ #
193
+ # @param target [Hash] The destination.
194
+ # @param value [Object] The value to be merged.
195
+ # @param name [Symbol] The name of the option.
196
+ def merge_uri_option(target, value, name)
197
+ if target.key?(name)
198
+ if REPEATABLE_OPTIONS.include?(name)
199
+ target[name] += value
200
+ else
201
+ log_warn("Repeated option key: #{name}.")
202
+ end
203
+ else
204
+ target.merge!(name => value)
205
+ end
206
+ end
207
+
208
+ # Hash for storing map of URI option parameters to conversion strategies
209
+ URI_OPTION_MAP = {}
210
+
211
+ # @return [ Hash<String, String> ] Map from lowercased to canonical URI
212
+ # option names.
213
+ URI_OPTION_CANONICAL_NAMES = {}
214
+
215
+ # Simple internal dsl to register a MongoDB URI option in the URI_OPTION_MAP.
216
+ #
217
+ # @param uri_key [String] The MongoDB URI option to register.
218
+ # @param name [Symbol] The name of the option in the driver.
219
+ # @param extra [Hash] Extra options.
220
+ # * :group [Symbol] Nested hash where option will go.
221
+ # * :type [Symbol] Name of function to transform value.
222
+ def self.uri_option(uri_key, name, **extra)
223
+ URI_OPTION_MAP[uri_key.downcase] = { name: name }.update(extra)
224
+ URI_OPTION_CANONICAL_NAMES[uri_key.downcase] = uri_key
225
+ end
226
+
227
+ # Replica Set Options
228
+ uri_option 'replicaSet', :replica_set
229
+
230
+ # Timeout Options
231
+ uri_option 'connectTimeoutMS', :connect_timeout, type: :ms
232
+ uri_option 'socketTimeoutMS', :socket_timeout, type: :ms
233
+ uri_option 'serverSelectionTimeoutMS', :server_selection_timeout, type: :ms
234
+ uri_option 'localThresholdMS', :local_threshold, type: :ms
235
+ uri_option 'heartbeatFrequencyMS', :heartbeat_frequency, type: :ms
236
+ uri_option 'maxIdleTimeMS', :max_idle_time, type: :ms
237
+
238
+ # Write Options
239
+ uri_option 'w', :w, group: :write_concern, type: :w
240
+ uri_option 'journal', :j, group: :write_concern, type: :bool
241
+ uri_option 'fsync', :fsync, group: :write_concern, type: :bool
242
+ uri_option 'wTimeoutMS', :wtimeout, group: :write_concern, type: :integer
243
+
244
+ # Read Options
245
+ uri_option 'readPreference', :mode, group: :read, type: :read_mode
246
+ uri_option 'readPreferenceTags', :tag_sets, group: :read, type: :read_tags
247
+ uri_option 'maxStalenessSeconds', :max_staleness, group: :read, type: :max_staleness
248
+
249
+ # Pool options
250
+ uri_option 'minPoolSize', :min_pool_size, type: :integer
251
+ uri_option 'maxPoolSize', :max_pool_size, type: :integer
252
+ uri_option 'waitQueueTimeoutMS', :wait_queue_timeout, type: :ms
253
+
254
+ # Security Options
255
+ uri_option 'ssl', :ssl, type: :repeated_bool
256
+ uri_option 'tls', :ssl, type: :repeated_bool
257
+ uri_option 'tlsAllowInvalidCertificates', :ssl_verify_certificate,
258
+ type: :inverse_bool
259
+ uri_option 'tlsAllowInvalidHostnames', :ssl_verify_hostname,
260
+ type: :inverse_bool
261
+ uri_option 'tlsCAFile', :ssl_ca_cert
262
+ uri_option 'tlsCertificateKeyFile', :ssl_cert
263
+ uri_option 'tlsCertificateKeyFilePassword', :ssl_key_pass_phrase
264
+ uri_option 'tlsInsecure', :ssl_verify, type: :inverse_bool
265
+ uri_option 'tlsDisableOCSPEndpointCheck', :ssl_verify_ocsp_endpoint,
266
+ type: :inverse_bool
267
+
268
+ # Topology options
269
+ uri_option 'directConnection', :direct_connection, type: :bool
270
+ uri_option 'connect', :connect, type: :symbol
271
+
272
+ # Auth Options
273
+ uri_option 'authSource', :auth_source
274
+ uri_option 'authMechanism', :auth_mech, type: :auth_mech
275
+ uri_option 'authMechanismProperties', :auth_mech_properties, type: :auth_mech_props
276
+
277
+ # Client Options
278
+ uri_option 'appName', :app_name
279
+ uri_option 'compressors', :compressors, type: :array
280
+ uri_option 'readConcernLevel', :level, group: :read_concern, type: :symbol
281
+ uri_option 'retryReads', :retry_reads, type: :bool
282
+ uri_option 'retryWrites', :retry_writes, type: :bool
283
+ uri_option 'zlibCompressionLevel', :zlib_compression_level, type: :zlib_compression_level
284
+
285
+ # Converts +value+ to a boolean.
286
+ #
287
+ # Returns true for 'true', false for 'false', otherwise nil.
288
+ #
289
+ # @param [ String ] name Name of the URI option being processed.
290
+ # @param value [ String ] URI option value.
291
+ #
292
+ # @return [ true | false | nil ] Converted value.
293
+ def convert_bool(name, value)
294
+ case value
295
+ when "true", 'TRUE'
296
+ true
297
+ when "false", 'FALSE'
298
+ false
299
+ else
300
+ log_warn("invalid boolean option for #{name}: #{value}")
301
+ nil
302
+ end
303
+ end
304
+
305
+ def revert_bool(value)
306
+ value
307
+ end
308
+
309
+ # Converts the value into a boolean and returns it wrapped in an array.
310
+ #
311
+ # @param name [ String ] Name of the URI option being processed.
312
+ # @param value [ String ] URI option value.
313
+ #
314
+ # @return [ Array<true | false> ] The boolean value parsed and wraped
315
+ # in an array.
316
+ def convert_repeated_bool(name, value)
317
+ [convert_bool(name, value)]
318
+ end
319
+
320
+ def revert_repeated_bool(value)
321
+ value
322
+ end
323
+
324
+ # Parses a boolean value and returns its inverse.
325
+ #
326
+ # @param [ String ] name Name of the URI option being processed.
327
+ # @param value [ String ] The URI option value.
328
+ #
329
+ # @return [ true | false | nil ] The inverse of the boolean value parsed out, otherwise nil
330
+ # (and a warning will be logged).
331
+ def convert_inverse_bool(name, value)
332
+ b = convert_bool(name, value)
333
+
334
+ if b.nil?
335
+ nil
336
+ else
337
+ !b
338
+ end
339
+ end
340
+
341
+ def revert_inverse_bool(value)
342
+ !value
343
+ end
344
+
345
+ # Converts +value+ into an integer.
346
+ #
347
+ # If the value is not a valid integer, warns and returns nil.
348
+ #
349
+ # @param [ String ] name Name of the URI option being processed.
350
+ # @param value [ String ] URI option value.
351
+ #
352
+ # @return [ nil | Integer ] Converted value.
353
+ def convert_integer(name, value)
354
+ unless /\A\d+\z/ =~ value
355
+ log_warn("#{value} is not a valid integer for #{name}")
356
+ return nil
357
+ end
358
+
359
+ value.to_i
360
+ end
361
+
362
+ def revert_integer(value)
363
+ value
364
+ end
365
+
366
+ # Ruby's convention is to provide timeouts in seconds, not milliseconds and
367
+ # to use fractions where more precision is necessary. The connection string
368
+ # options are always in MS so we provide an easy conversion type.
369
+ #
370
+ # @param [ String ] name Name of the URI option being processed.
371
+ # @param [ Integer ] value The millisecond value.
372
+ #
373
+ # @return [ Float ] The seconds value.
374
+ #
375
+ # @since 2.0.0
376
+ def convert_ms(name, value)
377
+ unless /\A-?\d+(\.\d+)?\z/ =~ value
378
+ log_warn("Invalid ms value for #{name}: #{value}")
379
+ return nil
380
+ end
381
+
382
+ if value[0] == '-'
383
+ log_warn("#{name} cannot be a negative number")
384
+ return nil
385
+ end
386
+
387
+ value.to_f / 1000
388
+ end
389
+
390
+ def revert_ms(value)
391
+ (value * 1000).round
392
+ end
393
+
394
+ # Converts +value+ into a symbol.
395
+ #
396
+ # @param [ String ] name Name of the URI option being processed.
397
+ # @param value [ String ] URI option value.
398
+ #
399
+ # @return [ Symbol ] Converted value.
400
+ def convert_symbol(name, value)
401
+ value.to_sym
402
+ end
403
+
404
+ def revert_symbol(value)
405
+ value.to_s
406
+ end
407
+
408
+ # Extract values from the string and put them into an array.
409
+ #
410
+ # @param [ String ] name Name of the URI option being processed.
411
+ # @param [ String ] value The string to build an array from.
412
+ #
413
+ # @return [ Array ] The array built from the string.
414
+ def convert_array(name, value)
415
+ value.split(',')
416
+ end
417
+
418
+ def revert_array(value)
419
+ value
420
+ end
421
+
422
+ # Authentication mechanism transformation.
423
+ #
424
+ # @param [ String ] name Name of the URI option being processed.
425
+ # @param value [String] The authentication mechanism.
426
+ #
427
+ # @return [Symbol] The transformed authentication mechanism.
428
+ def convert_auth_mech(name, value)
429
+ (AUTH_MECH_MAP[value.upcase] || value).tap do |mech|
430
+ log_warn("#{value} is not a valid auth mechanism") unless mech
431
+ end
432
+ end
433
+
434
+ def revert_auth_mech(value)
435
+ found = AUTH_MECH_MAP.detect do |k, v|
436
+ v == value
437
+ end
438
+ if found
439
+ found.first
440
+ else
441
+ raise ArgumentError, "Unknown auth mechanism #{value}"
442
+ end
443
+ end
444
+
445
+ # Auth mechanism properties extractor.
446
+ #
447
+ # @param [ String ] name Name of the URI option being processed.
448
+ # @param value [ String ] The auth mechanism properties string.
449
+ #
450
+ # @return [ Hash ] The auth mechanism properties hash.
451
+ def convert_auth_mech_props(name, value)
452
+ properties = hash_extractor('authMechanismProperties', value)
453
+ if properties
454
+ properties.each do |k, v|
455
+ if k.to_s.downcase == 'canonicalize_host_name' && v
456
+ properties[k] = (v.downcase == 'true')
457
+ end
458
+ end
459
+ end
460
+ properties
461
+ end
462
+
463
+ def revert_auth_mech_props(value)
464
+ value
465
+ end
466
+
467
+ # Parses the max staleness value, which must be either "0" or an integer
468
+ # greater or equal to 90.
469
+ #
470
+ # @param [ String ] name Name of the URI option being processed.
471
+ # @param value [ String ] The max staleness string.
472
+ #
473
+ # @return [ Integer | nil ] The max staleness integer parsed out if it is valid, otherwise nil
474
+ # (and a warning will be logged).
475
+ def convert_max_staleness(name, value)
476
+ if /\A-?\d+\z/ =~ value
477
+ int = value.to_i
478
+
479
+ if int == -1
480
+ int = nil
481
+ end
482
+
483
+ if int && (int >= 0 && int < 90 || int < 0)
484
+ log_warn("max staleness should be either 0 or greater than 90: #{value}")
485
+ int = nil
486
+ end
487
+
488
+ return int
489
+ end
490
+
491
+ log_warn("Invalid max staleness value: #{value}")
492
+ nil
493
+ end
494
+
495
+ def revert_max_staleness(value)
496
+ value
497
+ end
498
+
499
+ # Read preference mode transformation.
500
+ #
501
+ # @param [ String ] name Name of the URI option being processed.
502
+ # @param value [String] The read mode string value.
503
+ #
504
+ # @return [Symbol] The read mode symbol.
505
+ def convert_read_mode(name, value)
506
+ READ_MODE_MAP[value.downcase] || value
507
+ end
508
+
509
+ def revert_read_mode(value)
510
+ value.to_s.gsub(/_(\w)/) { $1.upcase }
511
+ end
512
+
513
+ # Read preference tags transformation.
514
+ #
515
+ # @param [ String ] name Name of the URI option being processed.
516
+ # @param value [String] The string representing tag set.
517
+ #
518
+ # @return [Array<Hash>] Array with tag set.
519
+ def convert_read_tags(name, value)
520
+ converted = convert_read_set(name, value)
521
+ if converted
522
+ [converted]
523
+ else
524
+ nil
525
+ end
526
+ end
527
+
528
+ def revert_read_tags(value)
529
+ value
530
+ end
531
+
532
+ # Read preference tag set extractor.
533
+ #
534
+ # @param [ String ] name Name of the URI option being processed.
535
+ # @param value [String] The tag set string.
536
+ #
537
+ # @return [Hash] The tag set hash.
538
+ def convert_read_set(name, value)
539
+ hash_extractor('readPreferenceTags', value)
540
+ end
541
+
542
+ # Converts +value+ as a write concern.
543
+ #
544
+ # If +value+ is the word "majority", returns the symbol :majority.
545
+ # If +value+ is a number, returns the number as an integer.
546
+ # Otherwise returns the string +value+ unchanged.
547
+ #
548
+ # @param [ String ] name Name of the URI option being processed.
549
+ # @param value [ String ] URI option value.
550
+ #
551
+ # @return [ Integer | Symbol | String ] Converted value.
552
+ def convert_w(name, value)
553
+ case value
554
+ when 'majority'
555
+ :majority
556
+ when /\A[0-9]+\z/
557
+ value.to_i
558
+ else
559
+ value
560
+ end
561
+ end
562
+
563
+ def revert_w(value)
564
+ case value
565
+ when Symbol
566
+ value.to_s
567
+ else
568
+ value
569
+ end
570
+ end
571
+
572
+ # Parses the zlib compression level.
573
+ #
574
+ # @param [ String ] name Name of the URI option being processed.
575
+ # @param value [ String ] The zlib compression level string.
576
+ #
577
+ # @return [ Integer | nil ] The compression level value if it is between -1 and 9 (inclusive),
578
+ # otherwise nil (and a warning will be logged).
579
+ def convert_zlib_compression_level(name, value)
580
+ if /\A-?\d+\z/ =~ value
581
+ i = value.to_i
582
+
583
+ if i >= -1 && i <= 9
584
+ return i
585
+ end
586
+ end
587
+
588
+ log_warn("#{value} is not a valid zlibCompressionLevel")
589
+ nil
590
+ end
591
+
592
+ def revert_zlib_compression_level(value)
593
+ value
594
+ end
595
+
596
+ # Extract values from the string and put them into a nested hash.
597
+ #
598
+ # @param [ String ] name Name of the URI option being processed.
599
+ # @param value [ String ] The string to build a hash from.
600
+ #
601
+ # @return [ Hash ] The hash built from the string.
602
+ def hash_extractor(name, value)
603
+ h = {}
604
+ value.split(',').each do |tag|
605
+ k, v = tag.split(':')
606
+ if v.nil?
607
+ log_warn("Invalid hash value for #{name}: key `#{k}` does not have a value: #{value}")
608
+ next
609
+ end
610
+
611
+ h[k.to_sym] = v
612
+ end
613
+ if h.empty?
614
+ nil
615
+ else
616
+ h
617
+ end
618
+ end
619
+
620
+ end
621
+
622
+ end
623
+ end