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,70 @@
1
+ require 'spec_helper'
2
+
3
+ describe Mongo::CachingCursor do
4
+
5
+ around do |spec|
6
+ Mongo::QueryCache.clear
7
+ Mongo::QueryCache.cache { spec.run }
8
+ end
9
+
10
+ let(:authorized_collection) do
11
+ authorized_client['caching_cursor']
12
+ end
13
+
14
+ before do
15
+ authorized_collection.drop
16
+ end
17
+
18
+ let(:server) do
19
+ view.send(:server_selector).select_server(authorized_client.cluster)
20
+ end
21
+
22
+ let(:reply) do
23
+ view.send(:send_initial_query, server)
24
+ end
25
+
26
+ let(:cursor) do
27
+ described_class.new(view, reply, server)
28
+ end
29
+
30
+ let(:view) do
31
+ Mongo::Collection::View.new(authorized_collection)
32
+ end
33
+
34
+ before do
35
+ authorized_collection.delete_many
36
+ 3.times { |i| authorized_collection.insert_one(_id: i) }
37
+ end
38
+
39
+ describe '#cached_docs' do
40
+ context 'when no query has been performed' do
41
+ it 'returns nil' do
42
+ expect(cursor.cached_docs).to be_nil
43
+ end
44
+ end
45
+
46
+ context 'when a query has been performed' do
47
+ it 'returns the number of documents' do
48
+ cursor.to_a
49
+ expect(cursor.cached_docs.length).to eq(3)
50
+ expect(cursor.cached_docs).to eq([{ '_id' => 0 }, { '_id' => 1 }, { '_id' => 2 }])
51
+ end
52
+ end
53
+ end
54
+
55
+ describe '#try_next' do
56
+ it 'fetches the next document' do
57
+ expect(cursor.try_next).to eq('_id' => 0)
58
+ expect(cursor.try_next).to eq('_id' => 1)
59
+ expect(cursor.try_next).to eq('_id' => 2)
60
+ end
61
+ end
62
+
63
+ describe '#each' do
64
+ it 'iterates the cursor' do
65
+ result = cursor.each.to_a
66
+ expect(result.length).to eq(3)
67
+ expect(result).to eq([{ '_id' => 0 }, { '_id' => 1 }, { '_id' => 2 }])
68
+ end
69
+ end
70
+ end
@@ -463,7 +463,56 @@ describe Mongo::Client do
463
463
  SpecConfig.instance.all_test_options.merge(options))
464
464
  end
465
465
 
466
- context 'when the compressor is supported' do
466
+ context 'when the compressor is not supported by the driver' do
467
+ require_warning_clean
468
+
469
+ let(:options) do
470
+ { compressors: ['snoopy'] }
471
+ end
472
+
473
+ it 'does not set the compressor and warns' do
474
+ expect(Mongo::Logger.logger).to receive(:warn)
475
+ expect(client.options['compressors']).to be_nil
476
+ end
477
+
478
+ it 'sets the compression key of the handshake document to an empty array' do
479
+ expect(client.cluster.app_metadata.send(:document)[:compression]).to eq([])
480
+ end
481
+
482
+ context 'when one supported compressor and one unsupported compressor are provided' do
483
+ require_compression
484
+ min_server_fcv '3.6'
485
+
486
+ let(:options) do
487
+ { compressors: ['zlib', 'snoopy'] }
488
+ end
489
+
490
+ it 'does not set the unsupported compressor and warns' do
491
+ expect(Mongo::Logger.logger).to receive(:warn).at_least(:once)
492
+ expect(client.options['compressors']).to eq(['zlib'])
493
+ end
494
+
495
+ it 'sets the compression key of the handshake document to the list of supported compressors' do
496
+ expect(client.cluster.app_metadata.send(:document)[:compression]).to eq(['zlib'])
497
+ end
498
+ end
499
+ end
500
+
501
+ context 'when the compressor is not supported by the server' do
502
+ max_server_version '3.4'
503
+
504
+ let(:options) do
505
+ { compressors: ['zlib'] }
506
+ end
507
+
508
+ it 'does not set the compressor and warns' do
509
+ expect(Mongo::Logger.logger).to receive(:warn).at_least(:once)
510
+ expect(client.cluster.next_primary.monitor.compressor).to be_nil
511
+ end
512
+ end
513
+
514
+ context 'when zlib compression is requested' do
515
+ require_zlib_compression
467
516
 
