mongo 2.13.0 → 2.15.0.alpha

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 (375) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +1 -4
  3. data.tar.gz.sig +0 -0
  4. data/README.md +4 -1
  5. data/Rakefile +46 -18
  6. data/lib/mongo.rb +32 -0
  7. data/lib/mongo/address.rb +1 -1
  8. data/lib/mongo/address/ipv4.rb +1 -1
  9. data/lib/mongo/address/ipv6.rb +1 -1
  10. data/lib/mongo/auth/aws/conversation.rb +1 -4
  11. data/lib/mongo/auth/base.rb +13 -7
  12. data/lib/mongo/auth/conversation_base.rb +32 -0
  13. data/lib/mongo/auth/cr/conversation.rb +6 -29
  14. data/lib/mongo/auth/gssapi/conversation.rb +4 -15
  15. data/lib/mongo/auth/ldap/conversation.rb +3 -14
  16. data/lib/mongo/auth/sasl_conversation_base.rb +1 -13
  17. data/lib/mongo/auth/scram_conversation_base.rb +7 -34
  18. data/lib/mongo/auth/user/view.rb +16 -9
  19. data/lib/mongo/auth/x509/conversation.rb +4 -25
  20. data/lib/mongo/background_thread.rb +11 -0
  21. data/lib/mongo/bulk_write.rb +38 -18
  22. data/lib/mongo/caching_cursor.rb +74 -0
  23. data/lib/mongo/client.rb +142 -16
  24. data/lib/mongo/cluster.rb +22 -31
  25. data/lib/mongo/cluster/reapers/cursor_reaper.rb +6 -2
  26. data/lib/mongo/cluster/sdam_flow.rb +14 -0
  27. data/lib/mongo/cluster/topology/single.rb +1 -1
  28. data/lib/mongo/collection.rb +58 -18
  29. data/lib/mongo/collection/view.rb +24 -20
  30. data/lib/mongo/collection/view/aggregation.rb +26 -5
  31. data/lib/mongo/collection/view/builder/find_command.rb +38 -18
  32. data/lib/mongo/collection/view/change_stream.rb +1 -1
  33. data/lib/mongo/collection/view/explainable.rb +27 -8
  34. data/lib/mongo/collection/view/iterable.rb +73 -13
  35. data/lib/mongo/collection/view/map_reduce.rb +2 -2
  36. data/lib/mongo/collection/view/readable.rb +57 -21
  37. data/lib/mongo/collection/view/writable.rb +29 -15
  38. data/lib/mongo/crypt/encryption_io.rb +6 -6
  39. data/lib/mongo/cursor.rb +18 -5
  40. data/lib/mongo/database.rb +28 -5
  41. data/lib/mongo/database/view.rb +2 -2
  42. data/lib/mongo/error.rb +11 -1
  43. data/lib/mongo/error/bulk_write_error.rb +17 -3
  44. data/lib/mongo/error/internal_driver_error.rb +22 -0
  45. data/lib/mongo/error/invalid_read_concern.rb +28 -0
  46. data/lib/mongo/error/operation_failure.rb +26 -7
  47. data/lib/mongo/error/parser.rb +65 -12
  48. data/lib/mongo/error/server_api_conflict.rb +23 -0
  49. data/lib/mongo/error/server_api_not_supported.rb +24 -0
  50. data/lib/mongo/error/server_certificate_revoked.rb +22 -0
  51. data/lib/mongo/error/unmet_dependency.rb +21 -0
  52. data/lib/mongo/error/unsupported_option.rb +14 -12
  53. data/lib/mongo/grid/fs_bucket.rb +37 -37
  54. data/lib/mongo/index/view.rb +21 -11
  55. data/lib/mongo/lint.rb +2 -1
  56. data/lib/mongo/logger.rb +3 -3
  57. data/lib/mongo/monitoring.rb +13 -4
  58. data/lib/mongo/monitoring/event/server_heartbeat_failed.rb +27 -16
  59. data/lib/mongo/monitoring/event/server_heartbeat_succeeded.rb +26 -15
  60. data/lib/mongo/operation.rb +4 -2
  61. data/lib/mongo/operation/aggregate/result.rb +9 -8
  62. data/lib/mongo/operation/collections_info.rb +18 -1
  63. data/lib/mongo/operation/collections_info/command.rb +5 -0
  64. data/lib/mongo/operation/collections_info/result.rb +18 -1
  65. data/lib/mongo/operation/context.rb +99 -0
  66. data/lib/mongo/operation/delete/bulk_result.rb +2 -0
  67. data/lib/mongo/operation/delete/result.rb +3 -0
  68. data/lib/mongo/operation/explain/command.rb +4 -0
  69. data/lib/mongo/operation/explain/legacy.rb +4 -0
  70. data/lib/mongo/operation/explain/op_msg.rb +6 -0
  71. data/lib/mongo/operation/explain/result.rb +3 -0
  72. data/lib/mongo/operation/find/legacy/result.rb +2 -0
  73. data/lib/mongo/operation/find/result.rb +13 -0
  74. data/lib/mongo/operation/get_more/result.rb +3 -0
  75. data/lib/mongo/operation/indexes.rb +15 -1
  76. data/lib/mongo/operation/indexes/result.rb +5 -0
  77. data/lib/mongo/operation/insert/bulk_result.rb +5 -0
  78. data/lib/mongo/operation/insert/command.rb +2 -2
  79. data/lib/mongo/operation/insert/legacy.rb +2 -2
  80. data/lib/mongo/operation/insert/op_msg.rb +2 -2
  81. data/lib/mongo/operation/insert/result.rb +5 -0
  82. data/lib/mongo/operation/list_collections/result.rb +9 -1
  83. data/lib/mongo/operation/map_reduce/result.rb +10 -0
  84. data/lib/mongo/operation/parallel_scan/result.rb +4 -0
  85. data/lib/mongo/operation/result.rb +37 -6
  86. data/lib/mongo/operation/shared/bypass_document_validation.rb +1 -0
  87. data/lib/mongo/operation/shared/causal_consistency_supported.rb +1 -0
  88. data/lib/mongo/operation/shared/executable.rb +25 -14
  89. data/lib/mongo/operation/shared/executable_no_validate.rb +2 -2
  90. data/lib/mongo/operation/shared/idable.rb +2 -1
  91. data/lib/mongo/operation/shared/limited.rb +1 -0
  92. data/lib/mongo/operation/shared/object_id_generator.rb +1 -0
  93. data/lib/mongo/operation/shared/op_msg_or_command.rb +1 -7
  94. data/lib/mongo/operation/shared/op_msg_or_find_command.rb +1 -7
  95. data/lib/mongo/operation/shared/polymorphic_operation.rb +39 -0
  96. data/lib/mongo/operation/shared/response_handling.rb +23 -23
  97. data/lib/mongo/operation/shared/result/aggregatable.rb +1 -0
  98. data/lib/mongo/operation/shared/sessions_supported.rb +14 -2
  99. data/lib/mongo/operation/shared/specifiable.rb +1 -0
  100. data/lib/mongo/operation/shared/write.rb +9 -18
  101. data/lib/mongo/operation/shared/write_concern_supported.rb +1 -0
  102. data/lib/mongo/operation/update/legacy/result.rb +7 -0
  103. data/lib/mongo/operation/update/result.rb +8 -0
  104. data/lib/mongo/operation/users_info/result.rb +3 -0
  105. data/lib/mongo/protocol/compressed.rb +51 -5
  106. data/lib/mongo/protocol/message.rb +31 -4
  107. data/lib/mongo/protocol/msg.rb +37 -12
  108. data/lib/mongo/protocol/query.rb +36 -0
  109. data/lib/mongo/query_cache.rb +272 -0
  110. data/lib/mongo/retryable.rb +9 -2
  111. data/lib/mongo/server.rb +12 -16
  112. data/lib/mongo/server/app_metadata.rb +52 -18
  113. data/lib/mongo/server/connection.rb +5 -0
  114. data/lib/mongo/server/connection_base.rb +16 -15
  115. data/lib/mongo/server/connection_common.rb +2 -2
  116. data/lib/mongo/server/connection_pool.rb +9 -4
  117. data/lib/mongo/server/description.rb +12 -1
  118. data/lib/mongo/server/description/features.rb +9 -8
  119. data/lib/mongo/server/monitor.rb +21 -2
  120. data/lib/mongo/server/monitor/app_metadata.rb +1 -1
  121. data/lib/mongo/server/monitor/connection.rb +12 -13
  122. data/lib/mongo/server/pending_connection.rb +26 -8
  123. data/lib/mongo/server/push_monitor.rb +12 -2
  124. data/lib/mongo/server_selector/base.rb +5 -1
  125. data/lib/mongo/session.rb +7 -3
  126. data/lib/mongo/session/session_pool.rb +4 -2
  127. data/lib/mongo/socket.rb +35 -8
  128. data/lib/mongo/socket/ocsp_cache.rb +97 -0
  129. data/lib/mongo/socket/ocsp_verifier.rb +368 -0
  130. data/lib/mongo/socket/ssl.rb +53 -24
  131. data/lib/mongo/srv/monitor.rb +7 -24
  132. data/lib/mongo/srv/resolver.rb +14 -10
  133. data/lib/mongo/timeout.rb +2 -0
  134. data/lib/mongo/uri.rb +21 -390
  135. data/lib/mongo/uri/options_mapper.rb +620 -0
  136. data/lib/mongo/uri/srv_protocol.rb +3 -2
  137. data/lib/mongo/utils.rb +27 -1
  138. data/lib/mongo/version.rb +1 -1
  139. data/spec/NOTES.aws-auth.md +12 -7
  140. data/spec/README.md +87 -2
  141. data/spec/integration/auth_spec.rb +25 -15
  142. data/spec/integration/bson_symbol_spec.rb +4 -2
  143. data/spec/integration/bulk_write_error_message_spec.rb +41 -0
  144. data/spec/integration/bulk_write_spec.rb +48 -0
  145. data/spec/integration/change_stream_spec.rb +5 -5
  146. data/spec/integration/client_authentication_options_spec.rb +92 -28
  147. data/spec/integration/client_side_encryption/auto_encryption_bulk_writes_spec.rb +6 -2
  148. data/spec/integration/command_monitoring_spec.rb +2 -2
  149. data/spec/integration/connection_pool_populator_spec.rb +4 -2
  150. data/spec/integration/connection_spec.rb +2 -0
  151. data/spec/integration/cursor_reaping_spec.rb +54 -18
  152. data/spec/integration/docs_examples_spec.rb +8 -1
  153. data/spec/integration/fork_reconnect_spec.rb +60 -2
  154. data/spec/integration/ocsp_connectivity_spec.rb +26 -0
  155. data/spec/integration/ocsp_verifier_cache_spec.rb +188 -0
  156. data/spec/integration/ocsp_verifier_spec.rb +340 -0
  157. data/spec/integration/operation_failure_code_spec.rb +1 -1
  158. data/spec/integration/operation_failure_message_spec.rb +90 -0
  159. data/spec/integration/query_cache_spec.rb +1045 -0
  160. data/spec/integration/query_cache_transactions_spec.rb +190 -0
  161. data/spec/integration/reconnect_spec.rb +1 -1
  162. data/spec/integration/retryable_writes/retryable_writes_40_and_newer_spec.rb +1 -0
  163. data/spec/integration/retryable_writes/shared/performs_legacy_retries.rb +2 -0
  164. data/spec/integration/sdam_error_handling_spec.rb +86 -1
  165. data/spec/integration/sdam_events_spec.rb +8 -7
  166. data/spec/integration/server_selection_spec.rb +36 -0
  167. data/spec/integration/size_limit_spec.rb +20 -19
  168. data/spec/integration/snappy_compression_spec.rb +25 -0
  169. data/spec/integration/srv_monitoring_spec.rb +39 -4
  170. data/spec/integration/srv_spec.rb +56 -0
  171. data/spec/integration/transactions_examples_spec.rb +23 -7
  172. data/spec/integration/zlib_compression_spec.rb +1 -1
  173. data/spec/integration/zstd_compression_spec.rb +26 -0
  174. data/spec/lite_spec_helper.rb +15 -5
  175. data/spec/mongo/address_spec.rb +16 -12
  176. data/spec/mongo/auth/ldap/conversation_spec.rb +1 -1
  177. data/spec/mongo/auth/ldap_spec.rb +5 -1
  178. data/spec/mongo/auth/scram_negotiation_spec.rb +1 -1
  179. data/spec/mongo/auth/scram_spec.rb +1 -1
  180. data/spec/mongo/auth/user_spec.rb +1 -1
  181. data/spec/mongo/auth/x509/conversation_spec.rb +3 -3
  182. data/spec/mongo/bulk_write_spec.rb +2 -2
  183. data/spec/mongo/caching_cursor_spec.rb +70 -0
  184. data/spec/mongo/client_construction_spec.rb +273 -35
  185. data/spec/mongo/client_encryption_spec.rb +16 -10
  186. data/spec/mongo/client_spec.rb +64 -0
  187. data/spec/mongo/cluster/topology/replica_set_spec.rb +1 -1
  188. data/spec/mongo/cluster/topology/sharded_spec.rb +1 -1
  189. data/spec/mongo/cluster/topology/single_spec.rb +15 -6
  190. data/spec/mongo/cluster/topology/unknown_spec.rb +1 -1
  191. data/spec/mongo/cluster/topology_spec.rb +1 -1
  192. data/spec/mongo/cluster_spec.rb +6 -18
  193. data/spec/mongo/collection/view/change_stream_resume_spec.rb +1 -1
  194. data/spec/mongo/collection/view/explainable_spec.rb +87 -4
  195. data/spec/mongo/collection/view/map_reduce_spec.rb +2 -0
  196. data/spec/mongo/collection/view/readable_spec.rb +50 -0
  197. data/spec/mongo/collection_crud_spec.rb +4357 -0
  198. data/spec/mongo/collection_ddl_spec.rb +534 -0
  199. data/spec/mongo/collection_spec.rb +5 -4787
  200. data/spec/mongo/crypt/auto_decryption_context_spec.rb +1 -1
  201. data/spec/mongo/crypt/auto_encryption_context_spec.rb +1 -1
  202. data/spec/mongo/crypt/binary_spec.rb +1 -6
  203. data/spec/mongo/crypt/binding/binary_spec.rb +1 -6
  204. data/spec/mongo/crypt/binding/context_spec.rb +2 -7
  205. data/spec/mongo/crypt/binding/helpers_spec.rb +1 -6
  206. data/spec/mongo/crypt/binding/mongocrypt_spec.rb +2 -7
  207. data/spec/mongo/crypt/binding/status_spec.rb +1 -6
  208. data/spec/mongo/crypt/binding/version_spec.rb +1 -6
  209. data/spec/mongo/crypt/data_key_context_spec.rb +1 -1
  210. data/spec/mongo/crypt/explicit_decryption_context_spec.rb +1 -1
  211. data/spec/mongo/crypt/explicit_encryption_context_spec.rb +1 -1
  212. data/spec/mongo/crypt/status_spec.rb +1 -6
  213. data/spec/mongo/database_spec.rb +174 -4
  214. data/spec/mongo/error/bulk_write_error_spec.rb +3 -3
  215. data/spec/mongo/error/no_server_available_spec.rb +1 -1
  216. data/spec/mongo/error/parser_spec.rb +37 -6
  217. data/spec/mongo/index/view_spec.rb +8 -2
  218. data/spec/mongo/logger_spec.rb +13 -11
  219. data/spec/mongo/monitoring/event/server_closed_spec.rb +1 -1
  220. data/spec/mongo/monitoring/event/server_heartbeat_failed_spec.rb +1 -1
  221. data/spec/mongo/monitoring/event/server_heartbeat_succeeded_spec.rb +1 -1
  222. data/spec/mongo/monitoring/event/server_opening_spec.rb +1 -1
  223. data/spec/mongo/monitoring/event/topology_changed_spec.rb +1 -1
  224. data/spec/mongo/monitoring/event/topology_closed_spec.rb +1 -1
  225. data/spec/mongo/monitoring/event/topology_opening_spec.rb +1 -1
  226. data/spec/mongo/operation/aggregate_spec.rb +2 -1
  227. data/spec/mongo/operation/collections_info_spec.rb +4 -1
  228. data/spec/mongo/operation/command_spec.rb +6 -3
  229. data/spec/mongo/operation/create_index_spec.rb +6 -3
  230. data/spec/mongo/operation/create_user_spec.rb +6 -3
  231. data/spec/mongo/operation/delete/bulk_spec.rb +9 -6
  232. data/spec/mongo/operation/delete/op_msg_spec.rb +3 -3
  233. data/spec/mongo/operation/delete_spec.rb +11 -7
  234. data/spec/mongo/operation/drop_index_spec.rb +6 -2
  235. data/spec/mongo/operation/find/legacy_spec.rb +3 -1
  236. data/spec/mongo/operation/get_more_spec.rb +3 -1
  237. data/spec/mongo/operation/indexes_spec.rb +5 -1
  238. data/spec/mongo/operation/insert/bulk_spec.rb +10 -7
  239. data/spec/mongo/operation/insert/command_spec.rb +2 -2
  240. data/spec/mongo/operation/insert/op_msg_spec.rb +3 -3
  241. data/spec/mongo/operation/insert_spec.rb +15 -12
  242. data/spec/mongo/operation/map_reduce_spec.rb +5 -2
  243. data/spec/mongo/operation/read_preference_op_msg_spec.rb +1 -1
  244. data/spec/mongo/operation/remove_user_spec.rb +6 -3
  245. data/spec/mongo/operation/result_spec.rb +1 -1
  246. data/spec/mongo/operation/update/bulk_spec.rb +9 -6
  247. data/spec/mongo/operation/update/command_spec.rb +2 -2
  248. data/spec/mongo/operation/update/op_msg_spec.rb +3 -3
  249. data/spec/mongo/operation/update_spec.rb +10 -7
  250. data/spec/mongo/operation/update_user_spec.rb +4 -1
  251. data/spec/mongo/protocol/compressed_spec.rb +26 -12
  252. data/spec/mongo/query_cache_middleware_spec.rb +55 -0
  253. data/spec/mongo/query_cache_spec.rb +280 -0
  254. data/spec/mongo/retryable_spec.rb +3 -2
  255. data/spec/mongo/server/app_metadata_shared.rb +2 -2
  256. data/spec/mongo/server/app_metadata_spec.rb +2 -0
  257. data/spec/mongo/server/connection_pool/populator_spec.rb +3 -1
  258. data/spec/mongo/server/connection_pool_spec.rb +8 -4
  259. data/spec/mongo/server/connection_spec.rb +39 -25
  260. data/spec/mongo/server/description_spec.rb +18 -0
  261. data/spec/mongo/server/monitor/connection_spec.rb +17 -7
  262. data/spec/mongo/server/monitor_spec.rb +9 -1
  263. data/spec/mongo/server_selector_spec.rb +2 -2
  264. data/spec/mongo/server_spec.rb +15 -2
  265. data/spec/mongo/socket/ssl_spec.rb +44 -4
  266. data/spec/mongo/socket_spec.rb +2 -2
  267. data/spec/mongo/tls_context_hooks_spec.rb +37 -0
  268. data/spec/mongo/uri/srv_protocol_spec.rb +64 -33
  269. data/spec/mongo/uri_option_parsing_spec.rb +11 -11
  270. data/spec/mongo/uri_spec.rb +68 -41
  271. data/spec/mongo/utils_spec.rb +39 -0
  272. data/spec/runners/auth.rb +3 -0
  273. data/spec/runners/change_streams/test.rb +1 -1
  274. data/spec/runners/connection_string.rb +31 -124
  275. data/spec/runners/crud/requirement.rb +40 -3
  276. data/spec/runners/crud/test_base.rb +0 -19
  277. data/spec/runners/crud/verifier.rb +8 -0
  278. data/spec/runners/server_selection.rb +1 -1
  279. data/spec/runners/transactions/operation.rb +13 -2
  280. data/spec/runners/transactions/test.rb +3 -2
  281. data/spec/runners/unified.rb +96 -0
  282. data/spec/runners/unified/assertions.rb +249 -0
  283. data/spec/runners/unified/change_stream_operations.rb +26 -0
  284. data/spec/runners/unified/crud_operations.rb +199 -0
  285. data/spec/runners/unified/ddl_operations.rb +96 -0
  286. data/spec/runners/unified/entity_map.rb +39 -0
  287. data/spec/runners/unified/error.rb +25 -0
  288. data/spec/runners/unified/event_subscriber.rb +91 -0
  289. data/spec/runners/unified/exceptions.rb +21 -0
  290. data/spec/runners/unified/grid_fs_operations.rb +55 -0
  291. data/spec/runners/unified/support_operations.rb +250 -0
  292. data/spec/runners/unified/test.rb +393 -0
  293. data/spec/runners/unified/test_group.rb +28 -0
  294. data/spec/runners/unified/using_hash.rb +31 -0
  295. data/spec/shared/LICENSE +20 -0
  296. data/spec/shared/bin/get-mongodb-download-url +17 -0
  297. data/spec/shared/lib/mrss/child_process_helper.rb +80 -0
  298. data/spec/shared/lib/mrss/cluster_config.rb +218 -0
  299. data/spec/shared/lib/mrss/constraints.rb +346 -0
  300. data/spec/shared/lib/mrss/docker_runner.rb +262 -0
  301. data/spec/shared/lib/mrss/lite_constraints.rb +175 -0
  302. data/spec/shared/lib/mrss/server_version_registry.rb +112 -0
  303. data/spec/shared/lib/mrss/spec_organizer.rb +149 -0
  304. data/spec/shared/lib/mrss/utils.rb +15 -0
  305. data/spec/shared/share/Dockerfile.erb +231 -0
  306. data/spec/shared/shlib/distro.sh +73 -0
  307. data/spec/shared/shlib/server.sh +290 -0
  308. data/spec/shared/shlib/set_env.sh +128 -0
  309. data/spec/solo/clean_exit_spec.rb +21 -0
  310. data/spec/spec_helper.rb +7 -2
  311. data/spec/spec_tests/cmap_spec.rb +7 -3
  312. data/spec/spec_tests/crud_unified_spec.rb +10 -0
  313. data/spec/spec_tests/data/change_streams/change-streams-errors.yml +0 -1
  314. data/spec/spec_tests/data/change_streams/change-streams.yml +0 -2
  315. data/spec/spec_tests/data/cmap/pool-checkout-connection.yml +6 -2
  316. data/spec/spec_tests/data/cmap/pool-create-min-size.yml +3 -0
  317. data/spec/spec_tests/data/connection_string/valid-warnings.yml +24 -0
  318. data/spec/spec_tests/data/crud_unified/estimatedDocumentCount.yml +267 -0
  319. data/spec/spec_tests/data/retryable_reads/estimatedDocumentCount-4.9.yml +60 -0
  320. data/spec/spec_tests/data/retryable_reads/{estimatedDocumentCount.yml → estimatedDocumentCount-pre4.9.yml} +2 -0
  321. data/spec/spec_tests/data/retryable_reads/estimatedDocumentCount-serverErrors-4.9.yml +146 -0
  322. data/spec/spec_tests/data/retryable_reads/{estimatedDocumentCount-serverErrors.yml → estimatedDocumentCount-serverErrors-pre4.9.yml} +2 -0
  323. data/spec/spec_tests/data/retryable_reads/listIndexNames.yml +1 -1
  324. data/spec/spec_tests/data/sdam_monitoring/discovered_standalone.yml +1 -3
  325. data/spec/spec_tests/data/sdam_monitoring/standalone.yml +2 -2
  326. data/spec/spec_tests/data/sdam_monitoring/standalone_repeated.yml +2 -2
  327. data/spec/spec_tests/data/sdam_monitoring/standalone_suppress_equal_description_changes.yml +2 -2
  328. data/spec/spec_tests/data/sdam_monitoring/standalone_to_rs_with_me_mismatch.yml +2 -2
  329. data/spec/spec_tests/data/unified/valid-fail/operation-failure.yml +31 -0
  330. data/spec/spec_tests/data/unified/valid-pass/poc-change-streams.yml +220 -0
  331. data/spec/spec_tests/data/unified/valid-pass/poc-command-monitoring.yml +102 -0
  332. data/spec/spec_tests/data/unified/valid-pass/poc-crud.yml +184 -0
  333. data/spec/spec_tests/data/unified/valid-pass/poc-gridfs.yml +155 -0
  334. data/spec/spec_tests/data/unified/valid-pass/poc-retryable-reads.yml +193 -0
  335. data/spec/spec_tests/data/unified/valid-pass/poc-retryable-writes.yml +210 -0
  336. data/spec/spec_tests/data/unified/valid-pass/poc-sessions.yml +215 -0
  337. data/spec/spec_tests/data/unified/valid-pass/poc-transactions-convenient-api.yml +235 -0
  338. data/spec/spec_tests/data/unified/valid-pass/poc-transactions-mongos-pin-auto.yml +169 -0
  339. data/spec/spec_tests/data/unified/valid-pass/poc-transactions.yml +170 -0
  340. data/spec/spec_tests/data/uri_options/auth-options.yml +25 -0
  341. data/spec/spec_tests/data/uri_options/compression-options.yml +7 -4
  342. data/spec/spec_tests/data/uri_options/read-preference-options.yml +24 -0
  343. data/spec/spec_tests/data/uri_options/ruby-connection-options.yml +1 -0
  344. data/spec/spec_tests/data/uri_options/tls-options.yml +160 -4
  345. data/spec/spec_tests/data/versioned_api/crud-api-version-1-strict.yml +416 -0
  346. data/spec/spec_tests/data/versioned_api/crud-api-version-1.yml +409 -0
  347. data/spec/spec_tests/data/versioned_api/runcommand-helper-no-api-version-declared.yml +67 -0
  348. data/spec/spec_tests/data/versioned_api/test-commands-deprecation-errors.yml +47 -0
  349. data/spec/spec_tests/data/versioned_api/test-commands-strict-mode.yml +44 -0
  350. data/spec/spec_tests/data/versioned_api/transaction-handling.yml +180 -0
  351. data/spec/spec_tests/dns_seedlist_discovery_spec.rb +9 -1
  352. data/spec/spec_tests/unified_spec.rb +15 -0
  353. data/spec/spec_tests/uri_options_spec.rb +47 -33
  354. data/spec/spec_tests/versioned_api_spec.rb +10 -0
  355. data/spec/stress/fork_reconnect_stress_spec.rb +1 -1
  356. data/spec/support/certificates/atlas-ocsp-ca.crt +28 -0
  357. data/spec/support/certificates/atlas-ocsp.crt +41 -0
  358. data/spec/support/client_registry_macros.rb +11 -2
  359. data/spec/support/common_shortcuts.rb +59 -0
  360. data/spec/support/constraints.rb +6 -253
  361. data/spec/support/matchers.rb +16 -0
  362. data/spec/support/ocsp +1 -0
  363. data/spec/support/session_registry.rb +52 -0
  364. data/spec/support/shared/session.rb +2 -2
  365. data/spec/support/spec_config.rb +68 -3
  366. data/spec/support/spec_setup.rb +48 -38
  367. data/spec/support/utils.rb +102 -4
  368. metadata +1087 -936
  369. metadata.gz.sig +0 -0
  370. data/lib/mongo/operation/shared/collections_info_or_list_collections.rb +0 -56
  371. data/lib/mongo/operation/shared/op_msg_or_list_indexes_command.rb +0 -47
  372. data/spec/support/child_process_helper.rb +0 -78
  373. data/spec/support/cluster_config.rb +0 -207
  374. data/spec/support/lite_constraints.rb +0 -141
  375. data/spec/support/spec_organizer.rb +0 -129
