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
@@ -22,9 +22,13 @@ module Mongo
22
22
 
23
23
  private
24
24
 
25
- def validate_result(result, client, connection)
26
- unpin_maybe(session) do
27
- add_error_labels(client, connection, session) do
25
+ # @param [ Mongo::Operation::Result ] result The operation result.
26
+ # @param [ Mongo::Server::Connection ] connection The connection on which
27
+ # the operation is performed.
28
+ # @param [ Mongo::Operation::Context ] context The operation context.
29
+ def validate_result(result, connection, context)
30
+ unpin_maybe(context.session) do
31
+ add_error_labels(connection, context) do
28
32
  add_server_diagnostics(connection) do
29
33
  result.validate!
30
34
  end
@@ -38,25 +42,29 @@ module Mongo
38
42
  # and server-side errors (Error::OperationFailure); it does not
39
43
  # handle server selection errors (Error::NoServerAvailable), for which
40
44
  # labels are added in the server selection code.
41
- def add_error_labels(client, connection, session)
45
+ #
46
+ # @param [ Mongo::Server::Connection ] connection The connection on which
47
+ # the operation is performed.
48
+ # @param [ Mongo::Operation::Context ] context The operation context.
49
+ def add_error_labels(connection, context)
42
50
  begin
43
51
  yield
44
52
  rescue Mongo::Error::SocketError => e
45
- if session && session.in_transaction? && !session.committing_transaction?
53
+ if context.in_transaction? && !context.committing_transaction?
46
54
  e.add_label('TransientTransactionError')
47
55
  end
48
- if session && session.committing_transaction?
56
+ if context.committing_transaction?
49
57
  e.add_label('UnknownTransactionCommitResult')
50
58
  end
51
59
 
52
- maybe_add_retryable_write_error_label!(e, connection, client, session)
60
+ maybe_add_retryable_write_error_label!(e, connection, context)
53
61
 
54
62
  raise e
55
63
  rescue Mongo::Error::SocketTimeoutError => e
56
- maybe_add_retryable_write_error_label!(e, connection, client, session)
64
+ maybe_add_retryable_write_error_label!(e, connection, context)
57
65
  raise e
58
66
  rescue Mongo::Error::OperationFailure => e
59
- if session && session.committing_transaction?
67
+ if context.committing_transaction?
60
68
  if e.write_retryable? || e.wtimeout? || (e.write_concern_error? &&
61
69
  !Session::UNLABELED_WRITE_CONCERN_CODES.include?(e.write_concern_error_code)
62
70
  ) || e.max_time_ms_expired?
@@ -64,7 +72,7 @@ module Mongo
64
72
  end
65
73
  end
66
74
 
67
- maybe_add_retryable_write_error_label!(e, connection, client, session)
75
+ maybe_add_retryable_write_error_label!(e, connection, context)
68
76
 
69
77
  raise e
70
78
  end
@@ -125,21 +133,12 @@ module Mongo
125
133
  # @param [ Mongo::Error ] error The error to which to add the label.
126
134
  # @param [ Mongo::Server::Connection ] connection The connection on which
127
135
  # the operation is performed.
128
- # @param [ Mongo::Client | nil ] client The client that is performing
129
- # the operation.
130
- # @param [ Mongo::Session ] session The operation's session.
136
+ # @param [ Mongo::Operation::Context ] context The operation context.
131
137
  #
132
138
  # @note The client argument is optional because some operations, such as
133
139
  # end_session, do not pass the client as an argument to the execute
134
140
  # method.
135
- def maybe_add_retryable_write_error_label!(error, connection, client, session)
136
- in_transaction = session && session.in_transaction?
137
- committing_transaction = in_transaction && session.committing_transaction?
138
- aborting_transaction = in_transaction && session.aborting_transaction?
139
- modern_retry_writes = client && client.options[:retry_writes]
140
- legacy_retry_writes = client && !client.options[:retry_writes] &&
141
- client.max_write_retries > 0
142
-
141
+ def maybe_add_retryable_write_error_label!(error, connection, context)
143
142
  # An operation is retryable if it meets one of the following criteria:
144
143
  # - It is a commitTransaction or abortTransaction
145
144
  # - It does not occur during a transaction and the client has enabled
@@ -147,8 +146,9 @@ module Mongo
147
146
  #
