mongo 2.17.3 → 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 (622) 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 -3
  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.rb +108 -48
  23. data/lib/mongo/config/options.rb +62 -0
  24. data/lib/mongo/config/validators/option.rb +26 -0
  25. data/lib/mongo/config.rb +31 -0
  26. data/lib/mongo/crypt/auto_encrypter.rb +79 -6
  27. data/lib/mongo/crypt/binding.rb +395 -143
  28. data/lib/mongo/crypt/context.rb +5 -2
  29. data/lib/mongo/crypt/data_key_context.rb +7 -104
  30. data/lib/mongo/crypt/encryption_io.rb +28 -60
  31. data/lib/mongo/crypt/explicit_encrypter.rb +27 -25
  32. data/lib/mongo/crypt/explicit_encryption_context.rb +31 -3
  33. data/lib/mongo/crypt/handle.rb +102 -79
  34. data/lib/mongo/crypt/hooks.rb +25 -2
  35. data/lib/mongo/crypt/kms/aws.rb +128 -0
  36. data/lib/mongo/crypt/kms/azure.rb +136 -0
  37. data/lib/mongo/crypt/kms/credentials.rb +81 -0
  38. data/lib/mongo/crypt/kms/gcp.rb +182 -0
  39. data/lib/mongo/crypt/kms/kmip.rb +110 -0
  40. data/lib/mongo/crypt/kms/local.rb +74 -0
  41. data/lib/mongo/crypt/kms/master_key_document.rb +65 -0
  42. data/lib/mongo/crypt/kms.rb +117 -0
  43. data/lib/mongo/crypt.rb +1 -0
  44. data/lib/mongo/cursor/kill_spec.rb +27 -6
  45. data/lib/mongo/cursor.rb +21 -16
  46. data/lib/mongo/database/view.rb +6 -3
  47. data/lib/mongo/database.rb +73 -12
  48. data/lib/mongo/dbref.rb +1 -105
  49. data/lib/mongo/error/bulk_write_error.rb +31 -4
  50. data/lib/mongo/error/invalid_config_option.rb +20 -0
  51. data/lib/mongo/error/invalid_replacement_document.rb +27 -9
  52. data/lib/mongo/error/invalid_update_document.rb +27 -7
  53. data/lib/mongo/error/labelable.rb +72 -0
  54. data/lib/mongo/error/missing_connection.rb +25 -0
  55. data/lib/mongo/error/notable.rb +7 -0
  56. data/lib/mongo/error/operation_failure.rb +34 -86
  57. data/lib/mongo/error/read_write_retryable.rb +108 -0
  58. data/lib/mongo/{operation/kill_cursors/legacy.rb → error/session_not_materialized.rb} +7 -19
  59. data/lib/mongo/error.rb +5 -37
  60. data/lib/mongo/index/view.rb +22 -7
  61. data/lib/mongo/monitoring/event/command_failed.rb +8 -2
  62. data/lib/mongo/monitoring/event/command_started.rb +1 -1
  63. data/lib/mongo/monitoring/event/command_succeeded.rb +9 -2
  64. data/lib/mongo/monitoring/publishable.rb +9 -5
  65. data/lib/mongo/operation/collections_info/result.rb +5 -2
  66. data/lib/mongo/operation/command/op_msg.rb +6 -0
  67. data/lib/mongo/operation/context.rb +24 -6
  68. data/lib/mongo/operation/count/op_msg.rb +4 -1
  69. data/lib/mongo/operation/create/op_msg.rb +16 -1
  70. data/lib/mongo/operation/create_index/op_msg.rb +2 -1
  71. data/lib/mongo/operation/delete/op_msg.rb +1 -0
  72. data/lib/mongo/operation/delete.rb +0 -1
  73. data/lib/mongo/operation/drop_index/op_msg.rb +5 -1
  74. data/lib/mongo/operation/get_more/command_builder.rb +5 -1
  75. data/lib/mongo/operation/insert/bulk_result.rb +5 -1
  76. data/lib/mongo/operation/insert/command.rb +0 -4
  77. data/lib/mongo/operation/insert/op_msg.rb +6 -3
  78. data/lib/mongo/operation/insert/result.rb +6 -3
  79. data/lib/mongo/operation/insert.rb +0 -1
  80. data/lib/mongo/operation/kill_cursors.rb +0 -1
  81. data/lib/mongo/operation/list_collections/op_msg.rb +4 -1
  82. data/lib/mongo/operation/map_reduce/result.rb +16 -0
  83. data/lib/mongo/operation/result.rb +21 -5
  84. data/lib/mongo/operation/shared/executable.rb +21 -6
  85. data/lib/mongo/operation/shared/polymorphic_operation.rb +15 -3
  86. data/lib/mongo/operation/shared/response_handling.rb +6 -5
  87. data/lib/mongo/operation/shared/sessions_supported.rb +3 -7
  88. data/lib/mongo/operation/shared/write.rb +18 -12
  89. data/lib/mongo/operation/update/op_msg.rb +2 -1
  90. data/lib/mongo/operation/update.rb +0 -1
  91. data/lib/mongo/protocol/caching_hash.rb +69 -0
  92. data/lib/mongo/protocol/msg.rb +37 -1
  93. data/lib/mongo/protocol.rb +1 -0
  94. data/lib/mongo/query_cache.rb +15 -0
  95. data/lib/mongo/retryable.rb +78 -30
  96. data/lib/mongo/server/connection.rb +33 -0
  97. data/lib/mongo/server/connection_base.rb +2 -0
  98. data/lib/mongo/server/connection_common.rb +4 -1
  99. data/lib/mongo/server/connection_pool.rb +69 -42
  100. data/lib/mongo/server/description/features.rb +3 -1
  101. data/lib/mongo/server/description.rb +7 -2
  102. data/lib/mongo/server/monitor/connection.rb +5 -10
  103. data/lib/mongo/server/monitor.rb +21 -13
  104. data/lib/mongo/server/push_monitor.rb +9 -3
  105. data/lib/mongo/server.rb +9 -5
  106. data/lib/mongo/session/session_pool.rb +8 -0
  107. data/lib/mongo/session.rb +111 -35
  108. data/lib/mongo/socket/ocsp_verifier.rb +4 -5
  109. data/lib/mongo/socket/tcp.rb +3 -0
  110. data/lib/mongo/srv/resolver.rb +24 -3
  111. data/lib/mongo/uri/options_mapper.rb +2 -0
  112. data/lib/mongo/uri/srv_protocol.rb +1 -1
  113. data/lib/mongo/uri.rb +20 -0
  114. data/lib/mongo/version.rb +1 -1
  115. data/lib/mongo.rb +20 -0
  116. data/mongo.gemspec +10 -4
  117. data/spec/README.md +5 -5
  118. data/spec/integration/aws_lambda_examples_spec.rb +68 -0
  119. data/spec/integration/bulk_write_error_message_spec.rb +32 -0
  120. data/spec/integration/bulk_write_spec.rb +0 -16
  121. data/spec/integration/change_stream_spec.rb +6 -5
  122. data/spec/integration/client_construction_spec.rb +1 -1
  123. data/spec/integration/client_side_encryption/auto_encryption_bulk_writes_spec.rb +9 -9
  124. data/spec/integration/client_side_encryption/auto_encryption_command_monitoring_spec.rb +18 -19
  125. data/spec/integration/client_side_encryption/auto_encryption_mongocryptd_spawn_spec.rb +0 -1
  126. data/spec/integration/client_side_encryption/auto_encryption_reconnect_spec.rb +31 -0
  127. data/spec/integration/client_side_encryption/auto_encryption_spec.rb +108 -1
  128. data/spec/integration/client_side_encryption/bson_size_limit_spec.rb +2 -2
  129. data/spec/integration/client_side_encryption/bypass_mongocryptd_spawn_spec.rb +2 -2
  130. data/spec/integration/client_side_encryption/client_close_spec.rb +1 -1
  131. data/spec/integration/client_side_encryption/corpus_spec.rb +64 -35
  132. data/spec/integration/client_side_encryption/custom_endpoint_spec.rb +39 -42
  133. data/spec/integration/client_side_encryption/data_key_spec.rb +97 -7
  134. data/spec/integration/client_side_encryption/explicit_encryption_spec.rb +59 -0
  135. data/spec/integration/client_side_encryption/explicit_queryable_encryption_spec.rb +147 -0
  136. data/spec/integration/client_side_encryption/external_key_vault_spec.rb +6 -6
  137. data/spec/integration/client_side_encryption/kms_tls_options_spec.rb +394 -0
  138. data/spec/integration/client_side_encryption/kms_tls_spec.rb +92 -0
  139. data/spec/integration/client_side_encryption/queryable_encryption_examples_spec.rb +111 -0
  140. data/spec/integration/client_side_encryption/views_spec.rb +1 -1
  141. data/spec/integration/client_update_spec.rb +2 -2
  142. data/spec/integration/crud_spec.rb +12 -0
  143. data/spec/integration/cursor_pinning_spec.rb +3 -3
  144. data/spec/integration/fork_reconnect_spec.rb +15 -8
  145. data/spec/integration/grid_fs_bucket_spec.rb +3 -3
  146. data/spec/integration/ocsp_verifier_spec.rb +1 -0
  147. data/spec/integration/query_cache_spec.rb +34 -30
  148. data/spec/integration/retryable_writes/retryable_writes_36_and_older_spec.rb +1 -1
  149. data/spec/integration/sdam_events_spec.rb +0 -40
  150. data/spec/integration/server_monitor_spec.rb +2 -1
  151. data/spec/integration/size_limit_spec.rb +4 -1
  152. data/spec/integration/snapshot_query_examples_spec.rb +127 -0
  153. data/spec/integration/srv_monitoring_spec.rb +37 -0
  154. data/spec/integration/step_down_spec.rb +20 -4
  155. data/spec/integration/transaction_pinning_spec.rb +2 -2
  156. data/spec/integration/versioned_api_examples_spec.rb +37 -31
  157. data/spec/lite_spec_helper.rb +14 -5
  158. data/spec/mongo/address/ipv6_spec.rb +7 -0
  159. data/spec/mongo/address_spec.rb +7 -0
  160. data/spec/mongo/auth/scram/conversation_spec.rb +23 -23
  161. data/spec/mongo/auth/scram256/conversation_spec.rb +20 -20
  162. data/spec/mongo/auth/scram_negotiation_spec.rb +1 -0
  163. data/spec/mongo/bulk_write/result_spec.rb +15 -1
  164. data/spec/mongo/bulk_write_spec.rb +128 -20
  165. data/spec/mongo/client_construction_spec.rb +141 -7
  166. data/spec/mongo/client_encryption_spec.rb +11 -11
  167. data/spec/mongo/client_spec.rb +297 -1
  168. data/spec/mongo/cluster/cursor_reaper_spec.rb +21 -3
  169. data/spec/mongo/cluster_spec.rb +0 -44
  170. data/spec/mongo/collection/view/aggregation_spec.rb +2 -2
  171. data/spec/mongo/collection/view/change_stream_spec.rb +2 -2
  172. data/spec/mongo/collection/view/readable_spec.rb +35 -56
  173. data/spec/mongo/collection/view/writable_spec.rb +144 -32
  174. data/spec/mongo/collection_crud_spec.rb +63 -13
  175. data/spec/mongo/config/options_spec.rb +75 -0
  176. data/spec/mongo/config_spec.rb +73 -0
  177. data/spec/mongo/crypt/auto_decryption_context_spec.rb +17 -1
  178. data/spec/mongo/crypt/auto_encrypter_spec.rb +106 -0
  179. data/spec/mongo/crypt/auto_encryption_context_spec.rb +17 -1
  180. data/spec/mongo/crypt/binding/context_spec.rb +99 -17
  181. data/spec/mongo/crypt/binding/mongocrypt_spec.rb +17 -46
  182. data/spec/mongo/crypt/binding/version_spec.rb +25 -0
  183. data/spec/mongo/crypt/binding_unloaded_spec.rb +14 -0
  184. data/spec/mongo/crypt/data_key_context_spec.rb +42 -114
  185. data/spec/mongo/crypt/encryption_io_spec.rb +2 -0
  186. data/spec/mongo/crypt/explicit_decryption_context_spec.rb +32 -1
  187. data/spec/mongo/crypt/explicit_encryption_context_spec.rb +89 -1
  188. data/spec/mongo/crypt/handle_spec.rb +47 -169
  189. data/spec/mongo/crypt/hooks_spec.rb +30 -0
  190. data/spec/mongo/crypt/kms/credentials_spec.rb +404 -0
  191. data/spec/mongo/crypt/kms_spec.rb +59 -0
  192. data/spec/mongo/cursor_spec.rb +37 -51
  193. data/spec/mongo/database_spec.rb +66 -1
  194. data/spec/mongo/error/operation_failure_heavy_spec.rb +49 -0
  195. data/spec/mongo/index/view_spec.rb +69 -0
  196. data/spec/mongo/operation/create/op_msg_spec.rb +286 -0
  197. data/spec/mongo/operation/delete/op_msg_spec.rb +13 -4
  198. data/spec/mongo/operation/delete_spec.rb +0 -30
  199. data/spec/mongo/operation/insert/op_msg_spec.rb +18 -10
  200. data/spec/mongo/operation/insert_spec.rb +0 -32
  201. data/spec/mongo/operation/result_spec.rb +20 -0
  202. data/spec/mongo/operation/update/op_msg_spec.rb +13 -4
  203. data/spec/mongo/operation/update_spec.rb +0 -29
  204. data/spec/mongo/protocol/caching_hash_spec.rb +82 -0
  205. data/spec/mongo/protocol/msg_spec.rb +41 -0
  206. data/spec/mongo/query_cache_spec.rb +1 -0
  207. data/spec/mongo/retryable_spec.rb +32 -3
  208. data/spec/mongo/server/connection_auth_spec.rb +3 -1
  209. data/spec/mongo/server/connection_common_spec.rb +13 -1
  210. data/spec/mongo/server/connection_pool_spec.rb +94 -49
  211. data/spec/mongo/server/connection_spec.rb +50 -159
  212. data/spec/mongo/server/description/features_spec.rb +24 -0
  213. data/spec/mongo/server/push_monitor_spec.rb +2 -8
  214. data/spec/mongo/session_spec.rb +26 -6
  215. data/spec/mongo/session_transaction_spec.rb +2 -1
  216. data/spec/mongo/socket/ssl_spec.rb +15 -4
  217. data/spec/mongo/uri/srv_protocol_spec.rb +101 -2
  218. data/spec/mongo/uri_spec.rb +25 -0
  219. data/spec/runners/connection_string.rb +8 -0
  220. data/spec/runners/crud/operation.rb +12 -3
  221. data/spec/runners/crud/requirement.rb +3 -3
  222. data/spec/runners/crud/spec.rb +5 -0
  223. data/spec/runners/crud/verifier.rb +6 -0
  224. data/spec/runners/transactions/test.rb +33 -14
  225. data/spec/runners/transactions.rb +9 -6
  226. data/spec/runners/unified/assertions.rb +59 -10
  227. data/spec/runners/unified/change_stream_operations.rb +9 -0
  228. data/spec/runners/unified/crud_operations.rb +50 -2
  229. data/spec/runners/unified/ddl_operations.rb +20 -0
  230. data/spec/runners/unified/error.rb +2 -1
  231. data/spec/runners/unified/support_operations.rb +5 -2
  232. data/spec/runners/unified/test.rb +19 -4
  233. data/spec/runners/unified.rb +9 -2
  234. data/spec/shared/lib/mrss/constraints.rb +10 -17
  235. data/spec/shared/lib/mrss/docker_runner.rb +21 -3
  236. data/spec/shared/lib/mrss/lite_constraints.rb +32 -1
  237. data/spec/shared/lib/mrss/session_registry.rb +69 -0
  238. data/spec/shared/lib/mrss/session_registry_legacy.rb +60 -0
  239. data/spec/shared/share/Dockerfile.erb +56 -54
  240. data/spec/shared/shlib/config.sh +27 -0
  241. data/spec/shared/shlib/distro.sh +2 -1
  242. data/spec/shared/shlib/server.sh +46 -21
  243. data/spec/shared/shlib/set_env.sh +40 -5
  244. data/spec/spec_helper.rb +0 -1
  245. data/spec/spec_tests/crud_spec.rb +0 -10
  246. data/spec/spec_tests/data/change_streams_unified/change-streams-errors.yml +124 -0
  247. data/spec/spec_tests/data/change_streams_unified/change-streams-pre_and_post_images.yml +351 -0
  248. data/spec/spec_tests/data/change_streams_unified/change-streams-resume-allowlist.yml +1171 -0
  249. data/spec/spec_tests/data/change_streams_unified/change-streams-resume-errorLabels.yml +1068 -0
  250. data/spec/spec_tests/data/change_streams_unified/change-streams.yml +859 -4
  251. data/spec/spec_tests/data/client_side_encryption/aggregate.yml +3 -17
  252. data/spec/spec_tests/data/client_side_encryption/azureKMS.yml +46 -0
  253. data/spec/spec_tests/data/client_side_encryption/badQueries.yml +12 -2
  254. data/spec/spec_tests/data/client_side_encryption/basic.yml +3 -17
  255. data/spec/spec_tests/data/client_side_encryption/bulk.yml +1 -8
  256. data/spec/spec_tests/data/client_side_encryption/bypassAutoEncryption.yml +2 -2
  257. data/spec/spec_tests/data/client_side_encryption/count.yml +1 -8
  258. data/spec/spec_tests/data/client_side_encryption/countDocuments.yml +1 -8
  259. data/spec/spec_tests/data/client_side_encryption/delete.yml +2 -16
  260. data/spec/spec_tests/data/client_side_encryption/distinct.yml +1 -8
  261. data/spec/spec_tests/data/client_side_encryption/explain.yml +1 -8
  262. data/spec/spec_tests/data/client_side_encryption/find.yml +2 -16
  263. data/spec/spec_tests/data/client_side_encryption/findOneAndDelete.yml +1 -8
  264. data/spec/spec_tests/data/client_side_encryption/findOneAndReplace.yml +1 -8
  265. data/spec/spec_tests/data/client_side_encryption/findOneAndUpdate.yml +1 -8
  266. data/spec/spec_tests/data/client_side_encryption/fle2-BypassQueryAnalysis.yml +101 -0
  267. data/spec/spec_tests/data/client_side_encryption/fle2-Compact.yml +80 -0
  268. data/spec/spec_tests/data/client_side_encryption/fle2-CreateCollection.yml +1263 -0
  269. data/spec/spec_tests/data/client_side_encryption/fle2-DecryptExistingData.yml +64 -0
  270. data/spec/spec_tests/data/client_side_encryption/fle2-Delete.yml +107 -0
  271. data/spec/spec_tests/data/client_side_encryption/fle2-EncryptedFields-vs-EncryptedFieldsMap.yml +80 -0
  272. data/spec/spec_tests/data/client_side_encryption/fle2-EncryptedFields-vs-jsonSchema.yml +90 -0
  273. data/spec/spec_tests/data/client_side_encryption/fle2-EncryptedFieldsMap-defaults.yml +57 -0
  274. data/spec/spec_tests/data/client_side_encryption/fle2-FindOneAndUpdate.yml +213 -0
  275. data/spec/spec_tests/data/client_side_encryption/fle2-InsertFind-Indexed.yml +86 -0
  276. data/spec/spec_tests/data/client_side_encryption/fle2-InsertFind-Unindexed.yml +83 -0
  277. data/spec/spec_tests/data/client_side_encryption/fle2-MissingKey.yml +41 -0
  278. data/spec/spec_tests/data/client_side_encryption/fle2-NoEncryption.yml +42 -0
  279. data/spec/spec_tests/data/client_side_encryption/fle2-Update.yml +221 -0
  280. data/spec/spec_tests/data/client_side_encryption/fle2-validatorAndPartialFieldExpression.yml +168 -0
  281. data/spec/spec_tests/data/client_side_encryption/gcpKMS.yml +46 -0
  282. data/spec/spec_tests/data/client_side_encryption/getMore.yml +1 -8
  283. data/spec/spec_tests/data/client_side_encryption/insert.yml +2 -16
  284. data/spec/spec_tests/data/client_side_encryption/keyAltName.yml +1 -8
  285. data/spec/spec_tests/data/client_side_encryption/localKMS.yml +1 -8
  286. data/spec/spec_tests/data/client_side_encryption/localSchema.yml +1 -8
  287. data/spec/spec_tests/data/client_side_encryption/maxWireVersion.yml +2 -0
  288. data/spec/spec_tests/data/client_side_encryption/missingKey.yml +2 -9
  289. data/spec/spec_tests/data/client_side_encryption/noSchema.yml +39 -0
  290. data/spec/spec_tests/data/client_side_encryption/replaceOne.yml +1 -8
  291. data/spec/spec_tests/data/client_side_encryption/types.yml +44 -70
  292. data/spec/spec_tests/data/client_side_encryption/updateMany.yml +1 -8
  293. data/spec/spec_tests/data/client_side_encryption/updateOne.yml +1 -8
  294. data/spec/spec_tests/data/collection_management/clustered-indexes.yml +135 -0
  295. data/spec/spec_tests/data/collection_management/createCollection-pre_and_post_images.yml +50 -0
  296. data/spec/spec_tests/data/collection_management/modifyCollection-pre_and_post_images.yml +58 -0
  297. data/spec/spec_tests/data/command_monitoring_unified/pre-42-server-connection-id.yml +56 -0
  298. data/spec/spec_tests/data/command_monitoring_unified/server-connection-id.yml +56 -0
  299. data/spec/spec_tests/data/crud/read/aggregate-collation.yml +1 -1
  300. data/spec/spec_tests/data/crud/read/count-collation.yml +1 -1
  301. data/spec/spec_tests/data/crud/read/distinct-collation.yml +1 -1
  302. data/spec/spec_tests/data/crud/read/find-collation.yml +1 -1
  303. data/spec/spec_tests/data/crud/write/bulkWrite-collation.yml +1 -1
  304. data/spec/spec_tests/data/crud/write/deleteMany-collation.yml +1 -1
  305. data/spec/spec_tests/data/crud/write/deleteOne-collation.yml +1 -1
  306. data/spec/spec_tests/data/crud/write/findOneAndDelete-collation.yml +1 -1
  307. data/spec/spec_tests/data/crud/write/findOneAndReplace-collation.yml +1 -1
  308. data/spec/spec_tests/data/crud/write/findOneAndUpdate-collation.yml +1 -1
  309. data/spec/spec_tests/data/crud/write/replaceOne-collation.yml +1 -1
  310. data/spec/spec_tests/data/crud/write/updateMany-collation.yml +1 -1
  311. data/spec/spec_tests/data/crud/write/updateOne-collation.yml +1 -1
  312. data/spec/spec_tests/data/crud_unified/aggregate-allowdiskuse.yml +75 -0
  313. data/spec/spec_tests/data/crud_unified/aggregate-merge.yml +185 -0
  314. data/spec/spec_tests/data/crud_unified/aggregate-out-readConcern.yml +171 -0
  315. data/spec/spec_tests/data/crud_unified/aggregate.yml +215 -0
  316. data/spec/spec_tests/data/crud_unified/bulkWrite-arrayFilters-clientError.yml +98 -0
  317. data/spec/spec_tests/data/crud_unified/bulkWrite-arrayFilters.yml +174 -0
  318. data/spec/spec_tests/data/crud_unified/bulkWrite-comment.yml +189 -0
  319. data/spec/spec_tests/data/crud_unified/bulkWrite-delete-hint-clientError.yml +113 -0
  320. data/spec/spec_tests/data/crud_unified/bulkWrite-delete-hint-serverError.yml +142 -0
  321. data/spec/spec_tests/data/crud_unified/bulkWrite-delete-hint.yml +154 -0
  322. data/spec/spec_tests/data/crud_unified/bulkWrite-deleteMany-hint-unacknowledged.yml +98 -0
  323. data/spec/spec_tests/data/crud_unified/bulkWrite-deleteMany-let.yml +86 -0
  324. data/spec/spec_tests/data/crud_unified/bulkWrite-deleteOne-hint-unacknowledged.yml +97 -0
  325. data/spec/spec_tests/data/crud_unified/bulkWrite-deleteOne-let.yml +86 -0
  326. data/spec/spec_tests/data/crud_unified/bulkWrite-insertOne-dots_and_dollars.yml +138 -0
  327. data/spec/spec_tests/data/crud_unified/bulkWrite-replaceOne-dots_and_dollars.yml +165 -0
  328. data/spec/spec_tests/data/crud_unified/bulkWrite-replaceOne-hint-unacknowledged.yml +103 -0
  329. data/spec/spec_tests/data/crud_unified/bulkWrite-replaceOne-let.yml +93 -0
  330. data/spec/spec_tests/data/crud_unified/bulkWrite-update-hint-clientError.yml +148 -0
  331. data/spec/spec_tests/data/crud_unified/bulkWrite-update-hint-serverError.yml +239 -0
  332. data/spec/spec_tests/data/crud_unified/bulkWrite-update-hint.yml +256 -0
  333. data/spec/spec_tests/data/crud_unified/bulkWrite-update-validation.yml +73 -0
  334. data/spec/spec_tests/data/crud_unified/bulkWrite-updateMany-dots_and_dollars.yml +150 -0
  335. data/spec/spec_tests/data/crud_unified/bulkWrite-updateMany-hint-unacknowledged.yml +104 -0
  336. data/spec/spec_tests/data/crud_unified/bulkWrite-updateMany-let.yml +96 -0
  337. data/spec/spec_tests/data/crud_unified/bulkWrite-updateOne-dots_and_dollars.yml +150 -0
  338. data/spec/spec_tests/data/crud_unified/bulkWrite-updateOne-hint-unacknowledged.yml +103 -0
  339. data/spec/spec_tests/data/crud_unified/bulkWrite-updateOne-let.yml +95 -0
  340. data/spec/spec_tests/data/crud_unified/countDocuments-comment.yml +92 -0
  341. data/spec/spec_tests/data/crud_unified/db-aggregate.yml +73 -0
  342. data/spec/spec_tests/data/crud_unified/deleteMany-comment.yml +97 -0
  343. data/spec/spec_tests/data/crud_unified/deleteMany-hint-clientError.yml +87 -0
  344. data/spec/spec_tests/data/crud_unified/deleteMany-hint-serverError.yml +107 -0
  345. data/spec/spec_tests/data/crud_unified/deleteMany-hint-unacknowledged.yml +90 -0
  346. data/spec/spec_tests/data/crud_unified/deleteMany-hint.yml +99 -0
  347. data/spec/spec_tests/data/crud_unified/deleteMany-let.yml +2 -0
  348. data/spec/spec_tests/data/crud_unified/deleteOne-comment.yml +98 -0
  349. data/spec/spec_tests/data/crud_unified/deleteOne-hint-clientError.yml +80 -0
  350. data/spec/spec_tests/data/crud_unified/deleteOne-hint-serverError.yml +100 -0
  351. data/spec/spec_tests/data/crud_unified/deleteOne-hint-unacknowledged.yml +89 -0
  352. data/spec/spec_tests/data/crud_unified/deleteOne-hint.yml +95 -0
  353. data/spec/spec_tests/data/crud_unified/deleteOne-let.yml +2 -0
  354. data/spec/spec_tests/data/crud_unified/estimatedDocumentCount-comment.yml +95 -0
  355. data/spec/spec_tests/data/crud_unified/estimatedDocumentCount.yml +5 -135
  356. data/spec/spec_tests/data/crud_unified/find-allowdiskuse-clientError.yml +55 -0
  357. data/spec/spec_tests/data/crud_unified/find-allowdiskuse-serverError.yml +68 -0
  358. data/spec/spec_tests/data/crud_unified/find-allowdiskuse.yml +79 -0
  359. data/spec/spec_tests/data/crud_unified/find-comment.yml +166 -0
  360. data/spec/spec_tests/data/crud_unified/find.yml +68 -0
  361. data/spec/spec_tests/data/crud_unified/findOneAndDelete-comment.yml +96 -0
  362. data/spec/spec_tests/data/crud_unified/findOneAndDelete-hint-clientError.yml +91 -0
  363. data/spec/spec_tests/data/crud_unified/findOneAndDelete-hint-serverError.yml +107 -0
  364. data/spec/spec_tests/data/crud_unified/findOneAndDelete-hint-unacknowledged.yml +88 -0
  365. data/spec/spec_tests/data/crud_unified/findOneAndDelete-hint.yml +102 -0
  366. data/spec/spec_tests/data/crud_unified/findOneAndDelete-let.yml +2 -4
  367. data/spec/spec_tests/data/crud_unified/findOneAndReplace-comment.yml +101 -0
  368. data/spec/spec_tests/data/crud_unified/findOneAndReplace-dots_and_dollars.yml +140 -0
  369. data/spec/spec_tests/data/crud_unified/findOneAndReplace-hint-clientError.yml +83 -0
  370. data/spec/spec_tests/data/crud_unified/findOneAndReplace-hint-serverError.yml +99 -0
  371. data/spec/spec_tests/data/crud_unified/findOneAndReplace-hint-unacknowledged.yml +96 -0
  372. data/spec/spec_tests/data/crud_unified/findOneAndReplace-hint.yml +98 -0
  373. data/spec/spec_tests/data/crud_unified/findOneAndUpdate-comment.yml +95 -0
  374. data/spec/spec_tests/data/crud_unified/findOneAndUpdate-dots_and_dollars.yml +127 -0
  375. data/spec/spec_tests/data/crud_unified/findOneAndUpdate-hint-clientError.yml +84 -0
  376. data/spec/spec_tests/data/crud_unified/findOneAndUpdate-hint-serverError.yml +100 -0
  377. data/spec/spec_tests/data/crud_unified/findOneAndUpdate-hint-unacknowledged.yml +92 -0
  378. data/spec/spec_tests/data/crud_unified/findOneAndUpdate-hint.yml +99 -0
  379. data/spec/spec_tests/data/crud_unified/insertMany-comment.yml +93 -0
  380. data/spec/spec_tests/data/crud_unified/insertMany-dots_and_dollars.yml +128 -0
  381. data/spec/spec_tests/data/crud_unified/insertOne-comment.yml +91 -0
  382. data/spec/spec_tests/data/crud_unified/insertOne-dots_and_dollars.yml +238 -0
  383. data/spec/spec_tests/data/crud_unified/replaceOne-comment.yml +105 -0
  384. data/spec/spec_tests/data/crud_unified/replaceOne-dots_and_dollars.yml +180 -0
  385. data/spec/spec_tests/data/crud_unified/replaceOne-hint-unacknowledged.yml +95 -0
  386. data/spec/spec_tests/data/crud_unified/replaceOne-hint.yml +108 -0
  387. data/spec/spec_tests/data/crud_unified/replaceOne-let.yml +98 -0
  388. data/spec/spec_tests/data/crud_unified/replaceOne-validation.yml +37 -0
  389. data/spec/spec_tests/data/crud_unified/updateMany-comment.yml +104 -0
  390. data/spec/spec_tests/data/crud_unified/updateMany-dots_and_dollars.yml +138 -0
  391. data/spec/spec_tests/data/crud_unified/updateMany-hint-clientError.yml +91 -0
  392. data/spec/spec_tests/data/crud_unified/updateMany-hint-serverError.yml +115 -0
  393. data/spec/spec_tests/data/crud_unified/updateMany-hint-unacknowledged.yml +96 -0
  394. data/spec/spec_tests/data/crud_unified/updateMany-hint.yml +115 -0
  395. data/spec/spec_tests/data/crud_unified/updateMany-let.yml +5 -1
  396. data/spec/spec_tests/data/crud_unified/updateMany-validation.yml +39 -0
  397. data/spec/spec_tests/data/crud_unified/updateOne-comment.yml +104 -0
  398. data/spec/spec_tests/data/crud_unified/updateOne-dots_and_dollars.yml +138 -0
  399. data/spec/spec_tests/data/crud_unified/updateOne-hint-clientError.yml +85 -0
  400. data/spec/spec_tests/data/crud_unified/updateOne-hint-serverError.yml +109 -0
  401. data/spec/spec_tests/data/crud_unified/updateOne-hint-unacknowledged.yml +95 -0
  402. data/spec/spec_tests/data/crud_unified/updateOne-hint.yml +109 -0
  403. data/spec/spec_tests/data/crud_unified/updateOne-let.yml +5 -1
  404. data/spec/spec_tests/data/crud_unified/updateOne-validation.yml +37 -0
  405. data/spec/spec_tests/data/crud_unified/updateWithPipelines.yml +8 -14
  406. data/spec/spec_tests/data/retryable_reads/{aggregate-merge.yml → legacy/aggregate-merge.yml} +0 -0
  407. data/spec/spec_tests/data/retryable_reads/{aggregate-serverErrors.yml → legacy/aggregate-serverErrors.yml} +0 -0
  408. data/spec/spec_tests/data/retryable_reads/{aggregate.yml → legacy/aggregate.yml} +0 -0
  409. data/spec/spec_tests/data/retryable_reads/{changeStreams-client.watch-serverErrors.yml → legacy/changeStreams-client.watch-serverErrors.yml} +0 -0
  410. data/spec/spec_tests/data/retryable_reads/{changeStreams-client.watch.yml → legacy/changeStreams-client.watch.yml} +0 -0
  411. data/spec/spec_tests/data/retryable_reads/{changeStreams-db.coll.watch-serverErrors.yml → legacy/changeStreams-db.coll.watch-serverErrors.yml} +0 -0
  412. data/spec/spec_tests/data/retryable_reads/{changeStreams-db.coll.watch.yml → legacy/changeStreams-db.coll.watch.yml} +0 -0
  413. data/spec/spec_tests/data/retryable_reads/{changeStreams-db.watch-serverErrors.yml → legacy/changeStreams-db.watch-serverErrors.yml} +0 -0
  414. data/spec/spec_tests/data/retryable_reads/{changeStreams-db.watch.yml → legacy/changeStreams-db.watch.yml} +0 -0
  415. data/spec/spec_tests/data/retryable_reads/{count-serverErrors.yml → legacy/count-serverErrors.yml} +0 -0
  416. data/spec/spec_tests/data/retryable_reads/{count.yml → legacy/count.yml} +0 -0
  417. data/spec/spec_tests/data/retryable_reads/{countDocuments-serverErrors.yml → legacy/countDocuments-serverErrors.yml} +0 -0
  418. data/spec/spec_tests/data/retryable_reads/{countDocuments.yml → legacy/countDocuments.yml} +0 -0
  419. data/spec/spec_tests/data/retryable_reads/{distinct-serverErrors.yml → legacy/distinct-serverErrors.yml} +0 -0
  420. data/spec/spec_tests/data/retryable_reads/{distinct.yml → legacy/distinct.yml} +0 -0
  421. data/spec/spec_tests/data/retryable_reads/{estimatedDocumentCount-serverErrors-pre4.9.yml → legacy/estimatedDocumentCount-serverErrors.yml} +0 -2
  422. data/spec/spec_tests/data/retryable_reads/{estimatedDocumentCount-pre4.9.yml → legacy/estimatedDocumentCount.yml} +0 -2
  423. data/spec/spec_tests/data/retryable_reads/{find-serverErrors.yml → legacy/find-serverErrors.yml} +0 -0
  424. data/spec/spec_tests/data/retryable_reads/{find.yml → legacy/find.yml} +0 -0
  425. data/spec/spec_tests/data/retryable_reads/{findOne-serverErrors.yml → legacy/findOne-serverErrors.yml} +0 -0
  426. data/spec/spec_tests/data/retryable_reads/{findOne.yml → legacy/findOne.yml} +0 -0
  427. data/spec/spec_tests/data/retryable_reads/{gridfs-download-serverErrors.yml → legacy/gridfs-download-serverErrors.yml} +0 -0
  428. data/spec/spec_tests/data/retryable_reads/{gridfs-download.yml → legacy/gridfs-download.yml} +0 -0
  429. data/spec/spec_tests/data/retryable_reads/{gridfs-downloadByName-serverErrors.yml → legacy/gridfs-downloadByName-serverErrors.yml} +0 -0
  430. data/spec/spec_tests/data/retryable_reads/{gridfs-downloadByName.yml → legacy/gridfs-downloadByName.yml} +0 -0
  431. data/spec/spec_tests/data/retryable_reads/{listCollectionNames-serverErrors.yml → legacy/listCollectionNames-serverErrors.yml} +0 -0
  432. data/spec/spec_tests/data/retryable_reads/{listCollectionNames.yml → legacy/listCollectionNames.yml} +0 -0
  433. data/spec/spec_tests/data/retryable_reads/{listCollectionObjects-serverErrors.yml → legacy/listCollectionObjects-serverErrors.yml} +0 -0
  434. data/spec/spec_tests/data/retryable_reads/{listCollectionObjects.yml → legacy/listCollectionObjects.yml} +0 -0
  435. data/spec/spec_tests/data/retryable_reads/{listCollections-serverErrors.yml → legacy/listCollections-serverErrors.yml} +0 -0
  436. data/spec/spec_tests/data/retryable_reads/{listCollections.yml → legacy/listCollections.yml} +0 -0
  437. data/spec/spec_tests/data/retryable_reads/{listDatabaseNames-serverErrors.yml → legacy/listDatabaseNames-serverErrors.yml} +0 -0
  438. data/spec/spec_tests/data/retryable_reads/{listDatabaseNames.yml → legacy/listDatabaseNames.yml} +0 -0
  439. data/spec/spec_tests/data/retryable_reads/{listDatabaseObjects-serverErrors.yml → legacy/listDatabaseObjects-serverErrors.yml} +0 -0
  440. data/spec/spec_tests/data/retryable_reads/{listDatabaseObjects.yml → legacy/listDatabaseObjects.yml} +0 -0
  441. data/spec/spec_tests/data/retryable_reads/{listDatabases-serverErrors.yml → legacy/listDatabases-serverErrors.yml} +0 -0
  442. data/spec/spec_tests/data/retryable_reads/{listDatabases.yml → legacy/listDatabases.yml} +0 -0
  443. data/spec/spec_tests/data/retryable_reads/{listIndexNames-serverErrors.yml → legacy/listIndexNames-serverErrors.yml} +0 -0
  444. data/spec/spec_tests/data/retryable_reads/{listIndexNames.yml → legacy/listIndexNames.yml} +0 -0
  445. data/spec/spec_tests/data/retryable_reads/{listIndexes-serverErrors.yml → legacy/listIndexes-serverErrors.yml} +0 -0
  446. data/spec/spec_tests/data/retryable_reads/{listIndexes.yml → legacy/listIndexes.yml} +0 -0
  447. data/spec/spec_tests/data/retryable_reads/{mapReduce.yml → legacy/mapReduce.yml} +0 -0
  448. data/spec/spec_tests/data/retryable_reads/unified/handshakeError.yml +129 -0
  449. data/spec/spec_tests/data/retryable_writes/{bulkWrite-errorLabels.yml → legacy/bulkWrite-errorLabels.yml} +0 -0
  450. data/spec/spec_tests/data/retryable_writes/{bulkWrite-serverErrors.yml → legacy/bulkWrite-serverErrors.yml} +1 -1
  451. data/spec/spec_tests/data/retryable_writes/{bulkWrite.yml → legacy/bulkWrite.yml} +0 -0
  452. data/spec/spec_tests/data/retryable_writes/{deleteMany.yml → legacy/deleteMany.yml} +0 -0
  453. data/spec/spec_tests/data/retryable_writes/{deleteOne-errorLabels.yml → legacy/deleteOne-errorLabels.yml} +0 -0
  454. data/spec/spec_tests/data/retryable_writes/{deleteOne-serverErrors.yml → legacy/deleteOne-serverErrors.yml} +1 -1
  455. data/spec/spec_tests/data/retryable_writes/{deleteOne.yml → legacy/deleteOne.yml} +0 -0
  456. data/spec/spec_tests/data/retryable_writes/{findOneAndDelete-errorLabels.yml → legacy/findOneAndDelete-errorLabels.yml} +0 -0
  457. data/spec/spec_tests/data/retryable_writes/{findOneAndDelete-serverErrors.yml → legacy/findOneAndDelete-serverErrors.yml} +1 -1
  458. data/spec/spec_tests/data/retryable_writes/{findOneAndDelete.yml → legacy/findOneAndDelete.yml} +0 -0
  459. data/spec/spec_tests/data/retryable_writes/{findOneAndReplace-errorLabels.yml → legacy/findOneAndReplace-errorLabels.yml} +0 -0
  460. data/spec/spec_tests/data/retryable_writes/{findOneAndReplace-serverErrors.yml → legacy/findOneAndReplace-serverErrors.yml} +1 -1
  461. data/spec/spec_tests/data/retryable_writes/{findOneAndReplace.yml → legacy/findOneAndReplace.yml} +0 -0
  462. data/spec/spec_tests/data/retryable_writes/{findOneAndUpdate-errorLabels.yml → legacy/findOneAndUpdate-errorLabels.yml} +0 -0
  463. data/spec/spec_tests/data/retryable_writes/{findOneAndUpdate-serverErrors.yml → legacy/findOneAndUpdate-serverErrors.yml} +1 -1
  464. data/spec/spec_tests/data/retryable_writes/{findOneAndUpdate.yml → legacy/findOneAndUpdate.yml} +0 -0
  465. data/spec/spec_tests/data/retryable_writes/{insertMany-errorLabels.yml → legacy/insertMany-errorLabels.yml} +0 -0
  466. data/spec/spec_tests/data/retryable_writes/{insertMany-serverErrors.yml → legacy/insertMany-serverErrors.yml} +1 -1
  467. data/spec/spec_tests/data/retryable_writes/{insertMany.yml → legacy/insertMany.yml} +0 -0
  468. data/spec/spec_tests/data/retryable_writes/{insertOne-errorLabels.yml → legacy/insertOne-errorLabels.yml} +0 -0
  469. data/spec/spec_tests/data/retryable_writes/{insertOne-serverErrors.yml → legacy/insertOne-serverErrors.yml} +5 -5
  470. data/spec/spec_tests/data/retryable_writes/{insertOne.yml → legacy/insertOne.yml} +0 -0
  471. data/spec/spec_tests/data/retryable_writes/{replaceOne-errorLabels.yml → legacy/replaceOne-errorLabels.yml} +0 -0
  472. data/spec/spec_tests/data/retryable_writes/{replaceOne-serverErrors.yml → legacy/replaceOne-serverErrors.yml} +1 -1
  473. data/spec/spec_tests/data/retryable_writes/{replaceOne.yml → legacy/replaceOne.yml} +0 -0
  474. data/spec/spec_tests/data/retryable_writes/{updateMany.yml → legacy/updateMany.yml} +0 -0
  475. data/spec/spec_tests/data/retryable_writes/{updateOne-errorLabels.yml → legacy/updateOne-errorLabels.yml} +0 -0
  476. data/spec/spec_tests/data/retryable_writes/{updateOne-serverErrors.yml → legacy/updateOne-serverErrors.yml} +1 -1
  477. data/spec/spec_tests/data/retryable_writes/{updateOne.yml → legacy/updateOne.yml} +0 -0
  478. data/spec/spec_tests/data/retryable_writes/unified/bulkWrite-serverErrors.yml +96 -0
  479. data/spec/spec_tests/data/retryable_writes/unified/handshakeError.yml +137 -0
  480. data/spec/spec_tests/data/retryable_writes/unified/insertOne-serverErrors.yml +78 -0
  481. data/spec/spec_tests/data/sdam/errors/prefer-error-code.yml +2 -2
  482. data/spec/spec_tests/data/seed_list_discovery/load-balanced/loadBalanced-no-results.yml +5 -0
  483. data/spec/spec_tests/data/seed_list_discovery/load-balanced/srvMaxHosts-conflicts_with_loadBalanced-true-txt.yml +5 -0
  484. data/spec/spec_tests/data/seed_list_discovery/load-balanced/srvMaxHosts-conflicts_with_loadBalanced-true.yml +5 -0
  485. data/spec/spec_tests/data/seed_list_discovery/load-balanced/srvMaxHosts-zero-txt.yml +10 -0
  486. data/spec/spec_tests/data/seed_list_discovery/load-balanced/srvMaxHosts-zero.yml +10 -0
  487. data/spec/spec_tests/data/seed_list_discovery/replica-set/srv-service-name.yml +11 -0
  488. data/spec/spec_tests/data/seed_list_discovery/replica-set/srvMaxHosts-conflicts_with_replicaSet-txt.yml +5 -0
  489. data/spec/spec_tests/data/seed_list_discovery/replica-set/srvMaxHosts-conflicts_with_replicaSet.yml +5 -0
  490. data/spec/spec_tests/data/seed_list_discovery/replica-set/srvMaxHosts-equal_to_srv_records.yml +16 -0
  491. data/spec/spec_tests/data/seed_list_discovery/replica-set/srvMaxHosts-greater_than_srv_records.yml +15 -0
  492. data/spec/spec_tests/data/seed_list_discovery/replica-set/srvMaxHosts-less_than_srv_records.yml +15 -0
  493. data/spec/spec_tests/data/seed_list_discovery/replica-set/srvMaxHosts-zero-txt.yml +15 -0
  494. data/spec/spec_tests/data/seed_list_discovery/replica-set/srvMaxHosts-zero.yml +15 -0
  495. data/spec/spec_tests/data/seed_list_discovery/sharded/srvMaxHosts-equal_to_srv_records.yml +13 -0
  496. data/spec/spec_tests/data/seed_list_discovery/sharded/srvMaxHosts-greater_than_srv_records.yml +12 -0
  497. data/spec/spec_tests/data/seed_list_discovery/sharded/srvMaxHosts-less_than_srv_records.yml +10 -0
  498. data/spec/spec_tests/data/seed_list_discovery/sharded/srvMaxHosts-zero.yml +11 -0
  499. data/spec/spec_tests/data/server_selection/Unknown/read/ghost.yml +11 -0
  500. data/spec/spec_tests/data/server_selection/Unknown/write/ghost.yml +11 -0
  501. data/spec/spec_tests/data/sessions_unified/driver-sessions-server-support.yml +123 -0
  502. data/spec/spec_tests/data/sessions_unified/snapshot-sessions-not-supported-client-error.yml +9 -3
  503. data/spec/spec_tests/data/transactions/error-labels.yml +1 -1
  504. data/spec/spec_tests/data/transactions/errors-client.yml +8 -9
  505. data/spec/spec_tests/data/transactions/mongos-recovery-token.yml +1 -1
  506. data/spec/spec_tests/data/transactions/retryable-abort-errorLabels.yml +0 -2
  507. data/spec/spec_tests/data/transactions/retryable-abort.yml +7 -9
  508. data/spec/spec_tests/data/transactions/retryable-commit-errorLabels.yml +0 -2
  509. data/spec/spec_tests/data/transactions/retryable-commit.yml +7 -9
  510. data/spec/spec_tests/data/transactions/retryable-writes.yml +0 -2
  511. data/spec/spec_tests/data/unified/invalid/expectedEventsForClient-ignoreExtraEvents-type.yml +15 -0
  512. data/spec/spec_tests/data/unified/valid-fail/operation-unsupported.yml +13 -0
  513. data/spec/spec_tests/data/unified/valid-pass/expectedEventsForClient-ignoreExtraEvents.yml +78 -0
  514. data/spec/spec_tests/data/unified/valid-pass/poc-change-streams.yml +4 -1
  515. data/spec/spec_tests/data/unified/valid-pass/poc-command-monitoring.yml +3 -3
  516. data/spec/spec_tests/data/unified/valid-pass/poc-transactions.yml +3 -2
  517. data/spec/spec_tests/data/uri_options/srv-options.yml +96 -0
  518. data/spec/spec_tests/data/versioned_api/crud-api-version-1-strict.yml +6 -4
  519. data/spec/spec_tests/data/versioned_api/crud-api-version-1.yml +7 -5
  520. data/spec/spec_tests/retryable_reads_spec.rb +4 -1
  521. data/spec/spec_tests/retryable_reads_unified_spec.rb +22 -0
  522. data/spec/spec_tests/retryable_writes_spec.rb +4 -1
  523. data/spec/spec_tests/retryable_writes_unified_spec.rb +21 -0
  524. data/spec/spec_tests/seed_list_discovery_spec.rb +10 -1
  525. data/spec/spec_tests/unified_spec.rb +6 -1
  526. data/spec/stress/connection_pool_timing_spec.rb +2 -1
  527. data/spec/stress/fork_reconnect_stress_spec.rb +3 -2
  528. data/spec/support/authorization.rb +1 -1
  529. data/spec/support/certificates/atlas-ocsp-ca.crt +47 -40
  530. data/spec/support/certificates/atlas-ocsp.crt +106 -101
  531. data/spec/support/cluster_tools.rb +1 -1
  532. data/spec/support/common_shortcuts.rb +22 -0
  533. data/spec/support/crypt/corpus/corpus-encrypted.json +9515 -0
  534. data/spec/support/crypt/corpus/corpus-key-aws.json +32 -32
  535. data/spec/support/crypt/corpus/corpus-key-azure.json +33 -0
  536. data/spec/support/crypt/corpus/corpus-key-gcp.json +35 -0
  537. data/spec/support/crypt/corpus/corpus-key-kmip.json +32 -0
  538. data/spec/support/crypt/corpus/corpus-key-local.json +30 -30
  539. data/spec/support/crypt/corpus/corpus-schema.json +4399 -121
  540. data/spec/support/crypt/corpus/corpus.json +4999 -37
  541. data/spec/support/crypt/data_keys/key_document_azure.json +33 -0
  542. data/spec/support/crypt/data_keys/key_document_gcp.json +37 -0
  543. data/spec/support/crypt/data_keys/key_document_kmip.json +32 -0
  544. data/spec/support/crypt/encryptedFields.json +33 -0
  545. data/spec/support/crypt/keys/key1-document.json +30 -0
  546. data/spec/support/crypt/schema_maps/schema_map_azure.json +17 -0
  547. data/spec/support/crypt/schema_maps/schema_map_azure_key_alt_names.json +12 -0
  548. data/spec/support/crypt/schema_maps/schema_map_gcp.json +17 -0
  549. data/spec/support/crypt/schema_maps/schema_map_gcp_key_alt_names.json +12 -0
  550. data/spec/support/crypt/schema_maps/schema_map_kmip.json +17 -0
  551. data/spec/support/crypt/schema_maps/schema_map_kmip_key_alt_names.json +12 -0
  552. data/spec/support/crypt.rb +207 -6
  553. data/spec/support/macros.rb +18 -0
  554. data/spec/support/mongos_macros.rb +17 -0
  555. data/spec/support/shared/scram_conversation.rb +2 -1
  556. data/spec/support/shared/session.rb +13 -7
  557. data/spec/support/spec_config.rb +82 -1
  558. data/spec/support/utils.rb +25 -4
  559. data.tar.gz.sig +0 -0
  560. metadata +1468 -1214
  561. metadata.gz.sig +0 -0
  562. data/lib/mongo/operation/delete/legacy.rb +0 -64
  563. data/lib/mongo/operation/insert/legacy.rb +0 -68
  564. data/lib/mongo/operation/update/legacy/result.rb +0 -112
  565. data/lib/mongo/operation/update/legacy.rb +0 -76
  566. data/spec/mongo/dbref_spec.rb +0 -152
  567. data/spec/mongo/operation/kill_cursors_spec.rb +0 -47
  568. data/spec/spec_tests/change_streams_spec.rb +0 -93
  569. data/spec/spec_tests/data/change_streams/change-streams-errors.yml +0 -101
  570. data/spec/spec_tests/data/change_streams/change-streams-resume-allowlist.yml +0 -1173
  571. data/spec/spec_tests/data/change_streams/change-streams-resume-errorLabels.yml +0 -1105
  572. data/spec/spec_tests/data/change_streams/change-streams.yml +0 -535
  573. data/spec/spec_tests/data/crud_v2/aggregate-merge.yml +0 -103
  574. data/spec/spec_tests/data/crud_v2/aggregate-out-readConcern.yml +0 -111
  575. data/spec/spec_tests/data/crud_v2/bulkWrite-arrayFilters.yml +0 -103
  576. data/spec/spec_tests/data/crud_v2/bulkWrite-delete-hint-clientError.yml +0 -63
  577. data/spec/spec_tests/data/crud_v2/bulkWrite-delete-hint-serverError.yml +0 -92
  578. data/spec/spec_tests/data/crud_v2/bulkWrite-delete-hint.yml +0 -103
  579. data/spec/spec_tests/data/crud_v2/bulkWrite-update-hint-clientError.yml +0 -90
  580. data/spec/spec_tests/data/crud_v2/bulkWrite-update-hint-serverError.yml +0 -147
  581. data/spec/spec_tests/data/crud_v2/bulkWrite-update-hint.yml +0 -164
  582. data/spec/spec_tests/data/crud_v2/db-aggregate.yml +0 -39
  583. data/spec/spec_tests/data/crud_v2/deleteMany-hint-clientError.yml +0 -43
  584. data/spec/spec_tests/data/crud_v2/deleteMany-hint-serverError.yml +0 -62
  585. data/spec/spec_tests/data/crud_v2/deleteMany-hint.yml +0 -58
  586. data/spec/spec_tests/data/crud_v2/deleteOne-hint-clientError.yml +0 -41
  587. data/spec/spec_tests/data/crud_v2/deleteOne-hint-serverError.yml +0 -60
  588. data/spec/spec_tests/data/crud_v2/deleteOne-hint.yml +0 -57
  589. data/spec/spec_tests/data/crud_v2/find-allowdiskuse-clientError.yml +0 -28
  590. data/spec/spec_tests/data/crud_v2/find-allowdiskuse-serverError.yml +0 -44
  591. data/spec/spec_tests/data/crud_v2/find-allowdiskuse.yml +0 -50
  592. data/spec/spec_tests/data/crud_v2/findOneAndDelete-hint-clientError.yml +0 -45
  593. data/spec/spec_tests/data/crud_v2/findOneAndDelete-hint-serverError.yml +0 -60
  594. data/spec/spec_tests/data/crud_v2/findOneAndDelete-hint.yml +0 -56
  595. data/spec/spec_tests/data/crud_v2/findOneAndReplace-hint-clientError.yml +0 -40
  596. data/spec/spec_tests/data/crud_v2/findOneAndReplace-hint-serverError.yml +0 -59
  597. data/spec/spec_tests/data/crud_v2/findOneAndReplace-hint.yml +0 -55
  598. data/spec/spec_tests/data/crud_v2/findOneAndUpdate-hint-clientError.yml +0 -40
  599. data/spec/spec_tests/data/crud_v2/findOneAndUpdate-hint-serverError.yml +0 -58
  600. data/spec/spec_tests/data/crud_v2/findOneAndUpdate-hint.yml +0 -55
  601. data/spec/spec_tests/data/crud_v2/replaceOne-hint.yml +0 -61
  602. data/spec/spec_tests/data/crud_v2/unacknowledged-bulkWrite-delete-hint-clientError.yml +0 -60
  603. data/spec/spec_tests/data/crud_v2/unacknowledged-bulkWrite-update-hint-clientError.yml +0 -88
  604. data/spec/spec_tests/data/crud_v2/unacknowledged-deleteMany-hint-clientError.yml +0 -40
  605. data/spec/spec_tests/data/crud_v2/unacknowledged-deleteOne-hint-clientError.yml +0 -38
  606. data/spec/spec_tests/data/crud_v2/unacknowledged-findOneAndDelete-hint-clientError.yml +0 -42
  607. data/spec/spec_tests/data/crud_v2/unacknowledged-findOneAndReplace-hint-clientError.yml +0 -40
  608. data/spec/spec_tests/data/crud_v2/unacknowledged-findOneAndUpdate-hint-clientError.yml +0 -40
  609. data/spec/spec_tests/data/crud_v2/unacknowledged-replaceOne-hint-clientError.yml +0 -40
  610. data/spec/spec_tests/data/crud_v2/unacknowledged-updateMany-hint-clientError.yml +0 -43
  611. data/spec/spec_tests/data/crud_v2/unacknowledged-updateOne-hint-clientError.yml +0 -40
  612. data/spec/spec_tests/data/crud_v2/updateMany-hint-clientError.yml +0 -45
  613. data/spec/spec_tests/data/crud_v2/updateMany-hint-serverError.yml +0 -66
  614. data/spec/spec_tests/data/crud_v2/updateMany-hint.yml +0 -65
  615. data/spec/spec_tests/data/crud_v2/updateOne-hint-clientError.yml +0 -43
  616. data/spec/spec_tests/data/crud_v2/updateOne-hint-serverError.yml +0 -62
  617. data/spec/spec_tests/data/crud_v2/updateOne-hint.yml +0 -61
  618. data/spec/spec_tests/data/crud_v2/updateWithPipelines.yml +0 -157
  619. data/spec/spec_tests/data/retryable_reads/estimatedDocumentCount-4.9.yml +0 -60
  620. data/spec/spec_tests/data/retryable_reads/estimatedDocumentCount-serverErrors-4.9.yml +0 -146
  621. data/spec/support/crypt/corpus/corpus_encrypted.json +0 -4152
  622. data/spec/support/session_registry.rb +0 -55