@@ -78,7 +78,7 @@ describe Mongo::Operation::Update::OpMsg do
78
78
 
79
79
  describe 'write concern' do
80
80
  # https://jira.mongodb.org/browse/RUBY-2224
81
- skip_if_linting
81
+ require_no_linting
82
82
 
83
83
  context 'when write concern is not specified' do
84
84
 
@@ -105,7 +105,7 @@ describe Mongo::Operation::Update::OpMsg do
105
105
 
106
106
  describe '#message' do
107
107
  # https://jira.mongodb.org/browse/RUBY-2224
108
- skip_if_linting
108
+ require_no_linting
109
109
 
110
110
  context 'when the server supports OP_MSG' do
111
111
  min_server_fcv '3.6'
@@ -159,7 +159,7 @@ describe Mongo::Operation::Update::OpMsg do
159
159
 
160
160
  context 'when an implicit session is created and the topology is then updated and the server does not support sessions' do
161
161
  # Mocks on features are incompatible with linting
162
- skip_if_linting
162
+ require_no_linting
163
163
 
164
164
  let(:expected_global_args) do
165
165
  global_args.dup.tap do |args|
@@ -1,6 +1,9 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe Mongo::Operation::Update do
4
+ require_no_required_api_version
5
+
6
+ let(:context) { Mongo::Operation::Context.new }
4
7
 