148
147
  # Note: any write operation within a transaction (excepting commit and
149
148
  # abort is NOT a retryable operation)
150
- retryable_operation = committing_transaction || aborting_transaction ||
151
- (!in_transaction && (modern_retry_writes || legacy_retry_writes))
149
+ retryable_operation = context.committing_transaction? ||
150
+ context.aborting_transaction? ||
151
+ !context.in_transaction? && context.any_retry_writes?
152
152
 
153
153
  # An operation should add the RetryableWriteError label if one of the
154
154
  # following conditions is met:
@@ -19,6 +19,7 @@ module Mongo
19
19
  # Defines custom behavior of bulk write results
20
20
  #
21
21
  # @since 2.0.0
22
+ # @api private
22
23
  module Aggregatable
23
24
 
24
25
  # Aggregate the write errors returned from this result.
@@ -18,6 +18,7 @@ module Mongo
18
18
  # Shared behavior of operations that support a session.
19
19
  #
20
20
  # @since 2.5.2
21
+ # @api private
21
22
  module SessionsSupported
22
23
 
23
24
  private
@@ -221,9 +222,20 @@ module Mongo
221
222
  end
222
223
  end
223
224
 
224
- def build_message(connection)
225
+ def build_message(connection, context)
226
+ if self.session != context.session
227
+ if self.session
228
+ raise Error::InternalDriverError, "Operation session #{self.session.inspect} does not match context session #{context.session.inspect}"
229
+ else
230
+ # Some operations are not constructed with sessions but are
231
+ # executed in a context where a session is available.
232
+ # This could be OK or a driver issue.
233
+ # TODO investigate.
234
+ end
235
+ end
236
+
225
237
  super.tap do |message|
226
- if session
238
+ if session = context.session
227
239
  # Serialize the message to detect client-side problems,
228
240
  # such as invalid BSON keys. The message will be serialized again
229
241
  # later prior to being sent to the connection.
@@ -19,6 +19,7 @@ module Mongo
19
19
  # various values from the spec.
20
20
  #
21
21
  # @since 2.0.0
22
+ # @api private
22
23
  module Specifiable
23
24
 
24
25
  # The field for database name.
@@ -18,24 +18,20 @@ module Mongo
18
18
  # Shared behavior of operations that write (update, insert, delete).
19
19
  #
20
20
  # @since 2.5.2
21
+ # @api private
21
22
  module Write
22
23
 
23
24
  include ResponseHandling
24
25
 
25
26
  # Execute the operation.
26
27
  #
27
- # @example
28
- # operation.execute(server, client: nil)
29
- #
30
28
  # @param [ Mongo::Server ] server The server to send the operation to.
31
- # @param [ Mongo::Client ] client The client that will be used to
32
- # perform auto-encryption if it is necessary to encrypt the command
33
- # being executed (optional).
29
+ # @param [ Operation::Context ] context The operation context.
34
30
  #
35
31
  # @return [ Mongo::Operation::Result ] The operation result.
36
32
  #
37
33
  # @since 2.5.2
38
- def execute(server, client:)
34
+ def execute(server, context:)
39
35
  server.with_connection do |connection|
40
36
  validate!(connection)
41
37
  op = if connection.features.op_msg_enabled?
@@ -46,34 +42,29 @@ module Mongo
46
42
  self.class::Command.new(spec)
47
43
  end
48
44
 
49
- result = op.execute(connection, client: client)
50
- validate_result(result, client, connection)
45
+ result = op.execute(connection, context: context)
46
+ validate_result(result, connection, context)
51
47
  end
52
48
  end
53
49
 
54
50
  # Execute the bulk write operation.
55
51
  #
56
- # @example
57
- # operation.bulk_execute(connection, client: nil)
58
- #
59
52
  # @param [ Mongo::Server::Connection ] connection The connection over
60
53
  # which to send the operation.
61
- # @param [ Mongo::Client ] client The client that will be used to
62
- # perform auto-encryption if it is necessary to encrypt the command
63
- # being executed (optional).
54
+ # @param [ Operation::Context ] context The operation context.
64
55
  #
65
56
  # @return [ Mongo::Operation::Delete::BulkResult,
66
57
  # Mongo::Operation::Insert::BulkResult,
