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
@@ -1,3 +1,6 @@
1
+ # frozen_string_literal: true
2
+ # encoding: utf-8
3
+
1
4
  # Copyright (C) 2014-2020 MongoDB Inc.
2
5
  #
3
6
  # Licensed under the Apache License, Version 2.0 (the "License");
@@ -15,15 +18,15 @@
15
18
  module Mongo
16
19
  class Socket
17
20
 
18
- # Wrapper for SSL sockets.
21
+ # Wrapper for TLS sockets.
19
22
  #
20
23
  # @since 2.0.0
21
24
  class SSL < Socket
22
25
  include OpenSSL
23
26
 
24
- # Initializes a new SSL socket.
27
+ # Initializes a new TLS socket.
25
28
  #
26
- # @example Create the SSL socket.
29
+ # @example Create the TLS socket.
27
30
  # SSL.new('::1', 27017, 30)
28
31
  #
29
32
  # @param [ String ] host The hostname or IP address.
@@ -106,6 +109,8 @@ module Mongo
106
109
  begin
107
110
  @tcp_socket.setsockopt(IPPROTO_TCP, TCP_NODELAY, 1)
108
111
  set_socket_options(@tcp_socket)
112
+ run_tls_context_hooks
113
+
109
114
  connect!
110
115
  rescue
111
116
  @tcp_socket.close
@@ -113,7 +118,7 @@ module Mongo
113
118
  end
114
119
  end
115
120
 
116
- # @return [ SSLContext ] context The ssl context.
121
+ # @return [ SSLContext ] context The TLS context.
117
122
  attr_reader :context
118
123
 
119
124
  # @return [ String ] host The host to connect to.
@@ -149,6 +154,7 @@ module Mongo
149
154
  @socket.connect
150
155
  end
151
156
  verify_certificate!(@socket)
157
+ verify_ocsp_endpoint!(@socket)
152
158
  rescue
153
159
  @socket.close
154
160
  @socket = nil
@@ -177,29 +183,36 @@ module Mongo
177
183
  private
178
184
 
179
185
  def verify_certificate?
180
- @verify_certificate ||=
181
- # If ssl_verify_certificate is not present, disable only if ssl_verify is
182
- # explicitly set to false.
183
- if options[:ssl_verify_certificate].nil?
184
- options[:ssl_verify] != false
185
- # If ssl_verify_certificate is present, enable or disable based on its value.
186
- else
187
- !!options[:ssl_verify_certificate]
188
- end
186
+ # If ssl_verify_certificate is not present, disable only if
187
+ # ssl_verify is explicitly set to false.
188
+ if options[:ssl_verify_certificate].nil?
189
+ options[:ssl_verify] != false
190
+ # If ssl_verify_certificate is present, enable or disable based on its value.
191
+ else
192
+ !!options[:ssl_verify_certificate]
193
+ end
189
194
  end
190
195
 
191
196
  def verify_hostname?
192
- @verify_hostname ||=
193
- # If ssl_verify_hostname is not present, disable only if ssl_verify is
194
- # explicitly set to false.
195
- if options[:ssl_verify_hostname].nil?
196
- options[:ssl_verify] != false
197
- # If ssl_verify_hostname is present, enable or disable based on its value.
198
- else
199
- !!options[:ssl_verify_hostname]
200
- end
197
+ # If ssl_verify_hostname is not present, disable only if ssl_verify is
198
+ # explicitly set to false.
199
+ if options[:ssl_verify_hostname].nil?
200
+ options[:ssl_verify] != false
201
+ # If ssl_verify_hostname is present, enable or disable based on its value.
202
+ else
203
+ !!options[:ssl_verify_hostname]
204
+ end
201
205
  end
202
206
 
207
+ def verify_ocsp_endpoint?
208
+ if !options[:ssl_verify_ocsp_endpoint].nil?
209
+ options[:ssl_verify_ocsp_endpoint] != false
210
+ elsif !options[:ssl_verify_certificate].nil?
211
+ options[:ssl_verify_certificate] != false
212
+ else
213
+ options[:ssl_verify] != false
214
+ end
215
+ end
203
216
 
204
217
  def create_context(options)
205
218
  OpenSSL::SSL::SSLContext.new.tap do |context|
@@ -344,13 +357,26 @@ module Mongo
344
357
  def verify_certificate!(socket)
