mongo 2.19.1 → 2.21.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (356) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +40 -1
  3. data/Rakefile +83 -174
  4. data/lib/mongo/address.rb +22 -3
  5. data/lib/mongo/auth/aws/credentials_retriever.rb +70 -17
  6. data/lib/mongo/auth/base.rb +1 -1
  7. data/lib/mongo/bulk_write.rb +35 -2
  8. data/lib/mongo/client.rb +38 -6
  9. data/lib/mongo/client_encryption.rb +6 -3
  10. data/lib/mongo/cluster/reapers/cursor_reaper.rb +6 -1
  11. data/lib/mongo/cluster/sdam_flow.rb +20 -7
  12. data/lib/mongo/cluster/topology/base.rb +16 -0
  13. data/lib/mongo/cluster.rb +41 -5
  14. data/lib/mongo/collection/helpers.rb +1 -1
  15. data/lib/mongo/collection/view/aggregation/behavior.rb +131 -0
  16. data/lib/mongo/collection/view/aggregation.rb +33 -99
  17. data/lib/mongo/collection/view/builder/aggregation.rb +1 -7
  18. data/lib/mongo/collection/view/change_stream.rb +80 -27
  19. data/lib/mongo/collection/view/iterable.rb +92 -60
  20. data/lib/mongo/collection/view/map_reduce.rb +25 -8
  21. data/lib/mongo/collection/view/readable.rb +79 -30
  22. data/lib/mongo/collection/view/writable.rb +109 -48
  23. data/lib/mongo/collection/view.rb +44 -3
  24. data/lib/mongo/collection.rb +185 -26
  25. data/lib/mongo/config.rb +2 -2
  26. data/lib/mongo/crypt/auto_encrypter.rb +4 -6
  27. data/lib/mongo/crypt/binding.rb +4 -4
  28. data/lib/mongo/crypt/context.rb +20 -14
  29. data/lib/mongo/crypt/encryption_io.rb +56 -26
  30. data/lib/mongo/crypt/explicit_encrypter.rb +49 -20
  31. data/lib/mongo/crypt/explicit_encryption_context.rb +17 -11
  32. data/lib/mongo/crypt/kms/azure/credentials_retriever.rb +22 -6
  33. data/lib/mongo/crypt/kms/gcp/credentials_retriever.rb +29 -4
  34. data/lib/mongo/csot_timeout_holder.rb +119 -0
  35. data/lib/mongo/cursor/kill_spec.rb +5 -2
  36. data/lib/mongo/cursor/nontailable.rb +27 -0
  37. data/lib/mongo/cursor.rb +86 -24
  38. data/lib/mongo/cursor_host.rb +82 -0
  39. data/lib/mongo/database/view.rb +81 -14
  40. data/lib/mongo/database.rb +88 -18
  41. data/lib/mongo/error/operation_failure.rb +209 -204
  42. data/lib/mongo/error/server_timeout_error.rb +12 -0
  43. data/lib/mongo/error/socket_timeout_error.rb +3 -1
  44. data/lib/mongo/error/timeout_error.rb +23 -0
  45. data/lib/mongo/error/transactions_not_supported.rb +34 -0
  46. data/lib/mongo/error.rb +3 -0
  47. data/lib/mongo/grid/fs_bucket.rb +48 -9
  48. data/lib/mongo/grid/stream/read.rb +15 -1
  49. data/lib/mongo/grid/stream/write.rb +21 -4
  50. data/lib/mongo/index/view.rb +77 -16
  51. data/lib/mongo/monitoring/event/secure.rb +1 -1
  52. data/lib/mongo/operation/context.rb +40 -2
  53. data/lib/mongo/operation/create_search_indexes/op_msg.rb +31 -0
  54. data/lib/mongo/operation/create_search_indexes.rb +15 -0
  55. data/lib/mongo/operation/delete/op_msg.rb +2 -1
  56. data/lib/mongo/operation/drop_search_index/op_msg.rb +33 -0
  57. data/lib/mongo/operation/drop_search_index.rb +15 -0
  58. data/lib/mongo/operation/find/op_msg.rb +45 -0
  59. data/lib/mongo/operation/get_more/op_msg.rb +33 -0
  60. data/lib/mongo/operation/insert/op_msg.rb +3 -2
  61. data/lib/mongo/operation/insert/result.rb +4 -2
  62. data/lib/mongo/operation/list_collections/result.rb +1 -1
  63. data/lib/mongo/operation/map_reduce/result.rb +1 -1
  64. data/lib/mongo/operation/op_msg_base.rb +3 -1
  65. data/lib/mongo/operation/result.rb +26 -5
  66. data/lib/mongo/operation/shared/executable.rb +55 -28
  67. data/lib/mongo/operation/shared/op_msg_executable.rb +4 -1
  68. data/lib/mongo/operation/shared/response_handling.rb +25 -27
  69. data/lib/mongo/operation/shared/sessions_supported.rb +1 -1
  70. data/lib/mongo/operation/shared/specifiable.rb +7 -0
  71. data/lib/mongo/operation/shared/timed.rb +52 -0
  72. data/lib/mongo/operation/shared/write.rb +4 -1
  73. data/lib/mongo/operation/update/op_msg.rb +2 -1
  74. data/lib/mongo/operation/update_search_index/op_msg.rb +34 -0
  75. data/lib/mongo/operation/update_search_index.rb +15 -0
  76. data/lib/mongo/operation.rb +4 -0
  77. data/lib/mongo/protocol/message.rb +1 -4
  78. data/lib/mongo/protocol/msg.rb +2 -2
  79. data/lib/mongo/retryable/base_worker.rb +28 -3
  80. data/lib/mongo/retryable/read_worker.rb +78 -36
  81. data/lib/mongo/retryable/write_worker.rb +59 -25
  82. data/lib/mongo/retryable.rb +8 -2
  83. data/lib/mongo/search_index/view.rb +232 -0
  84. data/lib/mongo/server/app_metadata/environment.rb +64 -9
  85. data/lib/mongo/server/app_metadata.rb +5 -4
  86. data/lib/mongo/server/connection.rb +11 -5
  87. data/lib/mongo/server/connection_base.rb +22 -2
  88. data/lib/mongo/server/connection_pool.rb +32 -14
  89. data/lib/mongo/server/description/features.rb +2 -1
  90. data/lib/mongo/server/description.rb +18 -5
  91. data/lib/mongo/server/monitor.rb +7 -4
  92. data/lib/mongo/server/pending_connection.rb +25 -8
  93. data/lib/mongo/server/{round_trip_time_averager.rb → round_trip_time_calculator.rb} +25 -7
  94. data/lib/mongo/server.rb +11 -6
  95. data/lib/mongo/server_selector/base.rb +54 -12
  96. data/lib/mongo/session/server_session/dirtyable.rb +52 -0
  97. data/lib/mongo/session/server_session.rb +3 -0
  98. data/lib/mongo/session/session_pool.rb +12 -18
  99. data/lib/mongo/session.rb +110 -9
  100. data/lib/mongo/socket/ssl.rb +131 -18
  101. data/lib/mongo/socket/tcp.rb +40 -6
  102. data/lib/mongo/socket.rb +154 -25
  103. data/lib/mongo/uri/options_mapper.rb +1 -0
  104. data/lib/mongo/uri.rb +0 -4
  105. data/lib/mongo/version.rb +1 -5
  106. data/lib/mongo.rb +2 -0
  107. data/mongo.gemspec +9 -18
  108. data/spec/atlas/atlas_connectivity_spec.rb +9 -9
  109. data/spec/atlas/operations_spec.rb +5 -5
  110. data/spec/faas/ruby-sam-app/Gemfile +9 -0
  111. data/spec/faas/ruby-sam-app/mongodb/Gemfile +4 -0
  112. data/spec/faas/ruby-sam-app/mongodb/app.rb +149 -0
  113. data/spec/faas/ruby-sam-app/template.yaml +48 -0
  114. data/spec/integration/client_side_encryption/auto_encryption_mongocryptd_spawn_spec.rb +2 -1
  115. data/spec/integration/client_side_encryption/auto_encryption_spec.rb +494 -487
  116. data/spec/integration/client_side_encryption/corpus_spec.rb +10 -2
  117. data/spec/integration/client_side_encryption/on_demand_aws_credentials_spec.rb +1 -1
  118. data/spec/integration/client_side_encryption/range_explicit_encryption_prose_spec.rb +67 -20
  119. data/spec/integration/client_side_operations_timeout/encryption_prose_spec.rb +131 -0
  120. data/spec/integration/connection_pool_populator_spec.rb +2 -0
  121. data/spec/integration/cursor_pinning_spec.rb +15 -60
  122. data/spec/integration/cursor_reaping_spec.rb +1 -1
  123. data/spec/integration/docs_examples_spec.rb +1 -1
  124. data/spec/integration/find_options_spec.rb +227 -0
  125. data/spec/integration/operation_failure_code_spec.rb +1 -1
  126. data/spec/integration/operation_failure_message_spec.rb +3 -3
  127. data/spec/integration/retryable_errors_spec.rb +2 -2
  128. data/spec/integration/retryable_reads_errors_spec.rb +196 -31
  129. data/spec/integration/retryable_writes_errors_spec.rb +156 -0
  130. data/spec/integration/sdam_error_handling_spec.rb +4 -1
  131. data/spec/integration/search_indexes_prose_spec.rb +172 -0
  132. data/spec/integration/server_spec.rb +4 -3
  133. data/spec/integration/transactions_api_examples_spec.rb +2 -0
  134. data/spec/kerberos/kerberos_spec.rb +4 -0
  135. data/spec/lite_spec_helper.rb +34 -20
  136. data/spec/mongo/auth/user/view_spec.rb +1 -1
  137. data/spec/mongo/caching_cursor_spec.rb +1 -1
  138. data/spec/mongo/client_encryption_spec.rb +1 -0
  139. data/spec/mongo/client_spec.rb +158 -4
  140. data/spec/mongo/cluster_spec.rb +36 -0
  141. data/spec/mongo/collection/view/aggregation_spec.rb +20 -40
  142. data/spec/mongo/collection/view/change_stream_spec.rb +3 -3
  143. data/spec/mongo/collection/view/explainable_spec.rb +2 -0
  144. data/spec/mongo/collection_crud_spec.rb +2 -1
  145. data/spec/mongo/collection_spec.rb +5 -6
  146. data/spec/mongo/crypt/auto_encrypter_spec.rb +14 -12
  147. data/spec/mongo/crypt/data_key_context_spec.rb +3 -1
  148. data/spec/mongo/crypt/explicit_encryption_context_spec.rb +2 -2
  149. data/spec/mongo/crypt/handle_spec.rb +1 -1
  150. data/spec/mongo/cursor_spec.rb +26 -9
  151. data/spec/mongo/error/operation_failure_heavy_spec.rb +2 -2
  152. data/spec/mongo/operation/context_spec.rb +79 -0
  153. data/spec/mongo/operation/create/op_msg_spec.rb +106 -110
  154. data/spec/mongo/operation/delete/op_msg_spec.rb +6 -5
  155. data/spec/mongo/operation/find/op_msg_spec.rb +66 -0
  156. data/spec/mongo/operation/get_more/op_msg_spec.rb +65 -0
  157. data/spec/mongo/operation/insert/op_msg_spec.rb +128 -131
  158. data/spec/mongo/operation/insert_spec.rb +1 -1
  159. data/spec/mongo/operation/shared/csot/examples.rb +113 -0
  160. data/spec/mongo/query_cache_spec.rb +243 -225
  161. data/spec/mongo/retryable/write_worker_spec.rb +39 -0
  162. data/spec/mongo/retryable_spec.rb +1 -0
  163. data/spec/mongo/server/app_metadata/environment_spec.rb +135 -0
  164. data/spec/mongo/server/app_metadata_spec.rb +12 -2
  165. data/spec/mongo/server/connection_spec.rb +26 -0
  166. data/spec/mongo/server/round_trip_time_calculator_spec.rb +120 -0
  167. data/spec/mongo/session/session_pool_spec.rb +1 -16
  168. data/spec/mongo/session_transaction_spec.rb +15 -0
  169. data/spec/mongo/socket/ssl_spec.rb +0 -10
  170. data/spec/mongo/uri_spec.rb +0 -9
  171. data/spec/runners/change_streams/test.rb +2 -2
  172. data/spec/runners/crud/operation.rb +1 -1
  173. data/spec/runners/crud/test.rb +0 -8
  174. data/spec/runners/crud/verifier.rb +3 -1
  175. data/spec/runners/crud.rb +1 -1
  176. data/spec/runners/transactions/operation.rb +4 -6
  177. data/spec/runners/transactions/test.rb +12 -3
  178. data/spec/runners/unified/ambiguous_operations.rb +13 -0
  179. data/spec/runners/unified/assertions.rb +20 -3
  180. data/spec/runners/unified/change_stream_operations.rb +14 -24
  181. data/spec/runners/unified/crud_operations.rb +82 -47
  182. data/spec/runners/unified/ddl_operations.rb +38 -7
  183. data/spec/runners/unified/grid_fs_operations.rb +37 -2
  184. data/spec/runners/unified/search_index_operations.rb +63 -0
  185. data/spec/runners/unified/support_operations.rb +46 -9
  186. data/spec/runners/unified/test.rb +33 -12
  187. data/spec/runners/unified.rb +1 -1
  188. data/spec/solo/clean_exit_spec.rb +2 -0
  189. data/spec/spec_helper.rb +1 -1
  190. data/spec/spec_tests/client_side_operations_timeout_spec.rb +15 -0
  191. data/spec/spec_tests/data/change_streams_unified/change-streams-clusterTime.yml +3 -1
  192. data/spec/spec_tests/data/change_streams_unified/change-streams-disambiguatedPaths.yml +3 -1
  193. data/spec/spec_tests/data/change_streams_unified/change-streams-errors.yml +3 -1
  194. data/spec/spec_tests/data/change_streams_unified/change-streams-pre_and_post_images.yml +1 -1
  195. data/spec/spec_tests/data/change_streams_unified/change-streams-resume-allowlist.yml +1 -1
  196. data/spec/spec_tests/data/change_streams_unified/change-streams-resume-errorLabels.yml +1 -1
  197. data/spec/spec_tests/data/change_streams_unified/change-streams-showExpandedEvents.yml +1 -1
  198. data/spec/spec_tests/data/client_side_encryption/badQueries.yml +2 -1
  199. data/spec/spec_tests/data/client_side_encryption/explain.yml +2 -2
  200. data/spec/spec_tests/data/client_side_encryption/fle2v2-BypassQueryAnalysis.yml +1 -0
  201. data/spec/spec_tests/data/client_side_encryption/fle2v2-Compact.yml +1 -0
  202. data/spec/spec_tests/data/client_side_encryption/fle2v2-CreateCollection.yml +1 -0
  203. data/spec/spec_tests/data/client_side_encryption/fle2v2-DecryptExistingData.yml +1 -0
  204. data/spec/spec_tests/data/client_side_encryption/fle2v2-Delete.yml +1 -0
  205. data/spec/spec_tests/data/client_side_encryption/fle2v2-EncryptedFields-vs-EncryptedFieldsMap.yml +1 -0
  206. data/spec/spec_tests/data/client_side_encryption/fle2v2-EncryptedFields-vs-jsonSchema.yml +1 -0
  207. data/spec/spec_tests/data/client_side_encryption/fle2v2-EncryptedFieldsMap-defaults.yml +1 -0
  208. data/spec/spec_tests/data/client_side_encryption/fle2v2-FindOneAndUpdate.yml +1 -0
  209. data/spec/spec_tests/data/client_side_encryption/fle2v2-InsertFind-Indexed.yml +1 -0
  210. data/spec/spec_tests/data/client_side_encryption/fle2v2-InsertFind-Unindexed.yml +1 -0
  211. data/spec/spec_tests/data/client_side_encryption/fle2v2-MissingKey.yml +1 -0
  212. data/spec/spec_tests/data/client_side_encryption/fle2v2-NoEncryption.yml +1 -0
  213. data/spec/spec_tests/data/client_side_encryption/fle2v2-Update.yml +1 -0
  214. data/spec/spec_tests/data/client_side_encryption/fle2v2-validatorAndPartialFieldExpression.yml +2 -1
  215. data/spec/spec_tests/data/client_side_encryption/timeoutMS.yml +67 -0
  216. data/spec/spec_tests/data/client_side_operations_timeout/bulkWrite.yml +87 -0
  217. data/spec/spec_tests/data/client_side_operations_timeout/change-streams.yml +358 -0
  218. data/spec/spec_tests/data/client_side_operations_timeout/close-cursors.yml +129 -0
  219. data/spec/spec_tests/data/client_side_operations_timeout/command-execution.yml +250 -0
  220. data/spec/spec_tests/data/client_side_operations_timeout/convenient-transactions.yml +113 -0
  221. data/spec/spec_tests/data/client_side_operations_timeout/cursors.yml +70 -0
  222. data/spec/spec_tests/data/client_side_operations_timeout/deprecated-options.yml +3982 -0
  223. data/spec/spec_tests/data/client_side_operations_timeout/error-transformations.yml +96 -0
  224. data/spec/spec_tests/data/client_side_operations_timeout/global-timeoutMS.yml +3236 -0
  225. data/spec/spec_tests/data/client_side_operations_timeout/gridfs-advanced.yml +207 -0
  226. data/spec/spec_tests/data/client_side_operations_timeout/gridfs-delete.yml +152 -0
  227. data/spec/spec_tests/data/client_side_operations_timeout/gridfs-download.yml +182 -0
  228. data/spec/spec_tests/data/client_side_operations_timeout/gridfs-find.yml +100 -0
  229. data/spec/spec_tests/data/client_side_operations_timeout/gridfs-upload.yml +249 -0
  230. data/spec/spec_tests/data/client_side_operations_timeout/legacy-timeouts.yml +204 -0
  231. data/spec/spec_tests/data/client_side_operations_timeout/non-tailable-cursors.yml +307 -0
  232. data/spec/spec_tests/data/client_side_operations_timeout/override-collection-timeoutMS.yml +1877 -0
  233. data/spec/spec_tests/data/client_side_operations_timeout/override-operation-timeoutMS.yml +1918 -0
  234. data/spec/spec_tests/data/client_side_operations_timeout/retryability-legacy-timeouts.yml +1676 -0
  235. data/spec/spec_tests/data/client_side_operations_timeout/retryability-timeoutMS.yml +2824 -0
  236. data/spec/spec_tests/data/client_side_operations_timeout/sessions-inherit-timeoutMS.yml +168 -0
  237. data/spec/spec_tests/data/client_side_operations_timeout/sessions-override-operation-timeoutMS.yml +171 -0
  238. data/spec/spec_tests/data/client_side_operations_timeout/sessions-override-timeoutMS.yml +168 -0
  239. data/spec/spec_tests/data/client_side_operations_timeout/tailable-awaitData.yml +247 -0
  240. data/spec/spec_tests/data/client_side_operations_timeout/tailable-non-awaitData.yml +181 -0
  241. data/spec/spec_tests/data/connection_string/invalid-uris.yml +0 -10
  242. data/spec/spec_tests/data/connection_string/valid-options.yml +13 -0
  243. data/spec/spec_tests/data/crud_unified/aggregate-write-readPreference.yml +6 -0
  244. data/spec/spec_tests/data/crud_unified/db-aggregate-write-readPreference.yml +6 -0
  245. data/spec/spec_tests/data/crud_unified/find-test-all-options.yml +377 -0
  246. data/spec/spec_tests/data/index_management/createSearchIndex.yml +64 -0
  247. data/spec/spec_tests/data/index_management/createSearchIndexes.yml +86 -0
  248. data/spec/spec_tests/data/index_management/dropSearchIndex.yml +43 -0
  249. data/spec/spec_tests/data/index_management/listSearchIndexes.yml +91 -0
  250. data/spec/spec_tests/data/index_management/updateSearchIndex.yml +46 -0
  251. data/spec/spec_tests/data/retryable_writes/unified/bulkWrite-serverErrors.yml +3 -6
  252. data/spec/spec_tests/data/retryable_writes/unified/insertOne-serverErrors.yml +3 -6
  253. data/spec/spec_tests/data/run_command_unified/runCommand.yml +319 -0
  254. data/spec/spec_tests/data/sessions_unified/driver-sessions-dirty-session-errors.yml +351 -0
  255. data/spec/spec_tests/data/unified/valid-pass/poc-crud.yml +1 -1
  256. data/spec/spec_tests/data/unified/valid-pass/poc-retryable-writes.yml +7 -7
  257. data/spec/spec_tests/data/unified/valid-pass/poc-sessions.yml +3 -4
  258. data/spec/spec_tests/data/unified/valid-pass/poc-transactions-convenient-api.yml +1 -1
  259. data/spec/spec_tests/data/unified/valid-pass/poc-transactions-mongos-pin-auto.yml +1 -1
  260. data/spec/spec_tests/data/unified/valid-pass/poc-transactions.yml +3 -3
  261. data/spec/spec_tests/index_management_unified_spec.rb +13 -0
  262. data/spec/spec_tests/run_command_unified_spec.rb +13 -0
  263. data/spec/spec_tests/sdam_unified_spec.rb +2 -0
  264. data/spec/spec_tests/server_selection_rtt_spec.rb +6 -6
  265. data/spec/spec_tests/transactions_unified_spec.rb +2 -1
  266. data/spec/support/certificates/atlas-ocsp-ca.crt +89 -79
  267. data/spec/support/certificates/atlas-ocsp.crt +117 -122
  268. data/spec/support/certificates/retrieve-atlas-cert +1 -1
  269. data/spec/support/cluster_tools.rb +3 -3
  270. data/spec/support/common_shortcuts.rb +2 -2
  271. data/spec/support/constraints.rb +6 -0
  272. data/spec/support/crypt/encrypted_fields/range-encryptedFields-Date.json +1 -1
  273. data/spec/support/crypt/encrypted_fields/range-encryptedFields-DecimalNoPrecision.json +1 -1
  274. data/spec/support/crypt/encrypted_fields/range-encryptedFields-DecimalPrecision.json +1 -1
  275. data/spec/support/crypt/encrypted_fields/range-encryptedFields-DoubleNoPrecision.json +1 -1
  276. data/spec/support/crypt/encrypted_fields/range-encryptedFields-DoublePrecision.json +1 -1
  277. data/spec/support/crypt/encrypted_fields/range-encryptedFields-Int.json +1 -1
  278. data/spec/support/crypt/encrypted_fields/range-encryptedFields-Long.json +1 -1
  279. data/spec/support/ocsp +1 -1
  280. data/spec/support/recording_logger.rb +27 -0
  281. data/spec/support/shared/session.rb +2 -2
  282. data/spec/support/spec_config.rb +5 -0
  283. data/spec/support/spec_setup.rb +2 -2
  284. data/spec/support/utils.rb +3 -1
  285. metadata +1329 -1368
  286. checksums.yaml.gz.sig +0 -0
  287. data/spec/mongo/server/round_trip_time_averager_spec.rb +0 -48
  288. data/spec/shared/LICENSE +0 -20
  289. data/spec/shared/bin/get-mongodb-download-url +0 -17
  290. data/spec/shared/bin/s3-copy +0 -45
  291. data/spec/shared/bin/s3-upload +0 -69
  292. data/spec/shared/lib/mrss/child_process_helper.rb +0 -80
  293. data/spec/shared/lib/mrss/cluster_config.rb +0 -231
  294. data/spec/shared/lib/mrss/constraints.rb +0 -378
  295. data/spec/shared/lib/mrss/docker_runner.rb +0 -295
  296. data/spec/shared/lib/mrss/eg_config_utils.rb +0 -51
  297. data/spec/shared/lib/mrss/event_subscriber.rb +0 -210
  298. data/spec/shared/lib/mrss/lite_constraints.rb +0 -238
  299. data/spec/shared/lib/mrss/server_version_registry.rb +0 -113
  300. data/spec/shared/lib/mrss/session_registry.rb +0 -69
  301. data/spec/shared/lib/mrss/session_registry_legacy.rb +0 -60
  302. data/spec/shared/lib/mrss/spec_organizer.rb +0 -179
  303. data/spec/shared/lib/mrss/utils.rb +0 -37
  304. data/spec/shared/share/Dockerfile.erb +0 -330
  305. data/spec/shared/share/haproxy-1.conf +0 -16
  306. data/spec/shared/share/haproxy-2.conf +0 -17
  307. data/spec/shared/shlib/config.sh +0 -27
  308. data/spec/shared/shlib/distro.sh +0 -74
  309. data/spec/shared/shlib/server.sh +0 -416
  310. data/spec/shared/shlib/set_env.sh +0 -169
  311. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Date-Aggregate.yml +0 -241
  312. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Date-Correctness.yml +0 -422
  313. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Date-Delete.yml +0 -182
  314. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Date-FindOneAndUpdate.yml +0 -239
  315. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Date-InsertFind.yml +0 -235
  316. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Date-Update.yml +0 -252
  317. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Decimal-Aggregate.yml +0 -1687
  318. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Decimal-Correctness.yml +0 -293
  319. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Decimal-Delete.yml +0 -905
  320. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Decimal-FindOneAndUpdate.yml +0 -1684
  321. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Decimal-InsertFind.yml +0 -1680
  322. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Decimal-Update.yml +0 -1697
  323. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-DecimalPrecision-Aggregate.yml +0 -329
  324. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-DecimalPrecision-Correctness.yml +0 -424
  325. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-DecimalPrecision-Delete.yml +0 -226
  326. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-DecimalPrecision-FindOneAndUpdate.yml +0 -327
  327. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-DecimalPrecision-InsertFind.yml +0 -319
  328. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-DecimalPrecision-Update.yml +0 -336
  329. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Double-Aggregate.yml +0 -913
  330. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Double-Correctness.yml +0 -292
  331. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Double-Delete.yml +0 -518
  332. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Double-FindOneAndUpdate.yml +0 -911
  333. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Double-InsertFind.yml +0 -907
  334. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Double-Update.yml +0 -924
  335. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-DoublePrecision-Aggregate.yml +0 -325
  336. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-DoublePrecision-Correctness.yml +0 -424
  337. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-DoublePrecision-Delete.yml +0 -224
  338. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-DoublePrecision-FindOneAndUpdate.yml +0 -323
  339. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-DoublePrecision-InsertFind.yml +0 -319
  340. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-DoublePrecision-Update.yml +0 -338
  341. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Int-Aggregate.yml +0 -241
  342. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Int-Correctness.yml +0 -423
  343. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Int-Delete.yml +0 -182
  344. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Int-FindOneAndUpdate.yml +0 -239
  345. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Int-InsertFind.yml +0 -235
  346. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Int-Update.yml +0 -254
  347. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Long-Aggregate.yml +0 -241
  348. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Long-Correctness.yml +0 -422
  349. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Long-Delete.yml +0 -182
  350. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Long-FindOneAndUpdate.yml +0 -239
  351. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Long-InsertFind.yml +0 -235
  352. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Long-Update.yml +0 -254
  353. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-WrongType.yml +0 -43
  354. data/spec/spec_tests/data/cmap/pool-clear-interrupt-immediately.yml +0 -49
  355. data.tar.gz.sig +0 -0
  356. metadata.gz.sig +0 -2