468
517
  let(:options) do
469
518
  { compressors: ['zlib'] }
@@ -478,7 +527,6 @@ describe Mongo::Client do
478
527
  end
479
528
 
480
529
  context 'when server supports compression' do
481
- require_compression
482
530
  min_server_fcv '3.6'
483
531
 
484
532
  it 'uses compression for messages' do
@@ -495,50 +543,55 @@ describe Mongo::Client do
495
543
  end
496
544
  end
497
545
 
498
- context 'when the compressor is not supported by the driver' do
546
+ context 'when snappy compression is requested and supported by the server' do
547
+ min_server_version '3.6'
499
548
 
500
549
  let(:options) do
501
- { compressors: ['snoopy'] }
550
+ { compressors: ['snappy'] }
502
551
  end
503
552
 
504
- it 'does not set the compressor and warns' do
505
- expect(Mongo::Logger.logger).to receive(:warn)
506
- expect(client.options['compressors']).to be_nil
507
- end
508
-
509
- it 'sets the compression key of the handshake document to an empty array' do
510
- expect(client.cluster.app_metadata.send(:document)[:compression]).to eq([])
511
- end
512
-
513
- context 'when one supported compressor and one unsupported compressor are provided' do
514
- require_compression
515
- min_server_fcv '3.6'
553
+ context 'when snappy gem is installed' do
554
+ require_snappy_compression
516
555
 
517
- let(:options) do
518
- { compressors: ['zlib', 'snoopy'] }
556
+ it 'creates the client' do
557
+ expect(client.options['compressors']).to eq(['snappy'])
519
558
  end
559
+ end
520
560
 
521
- it 'does not set the unsupported compressor and warns' do
522
- expect(Mongo::Logger.logger).to receive(:warn).at_least(:once)
523
- expect(client.options['compressors']).to eq(['zlib'])
524
- end
561
+ context 'when snappy gem is not installed' do
562
+ require_no_snappy_compression
525
563
 
526
- it 'sets the compression key of the handshake document to the list of supported compressors' do
527
- expect(client.cluster.app_metadata.send(:document)[:compression]).to eq(['zlib'])
564
+ it 'raises an exception' do
565
+ expect do
566
+ client
567
+ end.to raise_error(Mongo::Error::UnmetDependency, /Cannot enable snappy compression/)
528
568
  end
529
569
  end
530
570
  end
531
571
 
532
- context 'when the compressor is not supported by the server' do
533
- max_server_version '3.4'
572
+ context 'when zstd compression is requested and supported by the server' do
573
+ min_server_version '4.2'
534
574
 
535
575
  let(:options) do
536
- { compressors: ['zlib'] }
576
+ { compressors: ['zstd'] }
537
577
  end
538
578
 
539
- it 'does not set the compressor and warns' do
540
- expect(Mongo::Logger.logger).to receive(:warn).at_least(:once)
541
- expect(client.cluster.next_primary.monitor.compressor).to be_nil
579
+ context 'when zstd gem is installed' do
580
+ require_zstd_compression
581
+
582
+ it 'creates the client' do
583
+ expect(client.options['compressors']).to eq(['zstd'])
584
+ end
585
+ end
586
+
587
+ context 'when zstd gem is not installed' do
588
+ require_no_zstd_compression
589
+
590
+ it 'raises an exception' do
591
+ expect do
592
+ client
593
+ end.to raise_error(Mongo::Error::UnmetDependency, /Cannot enable zstd compression/)
594
+ end
542
595
  end
543
596
  end
544
597
  end
@@ -674,7 +727,7 @@ describe Mongo::Client do
674
727
  context 'when providing a custom logger' do
675
728
 
676
729
  let(:logger) do
677
- Logger.new($stdout).tap do |l|
730
+ Logger.new(STDOUT).tap do |l|
678
731
  l.level = Logger::FATAL
679
732
  end
680
733
  end
@@ -844,13 +897,14 @@ describe Mongo::Client do
844
897
  end
845
898
 
846
899
  context 'mri' do
847
- only_mri
900
+ require_mri
848
901
 
849
902
  let(:platform_string) do
