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
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: df3eb3a5733323f2f4440c67bc0173661ada194ecb35374e8e78345e2d072525
4
- data.tar.gz: 63227bff6f14e3100f86a747b3e5d577812dd74d6da8061a069d8a313ecce09c
3
+ metadata.gz: a6312ea7c8c11a1e4f3dd355691d19bacf67bb3862395e69156133dace4b3503
4
+ data.tar.gz: 7a5f97640136a0f32e6e3d8a08f6fdb3a8b726342e7105391a49d18427c41016
5
5
  SHA512:
6
- metadata.gz: '02253019a9aab19c94dbb2a4e459a84c1fa6f1383eca9d5b1daa26bf1c2aa1a96c32f52a23267b0b7b5c58fc469144d0c1722b4f79593ae7563ac0c9deb55d95'
7
- data.tar.gz: e02d93a95630d770f20a37cbe91a4dc18c98cb18e684da4b2a538a70afaaf61731e808832b2fe9aadca484dacfc8dce43cedf356ef00db019a03d77e9283cc45
6
+ metadata.gz: 84fd33ac8d290e04c5ad2ca1c1dfa4022d9123d7ab7f8c3c9a621cf29dac04336f8dde8f73c8ff281107def7667ee0f3d5f3b596c90cee0ca8a88845754216f8
7
+ data.tar.gz: ccd825f5fba748bc45f75adef77f93f1a340862d32daa53145cb60e64a5e9b6dfd216c5eca033d1d3e6144a8931f548316315f3eb49b1dafed1dd63de978aa1a
checksums.yaml.gz.sig CHANGED
@@ -1,4 +1 @@
1
- ,�&AT��Z�*�
2
- ;$��
3
- :pnxh�*khz?-��������` ǯ�6�з
4
- �Hڒ��L��R}�����;��q����{�,��}\�]�&�U"m� S�k�k�#�G,��f+� i�0܆~l �_�&�S����nw�,�~�8�n�PO���ns��N�j��ܯ
1
+ +Fm&�R��j���n2�F�=2�k��Be���$Q���h��%�[#�-�7�k�� n��"���۳�������K��a(�͖�іe���Fi]��;�E��hJE~��C��<d�*��J�-�uf�֔-u�� U�-ax���&��RB��a��V�?4|M+c�eH�]��kw�C�?*��J��[^���
data.tar.gz.sig CHANGED
Binary file
data/README.md CHANGED
@@ -14,7 +14,10 @@ Documentation
14
14
  High level documentation and usage examples are located
15
15
  [here](http://docs.mongodb.org/ecosystem/drivers/ruby/).
16
16
 
17
- API documentation can be found [here](https://api.mongodb.org/ruby/).
17
+ API documentation for the most recent release can be found
18
+ [here](https://docs.mongodb.com/ruby-driver/current/api/).
19
+ To build API documentation for the master branch, check out the
20
+ repository locally and run `rake docs`.
18
21
 
19
22
 
20
23
  Support
data/Rakefile CHANGED
@@ -1,19 +1,36 @@
1
- #!/usr/bin/env ruby
2
-
3
- require 'rubygems'
4
-
5
- begin
6
- require 'bundler'
7
- require 'bundler/gem_tasks'
8
- rescue LoadError
9
- raise '[FAIL] Bundler not found! Install it with ' +
10
- '`gem install bundler; bundle install`.'
11
- end
12
-
13
- default_groups = [:default, :testing]
14
- Bundler.require(*default_groups)
1
+ # -*- mode: ruby -*-
15
2
 
3
+ require 'bundler'
4
+ require 'bundler/gem_tasks'
16
5
  require 'rspec/core/rake_task'
6
+ # TODO move the mongo require into the individual tasks that actually need it
7
+ require 'mongo'
8
+
9
+ ROOT = File.expand_path(File.join(File.dirname(__FILE__)))
10
+
11
+ $: << File.join(ROOT, 'spec/shared/lib')
12
+
13
+ require 'mrss/spec_organizer'
14
+
15
+ CLASSIFIERS = [
16
+ [%r,^mongo/server,, :unit_server],
17
+ [%r,^mongo,, :unit],
18
+ [%r,^kerberos,, :unit],
19
+ [%r,^integration/sdam_error_handling,, :sdam_integration],
20
+ [%r,^integration/cursor_reaping,, :cursor_reaping],
21
+ [%r,^integration/query_cache,, :query_cache],
22
+ [%r,^integration/transactions_examples,, :tx_examples],
23
+ [%r,^(atlas|integration),, :integration],
24
+ [%r,^spec_tests/sdam_integration,, :spec_sdam_integration],
25
+ [%r,^spec_tests,, :spec],
26
+ ]
27
+
28
+ RUN_PRIORITY = %i(
29
+ tx_examples
30
+ unit unit_server
31
+ integration sdam_integration cursor_reaping query_cache
32
+ spec spec_sdam_integration
33
+ )
17
34
 
18
35
  tasks = Rake.application.instance_variable_get('@tasks')
19
36
  tasks['release:do'] = tasks.delete('release')
@@ -71,12 +88,23 @@ namespace :spec do
71
88
  SpecConfig.instance.print_summary
72
89
  end
73
90
 
74
- task :ci => ['spec:prepare'] do
75
- $: << File.join(File.dirname(__FILE__), 'spec')
91
+ def spec_organizer
92
+ Mrss::SpecOrganizer.new(
93
+ root: ROOT,
94
+ classifiers: CLASSIFIERS,
95
+ priority_order: RUN_PRIORITY,
96
+ )
97
+ end
76
98
 
77
- require 'support/spec_organizer'
99
+ task :ci => ['spec:prepare'] do
100
+ spec_organizer.run
101
+ end
78
102
 
79
- SpecOrganizer.new.run
103
+ desc 'Show test buckets'
104
+ task :buckets do
105
+ spec_organizer.ordered_buckets.each do |category, paths|
106
+ puts "#{category || 'remaining'}: #{paths&.join(' ') || '<none>'}"
107
+ end
80
108
  end
81
109
  end
82
110
 
data/lib/mongo.rb CHANGED
@@ -51,6 +51,7 @@ require 'mongo/protocol'
51
51
  require 'mongo/background_thread'
52
52
  require 'mongo/cluster'
53
53
  require 'mongo/cursor'
54
+ require 'mongo/caching_cursor'
54
55
  require 'mongo/collection'
55
56
  require 'mongo/database'
56
57
  require 'mongo/crypt'
@@ -60,6 +61,7 @@ require 'mongo/dbref'
60
61
  require 'mongo/grid'
61
62
  require 'mongo/index'
62
63
  require 'mongo/lint'
64
+ require 'mongo/query_cache'
63
65
  require 'mongo/server'
64
66
  require 'mongo/server_selector'
65
67
  require 'mongo/session'
@@ -70,3 +72,33 @@ require 'mongo/uri'
70
72
  require 'mongo/version'
71
73
  require 'mongo/write_concern'
72
74
  require 'mongo/utils'
75
+
76
+ module Mongo
77
+ # Clears the driver's OCSP response cache.
78
+ module_function def clear_ocsp_cache
79
+ Socket::OcspCache.clear
80
+ end
81
+
82
+ # This is a user-settable list of hooks that will be invoked when any new
83
+ # TLS socket is connected. Each hook should be a Proc that takes
84
+ # an OpenSSL::SSL::SSLContext object as an argument. These hooks can be used
85
+ # to modify the TLS context (for example to disallow certain ciphers).
86
+ #
87
+ # @return [ Array<Proc> ] The list of procs to be invoked when a TLS socket
88
+ # is connected (may be an empty Array).
89
+ module_function def tls_context_hooks
90
+ @tls_context_hooks ||= []
91
+ end
92
+
93
+ # Set the TLS context hooks.
94
+ #
95
+ # @param [ Array<Proc> ] hooks An Array of Procs, each of which should take
96
+ # an OpenSSL::SSL::SSLContext object as an argument.
97
+ module_function def tls_context_hooks=(hooks)
98
+ unless hooks.is_a?(Array) && hooks.all? { |hook| hook.is_a?(Proc) }
99
+ raise ArgumentError, "TLS context hooks must be an array of Procs"
100
+ end
101
+
102
+ @tls_context_hooks = hooks
103
+ end
104
+ end
data/lib/mongo/address.rb CHANGED
@@ -286,7 +286,7 @@ module Mongo
286
286
  rescue IOError, SystemCallError => e
287
287
  raise Error::SocketError, "#{e.class}: #{e} (for #{self})"
288
288
  rescue OpenSSL::SSL::SSLError => e
289
- raise Error::SocketError, "#{e.class}: #{e} (for #{self}) (#{SSL_ERROR})"
289
+ raise Error::SocketError, "#{e.class}: #{e} (for #{self})"
290
290
  end
291
291
  end
292
292
  end
@@ -81,7 +81,7 @@ module Mongo
81
81
  # @param [ Hash ] options The options.
82
82
  #
83
83
  # @option options [ Float ] :connect_timeout Connect timeout.
84
- # @option options [ true | false ] :ssl Whether to use SSL.
84
+ # @option options [ true | false ] :ssl Whether to use TLS.
85
85
  # @option options [ String ] :ssl_ca_cert
86
86
  # Same as the corresponding Client/Socket::SSL option.
87
87
  # @option options [ Array<OpenSSL::X509::Certificate> ] :ssl_ca_cert_object
@@ -95,7 +95,7 @@ module Mongo
95
95
  # @param [ Hash ] options The options.
96
96
  #
97
97
  # @option options [ Float ] :connect_timeout Connect timeout.
98
- # @option options [ true | false ] :ssl Whether to use SSL.
98
+ # @option options [ true | false ] :ssl Whether to use TLS.
99
99
  # @option options [ String ] :ssl_ca_cert
100
100
  # Same as the corresponding Client/Socket::SSL option.
101
101
  # @option options [ Array<OpenSSL::X509::Certificate> ] :ssl_ca_cert_object
@@ -49,10 +49,7 @@ module Mongo
49
49
  payload: BSON::Binary.new(client_final_payload),
50
50
  conversationId: conversation_id,
51
51
  )
52
- selector[Protocol::Msg::DATABASE_IDENTIFIER] = user.auth_source
53
- cluster_time = connection.mongos? && connection.cluster_time
54
- selector[Operation::CLUSTER_TIME] = cluster_time if cluster_time
55
- Protocol::Msg.new([], {}, selector)
52
+ build_message(connection, user.auth_source, selector)
56
53
  end
57
54
 
58
55
  private
@@ -100,7 +100,13 @@ module Mongo
100
100
  end
101
101
 
102
102
  def dispatch_msg(connection, conversation, msg)
103
- reply = connection.dispatch([msg])
103
+ context = Operation::Context.new(options: {
104
+ server_api: connection.options[:server_api],
105
+ })
106
+ if server_api = context.server_api
107
+ msg = msg.maybe_add_server_api(server_api)
108
+ end
109
+ reply = connection.dispatch([msg], context)
104
110
  reply_document = reply.documents.first
105
111
  validate_reply!(connection, conversation, reply_document)
106
112
  result = Operation::Result.new(reply, connection.description)
@@ -112,14 +118,14 @@ module Mongo
112
118
  # raises Unauthorized if not.
113
119
  def validate_reply!(connection, conversation, doc)
114
120
  if doc[:ok] != 1
115
- extra = [doc[:code], doc[:codeName]].compact.join(': ')
116
- msg = doc[:errmsg]
117
- unless extra.empty?
118
- msg += " (#{extra})"
119
- end
121
+ message = Error::Parser.build_message(
122
+ code: doc[:code],
123
+ code_name: doc[:codeName],
124
+ message: doc[:errmsg],
125
+ )
120
126
  raise Unauthorized.new(user,
121
127
  used_mechanism: self.class.const_get(:MECHANISM),
122
- message: msg,
128
+ message: message,
123
129
  server: connection.server,
124
130
  )
125
131
  end
@@ -47,6 +47,38 @@ module Mongo
47
47
  def speculative_auth_document
48
48
  nil
49
49
  end
50
+
51
+ # @return [ Protocol::Message ] The message to send.
52
+ def build_message(connection, auth_source, selector)
53
+ if connection && connection.features.op_msg_enabled?
54
+ selector = selector.dup
55
+ selector[Protocol::Msg::DATABASE_IDENTIFIER] = auth_source
56
+ cluster_time = connection.mongos? && connection.cluster_time
57
+ if cluster_time
58
+ selector[Operation::CLUSTER_TIME] = cluster_time
59
+ end
60
+ Protocol::Msg.new([], {}, selector)
61
+ else
62
+ Protocol::Query.new(
63
+ auth_source,
64
+ Database::COMMAND,
65
+ selector,
66
+ limit: -1,
67
+ )
68
+ end
69
+ end
70
+
71
+ def validate_external_auth_source
72
+ if user.auth_source != '$external'
73
+ user_name_msg = if user.name
74
+ " #{user.name}"
75
+ else
76
+ ''
77
+ end
78
+ mechanism = user.mechanism
79
+ raise Auth::InvalidConfiguration, "User#{user_name_msg} specifies auth source '#{user.auth_source}', but the only valid auth source for #{mechanism} is '$external'"
80
+ end
81
+ end
50
82
  end
51
83
  end
52
84
  end
@@ -43,22 +43,12 @@ module Mongo
43
43
  # @param [ Server::Connection ] connection The connection being
44
44
  # authenticated.
45
45
  #
46
- # @return [ Protocol::Query ] The first CR conversation message.
46
+ # @return [ Protocol::Message ] The first CR conversation message.
47
47
  #
48
48
  # @since 2.0.0
49
49
  def start(connection)
50
- if connection && connection.features.op_msg_enabled?
51
- selector = Auth::GET_NONCE.merge(Protocol::Msg::DATABASE_IDENTIFIER => user.auth_source)
52
- cluster_time = connection.mongos? && connection.cluster_time
53
- selector[Operation::CLUSTER_TIME] = cluster_time if cluster_time
54
- Protocol::Msg.new([], {}, selector)
55
- else
56
- Protocol::Query.new(
57
- user.auth_source,
58
- Database::COMMAND,
59
- Auth::GET_NONCE,
60
- limit: -1)
61
- end
50
+ selector = Auth::GET_NONCE
51
+ build_message(connection, user.auth_source, selector)
62
52
  end
63
53
 
64
54
  # Continue the CR conversation. This sends the client final message
@@ -70,26 +60,13 @@ module Mongo
70
60
  # @param [ Mongo::Server::Connection ] connection The connection being
71
61
  # authenticated.
72
62
  #
73
- # @return [ Protocol::Query ] The next message to send.
63
+ # @return [ Protocol::Message ] The next message to send.
74
64
  #
75
65
  # @since 2.0.0
76
66
  def continue(reply_document, connection)
77
67
  @nonce = reply_document[Auth::NONCE]
78
-
79
- if connection && connection.features.op_msg_enabled?
80
- selector = LOGIN.merge(user: user.name, nonce: nonce, key: user.auth_key(nonce))
81
- selector[Protocol::Msg::DATABASE_IDENTIFIER] = user.auth_source
82
- cluster_time = connection.mongos? && connection.cluster_time
83
- selector[Operation::CLUSTER_TIME] = cluster_time if cluster_time
84
- Protocol::Msg.new([], {}, selector)
85
- else
86
- Protocol::Query.new(
87
- user.auth_source,
88
- Database::COMMAND,
89
- LOGIN.merge(user: user.name, nonce: nonce, key: user.auth_key(nonce)),
90
- limit: -1
91
- )
92
- end
68
+ selector = LOGIN.merge(user: user.name, nonce: nonce, key: user.auth_key(nonce))
69
+ build_message(connection, user.auth_source, selector)
93
70
  end
94
71
  end
95
72
  end
@@ -70,20 +70,14 @@ module Mongo
70
70
  # @param [ BSON::Document ] reply_document The reply document of the
71
71
  # previous message.
72
72
  #
73
- # @return [ Protocol::Query ] The next query to execute.
73
+ # @return [ Protocol::Message ] The next query to execute.
74
74
  def continue(reply_document, connection)
75
75
  @id = reply_document['conversationId']
76
76
  payload = reply_document['payload']
77
77
 
78
78
  continue_token = authenticator.evaluate_challenge(payload)
79
79
  selector = CONTINUE_MESSAGE.merge(payload: continue_token, conversationId: id)
80
-
81
- Protocol::Query.new(
82
- Auth::EXTERNAL,
83
- Database::COMMAND,
84
- selector,
85
- limit: 1,
86
- )
80
+ build_message(connection, '$external', selector)
87
81
  end
88
82
 
89
83
  def process_continue_response(reply_document)
@@ -92,15 +86,10 @@ module Mongo
92
86
  @continue_token = authenticator.evaluate_challenge(payload)
93
87
  end
94
88
 
89
+ # @return [ Protocol::Message ] The next query to execute.
95
90
  def finalize(connection)
96
91
  selector = CONTINUE_MESSAGE.merge(payload: @continue_token, conversationId: id)
97
-
98
- Protocol::Query.new(
99
- Auth::EXTERNAL,
100
- Database::COMMAND,
101
- selector,
102
- limit: 1,
103
- )
92
+ build_message(connection, '$external', selector)
104
93
  end
105
94
  end
106
95
  end
@@ -38,20 +38,9 @@ module Mongo
38
38
  #
39
39
  # @since 2.0.0
40
40
  def start(connection)
41
- if connection && connection.features.op_msg_enabled?
42
- selector = LOGIN.merge(payload: payload, mechanism: LDAP::MECHANISM)
43
- selector[Protocol::Msg::DATABASE_IDENTIFIER] = Auth::EXTERNAL
44
- cluster_time = connection.mongos? && connection.cluster_time
45
- selector[Operation::CLUSTER_TIME] = cluster_time if cluster_time
46
- Protocol::Msg.new([], {}, selector)
47
- else
48
- Protocol::Query.new(
49
- Auth::EXTERNAL,
50
- Database::COMMAND,
51
- LOGIN.merge(payload: payload, mechanism: LDAP::MECHANISM),
52
- limit: -1
53
- )
54
- end
41
+ validate_external_auth_source
42
+ selector = LOGIN.merge(payload: payload, mechanism: LDAP::MECHANISM)
43
+ build_message(connection, '$external', selector)
55
44
  end
56
45
 
57
46
  private
@@ -35,19 +35,7 @@ module Mongo
35
35
  # @return [ Protocol::Message ] The first SASL conversation message.
36
36
  def start(connection)
37
37
  selector = client_first_document
38
- if connection && connection.features.op_msg_enabled?
39
- selector[Protocol::Msg::DATABASE_IDENTIFIER] = user.auth_source
40
- cluster_time = connection.mongos? && connection.cluster_time
41
- selector[Operation::CLUSTER_TIME] = cluster_time if cluster_time
42
- Protocol::Msg.new([], {}, selector)
43
- else
44
- Protocol::Query.new(
45
- user.auth_source,
46
- Database::COMMAND,
47
- selector,
48
- limit: -1,
49
- )
50
- end
38
+ build_message(connection, user.auth_source, selector)
51
39
  end
52
40
 
53
41
  private
@@ -87,19 +87,7 @@ module Mongo
87
87
  payload: client_final_message,
88
88
  conversationId: id,
89
89
  )
90
- if connection && connection.features.op_msg_enabled?
91
- selector[Protocol::Msg::DATABASE_IDENTIFIER] = user.auth_source
92
- cluster_time = connection.mongos? && connection.cluster_time
93
- selector[Operation::CLUSTER_TIME] = cluster_time if cluster_time
94
- Protocol::Msg.new([], {}, selector)
95
- else
96
- Protocol::Query.new(
97
- user.auth_source,
98
- Database::COMMAND,
99
- selector,
100
- limit: -1,
101
- )
102
- end
90
+ build_message(connection, user.auth_source, selector)
103
91
  end
104
92
 
105
93
  # Processes the second response from the server.
@@ -116,28 +104,13 @@ module Mongo
116
104
  #
117
105
  # @param [ Server::Connection ] connection The connection being authenticated.
118
106
  #
119
- # @return [ Protocol::Query ] The next message to send.
107
+ # @return [ Protocol::Message ] The next message to send.
120
108
  def finalize(connection)
121
- if connection && connection.features.op_msg_enabled?
122
- selector = CLIENT_CONTINUE_MESSAGE.merge(
123
- payload: client_empty_message,
124
- conversationId: id,
125
- )
126
- selector[Protocol::Msg::DATABASE_IDENTIFIER] = user.auth_source
127
- cluster_time = connection.mongos? && connection.cluster_time
128
- selector[Operation::CLUSTER_TIME] = cluster_time if cluster_time
129
- Protocol::Msg.new([], {}, selector)
130
- else
131
- Protocol::Query.new(
132
- user.auth_source,
133
- Database::COMMAND,
134
- CLIENT_CONTINUE_MESSAGE.merge(
135
- payload: client_empty_message,
136
- conversationId: id,
137
- ),
138
- limit: -1,
139
- )
140
- end
109
+ selector = CLIENT_CONTINUE_MESSAGE.merge(
110
+ payload: client_empty_message,
111
+ conversationId: id,
112
+ )
113
+ build_message(connection, user.auth_source, selector)
141
114
  end
142
115
 
143
116
  # Returns the hash to provide to the server in the handshake