@@ -274,7 +274,14 @@ module Mongo
274
274
 
275
275
  def create_collection(database, context)
276
276
  opts = transformed_options(context)
277
- database[arguments.fetch('collection')].create(session: opts[:session])
277
+ database[arguments.fetch('collection')]
278
+ .create(
279
+ {
280
+ session: opts[:session],
281
+ encrypted_fields: opts[:encrypted_fields],
282
+ validator: opts[:validator],
283
+ }.compact
284
+ )
278
285
  end
279
286
 
280
287
  def rename(collection, context)
@@ -285,11 +292,13 @@ module Mongo
285
292
  end
286
293
 
287
294
  def drop(collection, context)
288
- collection.drop
295
+ opts = transformed_options(context)
296
+ collection.drop(encrypted_fields: opts[:encrypted_fields])
289
297
  end
290
298
 
291
299
  def drop_collection(database, context)
292
- database[arguments.fetch('collection')].drop
300
+ opts = transformed_options(context)
301
+ database[arguments.fetch('collection')].drop(encrypted_fields: opts[:encrypted_fields])
293
302
  end
294
303
 
295
304
  def create_index(collection, context)
@@ -75,11 +75,11 @@ module Mongo
75
75
  def satisfied?
76
76
  cc = ClusterConfig.instance