@@ -10,22 +10,9 @@ module Unified
10
10
  object = entities.get_any(object_id)
11
11
  use_arguments(op) do |args|
12
12
  pipeline = args.use!('pipeline')
13
- opts = {}
14
- if batch_size = args.use('batchSize')
15
- opts[:batch_size] = batch_size
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
26
- if args.key?('showExpandedEvents')
27
- opts[:show_expanded_events] = args.use!('showExpandedEvents')
28
- end
13
+ opts = extract_options(args, 'batchSize', 'comment', 'fullDocument',
14
+ 'fullDocumentBeforeChange', 'showExpandedEvents', 'timeoutMS',
15
+ 'maxAwaitTimeMS')
29
16
  cs = object.watch(pipeline, **opts)
30
17
  if name = op.use('saveResultAsEntity')
31
18
  entities.set(:change_stream, name, cs)
@@ -35,18 +22,21 @@ module Unified
35
22
 
36
23
  def iterate_until_document_or_error(op)
37
24
  object_id = op.use!('object')
38
- object = entities.get(:change_stream, object_id)
39
- object.to_enum.next
25
+ object = entities.get_any(object_id)
26
+ object.try_next
27
+ end
28
+
29
+ def iterate_once(op)
30
+ stream_id = op.use!('object')
31
+ stream = entities.get_any(stream_id)
32
+ stream.try_next
40
33
  end