345
358
  if verify_hostname?
346
359
  unless OpenSSL::SSL.verify_certificate_identity(socket.peer_cert, host_name)
347
- raise Error::SocketError, 'SSL handshake failed due to a hostname mismatch.'
360
+ raise Error::SocketError, 'TLS handshake failed due to a hostname mismatch.'
348
361
  end
349
362
  end
350
363
  end
351
364
 
365
+ def verify_ocsp_endpoint!(socket)
366
+ unless verify_ocsp_endpoint?
367
+ return
368
+ end
369
+
370
+ cert = socket.peer_cert
371
+ ca_cert = socket.peer_cert_chain.last
372
+
373
+ verifier = OcspVerifier.new(@host_name, cert, ca_cert, context.cert_store,
374
+ **Utils.shallow_symbolize_keys(options))
375
+ verifier.verify_with_cache
376
+ end
377
+
352
378
  def read_buffer_size
353
- # Buffer size for SSL reads.
379
+ # Buffer size for TLS reads.
354
380
  # Capped at 16k due to https://linux.die.net/man/3/ssl_read
355
381
  16384
356
382
  end
@@ -358,6 +384,12 @@ module Mongo
358
384
  def human_address
359
385
  "#{host}:#{port} (#{host_name}:#{port}, TLS)"
360
386
  end
387
+
388
+ def run_tls_context_hooks
389
+ Mongo.tls_context_hooks.each do |hook|
390
+ hook.call(@context)
391
+ end
392
+ end
361
393
  end
362
394
  end
363
395
  end
@@ -1,3 +1,6 @@
1
+ # frozen_string_literal: true
2
+ # encoding: utf-8
3
+
1
4
  # Copyright (C) 2014-2020 MongoDB Inc.
2
5
  #
3
6
  # Licensed under the Apache License, Version 2.0 (the "License");
@@ -1,3 +1,6 @@
1
+ # frozen_string_literal: true
2
+ # encoding: utf-8
3
+
1
4
  # Copyright (C) 2014-2020 MongoDB Inc.
2
5
  #
3
6
  # Licensed under the Apache License, Version 2.0 (the "License");
data/lib/mongo/srv.rb CHANGED
@@ -1,3 +1,6 @@
1
+ # frozen_string_literal: true
2
+ # encoding: utf-8
3
+
1
4
  # Copyright (C) 2019-2020 MongoDB Inc.
2
5
  #
3
6
  # Licensed under the Apache License, Version 2.0 (the 'License');
@@ -1,3 +1,6 @@
1
+ # frozen_string_literal: true
2
+ # encoding: utf-8
3
+
1
4
  # Copyright (C) 2014-2020 MongoDB Inc.
2
5
  #
3
6
  # Licensed under the Apache License, Version 2.0 (the "License");
@@ -34,24 +37,18 @@ module Mongo
34
37
  # Creates the SRV monitor.
35
38
  #
36
39
  # @param [ Cluster ] cluster The cluster.
37
- # @param [ Hash ] options The cluster options.
38
40
  #
39
- # @option options [ Float ] :timeout The timeout to use for DNS lookups.
40
- # @option options [ URI::SRVProtocol ] :srv_uri The SRV URI to monitor.
41
- # @option options [ Hash ] :resolv_options For internal driver use only.
41
+ # @option opts [ Float ] :timeout The timeout to use for DNS lookups.
42
+ # @option opts [ URI::SRVProtocol ] :srv_uri The SRV URI to monitor.
43
+ # @option opts [ Hash ] :resolv_options For internal driver use only.
42
44
  # Options to pass through to Resolv::DNS constructor for SRV lookups.
43
- def initialize(cluster, options = nil)
44
- options = if options
45
- options.dup
46
- else
47
- {}
48
- end
45
+ def initialize(cluster, **opts)
49
46
  @cluster = cluster
50
- @resolver = Srv::Resolver.new(options)
51
- unless @srv_uri = options.delete(:srv_uri)
47
+ unless @srv_uri = opts.delete(:srv_uri)
52
48
  raise ArgumentError, 'SRV URI is required'
53
49
  end
54
- @options = options.freeze
50
+ @options = opts.freeze
51
+ @resolver = Srv::Resolver.new(**opts)
55
52
  @last_result = @srv_uri.srv_result