77
77
  ok = true
78
- if short_min_server_version
79
- ok &&= cc.fcv_ish >= short_min_server_version
78
+ if min_server_version
79
+ ok &&= Gem::Version.new(cc.fcv_ish) >= Gem::Version.new(min_server_version)
80
80
  end
81
81
  if max_server_version
82
- ok &&= cc.short_server_version <= max_server_version
82
+ ok &&= Gem::Version.new(cc.server_version) <= Gem::Version.new(max_server_version)
83
83
  end
84
84
  if topologies
85
85
  ok &&= topologies.include?(cc.topology)
@@ -20,6 +20,7 @@ module Mongo
20
20
  # Introduced with Client-Side Encryption tests
21
21
  @json_schema = BSON::ExtJSON.parse_obj(@spec['json_schema'])
22
22
  @key_vault_data = BSON::ExtJSON.parse_obj(@spec['key_vault_data'])
23
+ @encrypted_fields = BSON::ExtJSON.parse_obj(@spec['encrypted_fields'])
23
24
 
24
25
  @requirements = if run_on = @spec['runOn']
25
26
  run_on.map do |spec|
@@ -46,6 +47,10 @@ module Mongo
46
47
  # running each test.
47
48
  attr_reader :key_vault_data
48
49
 
50
+ # @return [ Hash ] An encryptedFields option that should be set on the
51
+ # collection (using createCollection) before each test run.
52
+ attr_reader :encrypted_fields
53
+
49
54
  def collection_name
