mongo 2.18.2 → 2.19.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 (1133) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data/README.md +12 -2
  4. data/Rakefile +4 -3
  5. data/bin/mongo_console +2 -0
  6. data/lib/mongo/active_support.rb +1 -1
  7. data/lib/mongo/address/ipv4.rb +1 -1
  8. data/lib/mongo/address/ipv6.rb +1 -1
  9. data/lib/mongo/address/unix.rb +1 -1
  10. data/lib/mongo/address/validator.rb +1 -1
  11. data/lib/mongo/address.rb +1 -1
  12. data/lib/mongo/auth/aws/conversation.rb +1 -5
  13. data/lib/mongo/auth/aws/credentials.rb +38 -0
  14. data/lib/mongo/auth/aws/credentials_cache.rb +75 -0
  15. data/lib/mongo/auth/aws/credentials_retriever.rb +172 -37
  16. data/lib/mongo/auth/aws/request.rb +1 -2
  17. data/lib/mongo/auth/aws.rb +6 -6
  18. data/lib/mongo/auth/base.rb +1 -1
  19. data/lib/mongo/auth/conversation_base.rb +1 -1
  20. data/lib/mongo/auth/cr/conversation.rb +1 -1
  21. data/lib/mongo/auth/cr.rb +1 -1
  22. data/lib/mongo/auth/credential_cache.rb +1 -1
  23. data/lib/mongo/auth/gssapi/conversation.rb +1 -1
  24. data/lib/mongo/auth/gssapi.rb +1 -1
  25. data/lib/mongo/auth/ldap/conversation.rb +1 -1
  26. data/lib/mongo/auth/ldap.rb +1 -1
  27. data/lib/mongo/auth/roles.rb +17 -17
  28. data/lib/mongo/auth/sasl_conversation_base.rb +1 -1
  29. data/lib/mongo/auth/scram/conversation.rb +1 -1
  30. data/lib/mongo/auth/scram.rb +1 -1
  31. data/lib/mongo/auth/scram256/conversation.rb +1 -1
  32. data/lib/mongo/auth/scram256.rb +1 -1
  33. data/lib/mongo/auth/scram_conversation_base.rb +1 -1
  34. data/lib/mongo/auth/stringprep/profiles/sasl.rb +1 -1
  35. data/lib/mongo/auth/stringprep/tables.rb +1 -1
  36. data/lib/mongo/auth/stringprep/unicode_normalize/normalize.rb +1 -1
  37. data/lib/mongo/auth/stringprep/unicode_normalize/tables.rb +2 -1
  38. data/lib/mongo/auth/stringprep.rb +1 -1
  39. data/lib/mongo/auth/user/view.rb +1 -1
  40. data/lib/mongo/auth/user.rb +1 -1
  41. data/lib/mongo/auth/x509/conversation.rb +1 -1
  42. data/lib/mongo/auth/x509.rb +1 -1
  43. data/lib/mongo/auth.rb +1 -1
  44. data/lib/mongo/background_thread.rb +1 -1
  45. data/lib/mongo/bson.rb +1 -1
  46. data/lib/mongo/bulk_write/combineable.rb +1 -1
  47. data/lib/mongo/bulk_write/ordered_combiner.rb +1 -1
  48. data/lib/mongo/bulk_write/result.rb +1 -1
  49. data/lib/mongo/bulk_write/result_combiner.rb +1 -1
  50. data/lib/mongo/bulk_write/transformable.rb +1 -1
  51. data/lib/mongo/bulk_write/unordered_combiner.rb +1 -1
  52. data/lib/mongo/bulk_write/validatable.rb +1 -1
  53. data/lib/mongo/bulk_write.rb +1 -1
  54. data/lib/mongo/caching_cursor.rb +1 -1
  55. data/lib/mongo/client.rb +27 -4
  56. data/lib/mongo/client_encryption.rb +102 -1
  57. data/lib/mongo/cluster/periodic_executor.rb +1 -1
  58. data/lib/mongo/cluster/reapers/cursor_reaper.rb +2 -6
  59. data/lib/mongo/cluster/reapers/socket_reaper.rb +2 -2
  60. data/lib/mongo/cluster/sdam_flow.rb +42 -15
  61. data/lib/mongo/cluster/topology/base.rb +1 -1
  62. data/lib/mongo/cluster/topology/load_balanced.rb +1 -1
  63. data/lib/mongo/cluster/topology/no_replica_set_options.rb +1 -1
  64. data/lib/mongo/cluster/topology/replica_set_no_primary.rb +1 -1
  65. data/lib/mongo/cluster/topology/replica_set_with_primary.rb +1 -1
  66. data/lib/mongo/cluster/topology/sharded.rb +1 -1
  67. data/lib/mongo/cluster/topology/single.rb +1 -1
  68. data/lib/mongo/cluster/topology/unknown.rb +1 -1
  69. data/lib/mongo/cluster/topology.rb +1 -1
  70. data/lib/mongo/cluster.rb +29 -12
  71. data/lib/mongo/cluster_time.rb +1 -1
  72. data/lib/mongo/collection/helpers.rb +1 -1
  73. data/lib/mongo/collection/queryable_encryption.rb +83 -43
  74. data/lib/mongo/collection/view/aggregation.rb +1 -1
  75. data/lib/mongo/collection/view/builder/aggregation.rb +1 -1
  76. data/lib/mongo/collection/view/builder/map_reduce.rb +1 -1
  77. data/lib/mongo/collection/view/builder.rb +1 -1
  78. data/lib/mongo/collection/view/change_stream/retryable.rb +1 -1
  79. data/lib/mongo/collection/view/change_stream.rb +3 -3
  80. data/lib/mongo/collection/view/explainable.rb +1 -1
  81. data/lib/mongo/collection/view/immutable.rb +1 -1
  82. data/lib/mongo/collection/view/iterable.rb +1 -1
  83. data/lib/mongo/collection/view/map_reduce.rb +1 -1
  84. data/lib/mongo/collection/view/readable.rb +11 -12
  85. data/lib/mongo/collection/view/writable.rb +1 -1
  86. data/lib/mongo/collection/view.rb +1 -1
  87. data/lib/mongo/collection.rb +26 -11
  88. data/lib/mongo/condition_variable.rb +58 -0
  89. data/lib/mongo/config/options.rb +1 -0
  90. data/lib/mongo/config/validators/option.rb +1 -0
  91. data/lib/mongo/config.rb +1 -0
  92. data/lib/mongo/crypt/auto_decryption_context.rb +1 -1
  93. data/lib/mongo/crypt/auto_encrypter.rb +5 -3
  94. data/lib/mongo/crypt/auto_encryption_context.rb +1 -1
  95. data/lib/mongo/crypt/binary.rb +1 -1
  96. data/lib/mongo/crypt/binding.rb +224 -30
  97. data/lib/mongo/crypt/context.rb +67 -4
  98. data/lib/mongo/crypt/data_key_context.rb +1 -1
  99. data/lib/mongo/crypt/encryption_io.rb +2 -2
  100. data/lib/mongo/crypt/explicit_decryption_context.rb +1 -1
  101. data/lib/mongo/crypt/explicit_encrypter.rb +120 -34
  102. data/lib/mongo/crypt/explicit_encryption_context.rb +58 -27
  103. data/lib/mongo/crypt/explicit_encryption_expression_context.rb +30 -0
  104. data/lib/mongo/crypt/handle.rb +10 -2
  105. data/lib/mongo/crypt/hooks.rb +1 -1
  106. data/lib/mongo/crypt/kms/aws/credentials.rb +83 -0
  107. data/lib/mongo/crypt/kms/aws/master_document.rb +78 -0
  108. data/lib/mongo/crypt/kms/aws.rb +3 -119
  109. data/lib/mongo/crypt/kms/azure/access_token.rb +54 -0
  110. data/lib/mongo/crypt/kms/azure/credentials.rb +103 -0
  111. data/lib/mongo/crypt/kms/azure/credentials_retriever.rb +122 -0
  112. data/lib/mongo/crypt/kms/azure/master_document.rb +79 -0
  113. data/lib/mongo/crypt/kms/azure.rb +5 -128
  114. data/lib/mongo/crypt/kms/credentials.rb +17 -2
  115. data/lib/mongo/crypt/kms/gcp/credentials.rb +127 -0
  116. data/lib/mongo/crypt/kms/gcp/credentials_retriever.rb +58 -0
  117. data/lib/mongo/crypt/kms/gcp/master_document.rb +99 -0
  118. data/lib/mongo/crypt/kms/gcp.rb +4 -172
  119. data/lib/mongo/crypt/kms/kmip/credentials.rb +68 -0
  120. data/lib/mongo/crypt/kms/kmip/master_document.rb +74 -0
  121. data/lib/mongo/crypt/kms/kmip.rb +3 -100
  122. data/lib/mongo/crypt/kms/local/credentials.rb +65 -0
  123. data/lib/mongo/crypt/kms/local/master_document.rb +43 -0
  124. data/lib/mongo/crypt/kms/local.rb +3 -66
  125. data/lib/mongo/crypt/kms/master_key_document.rb +1 -1
  126. data/lib/mongo/crypt/kms.rb +7 -1
  127. data/lib/mongo/crypt/kms_context.rb +1 -1
  128. data/lib/mongo/crypt/rewrap_many_data_key_context.rb +1 -1
  129. data/lib/mongo/crypt/rewrap_many_data_key_result.rb +1 -1
  130. data/lib/mongo/crypt/status.rb +1 -1
  131. data/lib/mongo/crypt.rb +13 -1
  132. data/lib/mongo/cursor/kill_spec.rb +1 -1
  133. data/lib/mongo/cursor.rb +40 -6
  134. data/lib/mongo/database/view.rb +41 -4
  135. data/lib/mongo/database.rb +2 -2
  136. data/lib/mongo/dbref.rb +1 -1
  137. data/lib/mongo/distinguishing_semaphore.rb +2 -2
  138. data/lib/mongo/error/auth_error.rb +1 -1
  139. data/lib/mongo/error/bad_load_balancer_target.rb +1 -1
  140. data/lib/mongo/error/bulk_write_error.rb +1 -1
  141. data/lib/mongo/error/change_stream_resumable.rb +1 -1
  142. data/lib/mongo/error/client_closed.rb +24 -0
  143. data/lib/mongo/error/closed_stream.rb +1 -1
  144. data/lib/mongo/error/connection_check_out_timeout.rb +1 -1
  145. data/lib/mongo/error/connection_perished.rb +3 -1
  146. data/lib/mongo/error/connection_unavailable.rb +27 -0
  147. data/lib/mongo/error/credential_check_error.rb +1 -1
  148. data/lib/mongo/error/crypt_error.rb +1 -1
  149. data/lib/mongo/error/extra_file_chunk.rb +1 -1
  150. data/lib/mongo/error/failed_string_prep_validation.rb +1 -1
  151. data/lib/mongo/error/file_not_found.rb +1 -1
  152. data/lib/mongo/error/handshake_error.rb +1 -1
  153. data/lib/mongo/error/insufficient_iteration_count.rb +1 -1
  154. data/lib/mongo/error/internal_driver_error.rb +1 -1
  155. data/lib/mongo/error/invalid_address.rb +1 -1
  156. data/lib/mongo/error/invalid_application_name.rb +1 -1
  157. data/lib/mongo/error/invalid_bulk_operation.rb +1 -1
  158. data/lib/mongo/error/invalid_bulk_operation_type.rb +1 -1
  159. data/lib/mongo/error/invalid_collection_name.rb +1 -1
  160. data/lib/mongo/error/invalid_config_option.rb +1 -0
  161. data/lib/mongo/error/invalid_cursor_operation.rb +1 -1
  162. data/lib/mongo/error/invalid_database_name.rb +1 -1
  163. data/lib/mongo/error/invalid_document.rb +1 -1
  164. data/lib/mongo/error/invalid_file.rb +1 -1
  165. data/lib/mongo/error/invalid_file_revision.rb +1 -1
  166. data/lib/mongo/error/invalid_min_pool_size.rb +1 -1
  167. data/lib/mongo/error/invalid_nonce.rb +1 -1
  168. data/lib/mongo/error/invalid_read_concern.rb +1 -1
  169. data/lib/mongo/error/invalid_read_option.rb +1 -1
  170. data/lib/mongo/error/invalid_replacement_document.rb +1 -1
  171. data/lib/mongo/error/invalid_server_auth_host.rb +1 -1
  172. data/lib/mongo/error/invalid_server_auth_response.rb +1 -1
  173. data/lib/mongo/error/invalid_server_preference.rb +1 -1
  174. data/lib/mongo/error/invalid_session.rb +1 -1
  175. data/lib/mongo/error/invalid_signature.rb +1 -1
  176. data/lib/mongo/error/invalid_transaction_operation.rb +1 -1
  177. data/lib/mongo/error/invalid_txt_record.rb +1 -1
  178. data/lib/mongo/error/invalid_update_document.rb +1 -1
  179. data/lib/mongo/error/invalid_uri.rb +1 -1
  180. data/lib/mongo/error/invalid_write_concern.rb +1 -1
  181. data/lib/mongo/error/kms_error.rb +1 -1
  182. data/lib/mongo/error/labelable.rb +1 -1
  183. data/lib/mongo/error/lint_error.rb +1 -1
  184. data/lib/mongo/error/max_bson_size.rb +1 -1
  185. data/lib/mongo/error/max_message_size.rb +1 -1
  186. data/lib/mongo/error/mismatched_domain.rb +1 -1
  187. data/lib/mongo/error/missing_connection.rb +4 -2
  188. data/lib/mongo/error/missing_file_chunk.rb +1 -1
  189. data/lib/mongo/error/missing_password.rb +1 -1
  190. data/lib/mongo/error/missing_resume_token.rb +1 -1
  191. data/lib/mongo/error/missing_scram_server_signature.rb +1 -1
  192. data/lib/mongo/error/missing_service_id.rb +1 -1
  193. data/lib/mongo/error/mongocryptd_spawn_error.rb +1 -1
  194. data/lib/mongo/error/multi_index_drop.rb +1 -1
  195. data/lib/mongo/error/need_primary_server.rb +1 -1
  196. data/lib/mongo/error/no_server_available.rb +1 -1
  197. data/lib/mongo/error/no_service_connection_available.rb +1 -1
  198. data/lib/mongo/error/no_srv_records.rb +1 -1
  199. data/lib/mongo/error/notable.rb +8 -1
  200. data/lib/mongo/error/operation_failure.rb +1 -1
  201. data/lib/mongo/error/parser.rb +1 -1
  202. data/lib/mongo/error/pool_cleared_error.rb +40 -0
  203. data/lib/mongo/error/pool_closed_error.rb +4 -17
  204. data/lib/mongo/error/pool_error.rb +45 -0
  205. data/lib/mongo/error/pool_paused_error.rb +40 -0
  206. data/lib/mongo/error/raise_original_error.rb +1 -1
  207. data/lib/mongo/error/read_write_retryable.rb +1 -1
  208. data/lib/mongo/error/sdam_error_detection.rb +1 -1
  209. data/lib/mongo/error/server_api_conflict.rb +1 -1
  210. data/lib/mongo/error/server_api_not_supported.rb +1 -1
  211. data/lib/mongo/error/server_certificate_revoked.rb +1 -1
  212. data/lib/mongo/error/server_not_usable.rb +36 -0
  213. data/lib/mongo/error/session_ended.rb +1 -1
  214. data/lib/mongo/error/session_not_materialized.rb +1 -1
  215. data/lib/mongo/error/sessions_not_supported.rb +1 -1
  216. data/lib/mongo/error/snapshot_session_invalid_server_version.rb +1 -1
  217. data/lib/mongo/error/snapshot_session_transaction_prohibited.rb +1 -1
  218. data/lib/mongo/error/socket_error.rb +1 -1
  219. data/lib/mongo/error/socket_timeout_error.rb +1 -1
  220. data/lib/mongo/error/unchangeable_collection_option.rb +1 -1
  221. data/lib/mongo/error/unexpected_chunk_length.rb +1 -1
  222. data/lib/mongo/error/unexpected_response.rb +1 -1
  223. data/lib/mongo/error/unknown_payload_type.rb +1 -1
  224. data/lib/mongo/error/unmet_dependency.rb +1 -1
  225. data/lib/mongo/error/unsupported_array_filters.rb +1 -1
  226. data/lib/mongo/error/unsupported_collation.rb +1 -1
  227. data/lib/mongo/error/unsupported_features.rb +1 -1
  228. data/lib/mongo/error/unsupported_message_type.rb +1 -1
  229. data/lib/mongo/error/unsupported_option.rb +1 -1
  230. data/lib/mongo/error/write_retryable.rb +1 -1
  231. data/lib/mongo/error.rb +7 -1
  232. data/lib/mongo/event/base.rb +1 -1
  233. data/lib/mongo/event/listeners.rb +1 -1
  234. data/lib/mongo/event/publisher.rb +1 -1
  235. data/lib/mongo/event/subscriber.rb +1 -1
  236. data/lib/mongo/event.rb +1 -1
  237. data/lib/mongo/grid/file/chunk.rb +3 -2
  238. data/lib/mongo/grid/file/info.rb +3 -2
  239. data/lib/mongo/grid/file.rb +1 -1
  240. data/lib/mongo/grid/fs_bucket.rb +1 -1
  241. data/lib/mongo/grid/stream/read.rb +1 -1
  242. data/lib/mongo/grid/stream/write.rb +1 -1
  243. data/lib/mongo/grid/stream.rb +1 -1
  244. data/lib/mongo/grid.rb +1 -1
  245. data/lib/mongo/id.rb +1 -1
  246. data/lib/mongo/index/view.rb +1 -1
  247. data/lib/mongo/index.rb +1 -1
  248. data/lib/mongo/lint.rb +1 -1
  249. data/lib/mongo/loggable.rb +3 -3
  250. data/lib/mongo/logger.rb +1 -1
  251. data/lib/mongo/monitoring/cmap_log_subscriber.rb +1 -1
  252. data/lib/mongo/monitoring/command_log_subscriber.rb +1 -1
  253. data/lib/mongo/monitoring/event/cmap/base.rb +1 -1
  254. data/lib/mongo/monitoring/event/cmap/connection_check_out_failed.rb +1 -1
  255. data/lib/mongo/monitoring/event/cmap/connection_check_out_started.rb +1 -1
  256. data/lib/mongo/monitoring/event/cmap/connection_checked_in.rb +1 -1
  257. data/lib/mongo/monitoring/event/cmap/connection_checked_out.rb +1 -1
  258. data/lib/mongo/monitoring/event/cmap/connection_closed.rb +1 -1
  259. data/lib/mongo/monitoring/event/cmap/connection_created.rb +1 -1
  260. data/lib/mongo/monitoring/event/cmap/connection_ready.rb +1 -1
  261. data/lib/mongo/monitoring/event/cmap/pool_cleared.rb +9 -2
  262. data/lib/mongo/monitoring/event/cmap/pool_closed.rb +1 -1
  263. data/lib/mongo/monitoring/event/cmap/pool_created.rb +1 -1
  264. data/lib/mongo/monitoring/event/cmap/pool_ready.rb +67 -0
  265. data/lib/mongo/monitoring/event/cmap.rb +2 -1
  266. data/lib/mongo/monitoring/event/command_failed.rb +1 -1
  267. data/lib/mongo/monitoring/event/command_started.rb +1 -1
  268. data/lib/mongo/monitoring/event/command_succeeded.rb +1 -1
  269. data/lib/mongo/monitoring/event/secure.rb +1 -1
  270. data/lib/mongo/monitoring/event/server_closed.rb +1 -1
  271. data/lib/mongo/monitoring/event/server_description_changed.rb +1 -1
  272. data/lib/mongo/monitoring/event/server_heartbeat_failed.rb +1 -1
  273. data/lib/mongo/monitoring/event/server_heartbeat_started.rb +1 -1
  274. data/lib/mongo/monitoring/event/server_heartbeat_succeeded.rb +1 -1
  275. data/lib/mongo/monitoring/event/server_opening.rb +1 -1
  276. data/lib/mongo/monitoring/event/topology_changed.rb +1 -1
  277. data/lib/mongo/monitoring/event/topology_closed.rb +1 -1
  278. data/lib/mongo/monitoring/event/topology_opening.rb +1 -1
  279. data/lib/mongo/monitoring/event.rb +1 -1
  280. data/lib/mongo/monitoring/publishable.rb +1 -1
  281. data/lib/mongo/monitoring/sdam_log_subscriber.rb +1 -1
  282. data/lib/mongo/monitoring/server_closed_log_subscriber.rb +1 -1
  283. data/lib/mongo/monitoring/server_description_changed_log_subscriber.rb +1 -1
  284. data/lib/mongo/monitoring/server_opening_log_subscriber.rb +1 -1
  285. data/lib/mongo/monitoring/topology_changed_log_subscriber.rb +1 -1
  286. data/lib/mongo/monitoring/topology_closed_log_subscriber.rb +1 -1
  287. data/lib/mongo/monitoring/topology_opening_log_subscriber.rb +1 -1
  288. data/lib/mongo/monitoring/unified_sdam_log_subscriber.rb +1 -1
  289. data/lib/mongo/monitoring.rb +1 -1
  290. data/lib/mongo/operation/aggregate/op_msg.rb +1 -1
  291. data/lib/mongo/operation/aggregate/result.rb +1 -1
  292. data/lib/mongo/operation/aggregate.rb +1 -1
  293. data/lib/mongo/operation/collections_info/result.rb +1 -1
  294. data/lib/mongo/operation/collections_info.rb +1 -1
  295. data/lib/mongo/operation/command/op_msg.rb +1 -1
  296. data/lib/mongo/operation/command.rb +1 -1
  297. data/lib/mongo/operation/context.rb +1 -1
  298. data/lib/mongo/operation/count/op_msg.rb +1 -1
  299. data/lib/mongo/operation/count.rb +1 -1
  300. data/lib/mongo/operation/create/op_msg.rb +1 -1
  301. data/lib/mongo/operation/create.rb +1 -1
  302. data/lib/mongo/operation/create_index/op_msg.rb +1 -1
  303. data/lib/mongo/operation/create_index.rb +1 -1
  304. data/lib/mongo/operation/create_user/op_msg.rb +1 -1
  305. data/lib/mongo/operation/create_user.rb +1 -1
  306. data/lib/mongo/operation/delete/bulk_result.rb +1 -1
  307. data/lib/mongo/operation/delete/op_msg.rb +1 -1
  308. data/lib/mongo/operation/delete/result.rb +1 -1
  309. data/lib/mongo/operation/delete.rb +1 -1
  310. data/lib/mongo/operation/distinct/op_msg.rb +1 -1
  311. data/lib/mongo/operation/distinct.rb +1 -1
  312. data/lib/mongo/operation/drop/op_msg.rb +1 -1
  313. data/lib/mongo/operation/drop.rb +1 -1
  314. data/lib/mongo/operation/drop_database/op_msg.rb +1 -1
  315. data/lib/mongo/operation/drop_database.rb +1 -1
  316. data/lib/mongo/operation/drop_index/op_msg.rb +1 -1
  317. data/lib/mongo/operation/drop_index.rb +1 -1
  318. data/lib/mongo/operation/explain/op_msg.rb +1 -1
  319. data/lib/mongo/operation/explain/result.rb +1 -1
  320. data/lib/mongo/operation/explain.rb +1 -1
  321. data/lib/mongo/operation/find/builder/command.rb +1 -1
  322. data/lib/mongo/operation/find/builder/flags.rb +1 -1
  323. data/lib/mongo/operation/find/builder/modifiers.rb +1 -1
  324. data/lib/mongo/operation/find/builder.rb +1 -1
  325. data/lib/mongo/operation/find/op_msg.rb +1 -1
  326. data/lib/mongo/operation/find/result.rb +1 -1
  327. data/lib/mongo/operation/find.rb +1 -1
  328. data/lib/mongo/operation/get_more/command_builder.rb +1 -1
  329. data/lib/mongo/operation/get_more/op_msg.rb +1 -1
  330. data/lib/mongo/operation/get_more/result.rb +1 -1
  331. data/lib/mongo/operation/get_more.rb +1 -1
  332. data/lib/mongo/operation/indexes/op_msg.rb +1 -1
  333. data/lib/mongo/operation/indexes/result.rb +1 -1
  334. data/lib/mongo/operation/indexes.rb +1 -1
  335. data/lib/mongo/operation/insert/bulk_result.rb +1 -1
  336. data/lib/mongo/operation/insert/op_msg.rb +1 -1
  337. data/lib/mongo/operation/insert/result.rb +1 -1
  338. data/lib/mongo/operation/insert.rb +1 -1
  339. data/lib/mongo/operation/kill_cursors/command_builder.rb +1 -1
  340. data/lib/mongo/operation/kill_cursors/op_msg.rb +1 -1
  341. data/lib/mongo/operation/kill_cursors.rb +1 -1
  342. data/lib/mongo/operation/list_collections/op_msg.rb +1 -1
  343. data/lib/mongo/operation/list_collections/result.rb +1 -1
  344. data/lib/mongo/operation/list_collections.rb +1 -1
  345. data/lib/mongo/operation/map_reduce/op_msg.rb +1 -1
  346. data/lib/mongo/operation/map_reduce/result.rb +1 -1
  347. data/lib/mongo/operation/map_reduce.rb +1 -1
  348. data/lib/mongo/operation/op_msg_base.rb +1 -1
  349. data/lib/mongo/operation/parallel_scan/op_msg.rb +1 -1
  350. data/lib/mongo/operation/parallel_scan/result.rb +1 -1
  351. data/lib/mongo/operation/parallel_scan.rb +1 -1
  352. data/lib/mongo/operation/remove_user/op_msg.rb +1 -1
  353. data/lib/mongo/operation/remove_user.rb +1 -1
  354. data/lib/mongo/operation/result.rb +1 -1
  355. data/lib/mongo/operation/shared/bypass_document_validation.rb +1 -1
  356. data/lib/mongo/operation/shared/causal_consistency_supported.rb +1 -1
  357. data/lib/mongo/operation/shared/executable.rb +1 -1
  358. data/lib/mongo/operation/shared/executable_no_validate.rb +1 -1
  359. data/lib/mongo/operation/shared/executable_transaction_label.rb +1 -1
  360. data/lib/mongo/operation/shared/idable.rb +1 -1
  361. data/lib/mongo/operation/shared/limited.rb +1 -1
  362. data/lib/mongo/operation/shared/object_id_generator.rb +1 -1
  363. data/lib/mongo/operation/shared/op_msg_executable.rb +1 -1
  364. data/lib/mongo/operation/shared/polymorphic_lookup.rb +1 -1
  365. data/lib/mongo/operation/shared/polymorphic_result.rb +1 -1
  366. data/lib/mongo/operation/shared/read_preference_supported.rb +1 -1
  367. data/lib/mongo/operation/shared/response_handling.rb +1 -1
  368. data/lib/mongo/operation/shared/result/aggregatable.rb +1 -1
  369. data/lib/mongo/operation/shared/result/use_legacy_error_parser.rb +1 -1
  370. data/lib/mongo/operation/shared/sessions_supported.rb +1 -1
  371. data/lib/mongo/operation/shared/specifiable.rb +1 -1
  372. data/lib/mongo/operation/shared/validatable.rb +1 -1
  373. data/lib/mongo/operation/shared/write.rb +1 -1
  374. data/lib/mongo/operation/shared/write_concern_supported.rb +1 -1
  375. data/lib/mongo/operation/update/bulk_result.rb +1 -1
  376. data/lib/mongo/operation/update/op_msg.rb +1 -1
  377. data/lib/mongo/operation/update/result.rb +1 -1
  378. data/lib/mongo/operation/update.rb +1 -1
  379. data/lib/mongo/operation/update_user/op_msg.rb +1 -1
  380. data/lib/mongo/operation/update_user.rb +1 -1
  381. data/lib/mongo/operation/users_info/op_msg.rb +1 -1
  382. data/lib/mongo/operation/users_info/result.rb +1 -1
  383. data/lib/mongo/operation/users_info.rb +1 -1
  384. data/lib/mongo/operation/write_command/op_msg.rb +1 -1
  385. data/lib/mongo/operation/write_command.rb +1 -1
  386. data/lib/mongo/operation.rb +1 -1
  387. data/lib/mongo/options/mapper.rb +1 -1
  388. data/lib/mongo/options/redacted.rb +1 -1
  389. data/lib/mongo/options.rb +1 -1
  390. data/lib/mongo/protocol/bit_vector.rb +4 -2
  391. data/lib/mongo/protocol/caching_hash.rb +4 -21
  392. data/lib/mongo/protocol/compressed.rb +1 -1
  393. data/lib/mongo/protocol/get_more.rb +1 -1
  394. data/lib/mongo/protocol/kill_cursors.rb +1 -1
  395. data/lib/mongo/protocol/message.rb +5 -9
  396. data/lib/mongo/protocol/msg.rb +2 -1
  397. data/lib/mongo/protocol/query.rb +1 -1
  398. data/lib/mongo/protocol/registry.rb +1 -1
  399. data/lib/mongo/protocol/reply.rb +1 -1
  400. data/lib/mongo/protocol/serializers.rb +25 -18
  401. data/lib/mongo/protocol.rb +1 -1
  402. data/lib/mongo/query_cache.rb +1 -1
  403. data/lib/mongo/retryable/base_worker.rb +91 -0
  404. data/lib/mongo/retryable/read_worker.rb +296 -0
  405. data/lib/mongo/retryable/write_worker.rb +364 -0
  406. data/lib/mongo/retryable.rb +31 -502
  407. data/lib/mongo/semaphore.rb +2 -2
  408. data/lib/mongo/server/app_metadata/environment.rb +259 -0
  409. data/lib/mongo/server/app_metadata/platform.rb +114 -0
  410. data/lib/mongo/server/app_metadata/truncator.rb +142 -0
  411. data/lib/mongo/server/app_metadata.rb +75 -108
  412. data/lib/mongo/server/connection.rb +61 -20
  413. data/lib/mongo/server/connection_base.rb +1 -1
  414. data/lib/mongo/server/connection_common.rb +1 -1
  415. data/lib/mongo/server/connection_pool/generation_manager.rb +56 -12
  416. data/lib/mongo/server/connection_pool/populator.rb +33 -31
  417. data/lib/mongo/server/connection_pool.rb +670 -263
  418. data/lib/mongo/server/description/features.rb +2 -2
  419. data/lib/mongo/server/description/load_balancer.rb +1 -1
  420. data/lib/mongo/server/description.rb +7 -6
  421. data/lib/mongo/server/monitor/app_metadata.rb +1 -1
  422. data/lib/mongo/server/monitor/connection.rb +1 -1
  423. data/lib/mongo/server/monitor.rb +11 -7
  424. data/lib/mongo/server/pending_connection.rb +1 -1
  425. data/lib/mongo/server/push_monitor/connection.rb +1 -1
  426. data/lib/mongo/server/push_monitor.rb +1 -1
  427. data/lib/mongo/server/round_trip_time_averager.rb +1 -1
  428. data/lib/mongo/server.rb +96 -30
  429. data/lib/mongo/server_selector/base.rb +24 -3
  430. data/lib/mongo/server_selector/nearest.rb +1 -1
  431. data/lib/mongo/server_selector/primary.rb +1 -1
  432. data/lib/mongo/server_selector/primary_preferred.rb +1 -1
  433. data/lib/mongo/server_selector/secondary.rb +1 -1
  434. data/lib/mongo/server_selector/secondary_preferred.rb +1 -1
  435. data/lib/mongo/server_selector.rb +1 -1
  436. data/lib/mongo/session/server_session.rb +1 -1
  437. data/lib/mongo/session/session_pool.rb +1 -1
  438. data/lib/mongo/session.rb +1 -1
  439. data/lib/mongo/socket/ocsp_cache.rb +1 -1
  440. data/lib/mongo/socket/ocsp_verifier.rb +1 -1
  441. data/lib/mongo/socket/ssl.rb +1 -1
  442. data/lib/mongo/socket/tcp.rb +1 -1
  443. data/lib/mongo/socket/unix.rb +1 -1
  444. data/lib/mongo/socket.rb +29 -2
  445. data/lib/mongo/srv/monitor.rb +1 -3
  446. data/lib/mongo/srv/resolver.rb +1 -1
  447. data/lib/mongo/srv/result.rb +1 -1
  448. data/lib/mongo/srv.rb +1 -1
  449. data/lib/mongo/timeout.rb +2 -2
  450. data/lib/mongo/topology_version.rb +1 -1
  451. data/lib/mongo/uri/options_mapper.rb +321 -81
  452. data/lib/mongo/uri/srv_protocol.rb +1 -1
  453. data/lib/mongo/uri.rb +41 -13
  454. data/lib/mongo/utils.rb +1 -1
  455. data/lib/mongo/version.rb +2 -2
  456. data/lib/mongo/write_concern/acknowledged.rb +1 -1
  457. data/lib/mongo/write_concern/base.rb +1 -1
  458. data/lib/mongo/write_concern/unacknowledged.rb +1 -1
  459. data/lib/mongo/write_concern.rb +1 -1
  460. data/lib/mongo.rb +2 -1
  461. data/mongo.gemspec +5 -2
  462. data/spec/atlas/atlas_connectivity_spec.rb +1 -1
  463. data/spec/atlas/operations_spec.rb +3 -8
  464. data/spec/integration/auth_spec.rb +1 -1
  465. data/spec/integration/awaited_ismaster_spec.rb +1 -1
  466. data/spec/integration/aws_auth_credentials_cache_spec.rb +51 -0
  467. data/spec/integration/aws_auth_request_spec.rb +2 -2
  468. data/spec/integration/aws_credentials_retriever_spec.rb +32 -2
  469. data/spec/integration/aws_lambda_examples_spec.rb +1 -1
  470. data/spec/integration/bson_symbol_spec.rb +1 -1
  471. data/spec/integration/bulk_insert_spec.rb +1 -1
  472. data/spec/integration/bulk_write_error_message_spec.rb +1 -0
  473. data/spec/integration/bulk_write_spec.rb +1 -1
  474. data/spec/integration/change_stream_examples_spec.rb +1 -1
  475. data/spec/integration/change_stream_spec.rb +6 -1
  476. data/spec/integration/check_clean_slate_spec.rb +1 -1
  477. data/spec/integration/client_authentication_options_spec.rb +1 -1
  478. data/spec/integration/client_connectivity_spec.rb +1 -1
  479. data/spec/integration/client_construction_aws_auth_spec.rb +12 -3
  480. data/spec/integration/client_construction_spec.rb +23 -1
  481. data/spec/integration/client_side_encryption/auto_encryption_bulk_writes_spec.rb +1 -1
  482. data/spec/integration/client_side_encryption/auto_encryption_command_monitoring_spec.rb +1 -1
  483. data/spec/integration/client_side_encryption/auto_encryption_mongocryptd_spawn_spec.rb +1 -1
  484. data/spec/integration/client_side_encryption/auto_encryption_old_wire_version_spec.rb +1 -1
  485. data/spec/integration/client_side_encryption/auto_encryption_reconnect_spec.rb +10 -5
  486. data/spec/integration/client_side_encryption/auto_encryption_spec.rb +38 -2
  487. data/spec/integration/client_side_encryption/automatic_data_encryption_keys_prose_spec.rb +153 -0
  488. data/spec/integration/client_side_encryption/bson_size_limit_spec.rb +1 -1
  489. data/spec/integration/client_side_encryption/bypass_mongocryptd_spawn_spec.rb +1 -1
  490. data/spec/integration/client_side_encryption/client_close_spec.rb +1 -1
  491. data/spec/integration/client_side_encryption/corpus_spec.rb +1 -1
  492. data/spec/integration/client_side_encryption/custom_endpoint_spec.rb +3 -3
  493. data/spec/integration/client_side_encryption/data_key_spec.rb +1 -1
  494. data/spec/integration/client_side_encryption/decryption_events_prose_spec.rb +59 -58
  495. data/spec/integration/client_side_encryption/explicit_encryption_spec.rb +1 -1
  496. data/spec/integration/client_side_encryption/explicit_queryable_encryption_spec.rb +36 -33
  497. data/spec/integration/client_side_encryption/external_key_vault_spec.rb +1 -1
  498. data/spec/integration/client_side_encryption/kms_tls_options_spec.rb +3 -3
  499. data/spec/integration/client_side_encryption/kms_tls_spec.rb +1 -1
  500. data/spec/integration/client_side_encryption/mongocryptd_prose_spec.rb +105 -0
  501. data/spec/integration/client_side_encryption/on_demand_aws_credentials_spec.rb +49 -0
  502. data/spec/integration/client_side_encryption/on_demand_azure_credentials_spec.rb +46 -0
  503. data/spec/integration/client_side_encryption/on_demand_gcp_credentials_spec.rb +47 -0
  504. data/spec/integration/client_side_encryption/queryable_encryption_examples_spec.rb +14 -11
  505. data/spec/integration/client_side_encryption/range_explicit_encryption_prose_spec.rb +536 -0
  506. data/spec/integration/client_side_encryption/rewrap_prose_spec.rb +114 -0
  507. data/spec/integration/client_side_encryption/unique_index_on_key_alt_names_prose_spec.rb +20 -16
  508. data/spec/integration/client_side_encryption/views_spec.rb +1 -1
  509. data/spec/integration/client_spec.rb +8 -3
  510. data/spec/integration/client_update_spec.rb +7 -3
  511. data/spec/integration/collection_indexes_prose_spec.rb +1 -1
  512. data/spec/integration/command_monitoring_spec.rb +1 -1
  513. data/spec/integration/command_spec.rb +1 -1
  514. data/spec/integration/connect_single_rs_name_spec.rb +1 -1
  515. data/spec/integration/connection/faas_env_spec.rb +62 -0
  516. data/spec/integration/connection_pool_populator_spec.rb +27 -7
  517. data/spec/integration/connection_spec.rb +1 -1
  518. data/spec/integration/crud_spec.rb +1 -1
  519. data/spec/integration/cursor_pinning_spec.rb +6 -2
  520. data/spec/integration/cursor_reaping_spec.rb +1 -1
  521. data/spec/integration/docs_examples_spec.rb +1 -1
  522. data/spec/integration/error_detection_spec.rb +1 -1
  523. data/spec/integration/fork_reconnect_spec.rb +2 -2
  524. data/spec/integration/get_more_spec.rb +1 -1
  525. data/spec/integration/grid_fs_bucket_spec.rb +1 -1
  526. data/spec/integration/heartbeat_events_spec.rb +1 -1
  527. data/spec/integration/map_reduce_spec.rb +5 -1
  528. data/spec/integration/mmapv1_spec.rb +1 -1
  529. data/spec/integration/mongos_pinning_spec.rb +1 -1
  530. data/spec/integration/ocsp_connectivity_spec.rb +1 -1
  531. data/spec/integration/ocsp_verifier_cache_spec.rb +1 -1
  532. data/spec/integration/ocsp_verifier_spec.rb +2 -2
  533. data/spec/integration/operation_failure_code_spec.rb +1 -1
  534. data/spec/integration/operation_failure_message_spec.rb +1 -0
  535. data/spec/integration/query_cache_spec.rb +90 -3
  536. data/spec/integration/query_cache_transactions_spec.rb +1 -1
  537. data/spec/integration/read_concern_spec.rb +1 -1
  538. data/spec/integration/read_preference_spec.rb +1 -1
  539. data/spec/integration/reconnect_spec.rb +4 -1
  540. data/spec/integration/retryable_errors_spec.rb +1 -1
  541. data/spec/integration/retryable_reads_errors_spec.rb +110 -0
  542. data/spec/integration/retryable_writes/retryable_writes_36_and_older_spec.rb +1 -1
  543. data/spec/integration/retryable_writes/retryable_writes_40_and_newer_spec.rb +1 -1
  544. data/spec/integration/retryable_writes/shared/adds_diagnostics.rb +1 -1
  545. data/spec/integration/retryable_writes/shared/does_not_support_retries.rb +1 -1
  546. data/spec/integration/retryable_writes/shared/only_supports_legacy_retries.rb +1 -1
  547. data/spec/integration/retryable_writes/shared/performs_legacy_retries.rb +1 -1
  548. data/spec/integration/retryable_writes/shared/performs_modern_retries.rb +1 -1
  549. data/spec/integration/retryable_writes/shared/performs_no_retries.rb +1 -1
  550. data/spec/integration/retryable_writes/shared/supports_legacy_retries.rb +1 -1
  551. data/spec/integration/retryable_writes/shared/supports_modern_retries.rb +1 -1
  552. data/spec/integration/retryable_writes/shared/supports_retries.rb +1 -1
  553. data/spec/integration/retryable_writes_errors_spec.rb +160 -2
  554. data/spec/integration/sdam_error_handling_spec.rb +65 -4
  555. data/spec/integration/sdam_events_spec.rb +1 -1
  556. data/spec/integration/sdam_prose_spec.rb +3 -3
  557. data/spec/integration/secondary_reads_spec.rb +1 -0
  558. data/spec/integration/server_description_spec.rb +1 -1
  559. data/spec/integration/server_monitor_spec.rb +1 -1
  560. data/spec/integration/server_selection_spec.rb +1 -1
  561. data/spec/integration/server_selector_spec.rb +5 -3
  562. data/spec/integration/server_spec.rb +23 -26
  563. data/spec/integration/shell_examples_spec.rb +1 -1
  564. data/spec/integration/size_limit_spec.rb +1 -1
  565. data/spec/integration/snappy_compression_spec.rb +1 -1
  566. data/spec/integration/snapshot_query_examples_spec.rb +9 -7
  567. data/spec/integration/srv_monitoring_spec.rb +2 -1
  568. data/spec/integration/srv_spec.rb +3 -3
  569. data/spec/integration/ssl_uri_options_spec.rb +1 -1
  570. data/spec/integration/step_down_spec.rb +5 -3
  571. data/spec/integration/time_zone_querying_spec.rb +1 -1
  572. data/spec/integration/transaction_pinning_spec.rb +18 -4
  573. data/spec/integration/transactions_api_examples_spec.rb +1 -1
  574. data/spec/integration/transactions_examples_spec.rb +1 -1
  575. data/spec/integration/truncated_utf8_spec.rb +1 -1
  576. data/spec/integration/versioned_api_examples_spec.rb +2 -2
  577. data/spec/integration/x509_auth_spec.rb +1 -1
  578. data/spec/integration/zlib_compression_spec.rb +1 -1
  579. data/spec/integration/zstd_compression_spec.rb +1 -1
  580. data/spec/kerberos/kerberos_spec.rb +1 -1
  581. data/spec/lite_spec_helper.rb +10 -1
  582. data/spec/mongo/address/ipv4_spec.rb +1 -1
  583. data/spec/mongo/address/ipv6_spec.rb +1 -1
  584. data/spec/mongo/address/unix_spec.rb +1 -1
  585. data/spec/mongo/address/validator_spec.rb +1 -1
  586. data/spec/mongo/address_spec.rb +8 -2
  587. data/spec/mongo/auth/aws/credential_cache_spec.rb +63 -0
  588. data/spec/mongo/auth/aws/credentials_retriever_spec.rb +90 -0
  589. data/spec/mongo/auth/aws/credentials_spec.rb +46 -0
  590. data/spec/mongo/auth/aws/request_region_spec.rb +1 -1
  591. data/spec/mongo/auth/aws/request_spec.rb +1 -1
  592. data/spec/mongo/auth/cr_spec.rb +2 -22
  593. data/spec/mongo/auth/gssapi/conversation_spec.rb +1 -1
  594. data/spec/mongo/auth/invalid_mechanism_spec.rb +1 -1
  595. data/spec/mongo/auth/ldap/conversation_spec.rb +1 -1
  596. data/spec/mongo/auth/ldap_spec.rb +1 -1
  597. data/spec/mongo/auth/scram/conversation_spec.rb +1 -1
  598. data/spec/mongo/auth/scram256/conversation_spec.rb +1 -1
  599. data/spec/mongo/auth/scram_negotiation_spec.rb +1 -1
  600. data/spec/mongo/auth/scram_spec.rb +1 -1
  601. data/spec/mongo/auth/stringprep/profiles/sasl_spec.rb +1 -1
  602. data/spec/mongo/auth/stringprep_spec.rb +1 -1
  603. data/spec/mongo/auth/user/view_spec.rb +96 -1
  604. data/spec/mongo/auth/user_spec.rb +1 -1
  605. data/spec/mongo/auth/x509/conversation_spec.rb +1 -1
  606. data/spec/mongo/auth/x509_spec.rb +1 -1
  607. data/spec/mongo/auth_spec.rb +1 -1
  608. data/spec/mongo/bson_spec.rb +1 -1
  609. data/spec/mongo/bulk_write/ordered_combiner_spec.rb +1 -1
  610. data/spec/mongo/bulk_write/result_spec.rb +1 -1
  611. data/spec/mongo/bulk_write/unordered_combiner_spec.rb +1 -1
  612. data/spec/mongo/bulk_write_spec.rb +1 -1
  613. data/spec/mongo/caching_cursor_spec.rb +1 -1
  614. data/spec/mongo/client_construction_spec.rb +572 -694
  615. data/spec/mongo/client_encryption_spec.rb +1 -1
  616. data/spec/mongo/client_spec.rb +172 -231
  617. data/spec/mongo/cluster/cursor_reaper_spec.rb +1 -1
  618. data/spec/mongo/cluster/periodic_executor_spec.rb +1 -1
  619. data/spec/mongo/cluster/socket_reaper_spec.rb +1 -1
  620. data/spec/mongo/cluster/topology/replica_set_spec.rb +1 -1
  621. data/spec/mongo/cluster/topology/sharded_spec.rb +1 -1
  622. data/spec/mongo/cluster/topology/single_spec.rb +1 -1
  623. data/spec/mongo/cluster/topology/unknown_spec.rb +1 -1
  624. data/spec/mongo/cluster/topology_spec.rb +1 -1
  625. data/spec/mongo/cluster_spec.rb +156 -154
  626. data/spec/mongo/cluster_time_spec.rb +1 -1
  627. data/spec/mongo/collection/view/aggregation_spec.rb +1 -1
  628. data/spec/mongo/collection/view/builder/find_command_spec.rb +1 -1
  629. data/spec/mongo/collection/view/builder/op_query_spec.rb +1 -1
  630. data/spec/mongo/collection/view/change_stream_resume_spec.rb +1 -1
  631. data/spec/mongo/collection/view/change_stream_spec.rb +1 -1
  632. data/spec/mongo/collection/view/explainable_spec.rb +1 -1
  633. data/spec/mongo/collection/view/immutable_spec.rb +1 -1
  634. data/spec/mongo/collection/view/iterable_spec.rb +1 -1
  635. data/spec/mongo/collection/view/map_reduce_spec.rb +11 -1
  636. data/spec/mongo/collection/view/readable_spec.rb +139 -1
  637. data/spec/mongo/collection/view/writable_spec.rb +1 -1
  638. data/spec/mongo/collection/view_spec.rb +1 -1
  639. data/spec/mongo/collection_crud_spec.rb +1 -1
  640. data/spec/mongo/collection_ddl_spec.rb +112 -66
  641. data/spec/mongo/collection_spec.rb +3 -3
  642. data/spec/mongo/condition_variable_spec.rb +104 -0
  643. data/spec/mongo/config/options_spec.rb +1 -0
  644. data/spec/mongo/config_spec.rb +2 -1
  645. data/spec/mongo/crypt/auto_decryption_context_spec.rb +1 -1
  646. data/spec/mongo/crypt/auto_encrypter_spec.rb +8 -1
  647. data/spec/mongo/crypt/auto_encryption_context_spec.rb +1 -1
  648. data/spec/mongo/crypt/binary_spec.rb +1 -1
  649. data/spec/mongo/crypt/binding/binary_spec.rb +1 -1
  650. data/spec/mongo/crypt/binding/context_spec.rb +1 -1
  651. data/spec/mongo/crypt/binding/helpers_spec.rb +1 -1
  652. data/spec/mongo/crypt/binding/mongocrypt_spec.rb +1 -1
  653. data/spec/mongo/crypt/binding/status_spec.rb +1 -1
  654. data/spec/mongo/crypt/binding/version_spec.rb +19 -5
  655. data/spec/mongo/crypt/binding_unloaded_spec.rb +1 -1
  656. data/spec/mongo/crypt/data_key_context_spec.rb +1 -1
  657. data/spec/mongo/crypt/encryption_io_spec.rb +1 -1
  658. data/spec/mongo/crypt/explicit_decryption_context_spec.rb +1 -1
  659. data/spec/mongo/crypt/explicit_encryption_context_spec.rb +3 -3
  660. data/spec/mongo/crypt/handle_spec.rb +19 -4
  661. data/spec/mongo/crypt/helpers/mongo_crypt_spec_helper.rb +1 -1
  662. data/spec/mongo/crypt/hooks_spec.rb +2 -2
  663. data/spec/mongo/crypt/kms/azure/credentials_retriever_spec.rb +86 -0
  664. data/spec/mongo/crypt/kms/credentials_spec.rb +17 -1
  665. data/spec/mongo/crypt/kms_spec.rb +1 -1
  666. data/spec/mongo/crypt/status_spec.rb +1 -1
  667. data/spec/mongo/crypt_spec.rb +21 -0
  668. data/spec/mongo/cursor/builder/get_more_command_spec.rb +1 -1
  669. data/spec/mongo/cursor/builder/op_get_more_spec.rb +1 -1
  670. data/spec/mongo/cursor_spec.rb +58 -11
  671. data/spec/mongo/database_spec.rb +1 -1
  672. data/spec/mongo/distinguishing_semaphore_spec.rb +7 -7
  673. data/spec/mongo/error/bulk_write_error_spec.rb +1 -1
  674. data/spec/mongo/error/crypt_error_spec.rb +1 -1
  675. data/spec/mongo/error/max_bson_size_spec.rb +1 -1
  676. data/spec/mongo/error/no_server_available_spec.rb +1 -1
  677. data/spec/mongo/error/notable_spec.rb +1 -1
  678. data/spec/mongo/error/operation_failure_heavy_spec.rb +1 -1
  679. data/spec/mongo/error/operation_failure_spec.rb +1 -1
  680. data/spec/mongo/error/parser_spec.rb +1 -1
  681. data/spec/mongo/error/unsupported_option_spec.rb +1 -1
  682. data/spec/mongo/event/publisher_spec.rb +1 -1
  683. data/spec/mongo/event/subscriber_spec.rb +1 -1
  684. data/spec/mongo/grid/file/chunk_spec.rb +1 -1
  685. data/spec/mongo/grid/file/info_spec.rb +1 -1
  686. data/spec/mongo/grid/file_spec.rb +1 -1
  687. data/spec/mongo/grid/fs_bucket_spec.rb +1 -1
  688. data/spec/mongo/grid/stream/read_spec.rb +1 -1
  689. data/spec/mongo/grid/stream/write_spec.rb +1 -1
  690. data/spec/mongo/grid/stream_spec.rb +1 -1
  691. data/spec/mongo/id_spec.rb +2 -2
  692. data/spec/mongo/index/view_spec.rb +4 -4
  693. data/spec/mongo/lint_spec.rb +2 -2
  694. data/spec/mongo/logger_spec.rb +1 -1
  695. data/spec/mongo/monitoring/command_log_subscriber_spec.rb +1 -1
  696. data/spec/mongo/monitoring/event/cmap/connection_check_out_failed_spec.rb +2 -2
  697. data/spec/mongo/monitoring/event/cmap/connection_check_out_started_spec.rb +2 -2
  698. data/spec/mongo/monitoring/event/cmap/connection_checked_in_spec.rb +2 -2
  699. data/spec/mongo/monitoring/event/cmap/connection_checked_out_spec.rb +2 -2
  700. data/spec/mongo/monitoring/event/cmap/connection_closed_spec.rb +2 -2
  701. data/spec/mongo/monitoring/event/cmap/connection_created_spec.rb +2 -2
  702. data/spec/mongo/monitoring/event/cmap/connection_ready_spec.rb +2 -2
  703. data/spec/mongo/monitoring/event/cmap/pool_cleared_spec.rb +2 -2
  704. data/spec/mongo/monitoring/event/cmap/pool_closed_spec.rb +2 -2
  705. data/spec/mongo/monitoring/event/cmap/pool_created_spec.rb +2 -2
  706. data/spec/mongo/monitoring/event/command_failed_spec.rb +1 -1
  707. data/spec/mongo/monitoring/event/command_started_spec.rb +1 -1
  708. data/spec/mongo/monitoring/event/command_succeeded_spec.rb +1 -1
  709. data/spec/mongo/monitoring/event/secure_spec.rb +1 -1
  710. data/spec/mongo/monitoring/event/server_closed_spec.rb +1 -1
  711. data/spec/mongo/monitoring/event/server_description_changed_spec.rb +1 -1
  712. data/spec/mongo/monitoring/event/server_heartbeat_failed_spec.rb +1 -1
  713. data/spec/mongo/monitoring/event/server_heartbeat_started_spec.rb +1 -1
  714. data/spec/mongo/monitoring/event/server_heartbeat_succeeded_spec.rb +1 -1
  715. data/spec/mongo/monitoring/event/server_opening_spec.rb +1 -1
  716. data/spec/mongo/monitoring/event/topology_changed_spec.rb +1 -1
  717. data/spec/mongo/monitoring/event/topology_closed_spec.rb +1 -1
  718. data/spec/mongo/monitoring/event/topology_opening_spec.rb +1 -1
  719. data/spec/mongo/monitoring_spec.rb +1 -1
  720. data/spec/mongo/operation/aggregate/result_spec.rb +1 -1
  721. data/spec/mongo/operation/aggregate_spec.rb +1 -1
  722. data/spec/mongo/operation/collections_info_spec.rb +1 -1
  723. data/spec/mongo/operation/command_spec.rb +1 -1
  724. data/spec/mongo/operation/create/op_msg_spec.rb +1 -1
  725. data/spec/mongo/operation/create_index_spec.rb +1 -1
  726. data/spec/mongo/operation/create_user_spec.rb +1 -1
  727. data/spec/mongo/operation/delete/bulk_spec.rb +1 -1
  728. data/spec/mongo/operation/delete/op_msg_spec.rb +1 -1
  729. data/spec/mongo/operation/delete_spec.rb +1 -1
  730. data/spec/mongo/operation/drop_index_spec.rb +1 -1
  731. data/spec/mongo/operation/find/builder/flags_spec.rb +1 -1
  732. data/spec/mongo/operation/find/builder/modifiers_spec.rb +1 -1
  733. data/spec/mongo/operation/indexes_spec.rb +1 -1
  734. data/spec/mongo/operation/insert/bulk_spec.rb +1 -1
  735. data/spec/mongo/operation/insert/op_msg_spec.rb +1 -1
  736. data/spec/mongo/operation/insert_spec.rb +1 -1
  737. data/spec/mongo/operation/limited_spec.rb +1 -1
  738. data/spec/mongo/operation/map_reduce_spec.rb +1 -1
  739. data/spec/mongo/operation/read_preference_legacy_spec.rb +1 -1
  740. data/spec/mongo/operation/read_preference_op_msg_spec.rb +1 -1
  741. data/spec/mongo/operation/remove_user_spec.rb +1 -1
  742. data/spec/mongo/operation/result_spec.rb +1 -1
  743. data/spec/mongo/operation/specifiable_spec.rb +1 -1
  744. data/spec/mongo/operation/update/bulk_spec.rb +1 -1
  745. data/spec/mongo/operation/update/op_msg_spec.rb +1 -1
  746. data/spec/mongo/operation/update_spec.rb +1 -1
  747. data/spec/mongo/operation/update_user_spec.rb +1 -1
  748. data/spec/mongo/options/redacted_spec.rb +2 -2
  749. data/spec/mongo/protocol/caching_hash_spec.rb +1 -46
  750. data/spec/mongo/protocol/compressed_spec.rb +1 -1
  751. data/spec/mongo/protocol/get_more_spec.rb +1 -1
  752. data/spec/mongo/protocol/kill_cursors_spec.rb +1 -1
  753. data/spec/mongo/protocol/msg_spec.rb +4 -5
  754. data/spec/mongo/protocol/query_spec.rb +1 -1
  755. data/spec/mongo/protocol/registry_spec.rb +1 -1
  756. data/spec/mongo/protocol/reply_spec.rb +1 -1
  757. data/spec/mongo/query_cache_middleware_spec.rb +1 -1
  758. data/spec/mongo/query_cache_spec.rb +1 -1
  759. data/spec/mongo/retryable_spec.rb +5 -3
  760. data/spec/mongo/semaphore_spec.rb +7 -7
  761. data/spec/mongo/server/app_metadata/environment_spec.rb +209 -0
  762. data/spec/mongo/server/app_metadata/truncator_spec.rb +158 -0
  763. data/spec/mongo/server/app_metadata_spec.rb +44 -66
  764. data/spec/mongo/server/connection_auth_spec.rb +1 -1
  765. data/spec/mongo/server/connection_common_spec.rb +1 -1
  766. data/spec/mongo/server/connection_pool/populator_spec.rb +17 -3
  767. data/spec/mongo/server/connection_pool_spec.rb +447 -10
  768. data/spec/mongo/server/connection_spec.rb +17 -4
  769. data/spec/mongo/server/description/features_spec.rb +1 -1
  770. data/spec/mongo/server/description_query_methods_spec.rb +1 -1
  771. data/spec/mongo/server/description_spec.rb +1 -1
  772. data/spec/mongo/server/monitor/app_metadata_spec.rb +1 -1
  773. data/spec/mongo/server/monitor/connection_spec.rb +3 -3
  774. data/spec/mongo/server/monitor_spec.rb +6 -5
  775. data/spec/mongo/server/push_monitor_spec.rb +1 -1
  776. data/spec/mongo/server/round_trip_time_averager_spec.rb +1 -1
  777. data/spec/mongo/server_selector/nearest_spec.rb +1 -1
  778. data/spec/mongo/server_selector/primary_preferred_spec.rb +1 -1
  779. data/spec/mongo/server_selector/primary_spec.rb +1 -1
  780. data/spec/mongo/server_selector/secondary_preferred_spec.rb +1 -1
  781. data/spec/mongo/server_selector/secondary_spec.rb +1 -1
  782. data/spec/mongo/server_selector_spec.rb +1 -1
  783. data/spec/mongo/server_spec.rb +32 -5
  784. data/spec/mongo/session/server_session_spec.rb +1 -1
  785. data/spec/mongo/session/session_pool_spec.rb +1 -1
  786. data/spec/mongo/session_spec.rb +1 -1
  787. data/spec/mongo/session_transaction_spec.rb +2 -2
  788. data/spec/mongo/socket/ssl_spec.rb +3 -9
  789. data/spec/mongo/socket/tcp_spec.rb +1 -1
  790. data/spec/mongo/socket/unix_spec.rb +1 -1
  791. data/spec/mongo/socket_spec.rb +1 -1
  792. data/spec/mongo/srv/monitor_spec.rb +1 -1
  793. data/spec/mongo/srv/result_spec.rb +1 -1
  794. data/spec/mongo/timeout_spec.rb +1 -1
  795. data/spec/mongo/tls_context_hooks_spec.rb +1 -1
  796. data/spec/mongo/uri/options_mapper_spec.rb +1605 -0
  797. data/spec/mongo/uri/srv_protocol_spec.rb +150 -2
  798. data/spec/mongo/uri_option_parsing_spec.rb +1 -1
  799. data/spec/mongo/uri_spec.rb +143 -2
  800. data/spec/mongo/utils_spec.rb +1 -1
  801. data/spec/mongo/write_concern/acknowledged_spec.rb +1 -1
  802. data/spec/mongo/write_concern/unacknowledged_spec.rb +1 -1
  803. data/spec/mongo/write_concern_spec.rb +1 -1
  804. data/spec/runners/auth.rb +1 -1
  805. data/spec/runners/change_streams/outcome.rb +1 -1
  806. data/spec/runners/change_streams/spec.rb +1 -1
  807. data/spec/runners/change_streams/test.rb +1 -1
  808. data/spec/runners/cmap/verifier.rb +2 -2
  809. data/spec/runners/cmap.rb +188 -45
  810. data/spec/runners/command_monitoring.rb +1 -1
  811. data/spec/runners/connection_string.rb +1 -1
  812. data/spec/runners/crud/context.rb +1 -1
  813. data/spec/runners/crud/operation.rb +2 -2
  814. data/spec/runners/crud/outcome.rb +1 -1
  815. data/spec/runners/crud/requirement.rb +3 -3
  816. data/spec/runners/crud/spec.rb +2 -2
  817. data/spec/runners/crud/test.rb +1 -1
  818. data/spec/runners/crud/test_base.rb +2 -2
  819. data/spec/runners/crud/verifier.rb +3 -3
  820. data/spec/runners/crud.rb +1 -1
  821. data/spec/runners/gridfs.rb +1 -1
  822. data/spec/runners/read_write_concern_document.rb +1 -1
  823. data/spec/runners/sdam/verifier.rb +1 -1
  824. data/spec/runners/sdam.rb +1 -1
  825. data/spec/runners/server_selection.rb +1 -1
  826. data/spec/runners/server_selection_rtt.rb +1 -1
  827. data/spec/runners/transactions/operation.rb +15 -9
  828. data/spec/runners/transactions/spec.rb +1 -1
  829. data/spec/runners/transactions/test.rb +44 -3
  830. data/spec/runners/transactions.rb +1 -1
  831. data/spec/runners/unified/assertions.rb +94 -77
  832. data/spec/runners/unified/change_stream_operations.rb +14 -3
  833. data/spec/runners/unified/client_side_encryption_operations.rb +1 -1
  834. data/spec/runners/unified/crud_operations.rb +11 -2
  835. data/spec/runners/unified/ddl_operations.rb +80 -4
  836. data/spec/runners/unified/entity_map.rb +1 -1
  837. data/spec/runners/unified/error.rb +1 -1
  838. data/spec/runners/unified/event_subscriber.rb +9 -3
  839. data/spec/runners/unified/exceptions.rb +1 -1
  840. data/spec/runners/unified/grid_fs_operations.rb +1 -1
  841. data/spec/runners/unified/support_operations.rb +66 -2
  842. data/spec/runners/unified/test.rb +86 -12
  843. data/spec/runners/unified/test_group.rb +1 -1
  844. data/spec/runners/unified/thread_operations.rb +73 -0
  845. data/spec/runners/unified.rb +9 -6
  846. data/spec/shared/lib/mrss/docker_runner.rb +4 -0
  847. data/spec/shared/lib/mrss/lite_constraints.rb +10 -2
  848. data/spec/shared/lib/mrss/server_version_registry.rb +16 -23
  849. data/spec/shared/lib/mrss/utils.rb +28 -6
  850. data/spec/shared/share/Dockerfile.erb +24 -19
  851. data/spec/shared/shlib/server.sh +32 -8
  852. data/spec/shared/shlib/set_env.sh +4 -4
  853. data/spec/solo/clean_exit_spec.rb +4 -11
  854. data/spec/spec_helper.rb +1 -1
  855. data/spec/spec_tests/auth_spec.rb +1 -1
  856. data/spec/spec_tests/change_streams_unified_spec.rb +2 -1
  857. data/spec/spec_tests/client_side_encryption_spec.rb +25 -2
  858. data/spec/spec_tests/client_side_encryption_unified_spec.rb +12 -2
  859. data/spec/spec_tests/cmap_spec.rb +29 -15
  860. data/spec/spec_tests/collection_management_spec.rb +1 -1
  861. data/spec/spec_tests/command_monitoring_unified_spec.rb +1 -1
  862. data/spec/spec_tests/connection_string_spec.rb +1 -1
  863. data/spec/spec_tests/crud_spec.rb +1 -1
  864. data/spec/spec_tests/crud_unified_spec.rb +1 -1
  865. data/spec/spec_tests/data/change_streams_unified/change-streams-clusterTime.yml +41 -0
  866. data/spec/spec_tests/data/change_streams_unified/change-streams-disambiguatedPaths.yml +103 -0
  867. data/spec/spec_tests/data/change_streams_unified/change-streams-errors.yml +2 -6
  868. data/spec/spec_tests/data/change_streams_unified/change-streams-pre_and_post_images.yml +1 -1
  869. data/spec/spec_tests/data/change_streams_unified/change-streams-resume-allowlist.yml +1 -3
  870. data/spec/spec_tests/data/change_streams_unified/change-streams-resume-errorLabels.yml +1 -3
  871. data/spec/spec_tests/data/change_streams_unified/change-streams-showExpandedEvents.yml +15 -6
  872. data/spec/spec_tests/data/client_side_encryption/awsTemporary.yml +57 -0
  873. data/spec/spec_tests/data/client_side_encryption/{fle2-BypassQueryAnalysis.yml → fle2v2-BypassQueryAnalysis.yml} +18 -30
  874. data/spec/spec_tests/data/client_side_encryption/{fle2-Compact.yml → fle2v2-Compact.yml} +5 -3
  875. data/spec/spec_tests/data/client_side_encryption/fle2v2-CreateCollection-OldServer.yml +61 -0
  876. data/spec/spec_tests/data/client_side_encryption/{fle2-CreateCollection.yml → fle2v2-CreateCollection.yml} +212 -538
  877. data/spec/spec_tests/data/client_side_encryption/{fle2-DecryptExistingData.yml → fle2v2-DecryptExistingData.yml} +4 -2
  878. data/spec/spec_tests/data/client_side_encryption/{fle2-Delete.yml → fle2v2-Delete.yml} +17 -24
  879. data/spec/spec_tests/data/client_side_encryption/{fle2-EncryptedFields-vs-EncryptedFieldsMap.yml → fle2v2-EncryptedFields-vs-EncryptedFieldsMap.yml} +5 -6
  880. data/spec/spec_tests/data/client_side_encryption/{fle2-EncryptedFields-vs-jsonSchema.yml → fle2v2-EncryptedFields-vs-jsonSchema.yml} +18 -6
  881. data/spec/spec_tests/data/client_side_encryption/{fle2-EncryptedFieldsMap-defaults.yml → fle2v2-EncryptedFieldsMap-defaults.yml} +6 -5
  882. data/spec/spec_tests/data/client_side_encryption/{fle2-FindOneAndUpdate.yml → fle2v2-FindOneAndUpdate.yml} +31 -44
  883. data/spec/spec_tests/data/client_side_encryption/{fle2-InsertFind-Indexed.yml → fle2v2-InsertFind-Indexed.yml} +16 -6
  884. data/spec/spec_tests/data/client_side_encryption/{fle2-InsertFind-Unindexed.yml → fle2v2-InsertFind-Unindexed.yml} +10 -4
  885. data/spec/spec_tests/data/client_side_encryption/{fle2-MissingKey.yml → fle2v2-MissingKey.yml} +5 -3
  886. data/spec/spec_tests/data/client_side_encryption/{fle2-NoEncryption.yml → fle2v2-NoEncryption.yml} +4 -2
  887. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Date-Aggregate.yml +241 -0
  888. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Date-Correctness.yml +422 -0
  889. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Date-Delete.yml +182 -0
  890. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Date-FindOneAndUpdate.yml +239 -0
  891. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Date-InsertFind.yml +235 -0
  892. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Date-Update.yml +252 -0
  893. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Decimal-Aggregate.yml +1687 -0
  894. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Decimal-Correctness.yml +293 -0
  895. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Decimal-Delete.yml +905 -0
  896. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Decimal-FindOneAndUpdate.yml +1684 -0
  897. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Decimal-InsertFind.yml +1680 -0
  898. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Decimal-Update.yml +1697 -0
  899. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-DecimalPrecision-Aggregate.yml +329 -0
  900. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-DecimalPrecision-Correctness.yml +424 -0
  901. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-DecimalPrecision-Delete.yml +226 -0
  902. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-DecimalPrecision-FindOneAndUpdate.yml +327 -0
  903. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-DecimalPrecision-InsertFind.yml +319 -0
  904. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-DecimalPrecision-Update.yml +336 -0
  905. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Double-Aggregate.yml +913 -0
  906. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Double-Correctness.yml +292 -0
  907. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Double-Delete.yml +518 -0
  908. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Double-FindOneAndUpdate.yml +911 -0
  909. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Double-InsertFind.yml +907 -0
  910. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Double-Update.yml +924 -0
  911. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-DoublePrecision-Aggregate.yml +325 -0
  912. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-DoublePrecision-Correctness.yml +424 -0
  913. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-DoublePrecision-Delete.yml +224 -0
  914. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-DoublePrecision-FindOneAndUpdate.yml +323 -0
  915. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-DoublePrecision-InsertFind.yml +319 -0
  916. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-DoublePrecision-Update.yml +338 -0
  917. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Int-Aggregate.yml +241 -0
  918. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Int-Correctness.yml +423 -0
  919. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Int-Delete.yml +182 -0
  920. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Int-FindOneAndUpdate.yml +239 -0
  921. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Int-InsertFind.yml +235 -0
  922. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Int-Update.yml +254 -0
  923. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Long-Aggregate.yml +241 -0
  924. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Long-Correctness.yml +422 -0
  925. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Long-Delete.yml +182 -0
  926. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Long-FindOneAndUpdate.yml +239 -0
  927. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Long-InsertFind.yml +235 -0
  928. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Long-Update.yml +254 -0
  929. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-WrongType.yml +43 -0
  930. data/spec/spec_tests/data/client_side_encryption/{fle2-Update.yml → fle2v2-Update.yml} +33 -44
  931. data/spec/spec_tests/data/client_side_encryption/{fle2-validatorAndPartialFieldExpression.yml → fle2v2-validatorAndPartialFieldExpression.yml} +10 -9
  932. data/spec/spec_tests/data/client_side_encryption/maxWireVersion.yml +1 -1
  933. data/spec/spec_tests/data/client_side_encryption/unified/createDataKey-kms_providers-invalid.yml +1 -1
  934. data/spec/spec_tests/data/cmap/connection-must-have-id.yml +2 -0
  935. data/spec/spec_tests/data/cmap/connection-must-order-ids.yml +2 -0
  936. data/spec/spec_tests/data/cmap/pool-checkin-destroy-closed.yml +2 -0
  937. data/spec/spec_tests/data/cmap/pool-checkin-destroy-stale.yml +2 -0
  938. data/spec/spec_tests/data/cmap/pool-checkin-make-available.yml +3 -1
  939. data/spec/spec_tests/data/cmap/pool-checkin.yml +5 -0
  940. data/spec/spec_tests/data/cmap/pool-checkout-connection.yml +2 -0
  941. data/spec/spec_tests/data/cmap/pool-checkout-custom-maxConnecting-is-enforced.yml +50 -0
  942. data/spec/spec_tests/data/cmap/pool-checkout-error-closed.yml +2 -0
  943. data/spec/spec_tests/data/cmap/pool-checkout-maxConnecting-is-enforced.yml +81 -0
  944. data/spec/spec_tests/data/cmap/pool-checkout-maxConnecting-timeout.yml +71 -0
  945. data/spec/spec_tests/data/cmap/pool-checkout-minPoolSize-connection-maxConnecting.yml +66 -0
  946. data/spec/spec_tests/data/cmap/pool-checkout-multiple.yml +2 -0
  947. data/spec/spec_tests/data/cmap/pool-checkout-no-idle.yml +6 -0
  948. data/spec/spec_tests/data/cmap/pool-checkout-no-stale.yml +8 -0
  949. data/spec/spec_tests/data/cmap/pool-checkout-returned-connection-maxConnecting.yml +88 -0
  950. data/spec/spec_tests/data/cmap/pool-clear-interrupt-immediately.yml +49 -0
  951. data/spec/spec_tests/data/cmap/pool-clear-interrupting-pending-connections.yml +43 -0
  952. data/spec/spec_tests/data/cmap/pool-clear-min-size.yml +41 -0
  953. data/spec/spec_tests/data/cmap/pool-clear-paused.yml +18 -0
  954. data/spec/spec_tests/data/cmap/pool-clear-ready.yml +39 -0
  955. data/spec/spec_tests/data/cmap/pool-clear-schedule-run-interruptInUseConnections-false.yml +48 -0
  956. data/spec/spec_tests/data/cmap/pool-close-destroy-conns.yml +2 -0
  957. data/spec/spec_tests/data/cmap/pool-create-max-size.yml +2 -0
  958. data/spec/spec_tests/data/cmap/pool-create-min-size-error.yml +43 -0
  959. data/spec/spec_tests/data/cmap/pool-create-min-size.yml +9 -0
  960. data/spec/spec_tests/data/cmap/pool-ready-ready.yml +22 -0
  961. data/spec/spec_tests/data/cmap/pool-ready.yml +30 -0
  962. data/spec/spec_tests/data/cmap/wait-queue-fairness.yml +2 -0
  963. data/spec/spec_tests/data/cmap/wait-queue-timeout.yml +6 -1
  964. data/spec/spec_tests/data/collection_management/modifyCollection-errorResponse.yml +59 -0
  965. data/spec/spec_tests/data/collection_management/timeseries-collection.yml +35 -0
  966. data/spec/spec_tests/data/command_monitoring_unified/redacted-commands.yml +8 -0
  967. data/spec/spec_tests/data/command_monitoring_unified/writeConcernError.yml +80 -0
  968. data/spec/spec_tests/data/crud_unified/aggregate-merge-errorResponse.yml +42 -0
  969. data/spec/spec_tests/data/crud_unified/bulkWrite-errorResponse.yml +50 -0
  970. data/spec/spec_tests/data/crud_unified/deleteOne-errorResponse.yml +46 -0
  971. data/spec/spec_tests/data/crud_unified/estimatedDocumentCount.yml +44 -0
  972. data/spec/spec_tests/data/crud_unified/findOneAndUpdate-errorResponse.yml +69 -0
  973. data/spec/spec_tests/data/crud_unified/insertOne-errorResponse.yml +46 -0
  974. data/spec/spec_tests/data/crud_unified/updateOne-errorResponse.yml +47 -0
  975. data/spec/spec_tests/data/retryable_reads/unified/handshakeError.yml +1266 -53
  976. data/spec/spec_tests/data/retryable_writes/unified/bulkWrite-serverErrors.yml +1 -1
  977. data/spec/spec_tests/data/retryable_writes/unified/handshakeError.yml +706 -58
  978. data/spec/spec_tests/data/retryable_writes/unified/insertOne-noWritesPerformedError.yml +54 -0
  979. data/spec/spec_tests/data/retryable_writes/unified/insertOne-serverErrors.yml +1 -1
  980. data/spec/spec_tests/data/sdam/rs/electionId_precedence_setVersion.yml +62 -0
  981. data/spec/spec_tests/data/sdam/rs/null_election_id-pre-6.0.yml +175 -0
  982. data/spec/spec_tests/data/sdam/rs/null_election_id.yml +20 -18
  983. data/spec/spec_tests/data/sdam/rs/secondary_ignore_ok_0-pre-6.0.yml +87 -0
  984. data/spec/spec_tests/data/sdam/rs/secondary_ignore_ok_0.yml +1 -1
  985. data/spec/spec_tests/data/sdam/rs/set_version_can_rollback.yml +101 -0
  986. data/spec/spec_tests/data/sdam/rs/setversion_equal_max_without_electionid.yml +78 -0
  987. data/spec/spec_tests/data/sdam/rs/setversion_greaterthan_max_without_electionid.yml +79 -0
  988. data/spec/spec_tests/data/sdam/rs/setversion_without_electionid-pre-6.0.yml +79 -0
  989. data/spec/spec_tests/data/sdam/rs/setversion_without_electionid.yml +9 -10
  990. data/spec/spec_tests/data/sdam/rs/use_setversion_without_electionid-pre-6.0.yml +117 -0
  991. data/spec/spec_tests/data/sdam/rs/use_setversion_without_electionid.yml +23 -21
  992. data/spec/spec_tests/data/sdam_monitoring/discovered_standalone.yml +1 -1
  993. data/spec/spec_tests/data/sdam_monitoring/replica_set_with_no_primary.yml +38 -39
  994. data/spec/spec_tests/data/sdam_monitoring/replica_set_with_primary.yml +38 -39
  995. data/spec/spec_tests/data/sdam_monitoring/replica_set_with_removal.yml +1 -1
  996. data/spec/spec_tests/data/sdam_monitoring/required_replica_set.yml +1 -1
  997. data/spec/spec_tests/data/sdam_monitoring/standalone.yml +1 -1
  998. data/spec/spec_tests/data/sdam_monitoring/standalone_suppress_equal_description_changes.yml +2 -2
  999. data/spec/spec_tests/data/sdam_unified/auth-error.yml +130 -0
  1000. data/spec/spec_tests/data/sdam_unified/auth-misc-command-error.yml +132 -0
  1001. data/spec/spec_tests/data/sdam_unified/auth-network-error.yml +132 -0
  1002. data/spec/spec_tests/data/sdam_unified/auth-network-timeout-error.yml +138 -0
  1003. data/spec/spec_tests/data/sdam_unified/auth-shutdown-error.yml +133 -0
  1004. data/spec/spec_tests/data/sdam_unified/cancel-server-check.yml +143 -0
  1005. data/spec/spec_tests/data/sdam_unified/connectTimeoutMS.yml +130 -0
  1006. data/spec/spec_tests/data/sdam_unified/find-network-error.yml +135 -0
  1007. data/spec/spec_tests/data/sdam_unified/find-network-timeout-error.yml +119 -0
  1008. data/spec/spec_tests/data/sdam_unified/find-shutdown-error.yml +163 -0
  1009. data/spec/spec_tests/data/sdam_unified/hello-command-error.yml +233 -0
  1010. data/spec/spec_tests/data/sdam_unified/hello-network-error.yml +228 -0
  1011. data/spec/spec_tests/data/sdam_unified/hello-timeout.yml +318 -0
  1012. data/spec/spec_tests/data/sdam_unified/insert-network-error.yml +137 -0
  1013. data/spec/spec_tests/data/sdam_unified/insert-shutdown-error.yml +162 -0
  1014. data/spec/spec_tests/data/sdam_unified/interruptInUse-pool-clear.yml +340 -0
  1015. data/spec/spec_tests/data/sdam_unified/minPoolSize-error.yml +125 -0
  1016. data/spec/spec_tests/data/sdam_unified/pool-cleared-error.yml +239 -0
  1017. data/spec/spec_tests/data/sdam_unified/rediscover-quickly-after-step-down.yml +144 -0
  1018. data/spec/spec_tests/data/seed_list_discovery/load-balanced/loadBalanced-directConnection.yml +6 -5
  1019. data/spec/spec_tests/data/seed_list_discovery/load-balanced/loadBalanced-replicaSet-errors.yml +2 -2
  1020. data/spec/spec_tests/data/seed_list_discovery/load-balanced/loadBalanced-true-txt.yml +5 -4
  1021. data/spec/spec_tests/data/seed_list_discovery/load-balanced/srvMaxHosts-conflicts_with_loadBalanced-true-txt.yml +1 -1
  1022. data/spec/spec_tests/data/seed_list_discovery/load-balanced/srvMaxHosts-zero-txt.yml +4 -3
  1023. data/spec/spec_tests/data/seed_list_discovery/load-balanced/srvMaxHosts-zero.yml +4 -3
  1024. data/spec/spec_tests/data/sessions_unified/implicit-sessions-default-causal-consistency.yml +119 -0
  1025. data/spec/spec_tests/data/sessions_unified/snapshot-sessions-unsupported-ops.yml +1 -1
  1026. data/spec/spec_tests/data/sessions_unified/snapshot-sessions.yml +1 -1
  1027. data/spec/spec_tests/data/transactions_unified/mongos-unpin.yml +1 -1
  1028. data/spec/spec_tests/data/unified/valid-fail/entity-findCursor-malformed.yml +31 -0
  1029. data/spec/spec_tests/data/unified/valid-fail/entity-findCursor.yml +31 -0
  1030. data/spec/spec_tests/data/unified/valid-fail/ignoreResultAndError-malformed.yml +34 -0
  1031. data/spec/spec_tests/data/unified/valid-fail/ignoreResultAndError.yml +35 -0
  1032. data/spec/spec_tests/data/unified/valid-pass/assertNumberConnectionsCheckedOut.yml +17 -0
  1033. data/spec/spec_tests/data/unified/valid-pass/entity-client-cmap-events.yml +40 -0
  1034. data/spec/spec_tests/data/unified/valid-pass/entity-client-storeEventsAsEntities.yml +37 -0
  1035. data/spec/spec_tests/data/unified/valid-pass/expectedError-errorResponse.yml +39 -0
  1036. data/spec/spec_tests/data/unified/valid-pass/expectedEventsForClient-eventType.yml +66 -0
  1037. data/spec/spec_tests/data/unified/valid-pass/ignoreResultAndError.yml +34 -0
  1038. data/spec/spec_tests/data/unified/valid-pass/observeSensitiveCommands.yml +255 -0
  1039. data/spec/spec_tests/data/unified/valid-pass/poc-change-streams.yml +18 -0
  1040. data/spec/spec_tests/data/unified/valid-pass/poc-crud.yml +18 -12
  1041. data/spec/spec_tests/data/unified/valid-pass/poc-retryable-reads.yml +3 -3
  1042. data/spec/spec_tests/data/unified/valid-pass/poc-retryable-writes.yml +2 -2
  1043. data/spec/spec_tests/data/versioned_api/crud-api-version-1-strict.yml +1 -1
  1044. data/spec/spec_tests/data/versioned_api/crud-api-version-1.yml +1 -1
  1045. data/spec/spec_tests/data/versioned_api/transaction-handling.yml +4 -4
  1046. data/spec/spec_tests/gridfs_spec.rb +1 -1
  1047. data/spec/spec_tests/gridfs_unified_spec.rb +1 -1
  1048. data/spec/spec_tests/load_balancers_spec.rb +1 -1
  1049. data/spec/spec_tests/max_staleness_spec.rb +1 -1
  1050. data/spec/spec_tests/read_write_concern_connection_string_spec.rb +1 -1
  1051. data/spec/spec_tests/read_write_concern_document_spec.rb +1 -1
  1052. data/spec/spec_tests/read_write_concern_operaton_spec.rb +1 -1
  1053. data/spec/spec_tests/retryable_reads_spec.rb +3 -1
  1054. data/spec/spec_tests/retryable_reads_unified_spec.rb +1 -1
  1055. data/spec/spec_tests/retryable_writes_spec.rb +1 -1
  1056. data/spec/spec_tests/retryable_writes_unified_spec.rb +1 -1
  1057. data/spec/spec_tests/sdam_monitoring_spec.rb +1 -1
  1058. data/spec/spec_tests/sdam_spec.rb +5 -1
  1059. data/spec/spec_tests/sdam_unified_spec.rb +13 -0
  1060. data/spec/spec_tests/seed_list_discovery_spec.rb +1 -1
  1061. data/spec/spec_tests/server_selection_rtt_spec.rb +1 -1
  1062. data/spec/spec_tests/server_selection_spec.rb +1 -1
  1063. data/spec/spec_tests/sessions_unified_spec.rb +1 -1
  1064. data/spec/spec_tests/transactions_api_spec.rb +1 -1
  1065. data/spec/spec_tests/transactions_spec.rb +1 -1
  1066. data/spec/spec_tests/transactions_unified_spec.rb +1 -1
  1067. data/spec/spec_tests/unified_spec.rb +1 -6
  1068. data/spec/spec_tests/uri_options_spec.rb +1 -1
  1069. data/spec/spec_tests/versioned_api_spec.rb +1 -1
  1070. data/spec/stress/cleanup_spec.rb +1 -1
  1071. data/spec/stress/connection_pool_stress_spec.rb +1 -62
  1072. data/spec/stress/connection_pool_timing_spec.rb +9 -34
  1073. data/spec/stress/fork_reconnect_stress_spec.rb +7 -8
  1074. data/spec/stress/push_monitor_close_spec.rb +1 -1
  1075. data/spec/support/authorization.rb +1 -1
  1076. data/spec/support/aws_utils/base.rb +1 -1
  1077. data/spec/support/aws_utils/inspector.rb +1 -1
  1078. data/spec/support/aws_utils/orchestrator.rb +20 -8
  1079. data/spec/support/aws_utils/provisioner.rb +1 -1
  1080. data/spec/support/aws_utils.rb +4 -3
  1081. data/spec/support/background_thread_registry.rb +1 -1
  1082. data/spec/support/certificates/atlas-ocsp-ca.crt +67 -67
  1083. data/spec/support/certificates/atlas-ocsp.crt +103 -103
  1084. data/spec/support/certificates/retrieve-atlas-cert +2 -0
  1085. data/spec/support/client_registry.rb +6 -2
  1086. data/spec/support/client_registry_macros.rb +1 -1
  1087. data/spec/support/cluster_tools.rb +13 -8
  1088. data/spec/support/common_shortcuts.rb +30 -5
  1089. data/spec/support/constraints.rb +15 -1
  1090. data/spec/support/crypt/{encryptedFields.json → encrypted_fields/encryptedFields.json} +0 -1
  1091. data/spec/support/crypt/encrypted_fields/range-encryptedFields-Date.json +30 -0
  1092. data/spec/support/crypt/encrypted_fields/range-encryptedFields-DecimalNoPrecision.json +21 -0
  1093. data/spec/support/crypt/encrypted_fields/range-encryptedFields-DecimalPrecision.json +29 -0
  1094. data/spec/support/crypt/encrypted_fields/range-encryptedFields-DoubleNoPrecision.json +21 -0
  1095. data/spec/support/crypt/encrypted_fields/range-encryptedFields-DoublePrecision.json +30 -0
  1096. data/spec/support/crypt/encrypted_fields/range-encryptedFields-Int.json +27 -0
  1097. data/spec/support/crypt/encrypted_fields/range-encryptedFields-Long.json +27 -0
  1098. data/spec/support/crypt.rb +13 -3
  1099. data/spec/support/dns.rb +1 -1
  1100. data/spec/support/json_ext_formatter.rb +1 -1
  1101. data/spec/support/keyword_struct.rb +1 -1
  1102. data/spec/support/local_resource_registry.rb +1 -1
  1103. data/spec/support/macros.rb +1 -0
  1104. data/spec/support/matchers.rb +5 -5
  1105. data/spec/support/mongos_macros.rb +7 -0
  1106. data/spec/support/monitoring_ext.rb +1 -1
  1107. data/spec/support/primary_socket.rb +1 -1
  1108. data/spec/support/sdam_formatter_integration.rb +1 -1
  1109. data/spec/support/shared/app_metadata.rb +15 -3
  1110. data/spec/support/shared/auth_context.rb +1 -0
  1111. data/spec/support/shared/protocol.rb +1 -1
  1112. data/spec/support/shared/scram_conversation.rb +1 -1
  1113. data/spec/support/shared/server_selector.rb +1 -1
  1114. data/spec/support/shared/session.rb +1 -1
  1115. data/spec/support/spec_config.rb +40 -3
  1116. data/spec/support/spec_setup.rb +1 -1
  1117. data/spec/support/using_hash.rb +11 -2
  1118. data/spec/support/utils.rb +277 -249
  1119. data.tar.gz.sig +0 -0
  1120. metadata +1456 -1173
  1121. metadata.gz.sig +0 -0
  1122. data/spec/spec_tests/data/sdam_integration/cancel-server-check.yml +0 -96
  1123. data/spec/spec_tests/data/sdam_integration/connectTimeoutMS.yml +0 -88
  1124. data/spec/spec_tests/data/sdam_integration/find-network-error.yml +0 -85
  1125. data/spec/spec_tests/data/sdam_integration/find-shutdown-error.yml +0 -118
  1126. data/spec/spec_tests/data/sdam_integration/hello-command-error.yml +0 -152
  1127. data/spec/spec_tests/data/sdam_integration/hello-network-error.yml +0 -148
  1128. data/spec/spec_tests/data/sdam_integration/hello-timeout.yml +0 -219
  1129. data/spec/spec_tests/data/sdam_integration/insert-network-error.yml +0 -88
  1130. data/spec/spec_tests/data/sdam_integration/insert-shutdown-error.yml +0 -117
  1131. data/spec/spec_tests/data/sdam_integration/rediscover-quickly-after-step-down.yml +0 -98
  1132. data/spec/spec_tests/data/unified/invalid/expectedEventsForClient-ignoreExtraEvents-type.yml +0 -15
  1133. data/spec/spec_tests/sdam_integration_spec.rb +0 -16