41
34
 
42
35
  def close(op)
43
36
  object_id = op.use!('object')
44
- # The Ruby driver unified spec runner does not currently implement
45
- # find cursors as created by createFindCursor. This will be done
46
- # as part of CSOT implementation. When this is done, the line(s) below
47
- # should be changed to retrieve such cursor instances and close them.
48
- object = entities.get(:csot_cursor, object_id)
49
- object.close
37
+ opts = op.key?('arguments') ? extract_options(op.use!('arguments'), 'timeoutMS') : {}
38
+ object = entities.get_any(object_id)
39
+ object.close(opts)
50
40
  end
51
41
  end
52
42
  end
@@ -5,7 +5,7 @@ module Unified
5
5
 
6
6
  module CrudOperations
7
7
 
8
- def find(op)
8
+ def crud_find(op)
9
9
  get_find_view(op).to_a
10
10
  end
11
11
 
@@ -16,23 +16,21 @@ module Unified
16
16
  def get_find_view(op)
17
17
  collection = entities.get(:collection, op.use!('object'))
18
18
  use_arguments(op) do |args|
19
- opts = {
20
- let: args.use('let'),
21
- comment: args.use('comment'),
22
- allow_disk_use: args.use('allowDiskUse'),
23
- show_disk_loc: args.use('showRecordId'),
24
- return_key: args.use('returnKey'),
25
- projection: args.use('projection'),
26
- skip: args.use('skip'),
27
- hint: args.use('hint'),
28
- max_value: args.use('max'),
29
- max_time_ms: args.use('maxTimeMS'),
30
- min_value: args.use('min'),
31
- }
32
- if session = args.use('session')
33
- opts[:session] = entities.get(:session, session)
34
- end
35
- req = collection.find(args.use!('filter'), **opts)
19
+ filter = args.use!('filter')
20
+ session = args.use('session')
21
+
22
+ opts = extract_options(args, 'let', 'comment',
23
+ 'allowDiskUse', 'returnKey', 'projection',
24
+ 'skip', 'hint', 'maxTimeMS', 'timeoutMS',
25
+ 'collation', 'noCursorTimeout', 'oplogReplay', 'allowPartialResults',
26
+ 'timeoutMode', 'maxAwaitTimeMS', 'cursorType', 'timeoutMode',
27
+ { 'showRecordId' => :show_disk_loc, 'max' => :max_value, 'min' => :min_value },
28
+ allow_extra: true)
29
+ symbolize_options!(opts, :timeout_mode, :cursor_type)
30
+
31
+ opts[:session] = entities.get(:session, session) if session
32
+
33
+ req = collection.find(filter, **opts)
36
34
  if batch_size = args.use('batchSize')
