mongo 2.17.4 → 2.18.0.beta1

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 (624) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data/README.md +21 -37
  4. data/lib/mongo/auth/base.rb +8 -1
  5. data/lib/mongo/auth.rb +12 -1
  6. data/lib/mongo/bulk_write/result.rb +10 -1
  7. data/lib/mongo/bulk_write/result_combiner.rb +2 -4
  8. data/lib/mongo/bulk_write.rb +108 -28
  9. data/lib/mongo/client.rb +114 -12
  10. data/lib/mongo/client_encryption.rb +30 -9
  11. data/lib/mongo/cluster/reapers/cursor_reaper.rb +11 -1
  12. data/lib/mongo/cluster.rb +20 -24
  13. data/lib/mongo/collection/helpers.rb +43 -0
  14. data/lib/mongo/collection/queryable_encryption.rb +122 -0
  15. data/lib/mongo/collection/view/aggregation.rb +19 -16
  16. data/lib/mongo/collection/view/change_stream.rb +56 -23
  17. data/lib/mongo/collection/view/explainable.rb +1 -1
  18. data/lib/mongo/collection/view/iterable.rb +2 -18
  19. data/lib/mongo/collection/view/map_reduce.rb +18 -9
  20. data/lib/mongo/collection/view/readable.rb +19 -23
  21. data/lib/mongo/collection/view/writable.rb +133 -40
  22. data/lib/mongo/collection/view.rb +0 -1
  23. data/lib/mongo/collection.rb +108 -48
  24. data/lib/mongo/config/options.rb +62 -0
  25. data/lib/mongo/config/validators/option.rb +26 -0
  26. data/lib/mongo/config.rb +31 -0
  27. data/lib/mongo/crypt/auto_encrypter.rb +79 -6
  28. data/lib/mongo/crypt/binding.rb +395 -143
  29. data/lib/mongo/crypt/context.rb +5 -2
  30. data/lib/mongo/crypt/data_key_context.rb +7 -104
  31. data/lib/mongo/crypt/encryption_io.rb +28 -60
  32. data/lib/mongo/crypt/explicit_encrypter.rb +27 -25
  33. data/lib/mongo/crypt/explicit_encryption_context.rb +31 -3
  34. data/lib/mongo/crypt/handle.rb +102 -79
  35. data/lib/mongo/crypt/hooks.rb +25 -2
  36. data/lib/mongo/crypt/kms/aws.rb +128 -0
  37. data/lib/mongo/crypt/kms/azure.rb +136 -0
  38. data/lib/mongo/crypt/kms/credentials.rb +81 -0
  39. data/lib/mongo/crypt/kms/gcp.rb +182 -0
  40. data/lib/mongo/crypt/kms/kmip.rb +110 -0
  41. data/lib/mongo/crypt/kms/local.rb +74 -0
  42. data/lib/mongo/crypt/kms/master_key_document.rb +65 -0
  43. data/lib/mongo/crypt/kms.rb +117 -0
  44. data/lib/mongo/crypt.rb +1 -0
  45. data/lib/mongo/cursor/kill_spec.rb +27 -6
  46. data/lib/mongo/cursor.rb +21 -16
  47. data/lib/mongo/database/view.rb +6 -3
  48. data/lib/mongo/database.rb +73 -12
  49. data/lib/mongo/dbref.rb +1 -105
  50. data/lib/mongo/error/bulk_write_error.rb +31 -4
  51. data/lib/mongo/error/invalid_config_option.rb +20 -0
  52. data/lib/mongo/error/invalid_replacement_document.rb +27 -9
  53. data/lib/mongo/error/invalid_update_document.rb +27 -7
  54. data/lib/mongo/error/labelable.rb +72 -0
  55. data/lib/mongo/error/missing_connection.rb +25 -0
  56. data/lib/mongo/error/notable.rb +7 -0
  57. data/lib/mongo/error/operation_failure.rb +34 -86
  58. data/lib/mongo/error/read_write_retryable.rb +108 -0
  59. data/lib/mongo/{operation/kill_cursors/legacy.rb → error/session_not_materialized.rb} +7 -19
  60. data/lib/mongo/error.rb +5 -37
  61. data/lib/mongo/index/view.rb +22 -7
  62. data/lib/mongo/monitoring/event/command_failed.rb +8 -2
  63. data/lib/mongo/monitoring/event/command_started.rb +1 -1
  64. data/lib/mongo/monitoring/event/command_succeeded.rb +9 -2
  65. data/lib/mongo/monitoring/publishable.rb +9 -5
  66. data/lib/mongo/operation/collections_info/result.rb +5 -2
  67. data/lib/mongo/operation/command/op_msg.rb +6 -0
  68. data/lib/mongo/operation/context.rb +24 -6
  69. data/lib/mongo/operation/count/op_msg.rb +4 -1
  70. data/lib/mongo/operation/create/op_msg.rb +16 -1
  71. data/lib/mongo/operation/create_index/op_msg.rb +2 -1
  72. data/lib/mongo/operation/delete/op_msg.rb +1 -0
  73. data/lib/mongo/operation/delete.rb +0 -1
  74. data/lib/mongo/operation/drop_index/op_msg.rb +5 -1
  75. data/lib/mongo/operation/get_more/command_builder.rb +5 -1
  76. data/lib/mongo/operation/insert/bulk_result.rb +5 -1
  77. data/lib/mongo/operation/insert/command.rb +0 -4
  78. data/lib/mongo/operation/insert/op_msg.rb +6 -3
  79. data/lib/mongo/operation/insert/result.rb +6 -3
  80. data/lib/mongo/operation/insert.rb +0 -1
  81. data/lib/mongo/operation/kill_cursors.rb +0 -1
  82. data/lib/mongo/operation/list_collections/op_msg.rb +4 -1
  83. data/lib/mongo/operation/map_reduce/result.rb +16 -0
  84. data/lib/mongo/operation/result.rb +21 -5
  85. data/lib/mongo/operation/shared/executable.rb +21 -6
  86. data/lib/mongo/operation/shared/polymorphic_operation.rb +15 -3
  87. data/lib/mongo/operation/shared/response_handling.rb +6 -5
  88. data/lib/mongo/operation/shared/sessions_supported.rb +3 -7
  89. data/lib/mongo/operation/shared/write.rb +18 -12
  90. data/lib/mongo/operation/update/op_msg.rb +2 -1
  91. data/lib/mongo/operation/update.rb +0 -1
  92. data/lib/mongo/protocol/caching_hash.rb +69 -0
  93. data/lib/mongo/protocol/msg.rb +37 -1
  94. data/lib/mongo/protocol.rb +1 -0
  95. data/lib/mongo/query_cache.rb +15 -0
  96. data/lib/mongo/retryable.rb +78 -30
  97. data/lib/mongo/server/connection.rb +33 -0
  98. data/lib/mongo/server/connection_base.rb +2 -0
  99. data/lib/mongo/server/connection_common.rb +4 -1
  100. data/lib/mongo/server/connection_pool.rb +69 -42
  101. data/lib/mongo/server/description/features.rb +3 -1
  102. data/lib/mongo/server/description.rb +7 -2
  103. data/lib/mongo/server/monitor/connection.rb +5 -10
  104. data/lib/mongo/server/monitor.rb +21 -13
  105. data/lib/mongo/server/push_monitor.rb +9 -3
  106. data/lib/mongo/server.rb +9 -5
  107. data/lib/mongo/session/session_pool.rb +8 -0
  108. data/lib/mongo/session.rb +111 -35
  109. data/lib/mongo/socket/ocsp_verifier.rb +4 -5
  110. data/lib/mongo/socket/tcp.rb +3 -0
  111. data/lib/mongo/srv/resolver.rb +24 -3
  112. data/lib/mongo/uri/options_mapper.rb +2 -0
  113. data/lib/mongo/uri/srv_protocol.rb +1 -1
  114. data/lib/mongo/uri.rb +20 -0
  115. data/lib/mongo/version.rb +1 -1
  116. data/lib/mongo.rb +20 -0
  117. data/mongo.gemspec +10 -4
  118. data/spec/README.md +5 -5
  119. data/spec/integration/aws_lambda_examples_spec.rb +68 -0
  120. data/spec/integration/bulk_write_error_message_spec.rb +32 -0
  121. data/spec/integration/bulk_write_spec.rb +0 -16
  122. data/spec/integration/change_stream_spec.rb +6 -5
  123. data/spec/integration/client_construction_spec.rb +1 -1
  124. data/spec/integration/client_side_encryption/auto_encryption_bulk_writes_spec.rb +9 -9
  125. data/spec/integration/client_side_encryption/auto_encryption_command_monitoring_spec.rb +18 -19
  126. data/spec/integration/client_side_encryption/auto_encryption_mongocryptd_spawn_spec.rb +0 -1
  127. data/spec/integration/client_side_encryption/auto_encryption_reconnect_spec.rb +31 -0
  128. data/spec/integration/client_side_encryption/auto_encryption_spec.rb +108 -1
  129. data/spec/integration/client_side_encryption/bson_size_limit_spec.rb +2 -2
  130. data/spec/integration/client_side_encryption/bypass_mongocryptd_spawn_spec.rb +2 -2
  131. data/spec/integration/client_side_encryption/client_close_spec.rb +1 -1
  132. data/spec/integration/client_side_encryption/corpus_spec.rb +64 -35
  133. data/spec/integration/client_side_encryption/custom_endpoint_spec.rb +39 -42
  134. data/spec/integration/client_side_encryption/data_key_spec.rb +97 -7
  135. data/spec/integration/client_side_encryption/explicit_encryption_spec.rb +59 -0
  136. data/spec/integration/client_side_encryption/explicit_queryable_encryption_spec.rb +147 -0
  137. data/spec/integration/client_side_encryption/external_key_vault_spec.rb +6 -6
  138. data/spec/integration/client_side_encryption/kms_tls_options_spec.rb +394 -0
  139. data/spec/integration/client_side_encryption/kms_tls_spec.rb +92 -0
  140. data/spec/integration/client_side_encryption/queryable_encryption_examples_spec.rb +111 -0
  141. data/spec/integration/client_side_encryption/views_spec.rb +1 -1
  142. data/spec/integration/client_update_spec.rb +2 -2
  143. data/spec/integration/crud_spec.rb +12 -0
  144. data/spec/integration/cursor_pinning_spec.rb +3 -3
  145. data/spec/integration/fork_reconnect_spec.rb +15 -8
  146. data/spec/integration/grid_fs_bucket_spec.rb +3 -3
  147. data/spec/integration/ocsp_verifier_spec.rb +1 -0
  148. data/spec/integration/query_cache_spec.rb +34 -30
  149. data/spec/integration/retryable_writes/retryable_writes_36_and_older_spec.rb +1 -1
  150. data/spec/integration/sdam_events_spec.rb +0 -40
  151. data/spec/integration/server_monitor_spec.rb +2 -1
  152. data/spec/integration/size_limit_spec.rb +4 -1
  153. data/spec/integration/snapshot_query_examples_spec.rb +127 -0
  154. data/spec/integration/srv_monitoring_spec.rb +37 -0
  155. data/spec/integration/step_down_spec.rb +20 -4
  156. data/spec/integration/transaction_pinning_spec.rb +2 -2
  157. data/spec/integration/versioned_api_examples_spec.rb +37 -31
  158. data/spec/lite_spec_helper.rb +14 -5
  159. data/spec/mongo/address/ipv6_spec.rb +7 -0
  160. data/spec/mongo/address_spec.rb +7 -0
  161. data/spec/mongo/auth/scram/conversation_spec.rb +23 -23
  162. data/spec/mongo/auth/scram256/conversation_spec.rb +20 -20
  163. data/spec/mongo/auth/scram_negotiation_spec.rb +1 -0
  164. data/spec/mongo/bulk_write/result_spec.rb +15 -1
  165. data/spec/mongo/bulk_write_spec.rb +128 -20
  166. data/spec/mongo/client_construction_spec.rb +141 -7
  167. data/spec/mongo/client_encryption_spec.rb +11 -11
  168. data/spec/mongo/client_spec.rb +297 -1
  169. data/spec/mongo/cluster/cursor_reaper_spec.rb +21 -3
  170. data/spec/mongo/cluster_spec.rb +0 -44
  171. data/spec/mongo/collection/view/aggregation_spec.rb +2 -2
  172. data/spec/mongo/collection/view/change_stream_spec.rb +2 -2
  173. data/spec/mongo/collection/view/readable_spec.rb +35 -56
  174. data/spec/mongo/collection/view/writable_spec.rb +144 -32
  175. data/spec/mongo/collection_crud_spec.rb +63 -13
  176. data/spec/mongo/config/options_spec.rb +75 -0
  177. data/spec/mongo/config_spec.rb +73 -0
  178. data/spec/mongo/crypt/auto_decryption_context_spec.rb +17 -1
  179. data/spec/mongo/crypt/auto_encrypter_spec.rb +106 -0
  180. data/spec/mongo/crypt/auto_encryption_context_spec.rb +17 -1
  181. data/spec/mongo/crypt/binding/context_spec.rb +99 -17
  182. data/spec/mongo/crypt/binding/mongocrypt_spec.rb +17 -46
  183. data/spec/mongo/crypt/binding/version_spec.rb +25 -0
  184. data/spec/mongo/crypt/binding_unloaded_spec.rb +14 -0
  185. data/spec/mongo/crypt/data_key_context_spec.rb +42 -114
  186. data/spec/mongo/crypt/encryption_io_spec.rb +2 -0
  187. data/spec/mongo/crypt/explicit_decryption_context_spec.rb +32 -1
  188. data/spec/mongo/crypt/explicit_encryption_context_spec.rb +89 -1
  189. data/spec/mongo/crypt/handle_spec.rb +47 -169
  190. data/spec/mongo/crypt/hooks_spec.rb +30 -0
  191. data/spec/mongo/crypt/kms/credentials_spec.rb +404 -0
  192. data/spec/mongo/crypt/kms_spec.rb +59 -0
  193. data/spec/mongo/cursor_spec.rb +37 -51
  194. data/spec/mongo/database_spec.rb +66 -1
  195. data/spec/mongo/error/operation_failure_heavy_spec.rb +49 -0
  196. data/spec/mongo/index/view_spec.rb +69 -0
  197. data/spec/mongo/operation/create/op_msg_spec.rb +286 -0
  198. data/spec/mongo/operation/delete/op_msg_spec.rb +13 -4
  199. data/spec/mongo/operation/delete_spec.rb +0 -30
  200. data/spec/mongo/operation/insert/op_msg_spec.rb +18 -10
  201. data/spec/mongo/operation/insert_spec.rb +0 -32
  202. data/spec/mongo/operation/result_spec.rb +20 -0
  203. data/spec/mongo/operation/update/op_msg_spec.rb +13 -4
  204. data/spec/mongo/operation/update_spec.rb +0 -29
  205. data/spec/mongo/protocol/caching_hash_spec.rb +82 -0
  206. data/spec/mongo/protocol/msg_spec.rb +41 -0
  207. data/spec/mongo/query_cache_spec.rb +1 -0
  208. data/spec/mongo/retryable_spec.rb +32 -3
  209. data/spec/mongo/server/connection_auth_spec.rb +3 -1
  210. data/spec/mongo/server/connection_common_spec.rb +13 -1
  211. data/spec/mongo/server/connection_pool_spec.rb +94 -49
  212. data/spec/mongo/server/connection_spec.rb +50 -159
  213. data/spec/mongo/server/description/features_spec.rb +24 -0
  214. data/spec/mongo/server/push_monitor_spec.rb +2 -8
  215. data/spec/mongo/session_spec.rb +26 -6
  216. data/spec/mongo/session_transaction_spec.rb +2 -1
  217. data/spec/mongo/socket/ssl_spec.rb +15 -4
  218. data/spec/mongo/uri/srv_protocol_spec.rb +101 -2
  219. data/spec/mongo/uri_spec.rb +25 -0
  220. data/spec/runners/connection_string.rb +8 -0
  221. data/spec/runners/crud/operation.rb +12 -3
  222. data/spec/runners/crud/requirement.rb +3 -3
  223. data/spec/runners/crud/spec.rb +5 -0
  224. data/spec/runners/crud/verifier.rb +6 -0
  225. data/spec/runners/transactions/test.rb +33 -14
  226. data/spec/runners/transactions.rb +9 -6
  227. data/spec/runners/unified/assertions.rb +59 -10
  228. data/spec/runners/unified/change_stream_operations.rb +9 -0
  229. data/spec/runners/unified/crud_operations.rb +50 -2
  230. data/spec/runners/unified/ddl_operations.rb +20 -0
  231. data/spec/runners/unified/error.rb +2 -1
  232. data/spec/runners/unified/support_operations.rb +5 -2
  233. data/spec/runners/unified/test.rb +19 -4
  234. data/spec/runners/unified.rb +9 -2
  235. data/spec/shared/lib/mrss/constraints.rb +10 -17
  236. data/spec/shared/lib/mrss/docker_runner.rb +21 -3
  237. data/spec/shared/lib/mrss/lite_constraints.rb +32 -1
  238. data/spec/shared/lib/mrss/session_registry.rb +69 -0
  239. data/spec/shared/lib/mrss/session_registry_legacy.rb +60 -0
  240. data/spec/shared/share/Dockerfile.erb +56 -54
  241. data/spec/shared/shlib/config.sh +27 -0
  242. data/spec/shared/shlib/distro.sh +2 -1
  243. data/spec/shared/shlib/server.sh +46 -21
  244. data/spec/shared/shlib/set_env.sh +40 -5
  245. data/spec/spec_helper.rb +0 -1
  246. data/spec/spec_tests/crud_spec.rb +0 -10
  247. data/spec/spec_tests/data/change_streams_unified/change-streams-errors.yml +124 -0
  248. data/spec/spec_tests/data/change_streams_unified/change-streams-pre_and_post_images.yml +351 -0
  249. data/spec/spec_tests/data/change_streams_unified/change-streams-resume-allowlist.yml +1171 -0
  250. data/spec/spec_tests/data/change_streams_unified/change-streams-resume-errorLabels.yml +1068 -0
  251. data/spec/spec_tests/data/change_streams_unified/change-streams.yml +859 -4
  252. data/spec/spec_tests/data/client_side_encryption/aggregate.yml +3 -17
  253. data/spec/spec_tests/data/client_side_encryption/azureKMS.yml +46 -0
  254. data/spec/spec_tests/data/client_side_encryption/badQueries.yml +12 -2
  255. data/spec/spec_tests/data/client_side_encryption/basic.yml +3 -17
  256. data/spec/spec_tests/data/client_side_encryption/bulk.yml +1 -8
  257. data/spec/spec_tests/data/client_side_encryption/bypassAutoEncryption.yml +2 -2
  258. data/spec/spec_tests/data/client_side_encryption/count.yml +1 -8
  259. data/spec/spec_tests/data/client_side_encryption/countDocuments.yml +1 -8
  260. data/spec/spec_tests/data/client_side_encryption/delete.yml +2 -16
  261. data/spec/spec_tests/data/client_side_encryption/distinct.yml +1 -8
  262. data/spec/spec_tests/data/client_side_encryption/explain.yml +1 -8
  263. data/spec/spec_tests/data/client_side_encryption/find.yml +2 -16
  264. data/spec/spec_tests/data/client_side_encryption/findOneAndDelete.yml +1 -8
  265. data/spec/spec_tests/data/client_side_encryption/findOneAndReplace.yml +1 -8
  266. data/spec/spec_tests/data/client_side_encryption/findOneAndUpdate.yml +1 -8
  267. data/spec/spec_tests/data/client_side_encryption/fle2-BypassQueryAnalysis.yml +101 -0
  268. data/spec/spec_tests/data/client_side_encryption/fle2-Compact.yml +80 -0
  269. data/spec/spec_tests/data/client_side_encryption/fle2-CreateCollection.yml +1263 -0
  270. data/spec/spec_tests/data/client_side_encryption/fle2-DecryptExistingData.yml +64 -0
  271. data/spec/spec_tests/data/client_side_encryption/fle2-Delete.yml +107 -0
  272. data/spec/spec_tests/data/client_side_encryption/fle2-EncryptedFields-vs-EncryptedFieldsMap.yml +80 -0
  273. data/spec/spec_tests/data/client_side_encryption/fle2-EncryptedFields-vs-jsonSchema.yml +90 -0
  274. data/spec/spec_tests/data/client_side_encryption/fle2-EncryptedFieldsMap-defaults.yml +57 -0
  275. data/spec/spec_tests/data/client_side_encryption/fle2-FindOneAndUpdate.yml +213 -0
  276. data/spec/spec_tests/data/client_side_encryption/fle2-InsertFind-Indexed.yml +86 -0
  277. data/spec/spec_tests/data/client_side_encryption/fle2-InsertFind-Unindexed.yml +83 -0
  278. data/spec/spec_tests/data/client_side_encryption/fle2-MissingKey.yml +41 -0
  279. data/spec/spec_tests/data/client_side_encryption/fle2-NoEncryption.yml +42 -0
  280. data/spec/spec_tests/data/client_side_encryption/fle2-Update.yml +221 -0
  281. data/spec/spec_tests/data/client_side_encryption/fle2-validatorAndPartialFieldExpression.yml +168 -0
  282. data/spec/spec_tests/data/client_side_encryption/gcpKMS.yml +46 -0
  283. data/spec/spec_tests/data/client_side_encryption/getMore.yml +1 -8
  284. data/spec/spec_tests/data/client_side_encryption/insert.yml +2 -16
  285. data/spec/spec_tests/data/client_side_encryption/keyAltName.yml +1 -8
  286. data/spec/spec_tests/data/client_side_encryption/localKMS.yml +1 -8
  287. data/spec/spec_tests/data/client_side_encryption/localSchema.yml +1 -8
  288. data/spec/spec_tests/data/client_side_encryption/maxWireVersion.yml +2 -0
  289. data/spec/spec_tests/data/client_side_encryption/missingKey.yml +2 -9
  290. data/spec/spec_tests/data/client_side_encryption/noSchema.yml +39 -0
  291. data/spec/spec_tests/data/client_side_encryption/replaceOne.yml +1 -8
  292. data/spec/spec_tests/data/client_side_encryption/types.yml +44 -70
  293. data/spec/spec_tests/data/client_side_encryption/updateMany.yml +1 -8
  294. data/spec/spec_tests/data/client_side_encryption/updateOne.yml +1 -8
  295. data/spec/spec_tests/data/collection_management/clustered-indexes.yml +135 -0
  296. data/spec/spec_tests/data/collection_management/createCollection-pre_and_post_images.yml +50 -0
  297. data/spec/spec_tests/data/collection_management/modifyCollection-pre_and_post_images.yml +58 -0
  298. data/spec/spec_tests/data/command_monitoring_unified/pre-42-server-connection-id.yml +56 -0
  299. data/spec/spec_tests/data/command_monitoring_unified/server-connection-id.yml +56 -0
  300. data/spec/spec_tests/data/crud/read/aggregate-collation.yml +1 -1
  301. data/spec/spec_tests/data/crud/read/count-collation.yml +1 -1
  302. data/spec/spec_tests/data/crud/read/distinct-collation.yml +1 -1
  303. data/spec/spec_tests/data/crud/read/find-collation.yml +1 -1
  304. data/spec/spec_tests/data/crud/write/bulkWrite-collation.yml +1 -1
  305. data/spec/spec_tests/data/crud/write/deleteMany-collation.yml +1 -1
  306. data/spec/spec_tests/data/crud/write/deleteOne-collation.yml +1 -1
  307. data/spec/spec_tests/data/crud/write/findOneAndDelete-collation.yml +1 -1
  308. data/spec/spec_tests/data/crud/write/findOneAndReplace-collation.yml +1 -1
  309. data/spec/spec_tests/data/crud/write/findOneAndUpdate-collation.yml +1 -1
  310. data/spec/spec_tests/data/crud/write/replaceOne-collation.yml +1 -1
  311. data/spec/spec_tests/data/crud/write/updateMany-collation.yml +1 -1
  312. data/spec/spec_tests/data/crud/write/updateOne-collation.yml +1 -1
  313. data/spec/spec_tests/data/crud_unified/aggregate-allowdiskuse.yml +75 -0
  314. data/spec/spec_tests/data/crud_unified/aggregate-merge.yml +185 -0
  315. data/spec/spec_tests/data/crud_unified/aggregate-out-readConcern.yml +171 -0
  316. data/spec/spec_tests/data/crud_unified/aggregate.yml +215 -0
  317. data/spec/spec_tests/data/crud_unified/bulkWrite-arrayFilters-clientError.yml +98 -0
  318. data/spec/spec_tests/data/crud_unified/bulkWrite-arrayFilters.yml +174 -0
  319. data/spec/spec_tests/data/crud_unified/bulkWrite-comment.yml +189 -0
  320. data/spec/spec_tests/data/crud_unified/bulkWrite-delete-hint-clientError.yml +113 -0
  321. data/spec/spec_tests/data/crud_unified/bulkWrite-delete-hint-serverError.yml +142 -0
  322. data/spec/spec_tests/data/crud_unified/bulkWrite-delete-hint.yml +154 -0
  323. data/spec/spec_tests/data/crud_unified/bulkWrite-deleteMany-hint-unacknowledged.yml +98 -0
  324. data/spec/spec_tests/data/crud_unified/bulkWrite-deleteMany-let.yml +86 -0
  325. data/spec/spec_tests/data/crud_unified/bulkWrite-deleteOne-hint-unacknowledged.yml +97 -0
  326. data/spec/spec_tests/data/crud_unified/bulkWrite-deleteOne-let.yml +86 -0
  327. data/spec/spec_tests/data/crud_unified/bulkWrite-insertOne-dots_and_dollars.yml +138 -0
  328. data/spec/spec_tests/data/crud_unified/bulkWrite-replaceOne-dots_and_dollars.yml +165 -0
  329. data/spec/spec_tests/data/crud_unified/bulkWrite-replaceOne-hint-unacknowledged.yml +103 -0
  330. data/spec/spec_tests/data/crud_unified/bulkWrite-replaceOne-let.yml +93 -0
  331. data/spec/spec_tests/data/crud_unified/bulkWrite-update-hint-clientError.yml +148 -0
  332. data/spec/spec_tests/data/crud_unified/bulkWrite-update-hint-serverError.yml +239 -0
  333. data/spec/spec_tests/data/crud_unified/bulkWrite-update-hint.yml +256 -0
  334. data/spec/spec_tests/data/crud_unified/bulkWrite-update-validation.yml +73 -0
  335. data/spec/spec_tests/data/crud_unified/bulkWrite-updateMany-dots_and_dollars.yml +150 -0
  336. data/spec/spec_tests/data/crud_unified/bulkWrite-updateMany-hint-unacknowledged.yml +104 -0
  337. data/spec/spec_tests/data/crud_unified/bulkWrite-updateMany-let.yml +96 -0
  338. data/spec/spec_tests/data/crud_unified/bulkWrite-updateOne-dots_and_dollars.yml +150 -0
  339. data/spec/spec_tests/data/crud_unified/bulkWrite-updateOne-hint-unacknowledged.yml +103 -0
  340. data/spec/spec_tests/data/crud_unified/bulkWrite-updateOne-let.yml +95 -0
  341. data/spec/spec_tests/data/crud_unified/countDocuments-comment.yml +92 -0
  342. data/spec/spec_tests/data/crud_unified/db-aggregate.yml +73 -0
  343. data/spec/spec_tests/data/crud_unified/deleteMany-comment.yml +97 -0
  344. data/spec/spec_tests/data/crud_unified/deleteMany-hint-clientError.yml +87 -0
  345. data/spec/spec_tests/data/crud_unified/deleteMany-hint-serverError.yml +107 -0
  346. data/spec/spec_tests/data/crud_unified/deleteMany-hint-unacknowledged.yml +90 -0
  347. data/spec/spec_tests/data/crud_unified/deleteMany-hint.yml +99 -0
  348. data/spec/spec_tests/data/crud_unified/deleteMany-let.yml +2 -0
  349. data/spec/spec_tests/data/crud_unified/deleteOne-comment.yml +98 -0
  350. data/spec/spec_tests/data/crud_unified/deleteOne-hint-clientError.yml +80 -0
  351. data/spec/spec_tests/data/crud_unified/deleteOne-hint-serverError.yml +100 -0
  352. data/spec/spec_tests/data/crud_unified/deleteOne-hint-unacknowledged.yml +89 -0
  353. data/spec/spec_tests/data/crud_unified/deleteOne-hint.yml +95 -0
  354. data/spec/spec_tests/data/crud_unified/deleteOne-let.yml +2 -0
  355. data/spec/spec_tests/data/crud_unified/estimatedDocumentCount-comment.yml +95 -0
  356. data/spec/spec_tests/data/crud_unified/estimatedDocumentCount.yml +5 -135
  357. data/spec/spec_tests/data/crud_unified/find-allowdiskuse-clientError.yml +55 -0
  358. data/spec/spec_tests/data/crud_unified/find-allowdiskuse-serverError.yml +68 -0
  359. data/spec/spec_tests/data/crud_unified/find-allowdiskuse.yml +79 -0
  360. data/spec/spec_tests/data/crud_unified/find-comment.yml +166 -0
  361. data/spec/spec_tests/data/crud_unified/find.yml +68 -0
  362. data/spec/spec_tests/data/crud_unified/findOneAndDelete-comment.yml +96 -0
  363. data/spec/spec_tests/data/crud_unified/findOneAndDelete-hint-clientError.yml +91 -0
  364. data/spec/spec_tests/data/crud_unified/findOneAndDelete-hint-serverError.yml +107 -0
  365. data/spec/spec_tests/data/crud_unified/findOneAndDelete-hint-unacknowledged.yml +88 -0
  366. data/spec/spec_tests/data/crud_unified/findOneAndDelete-hint.yml +102 -0
  367. data/spec/spec_tests/data/crud_unified/findOneAndDelete-let.yml +2 -4
  368. data/spec/spec_tests/data/crud_unified/findOneAndReplace-comment.yml +101 -0
  369. data/spec/spec_tests/data/crud_unified/findOneAndReplace-dots_and_dollars.yml +140 -0
  370. data/spec/spec_tests/data/crud_unified/findOneAndReplace-hint-clientError.yml +83 -0
  371. data/spec/spec_tests/data/crud_unified/findOneAndReplace-hint-serverError.yml +99 -0
  372. data/spec/spec_tests/data/crud_unified/findOneAndReplace-hint-unacknowledged.yml +96 -0
  373. data/spec/spec_tests/data/crud_unified/findOneAndReplace-hint.yml +98 -0
  374. data/spec/spec_tests/data/crud_unified/findOneAndUpdate-comment.yml +95 -0
  375. data/spec/spec_tests/data/crud_unified/findOneAndUpdate-dots_and_dollars.yml +127 -0
  376. data/spec/spec_tests/data/crud_unified/findOneAndUpdate-hint-clientError.yml +84 -0
  377. data/spec/spec_tests/data/crud_unified/findOneAndUpdate-hint-serverError.yml +100 -0
  378. data/spec/spec_tests/data/crud_unified/findOneAndUpdate-hint-unacknowledged.yml +92 -0
  379. data/spec/spec_tests/data/crud_unified/findOneAndUpdate-hint.yml +99 -0
  380. data/spec/spec_tests/data/crud_unified/insertMany-comment.yml +93 -0
  381. data/spec/spec_tests/data/crud_unified/insertMany-dots_and_dollars.yml +128 -0
  382. data/spec/spec_tests/data/crud_unified/insertOne-comment.yml +91 -0
  383. data/spec/spec_tests/data/crud_unified/insertOne-dots_and_dollars.yml +238 -0
  384. data/spec/spec_tests/data/crud_unified/replaceOne-comment.yml +105 -0
  385. data/spec/spec_tests/data/crud_unified/replaceOne-dots_and_dollars.yml +180 -0
  386. data/spec/spec_tests/data/crud_unified/replaceOne-hint-unacknowledged.yml +95 -0
  387. data/spec/spec_tests/data/crud_unified/replaceOne-hint.yml +108 -0
  388. data/spec/spec_tests/data/crud_unified/replaceOne-let.yml +98 -0
  389. data/spec/spec_tests/data/crud_unified/replaceOne-validation.yml +37 -0
  390. data/spec/spec_tests/data/crud_unified/updateMany-comment.yml +104 -0
  391. data/spec/spec_tests/data/crud_unified/updateMany-dots_and_dollars.yml +138 -0
  392. data/spec/spec_tests/data/crud_unified/updateMany-hint-clientError.yml +91 -0
  393. data/spec/spec_tests/data/crud_unified/updateMany-hint-serverError.yml +115 -0
  394. data/spec/spec_tests/data/crud_unified/updateMany-hint-unacknowledged.yml +96 -0
  395. data/spec/spec_tests/data/crud_unified/updateMany-hint.yml +115 -0
  396. data/spec/spec_tests/data/crud_unified/updateMany-let.yml +5 -1
  397. data/spec/spec_tests/data/crud_unified/updateMany-validation.yml +39 -0
  398. data/spec/spec_tests/data/crud_unified/updateOne-comment.yml +104 -0
  399. data/spec/spec_tests/data/crud_unified/updateOne-dots_and_dollars.yml +138 -0
  400. data/spec/spec_tests/data/crud_unified/updateOne-hint-clientError.yml +85 -0
  401. data/spec/spec_tests/data/crud_unified/updateOne-hint-serverError.yml +109 -0
  402. data/spec/spec_tests/data/crud_unified/updateOne-hint-unacknowledged.yml +95 -0
  403. data/spec/spec_tests/data/crud_unified/updateOne-hint.yml +109 -0
  404. data/spec/spec_tests/data/crud_unified/updateOne-let.yml +5 -1
  405. data/spec/spec_tests/data/crud_unified/updateOne-validation.yml +37 -0
  406. data/spec/spec_tests/data/crud_unified/updateWithPipelines.yml +8 -14
  407. data/spec/spec_tests/data/retryable_reads/{estimatedDocumentCount-serverErrors-pre4.9.yml → legacy/estimatedDocumentCount-serverErrors.yml} +0 -2
  408. data/spec/spec_tests/data/retryable_reads/{estimatedDocumentCount-pre4.9.yml → legacy/estimatedDocumentCount.yml} +0 -2
  409. data/spec/spec_tests/data/retryable_reads/unified/handshakeError.yml +129 -0
  410. data/spec/spec_tests/data/retryable_writes/{bulkWrite-serverErrors.yml → legacy/bulkWrite-serverErrors.yml} +1 -1
  411. data/spec/spec_tests/data/retryable_writes/{deleteOne-serverErrors.yml → legacy/deleteOne-serverErrors.yml} +1 -1
  412. data/spec/spec_tests/data/retryable_writes/{findOneAndDelete-serverErrors.yml → legacy/findOneAndDelete-serverErrors.yml} +1 -1
  413. data/spec/spec_tests/data/retryable_writes/{findOneAndReplace-serverErrors.yml → legacy/findOneAndReplace-serverErrors.yml} +1 -1
  414. data/spec/spec_tests/data/retryable_writes/{findOneAndUpdate-serverErrors.yml → legacy/findOneAndUpdate-serverErrors.yml} +1 -1
  415. data/spec/spec_tests/data/retryable_writes/{insertMany-serverErrors.yml → legacy/insertMany-serverErrors.yml} +1 -1
  416. data/spec/spec_tests/data/retryable_writes/{insertOne-serverErrors.yml → legacy/insertOne-serverErrors.yml} +5 -5
  417. data/spec/spec_tests/data/retryable_writes/{replaceOne-serverErrors.yml → legacy/replaceOne-serverErrors.yml} +1 -1
  418. data/spec/spec_tests/data/retryable_writes/{updateOne-serverErrors.yml → legacy/updateOne-serverErrors.yml} +1 -1
  419. data/spec/spec_tests/data/retryable_writes/unified/bulkWrite-serverErrors.yml +96 -0
  420. data/spec/spec_tests/data/retryable_writes/unified/handshakeError.yml +137 -0
  421. data/spec/spec_tests/data/retryable_writes/unified/insertOne-serverErrors.yml +78 -0
  422. data/spec/spec_tests/data/sdam/errors/prefer-error-code.yml +2 -2
  423. data/spec/spec_tests/data/seed_list_discovery/load-balanced/loadBalanced-no-results.yml +5 -0
  424. data/spec/spec_tests/data/seed_list_discovery/load-balanced/srvMaxHosts-conflicts_with_loadBalanced-true-txt.yml +5 -0
  425. data/spec/spec_tests/data/seed_list_discovery/load-balanced/srvMaxHosts-conflicts_with_loadBalanced-true.yml +5 -0
  426. data/spec/spec_tests/data/seed_list_discovery/load-balanced/srvMaxHosts-zero-txt.yml +10 -0
  427. data/spec/spec_tests/data/seed_list_discovery/load-balanced/srvMaxHosts-zero.yml +10 -0
  428. data/spec/spec_tests/data/seed_list_discovery/replica-set/srv-service-name.yml +11 -0
  429. data/spec/spec_tests/data/seed_list_discovery/replica-set/srvMaxHosts-conflicts_with_replicaSet-txt.yml +5 -0
  430. data/spec/spec_tests/data/seed_list_discovery/replica-set/srvMaxHosts-conflicts_with_replicaSet.yml +5 -0
  431. data/spec/spec_tests/data/seed_list_discovery/replica-set/srvMaxHosts-equal_to_srv_records.yml +16 -0
  432. data/spec/spec_tests/data/seed_list_discovery/replica-set/srvMaxHosts-greater_than_srv_records.yml +15 -0
  433. data/spec/spec_tests/data/seed_list_discovery/replica-set/srvMaxHosts-less_than_srv_records.yml +15 -0
  434. data/spec/spec_tests/data/seed_list_discovery/replica-set/srvMaxHosts-zero-txt.yml +15 -0
  435. data/spec/spec_tests/data/seed_list_discovery/replica-set/srvMaxHosts-zero.yml +15 -0
  436. data/spec/spec_tests/data/seed_list_discovery/sharded/srvMaxHosts-equal_to_srv_records.yml +13 -0
  437. data/spec/spec_tests/data/seed_list_discovery/sharded/srvMaxHosts-greater_than_srv_records.yml +12 -0
  438. data/spec/spec_tests/data/seed_list_discovery/sharded/srvMaxHosts-less_than_srv_records.yml +10 -0
  439. data/spec/spec_tests/data/seed_list_discovery/sharded/srvMaxHosts-zero.yml +11 -0
  440. data/spec/spec_tests/data/server_selection/Unknown/read/ghost.yml +11 -0
  441. data/spec/spec_tests/data/server_selection/Unknown/write/ghost.yml +11 -0
  442. data/spec/spec_tests/data/sessions_unified/driver-sessions-server-support.yml +123 -0
  443. data/spec/spec_tests/data/sessions_unified/snapshot-sessions-not-supported-client-error.yml +9 -3
  444. data/spec/spec_tests/data/transactions/error-labels.yml +1 -1
  445. data/spec/spec_tests/data/transactions/errors-client.yml +8 -9
  446. data/spec/spec_tests/data/transactions/mongos-recovery-token.yml +1 -1
  447. data/spec/spec_tests/data/transactions/retryable-abort-errorLabels.yml +0 -2
  448. data/spec/spec_tests/data/transactions/retryable-abort.yml +7 -9
  449. data/spec/spec_tests/data/transactions/retryable-commit-errorLabels.yml +0 -2
  450. data/spec/spec_tests/data/transactions/retryable-commit.yml +7 -9
  451. data/spec/spec_tests/data/transactions/retryable-writes.yml +0 -2
  452. data/spec/spec_tests/data/unified/invalid/expectedEventsForClient-ignoreExtraEvents-type.yml +15 -0
  453. data/spec/spec_tests/data/unified/valid-fail/operation-unsupported.yml +13 -0
  454. data/spec/spec_tests/data/unified/valid-pass/expectedEventsForClient-ignoreExtraEvents.yml +78 -0
  455. data/spec/spec_tests/data/unified/valid-pass/poc-change-streams.yml +4 -1
  456. data/spec/spec_tests/data/unified/valid-pass/poc-command-monitoring.yml +3 -3
  457. data/spec/spec_tests/data/unified/valid-pass/poc-transactions.yml +3 -2
  458. data/spec/spec_tests/data/uri_options/srv-options.yml +96 -0
  459. data/spec/spec_tests/data/versioned_api/crud-api-version-1-strict.yml +6 -4
  460. data/spec/spec_tests/data/versioned_api/crud-api-version-1.yml +7 -5
  461. data/spec/spec_tests/retryable_reads_spec.rb +4 -1
  462. data/spec/spec_tests/retryable_reads_unified_spec.rb +22 -0
  463. data/spec/spec_tests/retryable_writes_spec.rb +4 -1
  464. data/spec/spec_tests/retryable_writes_unified_spec.rb +21 -0
  465. data/spec/spec_tests/seed_list_discovery_spec.rb +10 -1
  466. data/spec/spec_tests/unified_spec.rb +6 -1
  467. data/spec/stress/connection_pool_timing_spec.rb +2 -1
  468. data/spec/stress/fork_reconnect_stress_spec.rb +3 -2
  469. data/spec/support/authorization.rb +1 -1
  470. data/spec/support/certificates/atlas-ocsp-ca.crt +47 -40
  471. data/spec/support/certificates/atlas-ocsp.crt +106 -101
  472. data/spec/support/cluster_tools.rb +1 -1
  473. data/spec/support/common_shortcuts.rb +22 -0
  474. data/spec/support/crypt/corpus/corpus-encrypted.json +9515 -0
  475. data/spec/support/crypt/corpus/corpus-key-aws.json +32 -32
  476. data/spec/support/crypt/corpus/corpus-key-azure.json +33 -0
  477. data/spec/support/crypt/corpus/corpus-key-gcp.json +35 -0
  478. data/spec/support/crypt/corpus/corpus-key-kmip.json +32 -0
  479. data/spec/support/crypt/corpus/corpus-key-local.json +30 -30
  480. data/spec/support/crypt/corpus/corpus-schema.json +4399 -121
  481. data/spec/support/crypt/corpus/corpus.json +4999 -37
  482. data/spec/support/crypt/data_keys/key_document_azure.json +33 -0
  483. data/spec/support/crypt/data_keys/key_document_gcp.json +37 -0
  484. data/spec/support/crypt/data_keys/key_document_kmip.json +32 -0
  485. data/spec/support/crypt/encryptedFields.json +33 -0
  486. data/spec/support/crypt/keys/key1-document.json +30 -0
  487. data/spec/support/crypt/schema_maps/schema_map_azure.json +17 -0
  488. data/spec/support/crypt/schema_maps/schema_map_azure_key_alt_names.json +12 -0
  489. data/spec/support/crypt/schema_maps/schema_map_gcp.json +17 -0
  490. data/spec/support/crypt/schema_maps/schema_map_gcp_key_alt_names.json +12 -0
  491. data/spec/support/crypt/schema_maps/schema_map_kmip.json +17 -0
  492. data/spec/support/crypt/schema_maps/schema_map_kmip_key_alt_names.json +12 -0
  493. data/spec/support/crypt.rb +207 -6
  494. data/spec/support/macros.rb +18 -0
  495. data/spec/support/mongos_macros.rb +17 -0
  496. data/spec/support/shared/scram_conversation.rb +2 -1
  497. data/spec/support/shared/session.rb +13 -7
  498. data/spec/support/spec_config.rb +82 -1
  499. data/spec/support/utils.rb +25 -4
  500. data.tar.gz.sig +0 -0
  501. metadata +1499 -1252
  502. metadata.gz.sig +0 -0
  503. data/lib/mongo/operation/delete/legacy.rb +0 -64
  504. data/lib/mongo/operation/insert/legacy.rb +0 -68
  505. data/lib/mongo/operation/update/legacy/result.rb +0 -112
  506. data/lib/mongo/operation/update/legacy.rb +0 -76
  507. data/spec/integration/find_options_spec.rb +0 -227
  508. data/spec/mongo/dbref_spec.rb +0 -152
  509. data/spec/mongo/operation/kill_cursors_spec.rb +0 -47
  510. data/spec/spec_tests/change_streams_spec.rb +0 -93
  511. data/spec/spec_tests/data/change_streams/change-streams-errors.yml +0 -101
  512. data/spec/spec_tests/data/change_streams/change-streams-resume-allowlist.yml +0 -1173
  513. data/spec/spec_tests/data/change_streams/change-streams-resume-errorLabels.yml +0 -1105
  514. data/spec/spec_tests/data/change_streams/change-streams.yml +0 -535
  515. data/spec/spec_tests/data/crud_v2/aggregate-merge.yml +0 -103
  516. data/spec/spec_tests/data/crud_v2/aggregate-out-readConcern.yml +0 -111
  517. data/spec/spec_tests/data/crud_v2/bulkWrite-arrayFilters.yml +0 -103
  518. data/spec/spec_tests/data/crud_v2/bulkWrite-delete-hint-clientError.yml +0 -63
  519. data/spec/spec_tests/data/crud_v2/bulkWrite-delete-hint-serverError.yml +0 -92
  520. data/spec/spec_tests/data/crud_v2/bulkWrite-delete-hint.yml +0 -103
  521. data/spec/spec_tests/data/crud_v2/bulkWrite-update-hint-clientError.yml +0 -90
  522. data/spec/spec_tests/data/crud_v2/bulkWrite-update-hint-serverError.yml +0 -147
  523. data/spec/spec_tests/data/crud_v2/bulkWrite-update-hint.yml +0 -164
  524. data/spec/spec_tests/data/crud_v2/db-aggregate.yml +0 -39
  525. data/spec/spec_tests/data/crud_v2/deleteMany-hint-clientError.yml +0 -43
  526. data/spec/spec_tests/data/crud_v2/deleteMany-hint-serverError.yml +0 -62
  527. data/spec/spec_tests/data/crud_v2/deleteMany-hint.yml +0 -58
  528. data/spec/spec_tests/data/crud_v2/deleteOne-hint-clientError.yml +0 -41
  529. data/spec/spec_tests/data/crud_v2/deleteOne-hint-serverError.yml +0 -60
  530. data/spec/spec_tests/data/crud_v2/deleteOne-hint.yml +0 -57
  531. data/spec/spec_tests/data/crud_v2/find-allowdiskuse-clientError.yml +0 -28
  532. data/spec/spec_tests/data/crud_v2/find-allowdiskuse-serverError.yml +0 -44
  533. data/spec/spec_tests/data/crud_v2/find-allowdiskuse.yml +0 -50
  534. data/spec/spec_tests/data/crud_v2/findOneAndDelete-hint-clientError.yml +0 -45
  535. data/spec/spec_tests/data/crud_v2/findOneAndDelete-hint-serverError.yml +0 -60
  536. data/spec/spec_tests/data/crud_v2/findOneAndDelete-hint.yml +0 -56
  537. data/spec/spec_tests/data/crud_v2/findOneAndReplace-hint-clientError.yml +0 -40
  538. data/spec/spec_tests/data/crud_v2/findOneAndReplace-hint-serverError.yml +0 -59
  539. data/spec/spec_tests/data/crud_v2/findOneAndReplace-hint.yml +0 -55
  540. data/spec/spec_tests/data/crud_v2/findOneAndUpdate-hint-clientError.yml +0 -40
  541. data/spec/spec_tests/data/crud_v2/findOneAndUpdate-hint-serverError.yml +0 -58
  542. data/spec/spec_tests/data/crud_v2/findOneAndUpdate-hint.yml +0 -55
  543. data/spec/spec_tests/data/crud_v2/replaceOne-hint.yml +0 -61
  544. data/spec/spec_tests/data/crud_v2/unacknowledged-bulkWrite-delete-hint-clientError.yml +0 -60
  545. data/spec/spec_tests/data/crud_v2/unacknowledged-bulkWrite-update-hint-clientError.yml +0 -88
  546. data/spec/spec_tests/data/crud_v2/unacknowledged-deleteMany-hint-clientError.yml +0 -40
  547. data/spec/spec_tests/data/crud_v2/unacknowledged-deleteOne-hint-clientError.yml +0 -38
  548. data/spec/spec_tests/data/crud_v2/unacknowledged-findOneAndDelete-hint-clientError.yml +0 -42
  549. data/spec/spec_tests/data/crud_v2/unacknowledged-findOneAndReplace-hint-clientError.yml +0 -40
  550. data/spec/spec_tests/data/crud_v2/unacknowledged-findOneAndUpdate-hint-clientError.yml +0 -40
  551. data/spec/spec_tests/data/crud_v2/unacknowledged-replaceOne-hint-clientError.yml +0 -40
  552. data/spec/spec_tests/data/crud_v2/unacknowledged-updateMany-hint-clientError.yml +0 -43
  553. data/spec/spec_tests/data/crud_v2/unacknowledged-updateOne-hint-clientError.yml +0 -40
  554. data/spec/spec_tests/data/crud_v2/updateMany-hint-clientError.yml +0 -45
  555. data/spec/spec_tests/data/crud_v2/updateMany-hint-serverError.yml +0 -66
  556. data/spec/spec_tests/data/crud_v2/updateMany-hint.yml +0 -65
  557. data/spec/spec_tests/data/crud_v2/updateOne-hint-clientError.yml +0 -43
  558. data/spec/spec_tests/data/crud_v2/updateOne-hint-serverError.yml +0 -62
  559. data/spec/spec_tests/data/crud_v2/updateOne-hint.yml +0 -61
  560. data/spec/spec_tests/data/crud_v2/updateWithPipelines.yml +0 -157
  561. data/spec/spec_tests/data/retryable_reads/estimatedDocumentCount-4.9.yml +0 -60
  562. data/spec/spec_tests/data/retryable_reads/estimatedDocumentCount-serverErrors-4.9.yml +0 -146
  563. data/spec/support/crypt/corpus/corpus_encrypted.json +0 -4152
  564. data/spec/support/session_registry.rb +0 -55
  565. /data/spec/spec_tests/data/retryable_reads/{aggregate-merge.yml → legacy/aggregate-merge.yml} +0 -0
  566. /data/spec/spec_tests/data/retryable_reads/{aggregate-serverErrors.yml → legacy/aggregate-serverErrors.yml} +0 -0
  567. /data/spec/spec_tests/data/retryable_reads/{aggregate.yml → legacy/aggregate.yml} +0 -0
  568. /data/spec/spec_tests/data/retryable_reads/{changeStreams-client.watch-serverErrors.yml → legacy/changeStreams-client.watch-serverErrors.yml} +0 -0
  569. /data/spec/spec_tests/data/retryable_reads/{changeStreams-client.watch.yml → legacy/changeStreams-client.watch.yml} +0 -0
  570. /data/spec/spec_tests/data/retryable_reads/{changeStreams-db.coll.watch-serverErrors.yml → legacy/changeStreams-db.coll.watch-serverErrors.yml} +0 -0
  571. /data/spec/spec_tests/data/retryable_reads/{changeStreams-db.coll.watch.yml → legacy/changeStreams-db.coll.watch.yml} +0 -0
  572. /data/spec/spec_tests/data/retryable_reads/{changeStreams-db.watch-serverErrors.yml → legacy/changeStreams-db.watch-serverErrors.yml} +0 -0
  573. /data/spec/spec_tests/data/retryable_reads/{changeStreams-db.watch.yml → legacy/changeStreams-db.watch.yml} +0 -0
  574. /data/spec/spec_tests/data/retryable_reads/{count-serverErrors.yml → legacy/count-serverErrors.yml} +0 -0
  575. /data/spec/spec_tests/data/retryable_reads/{count.yml → legacy/count.yml} +0 -0
  576. /data/spec/spec_tests/data/retryable_reads/{countDocuments-serverErrors.yml → legacy/countDocuments-serverErrors.yml} +0 -0
  577. /data/spec/spec_tests/data/retryable_reads/{countDocuments.yml → legacy/countDocuments.yml} +0 -0
  578. /data/spec/spec_tests/data/retryable_reads/{distinct-serverErrors.yml → legacy/distinct-serverErrors.yml} +0 -0
  579. /data/spec/spec_tests/data/retryable_reads/{distinct.yml → legacy/distinct.yml} +0 -0
  580. /data/spec/spec_tests/data/retryable_reads/{find-serverErrors.yml → legacy/find-serverErrors.yml} +0 -0
  581. /data/spec/spec_tests/data/retryable_reads/{find.yml → legacy/find.yml} +0 -0
  582. /data/spec/spec_tests/data/retryable_reads/{findOne-serverErrors.yml → legacy/findOne-serverErrors.yml} +0 -0
  583. /data/spec/spec_tests/data/retryable_reads/{findOne.yml → legacy/findOne.yml} +0 -0
  584. /data/spec/spec_tests/data/retryable_reads/{gridfs-download-serverErrors.yml → legacy/gridfs-download-serverErrors.yml} +0 -0
  585. /data/spec/spec_tests/data/retryable_reads/{gridfs-download.yml → legacy/gridfs-download.yml} +0 -0
  586. /data/spec/spec_tests/data/retryable_reads/{gridfs-downloadByName-serverErrors.yml → legacy/gridfs-downloadByName-serverErrors.yml} +0 -0
  587. /data/spec/spec_tests/data/retryable_reads/{gridfs-downloadByName.yml → legacy/gridfs-downloadByName.yml} +0 -0
  588. /data/spec/spec_tests/data/retryable_reads/{listCollectionNames-serverErrors.yml → legacy/listCollectionNames-serverErrors.yml} +0 -0
  589. /data/spec/spec_tests/data/retryable_reads/{listCollectionNames.yml → legacy/listCollectionNames.yml} +0 -0
  590. /data/spec/spec_tests/data/retryable_reads/{listCollectionObjects-serverErrors.yml → legacy/listCollectionObjects-serverErrors.yml} +0 -0
  591. /data/spec/spec_tests/data/retryable_reads/{listCollectionObjects.yml → legacy/listCollectionObjects.yml} +0 -0
  592. /data/spec/spec_tests/data/retryable_reads/{listCollections-serverErrors.yml → legacy/listCollections-serverErrors.yml} +0 -0
  593. /data/spec/spec_tests/data/retryable_reads/{listCollections.yml → legacy/listCollections.yml} +0 -0
  594. /data/spec/spec_tests/data/retryable_reads/{listDatabaseNames-serverErrors.yml → legacy/listDatabaseNames-serverErrors.yml} +0 -0
  595. /data/spec/spec_tests/data/retryable_reads/{listDatabaseNames.yml → legacy/listDatabaseNames.yml} +0 -0
  596. /data/spec/spec_tests/data/retryable_reads/{listDatabaseObjects-serverErrors.yml → legacy/listDatabaseObjects-serverErrors.yml} +0 -0
  597. /data/spec/spec_tests/data/retryable_reads/{listDatabaseObjects.yml → legacy/listDatabaseObjects.yml} +0 -0
  598. /data/spec/spec_tests/data/retryable_reads/{listDatabases-serverErrors.yml → legacy/listDatabases-serverErrors.yml} +0 -0
  599. /data/spec/spec_tests/data/retryable_reads/{listDatabases.yml → legacy/listDatabases.yml} +0 -0
  600. /data/spec/spec_tests/data/retryable_reads/{listIndexNames-serverErrors.yml → legacy/listIndexNames-serverErrors.yml} +0 -0
  601. /data/spec/spec_tests/data/retryable_reads/{listIndexNames.yml → legacy/listIndexNames.yml} +0 -0
  602. /data/spec/spec_tests/data/retryable_reads/{listIndexes-serverErrors.yml → legacy/listIndexes-serverErrors.yml} +0 -0
  603. /data/spec/spec_tests/data/retryable_reads/{listIndexes.yml → legacy/listIndexes.yml} +0 -0
  604. /data/spec/spec_tests/data/retryable_reads/{mapReduce.yml → legacy/mapReduce.yml} +0 -0
  605. /data/spec/spec_tests/data/retryable_writes/{bulkWrite-errorLabels.yml → legacy/bulkWrite-errorLabels.yml} +0 -0
  606. /data/spec/spec_tests/data/retryable_writes/{bulkWrite.yml → legacy/bulkWrite.yml} +0 -0
  607. /data/spec/spec_tests/data/retryable_writes/{deleteMany.yml → legacy/deleteMany.yml} +0 -0
  608. /data/spec/spec_tests/data/retryable_writes/{deleteOne-errorLabels.yml → legacy/deleteOne-errorLabels.yml} +0 -0
  609. /data/spec/spec_tests/data/retryable_writes/{deleteOne.yml → legacy/deleteOne.yml} +0 -0
  610. /data/spec/spec_tests/data/retryable_writes/{findOneAndDelete-errorLabels.yml → legacy/findOneAndDelete-errorLabels.yml} +0 -0
  611. /data/spec/spec_tests/data/retryable_writes/{findOneAndDelete.yml → legacy/findOneAndDelete.yml} +0 -0
  612. /data/spec/spec_tests/data/retryable_writes/{findOneAndReplace-errorLabels.yml → legacy/findOneAndReplace-errorLabels.yml} +0 -0
  613. /data/spec/spec_tests/data/retryable_writes/{findOneAndReplace.yml → legacy/findOneAndReplace.yml} +0 -0
  614. /data/spec/spec_tests/data/retryable_writes/{findOneAndUpdate-errorLabels.yml → legacy/findOneAndUpdate-errorLabels.yml} +0 -0
  615. /data/spec/spec_tests/data/retryable_writes/{findOneAndUpdate.yml → legacy/findOneAndUpdate.yml} +0 -0
  616. /data/spec/spec_tests/data/retryable_writes/{insertMany-errorLabels.yml → legacy/insertMany-errorLabels.yml} +0 -0
  617. /data/spec/spec_tests/data/retryable_writes/{insertMany.yml → legacy/insertMany.yml} +0 -0
  618. /data/spec/spec_tests/data/retryable_writes/{insertOne-errorLabels.yml → legacy/insertOne-errorLabels.yml} +0 -0
  619. /data/spec/spec_tests/data/retryable_writes/{insertOne.yml → legacy/insertOne.yml} +0 -0
  620. /data/spec/spec_tests/data/retryable_writes/{replaceOne-errorLabels.yml → legacy/replaceOne-errorLabels.yml} +0 -0
  621. /data/spec/spec_tests/data/retryable_writes/{replaceOne.yml → legacy/replaceOne.yml} +0 -0
  622. /data/spec/spec_tests/data/retryable_writes/{updateMany.yml → legacy/updateMany.yml} +0 -0
  623. /data/spec/spec_tests/data/retryable_writes/{updateOne-errorLabels.yml → legacy/updateOne-errorLabels.yml} +0 -0
  624. /data/spec/spec_tests/data/retryable_writes/{updateOne.yml → legacy/updateOne.yml} +0 -0