67
58
  # Mongo::Operation::Update::BulkResult ] The bulk result.
68
59
  #
69
60
  # @since 2.5.2
70
- def bulk_execute(connection, client:)
61
+ def bulk_execute(connection, context:)
71
62
  Lint.assert_type(connection, Server::Connection)
72
63
 
73
64
  if connection.features.op_msg_enabled?
74
- self.class::OpMsg.new(spec).execute(connection, client: client).bulk_result
65
+ self.class::OpMsg.new(spec).execute(connection, context: context).bulk_result
75
66
  else
76
- self.class::Command.new(spec).execute(connection, client: client).bulk_result
67
+ self.class::Command.new(spec).execute(connection, context: context).bulk_result
77
68
  end
78
69
  end
79
70
 
@@ -18,6 +18,7 @@ module Mongo
18
18
  # Custom behavior for operations that support write concern.
19
19
  #
20
20
  # @since 2.5.2
21
+ # @api private
21
22
  module WriteConcernSupported
22
23
 
23
24
  private
@@ -21,17 +21,20 @@ module Mongo
21
21
  # version <= 2.4.
22
22
  #
23
23
  # @since 2.0.0
24
+ # @api semiprivate
24
25
  class Result < Operation::Result
25
26
  include Operation::Result::UseLegacyErrorParser
26
27
 
27
28
  # Whether an existing document was updated.
28
29
  #
29
30
  # @since 2.0.0
31
+ # @api private
30
32
  UPDATED_EXISTING = 'updatedExisting'.freeze
31
33
 
32
34
  # The upserted docs field in the result.
33
35
  #
34
36
  # @since 2.0.0
37
+ # @api private
35
38
  UPSERTED = 'upserted'.freeze
36
39
 
37
40
  # Get the number of documents matched.
@@ -42,6 +45,7 @@ module Mongo
42
45
  # @return [ Integer ] The matched count.
43
46
  #
44
47
  # @since 2.0.0
48
+ # @api public
45
49
  def matched_count
46
50
  return 0 unless acknowledged?
47
51
  if upsert?
@@ -59,6 +63,7 @@ module Mongo
59
63
  # @return [ nil ] Always omitted for legacy versions.
60
64
  #
61
65
  # @since 2.0.0
66
+ # @api public
62
67
  def modified_count; end
63
68
 
64
69
  # The identifier of the inserted document if an upsert
@@ -70,6 +75,7 @@ module Mongo
70
75
  # @return [ Object ] The upserted id.
71
76
  #
72
77
  # @since 2.0.0
78
+ # @api public
73
79
  def upserted_id
74
80
  first[UPSERTED] if upsert?
75
81
  end
@@ -82,6 +88,7 @@ module Mongo
82
88
  # @return [ Integer ] The number upserted.
83
89
  #
84
90
  # @since 2.4.2
91
+ # @api public
85
92
  def upserted_count
86
93
  upsert? ? n : 0
87
94
  end
@@ -19,16 +19,19 @@ module Mongo
19
19
  # Defines custom behavior of results for an update.
20
20
  #
21
21
  # @since 2.0.0
22
+ # @api semiprivate
22
23
  class Result < Operation::Result
23
24
 
24
25
  # The number of modified docs field in the result.
25
26
  #
26
27
  # @since 2.0.0
28
+ # @api private
27
29
  MODIFIED = 'nModified'.freeze
28
30
 
29
31
  # The upserted docs field in the result.
30
32
  #
31
33
  # @since 2.0.0
34
+ # @api private
32
35
  UPSERTED = 'upserted'.freeze
33
36
 
34
37
  # Get the number of documents matched.
@@ -39,6 +42,7 @@ module Mongo
39
42
  # @return [ Integer ] The matched count.
40
43
  #
41
44
  # @since 2.0.0
45
+ # @api public
42
46
  def matched_count
43
47
  return 0 unless acknowledged?
44
48
  if upsert?
@@ -56,6 +60,7 @@ module Mongo
56
60
  # @return [ Integer ] The modified count.
57
61
  #
58
62
  # @since 2.0.0
63
+ # @api public
59
64
  def modified_count
60
65
  return 0 unless acknowledged?
61
66
  first[MODIFIED]
@@ -70,6 +75,7 @@ module Mongo
70
75
  # @return [ Object ] The upserted id.
