mongo 2.13.0 → 2.15.0.alpha

Sign up to get free protection for your applications and to get access to all the features.
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
@@ -97,7 +97,7 @@ module Mongo
97
97
 
98
98
  # @return [ String ] NO_SRV_RECORDS Error message format string indicating that no SRV records
99
99
  # were found.
100
- NO_SRV_RECORDS = "The DNS query returned no SRV records at hostname (%s)".freeze
100
+ NO_SRV_RECORDS = "The DNS query returned no SRV records for '%s'".freeze
101
101
 
102
102
  # @return [ String ] INVALID_TXT_RECORD_OPTION Error message format string indicating that an
103
103
  # unexpected TXT record option was found.
@@ -130,6 +130,7 @@ module Mongo
130
130
  @resolver ||= Srv::Resolver.new(
131
131
  raise_on_invalid: true,
132
132
  resolv_options: options[:resolv_options],
133
+ timeout: options[:connect_timeout],
133
134
  )
134
135
  end
135
136
 
@@ -220,7 +221,7 @@ module Mongo
220
221
  raise Error::InvalidTXTRecord.new(INVALID_OPTS_VALUE_DELIM) unless opt.index(URI_OPTS_VALUE_DELIM)
221
222
  key, value = opt.split(URI_OPTS_VALUE_DELIM)
222
223
  raise Error::InvalidTXTRecord.new(INVALID_TXT_RECORD_OPTION) unless VALID_TXT_OPTIONS.include?(key.downcase)
223
- add_uri_option(key, value, txt_options)
224
+ options_mapper.add_uri_option(key, value, txt_options)
224
225
  txt_options
225
226
  end
226
227
  end
data/lib/mongo/utils.rb CHANGED
@@ -34,7 +34,7 @@ module Mongo
34
34
  # @option opts [ Logger ] :logger A custom logger to use.
35
35
  # @option opts [ String ] :log_prefix A custom log prefix to use when
36
36
  # logging.
37
- module_function def warn_monitor_exception(msg, exc, **opts)
37
+ module_function def warn_bg_exception(msg, exc, **opts)
38
38
  bt_excerpt = excerpt_backtrace(exc, **opts)
39
39
  logger = LocalLogger.new(**opts)
40
40
  logger.log_warn("#{msg}: #{exc.class}: #{exc}#{bt_excerpt}")
@@ -55,8 +55,34 @@ module Mongo
55
55
  end
56
56
  end
57
57
 
58
+ # Symbolizes the keys in the provided hash.
58
59
  module_function def shallow_symbolize_keys(hash)
59
60
  Hash[hash.map { |k, v| [k.to_sym, v] }]
60
61
  end
62
+
63
+ # Stringifies the keys in the provided hash and converts underscore
64
+ # style keys to camel case style keys.
65
+ module_function def shallow_camelize_keys(hash)
66
+ Hash[hash.map { |k, v| [camelize(k), v] }]
67
+ end
68
+
69
+ module_function def camelize(sym)
70
+ sym.to_s.gsub(/_(\w)/) { $1.upcase }
71
+ end
72
+
73
+ # @note server_api must have symbol keys or be a BSON::Document.
74
+ module_function def transform_server_api(server_api)
75
+ {}.tap do |doc|
76
+ if version = server_api[:version]
77
+ doc['apiVersion'] = version
78
+ end
79
+ unless server_api[:strict].nil?
80
+ doc['apiStrict'] = server_api[:strict]
81
+ end
82
+ unless server_api[:deprecation_errors].nil?
83
+ doc['apiDeprecationErrors'] = server_api[:deprecation_errors]
84
+ end
85
+ end
86
+ end
61
87
  end
62
88
  end
data/lib/mongo/version.rb CHANGED
@@ -17,5 +17,5 @@ module Mongo
17
17
  # The current version of the driver.
18
18
  #
19
19
  # @since 2.0.0
20
- VERSION = '2.13.0'.freeze
20
+ VERSION = '2.15.0.alpha'.freeze
21
21
  end
@@ -145,13 +145,16 @@ problem. Below are some of the puzzling responses I encountered:
145
145
  line) but the value is otherwise completely valid. This error has no relation