@@ -211,7 +211,7 @@ describe Mongo::Client do
211
211
  let(:kms_providers) { nil }
212
212
 
213
213
  it 'raises an exception' do
214
- expect { client }.to raise_error(ArgumentError, /kms_providers option must not be nil/)
214
+ expect { client }.to raise_error(ArgumentError, /KMS providers options must not be nil/)
215
215
  end
216
216
  end
217
217
 
@@ -219,7 +219,7 @@ describe Mongo::Client do
219
219
  let(:kms_providers) { { random_key: 'hello' } }
220
220
 
221
221
  it 'raises an exception' do
222
- expect { client }.to raise_error(ArgumentError, /kms_providers option must have one of the following keys: :aws, :local/)
222
+ expect { client }.to raise_error(ArgumentError, /KMS providers options must have one of the following keys: :aws, :azure, :gcp, :kmip, :local/)
223
223
  end
224
224
  end
225
225
 
@@ -227,7 +227,7 @@ describe Mongo::Client do
227
227
  let(:kms_providers) { { local: { wrong_key: 'hello' } } }
228
228
 
229
229
  it 'raises an exception' do
230
- expect { client }.to raise_error(ArgumentError, /kms_providers with :local key must be in the format: { local: { key: 'MASTER-KEY' } }/)
230
+ expect { client }.to raise_error(ArgumentError, /Local KMS provider options must be in the format: { key: 'MASTER-KEY' }/)
231
231
  end