71
76
  #
72
77
  # @since 2.0.0
78
+ # @api public
73
79
  def upserted_id
74
80
  return nil unless upsert?
75
81
  upsert?.first['_id']
@@ -83,10 +89,12 @@ module Mongo
83
89
  # @return [ Integer ] The number upserted.
84
90
  #
85
91
  # @since 2.4.2
92
+ # @api public
86
93
  def upserted_count
87
94
  upsert? ? n : 0
88
95
  end
89
96
 
97
+ # @api public
90
98
  def bulk_result
91
99
  BulkResult.new(@replies, connection_description)
92
100
  end
@@ -20,13 +20,16 @@ module Mongo
20
20
  # usersInfo command.
21
21
  #
22
22
  # @since 2.1.0
23
+ # @api semiprivate
23
24
  class Result < Operation::Result
24
25
 
25
26
  # The field name for the users document in a usersInfo result.
26
27
  #
27
28
  # @since 2.1.0
29
+ # @api private
28
30
  USERS = 'users'.freeze
29
31
 
32
+ # @api public
30
33
  def documents
31
34
  reply.documents.first[USERS]
32
35
  end
@@ -18,12 +18,25 @@ module Mongo
18
18
  # MongoDB Wire protocol Compressed message.
19
19
  #
20
20
  # This is a bi-directional message that compresses another opcode.
21
+ # See https://github.com/mongodb/specifications/blob/master/source/compression/OP_COMPRESSED.rst
21
22
  #
22
23
  # @api semipublic
23
24
  #
24
25
  # @since 2.5.0
25
26
  class Compressed < Message
26
27
 
28
+ # The noop compressor identifier.
29
+ NOOP = 'noop'.freeze
30
+
31
+ # The byte signaling that the message has not been compressed (test mode).
32
+ NOOP_BYTE = 0.chr.force_encoding(BSON::BINARY).freeze
33
+
34
+ # The snappy compressor identifier.
35
+ SNAPPY = 'snappy'.freeze
36
+
37
+ # The byte signaling that the message has been compressed with snappy.
38
+ SNAPPY_BYTE = 1.chr.force_encoding(BSON::BINARY).freeze
39
+
27
40
  # The byte signaling that the message has been compressed with Zlib.
28
41
  #
29
42
  # @since 2.5.0
@@ -34,10 +47,20 @@ module Mongo
34
47
  # @since 2.5.0
35
48
  ZLIB = 'zlib'.freeze
36
49
 
50
+ # The zstd compressor identifier.
51
+ ZSTD = 'zstd'.freeze
52
+
53
+ # The byte signaling that the message has been compressed with zstd.
54
+ ZSTD_BYTE = 3.chr.force_encoding(BSON::BINARY).freeze
55
+
37
56
  # The compressor identifier to byte map.
38
57
  #
39
58
  # @since 2.5.0
40
- COMPRESSOR_ID_MAP = { ZLIB => ZLIB_BYTE }.freeze
59
+ COMPRESSOR_ID_MAP = {
60
+ SNAPPY => SNAPPY_BYTE,
61
+ ZSTD => ZSTD_BYTE,
62
+ ZLIB => ZLIB_BYTE
63
+ }.freeze
41
64
 
42
65
  # Creates a new OP_COMPRESSED message.
43
66
  #
@@ -68,9 +91,7 @@ module Mongo
68
91
  # @api private
69
92
  def maybe_inflate
70
93
  message = Registry.get(@original_op_code).allocate
71
- uncompressed_message = Zlib::Inflate.inflate(@compressed_message)
72
-
73
- buf = BSON::ByteBuffer.new(uncompressed_message)
94
+ buf = decompress(@compressed_message)
74
95
 
75
96
  message.send(:fields).each do |field|
76
97
  if field[:multi]
@@ -125,10 +146,35 @@ module Mongo
125
146
  buf = BSON::ByteBuffer.new
126
147
  @original_message.send(:serialize_fields, buf, max_bson_size)
127
148
  @uncompressed_size = buf.length
128
- @compressed_message = Zlib::Deflate.deflate(buf.to_s, @zlib_compression_level).force_encoding(BSON::BINARY)
149
+ @compressed_message = compress(buf)
129
150
  super
130
151
  end
131
152
 