56
53
  @stop_semaphore = Semaphore.new
57
54
  end
@@ -65,11 +62,6 @@ module Mongo
65
62
  # records' TTL values.
66
63
  attr_reader :last_result
67
64
 
68
- def start!
69
- super
70
- ObjectSpace.define_finalizer(self, self.class.finalize(@thread))
71
- end
72
-
73
65
  private
74
66
 
75
67
  def do_work
@@ -103,12 +95,6 @@ module Mongo
103
95
  @cluster.set_server_list(last_result.address_strs)
104
96
  end
105
97
 
106
- def self.finalize(thread)
107
- Proc.new do
108
- thread.kill
109
- end
110
- end
111
-
112
98
  def scan_interval
113
99
  if last_result.empty?
114
100
  [cluster.heartbeat_interval, MIN_SCAN_INTERVAL].min
@@ -1,3 +1,6 @@
1
+ # frozen_string_literal: true
2
+ # encoding: utf-8
3
+
1
4
  # Copyright (C) 2017-2020 MongoDB Inc.
2
5
  #
3
6
  # Licensed under the Apache License, Version 2.0 (the 'License');
@@ -28,20 +31,24 @@ module Mongo
28
31
 
29
32
  # Creates a new Resolver.
30
33
  #
31
- # @param [ Hash ] options The options for the resolver.
32
- #
33
- # @option options [ Boolean ] :raise_on_invalid Whether or not to raise
34
+ # @option opts [ Float ] :timeout The timeout, in seconds, to use for
35
+ # each DNS record resolution.
36
+ # @option opts [ Boolean ] :raise_on_invalid Whether or not to raise
34
37
  # an exception if either a record with a mismatched domain is found
35
38
  # or if no records are found. Defaults to true.
36
- # @option options [ Hash ] :resolv_options For internal driver use only.
39
+ # @option opts [ Hash ] :resolv_options For internal driver use only.
37
40
  # Options to pass through to Resolv::DNS constructor for SRV lookups.
38
- def initialize(options = nil)
39
- @options = if options
40
- options.dup
41
- else
42
- {}
43
- end.freeze
41
+ def initialize(**opts)
42
+ @options = opts.freeze
44
43
  @resolver = Resolv::DNS.new(@options[:resolv_options])
44
+ @resolver.timeouts = timeout
45
+ end
46
+
47
+ # @return [ Hash ] Resolver options.
48
+ attr_reader :options
49
+
50
+ def timeout
51
+ options[:timeout] || Monitor::DEFAULT_TIMEOUT
45
52
  end
46
53
 
47
54
  # Obtains all of the SRV records for a given hostname.
@@ -1,3 +1,6 @@
1
+ # frozen_string_literal: true
2
+ # encoding: utf-8
3
+
1
4
  # Copyright (C) 2017-2020 MongoDB Inc.
2
5
  #
3
6
  # Licensed under the Apache License, Version 2.0 (the 'License');
data/lib/mongo/timeout.rb CHANGED
@@ -1,3 +1,6 @@
1
+ # frozen_string_literal: true
2
+ # encoding: utf-8
3
+
1
4
  # Copyright (C) 2020 MongoDB Inc.
2
5
  #
3
6
  # Licensed under the Apache License, Version 2.0 (the "License");
@@ -13,6 +16,8 @@
13
16
  # limitations under the License.
14
17
 
15
18
  module Mongo
19
+
20
+ # @api private
16
21
  module Timeout
17
22
 
18
23
  # A wrapper around Ruby core's Timeout::timeout method that provides
@@ -1,3 +1,6 @@
1
+ # frozen_string_literal: true
2
+ # encoding: utf-8
3
+
1
4
  # Copyright (C) 2020 MongoDB Inc.
2
5
  #
3
6
  # Licensed under the Apache License, Version 2.0 (the "License");
@@ -14,7 +17,7 @@
14
17
 
15
18
  module Mongo
16
19
  # TopologyVersion encapsulates the topologyVersion document obtained from
17
- # ismaster responses and not master-like OperationFailure errors.
20
+ # hello responses and not master-like OperationFailure errors.
18
21
  #
19
22
  # @api private
20
23
  class TopologyVersion < BSON::Document