232
232
  end
233
233
 
@@ -235,7 +235,7 @@ describe Mongo::Client do
235
235
  let(:kms_providers) { { aws: { wrong_key: 'hello' } } }
236
236
 
237
237
  it 'raises an exception' do
238
- expect { client }.to raise_error(ArgumentError, /kms_providers with :aws key must be in the format: { aws: { access_key_id: 'YOUR-ACCESS-KEY-ID', secret_access_key: 'SECRET-ACCESS-KEY' } }/)
238
+ expect { client }.to raise_error(ArgumentError, / AWS KMS provider options must be in the format: { access_key_id: 'YOUR-ACCESS-KEY-ID', secret_access_key: 'SECRET-ACCESS-KEY' }/)
239
239
  end
240
240
  end
241
241
 
@@ -285,9 +285,9 @@ describe Mongo::Client do
285
285
  }
286
286
  end
287
287
 
288
- it 'sets key_vault_client as a clone of self with no encryption options' do
288
+ it 'sets key_vault_client with no encryption options' do
289
289
  key_vault_client = client.encrypter.key_vault_client
290
- expect(key_vault_client).to eq(client)
290
+ expect(key_vault_client.options['auto_encryption_options']).to be_nil
291
291
  end
292
292
 
293
293
  it 'sets bypass_auto_encryption to false' do
