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
@@ -0,0 +1,190 @@
1
+ require 'spec_helper'
2
+
3
+ describe 'QueryCache with transactions' do
4
+ # Work around https://jira.mongodb.org/browse/HELP-10518
5
+ before(:all) do
6
+ client = ClientRegistry.instance.global_client('authorized')
7
+ Utils.create_collection(client, 'test')
8
+
9
+ Utils.mongos_each_direct_client do |client|
10
+ client['test'].distinct('foo').to_a
11
+ end
12
+ end
13
+
14
+ around do |spec|
15
+ Mongo::QueryCache.clear
16
+ Mongo::QueryCache.cache { spec.run }
17
+ end
18
+
19
+ # These tests do not currently use the session registry because transactions
20
+ # leak sessions independently of the query cache. This will be resolved by
21
+ # RUBY-2391.
22
+
23
+ let(:subscriber) { EventSubscriber.new }
24
+
25
+ let(:client) do
26
+ authorized_client.tap do |client|
27
+ client.subscribe(Mongo::Monitoring::COMMAND, subscriber)
28
+ end
29
+ end
30
+
31
+ before do
32
+ collection.delete_many
33
+
34
+ # Work around https://jira.mongodb.org/browse/HELP-10518
35
+ client.start_session do |session|
36
+ session.with_transaction do
37
+ collection.find({}, session: session).to_a
38
+ end
39
+ end
40
+ subscriber.clear_events!
41
+ end
42
+
43
+ describe 'in transactions' do
44
+ require_transaction_support
45
+ require_wired_tiger
46
+
47
+ let(:collection) { client['test'] }
48
+
49
+ let(:events) do
50
+ subscriber.command_started_events('find')
51
+ end
52
+
53
+ context 'with convenient API' do
54
+ context 'when same query is performed inside and outside of transaction' do
55
+ it 'performs one query' do
56
+ collection.find.to_a
57
+
58
+ session = client.start_session
59
+ session.with_transaction do
60
+ collection.find({}, session: session).to_a
61
+ end
62
+
63
+ expect(subscriber.command_started_events('find').length).to eq(1)
64
+ end
65
+ end
66
+
67
+ context 'when transaction has a different read concern' do
68
+ it 'performs two queries' do
69
+ collection.find.to_a
70
+
71
+ session = client.start_session
72
+ session.with_transaction(
73
+ read_concern: { level: :snapshot }
74
+ ) do
75
+ collection.find({}, session: session).to_a
76
+ end
77
+
78
+ expect(subscriber.command_started_events('find').length).to eq(2)
79
+ end
80
+ end
81
+
82
+ context 'when transaction has a different read preference' do
83
+ it 'performs two queries' do
84
+ collection.find.to_a
85
+
86
+ session = client.start_session
87
+ session.with_transaction(
88
+ read: { mode: :primary }
89
+ ) do
90
+ collection.find({}, session: session).to_a
91
+ end
92
+
93
+ expect(subscriber.command_started_events('find').length).to eq(2)
94
+ end
95
+ end
96
+
97
+ context 'when transaction is committed' do
98
+ it 'clears the cache' do
99
+ session = client.start_session
100
+ session.with_transaction do
101
+ collection.insert_one({ test: 1 }, session: session)
102
+ collection.insert_one({ test: 2 }, session: session)
103
+
104
+ expect(collection.find({}, session: session).to_a.length).to eq(2)
105
+ expect(collection.find({}, session: session).to_a.length).to eq(2)
106
+
107
+ # The driver caches the queries within the transaction
108
+ expect(subscriber.command_started_events('find').length).to eq(1)
109
+ session.commit_transaction
110
+ end
111
+
112
+ expect(collection.find.to_a.length).to eq(2)
113
+
114
+ # The driver clears the cache and runs the query again
115
+ expect(subscriber.command_started_events('find').length).to eq(2)
116
+ end
117
+ end
118
+
119
+ context 'when transaction is aborted' do
120
+ it 'clears the cache' do
121
+ session = client.start_session
122
+ session.with_transaction do
123
+ collection.insert_one({ test: 1 }, session: session)
124
+ collection.insert_one({ test: 2 }, session: session)
125
+
126
+ expect(collection.find({}, session: session).to_a.length).to eq(2)
127
+ expect(collection.find({}, session: session).to_a.length).to eq(2)
128
+
129
+ # The driver caches the queries within the transaction
130
+ expect(subscriber.command_started_events('find').length).to eq(1)
131
+ session.abort_transaction
132
+ end
133
+
134
+ expect(collection.find.to_a.length).to eq(0)
135
+
136
+ # The driver clears the cache and runs the query again
137
+ expect(subscriber.command_started_events('find').length).to eq(2)
138
+ end
139
+ end
140
+ end
141
+
142
+ context 'with low-level API' do
143
+ context 'when transaction is committed' do
144
+ it 'clears the cache' do
145
+ session = client.start_session
146
+ session.start_transaction
147
+
148
+ collection.insert_one({ test: 1 }, session: session)
149
+ collection.insert_one({ test: 2 }, session: session)
150
+
151
+ expect(collection.find({}, session: session).to_a.length).to eq(2)
152
+ expect(collection.find({}, session: session).to_a.length).to eq(2)
153
+
154
+ # The driver caches the queries within the transaction
155
+ expect(subscriber.command_started_events('find').length).to eq(1)
156
+
157
+ session.commit_transaction
158
+
159
+ expect(collection.find.to_a.length).to eq(2)
160
+
161
+ # The driver clears the cache and runs the query again
162
+ expect(subscriber.command_started_events('find').length).to eq(2)
163
+ end
164
+ end
165
+
166
+ context 'when transaction is aborted' do
167
+ it 'clears the cache' do
168
+ session = client.start_session
169
+ session.start_transaction
170
+
171
+ collection.insert_one({ test: 1 }, session: session)
172
+ collection.insert_one({ test: 2 }, session: session)
173
+
174
+ expect(collection.find({}, session: session).to_a.length).to eq(2)
175
+ expect(collection.find({}, session: session).to_a.length).to eq(2)
176
+
177
+ # The driver caches the queries within the transaction
178
+ expect(subscriber.command_started_events('find').length).to eq(1)
179
+
180
+ session.abort_transaction
181
+
182
+ expect(collection.find.to_a.length).to eq(0)
183
+
184
+ # The driver clears the cache and runs the query again
185
+ expect(subscriber.command_started_events('find').length).to eq(2)
186
+ end
187
+ end
188
+ end
189
+ end
190
+ end
@@ -65,7 +65,7 @@ describe 'Client after reconnect' do
65
65
  end