37
35
  req = req.batch_size(batch_size)
38
36
  end
@@ -49,15 +47,23 @@ module Unified
49
47
  end
50
48
  end
51
49
 
52
- def count_documents(op)
50
+ def count(op)
53
51
  collection = entities.get(:collection, op.use!('object'))
54
52
  use_arguments(op) do |args|
55
- opts = {}
53
+ opts = extract_options(args, 'comment', 'timeoutMS', 'maxTimeMS', allow_extra: true)
56
54
  if session = args.use('session')
57
55
  opts[:session] = entities.get(:session, session)
58
56
  end
59
- if comment = args.use('comment')
60
- opts[:comment] = comment
57
+ collection.count(args.use!('filter'), **opts)
58
+ end
59
+ end
60
+
61
+ def count_documents(op)
62
+ collection = entities.get(:collection, op.use!('object'))
63
+ use_arguments(op) do |args|
64
+ opts = extract_options(args, 'comment', 'timeoutMS', 'maxTimeMS', allow_extra: true)
65
+ if session = args.use('session')
66
+ opts[:session] = entities.get(:session, session)
61
67
  end
62
68
  collection.find(args.use!('filter')).count_documents(**opts)
63
69
  end
@@ -66,12 +72,9 @@ module Unified
66
72
  def estimated_document_count(op)