@@ -447,7 +447,8 @@ describe Mongo::Client do
447
447
  end.should_not raise_error
448
448
  end
449
449
 
450
- it 'fails operations due to very small timeout', retry: 3 do
450
+ retry_test
451
+ it 'fails operations due to very small timeout' do
451
452
  lambda do
452
453
  client.database.command(ping: 1)
453
454
  end.should raise_error(Mongo::Error::SocketTimeoutError)
@@ -1513,6 +1514,139 @@ describe Mongo::Client do
1513
1514
  end
1514
1515
  end
1515
1516
  end
1517
+
1518
+ context 'srv_max_hosts > 0 and load_balanced: true' do
1519
+ let(:client) do
1520
+ new_local_client_nmio(['127.0.0.1:27017'],
1521
+ srv_max_hosts: 1, load_balanced: true)
1522
+ end
1523
+
1524
+ it 'it is rejected' do
1525
+ expect do
1526
+ client
1527
+ end.to raise_error(ArgumentError, /:srv_max_hosts > 0 cannot be used with :load_balanced=true/)
1528
+ end
1529
+ end
1530
+
1531
+ context 'srv_max_hosts > 0 and replica_set' do
1532
+ let(:client) do
1533
+ new_local_client_nmio(['127.0.0.1:27017'],
1534
+ srv_max_hosts: 1, replica_set: 'rs')
1535
+ end
1536
+
1537
+ it 'it is rejected' do
1538
+ expect do
1539
+ client
1540
+ end.to raise_error(ArgumentError, /:srv_max_hosts > 0 cannot be used with :replica_set option/)
1541
+ end
1542
+ end
1543
+
1544
+ context 'srv_max_hosts < 0' do
1545
+ let(:client) do
1546
+ new_local_client_nmio(['127.0.0.1:27017'],
1547
+ srv_max_hosts: -1)
1548
+ end
1549
+
1550
+ it 'is accepted and does not add the srv_max_hosts to uri_options' do
1551
+ lambda do
1552
+ client
1553
+ end.should_not raise_error
1554
+ expect(client.options).to_not have_key(:srv_max_hosts)
1555
+ end
1556
+ end
1557
+
1558
+ context 'srv_max_hosts invalid type' do
1559
+ let(:client) do
1560
+ new_local_client_nmio(['127.0.0.1:27017'],
1561
+ srv_max_hosts: 'foo')
1562
+ end
1563
+
1564
+ it 'is accepted and does not add the srv_max_hosts to uri_options' do
1565
+ lambda do
1566
+ client
1567
+ end.should_not raise_error
1568
+ expect(client.options).to_not have_key(:srv_max_hosts)
1569
+ end
1570
+ end
1571
+
1572
+ context 'srv_max_hosts with non-SRV URI' do
1573
+ let(:client) do
1574
+ new_local_client_nmio(['127.0.0.1:27017'],
1575
+ srv_max_hosts: 1)
1576
+ end
1577
+
1578
+ it 'is rejected' do
1579
+ lambda do
1580
+ client
1581
+ end.should raise_error(ArgumentError, /:srv_max_hosts cannot be used on non-SRV URI/)
1582
+ end
1583
+ end
1584
+
1585
+ context 'srv_service_name with non-SRV URI' do
1586
+ let(:client) do
1587
+ new_local_client_nmio(['127.0.0.1:27017'],
1588
+ srv_service_name: "customname")
1589
+ end
1590
+
1591
+ it 'is rejected' do
1592
+ lambda do
1593
+ client
1594
+ end.should raise_error(ArgumentError, /:srv_service_name cannot be used on non-SRV URI/)
1595
+ end
1596
+ end
1597
+ end
1598
+
1599
+ context 'with SRV lookups mocked at Resolver' do
1600
+ let(:srv_result) do
1601
+ double('srv result').tap do |result|
1602
+ allow(result).to receive(:empty?).and_return(false)
1603
+ allow(result).to receive(:address_strs).and_return(
1604
+ [ClusterConfig.instance.primary_address_str])
1605
+ end
1606
+ end
1607
+
1608
+ let(:client) do
1609
+ allow_any_instance_of(Mongo::Srv::Resolver).to receive(:get_records).and_return(srv_result)
1610
+ allow_any_instance_of(Mongo::Srv::Resolver).to receive(:get_txt_options_string)
1611
+
1612
+ new_local_client_nmio('mongodb+srv://foo.a.b', options)
1613
+ end
1614
+
1615
+ context "when setting srv_max_hosts" do
1616
+ let(:srv_max_hosts) { 1 }
1617
+ let(:options) { { srv_max_hosts: srv_max_hosts } }
1618
+
1619
+ it 'is accepted and sets srv_max_hosts' do
1620
+ lambda do
1621
+ client
1622
+ end.should_not raise_error
1623
+ expect(client.options[:srv_max_hosts]).to eq(srv_max_hosts)
1624
+ end
1625
+ end
1626
+
1627
+ context "when setting srv_max_hosts to 0" do
1628
+ let(:srv_max_hosts) { 0 }
1629
+ let(:options) { { srv_max_hosts: srv_max_hosts } }
1630
+
1631
+ it 'is accepted sets srv_max_hosts' do
1632
+ lambda do
1633
+ client
1634
+ end.should_not raise_error
1635
+ expect(client.options[:srv_max_hosts]).to eq(srv_max_hosts)
1636
+ end
1637
+ end
1638
+
1639
+ context "when setting srv_service_name" do
1640
+ let(:srv_service_name) { 'customname' }
1641
+ let(:options) { { srv_service_name: srv_service_name } }
1642
+
1643
+ it 'is accepted and sets srv_service_name' do
1644
+ lambda do
1645
+ client
1646
+ end.should_not raise_error
1647
+ expect(client.options[:srv_service_name]).to eq(srv_service_name)
1648
+ end
1649
+ end
1516
1650
  end
