mongo 2.15.0 → 2.18.1

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 (920) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data/README.md +22 -38
  4. data/lib/mongo/auth/aws/request.rb +0 -1
  5. data/lib/mongo/auth/base.rb +8 -1
  6. data/lib/mongo/auth.rb +12 -1
  7. data/lib/mongo/bulk_write/result.rb +10 -1
  8. data/lib/mongo/bulk_write/result_combiner.rb +2 -4
  9. data/lib/mongo/bulk_write.rb +115 -29
  10. data/lib/mongo/client.rb +182 -22
  11. data/lib/mongo/client_encryption.rb +113 -10
  12. data/lib/mongo/cluster/periodic_executor.rb +4 -3
  13. data/lib/mongo/cluster/reapers/cursor_reaper.rb +98 -43
  14. data/lib/mongo/cluster/sdam_flow.rb +9 -3
  15. data/lib/mongo/cluster/topology/base.rb +13 -9
  16. data/lib/mongo/cluster/topology/load_balanced.rb +102 -0
  17. data/lib/mongo/cluster/topology.rb +28 -8
  18. data/lib/mongo/cluster.rb +162 -79
  19. data/lib/mongo/collection/helpers.rb +43 -0
  20. data/lib/mongo/collection/queryable_encryption.rb +122 -0
  21. data/lib/mongo/collection/view/aggregation.rb +68 -22
  22. data/lib/mongo/collection/view/builder/aggregation.rb +16 -17
  23. data/lib/mongo/collection/view/builder/map_reduce.rb +15 -49
  24. data/lib/mongo/collection/view/builder.rb +0 -4
  25. data/lib/mongo/collection/view/change_stream.rb +66 -20
  26. data/lib/mongo/collection/view/explainable.rb +1 -1
  27. data/lib/mongo/collection/view/iterable.rb +64 -30
  28. data/lib/mongo/collection/view/map_reduce.rb +72 -24
  29. data/lib/mongo/collection/view/readable.rb +106 -70
  30. data/lib/mongo/collection/view/writable.rb +296 -177
  31. data/lib/mongo/collection/view.rb +15 -21
  32. data/lib/mongo/collection.rb +141 -53
  33. data/lib/mongo/config/options.rb +62 -0
  34. data/lib/mongo/config/validators/option.rb +26 -0
  35. data/lib/mongo/config.rb +42 -0
  36. data/lib/mongo/crypt/auto_encrypter.rb +136 -14
  37. data/lib/mongo/crypt/binding.rb +513 -144
  38. data/lib/mongo/crypt/context.rb +5 -2
  39. data/lib/mongo/crypt/data_key_context.rb +12 -104
  40. data/lib/mongo/crypt/encryption_io.rb +94 -60
  41. data/lib/mongo/crypt/explicit_encrypter.rb +143 -26
  42. data/lib/mongo/crypt/explicit_encryption_context.rb +25 -2
  43. data/lib/mongo/crypt/handle.rb +160 -86
  44. data/lib/mongo/crypt/hooks.rb +25 -2
  45. data/lib/mongo/crypt/kms/aws.rb +136 -0
  46. data/lib/mongo/crypt/kms/azure.rb +144 -0
  47. data/lib/mongo/crypt/kms/credentials.rb +81 -0
  48. data/lib/mongo/crypt/kms/gcp.rb +189 -0
  49. data/lib/mongo/crypt/kms/kmip.rb +116 -0
  50. data/lib/mongo/crypt/kms/local.rb +82 -0
  51. data/lib/mongo/crypt/kms/master_key_document.rb +65 -0
  52. data/lib/mongo/crypt/kms.rb +117 -0
  53. data/lib/mongo/crypt/rewrap_many_data_key_context.rb +46 -0
  54. data/lib/mongo/crypt/rewrap_many_data_key_result.rb +37 -0
  55. data/lib/mongo/crypt/status.rb +8 -2
  56. data/lib/mongo/crypt.rb +3 -0
  57. data/lib/mongo/cursor/kill_spec.rb +76 -0
  58. data/lib/mongo/cursor.rb +92 -36
  59. data/lib/mongo/database/view.rb +11 -6
  60. data/lib/mongo/database.rb +63 -19
  61. data/lib/mongo/dbref.rb +1 -105
  62. data/lib/mongo/error/bad_load_balancer_target.rb +26 -0
  63. data/lib/mongo/error/bulk_write_error.rb +31 -4
  64. data/lib/mongo/error/invalid_config_option.rb +20 -0
  65. data/lib/mongo/error/invalid_replacement_document.rb +27 -9
  66. data/lib/mongo/error/invalid_update_document.rb +27 -7
  67. data/lib/mongo/error/labelable.rb +72 -0
  68. data/lib/mongo/error/missing_connection.rb +25 -0
  69. data/lib/mongo/error/missing_file_chunk.rb +8 -2
  70. data/lib/mongo/error/missing_service_id.rb +26 -0
  71. data/lib/mongo/error/no_service_connection_available.rb +49 -0
  72. data/lib/mongo/error/notable.rb +14 -0
  73. data/lib/mongo/error/operation_failure.rb +34 -86
  74. data/lib/mongo/error/read_write_retryable.rb +108 -0
  75. data/lib/mongo/error/session_not_materialized.rb +29 -0
  76. data/lib/mongo/error/snapshot_session_invalid_server_version.rb +31 -0
  77. data/lib/mongo/error/snapshot_session_transaction_prohibited.rb +30 -0
  78. data/lib/mongo/error.rb +10 -37
  79. data/lib/mongo/grid/fs_bucket.rb +21 -2
  80. data/lib/mongo/grid/stream/read.rb +6 -0
  81. data/lib/mongo/id.rb +7 -5
  82. data/lib/mongo/index/view.rb +45 -48
  83. data/lib/mongo/monitoring/event/cmap/pool_cleared.rb +7 -4
  84. data/lib/mongo/monitoring/event/command_failed.rb +9 -3
  85. data/lib/mongo/monitoring/event/command_started.rb +3 -1
  86. data/lib/mongo/monitoring/event/command_succeeded.rb +9 -2
  87. data/lib/mongo/monitoring/publishable.rb +11 -7
  88. data/lib/mongo/operation/aggregate/command.rb +8 -0
  89. data/lib/mongo/operation/collections_info/result.rb +5 -2
  90. data/lib/mongo/operation/command/op_msg.rb +6 -0
  91. data/lib/mongo/operation/context.rb +37 -1
  92. data/lib/mongo/operation/count/command.rb +6 -0
  93. data/lib/mongo/operation/count/op_msg.rb +9 -0
  94. data/lib/mongo/operation/create/command.rb +7 -1
  95. data/lib/mongo/operation/create/op_msg.rb +10 -0
  96. data/lib/mongo/operation/create_index/command.rb +17 -1
  97. data/lib/mongo/operation/create_index/op_msg.rb +18 -4
  98. data/lib/mongo/operation/delete/command.rb +6 -3
  99. data/lib/mongo/operation/delete/op_msg.rb +10 -1
  100. data/lib/mongo/operation/delete.rb +0 -1
  101. data/lib/mongo/operation/distinct/command.rb +6 -0
  102. data/lib/mongo/operation/distinct/op_msg.rb +10 -0
  103. data/lib/mongo/operation/drop_index/op_msg.rb +5 -1
  104. data/lib/mongo/operation/explain/command.rb +13 -1
  105. data/lib/mongo/operation/explain/legacy.rb +12 -5
  106. data/lib/mongo/operation/explain/op_msg.rb +9 -1
  107. data/lib/mongo/operation/find/builder/command.rb +111 -0
  108. data/lib/mongo/{collection/view → operation/find}/builder/flags.rb +10 -14
  109. data/lib/mongo/operation/find/builder/legacy.rb +123 -0
  110. data/lib/mongo/{collection/view → operation/find}/builder/modifiers.rb +31 -25
  111. data/lib/mongo/{cursor → operation/find}/builder.rb +4 -4
  112. data/lib/mongo/operation/find/command.rb +9 -0
  113. data/lib/mongo/operation/find/legacy.rb +10 -1
  114. data/lib/mongo/operation/find/op_msg.rb +12 -0
  115. data/lib/mongo/operation/find.rb +1 -0
  116. data/lib/mongo/operation/get_more/command.rb +1 -0
  117. data/lib/mongo/operation/get_more/command_builder.rb +42 -0
  118. data/lib/mongo/operation/get_more/op_msg.rb +1 -0
  119. data/lib/mongo/operation/get_more.rb +1 -0
  120. data/lib/mongo/operation/insert/bulk_result.rb +5 -1
  121. data/lib/mongo/operation/insert/command.rb +0 -4
  122. data/lib/mongo/operation/insert/op_msg.rb +6 -3
  123. data/lib/mongo/operation/insert/result.rb +6 -3
  124. data/lib/mongo/operation/insert.rb +0 -1
  125. data/lib/mongo/operation/kill_cursors/command.rb +8 -0
  126. data/lib/mongo/operation/kill_cursors/{legacy.rb → command_builder.rb} +6 -11
  127. data/lib/mongo/operation/kill_cursors/op_msg.rb +10 -0
  128. data/lib/mongo/operation/kill_cursors.rb +1 -1
  129. data/lib/mongo/operation/list_collections/op_msg.rb +4 -1
  130. data/lib/mongo/operation/map_reduce/command.rb +8 -0
  131. data/lib/mongo/operation/map_reduce/op_msg.rb +1 -1
  132. data/lib/mongo/operation/map_reduce/result.rb +16 -0
  133. data/lib/mongo/operation/result.rb +27 -5
  134. data/lib/mongo/operation/shared/executable.rb +36 -3
  135. data/lib/mongo/operation/shared/polymorphic_operation.rb +15 -3
  136. data/lib/mongo/operation/shared/read_preference_supported.rb +3 -1
  137. data/lib/mongo/operation/shared/response_handling.rb +7 -5
  138. data/lib/mongo/operation/shared/sessions_supported.rb +35 -15
  139. data/lib/mongo/operation/shared/specifiable.rb +11 -29
  140. data/lib/mongo/operation/shared/validatable.rb +87 -0
  141. data/lib/mongo/operation/shared/write.rb +18 -12
  142. data/lib/mongo/operation/update/command.rb +6 -3
  143. data/lib/mongo/operation/update/op_msg.rb +9 -4
  144. data/lib/mongo/operation/update.rb +0 -1
  145. data/lib/mongo/operation/{delete/legacy.rb → write_command/command.rb} +17 -23
  146. data/lib/mongo/operation/write_command/op_msg.rb +43 -0
  147. data/lib/mongo/operation/write_command.rb +32 -0
  148. data/lib/mongo/operation.rb +10 -0
  149. data/lib/mongo/protocol/caching_hash.rb +69 -0
  150. data/lib/mongo/protocol/msg.rb +21 -1
  151. data/lib/mongo/protocol/query.rb +35 -18
  152. data/lib/mongo/protocol.rb +1 -0
  153. data/lib/mongo/query_cache.rb +27 -2
  154. data/lib/mongo/retryable.rb +78 -30
  155. data/lib/mongo/server/connection.rb +58 -3
  156. data/lib/mongo/server/connection_base.rb +14 -1
  157. data/lib/mongo/server/connection_common.rb +41 -1
  158. data/lib/mongo/server/connection_pool/generation_manager.rb +71 -0
  159. data/lib/mongo/server/connection_pool.rb +144 -43
  160. data/lib/mongo/server/description/features.rb +22 -17
  161. data/lib/mongo/server/description/load_balancer.rb +33 -0
  162. data/lib/mongo/server/description.rb +90 -6
  163. data/lib/mongo/server/monitor/connection.rb +16 -10
  164. data/lib/mongo/server/monitor.rb +27 -14
  165. data/lib/mongo/server/pending_connection.rb +47 -31
  166. data/lib/mongo/server/push_monitor.rb +21 -2
  167. data/lib/mongo/server.rb +78 -27
  168. data/lib/mongo/server_selector/base.rb +31 -5
  169. data/lib/mongo/session/session_pool.rb +19 -0
  170. data/lib/mongo/session.rb +142 -27
  171. data/lib/mongo/socket/ocsp_cache.rb +2 -3
  172. data/lib/mongo/socket/ocsp_verifier.rb +7 -39
  173. data/lib/mongo/socket/tcp.rb +3 -0
  174. data/lib/mongo/socket.rb +1 -5
  175. data/lib/mongo/srv/resolver.rb +24 -3
  176. data/lib/mongo/uri/options_mapper.rb +3 -0
  177. data/lib/mongo/uri/srv_protocol.rb +7 -9
  178. data/lib/mongo/uri.rb +38 -0
  179. data/lib/mongo/utils.rb +0 -13
  180. data/lib/mongo/version.rb +1 -1
  181. data/lib/mongo.rb +22 -0
  182. data/mongo.gemspec +11 -5
  183. data/spec/README.md +23 -5
  184. data/spec/integration/auth_spec.rb +31 -1
  185. data/spec/integration/awaited_ismaster_spec.rb +1 -1
  186. data/spec/integration/aws_lambda_examples_spec.rb +68 -0
  187. data/spec/integration/bulk_write_error_message_spec.rb +32 -0
  188. data/spec/integration/bulk_write_spec.rb +17 -1
  189. data/spec/integration/change_stream_spec.rb +9 -8
  190. data/spec/integration/client_construction_spec.rb +128 -8
  191. data/spec/integration/client_side_encryption/auto_encryption_bulk_writes_spec.rb +10 -10
  192. data/spec/integration/client_side_encryption/auto_encryption_command_monitoring_spec.rb +169 -169
  193. data/spec/integration/client_side_encryption/auto_encryption_mongocryptd_spawn_spec.rb +0 -1
  194. data/spec/integration/client_side_encryption/auto_encryption_reconnect_spec.rb +31 -0
  195. data/spec/integration/client_side_encryption/auto_encryption_spec.rb +108 -1
  196. data/spec/integration/client_side_encryption/bson_size_limit_spec.rb +3 -3
  197. data/spec/integration/client_side_encryption/bypass_mongocryptd_spawn_spec.rb +2 -2
  198. data/spec/integration/client_side_encryption/client_close_spec.rb +1 -1
  199. data/spec/integration/client_side_encryption/corpus_spec.rb +64 -35
  200. data/spec/integration/client_side_encryption/custom_endpoint_spec.rb +39 -42
  201. data/spec/integration/client_side_encryption/data_key_spec.rb +98 -8
  202. data/spec/integration/client_side_encryption/decryption_events_prose_spec.rb +158 -0
  203. data/spec/integration/client_side_encryption/explicit_encryption_spec.rb +59 -0
  204. data/spec/integration/client_side_encryption/explicit_queryable_encryption_spec.rb +147 -0
  205. data/spec/integration/client_side_encryption/external_key_vault_spec.rb +6 -6
  206. data/spec/integration/client_side_encryption/kms_tls_options_spec.rb +436 -0
  207. data/spec/integration/client_side_encryption/kms_tls_spec.rb +92 -0
  208. data/spec/integration/client_side_encryption/queryable_encryption_examples_spec.rb +111 -0
  209. data/spec/integration/client_side_encryption/unique_index_on_key_alt_names_prose_spec.rb +85 -0
  210. data/spec/integration/client_side_encryption/views_spec.rb +1 -1
  211. data/spec/integration/client_spec.rb +2 -0
  212. data/spec/integration/client_update_spec.rb +2 -2
  213. data/spec/integration/command_monitoring_spec.rb +1 -1
  214. data/spec/integration/command_spec.rb +1 -1
  215. data/spec/integration/connection_spec.rb +52 -35
  216. data/spec/integration/crud_spec.rb +186 -1
  217. data/spec/integration/cursor_pinning_spec.rb +121 -0
  218. data/spec/integration/cursor_reaping_spec.rb +8 -4
  219. data/spec/integration/fork_reconnect_spec.rb +16 -13
  220. data/spec/integration/get_more_spec.rb +1 -1
  221. data/spec/integration/grid_fs_bucket_spec.rb +3 -3
  222. data/spec/integration/heartbeat_events_spec.rb +1 -1
  223. data/spec/integration/map_reduce_spec.rb +77 -0
  224. data/spec/integration/ocsp_verifier_spec.rb +3 -0
  225. data/spec/integration/query_cache_spec.rb +240 -32
  226. data/spec/integration/query_cache_transactions_spec.rb +1 -1
  227. data/spec/integration/read_concern_spec.rb +1 -1
  228. data/spec/integration/read_preference_spec.rb +17 -13
  229. data/spec/integration/reconnect_spec.rb +32 -12
  230. data/spec/integration/retryable_errors_spec.rb +1 -1
  231. data/spec/integration/retryable_writes/retryable_writes_36_and_older_spec.rb +2 -2
  232. data/spec/integration/retryable_writes/retryable_writes_40_and_newer_spec.rb +1 -1
  233. data/spec/integration/sdam_error_handling_spec.rb +5 -3
  234. data/spec/integration/sdam_events_spec.rb +75 -19
  235. data/spec/integration/sdam_prose_spec.rb +1 -1
  236. data/spec/integration/server_monitor_spec.rb +3 -1
  237. data/spec/integration/server_selector_spec.rb +22 -5
  238. data/spec/integration/server_spec.rb +2 -0
  239. data/spec/integration/size_limit_spec.rb +4 -1
  240. data/spec/integration/snapshot_query_examples_spec.rb +127 -0
  241. data/spec/integration/srv_monitoring_spec.rb +39 -1
  242. data/spec/integration/srv_spec.rb +1 -0
  243. data/spec/integration/step_down_spec.rb +21 -5
  244. data/spec/integration/transaction_pinning_spec.rb +120 -0
  245. data/spec/integration/versioned_api_examples_spec.rb +52 -1
  246. data/spec/integration/x509_auth_spec.rb +1 -1
  247. data/spec/lite_spec_helper.rb +27 -11
  248. data/spec/mongo/address/ipv6_spec.rb +7 -0
  249. data/spec/mongo/address/unix_spec.rb +1 -0
  250. data/spec/mongo/address_spec.rb +7 -0
  251. data/spec/mongo/auth/cr_spec.rb +2 -3
  252. data/spec/mongo/auth/ldap_spec.rb +2 -3
  253. data/spec/mongo/auth/scram/conversation_spec.rb +23 -23
  254. data/spec/mongo/auth/scram256/conversation_spec.rb +20 -20
  255. data/spec/mongo/auth/scram_negotiation_spec.rb +1 -0
  256. data/spec/mongo/auth/scram_spec.rb +2 -3
  257. data/spec/mongo/auth/user/view_spec.rb +1 -1
  258. data/spec/mongo/auth/x509_spec.rb +2 -3
  259. data/spec/mongo/bulk_write/result_spec.rb +15 -1
  260. data/spec/mongo/bulk_write_spec.rb +144 -23
  261. data/spec/mongo/client_construction_spec.rb +443 -35
  262. data/spec/mongo/client_encryption_spec.rb +10 -22
  263. data/spec/mongo/client_spec.rb +303 -5
  264. data/spec/mongo/cluster/cursor_reaper_spec.rb +63 -23
  265. data/spec/mongo/cluster/periodic_executor_spec.rb +3 -1
  266. data/spec/mongo/cluster_spec.rb +33 -36
  267. data/spec/mongo/collection/view/aggregation_spec.rb +178 -83
  268. data/spec/mongo/collection/view/builder/find_command_spec.rb +4 -0
  269. data/spec/mongo/collection/view/builder/op_query_spec.rb +4 -0
  270. data/spec/mongo/collection/view/change_stream_spec.rb +2 -2
  271. data/spec/mongo/collection/view/map_reduce_spec.rb +31 -2
  272. data/spec/mongo/collection/view/readable_spec.rb +661 -1
  273. data/spec/mongo/collection/view/writable_spec.rb +144 -32
  274. data/spec/mongo/collection_crud_spec.rb +70 -15
  275. data/spec/mongo/collection_ddl_spec.rb +1 -1
  276. data/spec/mongo/collection_spec.rb +33 -1
  277. data/spec/mongo/config/options_spec.rb +75 -0
  278. data/spec/mongo/config_spec.rb +73 -0
  279. data/spec/mongo/crypt/auto_decryption_context_spec.rb +17 -1
  280. data/spec/mongo/crypt/auto_encrypter_spec.rb +256 -5
  281. data/spec/mongo/crypt/auto_encryption_context_spec.rb +17 -1
  282. data/spec/mongo/crypt/binding/context_spec.rb +67 -17
  283. data/spec/mongo/crypt/binding/mongocrypt_spec.rb +17 -46
  284. data/spec/mongo/crypt/binding/version_spec.rb +33 -0
  285. data/spec/mongo/crypt/binding_unloaded_spec.rb +14 -0
  286. data/spec/mongo/crypt/data_key_context_spec.rb +42 -114
  287. data/spec/mongo/crypt/encryption_io_spec.rb +2 -0
  288. data/spec/mongo/crypt/explicit_decryption_context_spec.rb +32 -1
  289. data/spec/mongo/crypt/explicit_encryption_context_spec.rb +94 -1
  290. data/spec/mongo/crypt/handle_spec.rb +172 -156
  291. data/spec/mongo/crypt/hooks_spec.rb +30 -0
  292. data/spec/mongo/crypt/kms/credentials_spec.rb +357 -0
  293. data/spec/mongo/crypt/kms_spec.rb +59 -0
  294. data/spec/mongo/cursor/builder/get_more_command_spec.rb +4 -0
  295. data/spec/mongo/cursor/builder/op_get_more_spec.rb +4 -0
  296. data/spec/mongo/cursor_spec.rb +104 -7
  297. data/spec/mongo/database_spec.rb +81 -16
  298. data/spec/mongo/error/operation_failure_heavy_spec.rb +50 -1
  299. data/spec/mongo/grid/fs_bucket_spec.rb +18 -12
  300. data/spec/mongo/grid/stream/write_spec.rb +3 -9
  301. data/spec/mongo/grid/stream_spec.rb +1 -1
  302. data/spec/mongo/index/view_spec.rb +127 -2
  303. data/spec/mongo/operation/create/op_msg_spec.rb +244 -0
  304. data/spec/mongo/operation/delete/op_msg_spec.rb +14 -5
  305. data/spec/mongo/operation/delete_spec.rb +0 -30
  306. data/spec/mongo/{collection/view → operation/find}/builder/flags_spec.rb +2 -2
  307. data/spec/mongo/{collection/view → operation/find}/builder/modifiers_spec.rb +2 -2
  308. data/spec/mongo/operation/find/legacy_spec.rb +1 -0
  309. data/spec/mongo/operation/insert/bulk_spec.rb +1 -1
  310. data/spec/mongo/operation/insert/op_msg_spec.rb +19 -11
  311. data/spec/mongo/operation/insert_spec.rb +0 -32
  312. data/spec/mongo/operation/read_preference_legacy_spec.rb +4 -0
  313. data/spec/mongo/operation/read_preference_op_msg_spec.rb +26 -1
  314. data/spec/mongo/operation/result_spec.rb +20 -0
  315. data/spec/mongo/operation/update/bulk_spec.rb +1 -1
  316. data/spec/mongo/operation/update/op_msg_spec.rb +14 -5
  317. data/spec/mongo/operation/update_spec.rb +0 -29
  318. data/spec/mongo/protocol/caching_hash_spec.rb +82 -0
  319. data/spec/mongo/protocol/msg_spec.rb +41 -0
  320. data/spec/mongo/query_cache_spec.rb +172 -2
  321. data/spec/mongo/retryable_spec.rb +32 -3
  322. data/spec/mongo/server/connection_auth_spec.rb +3 -1
  323. data/spec/mongo/server/connection_common_spec.rb +76 -13
  324. data/spec/mongo/server/connection_pool_spec.rb +178 -45
  325. data/spec/mongo/server/connection_spec.rb +186 -200
  326. data/spec/mongo/server/description/features_spec.rb +24 -0
  327. data/spec/mongo/server/description_spec.rb +1 -1
  328. data/spec/mongo/server/monitor/connection_spec.rb +22 -0
  329. data/spec/mongo/server/monitor_spec.rb +4 -3
  330. data/spec/mongo/server/push_monitor_spec.rb +95 -0
  331. data/spec/mongo/server_selector_spec.rb +136 -15
  332. data/spec/mongo/session/session_pool_spec.rb +42 -10
  333. data/spec/mongo/session_spec.rb +26 -6
  334. data/spec/mongo/session_transaction_spec.rb +15 -29
  335. data/spec/mongo/socket/ssl_spec.rb +42 -63
  336. data/spec/mongo/socket/unix_spec.rb +1 -0
  337. data/spec/mongo/uri/srv_protocol_spec.rb +101 -2
  338. data/spec/mongo/uri_option_parsing_spec.rb +38 -5
  339. data/spec/mongo/uri_spec.rb +25 -0
  340. data/spec/mongo/utils_spec.rb +0 -14
  341. data/spec/runners/auth.rb +1 -1
  342. data/spec/runners/change_streams/spec.rb +1 -1
  343. data/spec/runners/change_streams/test.rb +1 -1
  344. data/spec/runners/cmap.rb +2 -2
  345. data/spec/runners/command_monitoring.rb +1 -1
  346. data/spec/runners/connection_string.rb +16 -4
  347. data/spec/runners/crud/operation.rb +17 -6
  348. data/spec/runners/crud/requirement.rb +10 -4
  349. data/spec/runners/crud/spec.rb +6 -3
  350. data/spec/runners/crud/test.rb +1 -1
  351. data/spec/runners/crud/verifier.rb +7 -2
  352. data/spec/runners/crud.rb +1 -1
  353. data/spec/runners/gridfs.rb +1 -1
  354. data/spec/runners/read_write_concern_document.rb +1 -1
  355. data/spec/runners/sdam.rb +3 -2
  356. data/spec/runners/server_selection.rb +1 -1
  357. data/spec/runners/server_selection_rtt.rb +1 -1
  358. data/spec/runners/transactions/spec.rb +2 -2
  359. data/spec/runners/transactions/test.rb +21 -18
  360. data/spec/runners/transactions.rb +11 -8
  361. data/spec/runners/unified/assertions.rb +95 -15
  362. data/spec/runners/unified/change_stream_operations.rb +12 -0
  363. data/spec/runners/unified/client_side_encryption_operations.rb +83 -0
  364. data/spec/runners/unified/crud_operations.rb +143 -26
  365. data/spec/runners/unified/ddl_operations.rb +74 -1
  366. data/spec/runners/unified/entity_map.rb +3 -3
  367. data/spec/runners/unified/error.rb +2 -1
  368. data/spec/runners/unified/event_subscriber.rb +2 -2
  369. data/spec/runners/unified/grid_fs_operations.rb +21 -0
  370. data/spec/runners/unified/support_operations.rb +21 -5
  371. data/spec/runners/unified/test.rb +96 -8
  372. data/spec/runners/unified/test_group.rb +1 -1
  373. data/spec/runners/unified.rb +10 -3
  374. data/spec/shared/lib/mrss/cluster_config.rb +6 -1
  375. data/spec/shared/lib/mrss/constraints.rb +21 -22
  376. data/spec/shared/lib/mrss/docker_runner.rb +23 -3
  377. data/spec/shared/lib/mrss/eg_config_utils.rb +51 -0
  378. data/spec/shared/lib/mrss/event_subscriber.rb +210 -0
  379. data/spec/shared/lib/mrss/lite_constraints.rb +40 -1
  380. data/spec/shared/lib/mrss/server_version_registry.rb +17 -12
  381. data/spec/shared/lib/mrss/session_registry.rb +69 -0
  382. data/spec/shared/lib/mrss/session_registry_legacy.rb +60 -0
  383. data/spec/shared/share/Dockerfile.erb +61 -58
  384. data/spec/shared/shlib/config.sh +27 -0
  385. data/spec/shared/shlib/distro.sh +2 -1
  386. data/spec/shared/shlib/server.sh +114 -39
  387. data/spec/shared/shlib/set_env.sh +43 -5
  388. data/spec/solo/clean_exit_spec.rb +5 -0
  389. data/spec/spec_helper.rb +0 -1
  390. data/spec/spec_tests/client_side_encryption_spec.rb +1 -1
  391. data/spec/spec_tests/client_side_encryption_unified_spec.rb +16 -0
  392. data/spec/spec_tests/cmap_spec.rb +4 -1
  393. data/spec/spec_tests/crud_spec.rb +0 -10
  394. data/spec/spec_tests/data/change_streams_unified/change-streams-errors.yml +124 -0
  395. data/spec/spec_tests/data/change_streams_unified/change-streams-pre_and_post_images.yml +351 -0
  396. data/spec/spec_tests/data/change_streams_unified/change-streams-resume-allowlist.yml +1171 -0
  397. data/spec/spec_tests/data/change_streams_unified/change-streams-resume-errorLabels.yml +1071 -0
  398. data/spec/spec_tests/data/change_streams_unified/change-streams-showExpandedEvents.yml +298 -0
  399. data/spec/spec_tests/data/change_streams_unified/change-streams.yml +859 -4
  400. data/spec/spec_tests/data/client_side_encryption/aggregate.yml +3 -17
  401. data/spec/spec_tests/data/client_side_encryption/azureKMS.yml +46 -0
  402. data/spec/spec_tests/data/client_side_encryption/badQueries.yml +12 -2
  403. data/spec/spec_tests/data/client_side_encryption/basic.yml +3 -17
  404. data/spec/spec_tests/data/client_side_encryption/bulk.yml +1 -8
  405. data/spec/spec_tests/data/client_side_encryption/bypassAutoEncryption.yml +2 -2
  406. data/spec/spec_tests/data/client_side_encryption/count.yml +1 -8
  407. data/spec/spec_tests/data/client_side_encryption/countDocuments.yml +1 -8
  408. data/spec/spec_tests/data/client_side_encryption/create-and-createIndexes.yml +58 -0
  409. data/spec/spec_tests/data/client_side_encryption/delete.yml +2 -16
  410. data/spec/spec_tests/data/client_side_encryption/distinct.yml +1 -8
  411. data/spec/spec_tests/data/client_side_encryption/explain.yml +1 -8
  412. data/spec/spec_tests/data/client_side_encryption/find.yml +2 -16
  413. data/spec/spec_tests/data/client_side_encryption/findOneAndDelete.yml +1 -8
  414. data/spec/spec_tests/data/client_side_encryption/findOneAndReplace.yml +1 -8
  415. data/spec/spec_tests/data/client_side_encryption/findOneAndUpdate.yml +1 -8
  416. data/spec/spec_tests/data/client_side_encryption/fle2-BypassQueryAnalysis.yml +101 -0
  417. data/spec/spec_tests/data/client_side_encryption/fle2-Compact.yml +80 -0
  418. data/spec/spec_tests/data/client_side_encryption/fle2-CreateCollection.yml +1263 -0
  419. data/spec/spec_tests/data/client_side_encryption/fle2-DecryptExistingData.yml +64 -0
  420. data/spec/spec_tests/data/client_side_encryption/fle2-Delete.yml +107 -0
  421. data/spec/spec_tests/data/client_side_encryption/fle2-EncryptedFields-vs-EncryptedFieldsMap.yml +80 -0
  422. data/spec/spec_tests/data/client_side_encryption/fle2-EncryptedFields-vs-jsonSchema.yml +90 -0
  423. data/spec/spec_tests/data/client_side_encryption/fle2-EncryptedFieldsMap-defaults.yml +57 -0
  424. data/spec/spec_tests/data/client_side_encryption/fle2-FindOneAndUpdate.yml +213 -0
  425. data/spec/spec_tests/data/client_side_encryption/fle2-InsertFind-Indexed.yml +86 -0
  426. data/spec/spec_tests/data/client_side_encryption/fle2-InsertFind-Unindexed.yml +83 -0
  427. data/spec/spec_tests/data/client_side_encryption/fle2-MissingKey.yml +41 -0
  428. data/spec/spec_tests/data/client_side_encryption/fle2-NoEncryption.yml +42 -0
  429. data/spec/spec_tests/data/client_side_encryption/fle2-Update.yml +221 -0
  430. data/spec/spec_tests/data/client_side_encryption/fle2-validatorAndPartialFieldExpression.yml +168 -0
  431. data/spec/spec_tests/data/client_side_encryption/gcpKMS.yml +46 -0
  432. data/spec/spec_tests/data/client_side_encryption/getMore.yml +1 -8
  433. data/spec/spec_tests/data/client_side_encryption/insert.yml +2 -16
  434. data/spec/spec_tests/data/client_side_encryption/keyAltName.yml +1 -8
  435. data/spec/spec_tests/data/client_side_encryption/localKMS.yml +1 -8
  436. data/spec/spec_tests/data/client_side_encryption/localSchema.yml +1 -8
  437. data/spec/spec_tests/data/client_side_encryption/maxWireVersion.yml +2 -0
  438. data/spec/spec_tests/data/client_side_encryption/missingKey.yml +2 -9
  439. data/spec/spec_tests/data/client_side_encryption/noSchema.yml +39 -0
  440. data/spec/spec_tests/data/client_side_encryption/replaceOne.yml +1 -8
  441. data/spec/spec_tests/data/client_side_encryption/types.yml +44 -70
  442. data/spec/spec_tests/data/client_side_encryption/unified/addKeyAltName.yml +194 -0
  443. data/spec/spec_tests/data/client_side_encryption/unified/createDataKey-kms_providers-invalid.yml +67 -0
  444. data/spec/spec_tests/data/client_side_encryption/unified/createDataKey.yml +309 -0
  445. data/spec/spec_tests/data/client_side_encryption/unified/deleteKey.yml +159 -0
  446. data/spec/spec_tests/data/client_side_encryption/unified/getKey.yml +105 -0
  447. data/spec/spec_tests/data/client_side_encryption/unified/getKeyByAltName.yml +104 -0
  448. data/spec/spec_tests/data/client_side_encryption/unified/getKeys.yml +122 -0
  449. data/spec/spec_tests/data/client_side_encryption/unified/removeKeyAltName.yml +157 -0
  450. data/spec/spec_tests/data/client_side_encryption/unified/rewrapManyDataKey-decrypt_failure.yml +69 -0
  451. data/spec/spec_tests/data/client_side_encryption/unified/rewrapManyDataKey-encrypt_failure.yml +122 -0
  452. data/spec/spec_tests/data/client_side_encryption/unified/rewrapManyDataKey.yml +432 -0
  453. data/spec/spec_tests/data/client_side_encryption/updateMany.yml +1 -8
  454. data/spec/spec_tests/data/client_side_encryption/updateOne.yml +1 -8
  455. data/spec/spec_tests/data/client_side_encryption/validatorAndPartialFieldExpression.yml +166 -0
  456. data/spec/spec_tests/data/collection_management/clustered-indexes.yml +135 -0
  457. data/spec/spec_tests/data/collection_management/createCollection-pre_and_post_images.yml +50 -0
  458. data/spec/spec_tests/data/collection_management/modifyCollection-pre_and_post_images.yml +58 -0
  459. data/spec/spec_tests/data/command_monitoring_unified/bulkWrite.yml +68 -0
  460. data/spec/spec_tests/data/command_monitoring_unified/command.yml +50 -0
  461. data/spec/spec_tests/data/command_monitoring_unified/deleteMany.yml +79 -0
  462. data/spec/spec_tests/data/command_monitoring_unified/deleteOne.yml +79 -0
  463. data/spec/spec_tests/data/command_monitoring_unified/find.yml +254 -0
  464. data/spec/spec_tests/data/command_monitoring_unified/insertMany.yml +79 -0
  465. data/spec/spec_tests/data/command_monitoring_unified/insertOne.yml +77 -0
  466. data/spec/spec_tests/data/command_monitoring_unified/pre-42-server-connection-id.yml +56 -0
  467. data/spec/spec_tests/data/command_monitoring_unified/server-connection-id.yml +56 -0
  468. data/spec/spec_tests/data/command_monitoring_unified/unacknowledgedBulkWrite.yml +55 -0
  469. data/spec/spec_tests/data/command_monitoring_unified/updateMany.yml +87 -0
  470. data/spec/spec_tests/data/command_monitoring_unified/updateOne.yml +118 -0
  471. data/spec/spec_tests/data/crud/read/aggregate-collation.yml +2 -1
  472. data/spec/spec_tests/data/crud/read/aggregate-out.yml +1 -0
  473. data/spec/spec_tests/data/crud/read/count-collation.yml +2 -1
  474. data/spec/spec_tests/data/crud/read/distinct-collation.yml +2 -1
  475. data/spec/spec_tests/data/crud/read/find-collation.yml +2 -1
  476. data/spec/spec_tests/data/crud/write/bulkWrite-collation.yml +2 -1
  477. data/spec/spec_tests/data/crud/write/deleteMany-collation.yml +2 -1
  478. data/spec/spec_tests/data/crud/write/deleteOne-collation.yml +2 -1
  479. data/spec/spec_tests/data/crud/write/findOneAndDelete-collation.yml +3 -2
  480. data/spec/spec_tests/data/crud/write/findOneAndReplace-collation.yml +2 -1
  481. data/spec/spec_tests/data/crud/write/findOneAndUpdate-collation.yml +3 -2
  482. data/spec/spec_tests/data/crud/write/replaceOne-collation.yml +3 -2
  483. data/spec/spec_tests/data/crud/write/updateMany-collation.yml +2 -1
  484. data/spec/spec_tests/data/crud/write/updateOne-collation.yml +2 -1
  485. data/spec/spec_tests/data/crud_unified/aggregate-allowdiskuse.yml +75 -0
  486. data/spec/spec_tests/data/crud_unified/aggregate-let.yml +138 -0
  487. data/spec/spec_tests/data/crud_unified/aggregate-merge.yml +185 -0
  488. data/spec/spec_tests/data/crud_unified/aggregate-out-readConcern.yml +171 -0
  489. data/spec/spec_tests/data/crud_unified/aggregate-write-readPreference.yml +155 -0
  490. data/spec/spec_tests/data/crud_unified/aggregate.yml +215 -0
  491. data/spec/spec_tests/data/crud_unified/bulkWrite-arrayFilters-clientError.yml +98 -0
  492. data/spec/spec_tests/data/crud_unified/bulkWrite-arrayFilters.yml +174 -0
  493. data/spec/spec_tests/data/crud_unified/bulkWrite-comment.yml +189 -0
  494. data/spec/spec_tests/data/crud_unified/bulkWrite-delete-hint-clientError.yml +113 -0
  495. data/spec/spec_tests/data/crud_unified/bulkWrite-delete-hint-serverError.yml +142 -0
  496. data/spec/spec_tests/data/crud_unified/bulkWrite-delete-hint.yml +154 -0
  497. data/spec/spec_tests/data/crud_unified/bulkWrite-deleteMany-hint-unacknowledged.yml +98 -0
  498. data/spec/spec_tests/data/crud_unified/bulkWrite-deleteMany-let.yml +86 -0
  499. data/spec/spec_tests/data/crud_unified/bulkWrite-deleteOne-hint-unacknowledged.yml +97 -0
  500. data/spec/spec_tests/data/crud_unified/bulkWrite-deleteOne-let.yml +86 -0
  501. data/spec/spec_tests/data/crud_unified/bulkWrite-insertOne-dots_and_dollars.yml +138 -0
  502. data/spec/spec_tests/data/crud_unified/bulkWrite-replaceOne-dots_and_dollars.yml +165 -0
  503. data/spec/spec_tests/data/crud_unified/bulkWrite-replaceOne-hint-unacknowledged.yml +103 -0
  504. data/spec/spec_tests/data/crud_unified/bulkWrite-replaceOne-let.yml +93 -0
  505. data/spec/spec_tests/data/crud_unified/bulkWrite-update-hint-clientError.yml +148 -0
  506. data/spec/spec_tests/data/crud_unified/bulkWrite-update-hint-serverError.yml +239 -0
  507. data/spec/spec_tests/data/crud_unified/bulkWrite-update-hint.yml +256 -0
  508. data/spec/spec_tests/data/crud_unified/bulkWrite-update-validation.yml +73 -0
  509. data/spec/spec_tests/data/crud_unified/bulkWrite-updateMany-dots_and_dollars.yml +150 -0
  510. data/spec/spec_tests/data/crud_unified/bulkWrite-updateMany-hint-unacknowledged.yml +104 -0
  511. data/spec/spec_tests/data/crud_unified/bulkWrite-updateMany-let.yml +96 -0
  512. data/spec/spec_tests/data/crud_unified/bulkWrite-updateOne-dots_and_dollars.yml +150 -0
  513. data/spec/spec_tests/data/crud_unified/bulkWrite-updateOne-hint-unacknowledged.yml +103 -0
  514. data/spec/spec_tests/data/crud_unified/bulkWrite-updateOne-let.yml +95 -0
  515. data/spec/spec_tests/data/crud_unified/countDocuments-comment.yml +92 -0
  516. data/spec/spec_tests/data/crud_unified/db-aggregate-write-readPreference.yml +151 -0
  517. data/spec/spec_tests/data/crud_unified/db-aggregate.yml +73 -0
  518. data/spec/spec_tests/data/crud_unified/deleteMany-comment.yml +97 -0
  519. data/spec/spec_tests/data/crud_unified/deleteMany-hint-clientError.yml +87 -0
  520. data/spec/spec_tests/data/crud_unified/deleteMany-hint-serverError.yml +107 -0
  521. data/spec/spec_tests/data/crud_unified/deleteMany-hint-unacknowledged.yml +90 -0
  522. data/spec/spec_tests/data/crud_unified/deleteMany-hint.yml +99 -0
  523. data/spec/spec_tests/data/crud_unified/deleteMany-let.yml +93 -0
  524. data/spec/spec_tests/data/crud_unified/deleteOne-comment.yml +98 -0
  525. data/spec/spec_tests/data/crud_unified/deleteOne-hint-clientError.yml +80 -0
  526. data/spec/spec_tests/data/crud_unified/deleteOne-hint-serverError.yml +100 -0
  527. data/spec/spec_tests/data/crud_unified/deleteOne-hint-unacknowledged.yml +89 -0
  528. data/spec/spec_tests/data/crud_unified/deleteOne-hint.yml +95 -0
  529. data/spec/spec_tests/data/crud_unified/deleteOne-let.yml +91 -0
  530. data/spec/spec_tests/data/crud_unified/distinct-comment.yml +98 -0
  531. data/spec/spec_tests/data/crud_unified/estimatedDocumentCount-comment.yml +95 -0
  532. data/spec/spec_tests/data/crud_unified/estimatedDocumentCount.yml +5 -135
  533. data/spec/spec_tests/data/crud_unified/find-allowdiskuse-clientError.yml +55 -0
  534. data/spec/spec_tests/data/crud_unified/find-allowdiskuse-serverError.yml +68 -0
  535. data/spec/spec_tests/data/crud_unified/find-allowdiskuse.yml +79 -0
  536. data/spec/spec_tests/data/crud_unified/find-comment.yml +166 -0
  537. data/spec/spec_tests/data/crud_unified/find-let.yml +71 -0
  538. data/spec/spec_tests/data/crud_unified/find.yml +68 -0
  539. data/spec/spec_tests/data/crud_unified/findOneAndDelete-comment.yml +96 -0
  540. data/spec/spec_tests/data/crud_unified/findOneAndDelete-hint-clientError.yml +91 -0
  541. data/spec/spec_tests/data/crud_unified/findOneAndDelete-hint-serverError.yml +107 -0
  542. data/spec/spec_tests/data/crud_unified/findOneAndDelete-hint-unacknowledged.yml +88 -0
  543. data/spec/spec_tests/data/crud_unified/findOneAndDelete-hint.yml +102 -0
  544. data/spec/spec_tests/data/crud_unified/findOneAndDelete-let.yml +86 -0
  545. data/spec/spec_tests/data/crud_unified/findOneAndReplace-comment.yml +101 -0
  546. data/spec/spec_tests/data/crud_unified/findOneAndReplace-dots_and_dollars.yml +140 -0
  547. data/spec/spec_tests/data/crud_unified/findOneAndReplace-hint-clientError.yml +83 -0
  548. data/spec/spec_tests/data/crud_unified/findOneAndReplace-hint-serverError.yml +99 -0
  549. data/spec/spec_tests/data/crud_unified/findOneAndReplace-hint-unacknowledged.yml +96 -0
  550. data/spec/spec_tests/data/crud_unified/findOneAndReplace-hint.yml +98 -0
  551. data/spec/spec_tests/data/crud_unified/findOneAndReplace-let.yml +94 -0
  552. data/spec/spec_tests/data/crud_unified/findOneAndUpdate-comment.yml +95 -0
  553. data/spec/spec_tests/data/crud_unified/findOneAndUpdate-dots_and_dollars.yml +127 -0
  554. data/spec/spec_tests/data/crud_unified/findOneAndUpdate-hint-clientError.yml +84 -0
  555. data/spec/spec_tests/data/crud_unified/findOneAndUpdate-hint-serverError.yml +100 -0
  556. data/spec/spec_tests/data/crud_unified/findOneAndUpdate-hint-unacknowledged.yml +92 -0
  557. data/spec/spec_tests/data/crud_unified/findOneAndUpdate-hint.yml +99 -0
  558. data/spec/spec_tests/data/crud_unified/findOneAndUpdate-let.yml +96 -0
  559. data/spec/spec_tests/data/crud_unified/insertMany-comment.yml +93 -0
  560. data/spec/spec_tests/data/crud_unified/insertMany-dots_and_dollars.yml +128 -0
  561. data/spec/spec_tests/data/crud_unified/insertOne-comment.yml +91 -0
  562. data/spec/spec_tests/data/crud_unified/insertOne-dots_and_dollars.yml +238 -0
  563. data/spec/spec_tests/data/crud_unified/replaceOne-comment.yml +105 -0
  564. data/spec/spec_tests/data/crud_unified/replaceOne-dots_and_dollars.yml +180 -0
  565. data/spec/spec_tests/data/crud_unified/replaceOne-hint-unacknowledged.yml +95 -0
  566. data/spec/spec_tests/data/crud_unified/replaceOne-hint.yml +108 -0
  567. data/spec/spec_tests/data/crud_unified/replaceOne-let.yml +98 -0
  568. data/spec/spec_tests/data/crud_unified/replaceOne-validation.yml +37 -0
  569. data/spec/spec_tests/data/crud_unified/updateMany-comment.yml +104 -0
  570. data/spec/spec_tests/data/crud_unified/updateMany-dots_and_dollars.yml +138 -0
  571. data/spec/spec_tests/data/crud_unified/updateMany-hint-clientError.yml +91 -0
  572. data/spec/spec_tests/data/crud_unified/updateMany-hint-serverError.yml +115 -0
  573. data/spec/spec_tests/data/crud_unified/updateMany-hint-unacknowledged.yml +96 -0
  574. data/spec/spec_tests/data/crud_unified/updateMany-hint.yml +115 -0
  575. data/spec/spec_tests/data/crud_unified/updateMany-let.yml +107 -0
  576. data/spec/spec_tests/data/crud_unified/updateMany-validation.yml +39 -0
  577. data/spec/spec_tests/data/crud_unified/updateOne-comment.yml +104 -0
  578. data/spec/spec_tests/data/crud_unified/updateOne-dots_and_dollars.yml +138 -0
  579. data/spec/spec_tests/data/crud_unified/updateOne-hint-clientError.yml +85 -0
  580. data/spec/spec_tests/data/crud_unified/updateOne-hint-serverError.yml +109 -0
  581. data/spec/spec_tests/data/crud_unified/updateOne-hint-unacknowledged.yml +95 -0
  582. data/spec/spec_tests/data/crud_unified/updateOne-hint.yml +109 -0
  583. data/spec/spec_tests/data/crud_unified/updateOne-let.yml +102 -0
  584. data/spec/spec_tests/data/crud_unified/updateOne-validation.yml +37 -0
  585. data/spec/spec_tests/data/crud_unified/updateWithPipelines.yml +8 -14
  586. data/spec/spec_tests/data/gridfs_unified/delete.yml +198 -0
  587. data/spec/spec_tests/data/gridfs_unified/download.yml +241 -0
  588. data/spec/spec_tests/data/gridfs_unified/downloadByName.yml +159 -0
  589. data/spec/spec_tests/data/gridfs_unified/upload-disableMD5.yml +92 -0
  590. data/spec/spec_tests/data/gridfs_unified/upload.yml +288 -0
  591. data/spec/spec_tests/data/load_balancers/event-monitoring.yml +99 -0
  592. data/spec/spec_tests/data/load_balancers/lb-connection-establishment.yml +36 -0
  593. data/spec/spec_tests/data/load_balancers/non-lb-connection-establishment.yml +56 -0
  594. data/spec/spec_tests/data/load_balancers/server-selection.yml +50 -0
  595. data/spec/spec_tests/data/max_staleness/ReplicaSetNoPrimary/DefaultNoMaxStaleness.yml +2 -2
  596. data/spec/spec_tests/data/max_staleness/ReplicaSetNoPrimary/LastUpdateTime.yml +3 -3
  597. data/spec/spec_tests/data/max_staleness/ReplicaSetNoPrimary/Nearest.yml +3 -3
  598. data/spec/spec_tests/data/max_staleness/ReplicaSetNoPrimary/Nearest2.yml +3 -3
  599. data/spec/spec_tests/data/max_staleness/ReplicaSetNoPrimary/PrimaryPreferred.yml +2 -2
  600. data/spec/spec_tests/data/max_staleness/ReplicaSetNoPrimary/PrimaryPreferred_tags.yml +2 -2
  601. data/spec/spec_tests/data/max_staleness/ReplicaSetNoPrimary/Secondary.yml +4 -4
  602. data/spec/spec_tests/data/max_staleness/ReplicaSetNoPrimary/SecondaryPreferred.yml +2 -2
  603. data/spec/spec_tests/data/max_staleness/ReplicaSetNoPrimary/SecondaryPreferred_tags.yml +4 -4
  604. data/spec/spec_tests/data/max_staleness/ReplicaSetNoPrimary/ZeroMaxStaleness.yml +2 -2
  605. data/spec/spec_tests/data/max_staleness/ReplicaSetWithPrimary/DefaultNoMaxStaleness.yml +2 -2
  606. data/spec/spec_tests/data/max_staleness/ReplicaSetWithPrimary/LastUpdateTime.yml +3 -3
  607. data/spec/spec_tests/data/max_staleness/ReplicaSetWithPrimary/LongHeartbeat.yml +2 -2
  608. data/spec/spec_tests/data/max_staleness/ReplicaSetWithPrimary/LongHeartbeat2.yml +2 -2
  609. data/spec/spec_tests/data/max_staleness/ReplicaSetWithPrimary/MaxStalenessTooSmall.yml +2 -2
  610. data/spec/spec_tests/data/max_staleness/ReplicaSetWithPrimary/MaxStalenessWithModePrimary.yml +2 -2
  611. data/spec/spec_tests/data/max_staleness/ReplicaSetWithPrimary/Nearest.yml +3 -3
  612. data/spec/spec_tests/data/max_staleness/ReplicaSetWithPrimary/Nearest2.yml +3 -3
  613. data/spec/spec_tests/data/max_staleness/ReplicaSetWithPrimary/Nearest_tags.yml +2 -2
  614. data/spec/spec_tests/data/max_staleness/ReplicaSetWithPrimary/PrimaryPreferred.yml +2 -2
  615. data/spec/spec_tests/data/max_staleness/ReplicaSetWithPrimary/SecondaryPreferred.yml +2 -2
  616. data/spec/spec_tests/data/max_staleness/ReplicaSetWithPrimary/SecondaryPreferred_tags.yml +5 -5
  617. data/spec/spec_tests/data/max_staleness/ReplicaSetWithPrimary/SecondaryPreferred_tags2.yml +3 -3
  618. data/spec/spec_tests/data/max_staleness/ReplicaSetWithPrimary/Secondary_tags.yml +5 -5
  619. data/spec/spec_tests/data/max_staleness/ReplicaSetWithPrimary/Secondary_tags2.yml +3 -3
  620. data/spec/spec_tests/data/max_staleness/ReplicaSetWithPrimary/ZeroMaxStaleness.yml +2 -2
  621. data/spec/spec_tests/data/max_staleness/Sharded/SmallMaxStaleness.yml +2 -2
  622. data/spec/spec_tests/data/max_staleness/Single/SmallMaxStaleness.yml +1 -1
  623. data/spec/spec_tests/data/max_staleness/Unknown/SmallMaxStaleness.yml +1 -1
  624. data/spec/spec_tests/data/retryable_reads/{changeStreams-client.watch-serverErrors.yml → legacy/changeStreams-client.watch-serverErrors.yml} +1 -1
  625. data/spec/spec_tests/data/retryable_reads/{changeStreams-client.watch.yml → legacy/changeStreams-client.watch.yml} +1 -1
  626. data/spec/spec_tests/data/retryable_reads/{changeStreams-db.coll.watch-serverErrors.yml → legacy/changeStreams-db.coll.watch-serverErrors.yml} +1 -1
  627. data/spec/spec_tests/data/retryable_reads/{changeStreams-db.coll.watch.yml → legacy/changeStreams-db.coll.watch.yml} +1 -1
  628. data/spec/spec_tests/data/retryable_reads/{changeStreams-db.watch-serverErrors.yml → legacy/changeStreams-db.watch-serverErrors.yml} +1 -1
  629. data/spec/spec_tests/data/retryable_reads/{changeStreams-db.watch.yml → legacy/changeStreams-db.watch.yml} +1 -1
  630. data/spec/spec_tests/data/retryable_reads/{estimatedDocumentCount-serverErrors-pre4.9.yml → legacy/estimatedDocumentCount-serverErrors.yml} +0 -2
  631. data/spec/spec_tests/data/retryable_reads/{estimatedDocumentCount-pre4.9.yml → legacy/estimatedDocumentCount.yml} +0 -2
  632. data/spec/spec_tests/data/retryable_reads/{mapReduce.yml → legacy/mapReduce.yml} +3 -1
  633. data/spec/spec_tests/data/retryable_reads/unified/handshakeError.yml +129 -0
  634. data/spec/spec_tests/data/retryable_writes/{bulkWrite-serverErrors.yml → legacy/bulkWrite-serverErrors.yml} +1 -1
  635. data/spec/spec_tests/data/retryable_writes/{deleteOne-serverErrors.yml → legacy/deleteOne-serverErrors.yml} +1 -1
  636. data/spec/spec_tests/data/retryable_writes/{findOneAndDelete-serverErrors.yml → legacy/findOneAndDelete-serverErrors.yml} +1 -1
  637. data/spec/spec_tests/data/retryable_writes/{findOneAndReplace-serverErrors.yml → legacy/findOneAndReplace-serverErrors.yml} +1 -1
  638. data/spec/spec_tests/data/retryable_writes/{findOneAndUpdate-serverErrors.yml → legacy/findOneAndUpdate-serverErrors.yml} +1 -1
  639. data/spec/spec_tests/data/retryable_writes/{insertMany-serverErrors.yml → legacy/insertMany-serverErrors.yml} +1 -1
  640. data/spec/spec_tests/data/retryable_writes/{insertOne-serverErrors.yml → legacy/insertOne-serverErrors.yml} +5 -5
  641. data/spec/spec_tests/data/retryable_writes/{replaceOne-serverErrors.yml → legacy/replaceOne-serverErrors.yml} +1 -1
  642. data/spec/spec_tests/data/retryable_writes/{updateOne-serverErrors.yml → legacy/updateOne-serverErrors.yml} +1 -1
  643. data/spec/spec_tests/data/retryable_writes/unified/bulkWrite-serverErrors.yml +96 -0
  644. data/spec/spec_tests/data/retryable_writes/unified/handshakeError.yml +137 -0
  645. data/spec/spec_tests/data/retryable_writes/unified/insertOne-serverErrors.yml +78 -0
  646. data/spec/spec_tests/data/sdam/errors/prefer-error-code.yml +2 -2
  647. data/spec/spec_tests/data/sdam/load-balanced/discover_load_balancer.yml +25 -0
  648. data/spec/spec_tests/data/sdam_integration/find-network-error.yml +2 -0
  649. data/spec/spec_tests/data/sdam_integration/find-shutdown-error.yml +2 -0
  650. data/spec/spec_tests/data/sdam_integration/hello-command-error.yml +9 -15
  651. data/spec/spec_tests/data/sdam_integration/hello-network-error.yml +7 -15
  652. data/spec/spec_tests/data/sdam_integration/hello-timeout.yml +10 -14
  653. data/spec/spec_tests/data/sdam_integration/insert-network-error.yml +2 -0
  654. data/spec/spec_tests/data/sdam_integration/insert-shutdown-error.yml +2 -0
  655. data/spec/spec_tests/data/sdam_monitoring/load_balancer.yml +65 -0
  656. data/spec/spec_tests/data/seed_list_discovery/load-balanced/loadBalanced-directConnection.yml +13 -0
  657. data/spec/spec_tests/data/seed_list_discovery/load-balanced/loadBalanced-no-results.yml +5 -0
  658. data/spec/spec_tests/data/seed_list_discovery/load-balanced/loadBalanced-replicaSet-errors.yml +6 -0
  659. data/spec/spec_tests/data/seed_list_discovery/load-balanced/loadBalanced-true-multiple-hosts.yml +5 -0
  660. data/spec/spec_tests/data/seed_list_discovery/load-balanced/loadBalanced-true-txt.yml +10 -0
  661. data/spec/spec_tests/data/seed_list_discovery/load-balanced/srvMaxHosts-conflicts_with_loadBalanced-true-txt.yml +5 -0
  662. data/spec/spec_tests/data/seed_list_discovery/load-balanced/srvMaxHosts-conflicts_with_loadBalanced-true.yml +5 -0
  663. data/spec/spec_tests/data/seed_list_discovery/load-balanced/srvMaxHosts-zero-txt.yml +10 -0
  664. data/spec/spec_tests/data/seed_list_discovery/load-balanced/srvMaxHosts-zero.yml +10 -0
  665. data/spec/spec_tests/data/seed_list_discovery/replica-set/encoded-userinfo-and-db.yml +15 -0
  666. data/spec/spec_tests/data/seed_list_discovery/replica-set/loadBalanced-false-txt.yml +10 -0
  667. data/spec/spec_tests/data/seed_list_discovery/replica-set/srv-service-name.yml +11 -0
  668. data/spec/spec_tests/data/seed_list_discovery/replica-set/srvMaxHosts-conflicts_with_replicaSet-txt.yml +5 -0
  669. data/spec/spec_tests/data/seed_list_discovery/replica-set/srvMaxHosts-conflicts_with_replicaSet.yml +5 -0
  670. data/spec/spec_tests/data/seed_list_discovery/replica-set/srvMaxHosts-equal_to_srv_records.yml +16 -0
  671. data/spec/spec_tests/data/seed_list_discovery/replica-set/srvMaxHosts-greater_than_srv_records.yml +15 -0
  672. data/spec/spec_tests/data/seed_list_discovery/replica-set/srvMaxHosts-less_than_srv_records.yml +15 -0
  673. data/spec/spec_tests/data/seed_list_discovery/replica-set/srvMaxHosts-zero-txt.yml +15 -0
  674. data/spec/spec_tests/data/seed_list_discovery/replica-set/srvMaxHosts-zero.yml +15 -0
  675. data/spec/spec_tests/data/seed_list_discovery/replica-set/uri-with-admin-database.yml +13 -0
  676. data/spec/spec_tests/data/seed_list_discovery/replica-set/uri-with-auth.yml +12 -0
  677. data/spec/spec_tests/data/seed_list_discovery/sharded/srvMaxHosts-equal_to_srv_records.yml +13 -0
  678. data/spec/spec_tests/data/seed_list_discovery/sharded/srvMaxHosts-greater_than_srv_records.yml +12 -0
  679. data/spec/spec_tests/data/seed_list_discovery/sharded/srvMaxHosts-less_than_srv_records.yml +10 -0
  680. data/spec/spec_tests/data/seed_list_discovery/sharded/srvMaxHosts-zero.yml +11 -0
  681. data/spec/spec_tests/data/server_selection/Unknown/read/ghost.yml +11 -0
  682. data/spec/spec_tests/data/server_selection/Unknown/write/ghost.yml +11 -0
  683. data/spec/spec_tests/data/sessions_unified/driver-sessions-server-support.yml +123 -0
  684. data/spec/spec_tests/data/sessions_unified/snapshot-sessions-not-supported-client-error.yml +75 -0
  685. data/spec/spec_tests/data/sessions_unified/snapshot-sessions-not-supported-server-error.yml +102 -0
  686. data/spec/spec_tests/data/sessions_unified/snapshot-sessions-unsupported-ops.yml +258 -0
  687. data/spec/spec_tests/data/sessions_unified/snapshot-sessions.yml +482 -0
  688. data/spec/spec_tests/data/transactions/error-labels.yml +1 -1
  689. data/spec/spec_tests/data/transactions/errors-client.yml +8 -9
  690. data/spec/spec_tests/data/transactions/mongos-recovery-token.yml +1 -1
  691. data/spec/spec_tests/data/transactions/retryable-abort.yml +7 -7
  692. data/spec/spec_tests/data/transactions/retryable-commit.yml +7 -7
  693. data/spec/spec_tests/data/transactions_unified/do-not-retry-read-in-transaction.yml +64 -0
  694. data/spec/spec_tests/data/transactions_unified/retryable-abort-handshake.yml +118 -0
  695. data/spec/spec_tests/data/transactions_unified/retryable-commit-handshake.yml +118 -0
  696. data/spec/spec_tests/data/unified/invalid/expectedEventsForClient-ignoreExtraEvents-type.yml +15 -0
  697. data/spec/spec_tests/data/unified/valid-fail/operation-unsupported.yml +13 -0
  698. data/spec/spec_tests/data/unified/valid-pass/expectedEventsForClient-ignoreExtraEvents.yml +78 -0
  699. data/spec/spec_tests/data/unified/valid-pass/poc-change-streams.yml +4 -1
  700. data/spec/spec_tests/data/unified/valid-pass/poc-command-monitoring.yml +3 -3
  701. data/spec/spec_tests/data/unified/valid-pass/poc-transactions.yml +3 -2
  702. data/spec/spec_tests/data/uri_options/connection-options.yml +60 -0
  703. data/spec/spec_tests/data/uri_options/srv-options.yml +96 -0
  704. data/spec/spec_tests/data/versioned_api/crud-api-version-1-strict.yml +6 -4
  705. data/spec/spec_tests/data/versioned_api/crud-api-version-1.yml +7 -5
  706. data/spec/spec_tests/gridfs_unified_spec.rb +13 -0
  707. data/spec/spec_tests/load_balancers_spec.rb +15 -0
  708. data/spec/spec_tests/retryable_reads_spec.rb +6 -3
  709. data/spec/spec_tests/retryable_reads_unified_spec.rb +22 -0
  710. data/spec/spec_tests/retryable_writes_spec.rb +5 -2
  711. data/spec/spec_tests/retryable_writes_unified_spec.rb +21 -0
  712. data/spec/spec_tests/sdam_integration_spec.rb +1 -1
  713. data/spec/spec_tests/sdam_monitoring_spec.rb +10 -5
  714. data/spec/spec_tests/sdam_spec.rb +1 -1
  715. data/spec/spec_tests/seed_list_discovery_spec.rb +127 -0
  716. data/spec/spec_tests/sessions_unified_spec.rb +13 -0
  717. data/spec/spec_tests/unified_spec.rb +6 -1
  718. data/spec/spec_tests/uri_options_spec.rb +4 -4
  719. data/spec/stress/connection_pool_timing_spec.rb +3 -2
  720. data/spec/stress/fork_reconnect_stress_spec.rb +4 -7
  721. data/spec/stress/push_monitor_close_spec.rb +44 -0
  722. data/spec/support/authorization.rb +1 -1
  723. data/spec/support/background_thread_registry.rb +3 -13
  724. data/spec/support/certificates/atlas-ocsp-ca.crt +81 -96
  725. data/spec/support/certificates/atlas-ocsp.crt +125 -125
  726. data/spec/support/certificates/retrieve-atlas-cert +38 -0
  727. data/spec/support/cluster_tools.rb +1 -1
  728. data/spec/support/common_shortcuts.rb +24 -3
  729. data/spec/support/crypt/corpus/corpus-encrypted.json +9515 -0
  730. data/spec/support/crypt/corpus/corpus-key-aws.json +32 -32
  731. data/spec/support/crypt/corpus/corpus-key-azure.json +33 -0
  732. data/spec/support/crypt/corpus/corpus-key-gcp.json +35 -0
  733. data/spec/support/crypt/corpus/corpus-key-kmip.json +32 -0
  734. data/spec/support/crypt/corpus/corpus-key-local.json +30 -30
  735. data/spec/support/crypt/corpus/corpus-schema.json +4399 -121
  736. data/spec/support/crypt/corpus/corpus.json +4999 -37
  737. data/spec/support/crypt/data_keys/key_document_azure.json +33 -0
  738. data/spec/support/crypt/data_keys/key_document_gcp.json +37 -0
  739. data/spec/support/crypt/data_keys/key_document_kmip.json +32 -0
  740. data/spec/support/crypt/encryptedFields.json +33 -0
  741. data/spec/support/crypt/keys/key1-document.json +30 -0
  742. data/spec/support/crypt/schema_maps/schema_map_azure.json +17 -0
  743. data/spec/support/crypt/schema_maps/schema_map_azure_key_alt_names.json +12 -0
  744. data/spec/support/crypt/schema_maps/schema_map_gcp.json +17 -0
  745. data/spec/support/crypt/schema_maps/schema_map_gcp_key_alt_names.json +12 -0
  746. data/spec/support/crypt/schema_maps/schema_map_kmip.json +17 -0
  747. data/spec/support/crypt/schema_maps/schema_map_kmip_key_alt_names.json +12 -0
  748. data/spec/support/crypt.rb +258 -13
  749. data/spec/support/macros.rb +28 -0
  750. data/spec/support/matchers.rb +13 -0
  751. data/spec/support/mongos_macros.rb +17 -0
  752. data/spec/support/shared/auth_context.rb +16 -0
  753. data/spec/support/shared/scram_conversation.rb +2 -1
  754. data/spec/support/shared/session.rb +15 -9
  755. data/spec/support/spec_config.rb +100 -12
  756. data/spec/support/using_hash.rb +31 -0
  757. data/spec/support/utils.rb +57 -5
  758. data.tar.gz.sig +0 -0
  759. metadata +778 -381
  760. metadata.gz.sig +0 -0
  761. data/lib/mongo/collection/view/builder/find_command.rb +0 -173
  762. data/lib/mongo/collection/view/builder/op_query.rb +0 -94
  763. data/lib/mongo/cursor/builder/get_more_command.rb +0 -80
  764. data/lib/mongo/cursor/builder/kill_cursors_command.rb +0 -111
  765. data/lib/mongo/cursor/builder/op_get_more.rb +0 -64
  766. data/lib/mongo/cursor/builder/op_kill_cursors.rb +0 -106
  767. data/lib/mongo/operation/insert/legacy.rb +0 -68
  768. data/lib/mongo/operation/update/legacy/result.rb +0 -112
  769. data/lib/mongo/operation/update/legacy.rb +0 -68
  770. data/lib/mongo/server/context.rb +0 -72
  771. data/spec/mongo/cursor/builder/op_kill_cursors_spec.rb +0 -66
  772. data/spec/mongo/dbref_spec.rb +0 -152
  773. data/spec/mongo/operation/kill_cursors_spec.rb +0 -44
  774. data/spec/runners/unified/using_hash.rb +0 -34
  775. data/spec/spec_tests/change_streams_spec.rb +0 -93
  776. data/spec/spec_tests/command_monitoring_spec.rb +0 -71
  777. data/spec/spec_tests/data/change_streams/change-streams-errors.yml +0 -101
  778. data/spec/spec_tests/data/change_streams/change-streams-resume-allowlist.yml +0 -1173
  779. data/spec/spec_tests/data/change_streams/change-streams-resume-errorLabels.yml +0 -1105
  780. data/spec/spec_tests/data/change_streams/change-streams.yml +0 -535
  781. data/spec/spec_tests/data/command_monitoring/bulkWrite.yml +0 -49
  782. data/spec/spec_tests/data/command_monitoring/command.yml +0 -61
  783. data/spec/spec_tests/data/command_monitoring/deleteMany.yml +0 -55
  784. data/spec/spec_tests/data/command_monitoring/deleteOne.yml +0 -55
  785. data/spec/spec_tests/data/command_monitoring/find.yml +0 -266
  786. data/spec/spec_tests/data/command_monitoring/insertMany.yml +0 -75
  787. data/spec/spec_tests/data/command_monitoring/insertOne.yml +0 -51
  788. data/spec/spec_tests/data/command_monitoring/unacknowledgedBulkWrite.yml +0 -34
  789. data/spec/spec_tests/data/command_monitoring/updateMany.yml +0 -65
  790. data/spec/spec_tests/data/command_monitoring/updateOne.yml +0 -90
  791. data/spec/spec_tests/data/crud_v2/aggregate-merge.yml +0 -103
  792. data/spec/spec_tests/data/crud_v2/aggregate-out-readConcern.yml +0 -111
  793. data/spec/spec_tests/data/crud_v2/bulkWrite-arrayFilters.yml +0 -103
  794. data/spec/spec_tests/data/crud_v2/bulkWrite-delete-hint-clientError.yml +0 -63
  795. data/spec/spec_tests/data/crud_v2/bulkWrite-delete-hint-serverError.yml +0 -92
  796. data/spec/spec_tests/data/crud_v2/bulkWrite-delete-hint.yml +0 -103
  797. data/spec/spec_tests/data/crud_v2/bulkWrite-update-hint-clientError.yml +0 -90
  798. data/spec/spec_tests/data/crud_v2/bulkWrite-update-hint-serverError.yml +0 -147
  799. data/spec/spec_tests/data/crud_v2/bulkWrite-update-hint.yml +0 -164
  800. data/spec/spec_tests/data/crud_v2/db-aggregate.yml +0 -39
  801. data/spec/spec_tests/data/crud_v2/deleteMany-hint-clientError.yml +0 -43
  802. data/spec/spec_tests/data/crud_v2/deleteMany-hint-serverError.yml +0 -62
  803. data/spec/spec_tests/data/crud_v2/deleteMany-hint.yml +0 -58
  804. data/spec/spec_tests/data/crud_v2/deleteOne-hint-clientError.yml +0 -41
  805. data/spec/spec_tests/data/crud_v2/deleteOne-hint-serverError.yml +0 -60
  806. data/spec/spec_tests/data/crud_v2/deleteOne-hint.yml +0 -57
  807. data/spec/spec_tests/data/crud_v2/find-allowdiskuse-clientError.yml +0 -28
  808. data/spec/spec_tests/data/crud_v2/find-allowdiskuse-serverError.yml +0 -44
  809. data/spec/spec_tests/data/crud_v2/find-allowdiskuse.yml +0 -50
  810. data/spec/spec_tests/data/crud_v2/findOneAndDelete-hint-clientError.yml +0 -45
  811. data/spec/spec_tests/data/crud_v2/findOneAndDelete-hint-serverError.yml +0 -60
  812. data/spec/spec_tests/data/crud_v2/findOneAndDelete-hint.yml +0 -56
  813. data/spec/spec_tests/data/crud_v2/findOneAndReplace-hint-clientError.yml +0 -40
  814. data/spec/spec_tests/data/crud_v2/findOneAndReplace-hint-serverError.yml +0 -59
  815. data/spec/spec_tests/data/crud_v2/findOneAndReplace-hint.yml +0 -55
  816. data/spec/spec_tests/data/crud_v2/findOneAndUpdate-hint-clientError.yml +0 -40
  817. data/spec/spec_tests/data/crud_v2/findOneAndUpdate-hint-serverError.yml +0 -58
  818. data/spec/spec_tests/data/crud_v2/findOneAndUpdate-hint.yml +0 -55
  819. data/spec/spec_tests/data/crud_v2/replaceOne-hint.yml +0 -61
  820. data/spec/spec_tests/data/crud_v2/unacknowledged-bulkWrite-delete-hint-clientError.yml +0 -60
  821. data/spec/spec_tests/data/crud_v2/unacknowledged-bulkWrite-update-hint-clientError.yml +0 -88
  822. data/spec/spec_tests/data/crud_v2/unacknowledged-deleteMany-hint-clientError.yml +0 -40
  823. data/spec/spec_tests/data/crud_v2/unacknowledged-deleteOne-hint-clientError.yml +0 -38
  824. data/spec/spec_tests/data/crud_v2/unacknowledged-findOneAndDelete-hint-clientError.yml +0 -42
  825. data/spec/spec_tests/data/crud_v2/unacknowledged-findOneAndReplace-hint-clientError.yml +0 -40
  826. data/spec/spec_tests/data/crud_v2/unacknowledged-findOneAndUpdate-hint-clientError.yml +0 -40
  827. data/spec/spec_tests/data/crud_v2/unacknowledged-replaceOne-hint-clientError.yml +0 -40
  828. data/spec/spec_tests/data/crud_v2/unacknowledged-updateMany-hint-clientError.yml +0 -43
  829. data/spec/spec_tests/data/crud_v2/unacknowledged-updateOne-hint-clientError.yml +0 -40
  830. data/spec/spec_tests/data/crud_v2/updateMany-hint-clientError.yml +0 -45
  831. data/spec/spec_tests/data/crud_v2/updateMany-hint-serverError.yml +0 -66
  832. data/spec/spec_tests/data/crud_v2/updateMany-hint.yml +0 -65
  833. data/spec/spec_tests/data/crud_v2/updateOne-hint-clientError.yml +0 -43
  834. data/spec/spec_tests/data/crud_v2/updateOne-hint-serverError.yml +0 -62
  835. data/spec/spec_tests/data/crud_v2/updateOne-hint.yml +0 -61
  836. data/spec/spec_tests/data/crud_v2/updateWithPipelines.yml +0 -157
  837. data/spec/spec_tests/data/retryable_reads/estimatedDocumentCount-4.9.yml +0 -60
  838. data/spec/spec_tests/data/retryable_reads/estimatedDocumentCount-serverErrors-4.9.yml +0 -146
  839. data/spec/spec_tests/dns_seedlist_discovery_spec.rb +0 -79
  840. data/spec/support/crypt/corpus/corpus_encrypted.json +0 -4152
  841. data/spec/support/event_subscriber.rb +0 -221
  842. data/spec/support/session_registry.rb +0 -55
  843. /data/spec/spec_tests/data/retryable_reads/{aggregate-merge.yml → legacy/aggregate-merge.yml} +0 -0
  844. /data/spec/spec_tests/data/retryable_reads/{aggregate-serverErrors.yml → legacy/aggregate-serverErrors.yml} +0 -0
  845. /data/spec/spec_tests/data/retryable_reads/{aggregate.yml → legacy/aggregate.yml} +0 -0
  846. /data/spec/spec_tests/data/retryable_reads/{count-serverErrors.yml → legacy/count-serverErrors.yml} +0 -0
  847. /data/spec/spec_tests/data/retryable_reads/{count.yml → legacy/count.yml} +0 -0
  848. /data/spec/spec_tests/data/retryable_reads/{countDocuments-serverErrors.yml → legacy/countDocuments-serverErrors.yml} +0 -0
  849. /data/spec/spec_tests/data/retryable_reads/{countDocuments.yml → legacy/countDocuments.yml} +0 -0
  850. /data/spec/spec_tests/data/retryable_reads/{distinct-serverErrors.yml → legacy/distinct-serverErrors.yml} +0 -0
  851. /data/spec/spec_tests/data/retryable_reads/{distinct.yml → legacy/distinct.yml} +0 -0
  852. /data/spec/spec_tests/data/retryable_reads/{find-serverErrors.yml → legacy/find-serverErrors.yml} +0 -0
  853. /data/spec/spec_tests/data/retryable_reads/{find.yml → legacy/find.yml} +0 -0
  854. /data/spec/spec_tests/data/retryable_reads/{findOne-serverErrors.yml → legacy/findOne-serverErrors.yml} +0 -0
  855. /data/spec/spec_tests/data/retryable_reads/{findOne.yml → legacy/findOne.yml} +0 -0
  856. /data/spec/spec_tests/data/retryable_reads/{gridfs-download-serverErrors.yml → legacy/gridfs-download-serverErrors.yml} +0 -0
  857. /data/spec/spec_tests/data/retryable_reads/{gridfs-download.yml → legacy/gridfs-download.yml} +0 -0
  858. /data/spec/spec_tests/data/retryable_reads/{gridfs-downloadByName-serverErrors.yml → legacy/gridfs-downloadByName-serverErrors.yml} +0 -0
  859. /data/spec/spec_tests/data/retryable_reads/{gridfs-downloadByName.yml → legacy/gridfs-downloadByName.yml} +0 -0
  860. /data/spec/spec_tests/data/retryable_reads/{listCollectionNames-serverErrors.yml → legacy/listCollectionNames-serverErrors.yml} +0 -0
  861. /data/spec/spec_tests/data/retryable_reads/{listCollectionNames.yml → legacy/listCollectionNames.yml} +0 -0
  862. /data/spec/spec_tests/data/retryable_reads/{listCollectionObjects-serverErrors.yml → legacy/listCollectionObjects-serverErrors.yml} +0 -0
  863. /data/spec/spec_tests/data/retryable_reads/{listCollectionObjects.yml → legacy/listCollectionObjects.yml} +0 -0
  864. /data/spec/spec_tests/data/retryable_reads/{listCollections-serverErrors.yml → legacy/listCollections-serverErrors.yml} +0 -0
  865. /data/spec/spec_tests/data/retryable_reads/{listCollections.yml → legacy/listCollections.yml} +0 -0
  866. /data/spec/spec_tests/data/retryable_reads/{listDatabaseNames-serverErrors.yml → legacy/listDatabaseNames-serverErrors.yml} +0 -0
  867. /data/spec/spec_tests/data/retryable_reads/{listDatabaseNames.yml → legacy/listDatabaseNames.yml} +0 -0
  868. /data/spec/spec_tests/data/retryable_reads/{listDatabaseObjects-serverErrors.yml → legacy/listDatabaseObjects-serverErrors.yml} +0 -0
  869. /data/spec/spec_tests/data/retryable_reads/{listDatabaseObjects.yml → legacy/listDatabaseObjects.yml} +0 -0
  870. /data/spec/spec_tests/data/retryable_reads/{listDatabases-serverErrors.yml → legacy/listDatabases-serverErrors.yml} +0 -0
  871. /data/spec/spec_tests/data/retryable_reads/{listDatabases.yml → legacy/listDatabases.yml} +0 -0
  872. /data/spec/spec_tests/data/retryable_reads/{listIndexNames-serverErrors.yml → legacy/listIndexNames-serverErrors.yml} +0 -0
  873. /data/spec/spec_tests/data/retryable_reads/{listIndexNames.yml → legacy/listIndexNames.yml} +0 -0
  874. /data/spec/spec_tests/data/retryable_reads/{listIndexes-serverErrors.yml → legacy/listIndexes-serverErrors.yml} +0 -0
  875. /data/spec/spec_tests/data/retryable_reads/{listIndexes.yml → legacy/listIndexes.yml} +0 -0
  876. /data/spec/spec_tests/data/retryable_writes/{bulkWrite-errorLabels.yml → legacy/bulkWrite-errorLabels.yml} +0 -0
  877. /data/spec/spec_tests/data/retryable_writes/{bulkWrite.yml → legacy/bulkWrite.yml} +0 -0
  878. /data/spec/spec_tests/data/retryable_writes/{deleteMany.yml → legacy/deleteMany.yml} +0 -0
  879. /data/spec/spec_tests/data/retryable_writes/{deleteOne-errorLabels.yml → legacy/deleteOne-errorLabels.yml} +0 -0
  880. /data/spec/spec_tests/data/retryable_writes/{deleteOne.yml → legacy/deleteOne.yml} +0 -0
  881. /data/spec/spec_tests/data/retryable_writes/{findOneAndDelete-errorLabels.yml → legacy/findOneAndDelete-errorLabels.yml} +0 -0
  882. /data/spec/spec_tests/data/retryable_writes/{findOneAndDelete.yml → legacy/findOneAndDelete.yml} +0 -0
  883. /data/spec/spec_tests/data/retryable_writes/{findOneAndReplace-errorLabels.yml → legacy/findOneAndReplace-errorLabels.yml} +0 -0
  884. /data/spec/spec_tests/data/retryable_writes/{findOneAndReplace.yml → legacy/findOneAndReplace.yml} +0 -0
  885. /data/spec/spec_tests/data/retryable_writes/{findOneAndUpdate-errorLabels.yml → legacy/findOneAndUpdate-errorLabels.yml} +0 -0
  886. /data/spec/spec_tests/data/retryable_writes/{findOneAndUpdate.yml → legacy/findOneAndUpdate.yml} +0 -0
  887. /data/spec/spec_tests/data/retryable_writes/{insertMany-errorLabels.yml → legacy/insertMany-errorLabels.yml} +0 -0
  888. /data/spec/spec_tests/data/retryable_writes/{insertMany.yml → legacy/insertMany.yml} +0 -0
  889. /data/spec/spec_tests/data/retryable_writes/{insertOne-errorLabels.yml → legacy/insertOne-errorLabels.yml} +0 -0
  890. /data/spec/spec_tests/data/retryable_writes/{insertOne.yml → legacy/insertOne.yml} +0 -0
  891. /data/spec/spec_tests/data/retryable_writes/{replaceOne-errorLabels.yml → legacy/replaceOne-errorLabels.yml} +0 -0
  892. /data/spec/spec_tests/data/retryable_writes/{replaceOne.yml → legacy/replaceOne.yml} +0 -0
  893. /data/spec/spec_tests/data/retryable_writes/{updateMany.yml → legacy/updateMany.yml} +0 -0
  894. /data/spec/spec_tests/data/retryable_writes/{updateOne-errorLabels.yml → legacy/updateOne-errorLabels.yml} +0 -0
  895. /data/spec/spec_tests/data/retryable_writes/{updateOne.yml → legacy/updateOne.yml} +0 -0
  896. /data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/direct-connection-false.yml +0 -0
  897. /data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/direct-connection-true.yml +0 -0
  898. /data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/longer-parent-in-return.yml +0 -0
  899. /data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/misformatted-option.yml +0 -0
  900. /data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/no-results.yml +0 -0
  901. /data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/not-enough-parts.yml +0 -0
  902. /data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/one-result-default-port.yml +0 -0
  903. /data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/one-txt-record-multiple-strings.yml +0 -0
  904. /data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/one-txt-record.yml +0 -0
  905. /data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/parent-part-mismatch1.yml +0 -0
  906. /data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/parent-part-mismatch2.yml +0 -0
  907. /data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/parent-part-mismatch3.yml +0 -0
  908. /data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/parent-part-mismatch4.yml +0 -0
  909. /data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/parent-part-mismatch5.yml +0 -0
  910. /data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/returned-parent-too-short.yml +0 -0
  911. /data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/returned-parent-wrong.yml +0 -0
  912. /data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/two-results-default-port.yml +0 -0
  913. /data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/two-results-nonstandard-port.yml +0 -0
  914. /data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/two-txt-records.yml +0 -0
  915. /data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/txt-record-not-allowed-option.yml +0 -0
  916. /data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/txt-record-with-overridden-ssl-option.yml +0 -0
  917. /data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/txt-record-with-overridden-uri-option.yml +0 -0
  918. /data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/txt-record-with-unallowed-option.yml +0 -0
  919. /data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/uri-with-port.yml +0 -0
  920. /data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/uri-with-two-hosts.yml +0 -0