153
+ def compress(buffer)
154
+ if @compressor_id == NOOP_BYTE
155
+ buffer.to_s.force_encoding(BSON::BINARY)
156
+ elsif @compressor_id == ZLIB_BYTE
157
+ Zlib::Deflate.deflate(buffer.to_s, @zlib_compression_level).force_encoding(BSON::BINARY)
158
+ elsif @compressor_id == SNAPPY_BYTE
159
+ Snappy.deflate(buffer.to_s).force_encoding(BSON::BINARY)
160
+ elsif @compressor_id == ZSTD_BYTE
161
+ # DRIVERS-600 will allow this to be configurable in the future
162
+ Zstd.compress(buffer.to_s).force_encoding(BSON::BINARY)
163
+ end
164
+ end
165
+
166
+ def decompress(compressed_message)
167
+ if @compressor_id == NOOP_BYTE
168
+ BSON::ByteBuffer.new(compressed_message)
169
+ elsif @compressor_id == ZLIB_BYTE
170
+ BSON::ByteBuffer.new(Zlib::Inflate.inflate(compressed_message))
171
+ elsif @compressor_id == SNAPPY_BYTE
172
+ BSON::ByteBuffer.new(Snappy.inflate(compressed_message))
173
+ elsif @compressor_id == ZSTD_BYTE
174
+ BSON::ByteBuffer.new(Zstd.decompress(compressed_message))
175
+ end
176
+ end
177
+
132
178
  Registry.register(OP_CODE, self)
133
179
  end
134
180
  end
@@ -140,7 +140,13 @@ module Mongo
140
140
  self
141
141
  end
142
142
 
143
- def maybe_decrypt(client)
143
+ # Possibly decrypt this message with libmongocrypt.
144
+ #
145
+ # @param [ Mongo::Operation::Context ] context The operation context.
146
+ #
147
+ # @return [ Mongo::Protocol::Msg ] The decrypted message, or the original
148
+ # message if decryption was not possible or necessary.
149
+ def maybe_decrypt(context)
144
150
  # TODO determine if we should be decrypting data coming from pre-4.2
145
151
  # servers, potentially using legacy wire protocols. If so we need
146
152
  # to implement decryption for those wire protocols as our current
@@ -148,11 +154,23 @@ module Mongo
148
154
  self
149
155
  end
150
156
 
151
- def maybe_encrypt(server, client)
157
+ # Possibly encrypt this message with libmongocrypt.
158
+ #
159
+ # @param [ Mongo::Server::Connection ] connection The connection on which
160
+ # the operation is performed.
161
+ # @param [ Mongo::Operation::Context ] context The operation context.
162
+ #
163
+ # @return [ Mongo::Protocol::Msg ] The encrypted message, or the original
164
+ # message if encryption was not possible or necessary.
165
+ def maybe_encrypt(connection, context)
152
166
  # Do nothing if the Message subclass has not implemented this method
153
167
  self
154
168
  end
155
169
 
170
+ def maybe_add_server_api(server_api)
171
+ raise Error::ServerApiNotSupported, "Server API parameters cannot be sent to pre-3.6 MongoDB servers. Please remove the :server_api parameter from Client options or use MongoDB 3.6 or newer"
172
+ end
173
+
156
174
  private def merge_sections
157
175
  cmd = if @sections.length > 1
158
176
  cmd = @sections.detect { |section| section[:type] == 0 }[:payload]
@@ -177,10 +195,19 @@ module Mongo
177
195
  #
178
196
  # @param buffer [String] buffer where the message should be inserted
179
197
  # @return [String] buffer containing the serialized message
180
- def serialize(buffer = BSON::ByteBuffer.new, max_bson_size = nil)
198
+ def serialize(buffer = BSON::ByteBuffer.new, max_bson_size = nil, bson_overhead = nil)
199
+ max_size =
200
+ if max_bson_size && bson_overhead
201
+ max_bson_size + bson_overhead
202
+ elsif max_bson_size
203
+ max_bson_size
204
+ else
205
+ nil
206
+ end
207
+
181
208
  start = buffer.length
182
209
  serialize_header(buffer)
183
- serialize_fields(buffer, max_bson_size)
210
+ serialize_fields(buffer, max_size)
184
211
  buffer.replace_int32(start, buffer.length - start)
185
212
  end
186
213