1517
1651
 
1518
1652
  context ':bg_error_backtrace option' do
@@ -68,7 +68,7 @@ describe Mongo::ClientEncryption do
68
68
  it 'raises an exception' do
69
69
  expect do
70
70
  client_encryption
71
- end.to raise_error(ArgumentError, /kms_providers option must have one of the following keys/)
71
+ end.to raise_error(ArgumentError, /KMS providers options must have one of the following keys/)
72
72
  end
73
73
  end
74
74
  end
@@ -144,7 +144,7 @@ describe Mongo::ClientEncryption do
144
144
  it 'raises an exception' do
145
145
  expect do
146
146
  data_key_id
147
- end.to raise_error(ArgumentError, /options cannot be nil/)
147
+ end.to raise_error(ArgumentError, /Key document options must not be nil/)
148
148
  end
149
149
  end
150
150
 
@@ -154,7 +154,7 @@ describe Mongo::ClientEncryption do
154
154
  it 'raises an exception' do
155
155
  expect do
156
156
  data_key_id
157
- end.to raise_error(ArgumentError, /options Hash must contain a key named :master_key/)
157
+ end.to raise_error(ArgumentError, /Key document options must contain a key named :master_key with a Hash value/)
158
158
  end
159
159
  end
160
160
 
@@ -164,7 +164,7 @@ describe Mongo::ClientEncryption do
164
164
  it 'raises an exception' do