67
73
  collection = entities.get(:collection, op.use!('object'))
68
74
  use_arguments(op) do |args|
69
- opts = {}
70
- if max_time_ms = args.use('maxTimeMS')
71
- opts[:max_time_ms] = max_time_ms
72
- end
73
- if comment = args.use('comment')
74
- opts[:comment] = comment
75
+ opts = extract_options(args, 'comment', 'timeoutMS', 'maxTimeMS', allow_extra: true)
76
+ if session = args.use('session')
77
+ opts[:session] = entities.get(:session, session)
75
78
  end
76
79
  collection.estimated_document_count(**opts)
77
80
  end
@@ -80,13 +83,10 @@ module Unified
80
83
  def distinct(op)
81
84
  collection = entities.get(:collection, op.use!('object'))
82
85
  use_arguments(op) do |args|
83
- opts = {}
86
+ opts = extract_options(args, 'comment', 'timeoutMS', 'maxTimeMS', allow_extra: true)
84
87
  if session = args.use('session')
85
88
  opts[:session] = entities.get(:session, session)
86
89
  end
87
- if comment = args.use('comment')
88
- opts[:comment] = comment
89
- end
90
90
  req = collection.find(args.use!('filter'), **opts).distinct(args.use!('fieldName'), **opts)
91
91
  result = req.to_a