@@ -0,0 +1,85 @@
1
+ # frozen_string_literal: true
2
+ # encoding: utf-8
3
+
4
+ require "spec_helper"
5
+
6
+ describe "Decryption events" do
7
+ require_enterprise
8
+ min_server_fcv "4.2"
9
+ require_libmongocrypt
10
+ include_context "define shared FLE helpers"
11
+
12
+ let(:client) do
13
+ ClientRegistry.instance.new_local_client(
14
+ SpecConfig.instance.addresses,
15
+ SpecConfig.instance.test_options.merge(
16
+ database: SpecConfig.instance.test_db,
17
+ )
18
+ )
19
+ end
20
+
21
+ let(:client_encryption) do
22
+ Mongo::ClientEncryption.new(
23
+ client,
24
+ key_vault_namespace: "#{key_vault_db}.#{key_vault_coll}",
25
+ kms_providers: local_kms_providers
26
+ )
27
+ end
28
+
29
+ let(:existing_key_alt_name) do
30
+ 'def'
31
+ end
32
+
33
+ let(:existing_key_id) do
34
+ client_encryption.create_data_key('local', key_alt_names: [existing_key_alt_name])
35
+ end
36
+
37
+ before(:each) do
38
+ client.use(key_vault_db)[key_vault_coll].drop
39
+ client.use(key_vault_db).command({
40
+ createIndexes: key_vault_coll,
41
+ indexes: [
42
+ {
43
+ name: "keyAltNames_1",
44
+ key: { "keyAltNames": 1 },
45
+ unique: true,
46
+ partialFilterExpression: { keyAltNames: { "$exists" => true } },
47
+ },
48
+ ],
49
+ writeConcern: { w: "majority" },
50
+ })
51
+ # Force key creation
52
+ existing_key_id
53
+ end
54
+
55
+ it 'tests create_data_key' do
56
+ expect do
57
+ client_encryption.create_data_key('local', key_alt_names: ['abc'])
58
+ end.not_to raise_error
59
+
60
+ expect do
61
+ client_encryption.create_data_key('local', key_alt_names: [existing_key_alt_name])
62
+ end.to raise_error(Mongo::Error::OperationFailure, /E11000/) # duplicate key error
63
+ end
64
+
65
+ it 'tests add_key_alt_name' do
66
+ key_id = client_encryption.create_data_key('local')
67
+ expect do
68
+ client_encryption.add_key_alt_name(key_id, 'abc')
69
+ end.not_to raise_error
70
+
71
+ expect do
72
+ key_document = client_encryption.add_key_alt_name(key_id, 'abc')
73
+ expect(key_document['keyAltNames']).to include('abc')
74
+ end.not_to raise_error
75
+
76
+ expect do
77
+ client_encryption.add_key_alt_name(key_id, existing_key_alt_name)
78
+ end.to raise_error(Mongo::Error::OperationFailure, /E11000/) # duplicate key error
79
+
80
+ expect do
81
+ key_document = client_encryption.add_key_alt_name(existing_key_id, existing_key_alt_name)
82
+ expect(key_document['keyAltNames']).to include(existing_key_alt_name)
83
+ end.not_to raise_error
84
+ end
85
+ end
@@ -24,7 +24,7 @@ describe 'Client-Side Encryption' do
24
24
  SpecConfig.instance.test_options.merge(
25
25
  auto_encryption_options: {
26
26
  kms_providers: local_kms_providers,
27
- key_vault_namespace: 'admin.datakeys',
27
+ key_vault_namespace: 'keyvault.datakeys',
28
28
  # Spawn mongocryptd on non-default port for sharded cluster tests
29
29
  extra_options: extra_options,
30
30
  },
@@ -21,6 +21,8 @@ describe 'Client' do
21
21
  end
22
22
 
23
23
  context 'after all servers are marked unknown' do
24
+ require_topology :single, :replica_set, :sharded
25
+
24
26
  before do
25
27
  client.cluster.servers.each do |server|
26
28
  server.unknown!
@@ -15,8 +15,8 @@ describe Mongo::Client do
15
15
  include_context 'with local kms_providers'
16
16
 
17
17
  before do
18
- authorized_client.use(:admin)[:datakeys].drop
19
- authorized_client.use(:admin)[:datakeys].insert_one(data_key)
18
+ authorized_client.use(:keyvault)[:datakeys].drop
19
+ authorized_client.use(:keyvault)[:datakeys].insert_one(data_key)
20
20
  authorized_client.use(:auto_encryption)[:users].drop
21
21
  authorized_client.use(:auto_encryption)[:users,
22
22
  {
@@ -5,7 +5,7 @@ require 'spec_helper'
5
5
 
6
6
  describe 'Command monitoring' do
7
7
 
8
- let(:subscriber) { EventSubscriber.new }
8
+ let(:subscriber) { Mrss::EventSubscriber.new }
9
9
 
10
10
  let(:client) do
11
11
  authorized_client.with(app_name: 'command monitoring spec').tap do |client|
@@ -5,7 +5,7 @@ require 'spec_helper'
5
5
 
6
6
  describe 'Command' do
7
7
 
8
- let(:subscriber) { EventSubscriber.new }
8
+ let(:subscriber) { Mrss::EventSubscriber.new }
9
9
 
10
10
  describe 'payload' do
11
11
  let(:server) { authorized_client.cluster.next_primary }
@@ -50,7 +50,7 @@ describe 'Connections' do
50
50
 
51
51
  context 'with sdam event subscription' do
52
52
 
53
- let(:subscriber) { EventSubscriber.new }
53
+ let(:subscriber) { Mrss::EventSubscriber.new }
54
54
  let(:client) do
55
55
  ClientRegistry.instance.global_client('authorized').with(app_name: 'connection_integration').tap do |client|
56
56
  client.subscribe(Mongo::Monitoring::SERVER_OPENING, subscriber)
@@ -246,43 +246,60 @@ describe 'Connections' do
246
246
 
247
247
  let(:client) { ClientRegistry.instance.global_client('authorized').with(app_name: 'wire_protocol_update') }
248
248
 
249
- it 'updates on hello response from non-monitoring connections' do
250
- # connect server
251
- client['test'].insert_one(test: 1)
249
+ context 'non-lb' do
250
+ require_topology :single, :replica_set, :sharded
252
251
 
253
- # kill background threads so that they are not interfering with
254
- # our mocked hello response
255
- client.cluster.servers.each do |server|
256
- server.monitor.stop!
252
+ it 'updates on handshake response from non-monitoring connections' do
253
+ # connect server
254
+ client['test'].insert_one(test: 1)
255
+
256
+ # kill background threads so that they are not interfering with
257
+ # our mocked hello response
258
+ client.cluster.servers.each do |server|
259
+ server.monitor.stop!
260
+ end
261
+
262
+ server = client.cluster.servers.first
263
+ expect(server.features.server_wire_versions.max >= 4).to be true
264
+ max_version = server.features.server_wire_versions.max
265
+
266
+ # Depending on server version, handshake here may return a
267
+ # description that compares equal to the one we got from a
268
+ # monitoring connection (pre-4.2) or not (4.2+).
269
+ # Since we do run SDAM flow on handshake responses on
270
+ # non-monitoring connections, force descriptions to be different
271
+ # by setting the existing description here to unknown.
272
+ server.monitor.instance_variable_set('@description',
273
+ Mongo::Server::Description.new(server.address))
274
+
275
+ RSpec::Mocks.with_temporary_scope do
276
+ # now pretend a handshake returned a different range
277
+ features = Mongo::Server::Description::Features.new(0..3)
278
+ # One Features instantiation is for SDAM event publication, this
279
+ # one always happens. The second one happens on servers
280
+ # where we do not negotiate auth mechanism.
281
+ expect(Mongo::Server::Description::Features).to receive(:new).at_least(:once).and_return(features)
282
+
283
+ connection = Mongo::Server::Connection.new(server, server.options)
284
+ expect(connection.connect!).to be true
285
+
286
+ # hello response should update server description via sdam flow,
287
+ # which includes wire version range
288
+ expect(server.features.server_wire_versions.max).to eq(3)
289
+ end
257
290
  end
291
+ end
292
+
293
+ context 'lb' do
294
+ require_topology :load_balanced
295
+
296
+ it 'does not update on handshake response from non-monitoring connections since there are not any' do
297
+ # connect server
298
+ client['test'].insert_one(test: 1)
258
299
 
259
- server = client.cluster.servers.first
260
- expect(server.features.server_wire_versions.max >= 4).to be true
261
- max_version = server.features.server_wire_versions.max
262
-
263
- # Depending on server version, hello here may return a
264
- # description that compares equal to the one we got from a
265
- # monitoring connection (pre-4.2) or not (4.2+).
266
- # Since we do run SDAM flow on hello responses on
267
- # non-monitoring connections, force descriptions to be different
268
- # by setting the existing description here to unknown.
269
- server.monitor.instance_variable_set('@description',
270
- Mongo::Server::Description.new(server.address))
271
-
272
- RSpec::Mocks.with_temporary_scope do
273
- # now pretend a hello returned a different range
274
- features = Mongo::Server::Description::Features.new(0..3)
275
- # One Features instantiation is for SDAM event publication, this
276
- # one always happens. The second one happens on servers
277
- # where we do not negotiate auth mechanism.
278
- expect(Mongo::Server::Description::Features).to receive(:new).at_least(:once).and_return(features)
279
-
280
- connection = Mongo::Server::Connection.new(server, server.options)
281
- expect(connection.connect!).to be true
282
-
283
- # hello response should update server description via sdam flow,
284
- # which includes wire version range
285
- expect(server.features.server_wire_versions.max).to eq(3)
300
+ server = client.cluster.servers.first
301
+ server.load_balancer?.should be true
302
+ server.features.server_wire_versions.max.should be 0
286
303
  end
287
304
  end
288
305
  end
@@ -4,7 +4,8 @@
4
4
  require 'spec_helper'
5
5
 
6
6
  describe 'CRUD operations' do
7
- let(:collection) { authorized_client['crud_integration'] }
7
+ let(:client) { authorized_client }
8
+ let(:collection) { client['crud_integration'] }
8
9
 
9
10
  before do
10
11
  collection.delete_many
@@ -64,9 +65,193 @@ describe 'CRUD operations' do
64
65
  end
65
66
  end
66
67
  end
68
+
69
+ context 'with read concern' do
70
+ # Read concern requires 3.2+ server.
71
+ min_server_fcv '3.2'
72
+
73
+ context 'with read concern specified on operation level' do
74
+
75
+ it 'passes the read concern' do
76
+ event = Utils.get_command_event(client, 'find') do |client|
77
+ client['foo'].find({}, read_concern: {level: :local}).to_a
78
+ end
79
+ event.command.fetch('readConcern').should == {'level' => 'local'}
80
+ end
81
+ end
82
+
83
+ context 'with read concern specified on collection level' do
84
+
85
+ it 'passes the read concern' do
86
+ event = Utils.get_command_event(client, 'find') do |client|
87
+ client['foo', read_concern: {level: :local}].find.to_a
88
+ end
89
+ event.command.fetch('readConcern').should == {'level' => 'local'}
90
+ end
91
+ end
92
+
93
+ context 'with read concern specified on client level' do
94
+
95
+ let(:client) { authorized_client.with(read_concern: {level: :local}) }
96
+
97
+ it 'passes the read concern' do
98
+ event = Utils.get_command_event(client, 'find') do |client|
99
+ client['foo'].find.to_a
100
+ end
101
+ event.command.fetch('readConcern').should == {'level' => 'local'}
102
+ end
103
+ end
104
+ end
105
+
106
+ context 'with oplog_replay option' do
107
+ let(:collection_name) { 'crud_integration_oplog_replay' }
108
+
109
+ let(:oplog_query) do
110
+ {ts: {'$gt' => 1}}
111
+ end
112
+
113
+ context 'passed to operation' do
114
+ it 'passes the option' do
115
+ event = Utils.get_command_event(client, 'find') do |client|
116
+ client[collection_name].find(oplog_query, oplog_replay: true).to_a
117
+ end
118
+ event.command.fetch('oplogReplay').should be true
119
+ end
120
+
121
+ it 'warns' do
122
+ client.should receive(:log_warn).with('The :oplog_replay option is deprecated and ignored by MongoDB 4.4 and later')
123
+ client[collection_name].find(oplog_query, oplog_replay: true).to_a
124
+ end
125
+ end
126
+
127
+ context 'set on collection' do
128
+ it 'passes the option' do
129
+ event = Utils.get_command_event(client, 'find') do |client|
130
+ client[collection_name, oplog_replay: true].find(oplog_query).to_a
131
+ end
132
+ event.command.fetch('oplogReplay').should be true
133
+ end
134
+
135
+ it 'warns' do
136
+ client.should receive(:log_warn).with('The :oplog_replay option is deprecated and ignored by MongoDB 4.4 and later')
137
+ client[collection_name, oplog_replay: true].find(oplog_query).to_a
138
+ end
139
+ end
140
+ end
141
+ end
142
+
143
+ describe 'explain' do
144
+ context 'with explicit session' do
145
+ min_server_fcv '3.6'
146
+
147
+ it 'passes the session' do
148
+ client.start_session do |session|
149
+ event = Utils.get_command_event(client, 'explain') do |client|
150
+ client['foo'].find({}, session: session).explain.should be_explain_output
151
+ end
152
+ event.command.fetch('lsid').should == session.session_id
153
+ end
154
+ end
155
+ end
156
+
157
+ context 'with read preference specified on operation level' do
158
+ require_topology :sharded
159
+
160
+ # RUBY-2706
161
+ min_server_fcv '3.6'
162
+
163
+ it 'passes the read preference' do
164
+ event = Utils.get_command_event(client, 'explain') do |client|
165
+ client['foo'].find({}, read: {mode: :secondary_preferred}).explain.should be_explain_output
166
+ end
167
+ event.command.fetch('$readPreference').should == {'mode' => 'secondaryPreferred'}
168
+ end
169
+ end
170
+
171
+ context 'with read preference specified on collection level' do
172
+ require_topology :sharded
173
+
174
+ # RUBY-2706
175
+ min_server_fcv '3.6'
176
+
177
+ it 'passes the read preference' do
178
+ event = Utils.get_command_event(client, 'explain') do |client|
179
+ client['foo', read: {mode: :secondary_preferred}].find.explain.should be_explain_output
180
+ end
181
+ event.command.fetch('$readPreference').should == {'mode' => 'secondaryPreferred'}
182
+ end
183
+ end
184
+
185
+ context 'with read preference specified on client level' do
186
+ require_topology :sharded
187
+
188
+ # RUBY-2706
189
+ min_server_fcv '3.6'
190
+
191
+ let(:client) { authorized_client.with(read: {mode: :secondary_preferred}) }
192
+
193
+ it 'passes the read preference' do
194
+ event = Utils.get_command_event(client, 'explain') do |client|
195
+ client['foo'].find.explain.should be_explain_output
196
+ end
197
+ event.command.fetch('$readPreference').should == {'mode' => 'secondaryPreferred'}
198
+ end
199
+ end
200
+
201
+ context 'with read concern' do
202
+ # Read concern requires 3.2+ server.
203
+ min_server_fcv '3.2'
204
+
205
+ context 'with read concern specifed on operation level' do
206
+
207
+ # Read concern is not allowed in explain command, driver drops it.
208
+ it 'drops the read concern' do
209
+ event = Utils.get_command_event(client, 'explain') do |client|
210
+ client['foo'].find({}, read_concern: {level: :local}).explain.should have_key('queryPlanner')
211
+ end
212
+ event.command.should_not have_key('readConcern')
213
+ end
214
+ end
215
+
216
+ context 'with read concern specifed on collection level' do
217
+
218
+ # Read concern is not allowed in explain command, driver drops it.
219
+ it 'drops the read concern' do
220
+ event = Utils.get_command_event(client, 'explain') do |client|
221
+ client['foo', read_concern: {level: :local}].find.explain.should have_key('queryPlanner')
222
+ end
223
+ event.command.should_not have_key('readConcern')
224
+ end
225
+ end
226
+
227
+ context 'with read concern specifed on client level' do
228
+
229
+ let(:client) { authorized_client.with(read_concern: {level: :local}) }
230
+
231
+ # Read concern is not allowed in explain command, driver drops it.
232
+ it 'drops the read concern' do
233
+ event = Utils.get_command_event(client, 'explain') do |client|
234
+ client['foo'].find.explain.should have_key('queryPlanner')
235
+ end
236
+ event.command.should_not have_key('readConcern')
237
+ end
238
+ end
239
+ end
67
240
  end
68
241
 
69
242
  describe 'insert' do
243
+ context 'user documents' do
244
+ let(:doc) do
245
+ IceNine.deep_freeze(test: 42)
246
+ end
247
+
248
+ it 'does not mutate user documents' do
249
+ lambda do
250
+ collection.insert_one(doc)
251
+ end.should_not raise_error
252
+ end
253
+ end
254
+
70
255
  context 'inserting a BSON::Int64' do
71
256
  before do
72
257
  collection.insert_one(int64: BSON::Int64.new(42))
@@ -0,0 +1,121 @@
1
+ # frozen_string_literal: true
2
+ # encoding: utf-8
3
+
4
+ require 'spec_helper'
5
+
6
+ describe 'Cursor pinning' do
7
+ let(:client) { authorized_client }
8
+ let(:collection_name) { 'cursor_pinning' }
9
+ let(:collection) { client[collection_name] }
10
+
11
+ before do
12
+ authorized_client[collection_name].insert_many([{test: 1}] * 200)
13
+ end
14
+
15
+ let(:server) { client.cluster.next_primary }
16
+
17
+ clean_slate
18
+
19
+ context 'non-lb' do
20
+ require_topology :single, :replica_set, :sharded
21
+ require_no_multi_mongos
22
+
23
+ # When not in load-balanced topology, iterating a cursor creates
24
+ # new connections as needed.
25
+
26
+ it 'creates new connections for iteration' do
27
+ server.pool.size.should == 0
28
+
29
+ # Use batch_size of 2 until RUBY-2727 is fixed.
30
+ enum = collection.find({}, batch_size: 2).to_enum
31
+ # Still zero because we haven't iterated
32
+ server.pool.size.should == 0
33
+
34
+ enum.next
35
+ enum.next
36
+ server.pool.size.should == 1
37
+
38
+ # Grab the connection that was used
39
+ server.with_connection do
40
+ # This requires a new connection
41
+ enum.next
42
+
43
+ server.pool.size.should == 2
44
+ end
45
+ end
46
+ end
47
+
48
+ context 'lb' do
49
+ require_topology :load_balanced
50
+
51
+ # In load-balanced topology, we cannot create new connections to a
52
+ # particular service.
53
+
54
+ context 'when no connection is available' do
55
+
56
+ it 'raises ConnectionCheckOutTimeout' do
57
+ server.pool.size.should == 0
58
+
59
+ enum = collection.find({}, batch_size: 1).to_enum
60
+ # Still zero because we haven't iterated
61
+ server.pool.size.should == 0
62
+
63
+ enum.next
64
+ server.pool.size.should == 1
65
+
66
+ # Grab the connection that was used
67
+ server.with_connection do
68
+ # This requires a new connection, but we cannot make one.
69
+ lambda do
70
+ enum.next
71
+ end.should raise_error(Mongo::Error::ConnectionCheckOutTimeout)
72
+
73
+ server.pool.size.should == 1
74
+ end
75
+ end
76
+ end
77
+
78
+ context 'when connection is available' do
79
+ require_multi_mongos
80
+
81
+ let(:client) { authorized_client.with(max_pool_size: 4) }
82
+
83
+ it 'uses the available connection' do
84
+ server.pool.size.should == 0
85
+
86
+ # Create 4 connections.
87
+
88
+ enums = []
89
+ connections = []
90
+ connection_ids = []
91
+
92
+ 4.times do
93
+ view = collection.find({}, batch_size: 1)
94
+ enum = view.to_enum
95
+
96
+ enum.next
97
+
98
+ enums << enum
99
+ connection_ids << view.cursor.initial_result.connection_global_id
100
+ connections << server.pool.check_out
101
+ end
102
+
103
+ connection_ids.uniq.length.should be > 1
104
+
105
+ server.pool.size.should == 4
106
+
107
+ connections.each do |c|
108
+ server.pool.check_in(c)
109
+ end
110
+
111
+ # At this point, in theory, all connections are equally likely to
112
+ # be chosen, but we have cursors referencing more than one
113
+ # distinct service.
114
+ # Iterate each cursor to ensure they all continue to work.
115
+ enums.each do |enum|
116
+ enum.next
117
+ end
118
+ end
119
+ end
120
+ end
121
+ end
@@ -8,6 +8,8 @@ describe 'Cursor reaping' do
8
8
  # in MRI, I don't currently know how to force GC to run in JRuby
9
9
  require_mri
10
10
 
11
+ # Uncomment for debugging this test.
12
+ =begin
11
13
  around(:all) do |example|
12
14
  saved_level = Mongo::Logger.logger.level
13
15
  Mongo::Logger.logger.level = Logger::DEBUG
@@ -17,8 +19,9 @@ describe 'Cursor reaping' do
17
19
  Mongo::Logger.logger.level = saved_level
18
20
  end
19
21
  end
22
+ =end
20
23
 
21
- let(:subscriber) { EventSubscriber.new }
24
+ let(:subscriber) { Mrss::EventSubscriber.new }
22
25
 
23
26
  let(:client) do
24
27
  authorized_client.tap do |client|
@@ -57,10 +60,11 @@ describe 'Cursor reaping' do
57
60
  10.times do
58
61
  scope = collection.find.batch_size(2).no_cursor_timeout
59
62
 
60
- # there is no API for retrieving the cursor
63
+ # Begin iteration, creating the cursor
61
64
  scope.each.first
62
- # and keep the first cursor
63
- cursor_ids << scope.instance_variable_get('@cursor').id
65
+
66
+ scope.cursor.should_not be nil
67
+ cursor_ids << scope.cursor.id
64
68
  end
65
69
  end
66
70
  end
@@ -10,11 +10,7 @@ describe 'fork reconnect' do
10
10
  # On multi-shard sharded clusters a succeeding write request does not
11
11
  # guarantee that the next operation will succeed (since it could be sent to
12
12
  # another shard with a dead connection).
13
- require_no_multi_shard
14
-
15
- # On Ruby 2.3 $?.exitstatus is sometimes nil after Process.wait returns which
16
- # is not supposed to happen.
17
- ruby_version_gte '2.4'
13
+ require_no_multi_mongos
18
14
 
19
15
  let(:client) { authorized_client }
20
16
  let(:server) { client.cluster.next_primary }
@@ -155,32 +151,37 @@ describe 'fork reconnect' do
155
151
  # * In the child, create a ClientSession and assert its lsid is different.
156
152
  describe 'session pool' do
157
153
  it 'is cleared after fork' do
158
- session = client.get_session
154
+ session = client.get_session.materialize_if_needed
159
155
  parent_lsid = session.session_id
160
156
  session.end_session
157
+
161
158
  if pid = fork
162
159
  pid, status = Process.wait2(pid)
163
160
  status.exitstatus.should == 0
164
161
  else
165
162
  Utils.wrap_forked_child do
166
163
  client.reconnect
167
- child_session = client.get_session
164
+ child_session = client.get_session.materialize_if_needed
168
165
  child_lsid = child_session.session_id
169
166
  expect(child_lsid).not_to eq(parent_lsid)
170
167
  end
171
168
  end
172
169
 
173
- expect(client.get_session.session_id).to eq(parent_lsid)
170
+ session = client.get_session.materialize_if_needed
171
+ session_id = session.session_id
172
+ expect(session_id).to eq(parent_lsid)
174
173
  end
175
174
 
176
175
  # Test from Driver Sessions Spec
177
176
  # * Create ClientSession
178
177
  # * Record its lsid
179
178
  # * Fork
180
- # * In the parent, return the ClientSession to the pool, create a new ClientSession, and assert its lsid is the same.
181
- # * In the child, return the ClientSession to the pool, create a new ClientSession, and assert its lsid is different.
179
+ # * In the parent, return the ClientSession to the pool, create a new
180
+ # ClientSession, and assert its lsid is the same.
181
+ # * In the child, return the ClientSession to the pool, create a new
182
+ # ClientSession, and assert its lsid is different.
182
183
  it 'does not return parent process sessions to child process pool' do
183
- session = client.get_session
184
+ session = client.get_session.materialize_if_needed
184
185
  parent_lsid = session.session_id
185
186
 
186
187
  if pid = fork
@@ -190,14 +191,16 @@ describe 'fork reconnect' do
190
191
  Utils.wrap_forked_child do
191
192
  client.reconnect
192
193
  session.end_session
193
- child_session = client.get_session
194
+ child_session = client.get_session.materialize_if_needed
195
+
194
196
  child_lsid = child_session.session_id
195
197
  expect(child_lsid).not_to eq(parent_lsid)
196
198
  end
197
199
  end
198
200
 
199
201
  session.end_session
200
- expect(client.get_session.session_id).to eq(parent_lsid)
202
+ session_id = client.get_session.materialize_if_needed.session_id
203
+ expect(session_id).to eq(parent_lsid)
201
204
  end
202
205
  end
203
206
  end
@@ -7,7 +7,7 @@ describe 'getMore operation' do
7
7
  # https://jira.mongodb.org/browse/RUBY-1987
8
8
  min_server_fcv '3.2'
9
9
 
10
- let(:subscriber) { EventSubscriber.new }
10
+ let(:subscriber) { Mrss::EventSubscriber.new }
11
11
 
12
12
  let(:client) do
13
13
  authorized_client.tap do |client|