165
165
  expect do
166
166
  data_key_id
167
- end.to raise_error(ArgumentError, /The :master_key option cannot be nil/)
167
+ end.to raise_error(ArgumentError, /Key document options must contain a key named :master_key with a Hash value/)
168
168
  end
169
169
  end
170
170
 
@@ -174,7 +174,7 @@ describe Mongo::ClientEncryption do
174
174
  it 'raises an exception' do
175
175
  expect do
176
176
  data_key_id
177
- end.to raise_error(ArgumentError, /master-key is an invalid :master_key option/)
177
+ end.to raise_error(ArgumentError, /Key document options must contain a key named :master_key with a Hash value/)
178
178
  end
179
179
  end
180
180
 
@@ -184,7 +184,7 @@ describe Mongo::ClientEncryption do
184
184
  it 'raises an exception' do
185
185
  expect do
186
186
  data_key_id
187
- end.to raise_error(ArgumentError, /The value of :region option of the :master_key options hash cannot be nil/)
187
+ end.to raise_error(ArgumentError, /The specified KMS provider options are invalid: {}. AWS key document must be in the format: { region: 'REGION', key: 'KEY' }/)
188
188
  end
189
189
  end
190
190
 
@@ -194,7 +194,7 @@ describe Mongo::ClientEncryption do
194
194
  it 'raises an exception' do