50
55
  # Older spec tests do not specify a collection name, thus
51
56
  # we provide a default here
@@ -159,6 +159,12 @@ EOT
159
159
  verify_hash_items_equal(expected, actual, k)
160
160
  end
161
161
  end
162
+ when Array
163
+ expect(actual).to be_a(Array)
164
+ expect(actual.size).to eq(expected.size)
165
+ expected.zip(actual).each do |pair|
166
+ verify_result(pair.first, pair.last)
167
+ end
162
168
  else
163
169
  expect(actual).to eq(expected)
164
170
  end
@@ -22,6 +22,7 @@ module Mongo
22
22
  #
23
23
  # @since 2.6.0
24
24
  class TransactionsTest < CRUD::CRUDTestBase
25
+ include MongosMacros
25
26
 
26
27
  attr_reader :expected_results
27
28
  attr_reader :skip_reason
@@ -42,7 +43,7 @@ module Mongo
42
43
  def initialize(crud_spec, data, test)
43
44
  test = IceNine.deep_freeze(test)
44
45
  @spec = crud_spec
45
- @data = data
46
+ @data = data || []
46
47
  @description = test['description']
47
48
  @client_options = {
48
49
  # Disable legacy read & write retries, so that when spec tests
@@ -232,19 +233,37 @@ module Mongo
232
233
  end
233
234
  end
234
235
 
236
+ key_vault_coll = support_client
237
+ .use(:keyvault)[:datakeys]
238
+ .with(write: { w: :majority })
239
+
240
+ key_vault_coll.drop
235
241
  # Insert data into the key vault collection if required to do so by
236
242
  # the tests.
237
243
  if @spec.key_vault_data && !@spec.key_vault_data.empty?
238
- key_vault_coll = support_client
239
- .use(:admin)[:datakeys]
240
- .with(write: { w: :majority })
241
-
242
- key_vault_coll.drop
243
244
  key_vault_coll.insert_many(@spec.key_vault_data)
244
245
  end
245
246
 
247
+ if @spec.encrypted_fields
248
+ encrypted_fields = @spec.encrypted_fields.dup
249
+ # This code MUST be removed as soon as server starts accepting
250
+ # contention as int32.
251
+ if encrypted_fields.key?('fields')
252
+ encrypted_fields['fields'] = encrypted_fields['fields'].dup.map do |field|
253
+ if field['queries'] && field['queries'].key?('contention')
254
+ new_field = field.dup
255
+ new_field['queries'] = field['queries'].dup
256
+ new_field['queries']['contention'] = BSON::Int64.new(field['queries']['contention'])
257
+ new_field
258
+ else
259
+ field
260
+ end
261
+ end
262
+ end
263
+ # End of code to be removed
264
+ end
246
265
  coll = support_client[@spec.collection_name].with(write: { w: :majority })
247
- coll.drop
266
+ coll.drop(encrypted_fields: encrypted_fields)
248
267
 
249
268
  # Place a jsonSchema validator on the collection if required to do so
250
269
  # by the tests.
@@ -254,19 +273,19 @@ module Mongo
254
273
  {}
255
274
  end
256
275
 
257
- support_client.command(
276
+ create_collection_spec = {
258
277
  create: @spec.collection_name,
259
278
  validator: collection_validator,
260
279
  writeConcern: { w: 'majority' }
261
- )
280
+ }
281
+
282
+ create_collection_spec[:encryptedFields] = encrypted_fields if encrypted_fields
283
+ support_client.command(create_collection_spec)
262
284
 
263
285
  coll.insert_many(@data) unless @data.empty?
264
286
 
265
- $distinct_ran ||= {}
266
- $distinct_ran[@spec.database_name] ||= if description =~ /distinct/ || @operations.any? { |op| op.name == 'distinct' }
267
- ::Utils.mongos_each_direct_client do |direct_client|
268
- direct_client.use(@spec.database_name)['test'].distinct('foo').to_a
269
- end
287
+ if description =~ /distinct/ || @operations.any? { |op| op.name == 'distinct' }
288
+ run_mongos_distincts(@spec.database_name, 'test')
270
289
  end
271
290
 
272
291
  admin_support_client.command(@fail_point_command) if @fail_point_command
@@ -20,6 +20,7 @@ require 'runners/transactions/spec'
20
20
  require 'runners/transactions/test'
21
21
 
22
22
  def define_transactions_spec_tests(test_paths)
23
+ config_override :validate_update_replace, true
23
24
 
24
25
  test_paths.each do |file|
25
26
 
@@ -51,16 +52,18 @@ def define_transactions_spec_tests(test_paths)
51
52
  end
52
53
  end
53
54
 
54
- before(:all) do
55
- if req.satisfied?
56
- test.setup_test
55
+ unless req.satisfied?
56
+ before(:all) do
57
+ skip "Requirements not satisfied"
57
58
  end
58
59
  end
59
60
 
61
+ before(:all) do
62
+ test.setup_test
63
+ end
64
+
60
65
  after(:all) do
61
- if req.satisfied?
62
- test.teardown_test
63
- end
66
+ test.teardown_test
64
67
  end
65
68
 
66
69
  let(:results) do
@@ -51,6 +51,31 @@ module Unified
51
51
  end
52
52
  end
53
53
 
54
+ %w(acknowledged).each do |k|
55
+ expected_v = expected.use(k)
56
+ next unless expected_v
57
+ actual_v = case actual
58
+ when Mongo::BulkWrite::Result, Mongo::Operation::Result
59
+ if Hash === expected_v && expected_v.keys == %w($$unsetOrMatches)
60
+ expected_v = expected_v.values.first
61
+ end
62
+ actual.send("#{k}?")
63
+ else
64
+ actual[k]
65
+ end
66
+ if expected_v
67
+ if expected_v.empty?
68
+ if actual_v && !actual_v.empty?
69
+ raise Error::ResultMismatch, "Actual not empty"
70
+ end
71
+ else
72
+ if actual_v != expected_v
73
+ raise Error::ResultMismatch, "Mismatch: actual #{actual_v}, expected #{expected_v}"
74
+ end
75
+ end
76
+ end
77
+ end
78
+
54
79
  assert_matches(actual, expected, 'result')
55
80
  expected.clear
56
81
  end
@@ -99,6 +124,12 @@ module Unified
99
124
  client = entities.get(:client, client_id)
100
125
  subscriber = @subscribers.fetch(client)
101
126
  expected_events = spec.use!('events')
127
+ ignore_extra_events = if ignore = spec.use('ignoreExtraEvents')
128
+ # Ruby treats 0 as truthy, whereas the spec tests use it as falsy.
129
+ ignore == 0 ? false : ignore
130
+ else
131
+ false
132
+ end
102
133
  actual_events = subscriber.wanted_events(@observe_sensitive)
103
134
  case spec.use('eventType')
104
135
  when nil, 'command'
@@ -107,10 +138,12 @@ module Unified
107
138
  end
108
139
  when 'cmap'
109
140
  actual_events.select! do |event|
110
- event.class.name.sub(/.*::/, '') =~ /^Pool/
141
+ event.class.name.sub(/.*::/, '') =~ /^(?:Pool|Connection)/
111
142
  end
112
143
  end
113
- unless actual_events.length == expected_events.length
144
+
145
+ if (!ignore_extra_events && actual_events.length != expected_events.length) ||
146
+ (ignore_extra_events && actual_events.length < expected_events.length)
114
147
  raise Error::ResultMismatch, "Event count mismatch: expected #{expected_events.length}, actual #{actual_events.length}\nExpected: #{expected_events}\nActual: #{actual_events}"
115
148
  end
116
149
  expected_events.each_with_index do |event, i|
@@ -131,6 +164,9 @@ module Unified
131
164
  if spec.use('hasServiceId')
132
165
  actual.service_id.should_not be nil
133
166
  end
167
+ if spec.use('hasServerConnectionId')
168
+ actual.server_connection_id.should_not be nil
169
+ end
134
170
  if db_name = spec.use('databaseName')
135
171
  assert_eq(actual.database_name, db_name, 'Database names differ')
136
172
  end
@@ -155,8 +191,12 @@ module Unified
155
191
  end
156
192
 
157
193
  def assert_matches(actual, expected, msg)
158
- if actual.nil? && !expected.nil?
159
- raise Error::ResultMismatch, "#{msg}: expected #{expected} but got nil"
194
+ if actual.nil?
195
+ if expected&.keys == ["$$unsetOrMatches"]
196
+ return
197
+ elsif !expected.nil?
198
+ raise Error::ResultMismatch, "#{msg}: expected #{expected} but got nil"
199
+ end
160
200
  end
161
201
 
162
202
  case expected
@@ -208,10 +248,18 @@ module Unified
208
248
  end
209
249
 
210
250
  def assert_type(object, type)
251
+ ok = [*type].reduce(false) { |acc, x| acc || type_matches?(object, x) }
252
+
253
+ unless ok
254
+ raise Error::ResultMismatch, "Object #{object} is not of type #{type}"
255
+ end
256
+ end
257
+
258
+ def type_matches?(object, type)
211
259
  ok = case type
212
260
  when 'object'
213
261
  Hash === object
214
- when %w(int long)
262
+ when 'int', 'long'
215
263
  Integer === object || BSON::Int32 === object || BSON::Int64 === object
216
264
  when 'objectId'
217
265
  BSON::ObjectId === object
@@ -219,12 +267,11 @@ module Unified
219
267
  Time === object
220
268
  when 'double'
221
269
  Float === object
270
+ when 'string'
271
+ String === object
222
272
  else
223
273
  raise NotImplementedError, "Unhandled type #{type}"
224
274
  end
225
- unless ok
226
- raise Error::ResultMismatch, "Object #{object} is not of type #{type}"
227
- end
228
275
  end
229
276
 
230
277
  def assert_value_matches(actual, expected, msg)
@@ -235,8 +282,10 @@ module Unified
235
282
  case operator
236
283
  when '$$unsetOrMatches'
237
284
  if actual
238
- unless actual == expected_v
239
- raise Error::ResultMismatch, "Mismatch for #{msg}: expected #{expected}, have #{actual}"
285
+ if Mongo::BulkWrite::Result === actual || Mongo::Operation::Result === actual
286
+ assert_result_matches(actual, UsingHash[expected_v])
287
+ else
288
+ assert_matches(actual, expected_v, msg)
240
289
  end
241
290
  end
242
291
  when '$$matchesHexBytes'
@@ -14,6 +14,15 @@ module Unified
14
14
  if batch_size = args.use('batchSize')
15
15
  opts[:batch_size] = batch_size
16
16
  end
17
+ if comment = args.use('comment')
18
+ opts[:comment] = comment
19
+ end
20
+ if full_document = args.use('fullDocument')
21
+ opts[:full_document] = full_document
22
+ end
23
+ if full_document_before_change = args.use('fullDocumentBeforeChange')
24
+ opts[:full_document_before_change] = full_document_before_change
25
+ end
17
26
  cs = object.watch(pipeline, **opts)
18
27
  name = op.use!('saveResultAsEntity')
19
28
  entities.set(:change_stream, name, cs)
@@ -10,6 +10,8 @@ module Unified
10
10
  use_arguments(op) do |args|
11
11
  opts = {
12
12
  let: args.use('let'),
13
+ comment: args.use('comment'),
14
+ allow_disk_use: args.use('allowDiskUse'),
13
15
  }
14
16
  if session = args.use('session')
15
17
  opts[:session] = entities.get(:session, session)
@@ -35,6 +37,9 @@ module Unified
35
37
  if session = args.use('session')
36
38
  opts[:session] = entities.get(:session, session)
37
39
  end
40
+ if comment = args.use('comment')
41
+ opts[:comment] = comment
42
+ end
38
43
  collection.find(args.use!('filter')).count_documents(**opts)
39
44
  end
40
45
  end
@@ -46,6 +51,9 @@ module Unified
46
51
  if max_time_ms = args.use('maxTimeMS')
47
52
  opts[:max_time_ms] = max_time_ms
48
53
  end
54
+ if comment = args.use('comment')
55
+ opts[:comment] = comment
56
+ end
49
57
  collection.estimated_document_count(**opts)
50
58
  end
51
59
  end
@@ -69,6 +77,8 @@ module Unified
69
77
  update = args.use!('update')
70
78
  opts = {
71
79
  let: args.use('let'),
80
+ comment: args.use('comment'),
81
+ hint: args.use('hint'),
72
82
  }
73
83
  if return_document = args.use('returnDocument')
74
84
  opts[:return_document] = return_document.downcase.to_sym
@@ -87,6 +97,8 @@ module Unified
87
97
  update = args.use!('replacement')
88
98
  opts = {
89
99
  let: args.use('let'),
100
+ comment: args.use('comment'),
101
+ hint: args.use('hint'),
90
102
  }
91
103
  if session = args.use('session')
92
104
  opts[:session] = entities.get(:session, session)
@@ -101,6 +113,8 @@ module Unified
101
113
  filter = args.use!('filter')
102
114
  opts = {
103
115
  let: args.use('let'),
116
+ comment: args.use('comment'),
117
+ hint: args.use('hint'),
104
118
  }
105
119
  if session = args.use('session')
106
120
  opts[:session] = entities.get(:session, session)
@@ -112,7 +126,9 @@ module Unified
112
126
  def insert_one(op)
113
127
  collection = entities.get(:collection, op.use!('object'))
114
128
  use_arguments(op) do |args|
115
- opts = {}
129
+ opts = {
130
+ comment: args.use('comment')
131
+ }
116
132
  if session = args.use('session')
117
133
  opts[:session] = entities.get(:session, session)
118
134
  end
@@ -123,7 +139,9 @@ module Unified
123
139
  def insert_many(op)
124
140
  collection = entities.get(:collection, op.use!('object'))
125
141
  use_arguments(op) do |args|
126
- opts = {}
142
+ opts = {
143
+ comment: args.use('comment')
144
+ }
127
145
  unless (ordered = args.use('ordered')).nil?
128
146
  opts[:ordered] = ordered
129
147
  end
@@ -139,6 +157,8 @@ module Unified
139
157
  use_arguments(op) do |args|
140
158
  opts = {
141
159
  let: args.use('let'),
160
+ comment: args.use('comment'),
161
+ hint: args.use('hint'),
142
162
  }
143
163
  if session = args.use('session')
144
164
  opts[:session] = entities.get(:session, session)
@@ -152,6 +172,8 @@ module Unified
152
172
  use_arguments(op) do |args|
153
173
  opts = {
154
174
  let: args.use('let'),
175
+ comment: args.use('comment'),
176
+ hint: args.use('hint'),
155
177
  }
156
178
  collection.update_many(args.use!('filter'), args.use!('update'), **opts)
157
179
  end
@@ -163,7 +185,10 @@ module Unified
163
185
  collection.replace_one(
164
186
  args.use!('filter'),
165
187
  args.use!('replacement'),
188
+ comment: args.use('comment'),
166
189
  upsert: args.use('upsert'),
190
+ let: args.use('let'),
191
+ hint: args.use('hint')
167
192
  )
168
193
  end
169
194
  end
@@ -173,6 +198,8 @@ module Unified
173
198
  use_arguments(op) do |args|
174
199
  opts = {
175
200
  let: args.use('let'),
201
+ comment: args.use('comment'),
202
+ hint: args.use('hint'),
176
203
  }
177
204
  if session = args.use('session')
178
205
  opts[:session] = entities.get(:session, session)
@@ -186,6 +213,8 @@ module Unified
186
213
  use_arguments(op) do |args|
187
214
  opts = {
188
215
  let: args.use('let'),
216
+ comment: args.use('comment'),
217
+ hint: args.use('hint'),
189
218
  }
190
219
  collection.delete_many(args.use!('filter'), **opts)
191
220
  end
@@ -201,6 +230,12 @@ module Unified
201
230
  if ordered = args.use('ordered')
202
231
  opts[:ordered] = true
203
232
  end
233
+ if comment = args.use('comment')
234
+ opts[:comment] = comment
235
+ end
236
+ if let = args.use('let')
237
+ opts[:let] = let
238
+ end
204
239
  collection.bulk_write(requests, **opts)
205
240
  end
206
241
  end
@@ -215,6 +250,15 @@ module Unified
215
250
  if session = args.use('session')
216
251
  opts[:session] = entities.get(:session, session)
217
252
  end
253
+ if comment = args.use('comment')
254
+ opts[:comment] = comment
255
+ end
256
+ if batch_size = args.use('batchSize')
257
+ opts[:batch_size] = batch_size
258
+ end
259
+ if args.key?('allowDiskUse')
260
+ opts[:allow_disk_use] = args.use('allowDiskUse')
261
+ end
218
262
  unless args.empty?
219
263
  raise NotImplementedError, "Unhandled spec keys: #{args} in #{test_spec}"
220
264
  end
@@ -237,16 +281,20 @@ module Unified
237
281
  filter: spec.use('filter'),
238
282
  update: spec.use('update'),
239
283
  upsert: spec.use('upsert'),
284
+ array_filters: spec.use('arrayFilters'),
285
+ hint: spec.use('hint'),
240
286
  }