92
92
  end
@@ -102,6 +102,8 @@ module Unified
102
102
  comment: args.use('comment'),
103
103
  hint: args.use('hint'),
104
104
  upsert: args.use('upsert'),
105
+ timeout_ms: args.use('timeoutMS'),
106
+ max_time_ms: args.use('maxTimeMS')
105
107
  }
106
108
  if return_document = args.use('returnDocument')
107
109
  opts[:return_document] = return_document.downcase.to_sym
@@ -122,6 +124,8 @@ module Unified
122
124
  let: args.use('let'),
123
125
  comment: args.use('comment'),
124
126
  hint: args.use('hint'),
127
+ timeout_ms: args.use('timeoutMS'),
128
+ max_time_ms: args.use('maxTimeMS')
125
129
  }
126
130
  if session = args.use('session')
127
131
  opts[:session] = entities.get(:session, session)
@@ -138,6 +142,8 @@ module Unified
138
142
  let: args.use('let'),
139
143
  comment: args.use('comment'),
140
144
  hint: args.use('hint'),
145
+ timeout_ms: args.use('timeoutMS'),
146
+ max_time_ms: args.use('maxTimeMS')
141
147
  }
142
148
  if session = args.use('session')
143
149
  opts[:session] = entities.get(:session, session)
@@ -150,7 +156,9 @@ module Unified
150
156
  collection = entities.get(:collection, op.use!('object'))
151
157
  use_arguments(op) do |args|
152
158
  opts = {
153
- comment: args.use('comment')
159
+ comment: args.use('comment'),
160
+ timeout_ms: args.use('timeoutMS'),
161
+ max_time_ms: args.use('maxTimeMS')
154
162
  }
155
163
  if session = args.use('session')
156
164
  opts[:session] = entities.get(:session, session)
@@ -163,7 +171,9 @@ module Unified
163
171
  collection = entities.get(:collection, op.use!('object'))
164
172
  use_arguments(op) do |args|
165
173
  opts = {
166
- comment: args.use('comment')
174
+ comment: args.use('comment'),
175
+ timeout_ms: args.use('timeoutMS'),
176
+ max_time_ms: args.use('maxTimeMS')
167
177
  }
168
178
  unless (ordered = args.use('ordered')).nil?
169
179
  opts[:ordered] = ordered
@@ -183,6 +193,8 @@ module Unified
183
193
  comment: args.use('comment'),
184
194
  hint: args.use('hint'),
185
195
  upsert: args.use('upsert'),
196
+ timeout_ms: args.use('timeoutMS'),
197
+ max_time_ms: args.use('maxTimeMS')
186
198
  }
187
199
  if session = args.use('session')
188
200
  opts[:session] = entities.get(:session, session)
@@ -198,6 +210,8 @@ module Unified
198
210
  let: args.use('let'),
199
211
  comment: args.use('comment'),
200
212
  hint: args.use('hint'),
213
+ timeout_ms: args.use('timeoutMS'),
214
+ max_time_ms: args.use('maxTimeMS')
201
215
  }
202
216
  collection.update_many(args.use!('filter'), args.use!('update'), **opts)
203
217
  end
@@ -212,7 +226,9 @@ module Unified
212
226
  comment: args.use('comment'),
213
227
  upsert: args.use('upsert'),
214
228
  let: args.use('let'),
215
- hint: args.use('hint')
229
+ hint: args.use('hint'),
230
+ timeout_ms: args.use('timeoutMS'),
231
+ max_time_ms: args.use('maxTimeMS')
216
232
  )
217
233
  end
218
234
  end
@@ -224,6 +240,8 @@ module Unified
224
240
  let: args.use('let'),
225
241
  comment: args.use('comment'),
226
242
  hint: args.use('hint'),
243
+ timeout_ms: args.use('timeoutMS'),
244
+ max_time_ms: args.use('maxTimeMS')
227
245
  }
228
246
  if session = args.use('session')
229
247
  opts[:session] = entities.get(:session, session)
@@ -239,6 +257,8 @@ module Unified
239
257
  let: args.use('let'),
240
258
  comment: args.use('comment'),
241
259
  hint: args.use('hint'),
260
+ timeout_ms: args.use('timeoutMS'),
261
+ max_time_ms: args.use('maxTimeMS')
242
262
  }
243
263
  collection.delete_many(args.use!('filter'), **opts)
244
264
  end
@@ -260,6 +280,12 @@ module Unified
260
280
  if let = args.use('let')
261
281
  opts[:let] = let
262
282
  end
283
+ if timeout_ms = args.use('timeoutMS')
284
+ opts[:timeout_ms] = timeout_ms
285
+ end
286
+ if max_time_ms = args.use('maxTimeMS')
287
+ opts[:max_time_ms] = max_time_ms
288
+ end
263
289
  collection.bulk_write(requests, **opts)
264
290
  end
265
291
  end
@@ -268,27 +294,36 @@ module Unified
268
294
  obj = entities.get_any(op.use!('object'))
269
295
  args = op.use!('arguments')
270
296
  pipeline = args.use!('pipeline')
271
- opts = {
272
- let: args.use('let'),
273
- }
297
+
298
+ opts = extract_options(args, 'let', 'comment', 'batchSize', 'maxTimeMS',
299
+ 'allowDiskUse', 'timeoutMode', 'timeoutMS', 'maxTimeMS', allow_extra: true)
300
+ symbolize_options!(opts, :timeout_mode)
301
+
274
302
  if session = args.use('session')
275
303
  opts[:session] = entities.get(:session, session)
276
304
  end
277
- if comment = args.use('comment')
278
- opts[:comment] = comment
279
- end
280
- if batch_size = args.use('batchSize')
281
- opts[:batch_size] = batch_size
282
- end
283
- if args.key?('allowDiskUse')
284
- opts[:allow_disk_use] = args.use('allowDiskUse')
285
- end
305
+
286
306
  unless args.empty?
287
307
  raise NotImplementedError, "Unhandled spec keys: #{args} in #{test_spec}"
288
308
  end
309
+
289
310
  obj.aggregate(pipeline, **opts).to_a
290
311
  end
291
312
 