195
195
  expect do
196
196
  data_key_id
197
- end.to raise_error(ArgumentError, /The value of :region option of the :master_key options hash cannot be nil/)
197
+ end.to raise_error(ArgumentError, /The region option must be a String with at least one character; currently have nil/)
198
198
  end
199
199
  end
200
200
 
@@ -204,7 +204,7 @@ describe Mongo::ClientEncryption do
204
204
  it 'raises an exception' do
205
205
  expect do
206
206
  data_key_id
207
- end.to raise_error(ArgumentError, /5 is an invalid AWS master_key region. The value of :region option of the :master_key options hash must be a String/)
207
+ end.to raise_error(ArgumentError, /The region option must be a String with at least one character; currently have 5/)
208
208
  end
209
209
  end
210
210
 
@@ -214,7 +214,7 @@ describe Mongo::ClientEncryption do
214
214
  it 'raises an exception' do
215
215
  expect do
216
216
  data_key_id
217
- end.to raise_error(ArgumentError, /The value of :key option of the :master_key options hash cannot be nil/)
217
+ end.to raise_error(ArgumentError, /The key option must be a String with at least one character; currently have nil/)
218
218
  end
219
219
  end
220
220
 
@@ -224,7 +224,7 @@ describe Mongo::ClientEncryption do
224
224
  it 'raises an exception' do
225
225
  expect do
226
226
  data_key_id
227
- end.to raise_error(ArgumentError, /5 is an invalid AWS master_key key. The value of :key option of the :master_key options hash must be a String/)
227
+ end.to raise_error(ArgumentError, /The key option must be a String with at least one character; currently have 5/)
228
228
  end
229
229
  end
230
230
 
@@ -234,7 +234,7 @@ describe Mongo::ClientEncryption do
234
234
  it 'raises an exception' do
235
235
  expect do
236
236
  data_key_id
237
- end.to raise_error(ArgumentError, /5 is an invalid AWS master_key endpoint. The value of :endpoint option of the :master_key options hash must be a String/)
237
+ end.to raise_error(ArgumentError, /The endpoint option must be a String with at least one character; currently have 5/)
238
238
  end
239
239
  end
240
240
 
@@ -8,6 +8,14 @@ require 'spec_helper'
8
8
 
9
9
  describe Mongo::Client do
10
10
 
11
+ let(:subscriber) { Mrss::EventSubscriber.new }
12
+
13
+ let(:monitored_client) do
14
+ root_authorized_client.tap do |client|
15
+ client.subscribe(Mongo::Monitoring::COMMAND, subscriber)
16
+ end
17
+ end
18
+
11
19
  describe '#==' do
12
20
 
13
21
  let(:client) do
@@ -584,6 +592,18 @@ describe Mongo::Client do
584
592
  expect(result.first).to eq(filter[:name])
585
593
  end
586
594
  end
595
+
596
+ context 'with comment' do
597
+ min_server_version '4.4'
598
+
599
+ it 'returns a list of database names and send comment' do
600
+ result = monitored_client.database_names({}, comment: "comment")
601
+ expect(result).to include('admin')
602
+ command = subscriber.command_started_events("listDatabases").last&.command
603
+ expect(command).not_to be_nil
604
+ expect(command["comment"]).to eq("comment")
605
+ end
606
+ end
587
607
  end
588
608
 
589
609
  describe '#list_databases' do
@@ -677,6 +697,20 @@ describe Mongo::Client do
677
697
  expect(command[:authorizedDatabases]).to be_nil
678
698
  end
679
699
  end
700
+
701
+ context 'with comment' do
702
+ min_server_version '4.4'
703
+
704
+ it 'returns a list of database names and send comment' do
705
+ result = monitored_client.list_databases({}, false, comment: "comment").collect do |i|
706
+ i['name']
707
+ end
708
+ expect(result).to include('admin')
709
+ command = subscriber.command_started_events("listDatabases").last&.command
710
+ expect(command).not_to be_nil
711
+ expect(command["comment"]).to eq("comment")
712
+ end
713
+ end
680
714
  end
681
715
 
682
716
  describe '#list_mongo_databases' do
@@ -719,6 +753,18 @@ describe Mongo::Client do
719
753
  expect(result.first.name).to eq(filter[:name])
720
754
  end
721
755
  end
756
+
757
+ context 'with comment' do
758
+ min_server_version '4.4'
759
+
760
+ it 'returns a list of database names and send comment' do
761
+ result = monitored_client.list_mongo_databases({}, comment: "comment")
762
+ expect(result).to all(be_a(Mongo::Database))
763
+ command = subscriber.command_started_events("listDatabases").last&.command
764
+ expect(command).not_to be_nil
765
+ expect(command["comment"]).to eq("comment")
766
+ end
767
+ end
722
768
  end
723
769
 
724
770
  describe '#close' do
@@ -790,7 +836,8 @@ describe Mongo::Client do
790
836
  expect(session).to be_a(Mongo::Session)
791
837
  end
792
838
 
793
- it 'sets the last use field to the current time', retry: 4 do
839
+ retry_test 4
840
+ it 'sets the last use field to the current time' do
794
841
  expect(session.instance_variable_get(:@server_session).last_use).to be_within(1).of(Time.now)
795
842
  end
796
843
 
@@ -873,6 +920,255 @@ describe Mongo::Client do
873
920
  expect(before_last_use).to be < (pool.instance_variable_get(:@queue)[0].last_use)
874
921
  end
875
922
  end