@@ -0,0 +1,1605 @@
1
+ # frozen_string_literal: true
2
+ # rubocop:todo all
3
+
4
+ require 'spec_helper'
5
+
6
+ describe Mongo::URI::OptionsMapper do
7
+
8
+ let(:options_mapper) { described_class.new }
9
+ let(:converted) { options_mapper.send(method, name, value) }
10
+ let(:reverted) { options_mapper.send(method, value) }
11
+ let(:name) { "name" }
12
+
13
+ describe "#convert_bool" do
14
+
15
+ let(:method) { :convert_bool }
16
+
17
+ context "when providing false" do
18
+ let(:value) { false }
19
+
20
+ it "returns false" do
21
+ expect(converted).to be false
22
+ end
23
+ end
24
+
25
+ context "when providing true" do
26
+ let(:value) { true }
27
+
28
+ it "returns true" do
29
+ expect(converted).to be true
30
+ end
31
+ end
32
+
33
+ context "when providing a true string" do
34
+ let(:value) { "true" }
35
+
36
+ it "returns true" do
37
+ expect(converted).to be true
38
+ end
39
+ end
40
+
41
+ context "when providing a capital true string" do
42
+ let(:value) { "TRUE" }
43
+
44
+ it "returns true" do
45
+ expect(converted).to be true
46
+ end
47
+ end
48
+
49
+ context "when providing a false string" do
50
+ let(:value) { "false" }
51
+
52
+ it "returns false" do
53
+ expect(converted).to be false
54
+ end
55
+ end
56
+
57
+ context "when providing a false string" do
58
+ let(:value) { "FALSE" }
59
+
60
+ it "returns false" do
61
+ expect(converted).to be false
62
+ end
63
+ end
64
+
65
+ context "when providing a different string" do
66
+ let(:value) { "hello" }
67
+
68
+ it "returns nil" do
69
+ expect(converted).to be nil
70
+ end
71
+ end
72
+
73
+ context "when providing a different type" do
74
+ let(:value) { :hello }
75
+
76
+ it "returns nil" do
77
+ expect(converted).to be nil
78
+ end
79
+ end
80
+ end
81
+
82
+ describe "#revert_bool" do
83
+
84
+ let(:method) { :revert_bool }
85
+
86
+ context "when passing a boolean" do
87
+ let(:value) { true }
88
+
89
+ it "returns the boolean" do
90
+ expect(reverted).to eq(value)
91
+ end
92
+ end
93
+
94
+ context "when passing nil" do
95
+ let(:value) { nil }
96
+
97
+ it "returns nil" do
98
+ expect(reverted).to be nil
99
+ end
100
+ end
101
+ end
102
+
103
+ describe "#stringify_bool" do
104
+
105
+ let(:method) { :stringify_bool }
106
+
107
+ context "when passing a boolean" do
108
+ let(:value) { true }
109
+
110
+ it "returns a string" do
111
+ expect(reverted).to eq("true")
112
+ end
113
+ end
114
+
115
+ context "when passing false" do
116
+ let(:value) { false }
117
+
118
+ it "returns a string" do
119
+ expect(reverted).to eq("false")
120
+ end
121
+ end
122
+
123
+ context "when passing nil" do
124
+ let(:value) { nil }
125
+
126
+ it "returns nil" do
127
+ expect(reverted).to be nil
128
+ end
129
+ end
130
+ end
131
+
132
+ describe "#convert_repeated_bool" do
133
+
134
+ let(:method) { :convert_repeated_bool }
135
+ let(:value) { true }
136
+
137
+ it "wraps the result in an array" do
138
+ expect(converted).to eq([ true ])
139
+ end
140
+ end
141
+
142
+ describe "#revert_repeated_bool" do
143
+
144
+ let(:method) { :revert_repeated_bool }
145
+
146
+ context "when passing a boolean list" do
147
+ let(:value) { [ true ] }
148
+
149
+ it "returns the passed value" do
150
+ expect(reverted).to eq(value)
151
+ end
152
+ end
153
+
154
+ context "when passing nil" do
155
+ let(:value) { nil }
156
+
157
+ it "returns nil" do
158
+ expect(reverted).to be nil
159
+ end
160
+ end
161
+ end
162
+
163
+ describe "#stringify_repeated_bool" do
164
+
165
+ let(:method) { :stringify_repeated_bool }
166
+
167
+ context "when passing a boolean list" do
168
+ let(:value) { [ true ] }
169
+
170
+ it "returns a string" do
171
+ expect(reverted).to eq("true")
172
+ end
173
+ end
174
+
175
+ context "when passing a multi boolean list" do
176
+ let(:value) { [ true, false ] }
177
+
178
+ it "returns a string" do
179
+ expect(reverted).to eq("true,false")
180
+ end
181
+ end
182
+
183
+ context "when passing nil" do
184
+ let(:value) { nil }
185
+
186
+ it "returns nil" do
187
+ expect(reverted).to be nil
188
+ end
189
+ end
190
+ end
191
+
192
+ describe "#convert_inverse_bool" do
193
+
194
+ let(:method) { :convert_inverse_bool }
195
+
196
+ context "when providing false" do
197
+ let(:value) { false }
198
+
199
+ it "returns false" do
200
+ expect(converted).to be true
201
+ end
202
+ end
203
+
204
+ context "when providing true" do
205
+ let(:value) { true }
206
+
207
+ it "returns true" do
208
+ expect(converted).to be false
209
+ end
210
+ end
211
+
212
+ context "when providing a true string" do
213
+ let(:value) { "true" }
214
+
215
+ it "returns true" do
216
+ expect(converted).to be false
217
+ end
218
+ end
219
+
220
+ context "when providing a capital true string" do
221
+ let(:value) { "TRUE" }
222
+
223
+ it "returns true" do
224
+ expect(converted).to be false
225
+ end
226
+ end
227
+
228
+ context "when providing a false string" do
229
+ let(:value) { "false" }
230
+
231
+ it "returns false" do
232
+ expect(converted).to be true
233
+ end
234
+ end
235
+
236
+ context "when providing a false string" do
237
+ let(:value) { "FALSE" }
238
+
239
+ it "returns false" do
240
+ expect(converted).to be true
241
+ end
242
+ end
243
+
244
+ context "when providing a different string" do
245
+ let(:value) { "hello" }
246
+
247
+ it "returns nil" do
248
+ expect(converted).to be nil
249
+ end
250
+ end
251
+
252
+ context "when providing a different type" do
253
+ let(:value) { :hello }
254
+
255
+ it "returns nil" do
256
+ expect(converted).to be nil
257
+ end
258
+ end
259
+ end
260
+
261
+ describe "#revert_inverse_bool" do
262
+
263
+ let(:method) { :revert_inverse_bool }
264
+
265
+ context "when passing true" do
266
+ let(:value) { true }
267
+
268
+ it "returns false" do
269
+ expect(reverted).to be false
270
+ end
271
+ end
272
+
273
+ context "when passing false" do
274
+ let(:value) { false }
275
+
276
+ it "returns true" do
277
+ expect(reverted).to be true
278
+ end
279
+ end
280
+
281
+ context "when passing nil" do
282
+ let(:value) { nil }
283
+
284
+ it "returns nil" do
285
+ expect(reverted).to be nil
286
+ end
287
+ end
288
+ end
289
+
290
+ describe "#stringify_inverse_bool" do
291
+
292
+ let(:method) { :stringify_inverse_bool }
293
+
294
+ context "when passing true" do
295
+ let(:value) { true }
296
+
297
+ it "returns false string" do
298
+ expect(reverted).to eq("false")
299
+ end
300
+ end
301
+
302
+ context "when passing false" do
303
+ let(:value) { false }
304
+
305
+ it "returns true string" do
306
+ expect(reverted).to eq("true")
307
+ end
308
+ end
309
+
310
+ context "when passing nil" do
311
+ let(:value) { nil }
312
+
313
+ it "returns nil" do
314
+ expect(reverted).to be nil
315
+ end
316
+ end
317
+ end
318
+
319
+ describe "#convert_integer" do
320
+
321
+ let(:method) { :convert_integer }
322
+
323
+ context "when passing an integer" do
324
+ let(:value) { 1 }
325
+
326
+ it "returns as an integer" do
327
+ expect(converted).to eq(1)
328
+ end
329
+ end
330
+
331
+ context "when passing an integer string" do
332
+ let(:value) { "42" }
333
+
334
+ it "returns as an integer" do
335
+ expect(converted).to eq(42)
336
+ end
337
+ end
338
+
339
+ context "when passing an invalid string" do
340
+ let(:value) { "hello" }
341
+
342
+ it "returns nil" do
343
+ expect(converted).to be nil
344
+ end
345
+ end
346
+ end
347
+
348
+ describe "#revert_integer" do
349
+
350
+ let(:method) { :revert_integer }
351
+
352
+ context "when passing an integer" do
353
+ let(:value) { 1 }
354
+
355
+ it "returns the passed value" do
356
+ expect(reverted).to eq(value)
357
+ end
358
+ end
359
+
360
+ context "when passing nil" do
361
+ let(:value) { nil }
362
+
363
+ it "returns nil" do
364
+ expect(reverted).to be nil
365
+ end
366
+ end
367
+ end
368
+
369
+ describe "#stringify_integer" do
370
+
371
+ let(:method) { :stringify_integer }
372
+
373
+ context "when passing an integer" do
374
+ let(:value) { 1 }
375
+
376
+ it "returns the passed value as a string" do
377
+ expect(reverted).to eq("1")
378
+ end
379
+ end
380
+
381
+ context "when passing nil" do
382
+ let(:value) { nil }
383
+
384
+ it "returns nil" do
385
+ expect(reverted).to be nil
386
+ end
387
+ end
388
+ end
389
+
390
+ describe "#convert_ms" do
391
+
392
+ let(:method) { :convert_ms }
393
+
394
+ context "when passing an integer" do
395
+ let(:value) { 1000 }
396
+
397
+ it "returns a float divided by 1000" do
398
+ expect(converted).to eq(1.0)
399
+ end
400
+ end
401
+
402
+ context "when passing a negative integer" do
403
+ let(:value) { -1000 }
404
+
405
+ it "returns a float divided by 1000" do
406
+ expect(converted).to be nil
407
+ end
408
+ end
409
+
410
+ context "when passing an integer string" do
411
+ let(:value) { "1000" }
412
+
413
+ it "returns a float divided by 1000" do
414
+ expect(converted).to eq(1.0)
415
+ end
416
+ end
417
+
418
+ context "when passing a negative integer string" do
419
+ let(:value) { "-1000" }
420
+
421
+ it "returns a float divided by 1000" do
422
+ expect(converted).to be nil
423
+ end
424
+ end
425
+
426
+ context "when passing a float string" do
427
+ let(:value) { "1000.5" }
428
+
429
+ it "returns a float divided by 1000" do
430
+ expect(converted).to eq(1.0005)
431
+ end
432
+ end
433
+
434
+ context "when passing a negative float string" do
435
+ let(:value) { "-1000.5" }
436
+
437
+ it "returns a float divided by 1000" do
438
+ expect(converted).to be nil
439
+ end
440
+ end
441
+
442
+ context "when passing a float" do
443
+ let(:value) { 1000.5 }
444
+
445
+ it "returns a float divided by 1000" do
446
+ expect(converted).to eq(1.0005)
447
+ end
448
+ end
449
+
450
+ context "when passing a negative float" do
451
+ let(:value) { -1000.5 }
452
+
453
+ it "returns a float divided by 1000" do
454
+ expect(converted).to be nil
455
+ end
456
+ end
457
+ end
458
+
459
+ describe "#revert_ms" do
460
+
461
+ let(:method) { :revert_ms }
462
+
463
+ context "when passing a float" do
464
+ let(:value) { 1.000005 }
465
+
466
+ it "returns an integer" do
467
+ expect(reverted).to eq(1000)
468
+ end
469
+ end
470
+ end
471
+
472
+ describe "#stringify_ms" do
473
+
474
+ let(:method) { :stringify_ms }
475
+
476
+ context "when passing a float" do
477
+ let(:value) { 1.000005 }
478
+
479
+ it "returns a string" do
480
+ expect(reverted).to eq("1000")
481
+ end
482
+ end
483
+ end
484
+
485
+ describe "#convert_symbol" do
486
+
487
+ let(:method) { :convert_symbol }
488
+
489
+ context "when passing a string" do
490
+ let(:value) { "hello" }
491
+
492
+ it "returns a symbol" do
493
+ expect(converted).to eq(:hello)
494
+ end
495
+ end
496
+
497
+ context "when passing a symbol" do
498
+ let(:value) { :hello }
499
+
500
+ it "returns a symbol" do
501
+ expect(converted).to eq(:hello)
502
+ end
503
+ end
504
+ end
505
+
506
+ describe "#revert_symbol" do
507
+
508
+ let(:method) { :revert_symbol }
509
+
510
+ context "when passing a symbol" do
511
+ let(:value) { :hello }
512
+
513
+ it "returns it as a string" do
514
+ expect(reverted).to eq("hello")
515
+ end
516
+ end
517
+ end
518
+
519
+ describe "#stringify_symbol" do
520
+
521
+ let(:method) { :stringify_symbol }
522
+
523
+ context "when passing a symbol" do
524
+ let(:value) { :hello }
525
+
526
+ it "returns it as a string" do
527
+ expect(reverted).to eq("hello")
528
+ end
529
+ end
530
+ end
531
+
532
+ describe "#convert_array" do
533
+
534
+ let(:method) { :convert_array }
535
+
536
+ context "when passing a string with no commas" do
537
+ let(:value) { "hello" }
538
+
539
+ it "returns one element" do
540
+ expect(converted).to eq([ "hello" ])
541
+ end
542
+ end
543
+
544
+ context "when passing a string with commas" do
545
+ let(:value) { "1,2,3" }
546
+
547
+ it "returns multiple elements" do
548
+ expect(converted).to eq([ '1', '2', '3' ])
549
+ end
550
+ end
551
+ end
552
+
553
+ describe "#revert_array" do
554
+
555
+ let(:method) { :revert_array }
556
+
557
+ context "when passing one value" do
558
+ let(:value) { [ "hello" ] }
559
+
560
+ it "returns the value" do
561
+ expect(reverted).to eq(value)
562
+ end
563
+ end
564
+
565
+ context "when passing multiple value" do
566
+ let(:value) { [ "1", "2", "3" ] }
567
+
568
+ it "returns the value" do
569
+ expect(reverted).to eq(value)
570
+ end
571
+ end
572
+ end
573
+
574
+ describe "#stringify_array" do
575
+
576
+ let(:method) { :stringify_array }
577
+
578
+ context "when passing one value" do
579
+ let(:value) { [ "hello" ] }
580
+
581
+ it "returns a string" do
582
+ expect(reverted).to eq("hello")
583
+ end
584
+ end
585
+
586
+ context "when passing multiple value" do
587
+ let(:value) { [ "1", "2", "3" ] }
588
+
589
+ it "returns the joined string" do
590
+ expect(reverted).to eq("1,2,3")
591
+ end
592
+ end
593
+ end
594
+
595
+ describe "#convert_auth_mech" do
596
+
597
+ let(:method) { :convert_auth_mech }
598
+
599
+ context "when passing GSSAPI" do
600
+ let(:value) { "GSSAPI" }
601
+
602
+ it "returns it as a symbol" do
603
+ expect(converted).to eq(:gssapi)
604
+ end
605
+ end
606
+
607
+ context "when passing MONGODB-AWS" do
608
+ let(:value) { "MONGODB-AWS" }
609
+
610
+ it "returns it as a symbol" do
611
+ expect(converted).to eq(:aws)
612
+ end
613
+ end
614
+
615
+ context "when passing MONGODB-CR" do
616
+ let(:value) { "MONGODB-CR" }
617
+
618
+ it "returns it as a symbol" do
619
+ expect(converted).to eq(:mongodb_cr)
620
+ end
621
+ end
622
+
623
+ context "when passing MONGODB-X509" do
624
+ let(:value) { "MONGODB-X509" }
625
+
626
+ it "returns it as a symbol" do
627
+ expect(converted).to eq(:mongodb_x509)
628
+ end
629
+ end
630
+
631
+ context "when passing PLAIN" do
632
+ let(:value) { "PLAIN" }
633
+
634
+ it "returns it as a symbol" do
635
+ expect(converted).to eq(:plain)
636
+ end
637
+ end
638
+
639
+ context "when passing SCRAM-SHA-1" do
640
+ let(:value) { "SCRAM-SHA-1" }
641
+
642
+ it "returns it as a symbol" do
643
+ expect(converted).to eq(:scram)
644
+ end
645
+ end
646
+
647
+ context "when passing SCRAM-SHA-256" do
648
+ let(:value) { "SCRAM-SHA-256" }
649
+
650
+ it "returns it as a symbol" do
651
+ expect(converted).to eq(:scram256)
652
+ end
653
+ end
654
+
655
+ context "when passing a bogus value" do
656
+ let(:value) { "hello" }
657
+
658
+ it "returns the value" do
659
+ expect(converted).to eq("hello")
660
+ end
661
+
662
+ it "warns" do
663
+ expect(options_mapper).to receive(:log_warn).once
664
+ converted
665
+ end
666
+ end
667
+ end
668
+
669
+ describe "#revert_auth_mech" do
670
+
671
+ let(:method) { :revert_auth_mech }
672
+
673
+ context "when passing GSSAPI" do
674
+ let(:value) { :gssapi }
675
+
676
+ it "returns it as a string" do
677
+ expect(reverted).to eq("GSSAPI")
678
+ end
679
+ end
680
+
681
+ context "when passing MONGODB-AWS" do
682
+ let(:value) { :aws }
683
+
684
+ it "returns it as a string" do
685
+ expect(reverted).to eq("MONGODB-AWS")
686
+ end
687
+ end
688
+
689
+ context "when passing MONGODB-CR" do
690
+ let(:value) { :mongodb_cr }
691
+
692
+ it "returns it as a string" do
693
+ expect(reverted).to eq("MONGODB-CR")
694
+ end
695
+ end
696
+
697
+ context "when passing MONGODB-X509" do
698
+ let(:value) { :mongodb_x509 }
699
+
700
+ it "returns it as a string" do
701
+ expect(reverted).to eq("MONGODB-X509")
702
+ end
703
+ end
704
+
705
+ context "when passing PLAIN" do
706
+ let(:value) { :plain }
707
+
708
+ it "returns it as a string" do
709
+ expect(reverted).to eq("PLAIN")
710
+ end
711
+ end
712
+
713
+ context "when passing SCRAM-SHA-1" do
714
+ let(:value) { :scram }
715
+
716
+ it "returns it as a string" do
717
+ expect(reverted).to eq("SCRAM-SHA-1")
718
+ end
719
+ end
720
+
721
+ context "when passing SCRAM-SHA-256" do
722
+ let(:value) { :scram256 }
723
+
724
+ it "returns it as a string" do
725
+ expect(reverted).to eq("SCRAM-SHA-256")
726
+ end
727
+ end
728
+
729
+ context "when passing a bogus value" do
730
+ let(:value) { "hello" }
731
+
732
+ it "raises an error" do
733
+ expect do
734
+ reverted
735
+ end.to raise_error(ArgumentError, "Unknown auth mechanism hello")
736
+ end
737
+ end
738
+
739
+ context "when passing nil" do
740
+ let(:value) { nil }
741
+
742
+ it "raises an error" do
743
+ expect do
744
+ reverted
745
+ end.to raise_error(ArgumentError, "Unknown auth mechanism #{nil}")
746
+ end
747
+ end
748
+ end
749
+
750
+ describe "#stringify_auth_mech" do
751
+
752
+ let(:method) { :stringify_auth_mech }
753
+
754
+ context "when passing GSSAPI" do
755
+ let(:value) { :gssapi }
756
+
757
+ it "returns it as a string" do
758
+ expect(reverted).to eq("GSSAPI")
759
+ end
760
+ end
761
+
762
+ context "when passing MONGODB-AWS" do
763
+ let(:value) { :aws }
764
+
765
+ it "returns it as a string" do
766
+ expect(reverted).to eq("MONGODB-AWS")
767
+ end
768
+ end
769
+
770
+ context "when passing MONGODB-CR" do
771
+ let(:value) { :mongodb_cr }
772
+
773
+ it "returns it as a string" do
774
+ expect(reverted).to eq("MONGODB-CR")
775
+ end
776
+ end
777
+
778
+ context "when passing MONGODB-X509" do
779
+ let(:value) { :mongodb_x509 }
780
+
781
+ it "returns it as a string" do
782
+ expect(reverted).to eq("MONGODB-X509")
783
+ end
784
+ end
785
+
786
+ context "when passing PLAIN" do
787
+ let(:value) { :plain }
788
+
789
+ it "returns it as a string" do
790
+ expect(reverted).to eq("PLAIN")
791
+ end
792
+ end
793
+
794
+ context "when passing SCRAM-SHA-1" do
795
+ let(:value) { :scram }
796
+
797
+ it "returns it as a string" do
798
+ expect(reverted).to eq("SCRAM-SHA-1")
799
+ end
800
+ end
801
+
802
+ context "when passing SCRAM-SHA-256" do
803
+ let(:value) { :scram256 }
804
+
805
+ it "returns it as a string" do
806
+ expect(reverted).to eq("SCRAM-SHA-256")
807
+ end
808
+ end
809
+
810
+ context "when passing a bogus value" do
811
+ let(:value) { "hello" }
812
+
813
+ it "returns nil" do
814
+ expect(reverted).to be nil
815
+ end
816
+ end
817
+
818
+ context "when passing nil" do
819
+ let(:value) { nil }
820
+
821
+ it "returns nil" do
822
+ expect(reverted).to be nil
823
+ end
824
+ end
825
+ end
826
+
827
+ describe "#convert_auth_mech_props" do
828
+
829
+ let(:method) { :convert_auth_mech_props }
830
+
831
+ context "when including one item" do
832
+ let(:value) { "key:value" }
833
+
834
+ it "returns a one element hash" do
835
+ expect(converted).to eq(key: "value")
836
+ end
837
+ end
838
+
839
+ context "when including multiple items" do
840
+ let(:value) { "k1:v1,k2:v2" }
841
+
842
+ it "returns a multiple element hash" do
843
+ expect(converted).to eq(k1: "v1", k2: "v2")
844
+ end
845
+ end
846
+
847
+ context "when including items without a colon" do
848
+ let(:value) { "k1:v1,k2,v2" }
849
+
850
+ it "drops those items" do
851
+ expect(converted).to eq(k1: "v1")
852
+ end
853
+
854
+ it "warns" do
855
+ expect(options_mapper).to receive(:log_warn).twice
856
+ converted
857
+ end
858
+ end
859
+
860
+ context "when giving the empty string" do
861
+ let(:value) { "" }
862
+
863
+ it "returns nil" do
864
+ expect(converted).to be nil
865
+ end
866
+ end
867
+
868
+ context "when giving no valid options" do
869
+ let(:value) { "k1,k2" }
870
+
871
+ it "returns nil" do
872
+ expect(converted).to be nil
873
+ end
874
+ end
875
+
876
+ context "when passing CANONICALIZE_HOST_NAME" do
877
+
878
+ context "when passing true" do
879
+ let(:value) { "CANONICALIZE_HOST_NAME:true" }
880
+
881
+ it "returns true as a boolean" do
882
+ expect(converted).to eq(CANONICALIZE_HOST_NAME: true)
883
+ end
884
+ end
885
+
886
+ context "when passing uppercase true" do
887
+ let(:value) { "CANONICALIZE_HOST_NAME:TRUE" }
888
+
889
+ it "returns true as a boolean" do
890
+ expect(converted).to eq(CANONICALIZE_HOST_NAME: true)
891
+ end
892
+ end
893
+
894
+ context "when passing false" do
895
+ let(:value) { "CANONICALIZE_HOST_NAME:false" }
896
+
897
+ it "returns false as a boolean" do
898
+ expect(converted).to eq(CANONICALIZE_HOST_NAME: false)
899
+ end
900
+ end
901
+
902
+ context "when passing bogus" do
903
+ let(:value) { "CANONICALIZE_HOST_NAME:bogus" }
904
+
905
+ it "returns false as a boolean" do
906
+ expect(converted).to eq(CANONICALIZE_HOST_NAME: false)
907
+ end
908
+ end
909
+ end
910
+ end
911
+
912
+ describe "#revert_auth_mech_props" do
913
+
914
+ let(:method) { :revert_auth_mech_props }
915
+
916
+ context "when including one item" do
917
+ let(:value) { { key: "value" } }
918
+
919
+ it "returns a one element hash" do
920
+ expect(reverted).to eq(value)
921
+ end
922
+ end
923
+
924
+ context "when including multiple items" do
925
+ let(:value) { { k1: "v1", k2: "v2" } }
926
+
927
+ it "returns a multiple element hash" do
928
+ expect(reverted).to eq(value)
929
+ end
930
+ end
931
+
932
+ context "when passing nil" do
933
+ let(:value) { nil }
934
+
935
+ it "returns nil" do
936
+ expect(reverted).to be nil
937
+ end
938
+ end
939
+ end
940
+
941
+ describe "#stringify_auth_mech_props" do
942
+
943
+ let(:method) { :stringify_auth_mech_props }
944
+
945
+ context "when including one item" do
946
+ let(:value) { { key: "value" } }
947
+
948
+ it "returns a string" do
949
+ expect(reverted).to eq("key:value")
950
+ end
951
+ end
952
+
953
+ context "when including multiple items" do
954
+ let(:value) { { k1: "v1", k2: "v2" } }
955
+
956
+ it "returns a string" do
957
+ expect(reverted).to eq("k1:v1,k2:v2")
958
+ end
959
+ end
960
+
961
+ context "when passing nil" do
962
+ let(:value) { nil }
963
+
964
+ it "returns nil" do
965
+ expect(reverted).to be nil
966
+ end
967
+ end
968
+ end
969
+
970
+ describe "#convert_max_staleness" do
971
+
972
+ let(:method) { :convert_max_staleness }
973
+
974
+ context "when passing a string" do
975
+
976
+ context "when passing a positive integer" do
977
+ let(:value) { "100" }
978
+
979
+ it "returns an integer" do
980
+ expect(converted).to eq(100)
981
+ end
982
+ end
983
+
984
+ context "when passing a negative integer" do
985
+ let(:value) { "-100" }
986
+
987
+ it "returns an integer" do
988
+ expect(converted).to be nil
989
+ end
990
+
991
+ it "warns" do
992
+ expect(options_mapper).to receive(:log_warn).once
993
+ converted
994
+ end
995
+ end
996
+
997
+ context "when passing a bogus value" do
998
+ let(:value) { "hello" }
999
+
1000
+ it "returns an integer" do
1001
+ expect(converted).to be nil
1002
+ end
1003
+ end
1004
+ end
1005
+
1006
+ context "when passing an integer" do
1007
+
1008
+ context "when passing a positive integer" do
1009
+ let(:value) { 100 }
1010
+
1011
+ it "returns an integer" do
1012
+ expect(converted).to eq(100)
1013
+ end
1014
+ end
1015
+
1016
+ context "when passing a negative integer" do
1017
+ let(:value) { -100 }
1018
+
1019
+ it "returns an integer" do
1020
+ expect(converted).to be nil
1021
+ end
1022
+
1023
+ it "warns" do
1024
+ expect(options_mapper).to receive(:log_warn).once
1025
+ converted
1026
+ end
1027
+ end
1028
+
1029
+ context "when passing negative 1" do
1030
+ let(:value) { -1 }
1031
+
1032
+ it "returns an integer" do
1033
+ expect(converted).to be nil
1034
+ end
1035
+
1036
+ it "doesn't warn" do
1037
+ expect(options_mapper).to receive(:log_warn).never
1038
+ converted
1039
+ end
1040
+ end
1041
+
1042
+ context "when passing 0" do
1043
+ let(:value) { 0 }
1044
+
1045
+ it "returns 0" do
1046
+ expect(converted).to eq(0)
1047
+ end
1048
+
1049
+ it "doesn't warn" do
1050
+ expect(options_mapper).to receive(:log_warn).never
1051
+ converted
1052
+ end
1053
+ end
1054
+
1055
+ context "when passing a number less than 90" do
1056
+ let(:value) { 50 }
1057
+
1058
+ it "returns nil" do
1059
+ expect(converted).to be nil
1060
+ end
1061
+ end
1062
+ end
1063
+
1064
+ context "when passing a bogus value" do
1065
+ let(:value) { :hello }
1066
+
1067
+ it "returns nil" do
1068
+ expect(converted).to be nil
1069
+ end
1070
+ end
1071
+ end
1072
+
1073
+ describe "#revert_max_staleness" do
1074
+
1075
+ let(:method) { :revert_max_staleness }
1076
+
1077
+ context "when passing an integer" do
1078
+ let(:value) { 1 }
1079
+
1080
+ it "returns the integer" do
1081
+ expect(reverted).to eq(1)
1082
+ end
1083
+ end
1084
+
1085
+ context "when passing nil" do
1086
+ let(:value) { nil }
1087
+
1088
+ it "returns nil" do
1089
+ expect(reverted).to be nil
1090
+ end
1091
+ end
1092
+ end
1093
+
1094
+ describe "#stringify_max_staleness" do
1095
+
1096
+ let(:method) { :stringify_max_staleness }
1097
+
1098
+ context "when passing an integer" do
1099
+ let(:value) { 1 }
1100
+
1101
+ it "returns the integer string" do
1102
+ expect(reverted).to eq('1')
1103
+ end
1104
+ end
1105
+
1106
+ context "when passing nil" do
1107
+ let(:value) { nil }
1108
+
1109
+ it "returns nil" do
1110
+ expect(reverted).to be nil
1111
+ end
1112
+ end
1113
+ end
1114
+
1115
+ describe "#convert_read_mode" do
1116
+
1117
+ let(:method) { :convert_read_mode }
1118
+
1119
+ context "when passing primary" do
1120
+ let(:value) { "primary" }
1121
+
1122
+ it "returns it as a symbol" do
1123
+ expect(converted).to eq(:primary)
1124
+ end
1125
+ end
1126
+
1127
+ context "when passing primarypreferred" do
1128
+ let(:value) { "primarypreferred" }
1129
+
1130
+ it "returns it as a symbol" do
1131
+ expect(converted).to eq(:primary_preferred)
1132
+ end
1133
+ end
1134
+
1135
+ context "when passing secondary" do
1136
+ let(:value) { "secondary" }
1137
+
1138
+ it "returns it as a symbol" do
1139
+ expect(converted).to eq(:secondary)
1140
+ end
1141
+ end
1142
+
1143
+ context "when passing secondarypreferred" do
1144
+ let(:value) { "secondarypreferred" }
1145
+
1146
+ it "returns it as a symbol" do
1147
+ expect(converted).to eq(:secondary_preferred)
1148
+ end
1149
+ end
1150
+
1151
+ context "when passing nearest" do
1152
+ let(:value) { "nearest" }
1153
+
1154
+ it "returns it as a symbol" do
1155
+ expect(converted).to eq(:nearest)
1156
+ end
1157
+ end
1158
+
1159
+ context "when passing capitalized primary" do
1160
+ let(:value) { "Primary" }
1161
+
1162
+ it "returns it as a symbol" do
1163
+ expect(converted).to eq(:primary)
1164
+ end
1165
+ end
1166
+
1167
+ context "when passing a bogus string" do
1168
+ let(:value) { "hello" }
1169
+
1170
+ it "returns the string" do
1171
+ expect(converted).to eq(value)
1172
+ end
1173
+ end
1174
+ end
1175
+
1176
+ describe "#revert_read_mode" do
1177
+
1178
+ let(:method) { :revert_read_mode }
1179
+
1180
+ context "when passing primary" do
1181
+ let(:value) { :primary }
1182
+
1183
+ it "returns it as a string" do
1184
+ expect(reverted).to eq("primary")
1185
+ end
1186
+ end
1187
+
1188
+ context "when passing primarypreferred" do
1189
+ let(:value) { :primary_preferred }
1190
+
1191
+ it "returns it as a string" do
1192
+ expect(reverted).to eq("primaryPreferred")
1193
+ end
1194
+ end
1195
+
1196
+ context "when passing secondary" do
1197
+ let(:value) { :secondary }
1198
+
1199
+ it "returns it as a string" do
1200
+ expect(reverted).to eq("secondary")
1201
+ end
1202
+ end
1203
+
1204
+ context "when passing secondarypreferred" do
1205
+ let(:value) { :secondary_preferred }
1206
+
1207
+ it "returns it as a string" do
1208
+ expect(reverted).to eq("secondaryPreferred")
1209
+ end
1210
+ end
1211
+
1212
+ context "when passing nearest" do
1213
+ let(:value) { :nearest }
1214
+
1215
+ it "returns it as a string" do
1216
+ expect(reverted).to eq("nearest")
1217
+ end
1218
+ end
1219
+
1220
+ context "when passing a bogus string" do
1221
+ let(:value) { "hello" }
1222
+
1223
+ it "returns the string" do
1224
+ expect(reverted).to eq("hello")
1225
+ end
1226
+ end
1227
+ end
1228
+
1229
+ describe "#stringify_read_mode" do
1230
+
1231
+ let(:method) { :stringify_read_mode }
1232
+
1233
+ context "when passing primary" do
1234
+ let(:value) { :primary }
1235
+
1236
+ it "returns it as a string" do
1237
+ expect(reverted).to eq("primary")
1238
+ end
1239
+ end
1240
+
1241
+ context "when passing primarypreferred" do
1242
+ let(:value) { :primary_preferred }
1243
+
1244
+ it "returns it as a string" do
1245
+ expect(reverted).to eq("primaryPreferred")
1246
+ end
1247
+ end
1248
+
1249
+ context "when passing secondary" do
1250
+ let(:value) { :secondary }
1251
+
1252
+ it "returns it as a string" do
1253
+ expect(reverted).to eq("secondary")
1254
+ end
1255
+ end
1256
+
1257
+ context "when passing secondarypreferred" do
1258
+ let(:value) { :secondary_preferred }
1259
+
1260
+ it "returns it as a string" do
1261
+ expect(reverted).to eq("secondaryPreferred")
1262
+ end
1263
+ end
1264
+
1265
+ context "when passing nearest" do
1266
+ let(:value) { :nearest }
1267
+
1268
+ it "returns it as a string" do
1269
+ expect(reverted).to eq("nearest")
1270
+ end
1271
+ end
1272
+
1273
+ context "when passing a bogus string" do
1274
+ let(:value) { "hello" }
1275
+
1276
+ it "returns the string" do
1277
+ expect(reverted).to eq("hello")
1278
+ end
1279
+ end
1280
+ end
1281
+
1282
+ describe "#convert_read_tags" do
1283
+
1284
+ let(:method) { :convert_read_tags }
1285
+
1286
+ context "when including one item" do
1287
+ let(:value) { "key:value" }
1288
+
1289
+ it "returns a one element hash" do
1290
+ expect(converted).to eq([{ key: "value" }])
1291
+ end
1292
+ end
1293
+
1294
+ context "when including multiple items" do
1295
+ let(:value) { "k1:v1,k2:v2" }
1296
+
1297
+ it "returns a multiple element hash" do
1298
+ expect(converted).to eq([{ k1: "v1", k2: "v2" }])
1299
+ end
1300
+ end
1301
+
1302
+ context "when including items without a colon" do
1303
+ let(:value) { "k1:v1,k2,v2" }
1304
+
1305
+ it "drops those items" do
1306
+ expect(converted).to eq([{ k1: "v1" }])
1307
+ end
1308
+
1309
+ it "warns" do
1310
+ expect(options_mapper).to receive(:log_warn).twice
1311
+ converted
1312
+ end
1313
+ end
1314
+
1315
+ context "when giving the empty string" do
1316
+ let(:value) { "" }
1317
+
1318
+ it "returns nil" do
1319
+ expect(converted).to be nil
1320
+ end
1321
+ end
1322
+
1323
+ context "when giving no valid options" do
1324
+ let(:value) { "k1,k2" }
1325
+
1326
+ it "returns nil" do
1327
+ expect(converted).to be nil
1328
+ end
1329
+ end
1330
+ end
1331
+
1332
+ describe "#revert_read_tags" do
1333
+
1334
+ let(:method) { :revert_read_tags }
1335
+
1336
+ context "when including one item" do
1337
+ let(:value) { [ { key: "value" } ] }
1338
+
1339
+ it "returns the passed value" do
1340
+ expect(reverted).to eq(value)
1341
+ end
1342
+ end
1343
+
1344
+ context "when including multiple items" do
1345
+ let(:value) { [ { k1: "v1", k2: "v2" } ] }
1346
+
1347
+ it "returns the passed value" do
1348
+ expect(reverted).to eq(value)
1349
+ end
1350
+ end
1351
+
1352
+ context "when including multiple hashes" do
1353
+ let(:value) { [ { k1: "v1", k2: "v2" }, { k3: "v3", k4: "v4" } ] }
1354
+
1355
+ it "returns the passed value" do
1356
+ expect(reverted).to eq(value)
1357
+ end
1358
+ end
1359
+
1360
+ context "when passing nil" do
1361
+ let(:value) { nil }
1362
+
1363
+ it "returns nil" do
1364
+ expect(reverted).to be nil
1365
+ end
1366
+ end
1367
+ end
1368
+
1369
+ describe "#stringify_read_tags" do
1370
+
1371
+ let(:method) { :stringify_read_tags }
1372
+
1373
+ context "when including one item" do
1374
+ let(:value) { [ { key: "value" } ] }
1375
+
1376
+ it "returns a one element string list" do
1377
+ expect(reverted).to eq([ "key:value" ])
1378
+ end
1379
+ end
1380
+
1381
+ context "when including multiple items" do
1382
+ let(:value) { [ { k1: "v1", k2: "v2" } ] }
1383
+
1384
+ it "returns a one element string list" do
1385
+ expect(reverted).to eq([ "k1:v1,k2:v2" ])
1386
+ end
1387
+ end
1388
+
1389
+ context "when including multiple hashes" do
1390
+ let(:value) { [ { k1: "v1", k2: "v2" }, { k3: "v3", k4: "v4" } ] }
1391
+
1392
+ it "returns a multiple element string list" do
1393
+ expect(reverted).to eq([ "k1:v1,k2:v2", "k3:v3,k4:v4" ])
1394
+ end
1395
+ end
1396
+
1397
+ context "when passing nil" do
1398
+ let(:value) { nil }
1399
+
1400
+ it "returns nil" do
1401
+ expect(reverted).to be nil
1402
+ end
1403
+ end
1404
+ end
1405
+
1406
+ describe "#convert_w" do
1407
+
1408
+ let(:method) { :convert_w }
1409
+
1410
+ context "when passing majority" do
1411
+ let(:value) { 'majority' }
1412
+
1413
+ it "returns it as a symbol" do
1414
+ expect(converted).to eq(:majority)
1415
+ end
1416
+ end
1417
+
1418
+ context "when passing an integer string" do
1419
+ let(:value) { '42' }
1420
+
1421
+ it "returns it as an integer" do
1422
+ expect(converted).to eq(42)
1423
+ end
1424
+ end
1425
+
1426
+ context "when passing a bogus string" do
1427
+ let(:value) { 'hello' }
1428
+
1429
+ it "returns the string" do
1430
+ expect(converted).to eq(value)
1431
+ end
1432
+ end
1433
+ end
1434
+
1435
+ describe "#revert_w" do
1436
+
1437
+ let(:method) { :revert_w }
1438
+
1439
+ context "when passing an integer" do
1440
+ let(:value) { 1 }
1441
+
1442
+ it "returns an integer" do
1443
+ expect(reverted).to eq(1)
1444
+ end
1445
+ end
1446
+
1447
+ context "when passing a symbol" do
1448
+ let(:value) { :majority }
1449
+
1450
+ it "returns a string" do
1451
+ expect(reverted).to eq("majority")
1452
+ end
1453
+ end
1454
+
1455
+ context "when passing a string" do
1456
+ let(:value) { "hello" }
1457
+
1458
+ it "returns a string" do
1459
+ expect(reverted).to eq(value)
1460
+ end
1461
+ end
1462
+ end
1463
+
1464
+ describe "#stringify_w" do
1465
+
1466
+ let(:method) { :stringify_w }
1467
+
1468
+ context "when passing an integer" do
1469
+ let(:value) { 1 }
1470
+
1471
+ it "returns a string" do
1472
+ expect(reverted).to eq('1')
1473
+ end
1474
+ end
1475
+
1476
+ context "when passing a symbol" do
1477
+ let(:value) { :majority }
1478
+
1479
+ it "returns a string" do
1480
+ expect(reverted).to eq("majority")
1481
+ end
1482
+ end
1483
+
1484
+ context "when passing a string" do
1485
+ let(:value) { "hello" }
1486
+
1487
+ it "returns a string" do
1488
+ expect(reverted).to eq(value)
1489
+ end
1490
+ end
1491
+ end
1492
+
1493
+ describe "#convert_zlib_compression_level" do
1494
+
1495
+ let(:method) { :convert_zlib_compression_level }
1496
+
1497
+ context "when passing an integer string" do
1498
+ let(:value) { "1" }
1499
+
1500
+ it "returns it as an integer" do
1501
+ expect(converted).to eq(1)
1502
+ end
1503
+ end
1504
+
1505
+ context "when passing a negative integer string" do
1506
+ let(:value) { "-1" }
1507
+
1508
+ it "returns it as an integer" do
1509
+ expect(converted).to eq(-1)
1510
+ end
1511
+ end
1512
+
1513
+ context "when passing a bogus string" do
1514
+ let(:value) { "hello" }
1515
+
1516
+ it "returns nil" do
1517
+ expect(converted).to be nil
1518
+ end
1519
+ end
1520
+
1521
+ context "when passing an integer" do
1522
+ let(:value) { 1 }
1523
+
1524
+ it "returns the integer" do
1525
+ expect(converted).to eq(value)
1526
+ end
1527
+ end
1528
+
1529
+ context "when passing a negative integer" do
1530
+ let(:value) { -1 }
1531
+
1532
+ it "returns the integer" do
1533
+ expect(converted).to eq(value)
1534
+ end
1535
+ end
1536
+
1537
+ context "when passing a out of range integer" do
1538
+ let(:value) { 10 }
1539
+
1540
+ it "returns nil" do
1541
+ expect(converted).to be nil
1542
+ end
1543
+
1544
+ it "warns" do
1545
+ expect(options_mapper).to receive(:log_warn).once
1546
+ converted
1547
+ end
1548
+ end
1549
+
1550
+ context "when passing a out of range negative integer" do
1551
+ let(:value) { -2 }
1552
+
1553
+ it "returns nil" do
1554
+ expect(converted).to be nil
1555
+ end
1556
+
1557
+ it "warns" do
1558
+ expect(options_mapper).to receive(:log_warn).once
1559
+ converted
1560
+ end
1561
+ end
1562
+ end
1563
+
1564
+ describe "#revert_zlib_compression_level" do
1565
+
1566
+ let(:method) { :revert_zlib_compression_level }
1567
+
1568
+ context "when passing an integer" do
1569
+ let(:value) { 1 }
1570
+
1571
+ it "returns an integer" do
1572
+ expect(reverted).to eq(1)
1573
+ end
1574
+ end
1575
+
1576
+ context "when passing nil" do
1577
+ let(:value) { nil }
1578
+
1579
+ it "returns nil" do
1580
+ expect(reverted).to be nil
1581
+ end
1582
+ end
1583
+ end
1584
+
1585
+ describe "#stringify_zlib_compression_level" do
1586
+
1587
+ let(:method) { :stringify_zlib_compression_level }
1588
+
1589
+ context "when passing an integer" do
1590
+ let(:value) { 1 }
1591
+
1592
+ it "returns a string" do
1593
+ expect(reverted).to eq('1')
1594
+ end
1595
+ end
1596
+
1597
+ context "when passing nil" do
1598
+ let(:value) { nil }
1599
+
1600
+ it "returns nil" do
1601
+ expect(reverted).to be nil
1602
+ end
1603
+ end
1604
+ end
1605
+ end