241
287
  when 'replaceOne'
242
288
  {
243
289
  filter: spec.use('filter'),
244
290
  replacement: spec.use('replacement'),
245
291
  upsert: spec.use('upsert'),
292
+ hint: spec.use('hint'),
246
293
  }
247
294
  when 'deleteOne', 'deleteMany'
248
295
  {
249
296
  filter: spec.use('filter'),
297
+ hint: spec.use('hint'),
250
298
  }
251
299
  else
252
300
  raise NotImplementedError, "Unknown operation #{op}"
@@ -30,6 +30,12 @@ module Unified
30
30
  if expire_after_seconds = args.use('expireAfterSeconds')
31
31
  collection_opts[:expire_after] = expire_after_seconds
32
32
  end
33
+ if clustered_index = args.use('clusteredIndex')
34
+ collection_opts[:clustered_index] = clustered_index
35
+ end
36
+ if change_stream_pre_and_post_images = args.use('changeStreamPreAndPostImages')
37
+ collection_opts[:change_stream_pre_and_post_images] = change_stream_pre_and_post_images
38
+ end
33
39
  database[args.use!('collection'), collection_opts].create(**opts)
34
40
  end
35
41
  end
@@ -41,6 +47,9 @@ module Unified
41
47
  if session = args.use('session')