146
146
  to the "session token" or "security token" as used with temporary AWS
147
147
  credentials.
148
- - *The security token included in the request is invalid*: this error is
149
- produced when the AWS access key id, as specified in the scope part of the
150
- `Authorization` header, is not a valid access key id. In the case of
151
- non-temporary credentials being used for authentication, the error refers to
152
- a "security token" but the authentication process does not actually use a
153
- security token as this term is used in the AWS documentation describing
154
- temporary credentials.
148
+ - *The security token included in the request is invalid*: this error can be
149
+ produced in several circumstances:
150
+ - When the AWS access key id, as specified in the scope part of the
151
+ `Authorization` header, is not a valid access key id. In the case of
152
+ non-temporary credentials being used for authentication, the error refers to
153
+ a "security token" but the authentication process does not actually use a
154
+ security token as this term is used in the AWS documentation describing
155
+ temporary credentials.
156
+ - When using temporary credentials and the security token is not provided
157
+ in the STS request at all (x-amz-security-token header).
155
158
  - *Signature expired: 20200317T000000Z is now earlier than 20200317T222541Z
156
159
  (20200317T224041Z - 15 min.)*: This error happens when `x-amz-date` header
157
160
  value is the formatted date (`YYYYMMDD`) rather than the ISO8601 formatted
@@ -168,6 +171,8 @@ problem. Below are some of the puzzling responses I encountered:
168
171
  produced when temporary credentials are used and the credentials have
169
172
  expired.
170
173
 