66
66
 
67
67
  let(:client) do
68
- new_local_client(uri, SpecConfig.instance.ssl_options.merge(
68
+ new_local_client(uri, SpecConfig.instance.monitoring_options.merge(
69
69
  server_selection_timeout: 3.86, logger: logger))
70
70
  end
71
71
 
@@ -8,6 +8,7 @@ describe 'Retryable Writes' do
8
8
  require_fail_command
9
9
  require_wired_tiger
10
10
  require_no_multi_shard
11
+ require_warning_clean
11
12
 
12
13
  let(:client) do
13
14
  authorized_client.with(
@@ -2,6 +2,8 @@ require_relative './adds_diagnostics'
2
2
 
3
3
  module PerformsLegacyRetries
4
4
  shared_examples 'it performs legacy retries' do
5
+ require_warning_clean
6
+
5
7
  context 'for connection error' do
6
8
  before do
7
9
  client.use('admin').command(
@@ -1,7 +1,7 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe 'SDAM error handling' do
4
- clean_slate_for_all
4
+ clean_slate
5
5
 
6
6
  after do
7
7
  # Close all clients after every test to avoid leaking expectations into
@@ -19,6 +19,7 @@ describe 'SDAM error handling' do
19
19
  new_local_client(SpecConfig.instance.addresses,
20
20
  SpecConfig.instance.all_test_options.merge(
21
21
  socket_timeout: 3, connect_timeout: 3,
22
+ heartbeat_frequency: 100,
22
23
  # Uncomment to print all events to stdout:
23
24
  #sdam_proc: Utils.subscribe_all_sdam_proc(diagnostic_subscriber),
24
25
  **Utils.disable_retries_client_options)
@@ -28,6 +29,14 @@ describe 'SDAM error handling' do
28
29
  let(:server) { client.cluster.next_primary }
29
30
 
30
31
  shared_examples_for 'marks server unknown' do
32
+ before do
33
+ server.monitor.stop!
34
+ end
35
+
36
+ after do
37
+ client.close
38
+ end
39
+
31
40
  it 'marks server unknown' do
32
41
  expect(server).not_to be_unknown
33
42
  RSpec::Mocks.with_temporary_scope do
@@ -38,6 +47,14 @@ describe 'SDAM error handling' do
38
47
  end
39
48
 
40
49
  shared_examples_for 'does not mark server unknown' do
50
+ before do
51
+ server.monitor.stop!
52
+ end
53
+
54
+ after do
55
+ client.close
56
+ end
57
+
41
58
  it 'does not mark server unknown' do
42
59
  expect(server).not_to be_unknown
43
60
  RSpec::Mocks.with_temporary_scope do
@@ -197,6 +214,74 @@ describe 'SDAM error handling' do
197
214
  end
198
215
  end
199
216
 
217
+ describe 'when there is an error during connection establishment' do
218
+ require_topology :single
219
+
220
+ # The push monitor creates sockets unpredictably and interferes with this
221
+ # test.
222
+ max_server_version '4.2'
223
+
224
+ # When TLS is used there are two socket classes and we can't simply
225
+ # mock the base Socket class.
226
+ require_no_tls
227
+
228
+ {
229
+ SystemCallError => Mongo::Error::SocketError,
230
+ Errno::ETIMEDOUT => Mongo::Error::SocketTimeoutError,
231
+ }.each do |raw_error_cls, mapped_error_cls|
232
+ context raw_error_cls.name do
233
+ let(:socket) do
234
+ double('mock socket').tap do |socket|
235
+ allow(socket).to receive(:set_encoding)
236
+ allow(socket).to receive(:setsockopt)
237
+ allow(socket).to receive(:getsockopt)
238
+ allow(socket).to receive(:connect)
239
+ allow(socket).to receive(:close)
240
+ socket.should receive(:write).and_raise(raw_error_cls, 'mocked failure')
241
+ end
242
+ end
243
+
244
+ it 'marks server unknown' do
245
+ server = client.cluster.next_primary
246
+ client.cluster.servers.map(&:disconnect!)
247
+
248
+ RSpec::Mocks.with_temporary_scope do
249
+
250
+ Socket.should receive(:new).with(any_args).ordered.once.and_return(socket)
251
+
252
+ lambda do
253
+ client.command(ping: 1)
254
+ end.should raise_error(mapped_error_cls, /mocked failure/)
255
+
256
+ server.should be_unknown
257
+ end
258
+ end
259
+
260
+ it 'recovers' do
261
+ server = client.cluster.next_primary
262
+ # If we do not kill the monitor, the client will recover automatically.
263
+
264
+ RSpec::Mocks.with_temporary_scope do
265
+
266
+ Socket.should receive(:new).with(any_args).ordered.once.and_return(socket)
267
+ Socket.should receive(:new).with(any_args).ordered.once.and_call_original
268
+
269
+ lambda do
270
+ client.command(ping: 1)
271
+ end.should raise_error(mapped_error_cls, /mocked failure/)
272
+
273
+ client.command(ping: 1)
274
+ end
275
+ end
276
+ end
277
+ end
278
+
279
+ after do
280
+ # Since we stopped monitoring on the client, close it.
281
+ ClientRegistry.instance.close_all_clients
282
+ end
283
+ end
284
+
200
285
  describe 'when there is an error on monitoring connection' do
201
286
  clean_slate_for_all
202
287
 
@@ -67,9 +67,8 @@ describe 'SDAM events' do
67
67
  started_events.length.should <= 10
68
68
 
69
69
  succeeded_events = subscriber.select_succeeded_events(Mongo::Monitoring::Event::ServerHeartbeatSucceeded)
70
- # Since we gracefully close the client, we expect each heartbeat
71
- # to complete.
72
- started_events.length.should == succeeded_events.length
70
+ started_events.length.should > 1
71
+ (succeeded_events.length..succeeded_events.length+1).should include(started_events.length)
73
72
  end
74
73
  end
75
74
 
@@ -105,10 +104,12 @@ describe 'SDAM events' do
105
104
  (succeeded_awaited = events.select(&:awaited?)).should_not be_empty
106
105
  (succeeded_regular = events.reject(&:awaited?)).should_not be_empty
107
106
 
108
- # Since we gracefully close the client, we expect each heartbeat
109
- # to complete.
110
- started_awaited.length.should == succeeded_awaited.length
111
- started_regular.length.should == succeeded_regular.length
107
+ # There may be in-flight ismasters that don't complete, both
108
+ # regular and awaited.
109
+ started_awaited.length.should > 1
110
+ (succeeded_awaited.length..succeeded_awaited.length+1).should include(started_awaited.length)
111
+ started_regular.length.should > 1
112
+ (succeeded_regular.length..succeeded_regular.length+1).should include(started_regular.length)
112
113
  end
113
114
  end
114
115
  end
@@ -0,0 +1,36 @@
1
+ require 'spec_helper'
2
+
3
+ describe 'Server selection' do
4
+ context 'replica set' do
5
+ require_topology :replica_set
6
+ # 2.6 server does not provide replSetGetConfig and hence we cannot add
7
+ # the tags to the members.
8
+ min_server_version '3.0'
9
+
10
+ context 'when mixed case tag names are used' do
11
+ # For simplicity this test assumes our Evergreen configuration:
12
+ # nodes are started from port 27017 onwards and there are more than
13
+ # one of them.
14
+
15
+ let(:desired_index) do
16
+ if authorized_client.cluster.next_primary.address.port == 27017
17
+ 1
18
+ else
19
+ 0
20
+ end
21
+ end
22
+
23
+ let(:client) do
24
+ new_local_client(SpecConfig.instance.addresses,
25
+ SpecConfig.instance.authorized_test_options.merge(
26
+ server_selection_timeout: 4,
27
+ read: {mode: :secondary, tag_sets: [nodeIndex: desired_index.to_s]},
28
+ ))
29
+ end
30
+
31
+ it 'selects the server' do
32
+ client['nonexistent'].count.should == 0
33
+ end
34
+ end
35
+ end
36
+ end
@@ -62,30 +62,31 @@ describe 'BSON & command size limits' do
62
62
  authorized_collection.insert_one(document)
63
63
  end
64
64
 
65
- context 'on server versions >= 3.6' do
66
- min_server_fcv '3.6'
65
+ it 'fails on the driver when a document larger than 16MiB is inserted' do
66
+ document = { key: 'a' * (max_document_size - 27), _id: 'foo' }
67
+ expect(document.to_bson.length).to eq(max_document_size+1)
67
68
 
68
- it 'fails on the driver when a document larger than 16MiB is inserted' do
69
- document = { key: 'a' * (max_document_size - 27), _id: 'foo' }
70
- expect(document.to_bson.length).to eq(max_document_size+1)
71
-
72
- lambda do
73
- authorized_collection.insert_one(document)
74
- end.should raise_error(Mongo::Error::MaxBSONSize, /The document exceeds maximum allowed BSON object size after serialization/)
75
- end
69
+ lambda do
70
+ authorized_collection.insert_one(document)
71
+ end.should raise_error(Mongo::Error::MaxBSONSize, /The document exceeds maximum allowed BSON object size after serialization/)
76
72
  end
77
73
 
78
- context 'on server versions <= 3.4' do
79
- max_server_fcv '3.4'
74
+ it 'fails on the driver when an update larger than 16MiB is performed' do
75
+ document = { key: 'a' * (max_document_size - 14) }
76
+ expect(document.to_bson.length).to eq(max_document_size+1)
77
+
78
+ lambda do
79
+ authorized_collection.update_one({ _id: 'foo' }, document)
80
+ end.should raise_error(Mongo::Error::MaxBSONSize, /The document exceeds maximum allowed BSON object size after serialization/)
81
+ end
80
82
 
81
- it 'fails on the server when a document larger than 16MiB is inserted' do
82
- document = { key: 'a' * (max_document_size - 27), _id: 'foo' }
83
- expect(document.to_bson.length).to eq(max_document_size+1)
83
+ it 'fails on the driver when an delete larger than 16MiB is performed' do
84
+ document = { key: 'a' * (max_document_size - 14) }
85
+ expect(document.to_bson.length).to eq(max_document_size+1)
84
86
 
85
- lambda do
86
- authorized_collection.insert_one(document)
87
- end.should raise_error(Mongo::Error::OperationFailure, /object to insert too large/)
88
- end
87
+ lambda do
88
+ authorized_collection.delete_one(document)
89
+ end.should raise_error(Mongo::Error::MaxBSONSize, /The document exceeds maximum allowed BSON object size after serialization/)
89
90
  end
90
91
 
91
92
  it 'fails in the driver when a document larger than 16MiB+16KiB is inserted' do