923
+
924
+ context 'when an implicit session is used without enough connections' do
925
+ require_no_multi_mongos
926
+ require_wired_tiger
927
+
928
+ let(:client) do
929
+ authorized_client.with(options).tap do |cl|
930
+ cl.subscribe(Mongo::Monitoring::COMMAND, subscriber)
931
+ end
932
+ end
933
+
934
+ let(:options) do
935
+ { :max_pool_size => 1, :retry_writes => true }
936
+ end
937
+
938
+ shared_examples "a single connection" do
939
+ # JRuby, due to being concurrent, does not like rspec setting mocks
940
+ # in threads while other threads are calling the methods being mocked.
941
+ # My theory is that rspec removes & redefines methods as part of
942
+ # the mocking process, but while a method is undefined JRuby is
943
+ # running another thread that calls it leading to this exception:
944
+ # NoMethodError: undefined method `with_connection' for #<Mongo::Server:0x5386 address=localhost:27017 PRIMARY>
945
+ fails_on_jruby
946
+
947
+ before do
948
+ sessions_checked_out = 0
949
+
950
+ allow_any_instance_of(Mongo::Server).to receive(:with_connection).and_wrap_original do |m, *args, &block|
951
+ m.call(*args) do |connection|
952
+ sessions_checked_out = 0
953
+ res = block.call(connection)
954
+ expect(sessions_checked_out).to be < 2
955
+ res
956
+ end
957
+ end
958
+
959
+ allow_any_instance_of(Mongo::Session).to receive(:materialize).and_wrap_original do |m, *args|
960
+ sessions_checked_out += 1
961
+ m.call(*args).tap do
962
+ checked_out_connections = args[0].connection_pool.instance_variable_get("@checked_out_connections")
963
+ expect(checked_out_connections.length).to eq 1
964
+ end
965
+ end
966
+ end
967
+
968
+ it 'doesn\'t have any live sessions' do
969
+ threads.each do |thread|
970
+ thread.join
971
+ end
972
+ end
973
+ end
974
+
975
+ context "when doing three inserts" do
976
+ let(:threads) do
977
+ (1..3).map do |i|
978
+ Thread.new do
979
+ client['test'].insert_one({test: "test#{i}"})
980
+ end
981
+ end
982
+ end
983
+
984
+ include_examples "a single connection"
985
+ end
986
+
987
+ context "when doing an insert and two updates" do
988
+ let(:threads) do
989
+ threads = []
990
+ threads << Thread.new do
991
+ client['test'].insert_one({test: "test"})
992
+ end
993
+ threads << Thread.new do
994
+ client['test'].update_one({test: "test"}, { "$set" => { test: "test2" } })
995
+ end
996
+ threads << Thread.new do
997
+ client['test'].update_one({test: "test"}, { "$set" => { test: "test2" } })
998
+ end
999
+ threads
1000
+ end
1001
+
1002
+ include_examples "a single connection"
1003
+ end
1004
+
1005
+ context "when doing an insert, update and delete" do
1006
+ let(:threads) do
1007
+ threads = []
1008
+ threads << Thread.new do
1009
+ client['test'].insert_one({test: "test"})
1010
+ end
1011
+ threads << Thread.new do
1012
+ client['test'].update_one({test: "test"}, { "$set" => { test: "test2" } })
1013
+ end
1014
+ threads << Thread.new do
1015
+ client['test'].delete_one({test: "test"})
1016
+ end
1017
+ threads
1018
+ end
1019
+
1020
+ include_examples "a single connection"
1021
+ end
1022
+
1023
+ context "when doing an insert, update and find" do
1024
+ let(:threads) do
1025
+ threads = []
1026
+ threads << Thread.new do
1027
+ client['test'].insert_one({test: "test"})
1028
+ end
1029
+ threads << Thread.new do
1030
+ client['test'].update_one({test: "test"}, { "$set" => { test: "test2" } })
1031
+ end
1032
+ threads << Thread.new do
1033
+ client['test'].find({test: "test"}).to_a
1034
+ end
1035
+ threads
1036
+ end
1037
+
1038
+ include_examples "a single connection"
1039
+ end
1040
+
1041
+ context "when doing an insert, update and bulk write" do
1042
+ let(:threads) do
1043
+ threads = []
1044
+ threads << Thread.new do
1045
+ client['test'].insert_one({test: "test"})
1046
+ end
1047
+ threads << Thread.new do
1048
+ client['test'].update_one({test: "test"}, { "$set" => { test: "test2" } })
1049
+ end
1050
+ threads << Thread.new do
1051
+ client['test'].bulk_write([{ insert_one: { test: "test1" } },
1052
+ { update_one: { filter: { test: "test1" }, update: { "$set" => { test: "test2" } } } } ])
1053
+ end
1054
+ threads
1055
+ end
1056
+
1057
+ include_examples "a single connection"
1058
+ end
1059
+
1060
+ context "when doing an insert, update and find_one_and_delete" do
1061
+ let(:threads) do
1062
+ threads = []
1063
+ threads << Thread.new do
1064
+ client['test'].insert_one({test: "test"})
1065
+ end
1066
+ threads << Thread.new do
1067
+ client['test'].update_one({test: "test"}, { "$set" => { test: "test2" } })
1068
+ end
1069
+ threads << Thread.new do
1070
+ client['test'].find_one_and_delete({test: "test"})
1071
+ end
1072
+ threads
1073
+ end
1074
+
1075
+ include_examples "a single connection"
1076
+ end
1077
+
1078
+ context "when doing an insert, update and find_one_and_update" do
1079
+ let(:threads) do
1080
+ threads = []
1081
+ threads << Thread.new do
1082
+ client['test'].insert_one({test: "test"})
1083
+ end
1084
+ threads << Thread.new do
1085
+ client['test'].update_one({test: "test"}, { "$set" => { test: "test2" } })
1086
+ end
1087
+ threads << Thread.new do
1088
+ client['test'].find_one_and_update({test: "test"}, {test: "test2"})
1089
+ end
1090
+ threads
1091
+ end
1092
+
1093
+ include_examples "a single connection"
1094
+ end
1095
+
1096
+ context "when doing an insert, update and find_one_and_replace" do
1097
+ let(:threads) do
1098
+ threads = []
1099
+ threads << Thread.new do
1100
+ client['test'].insert_one({test: "test"})
1101
+ end
1102
+ threads << Thread.new do
1103
+ client['test'].update_one({test: "test"}, { "$set" => { test: "test2" } })
1104
+ end
1105
+ threads << Thread.new do
1106
+ client['test'].find_one_and_replace({test: "test"}, {test: "test2"})
1107
+ end
1108
+ threads
1109
+ end
1110
+
1111
+ include_examples "a single connection"
1112
+ end
1113
+
1114
+ context "when doing an insert, update and a replace" do
1115
+ let(:threads) do
1116
+ threads = []
1117
+ threads << Thread.new do
1118
+ client['test'].insert_one({test: "test"})
1119
+ end
1120
+ threads << Thread.new do
1121
+ client['test'].update_one({test: "test"}, { "$set" => { test: "test2" } })
1122
+ end
1123
+ threads << Thread.new do
1124
+ client['test'].replace_one({test: "test"}, {test: "test2"})
1125
+ end
1126
+ threads
1127
+ end
1128
+
1129
+ include_examples "a single connection"
1130
+ end
1131
+
1132
+ context "when doing all of the operations" do
1133
+ let(:threads) do
1134
+ threads = []
1135
+ threads << Thread.new do
1136
+ client['test'].insert_one({test: "test"})
1137
+ end
1138
+ threads << Thread.new do
1139
+ client['test'].update_one({ test: "test" }, { "$set" => { test: 1 } })
1140
+ end
1141
+ threads << Thread.new do
1142
+ client['test'].find_one_and_replace({test: "test"}, {test: "test2"})
1143
+ end
1144
+ threads << Thread.new do
1145
+ client['test'].delete_one({test: "test"})
1146
+ end
1147
+ threads << Thread.new do
1148
+ client['test'].find({test: "test"}).to_a
1149
+ end
1150
+ threads << Thread.new do
1151
+ client['test'].bulk_write([{ insert_one: { test: "test1" } },
1152
+ { update_one: { filter: { test: "test1" }, update: { "$set" => { test: "test2" } } } } ])
1153
+ end
1154
+ threads << Thread.new do
1155
+ client['test'].find_one_and_delete({test: "test"})
1156
+ end
1157
+ threads << Thread.new do
1158
+ client['test'].find_one_and_update({test: "test"}, {test: "test2"})
1159
+ end
1160
+ threads << Thread.new do
1161
+ client['test'].find_one_and_replace({test: "test"}, {test: "test2"})
1162
+ end
1163
+ threads << Thread.new do
1164
+ client['test'].replace_one({test: "test"}, {test: "test2"})
1165
+ end
1166
+ threads
1167
+ end
1168
+
1169
+ include_examples "a single connection"
1170
+ end
1171
+ end
876
1172
  end
877
1173
 
878
1174
  context 'when two clients have the same cluster' do
@@ -38,15 +38,28 @@ describe Mongo::Cluster::CursorReaper do
38
38
  allow(server).to receive(:address).and_return(address)
39
39
  end
40
40
  end
41
+ let(:session) do
42
+ double(Mongo::Session)
43
+ end
41
44
  let(:cursor_id) { 1 }
42
45
  let(:cursor_kill_spec_1) do
43
46
  Mongo::Cursor::KillSpec.new(
44
- cursor_id: cursor_id, coll_name: 'c', db_name: 'd', service_id: nil, server_address: address
47
+ cursor_id: cursor_id,
48
+ coll_name: 'c',
49
+ db_name: 'd',
50
+ server_address: address,
51
+ connection_global_id: 1,
52
+ session: session,
45
53
  )
46
54
  end
47
55
  let(:cursor_kill_spec_2) do
48
56
  Mongo::Cursor::KillSpec.new(
49
- cursor_id: cursor_id, coll_name: 'c', db_name: 'q', service_id: nil, server_address: address
57
+ cursor_id: cursor_id,
58
+ coll_name: 'c',
59
+ db_name: 'q',
60
+ server_address: address,
61
+ connection_global_id: 1,
62
+ session: session,
50
63
  )
51
64
  end
52
65
  let(:to_kill) { reaper.instance_variable_get(:@to_kill)}
@@ -206,7 +219,12 @@ describe Mongo::Cluster::CursorReaper do
206
219
  it 'schedules the kill cursor op' do
207
220
  expect {
208
221
  cursor.to_a
209
- }.to raise_exception(Mongo::Error::OperationFailure)
222
+ # Mongo::Error::SessionEnded is raised here because the periodic executor
223
+ # called in around block kills the cursor and closes the session.
224
+ # This code is normally scheduled in cursor finalizer, so the cursor object
225
+ # is garbage collected when the code is executed. So, a user won't get
226
+ # this exception.
227
+ }.to raise_exception(Mongo::Error::SessionEnded)
210
228
  end
211
229
  end
212
230
  end