850
903
  [
851
904
  "Ruby #{RUBY_VERSION}",
852
905
  RUBY_PLATFORM,
853
- RbConfig::CONFIG['build']
906
+ RbConfig::CONFIG['build'],
907
+ 'A',
854
908
  ].join(', ')
855
909
  end
856
910
 
@@ -868,7 +922,8 @@ describe Mongo::Client do
868
922
  "like Ruby #{RUBY_VERSION}",
869
923
  RUBY_PLATFORM,
870
924
  "JVM #{java.lang.System.get_property('java.version')}",
871
- RbConfig::CONFIG['build']
925
+ RbConfig::CONFIG['build'],
926
+ 'A',
872
927
  ].join(', ')
873
928
  end
874
929
 
@@ -1311,7 +1366,7 @@ describe Mongo::Client do
1311
1366
  end
1312
1367
 
1313
1368
  context 'when not linting' do
1314
- skip_if_linting
1369
+ require_no_linting
1315
1370
 
1316
1371
  it 'rejects bogus read preference as symbol' do
1317
1372
  expect do
@@ -1343,6 +1398,46 @@ describe Mongo::Client do
1343
1398
  end
1344
1399
  end
1345
1400
 
1401
+ context 'when setting read concern options' do
1402
+ min_server_fcv '3.2'
1403
+
1404
+ context 'when read concern is valid' do
1405
+ let(:options) do
1406
+ { read_concern: { level: :local } }
1407
+ end
1408
+
1409
+ it 'does not warn' do
1410
+ expect(Mongo::Logger.logger).to_not receive(:warn)
1411
+ new_local_client_nmio(SpecConfig.instance.addresses, options)
1412
+ end
1413
+ end
1414
+
1415
+ context 'when read concern has an invalid key' do
1416
+ require_no_linting
1417
+
1418
+ let(:options) do
1419
+ { read_concern: { hello: :local } }
1420
+ end
1421
+
1422
+ it 'logs a warning' do
1423
+ expect(Mongo::Logger.logger).to receive(:warn).with(/Read concern has invalid keys: hello/)
1424
+ new_local_client_nmio(SpecConfig.instance.addresses, options)
1425
+ end
1426
+ end
1427
+
1428
+ context 'when read concern has a non-user-settable key' do
1429
+ let(:options) do
1430
+ { read_concern: { after_cluster_time: 100 } }
1431
+ end
1432
+
1433
+ it 'raises an exception' do
1434
+ expect do
1435
+ new_local_client_nmio(SpecConfig.instance.addresses, options)
1436
+ end.to raise_error(Mongo::Error::InvalidReadConcern, 'The after_cluster_time read_concern option cannot be specified by the user')
1437
+ end
1438
+ end
1439
+ end
1440
+
1346
1441
  context 'when an invalid option is provided' do
1347
1442
 
1348
1443
  let(:options) do
@@ -1494,6 +1589,107 @@ describe Mongo::Client do
1494
1589
  end
1495
1590
  end
1496
1591
  end