data/lib/mongo/uri.rb CHANGED
@@ -1,3 +1,6 @@
1
+ # frozen_string_literal: true
2
+ # encoding: utf-8
3
+
1
4
  # Copyright (C) 2014-2020 MongoDB Inc.
2
5
  #
3
6
  # Licensed under the Apache License, Version 2.0 (the 'License');
@@ -388,6 +391,12 @@ module Mongo
388
391
  [ creds_hosts, db_opts ].map { |s| s.reverse }
389
392
  end
390
393
 
394
+ def options_mapper
395
+ @options_mapper ||= OptionsMapper.new(
396
+ logger: @options[:logger],
397
+ )
398
+ end
399
+
391
400
  def parse_uri_options!(string)
392
401
  uri_options = {}
393
402
  unless string
@@ -403,7 +412,7 @@ module Mongo
403
412
  end
404
413
  key = decode(key)
405
414
  value = decode(value)
406
- add_uri_option(key, value, uri_options)
415
+ options_mapper.add_uri_option(key, value, uri_options)
407
416
  end
408
417
  uri_options
409
418
  end
@@ -453,393 +462,6 @@ module Mongo
453
462
  CGI.escape(value).gsub('+', '%20')
454
463
  end
455
464
 
456
- # Hash for storing map of URI option parameters to conversion strategies
457
- URI_OPTION_MAP = {}
458
-
459
- # Simple internal dsl to register a MongoDB URI option in the URI_OPTION_MAP.
460
- #
461
- # @param uri_key [String] The MongoDB URI option to register.
462
- # @param name [Symbol] The name of the option in the driver.
463
- # @param extra [Hash] Extra options.
464
- # * :group [Symbol] Nested hash where option will go.
465
- # * :type [Symbol] Name of function to transform value.
466
- def self.uri_option(uri_key, name, extra = {})
467
- URI_OPTION_MAP[uri_key] = { :name => name }.merge(extra)
468
- end
469
-
470
- # Replica Set Options
471
- uri_option 'replicaset', :replica_set
472
-
473
- # Timeout Options
474
- uri_option 'connecttimeoutms', :connect_timeout, :type => :ms
475
- uri_option 'sockettimeoutms', :socket_timeout, :type => :ms
476
- uri_option 'serverselectiontimeoutms', :server_selection_timeout, :type => :ms
477
- uri_option 'localthresholdms', :local_threshold, :type => :ms
478
- uri_option 'heartbeatfrequencyms', :heartbeat_frequency, :type => :ms
479
- uri_option 'maxidletimems', :max_idle_time, :type => :ms
480
-
481
- # Write Options
482
- uri_option 'w', :w, :group => :write_concern, type: :w
483
- uri_option 'journal', :j, :group => :write_concern, :type => :bool
484
- uri_option 'fsync', :fsync, :group => :write_concern, type: :bool
485
- uri_option 'wtimeoutms', :wtimeout, :group => :write_concern, :type => :integer
486
-
487
- # Read Options
488
- uri_option 'readpreference', :mode, :group => :read, :type => :read_mode
489
- uri_option 'readpreferencetags', :tag_sets, :group => :read, :type => :read_tags
490
- uri_option 'maxstalenessseconds', :max_staleness, :group => :read, :type => :max_staleness
491
-
492
- # Pool options
493
- uri_option 'minpoolsize', :min_pool_size, :type => :integer
494
- uri_option 'maxpoolsize', :max_pool_size, :type => :integer
495
- uri_option 'waitqueuetimeoutms', :wait_queue_timeout, :type => :ms
496
-
497
- # Security Options
498
- uri_option 'ssl', :ssl, :type => :repeated_bool
499
- uri_option 'tls', :ssl, :type => :repeated_bool
500
- uri_option 'tlsallowinvalidcertificates', :ssl_verify_certificate,
501
- :type => :inverse_bool
502
- uri_option 'tlsallowinvalidhostnames', :ssl_verify_hostname,
503
- :type => :inverse_bool
504
- uri_option 'tlscafile', :ssl_ca_cert
505
- uri_option 'tlscertificatekeyfile', :ssl_cert
506
- uri_option 'tlscertificatekeyfilepassword', :ssl_key_pass_phrase
507
- uri_option 'tlsinsecure', :ssl_verify, :type => :inverse_bool
508
-
509
- # Topology options
510
- uri_option 'directconnection', :direct_connection, type: :bool
511
- uri_option 'connect', :connect, type: :symbol
512
-
513
- # Auth Options
514
- uri_option 'authsource', :auth_source
515
- uri_option 'authmechanism', :auth_mech, :type => :auth_mech
516
- uri_option 'authmechanismproperties', :auth_mech_properties, :type => :auth_mech_props
517
-
518
- # Client Options
519
- uri_option 'appname', :app_name
520
- uri_option 'compressors', :compressors, :type => :array
521
- uri_option 'readconcernlevel', :level, group: :read_concern, type: :symbol
522
- uri_option 'retryreads', :retry_reads, :type => :bool
523
- uri_option 'retrywrites', :retry_writes, :type => :bool
524
- uri_option 'zlibcompressionlevel', :zlib_compression_level, :type => :zlib_compression_level
525
-
526
- # Applies URI value transformation by either using the default cast
527
- # or a transformation appropriate for the given type.
528
- #
529
- # @param key [String] URI option name.
530
- # @param value [String] The value to be transformed.
531
- # @param type [Symbol] The transform method.
532
- def apply_transform(key, value, type)
533
- if type
534
- if respond_to?("convert_#{type}", true)
535
- send("convert_#{type}", key, value)
536
- else
537
- send(type, value)
538
- end
539
- else
540
- value
541
- end
542
- end
543
-
544
- # Selects the output destination for an option.
545
- #
546
- # @param [Hash] uri_options The base target.
547
- # @param [Symbol] group Group subtarget.
548
- #
549
- # @return [Hash] The target for the option.
550
- def select_target(uri_options, group = nil)
551
- if group
552
- uri_options[group] ||= {}
553
- else
554
- uri_options
555
- end
556
- end
557
-
558
- # Merges a new option into the target.
559
- #
560
- # If the option exists at the target destination the merge will
561
- # be an addition.
562
- #
563
- # Specifically required to append an additional tag set
564
- # to the array of tag sets without overwriting the original.
565
- #
566
- # @param target [Hash] The destination.
567
- # @param value [Object] The value to be merged.
568
- # @param name [Symbol] The name of the option.
569
- def merge_uri_option(target, value, name)
570
- if target.key?(name)
571
- if REPEATABLE_OPTIONS.include?(name)
572
- target[name] += value
573
- else
574
- log_warn("Repeated option key: #{name}.")
575
- end
576
- else
577
- target.merge!(name => value)
578
- end
579
- end
580
-
581
- # Adds an option to the uri options hash via the supplied strategy.
582
- #
583
- # Acquires a target for the option based on group.
584
- # Transforms the value.
585
- # Merges the option into the target.
586
- #
587
- # @param key [String] URI option name.
588
- # @param value [String] The value of the option.
589
- # @param uri_options [Hash] The base option target.
590
- def add_uri_option(key, value, uri_options)
591
- strategy = URI_OPTION_MAP[key.downcase]
592
- if strategy.nil?
593
- log_warn("Unsupported URI option '#{key}' on URI '#{@string}'. It will be ignored.")
594
- return
595
- end
596
-
597
- target = select_target(uri_options, strategy[:group])
598
- value = apply_transform(key, value, strategy[:type])
599
- merge_uri_option(target, value, strategy[:name])
600
- end
601
-
602
- # Authentication mechanism transformation.
603
- #
604
- # @param value [String] The authentication mechanism.
605
- #
606
- # @return [Symbol] The transformed authentication mechanism.
607
- def auth_mech(value)
608
- (AUTH_MECH_MAP[value.upcase] || value).tap do |mech|
609
- log_warn("#{value} is not a valid auth mechanism") unless mech
610
- end
611
- end
612
-
613
- # Read preference mode transformation.
614
- #
615
- # @param value [String] The read mode string value.
616
- #
617
- # @return [Symbol] The read mode symbol.
618
- def read_mode(value)
619
- READ_MODE_MAP[value.downcase] || value
620
- end
621
-
622
- # Read preference tags transformation.
623
- #
624
- # @param value [String] The string representing tag set.
625
- #
626
- # @return [Array<Hash>] Array with tag set.
627
- def read_tags(value)
628
- [read_set(value)]
629
- end
630
-
631
- # Read preference tag set extractor.
632
- #
633
- # @param value [String] The tag set string.
634
- #
635
- # @return [Hash] The tag set hash.
636
- def read_set(value)
637
- hash_extractor('readPreferenceTags', value)
638
- end
639
-
640
- # Auth mechanism properties extractor.
641
- #
642
- # @param value [ String ] The auth mechanism properties string.
643
- #
644
- # @return [ Hash ] The auth mechanism properties hash.
645
- def auth_mech_props(value)
646
- properties = hash_extractor('authMechanismProperties', value)
647
- if properties && properties[:canonicalize_host_name]
648
- properties.merge!(canonicalize_host_name:
649
- properties[:canonicalize_host_name].downcase == 'true')
650
- end
651
- properties
652
- end
653
-
654
- # Parses the zlib compression level.
655
- #
656
- # @param value [ String ] The zlib compression level string.
657
- #
658
- # @return [ Integer | nil ] The compression level value if it is between -1 and 9 (inclusive),
659
- # otherwise nil (and a warning will be logged).
660
- def zlib_compression_level(value)
661
- if /\A-?\d+\z/ =~ value
662
- i = value.to_i
663
-
664
- if i >= -1 && i <= 9
665
- return i
666
- end
667
- end
668
-
669
- log_warn("#{value} is not a valid zlibCompressionLevel")
670
- nil
671
- end
672
-
673
- # Converts the value into a boolean and returns it wrapped in an array.
674
- #
675
- # @param name [ String ] Name of the URI option being processed.
676
- # @param value [ String ] URI option value.
677
- #
678
- # @return [ Array<true | false> ] The boolean value parsed and wraped
679
- # in an array.
680
- def convert_repeated_bool(name, value)
681
- [convert_bool(name, value)]
682
- end
683
-
684
- # Converts +value+ into an integer.
685
- #
686
- # If the value is not a valid integer, warns and returns nil.
687
- #
688
- # @param name [ String ] Name of the URI option being processed.
689
- # @param value [ String ] URI option value.
690
- #
691
- # @return [ nil | Integer ] Converted value.
692
- def convert_integer(name, value)
693
- unless /\A\d+\z/ =~ value
694
- log_warn("#{value} is not a valid integer for #{name}")
695
- return nil
696
- end
697
-
698
- value.to_i
699
- end
700
-
701
- # Converts +value+ into a symbol.
702
- #
703
- # @param name [ String ] Name of the URI option being processed.
704
- # @param value [ String ] URI option value.
705
- #
706
- # @return [ Symbol ] Converted value.
707
- def convert_symbol(name, value)
708
- value.to_sym
709
- end
710
-
711
- # Converts +value+ as a write concern.
712
- #
713
- # If +value+ is the word "majority", returns the symbol :majority.
714
- # If +value+ is a number, returns the number as an integer.
715
- # Otherwise returns the string +value+ unchanged.
716
- #
717
- # @param name [ String ] Name of the URI option being processed.
718
- # @param value [ String ] URI option value.
719
- #
720
- # @return [ Integer | Symbol | String ] Converted value.
721
- def convert_w(name, value)
722
- case value
723
- when 'majority'
724
- :majority
725
- when /\A[0-9]+\z/
726
- value.to_i
727
- else
728
- value
729
- end
730
- end
731
-
732
- # Converts +value+ to a boolean.
733
- #
734
- # Returns true for 'true', false for 'false', otherwise nil.
735
- #
736
- # @param name [ String ] Name of the URI option being processed.
737
- # @param value [ String ] URI option value.
738
- #
739
- # @return [ true | false | nil ] Converted value.
740
- def convert_bool(name, value)
741
- case value
742
- when "true", 'TRUE'
743
- true
744
- when "false", 'FALSE'
745
- false
746
- else
747
- log_warn("invalid boolean option for #{name}: #{value}")
748
- nil
749
- end
750
- end
751
-
752
- # Parses a boolean value and returns its inverse.
753
- #
754
- # @param value [ String ] The URI option value.
755
- #
756
- # @return [ true | false | nil ] The inverse of the boolean value parsed out, otherwise nil
757
- # (and a warning will be logged).
758
- def convert_inverse_bool(name, value)
759
- b = convert_bool(name, value)
760
-
761
- if b.nil?
762
- nil
763
- else
764
- !b
765
- end
766
- end
767
-
768
- # Parses the max staleness value, which must be either "0" or an integer greater or equal to 90.
769
- #
770
- # @param value [ String ] The max staleness string.
771
- #
772
- # @return [ Integer | nil ] The max staleness integer parsed out if it is valid, otherwise nil
773
- # (and a warning will be logged).
774
- def max_staleness(value)
775
- if /\A-?\d+\z/ =~ value
776
- int = value.to_i
777
-
778
- if int == -1
779
- int = nil
780
- end
781
-
782
- if int && (int >= 0 && int < 90 || int < 0)
783
- log_warn("max staleness should be either 0 or greater than 90: #{value}")
784
- end
785
-
786
- return int
787
- end
788
-
789
- log_warn("Invalid max staleness value: #{value}")
790
- nil
791
- end
792
-
793
- # Ruby's convention is to provide timeouts in seconds, not milliseconds and
794
- # to use fractions where more precision is necessary. The connection string
795
- # options are always in MS so we provide an easy conversion type.
796
- #
797
- # @param [ Integer ] value The millisecond value.
798
- #
799
- # @return [ Float ] The seconds value.
800
- #
801
- # @since 2.0.0
802
- def convert_ms(name, value)
803
- unless /\A-?\d+(\.\d+)?\z/ =~ value
804
- log_warn("Invalid ms value for #{name}: #{value}")
805
- return nil
806
- end
807
-
808
- if value[0] == '-'
809
- log_warn("#{name} cannot be a negative number")
810
- return nil
811
- end
812
-
813
- value.to_f / 1000
814
- end
815
-
816
- # Extract values from the string and put them into a nested hash.
817
- #
818
- # @param value [ String ] The string to build a hash from.
819
- #
820
- # @return [ Hash ] The hash built from the string.
821
- def hash_extractor(name, value)
822
- h = {}
823
- value.split(',').each do |tag|
824
- k, v = tag.split(':')
825
- if v.nil?
826
- log_warn("Invalid hash value for #{name}: key `#{k}` does not have a value: #{value}")
827
- end
828
-
829
- h[k.downcase.to_sym] = v
830
- end
831
- h
832
- end
833
-
834
- # Extract values from the string and put them into an array.
835
- #
836
- # @param [ String ] value The string to build an array from.
837
- #
838
- # @return [ Array ] The array built from the string.
839
- def array(value)
840
- value.split(',')
841
- end
842
-
843
465
  def validate_uri_options!