5
8
  let(:document) do
6
9
  { :q => { :foo => 1 },
@@ -100,7 +103,7 @@ describe Mongo::Operation::Update do
100
103
  end
101
104
 
102
105
  let(:result) do
103
- update.execute(authorized_primary, client: nil)
106
+ update.execute(authorized_primary, context: context)
104
107
  end
105
108
 
106
109
  it 'updates the document' do
@@ -128,7 +131,7 @@ describe Mongo::Operation::Update do
128
131
 
129
132
  it 'raises an exception' do
130
133
  expect {
131
- update.execute(authorized_primary, client: nil)
134
+ update.execute(authorized_primary, context: context)
132
135
  }.to raise_error(Mongo::Error::OperationFailure)
133
136
  end
134
137
  end
@@ -152,7 +155,7 @@ describe Mongo::Operation::Update do
152
155
  end
153
156
 
154
157
  let(:result) do
155
- update.execute(authorized_primary, client: nil)
158
+ update.execute(authorized_primary, context: context)
156
159
  end
157
160
 
158
161
  it 'updates the documents' do
@@ -180,7 +183,7 @@ describe Mongo::Operation::Update do
180
183
 
181
184
  it 'raises an exception' do
182
185
  expect {
183
- update.execute(authorized_primary, client: nil)
186
+ update.execute(authorized_primary, context: context)
184
187
  }.to raise_error(Mongo::Error::OperationFailure)
185
188
  end
186
189
  end
@@ -193,7 +196,7 @@ describe Mongo::Operation::Update do
193
196
 
194
197
  it 'raises an error' do
195
198
  expect {
196
- update.execute(authorized_primary, client: nil)
199
+ update.execute(authorized_primary, context: context)
197
200
  }.to raise_error(Mongo::Error::MaxBSONSize)
198
201
  end
199
202
  end
@@ -205,7 +208,7 @@ describe Mongo::Operation::Update do
205
208
  end
206
209
 
207
210
  let(:result) do
208
- update.execute(authorized_primary, client: nil)
211
+ update.execute(authorized_primary, context: context)
209
212
  end
210
213
 
211
214
  it 'inserts the document' do
@@ -243,7 +246,7 @@ describe Mongo::Operation::Update do
243
246
  end
244
247
 
245
248
  let(:result) do
246
- update.execute(authorized_primary, client: nil)
249
+ update.execute(authorized_primary, context: context)
247
250
  end
248
251
 
249
252
  before do
@@ -1,6 +1,9 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe Mongo::Operation::UpdateUser do
4
+ require_no_required_api_version
5
+
6
+ let(:context) { Mongo::Operation::Context.new }
4
7
 
5
8
  describe '#execute' do
6
9
 
@@ -35,7 +38,7 @@ describe Mongo::Operation::UpdateUser do
35
38
  context 'when user update was successful' do
36
39
 
37
40
  let!(:response) do
38
- operation.execute(root_authorized_primary, client: nil)
41
+ operation.execute(root_authorized_primary, context: context)
39
42
  end
40
43
 
41
44
  it 'updates the user in the database' do
@@ -1,4 +1,4 @@
1
- require 'lite_spec_helper'
1
+ require 'spec_helper'
2
2
 
3
3
  describe Mongo::Protocol::Compressed do
4
4
 
@@ -10,15 +10,35 @@ describe Mongo::Protocol::Compressed do
10
10
  described_class.new(original_message, compressor, level)
11
11
  end
12
12
 
13
+ let(:original_message_bytes) do
14
+ buf = BSON::ByteBuffer.new
15
+ original_message.send(:serialize_fields, buf)
16
+ buf.to_s
17
+ end
18
+
13
19
  describe '#serialize' do
14
20
 
15
- context 'when zlib compression level is not provided' do
21
+ context "when using the snappy compressor" do
22
+ require_snappy_compression
23
+ let(:compressor) { 'snappy' }
24
+
25
+ it "uses snappy" do
26
+ expect(Snappy).to receive(:deflate).with(original_message_bytes).and_call_original
27
+ message.serialize
28
+ end
29
+ end
16
30
 
17
- let(:original_message_bytes) do
18
- buf = BSON::ByteBuffer.new
19
- original_message.send(:serialize_fields, buf)
20
- buf.to_s
31
+ context "when using the zstd compressor" do
32
+ require_zstd_compression
33
+ let(:compressor) { 'zstd' }
34
+
35
+ it "uses zstd with default compression level" do
36
+ expect(Zstd).to receive(:compress).with(original_message_bytes).and_call_original
37
+ message.serialize
21
38
  end
39
+ end
40
+
41
+ context 'when zlib compression level is not provided' do
22
42
 
23
43
  it 'does not set a compression level' do
24
44
  expect(Zlib::Deflate).to receive(:deflate).with(original_message_bytes, nil).and_call_original
@@ -30,12 +50,6 @@ describe Mongo::Protocol::Compressed do
30
50
 
31
51
  let(:level) { 1 }
32
52
 
33
- let(:original_message_bytes) do
34
- buf = BSON::ByteBuffer.new
35
- original_message.send(:serialize_fields, buf)
36
- buf.to_s
37
- end
38
-
39
53
  it 'uses the compression level' do
40
54
  expect(Zlib::Deflate).to receive(:deflate).with(original_message_bytes, 1).and_call_original
41
55
  message.serialize
@@ -0,0 +1,55 @@
1
+ # frozen_string_literal: true
2
+ # encoding: utf-8
3
+
4
+ require "spec_helper"
5
+
6
+ describe Mongo::QueryCache::Middleware do
7
+
8
+ let :middleware do
9
+ described_class.new(app)
10
+ end
11
+
12
+ context "when not touching query cache in the app" do
13
+
14
+ let(:app) do
15
+ lambda do |env|
16
+ @enabled = Mongo::QueryCache.enabled?
17
+ [200, env, "app"]
18
+ end
19
+ end
20
+
21
+ it "returns success" do
22
+ code, _ = middleware.call({})
23
+ expect(code).to eq(200)
24
+ end
25
+
26
+ it "enables the query cache" do
27
+ middleware.call({})
28
+ expect(@enabled).to be true
29
+ end
30
+ end
31
+
32
+ context "when querying in the app" do
33
+
34
+ before do
35
+ authorized_client['test'].insert_one(test: 1)
36
+ end
37
+
38
+ let(:app) do
39
+ lambda do |env|
40
+ authorized_client['test'].find
41
+ [200, env, "app"]
42
+ end
43
+ end
44
+
45
+ it "returns success" do
46
+ code, _ = middleware.call({})
47
+ expect(code).to eq(200)
48
+ end
49
+
50
+ it "cleans the query cache after it responds" do
51
+ middleware.call({})
52
+ expect(Mongo::QueryCache.send(:cache_table)).to be_empty
53
+ end
54
+ end
55
+ end
@@ -0,0 +1,280 @@
1
+ require 'spec_helper'
2
+
3
+ describe Mongo::QueryCache do
4
+
5
+ around do |spec|
6
+ Mongo::QueryCache.clear
7
+ Mongo::QueryCache.cache { spec.run }
8
+ end
9
+
10
+ before do
11
+ authorized_collection.delete_many
12
+ end
13
+
14
+ let(:subscriber) { EventSubscriber.new }
15
+
16
+ let(:client) do
17
+ authorized_client.tap do |client|
18
+ client.subscribe(Mongo::Monitoring::COMMAND, subscriber)
19
+ end
20
+ end
21
+
22
+ let(:authorized_collection) { client['collection_spec'] }
23
+
24
+ let(:events) do
25
+ subscriber.command_started_events('find')
26
+ end
27
+
28
+ describe '#enabled' do
29
+
30
+ context 'when query cache is disabled' do
31
+
32
+ before do
33
+ Mongo::QueryCache.enabled = false
34
+ end
35
+
36
+ it 'disables the query cache' do
37
+ expect(Mongo::QueryCache.enabled?).to be(false)
38
+ end
39
+ end
40
+
41
+ context 'when query cache is enabled' do
42
+
43
+ before do
44
+ Mongo::QueryCache.enabled = true
45
+ end
46
+
47
+ it 'enables the query cache' do
48
+ expect(Mongo::QueryCache.enabled?).to be(true)
49
+ end
50
+ end
51
+ end
52
+
53
+ describe '#cache' do
54
+
55
+ before do
56
+ Mongo::QueryCache.enabled = false
57
+ end
58
+
59
+ it 'enables the query cache inside the block' do
60
+ Mongo::QueryCache.cache do
61
+ expect(Mongo::QueryCache.enabled?).to be(true)
62
+ end
63
+ expect(Mongo::QueryCache.enabled?).to be(false)
64
+ end
65
+ end
66
+
67
+ describe '#uncached' do
68
+
69
+ it 'disables the query cache inside the block' do
70
+ Mongo::QueryCache.uncached do
71
+ expect(Mongo::QueryCache.enabled?).to be(false)
72
+ end
73
+ expect(Mongo::QueryCache.enabled?).to be(true)
74
+ end
75
+ end
76
+
77
+ describe '#cache_table' do
78
+
79
+ before do
80
+ authorized_collection.insert_one({ name: 'testing' })
81
+ authorized_collection.find(name: 'testing').to_a
82
+ end
83
+
84
+ it 'gets the cached query' do
85
+ expect(Mongo::QueryCache.send(:cache_table).length).to eq(1)
86
+ authorized_collection.find(name: 'testing').to_a
87
+ expect(events.length).to eq(1)
88
+ end
89
+ end
90
+
91
+ describe '#clear' do
92
+
93
+ before do
94
+ authorized_collection.insert_one({ name: 'testing' })
95
+ authorized_collection.find(name: 'testing').to_a
96
+ end
97
+
98
+ it 'clears the cache' do
99
+ expect(Mongo::QueryCache.send(:cache_table).length).to eq(1)
100
+ Mongo::QueryCache.clear
101
+ expect(Mongo::QueryCache.send(:cache_table).length).to eq(0)
102
+ end
103
+ end
104
+
105
+ describe '#set' do
106
+ let(:caching_cursor) { double("Mongo::CachingCursor") }
107
+ let(:namespace) { 'db.coll' }
108
+ let(:selector) { { field: 'value' } }
109
+ let(:skip) { 5 }
110
+ let(:sort) { { field: 'asc' } }
111
+ let(:limit) { 5 }
112
+ let(:projection) { { field: 1 } }
113
+ let(:collation) { { locale: 'fr_CA' } }
114
+ let(:read_concern) { { level: :majority } }
115
+ let(:read_preference) { { mode: :secondary } }
116
+
117
+ let(:options) do
118
+ {
119
+ namespace: namespace,
120
+ selector: selector,
121
+ skip: skip,
122
+ sort: sort,
123
+ limit: limit,
124
+ projection: projection,
125
+ collation: collation,
126
+ read_concern: read_concern,
127
+ read_preference: read_preference,
128
+ }
129
+ end
130
+
131
+ it 'stores the cursor at the correct key' do
132
+ Mongo::QueryCache.set(caching_cursor, **options)
133
+ expect(Mongo::QueryCache.send(:cache_table)[namespace][[namespace, selector, skip, sort, projection, collation, read_concern, read_preference]]).to eq(caching_cursor)
134
+ end
135
+ end
136
+
137
+ describe '#get' do
138
+ let(:view) { double("Mongo::Collection::View") }
139
+ let(:result) { double("Mongo::Operation::Result") }
140
+ let(:server) { double("Mongo::Server") }
141
+ let(:caching_cursor) { Mongo::CachingCursor.new(view, result, server) }
142
+
143
+ let(:options) do
144
+ {
145
+ namespace: 'db.coll',
146
+ selector: { field: 'value' },
147
+ }
148
+ end
149
+
150
+ before do
151
+ allow(result).to receive(:cursor_id) { 0 }
152
+ allow(result).to receive(:namespace) { 'db.coll' }
153
+ allow(view).to receive(:limit) { nil }
154
+ end
155
+
156
+ context 'when there is no entry in the cache' do
157
+ it 'returns nil' do
158
+ expect(Mongo::QueryCache.get(**options)).to be_nil
159
+ end
160
+ end
161
+
162
+ context 'when there is an entry in the cache' do
163
+ before do
164
+ Mongo::QueryCache.set(caching_cursor, **caching_cursor_options)
165
+ end
166
+
167
+ context 'when that entry has no limit' do
168
+ let(:caching_cursor_options) do
169
+ {
170
+ namespace: 'db.coll',
171
+ selector: { field: 'value' },
172
+ }
173
+ end
174
+
175
+ let(:query_options) do
176
+ caching_cursor_options.merge(limit: limit)
177
+ end
178
+
179
+ context 'when the query has a limit' do
180
+ let(:limit) { 5 }
181
+
182
+ it 'returns the caching cursor' do
183
+ expect(Mongo::QueryCache.get(**query_options)).to eq(caching_cursor)
184
+ end
185
+ end
186
+
187
+ context 'when the query has no limit' do
188
+ let(:limit) { nil }
189
+
190
+ it 'returns the caching cursor' do
191
+ expect(Mongo::QueryCache.get(**query_options)).to eq(caching_cursor)
192
+ end
193
+ end
194
+ end
195
+
196
+ context 'when that entry has a limit' do
197
+ let(:caching_cursor_options) do
198
+ {
199
+ namespace: 'db.coll',
200
+ selector: { field: 'value' },
201
+ limit: 5,
202
+ }
203
+ end
204
+
205
+ let(:query_options) do
206
+ caching_cursor_options.merge(limit: limit)
207
+ end
208
+
209
+ before do
210
+ allow(view).to receive(:limit) { 5 }
211
+ end
212
+
213
+ context 'and the new query has a smaller limit' do
214
+ let(:limit) { 4 }
215
+
216
+ it 'returns the caching cursor' do
217
+ expect(Mongo::QueryCache.get(**query_options)).to eq(caching_cursor)
218
+ end
219
+ end
220
+
221
+ context 'and the new query has a larger limit' do
222
+ let(:limit) { 6 }
223
+
224
+ it 'returns nil' do
225
+ expect(Mongo::QueryCache.get(**query_options)).to be_nil
226
+ end
227
+ end
228
+
229
+ context 'and the new query has the same limit' do
230
+ let(:limit) { 5 }
231
+
232
+ it 'returns the caching cursor' do
233
+ expect(Mongo::QueryCache.get(**query_options)).to eq(caching_cursor)
234
+ end
235
+ end
236
+
237
+ context 'and the new query has no limit' do
238
+ let(:limit) { nil }
239
+
240
+ it 'returns nil' do
241
+ expect(Mongo::QueryCache.get(**query_options)).to be_nil
242
+ end
243
+ end
244
+ end
245
+ end
246
+ end
247
+
248
+ describe '#clear_namespace' do
249
+ let(:caching_cursor) { double("Mongo::CachingCursor") }
250
+ let(:namespace1) { 'db.coll' }
251
+ let(:namespace2) { 'db.coll2' }
252
+ let(:namespace3) { 'db.coll3' }
253
+ let(:selector) { { field: 'value' } }
254
+
255
+ before do
256
+ Mongo::QueryCache.set(caching_cursor, namespace: namespace1, selector: selector)
257
+ Mongo::QueryCache.set(caching_cursor, namespace: namespace2, selector: selector)
258
+ Mongo::QueryCache.set(caching_cursor, namespace: namespace3, selector: selector, multi_collection: true)
259
+ end
260
+
261
+ it 'returns nil' do
262
+ expect(Mongo::QueryCache.clear_namespace(namespace1)).to be_nil
263
+ end
264
+
265
+ it 'clears the specified namespace in the query cache' do
266
+ Mongo::QueryCache.clear_namespace(namespace1)
267
+ expect(Mongo::QueryCache.send(:cache_table)[namespace1]).to be_nil
268
+ end
269
+
270
+ it 'does not clear other namespaces in the query cache' do
271
+ Mongo::QueryCache.clear_namespace(namespace1)
272
+ expect(Mongo::QueryCache.send(:cache_table)[namespace2]).not_to be_nil
273
+ end
274
+
275
+ it 'clears the nil namespace' do
276
+ Mongo::QueryCache.clear_namespace(namespace1)
277
+ expect(Mongo::QueryCache.send(:cache_table)[nil]).to be_nil
278
+ end
279
+ end
280
+ end