1592
+
1593
+ context ':auth_mech_properties option' do
1594
+ context 'is nil' do
1595
+ let(:options) do
1596
+ {auth_mech_properties: nil}
1597
+ end
1598
+
1599
+ it 'creates the client without the option' do
1600
+ client.options.should_not have_key(:auth_mech_properties)
1601
+ end
1602
+ end
1603
+ end
1604
+
1605
+ context ':server_api parameter' do
1606
+ context 'is a hash with symbol keys' do
1607
+ context 'using known keys' do
1608
+ let(:options) do
1609
+ {server_api: {
1610
+ version: '1',
1611
+ strict: true,
1612
+ deprecation_errors: false,
1613
+ }}
1614
+ end
1615
+
1616
+ it 'is accepted' do
1617
+ client.options[:server_api].should == {
1618
+ 'version' => '1',
1619
+ 'strict' => true,
1620
+ 'deprecation_errors' => false,
1621
+ }
1622
+ end
1623
+ end
1624
+
1625
+ context 'using an unknown version' do
1626
+ let(:options) do
1627
+ {server_api: {
1628
+ version: '42',
1629
+ }}
1630
+ end
1631
+
1632
+ it 'is rejected' do
1633
+ lambda do
1634
+ client
1635
+ end.should raise_error(ArgumentError, 'Unknown server API version: 42')
1636
+ end
1637
+ end
1638
+
1639
+ context 'using an unknown option' do
1640
+ let(:options) do
1641
+ {server_api: {
1642
+ vversion: '1',
1643
+ }}
1644
+ end
1645
+
1646
+ it 'is rejected' do
1647
+ lambda do
1648
+ client
1649
+ end.should raise_error(ArgumentError, 'Unknown keys under :server_api: "vversion"')
1650
+ end
1651
+ end
1652
+
1653
+ context 'using a value which is not a hash' do
1654
+ let(:options) do
1655
+ {server_api: 42}
1656
+ end
1657
+
1658
+ it 'is rejected' do
1659
+ lambda do
1660
+ client
1661
+ end.should raise_error(ArgumentError, ':server_api value must be a hash: 42')
1662
+ end
1663
+ end
1664
+ end
1665
+
1666
+ context 'when connected to a pre-OP_MSG server' do
1667
+ max_server_version '3.4'
1668
+
1669
+ let(:options) do
1670
+ {server_api: {version: 1}}
1671
+ end
1672
+
1673
+ let(:client) do
1674
+ new_local_client(SpecConfig.instance.addresses,
1675
+ SpecConfig.instance.all_test_options.merge(options))
1676
+ end
1677
+
1678
+ it 'constructs the client' do
1679
+ client.should be_a(Mongo::Client)
1680
+ end
1681
+
1682
+ it 'discovers servers' do
1683
+ client.summary.should_not =~ /UNKNOWN/
1684
+ end
1685
+
1686
+ it 'fails operations' do
1687
+ lambda do
1688
+ client.command(ping: 1)
1689
+ end.should raise_error(Mongo::Error::ServerApiNotSupported)
1690
+ end
1691
+ end
1692
+ end
1497
1693
  end
1498
1694
 
1499
1695
  context 'when making a block client' do
@@ -2092,6 +2288,7 @@ describe Mongo::Client do
2092
2288
  sdam_proc: sdam_proc,
2093
2289
  connect_timeout: 3.08, socket_timeout: 3.09,
2094
2290
  server_selection_timeout: 2.92,
2291
+ heartbeat_frequency: 100,
2095
2292
  database: SpecConfig.instance.test_db))
2096
2293
  end
2097
2294
 
@@ -2112,6 +2309,10 @@ describe Mongo::Client do
2112
2309
  end
2113
2310
 
2114
2311
  it 'does not notify subscribers set up by sdam_proc' do
2312
+ # On 4.4, the push monitor also is receiving heartbeats.
2313
+ # Give those some time to be processed.
2314
+ sleep 2
2315
+
2115
2316
  expect(subscriber.started_events.length).to be > 0
2116
2317
  subscriber.started_events.clear
2117
2318
 
@@ -2119,10 +2320,47 @@ describe Mongo::Client do
2119
2320
  # subscriber may receive events from the original client.
2120
2321
 
2121
2322
  new_client.cluster.next_primary
2323
+
2324
+ # Diagnostics
2325
+ unless subscriber.started_events.empty?
2326
+ p subscriber.started_events
2327
+ end
2328
+
2122
2329
  expect(subscriber.started_events.length).to eq 0
2123
2330
  new_client.cluster.topology.class.should_not be Mongo::Cluster::Topology::Unknown
2124
2331
  end
2125
2332
  end
2333
+
2334
+ context 'when :server_api is changed' do
2335
+
2336
+ let(:client) do
2337
+ new_local_client_nmio(['127.0.0.1:27017'])
2338
+ end
2339
+
2340
+ let(:new_client) do
2341
+ client.with(server_api: {version: '1'})
2342
+ end
2343
+
2344
+ it 'changes :server_api' do
2345
+ new_client.options[:server_api].should == {'version' => '1'}
2346
+ end
2347
+ end
2348
+
2349
+ context 'when :server_api is cleared' do
2350
+
2351
+ let(:client) do
2352
+ new_local_client_nmio(['127.0.0.1:27017'], server_api: {version: '1'})
2353
+ end
2354
+
2355
+ let(:new_client) do
2356
+ client.with(server_api: nil)
2357
+ end
2358
+
2359
+ it 'clears :server_api' do
2360
+ new_client.options[:server_api].should be nil
2361
+ end
2362
+ end
2363
+
2126
2364
  end
2127
2365
 
2128
2366
  describe '#dup' do