42
48
  opts[:session] = entities.get(:session, session)
43
49
  end
50
+ if filter = args.use('filter')
51
+ opts[:filter] = filter
52
+ end
44
53
  database.list_collections(**opts)
45
54
  end
46
55
  end
@@ -53,6 +62,17 @@ module Unified
53
62
  end
54
63
  end
55
64
 
65
+ def rename(op)
66
+ collection = entities.get(:collection, op.use!('object'))
67
+ use_arguments(op) do |args|
68
+ to = args.use!('to')
69
+ collection.client.use(:admin).command({
70
+ renameCollection: "#{collection.database.name}.#{collection.name}",
71
+ to: "#{collection.database.name}.#{to}"
72
+ })
73
+ end
74
+ end
75
+
56
76
  def assert_collection_exists(op, state = true)
57
77
  consume_test_runner(op)
58
78
  use_arguments(op) do |args|
@@ -23,6 +23,7 @@ module Unified
23
23
  class InvalidTest < Error
24
24
  end
25
25
 
26
+ class UnsupportedOperation < Error
27
+ end
26
28
  end
27
-
28
29
  end
@@ -59,8 +59,11 @@ module Unified
59
59
 
60
60
  def assert_session_dirty(op)
61
61
  consume_test_runner(op)
62
- # https://jira.mongodb.org/browse/RUBY-1813
63
- true
62
+ use_arguments(op) do |args|
63
+ session = entities.get(:session, args.use!('session'))
64
+ # https://jira.mongodb.org/browse/RUBY-1813
65
+ true
66
+ end
64
67
  end