313
+ def create_find_cursor(op)
314
+ obj = entities.get_any(op.use!('object'))
315
+ args = op.use!('arguments')
316
+
317
+ filter = args.use('filter')
318
+ opts = extract_options(args, 'batchSize', 'timeoutMS', 'cursorType', 'maxAwaitTimeMS')
319
+ symbolize_options!(opts, :cursor_type)
320
+
321
+ view = obj.find(filter, opts)
322
+ view.each # to initialize the cursor
323
+
324
+ view.cursor
325
+ end
326
+
292
327
  private
293
328
 
294
329
  def convert_bulk_write_spec(spec)
@@ -20,6 +20,9 @@ module Unified
20
20
  if session = args.use('session')
21
21
  opts[:session] = entities.get(:session, session)
22
22
  end
23
+ if timeout_ms = args.use('timeoutMS')
24
+ opts[:timeout_ms] = timeout_ms
25
+ end
23
26
  client.list_databases(args.use('filter') || {}, name_only, **opts)
24
27
  end
25
28
  end
@@ -50,6 +53,15 @@ module Unified
50
53
  if pipeline = args.use('pipeline')
51
54
  collection_opts[:pipeline] = pipeline
52
55
  end
56
+ if capped = args.use('capped')
57
+ collection_opts[:capped] = capped
58
+ end
59
+ if size = args.use('size')
60
+ collection_opts[:size] = size
61
+ end
62
+ if max = args.use('max')
63
+ collection_opts[:max] = max
64
+ end
53
65
  database[args.use!('collection'), collection_opts].create(**opts)
54
66
  end
55
67
  end
@@ -65,13 +77,16 @@ module Unified
65
77
  def list_colls(op, name_only: false)
66
78
  database = entities.get(:database, op.use!('object'))
67
79
  use_arguments(op) do |args|
68
- opts = {}
80
+ opts = extract_options(args, 'filter', 'timeoutMode', allow_extra: true)
81
+ symbolize_options!(opts, :timeout_mode)
82
+
69
83
  if session = args.use('session')
70
84
  opts[:session] = entities.get(:session, session)
71
85
  end
72
- if filter = args.use('filter')
73
- opts[:filter] = filter
86
+ if timeout_ms = args.use('timeoutMS')
87
+ opts[:timeout_ms] = timeout_ms
74
88
  end
89
+
75
90
  database.list_collections(**opts.merge(name_only: name_only))
76
91
  end
77
92
  end
@@ -126,14 +141,25 @@ module Unified
126
141
  def list_indexes(op)
127
142
  collection = entities.get(:collection, op.use!('object'))
128
143
  use_arguments(op) do |args|
129
- opts = {}
144
+ opts = extract_options(args, 'timeoutMode', allow_extra: true)
130
145
  if session = args.use('session')
131
146
  opts[:session] = entities.get(:session, session)
132
147
  end
148
+ if timeout_ms = args.use('timeoutMS')
149
+ opts[:timeout_ms] = timeout_ms
150
+ end
133
151
  collection.indexes(**opts).to_a
134
152
  end
135
153
  end
136
154
 
155
+ def drop_indexes(op)
156
+ collection = entities.get(:collection, op.use!('object'))
157
+ use_arguments(op) do |args|
158
+ opts = extract_options(args, 'maxTimeMS', 'timeoutMS', allow_extra: true)
159
+ collection.indexes.drop_all(**opts)
160
+ end
161
+ end
162
+
137
163
  def create_index(op)
138
164
  collection = entities.get(:collection, op.use!('object'))
139
165
  use_arguments(op) do |args|
@@ -144,7 +170,12 @@ module Unified
144
170
  if args.key?('unique')
145
171
  opts[:unique] = args.use('unique')
146
172
  end