174
+ See also [AWS documentation for STS error messages](https://docs.aws.amazon.com/STS/latest/APIReference/CommonErrors.html).
175
+
171
176
  ### Resources
172
177
 
173
178
  Generally I found Amazon's own documentation to be the best for implementing
data/spec/README.md CHANGED
@@ -2,6 +2,13 @@
2
2
 
3
3
  ## Quick Start
4
4
 
5
+ The test suite requires shared tooling that is stored in a separate repository
6
+ and is referenced as a submodule. After checking out the desired driver
7
+ branch, check out the matching submodules:
8
+
9
+ git submodule init
10
+ git submodule update
11
+
5
12
  To run the test suite against a local MongoDB deployment listening on port
6
13
  27017, run:
7
14
 
@@ -107,7 +114,7 @@ other tests require a sharded cluster with more than one shard. Tests requiring
107
114
  a single shard can be run against a deployment with multiple shards by
108
115
  specifying only one mongos address in MONGODB_URI.
109
116
 
110
- ## Note Regarding SSL/TLS Arguments
117
+ ## Note Regarding TLS/SSL Arguments
111
118
 
112
119
  MongoDB 4.2 (server and shell) added new command line options for setting TLS
113
120
  parameters. These options follow the naming of URI options used by both the
@@ -185,6 +192,51 @@ verification, run:
185
192
  Note that there are tests in the test suite that cover TLS verification, and
186
193
  they may fail if the test suite is run in this way.
187
194
 
195
+ ## OCSP
196
+
197
+ There are several types of OCSP tests implemented in the test suite.
198
+
199
+ OCSP unit tests are in `spec/integration/ocsp_verifier_spec.rb`. To run
200
+ these, set `OCSP_VERIFIER=1` in the environment. There must NOT be a process
201
+ running on the host port 8100 as that port will be used by the OCSP responder
202
+ launched by the tests.
203
+
204
+ For the remaining OCSP tests, the following environment variables must be set
205
+ to the possible values indicated below:
206
+
207
+ OCSP_ALGORITHM=rsa|ecdsa
208
+ OCSP_STATUS=valid|revoked|unknown
209
+ OCSP_DELEGATE=0|1
210
+ OCSP_MUST_STAPLE=0|1
211
+
212
+ These tests also require the mock OCSP responder running on the host machine
213
+ on port 8100 with the configuration that matches the environment variables
214
+ just described. Please refer to the Docker and Evergreen scripts in the
215
+ driver repository for further details.
216
+
217
+ Additionally, the server must be configured to use the appropriate server
218
+ certificate and CA certificate from the respective subdirectory of
219
+ `spec/support/ocsp`. This is easiest to achieve by using the Docker tooling
220
+ described in `.evergreen/README.md`.
221
+
222
+ OCSP connectivity tests are in `spec/integration/ocsp_connectivity.rb`.
223
+ These test the combinations described
224
+ [here](https://github.com/mongodb/specifications/blob/master/source/ocsp-support/tests/README.rst#integration-tests-permutations-to-be-tested).
225
+ To run these tests, set `OCSP_CONNECTIVITY=pass` environment variable if
226
+ the tests are expected to connect successfully or `OCSP_CONNECTIVITY=fail` if
227
+ the tests are expected to not connect.
228
+ Note that some of these configurations require OCSP responder to return
229
+ the failure response; in such configurations, ONLY the OCSP connectivity tests
230
+ may pass (since the driver may reject connections to servers when OCSP
231
+ responder returns the failure response, or OCSP verification otherwise
232
+ definitively fails).
233
+
234
+ When not running either OCSP verifier tests or OCSP connectivity tests but
235
+ when OCSP algorithm is configured, the test suite will execute normally
236
+ using the provided `MONGO_URI`. This configuration may be used to exercise
237
+ OCSP while running the full test suite. In this case, setting `OCSP_STATUS`
238
+ to `revoked` will generally cause the test suite to fail.
239
+
188
240
  ## Authentication
189
241
 
190
242
  mlaunch can configure authentication on the server:
@@ -460,13 +512,36 @@ To test compression, set the `compressors` URI option:
460
512
 
461
513
  MONGODB_URI="mongodb://localhost:27017/?compressors=zlib" rake
462
514
 
463
- Note that as of this writing, the driver only supports zlib compression.
515
+ Note that as of this writing, the driver supports
516
+ [ztsd](https://docs.mongodb.com/manual/reference/glossary/#term-zstd),
517
+ [snappy](https://docs.mongodb.com/manual/reference/glossary/#term-snappy)
518
+ and [zlib](https://docs.mongodb.com/manual/reference/glossary/#term-zlib)
519
+ compression.
520
+
464
521
  Servers 4.2+ enable zlib by default; to test older servers, explicitly enable
465
522
  zlib compression when launching the server:
466
523
 
467
524
  mongod --dbpath /tmp/mdb --setParameter enableTestCommands=1 \
468
525
  --networkMessageCompressors snappy,zlib
469
526
 
527
+ ## Server API
528
+
529
+ To specify server API parameters, use the `SERVER_API` environment variable.
530
+ The server API parameters cannot be specified via URI options.
531
+
532
+ Both YAML and JSON syntaxes are accepted:
533
+
534
+ SERVER_API='{version: "1", strict: true}' rake
535
+
536
+ SERVER_API='{"version":"1","strict":true}' rake
537
+
538
+ Note that the input must be valid YAML or JSON and the version number must
539
+ be a string, therefore all of the following specifications are invalid:
540
+
541
+ SERVER_API='{version:"1",strict:true}' rake
542
+ SERVER_API='{version: 1}' rake
543
+ SERVER_API='{"version":1,"strict":true}' rake
544
+
470
545
  ## Other Options
471
546
 
472
547
  Generally, all URI options recognized by the driver may be set for a test run,
@@ -511,6 +586,16 @@ following environment variable:
511
586
 
512
587
  FORK=1
513
588
 
589
+ OCSP tests require Python 3 with asn1crypto, oscrypto and flask packages
590
+ installed, and they require the drivers-evergreen-tools submodule to be
591
+ checked out. To run these tests, set the following environment variable:
592
+
593
+ OCSP=1
594
+
595
+ To check out the submodule, run:
596
+
597
+ git submodule update --init --recursive
598
+
514
599
  ## Debug Logging
515
600
 
516
601
  The test suite is run with the driver log level set to `WARN` by default.
@@ -10,8 +10,12 @@ describe 'Auth' do
10
10
  authorized_client.cluster.next_primary
11
11
  end
12
12
 
13
+ let(:base_options) do
14
+ SpecConfig.instance.monitoring_options
15
+ end
16
+
13
17
  let(:connection) do
14
- Mongo::Server::Connection.new(server, options)
18
+ Mongo::Server::Connection.new(server, base_options.merge(options))
15
19
  end
16
20
 
17
21
  before(:all) do
@@ -31,8 +35,9 @@ describe 'Auth' do
31
35
  context 'user mechanism not provided' do
32
36
 
33
37
  context 'user does not exist' do
34
- let(:options) { SpecConfig.instance.ssl_options.merge(
35
- user: 'nonexistent_user') }
38
+ let(:options) do
39
+ {user: 'nonexistent_user' }
40
+ end
36
41
 
37
42
  before do
38
43
  expect(connection.app_metadata.send(:document)[:saslSupportedMechs]).to eq('admin.nonexistent_user')
@@ -63,8 +68,9 @@ describe 'Auth' do
63
68
  end
64
69
 
65
70
  context 'user exists' do
66
- let(:options) { SpecConfig.instance.ssl_options.merge(
67
- user: 'existing_user', password: 'bogus') }
71
+ let(:options) do
72
+ {user: 'existing_user', password: 'bogus'}
73
+ end
68
74
 
69
75
  before do
70
76
  expect(connection.app_metadata.send(:document)[:saslSupportedMechs]).to eq("admin.existing_user")
@@ -99,8 +105,9 @@ describe 'Auth' do
99
105
  min_server_fcv '3.0'
100
106
 
101
107
  context 'scram-sha-1 requested' do
102
- let(:options) { SpecConfig.instance.ssl_options.merge(
103
- user: 'nonexistent_user', auth_mech: :scram) }
108
+ let(:options) do
109
+ {user: 'nonexistent_user', auth_mech: :scram}
110
+ end
104
111
 
105
112
  it 'indicates scram-sha-1 was requested and used' do
106
113
  expect do
@@ -112,8 +119,9 @@ describe 'Auth' do
112
119
  context 'scram-sha-256 requested' do
113
120
  min_server_fcv '4.0'
114
121
 
115
- let(:options) { SpecConfig.instance.ssl_options.merge(
116
- user: 'nonexistent_user', auth_mech: :scram256) }
122
+ let(:options) do
123
+ {user: 'nonexistent_user', auth_mech: :scram256}
124
+ end
117
125
 
118
126
  it 'indicates scram-sha-256 was requested and used' do
119
127
  expect do
@@ -124,8 +132,9 @@ describe 'Auth' do
124
132
  end
125
133
 
126
134
  context 'when authentication fails' do
127
- let(:options) { SpecConfig.instance.ssl_options.merge(
128
- user: 'nonexistent_user', password: 'foo') }
135
+ let(:options) do
136
+ {user: 'nonexistent_user', password: 'foo'}
137
+ end
129
138
 
130
139
  it 'reports which server authentication was attempted against' do
131
140
  expect do
@@ -142,8 +151,9 @@ describe 'Auth' do
142
151
  end
143
152
 
144
153
  context 'with custom auth source' do
145
- let(:options) { SpecConfig.instance.ssl_options.merge(
146
- user: 'nonexistent_user', password: 'foo', auth_source: 'authdb') }
154
+ let(:options) do
155
+ {user: 'nonexistent_user', password: 'foo', auth_source: 'authdb'}
156
+ end
147
157
 
148
158
  it 'reports auth source used' do
149
159
  expect do
@@ -240,7 +250,7 @@ describe 'Auth' do
240
250
  require_no_auth
241
251
 
242
252
  let(:client) do
243
- new_local_client(SpecConfig.instance.addresses, SpecConfig.instance.ssl_options.merge(
253
+ new_local_client(SpecConfig.instance.addresses, SpecConfig.instance.monitoring_options.merge(
244
254
  auth_source: 'foo'))
245
255
  end
246
256
 
@@ -254,7 +264,7 @@ describe 'Auth' do
254
264
  require_x509_auth
255
265
 
256
266
  let(:client) do
257
- new_local_client(SpecConfig.instance.addresses, SpecConfig.instance.ssl_options.merge(
267
+ new_local_client(SpecConfig.instance.addresses, base_options.merge(
258
268
  auth_mech: :mongodb_x509))
259
269
  end
260
270
 
@@ -25,8 +25,10 @@ describe 'Symbol encoding to BSON' do
25
25
  end
26
26
 
27
27
  it 'round-trips symbol values using the same byte buffer' do
28
- if BSON::Environment.jruby?
29
- pending 'https://jira.mongodb.org/browse/RUBY-2128'
28
+ if BSON::Environment.jruby? && (BSON::VERSION.split('.').map(&:to_i) <=> [4, 11, 0]) < 0
29
+ skip 'This test is only relevant to bson versions that increment ByteBuffer '\
30
+ 'read and write positions separately in JRuby, as implemented in ' \
31
+ 'bson version 4.11.0. For more information, see https://jira.mongodb.org/browse/RUBY-2128'
30
32
  end
31
33
 
32
34
  Hash.from_bson(hash.to_bson).should == hash
@@ -0,0 +1,41 @@
1
+ require 'spec_helper'
2
+
3
+ describe 'BulkWriteError message' do
4
+ let(:client) { authorized_client }
5
+ let(:collection_name) { 'bulk_write_error_message_spec' }
6
+ let(:collection) { client[collection_name] }
7
+
8
+ before do
9
+ collection.delete_many
10
+ end
11
+
12
+ context 'a bulk write with one error' do
13
+ it 'reports code name, code and message' do
14
+ begin
15
+ collection.insert_many([
16
+ {_id: 1},
17
+ {_id: 1},
18
+ {_id: 1},
19
+ ], ordered: true)
20
+ fail('Should have raised')
21
+ rescue Mongo::Error::BulkWriteError => e
22
+ e.message.should =~ %r,\A\[11000\]: (insertDocument :: caused by :: 11000 )?E11000 duplicate key error (collection|index):,
23
+ end
24
+ end
25
+ end
26
+
27
+ context 'a bulk write with multiple errors' do
28
+ it 'reports code name, code and message' do
29
+ begin
30
+ collection.insert_many([
31
+ {_id: 1},
32
+ {_id: 1},
33
+ {_id: 1},
34
+ ], ordered: false)
35
+ fail('Should have raised')
36
+ rescue Mongo::Error::BulkWriteError => e
37
+ e.message.should =~ %r,\AMultiple errors: \[11000\]: (insertDocument :: caused by :: 11000 )?E11000 duplicate key error (collection|index):.*\[11000\]: (insertDocument :: caused by :: 11000 )?E11000 duplicate key error (collection|index):,
38
+ end
39
+ end
40
+ end
41
+ end
@@ -16,4 +16,52 @@ describe 'Bulk writes' do
16
16
  end.not_to raise_error
17
17
  end
18
18
  end
19
+
20
+ context 'when bulk write needs to be split' do
21
+ let(:subscriber) { EventSubscriber.new }
22
+
23
+ let(:max_bson_size) { Mongo::Server::ConnectionBase::DEFAULT_MAX_BSON_OBJECT_SIZE }
24
+
25
+ let(:insert_events) do
26
+ subscriber.command_started_events('insert')
27
+ end
28
+
29
+ let(:failed_events) do
30
+ subscriber.failed_events
31
+ end
32
+
33
+ let(:operations) do
34
+ [{ insert_one: { text: 'a' * (max_bson_size/2) } }] * 6
35
+ end
36
+
37
+ before do
38
+ authorized_client.subscribe(Mongo::Monitoring::COMMAND, subscriber)
39
+ authorized_collection.bulk_write(operations)
40
+ end
41
+
42
+ context '3.6+ server' do
43
+ min_server_fcv '3.6'
44
+
45
+ it 'splits the operations' do
46
+ # 3.6+ servers can send multiple bulk operations in one message,
47
+ # with the whole message being limited to 48m.
48
+ expect(insert_events.length).to eq(2)
49
+ end
50
+ end
51
+
52
+ context 'pre-3.6 server' do
53
+ max_server_version '3.4'
54
+
55
+ it 'splits the operations' do
56
+ # Pre-3.6 servers limit the entire message payload to the size of
57
+ # a single document which is 16m. Given our test data this means
58
+ # twice as many messages are sent.
59
+ expect(insert_events.length).to eq(4)
60
+ end
61
+ end
62
+
63
+ it 'does not have a command failed event' do
64
+ expect(failed_events).to be_empty
65
+ end
66
+ end
19
67
  end