65
68
 
66
69
  def assert_session_not_dirty(op)
@@ -19,6 +19,7 @@ module Unified
19
19
  include ChangeStreamOperations
20
20
  include SupportOperations
21
21
  include Assertions
22
+ include RSpec::Core::Pending
22
23
 
23
24
  def initialize(spec, **opts)
24
25
  @spec = spec
@@ -132,11 +133,11 @@ module Unified
132
133
 
133
134
  create_client(**opts).tap do |client|
134
135
  @observe_sensitive = spec.use('observeSensitiveCommands')
136
+ subscriber = (@subscribers[client] ||= EventSubscriber.new)
135
137
  if oe = spec.use('observeEvents')
136
138
  oe.each do |event|
137
139
  case event
138
140
  when 'commandStartedEvent', 'commandSucceededEvent', 'commandFailedEvent'
139
- subscriber = (@subscribers[client] ||= EventSubscriber.new)
140
141
  unless client.send(:monitoring).subscribers[Mongo::Monitoring::COMMAND].include?(subscriber)
141
142
  client.subscribe(Mongo::Monitoring::COMMAND, subscriber)
142
143
  end
@@ -146,7 +147,6 @@ module Unified
146
147
  subscriber.ignore_commands(ignore_events)
147
148
  end
148
149
  when /\A(?:pool|connection)/