844
466
  # The URI options spec requires that we raise an error if there are conflicting values of
845
467
  # 'tls' and 'ssl'. In order to fulfill this, we parse the values of each instance into an
@@ -861,10 +483,21 @@ module Mongo
861
483
  unless uri_options[:ssl_verify_hostname].nil?
862
484
  raise_invalid_error_no_fmt!("tlsInsecure' and 'tlsAllowInvalidHostnames' cannot both be specified")
863
485
  end
486
+
487
+ unless uri_options[:ssl_verify_ocsp_endpoint].nil?
488
+ raise_invalid_error_no_fmt!("tlsInsecure' and 'tlsDisableOCSPEndpointCheck' cannot both be specified")
489
+ end
490
+ end
491
+
492
+ unless uri_options[:ssl_verify_certificate].nil?
493
+ unless uri_options[:ssl_verify_ocsp_endpoint].nil?
494
+ raise_invalid_error_no_fmt!("tlsAllowInvalidCertificates' and 'tlsDisableOCSPEndpointCheck' cannot both be specified")
495
+ end
864
496
  end
865
497
 
866
- # Since we know that the only URI option that sets :ssl_cert is "tlsCertificateKeyFile", any
867
- # value set for :ssl_cert must also be set for :ssl_key.
498
+ # Since we know that the only URI option that sets :ssl_cert is
499
+ # "tlsCertificateKeyFile", any value set for :ssl_cert must also be set
500
+ # for :ssl_key.
868
501
  if uri_options[:ssl_cert]
869
502
  uri_options[:ssl_key] = uri_options[:ssl_cert]
870
503
  end
@@ -891,4 +524,5 @@ module Mongo
891
524
  end
892
525
  end
893
526
 
527
+ require 'mongo/uri/options_mapper'
894
528
  require 'mongo/uri/srv_protocol'