147
-
173
+ if timeout_ms = args.use('timeoutMS')
174
+ opts[:timeout_ms] = timeout_ms
175
+ end
176
+ if max_time_ms = args.use('maxTimeMS')
177
+ opts[:max_time_ms] = max_time_ms
178
+ end
148
179
  collection.indexes.create_one(
149
180
  args.use!('keys'),
150
181
  name: args.use('name'),
@@ -156,7 +187,7 @@ module Unified
156
187
  def drop_index(op)
157
188
  collection = entities.get(:collection, op.use!('object'))
158
189
  use_arguments(op) do |args|
159
- opts = {}
190
+ opts = extract_options(args, 'maxTimeMS', 'timeoutMS', allow_extra: true)
160
191
  if session = args.use('session')
161
192
  opts[:session] = entities.get(:session, session)
162
193
  end
@@ -188,7 +219,7 @@ module Unified
188
219
  begin
189
220
  index = collection.indexes.get(args.use!('indexName'))
190
221
  raise Error::ResultMismatch, "Index found"
191
- rescue Mongo::Error::OperationFailure => e
222
+ rescue Mongo::Error::OperationFailure::Family => e
192
223
  if e.code == 26
193
224
  # OK
194
225
  else
@@ -5,17 +5,38 @@ module Unified
5
5
 
6
6
  module GridFsOperations
7
7
 
8
+ def gridfs_find(op)
9
+ bucket = entities.get(:bucket, op.use!('object'))
10
+ use_arguments(op) do |args|
11
+ filter = args.use!('filter')
12
+
13
+ opts = extract_options(args, 'allowDiskUse',
14
+ 'skip', 'hint','timeoutMS',
15
+ 'noCursorTimeout', 'sort', 'limit')
16
+
17
+ bucket.find(filter,opts).to_a
18
+ end
19
+ end
20
+
8
21
  def delete(op)
9
22
  bucket = entities.get(:bucket, op.use!('object'))
10
23
  use_arguments(op) do |args|
11
- bucket.delete(args.use!('id'))
24
+ opts = {}
25
+ if timeout_ms = args.use('timeoutMS')
26
+ opts[:timeout_ms] = timeout_ms
27
+ end
28
+ bucket.delete(args.use!('id'), opts)
12
29
  end
13
30
  end
14
31
 
15
32
  def download(op)
16
33
  bucket = entities.get(:bucket, op.use!('object'))
17
34
  use_arguments(op) do |args|
18
- stream = bucket.open_download_stream(args.use!('id'))
35
+ opts = {}
36
+ if timeout_ms = args.use('timeoutMS')
37
+ opts[:timeout_ms] = timeout_ms
38
+ end
39
+ stream = bucket.open_download_stream(args.use!('id'), opts)
19
40
  stream.read
20
41
  end
21
42
  end
@@ -48,6 +69,9 @@ module Unified
48
69
  if disable_md5 = args.use('disableMD5')
49
70
  opts[:disable_md5] = disable_md5
50
71
  end
72
+ if timeout_ms = args.use('timeoutMS')
73
+ opts[:timeout_ms] = timeout_ms
74
+ end
51
75
  contents = transform_contents(args.use!('source'))
52
76
  file_id = nil
53
77
  bucket.open_upload_stream(args.use!('filename'), **opts) do |stream|
@@ -58,6 +82,17 @@ module Unified
58
82
  end
59
83
  end
60
84
 
85
+ def drop(op)
86
+ bucket = entities.get(:bucket, op.use!('object'))
87
+ use_arguments(op) do |args|
88
+ opts = {}
89
+ if timeout_ms = args.use('timeoutMS')
90
+ opts[:timeout_ms] = timeout_ms
91
+ end
92
+ bucket.drop(opts)
93
+ end
94
+ end
95
+
61
96
  private
62
97
 
63
98
  def transform_contents(contents)
@@ -0,0 +1,63 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Unified
4
+ # The definitions of available search index operations, as used by the
5
+ # unified tests.
6
+ module SearchIndexOperations
7
+ def create_search_index(op)
8
+ collection = entities.get(:collection, op.use!('object'))
9
+
10
+ use_arguments(op) do |args|
11
+ model = args.use('model')
12
+ name = model.use('name')
13
+ definition = model.use('definition')
14
+ collection.search_indexes.create_one(definition, name: name)
15
+ end
16
+ end
17
+
18
+ def create_search_indexes(op)
19
+ collection = entities.get(:collection, op.use!('object'))
20
+
21
+ use_arguments(op) do |args|
22
+ models = args.use('models')
23
+ collection.search_indexes.create_many(models)
24
+ end
25
+ end
26
+
27
+ def drop_search_index(op)
28
+ collection = entities.get(:collection, op.use!('object'))
29
+
30
+ use_arguments(op) do |args|
31
+ collection.search_indexes.drop_one(
32
+ id: args.use('id'),
33
+ name: args.use('name')
34
+ )
35
+ end
36
+ end
37
+
38
+ def list_search_indexes(op)
39
+ collection = entities.get(:collection, op.use!('object'))
40
+
41
+ use_arguments(op) do |args|
42
+ agg_opts = args.use('aggregationOptions') || {}
43
+ collection.search_indexes(
44
+ id: args.use('id'),
45
+ name: args.use('name'),
46
+ aggregate: ::Utils.underscore_hash(agg_opts)
47
+ ).to_a
48
+ end
49
+ end
50
+
51
+ def update_search_index(op)
52
+ collection = entities.get(:collection, op.use!('object'))
53
+
54
+ use_arguments(op) do |args|
55
+ collection.search_indexes.update_one(
56
+ args.use('definition'),
57
+ id: args.use('id'),
58
+ name: args.use('name')
59
+ )
60
+ end
61
+ end
62
+ end
63
+ end
@@ -20,6 +20,9 @@ module Unified
20
20
  if read_preference = args.use('readPreference')
21
21
  opts[:read] = ::Utils.snakeize_hash(read_preference)
22
22
  end
23
+ if timeout_ms = args.use('timeoutMS')
24
+ opts[:timeout_ms] = timeout_ms
25
+ end
23
26
 
24
27
  database.command(cmd, **opts)
25
28
  end
@@ -70,8 +73,7 @@ module Unified
70
73
  consume_test_runner(op)
71
74
  use_arguments(op) do |args|
72
75
  session = entities.get(:session, args.use!('session'))
73
- # https://jira.mongodb.org/browse/RUBY-1813
74
- true
76
+ session.dirty? || raise(Error::ResultMismatch, 'expected session to be dirty')
75
77
  end
76
78
  end
77
79
 
@@ -79,8 +81,7 @@ module Unified
79
81
  consume_test_runner(op)
80
82
  use_arguments(op) do |args|
81
83
  session = entities.get(:session, args.use!('session'))
82
- # https://jira.mongodb.org/browse/RUBY-1813
83
- true
84
+ session.dirty? && raise(Error::ResultMismatch, 'expected session to be not dirty')
84
85
  end
85
86
  end
86
87
 
@@ -92,7 +93,7 @@ module Unified
92
93
  unless subscriber.started_events.length >= 2
93
94
  raise Error::ResultMismatch, "Must have at least 2 events, have #{subscriber.started_events.length}"
94
95
  end
95
- lsids = subscriber.started_events[-2...-1].map do |cmd|
96
+ lsids = subscriber.started_events[-2..-1].map do |cmd|
96
97
  cmd.command.fetch('lsid')
97
98
  end
98
99
  if expected
@@ -131,14 +132,20 @@ module Unified
131
132
 
132
133
  def commit_transaction(op)
133
134
  session = entities.get(:session, op.use!('object'))
134
- assert_no_arguments(op)
135
- session.commit_transaction
135
+ opts = {}
136
+ use_arguments(op) do |args|
137
+ opts[:timeout_ms] = args.use('timeoutMS')
138
+ end
139
+ session.commit_transaction(opts.compact)
136
140
  end
137
141
 
138
142
  def abort_transaction(op)
139
143
  session = entities.get(:session, op.use!('object'))
140
- assert_no_arguments(op)
141
- session.abort_transaction
144
+ opts = {}
145
+ use_arguments(op) do |args|
146
+ opts[:timeout_ms] = args.use('timeoutMS')
147
+ end
148
+ session.abort_transaction(opts.compact)
142
149
  end
143
150
 
144
151
  def with_transaction(op)
@@ -313,6 +320,36 @@ module Unified
313
320
 
314
321
  private
315
322
 
323
+ # @param [ UsingHash ] args the arguments to extract options from
324
+ # @param [ Array<String | Hash> ] keys an array of strings and Hashes,
325
+ # where Hashes represent a mapping from the MDB key to the correspoding
326
+ # Ruby key. For Strings, the Ruby key is assumed to be a simple conversion
327
+ # of the MDB key, from camel-case to snake-case.
328
+ # @param [ true | false ] allow_extra whether or not extra keys are allowed
329
+ # to exist in the args hash, beyond those listed.
330
+ def extract_options(args, *keys, allow_extra: false)
331
+ {}.tap do |opts|
332
+ keys.each do |key|
333
+ Array(key).each do |mdb_key, ruby_key|
334
+ value = args.use(mdb_key)
335
+ opts[ruby_key || mdb_name_to_ruby(mdb_key)] = value unless value.nil?
336
+ end
337
+ end
338
+
339
+ raise NotImplementedError, "unhandled keys: #{args}" if !allow_extra && !args.empty?
340
+ end
341
+ end
342
+
343
+ def symbolize_options!(opts, *keys)
344
+ keys.each do |key|
345
+ opts[key] = mdb_name_to_ruby(opts[key]) if opts[key]
346
+ end
347
+ end
348
+
349
+ def mdb_name_to_ruby(name)
350
+ name.to_s.gsub(/([a-z])([A-Z])/) { "#{$1}_#{$2}" }.downcase.to_sym
351
+ end
352
+
316
353
  def assert_no_arguments(op)
317
354
  if op.key?('arguments')
318
355
  raise NotimplementedError, "Arguments are not allowed"