149
- subscriber = (@subscribers[client] ||= EventSubscriber.new)
150
150
  unless client.send(:monitoring).subscribers[Mongo::Monitoring::CONNECTION_POOL]&.include?(subscriber)
151
151
  client.subscribe(Mongo::Monitoring::CONNECTION_POOL, subscriber)
152
152
  end
@@ -278,8 +278,17 @@ module Unified
278
278
  if name.to_s == 'loop'
279
279
  method_name = "_#{name}"
280
280
  end
281
+
282
+ if ["modify_collection"].include?(name.to_s)
283
+ skip "Mongo Ruby Driver does not support #{name.to_s}"
284
+ end
285
+
281
286
  if expected_error = op.use('expectError')
282
287
  begin
288
+ unless respond_to?(method_name)
289
+ raise Error::UnsupportedOperation, "Mongo Ruby Driver does not support #{name.to_s}"
290
+ end
291
+
283
292
  public_send(method_name, op)
284
293
  rescue Mongo::Error, BSON::String::IllegalKey => e
285
294
  if expected_error.use('isClientError')
@@ -332,10 +341,16 @@ module Unified
332
341
  raise Error::ErrorMismatch, "Expected exception but none was raised"
333
342
  end
334
343
  else
344
+ unless respond_to?(method_name, true)
345
+ raise Error::UnsupportedOperation, "Mongo Ruby Driver does not support #{name.to_s}"
346
+ end
347
+
335
348
  result = send(method_name, op)
336
349
  if expected_result = op.use('expectResult')
337
- if result.nil? && !expected_result.empty?
338
- raise Error::ResultMismatch, "Actual result nil but expected result #{expected_result}"
350
+ if result.nil? && expected_result.keys == ["$$unsetOrMatches"]
351
+ return
352
+ elsif result.nil? && !expected_result.empty?
353
+ raise Error::ResultMismatch, "#{msg}: expected #{expected} but got nil"
339
354
  elsif Array === expected_result
340
355
  assert_documents_match(result, expected_result)
341
356
  else
@@ -9,6 +9,8 @@ require 'runners/unified/test'
9
9
  require 'runners/unified/test_group'
10
10
 
11
11
  def define_unified_spec_tests(base_path, paths, expect_failure: false)
12
+ config_override :validate_update_replace, true
13
+
12
14
  paths.each do |path|
13
15
  basename = path[base_path.length+1...path.length]
14
16
  context basename do
@@ -61,13 +63,18 @@ def define_unified_spec_tests(base_path, paths, expect_failure: false)
61
63
  begin
62
64
  test.create_entities
63
65
  test.set_initial_data
64
- lambda do
66
+ begin
65
67
  test.run
66
68
  test.assert_outcome
67
69
  test.assert_events
68
70
  # HACK: other errors are possible and likely will need to
69
71
  # be added here later as the tests evolve.
70
- end.should raise_error(Mongo::Error::OperationFailure)
72
+ rescue Mongo::Error::OperationFailure, Unified::Error::UnsupportedOperation
73
+ rescue => e
74
+ fail "Expected to raise Mongo::Error::OperationFailure or Unified::Error::UnsupportedOperation, got #{e}"
75
+ else
76
+ fail "Expected to raise Mongo::Error::OperationFailure or Unified::Error::UnsupportedOperation, but no error was raised"
77
+ end
71
78
  ensure
72
79
  test.cleanup
73
80
  end