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,39 @@
1
+ require 'lite_spec_helper'
2
+
3
+ describe Mongo::Utils do
4
+ describe '#shallow_symbolize_keys' do
5
+ it 'symbolizes' do
6
+ described_class.shallow_symbolize_keys(
7
+ 'foo' => 'bar',
8
+ 'aKey' => 'aValue',
9
+ 'a_key' => 'a_value',
10
+ key: :value,
11
+ ).should == {
12
+ foo: 'bar',
13
+ aKey: 'aValue',
14
+ a_key: 'a_value',
15
+ key: :value,
16
+ }
17
+ end
18
+ end
19
+
20
+ describe '#shallow_camelize_keys' do
21
+ it 'camelizes' do
22
+ described_class.shallow_camelize_keys(
23
+ 'foo' => 'bar',
24
+ 'aKey' => 'aValue',
25
+ 'aa_key' => 'a_value',
26
+ key: :value,
27
+ sKey: :sValue,
28
+ us_key: :us_value,
29
+ ).should == {
30
+ 'foo' => 'bar',
31
+ 'aKey' => 'aValue',
32
+ 'aaKey' => 'a_value',
33
+ 'key' => :value,
34
+ 'sKey' => :sValue,
35
+ 'usKey' => :us_value,
36
+ }
37
+ end
38
+ end
39
+ end
data/spec/runners/auth.rb CHANGED
@@ -83,6 +83,9 @@ module Mongo
83
83
 
84
84
  if credential['username']
85
85
  expected_credential['user'] = credential['username']
86
+ end
87
+
88
+ if credential['password']
86
89
  expected_credential['password'] = credential['password']
87
90
  end
88
91
 
@@ -70,7 +70,7 @@ module Mongo
70
70
  if ClusterConfig.instance.server_version < '4.4' &&
71
71
  global_client.cluster.servers.length > 1
72
72
  then
73
- mongos_each_direct_client do |client|
73
+ ::Utils.mongos_each_direct_client do |client|
74
74
  client.database.command(flushRouterConfig: 1)
75
75
  end
76
76
  end
@@ -84,20 +84,6 @@ RSpec::Matchers.define :match_auth do |test|
84
84
  end
85
85
  end
86
86
 
87
- RSpec::Matchers.define :match_options do |test|
88
-
89
- match do |client|
90
- options = test.options
91
- return true unless options
92
- options.match?(client.options)
93
- end
94
-
95
- failure_message do |client|
96
- "With URI: #{test.uri_string}\n" +
97
- "Expected that test options: #{test.options.options} would match client options: #{client.options}"
98
- end
99
- end
100
-
101
87
  module Mongo
102
88
  module ConnectionString
103
89
 
@@ -159,7 +145,7 @@ module Mongo
159
145
  end
160
146
 
161
147
  def options
162
- @options ||= Options.new(@spec['options']) if @spec['options']
148
+ @spec['options']
163
149
  end
164
150
 
165
151
  def client
@@ -239,115 +225,27 @@ module Mongo
239
225
  end
240
226
  end
241
227
 
242
- class Options
243
-
244
- MAPPINGS = {
245
- # Connection and Replica Set Options
246
- 'replicaset' => :replica_set,
247
- 'directconnection' => :direct_connection,
248
-
249
- # Timeout Options
250
- 'connecttimeoutms' => :connect_timeout,
251
- 'sockettimeoutms' => :socket_timeout,
252
- 'serverselectiontimeoutms' => :server_selection_timeout,
253
- 'localthresholdms' => :local_threshold,
254
- 'heartbeatfrequencyms' => :heartbeat_frequency,
255
- 'maxidletimems' => :max_idle_time,
256
-
257
- # Write Options
258
- 'journal' => [:write_concern, 'j'],
259
- 'w' => [:write_concern, 'w'],
260
- 'wtimeoutms' => [:write_concern, 'wtimeout'],
261
-
262
- # Read Options
263
- 'readpreference' => ['read', 'mode'],
264
- 'readpreferencetags' => ['read', 'tag_sets'],
265
- 'maxstalenessseconds' => ['read', 'max_staleness'],
266
-
267
- # Pool Options
268
- 'minpoolsize' => :min_pool_size,
269
- 'maxpoolsize' => :max_pool_size,
270
-
271
- # Security Options
272
- 'tls' => :ssl,
273
- 'tlsallowinvalidcertificates' => :ssl_verify_certificate,
274
- 'tlsallowinvalidhostnames' => :ssl_verify_hostname,
275
- 'tlscafile' => :ssl_ca_cert,
276
- 'tlscertificatekeyfile' => :ssl_cert,
277
- 'tlscertificatekeyfilepassword' => :ssl_key_pass_phrase,
278
- 'tlsinsecure' => :ssl_verify,
279
-
280
- # Auth Options
281
- 'authsource' => :auth_source,
282
- 'authmechanism' => :auth_mech,
283
- 'authmechanismproperties' => :auth_mech_properties,
284
-
285
- # Client Options
286
- 'appname' => :app_name,
287
- 'readconcernlevel' => [:read_concern, 'level'],
288
- 'retrywrites' => :retry_writes,
289
- 'zlibcompressionlevel' => :zlib_compression_level,
290
- }
291
-
292
- attr_reader :options
293
-
294
- def initialize(options)
295
- @options = options
296
- end
297
-
298
- def match?(opts)
299
- @options.all? do |k, v|
300
- k = k.downcase
301
-
302
- expected =
303
- case k
304
- when 'authmechanism'
305
- Mongo::URI::AUTH_MECH_MAP[v].downcase.to_s
306
- when 'authmechanismproperties'
307
- v.reduce({}) do |new_v, prop|
308
- prop_key = prop.first.downcase
309
- prop_val = prop.last == 'true' ? true : prop.last
310
- new_v[prop_key] = prop_val
311
-
312
- new_v
313
- end
314
- when 'compressors'
315
- v.dup.tap do |compressors|
316
- # The Ruby driver doesn't support snappy
317
- compressors.delete('snappy')
318
- end
319
- when 'readpreference'
320
- Mongo::URI::READ_MODE_MAP[v.downcase].to_s
321
- when 'tlsallowinvalidcertificates', 'tlsallowinvalidhostnames', 'tlsinsecure'
322
- !v
323
- else
324
- if k.end_with?('ms') && k != 'wtimeoutms'
325
- v / 1000.0
326
- elsif v.is_a?(String)
327
- v.downcase
328
- else
329
- v
330
- end
331
- end
332
-
333
- actual =
334
- case MAPPINGS[k]
335
- when nil
336
- opts[k]
337
- when Array
338
- opts[MAPPINGS[k].first][MAPPINGS[k].last]
339
- else
340
- opts[MAPPINGS[k]]
341
- end
342
-
343
- if actual.is_a?(Symbol)
344
- actual = actual.to_s
228
+ module_function def adjust_expected_mongo_client_options(options)
229
+ expected = options.dup.tap do |expected|
230
+ expected.each do |k, v|
231
+ # Ruby driver downcases auth mechanism properties when
232
+ # constructing the client.
233
+ #
234
+ # Some tests give options in all lower case.
235
+ if k.downcase == 'authmechanismproperties'
236
+ expected[k] = ::Utils.downcase_keys(v)
345
237
  end
346
- if actual.is_a?(String)
347
- actual = actual.downcase
238
+ end
239
+ # We omit retryReads/retryWrites=true because some tests do not
240
+ # provide those.
241
+ %w(retryReads retryWrites).each do |k, v|
242
+ if expected[k] == true
243
+ expected.delete(k)
348
244
  end
349
-
350
- expected == actual
245
+ end
246
+ # Fix appName case.
247
+ if expected.key?('appname') && !expected.key?('appName')
248
+ expected['appName'] = expected.delete('appname')
351
249
  end
352
250
  end
353
251
  end
@@ -406,8 +304,17 @@ def define_connection_string_spec_tests(test_paths, spec_cls = Mongo::Connection
406
304
  expect(test.client).to match_auth(test)
407
305
  end
408
306
 
409
- it 'creates a client with the correct options' do
410
- expect(test.client).to match_options(test)
307
+ if test.options
308
+ it 'creates a client with the correct options' do
309
+ mapped = Mongo::URI::OptionsMapper.new.ruby_to_smc(test.client.options)
310
+ # Connection string spec tests do not use canonical URI option names
311
+ actual = Utils.downcase_keys(mapped)
312
+ actual.delete('authsource')
313
+ expected = Mongo::ConnectionString.adjust_expected_mongo_client_options(
314
+ test.options,
315
+ )
316
+ actual.should == expected
317
+ end
411
318
  end
412
319
 
413
320
  if test.read_concern_expectation
@@ -1,18 +1,39 @@
1
1
  module Mongo
2
2
  module CRUD
3
3
  class Requirement
4
- YAML_KEYS = %w(minServerVersion maxServerVersion topology).freeze
4
+ YAML_KEYS = %w(minServerVersion maxServerVersion topology topologies serverParameters).freeze
5
5
 
6
6
  def initialize(spec)
7
+ spec = spec.dup
8
+ # Legacy tests have the requirements mixed with other test fields
9
+ spec.delete('data')
10
+ spec.delete('tests')
11
+
12
+ unless (unhandled_keys = spec.keys - YAML_KEYS).empty?
13
+ raise "Unhandled requirement specification keys: #{unhandled_keys}"
14
+ end
15
+
7
16
  @min_server_version = spec['minServerVersion']
8
17
  @max_server_version = spec['maxServerVersion']
9
- @topologies = if topologies = spec['topology']
18
+ # topologies is for unified test format.
19
+ # topology is for legacy tests.
20
+ @topologies = if topologies = spec['topology'] || spec['topologies']
10
21
  topologies.map do |topology|
11
- {'replicaset' => :replica_set, 'single' => :single, 'sharded' => :sharded}[topology]
22
+ {
23
+ 'replicaset' => :replica_set,
24
+ 'single' => :single,
25
+ 'sharded' => :sharded,
26
+ 'sharded-replicaset' => :sharded,
27
+ }[topology].tap do |v|
28
+ unless v
29
+ raise "Unknown topology #{topology}"
30
+ end
31
+ end
12
32
  end
13
33
  else
14
34
  nil
15
35
  end
36
+ @server_parameters = spec['serverParameters']
16
37
  end
17
38
 
18
39
  attr_reader :min_server_version
@@ -47,6 +68,22 @@ module Mongo
47
68
  if topologies
48
69
  ok &&= topologies.include?(cc.topology)
49
70
  end
71
+ if @server_parameters
72
+ @server_parameters.each do |k, required_v|
73
+ actual_v = cc.server_parameters[k]
74
+ if actual_v.nil? && !required_v.nil?
75
+ ok = false
76
+ elsif actual_v != required_v
77
+ if Numeric === actual_v && Numeric === required_v
78
+ if actual_v.to_f != required_v.to_f
79
+ ok = false
80
+ end
81
+ else
82
+ ok = false
83
+ end
84
+ end
85
+ end
86
+ end
50
87
  ok
51
88
  end
52
89
 
@@ -45,25 +45,6 @@ module Mongo
45
45
  raise "Unknown target #{operation.object}"
46
46
  end
47
47
  end
48
-
49
- # If the deployment is a sharded cluster, creates a direct client
50
- # to each of the mongos nodes and yields each in turn to the
51
- # provided block. Does nothing in other topologies.
52
- def mongos_each_direct_client
53
- if ClusterConfig.instance.topology == :sharded
54
- client = ClientRegistry.instance.global_client('basic')
55
- client.cluster.next_primary
56
- client.cluster.servers.each do |server|
57
- direct_client = ClientRegistry.instance.new_local_client(
58
- [server.address.to_s],
59
- SpecConfig.instance.test_options.merge(
60
- connect: :sharded
61
- ).merge(SpecConfig.instance.auth_options))
62
- yield direct_client
63
- direct_client.close
64
- end
65
- end
66
- end
67
48
  end
68
49
  end
69
50
  end
@@ -193,6 +193,14 @@ EOT
193
193
  return
194
194
  end
195
195
 
196
+ if k == 'updateDescription'
197
+ # Change stream result - verify subset, not exact match
198
+ expected.fetch(k).each do |sub_k, sub_v|
199
+ {sub_k => sub_v}.should == {sub_k => actual.fetch(k).fetch(sub_k)}
200
+ end
201
+ return
202
+ end
203
+
196
204
  if expected[k].is_a?(Time)
197
205
  expect(k => actual[k].utc.to_s).to eq(k => expected[k].utc.to_s)
198
206
  else
@@ -123,7 +123,7 @@ end
123
123
  def define_server_selection_spec_tests(test_paths)
124
124
  # Linter insists that a server selection semaphore is present when
125
125
  # performing server selection.
126
- skip_if_linting
126
+ require_no_linting
127
127
 
128
128
  test_paths.each do |file|
129
129
 
@@ -191,8 +191,19 @@ module Mongo
191
191
 
192
192
  def assert_event_count(client, context)
193
193
  events = _select_events(context)
194
- unless events.length == arguments['count']
195
- raise "Exppected #{arguments['count']} #{arguments['event']} events, but have #{events.length}"
194
+ if %w(ServerMarkedUnknownEvent PoolClearedEvent).include?(arguments['event'])
195
+ # We publish SDAM events from both regular and push monitors.
196
+ # This means sometimes there are two ServerMarkedUnknownEvent
197
+ # events published for the same server transition.
198
+ # Allow actual event count to be at least the expected event count
199
+ # in case there are multiple transitions in a single test.
200
+ unless events.length >= arguments['count']
201
+ raise "Expected #{arguments['count']} #{arguments['event']} events, but have #{events.length}"
202
+ end
203
+ else
204
+ unless events.length == arguments['count']
205
+ raise "Expected #{arguments['count']} #{arguments['event']} events, but have #{events.length}"
206
+ end
196
207
  end
197
208
  end
198
209
 
@@ -224,7 +224,7 @@ module Mongo
224
224
  end
225
225
 
226
226
  if ClusterConfig.instance.fcv_ish >= '4.2'
227
- mongos_each_direct_client do |direct_client|
227
+ ::Utils.mongos_each_direct_client do |direct_client|
228
228
  direct_client.command(configureFailPoint: 'failCommand', mode: 'off')
229
229
  end
230
230
  end
@@ -261,7 +261,7 @@ module Mongo
261
261
 
262
262
  $distinct_ran ||= {}
263
263
  $distinct_ran[@spec.database_name] ||= if description =~ /distinct/ || @operations.any? { |op| op.name == 'distinct' }
264
- mongos_each_direct_client do |direct_client|
264
+ ::Utils.mongos_each_direct_client do |direct_client|
265
265
  direct_client.use(@spec.database_name)['test'].distinct('foo').to_a
266
266
  end
267
267
  end
@@ -289,6 +289,7 @@ module Mongo
289
289
  client.command(configureFailPoint: fail_point_command['configureFailPoint'],
290
290
  mode: 'off')
291
291
  end
292
+ $disable_fail_points = nil
292
293
  end
293
294
 
294
295
  if @test_client
@@ -0,0 +1,96 @@
1
+ require 'runners/unified/error'
2
+ require 'runners/unified/entity_map'
3
+ require 'runners/unified/event_subscriber'
4
+ require 'runners/unified/test'
5
+ require 'runners/unified/test_group'
6
+ require 'runners/unified/using_hash'
7
+
8
+ def define_unified_spec_tests(base_path, paths, expect_failure: false)
9
+ paths.each do |path|
10
+ basename = path[base_path.length+1...path.length]
11
+ context basename do
12
+ group = Unified::TestGroup.new(path)
13
+
14
+ if basename =~ /retryable|transaction/
15
+ require_wired_tiger
16
+ end
17
+
18
+ group.tests.each do |test|
19
+ context test.description do
20
+
21
+ if test.skip?
22
+ before do
23
+ skip test.skip_reason
24
+ end
25
+ end
26
+
27
+ before(:all) do
28
+ if SpecConfig.instance.retry_reads == false
29
+ skip "Tests are not applicable when legacy read retries are used"
30
+ end
31
+ if SpecConfig.instance.retry_writes == false
32
+ skip "Tests are not applicable when legacy write retries are used"
33
+ end
34
+
35
+ if ClusterConfig.instance.topology == :sharded
36
+ if test.require_multiple_mongoses? && SpecConfig.instance.addresses.length == 1
37
+ skip "Test requires multiple mongoses"
38
+ elsif test.require_single_mongos? && SpecConfig.instance.addresses.length > 1
39
+ # Many transaction spec tests that do not specifically deal with
40
+ # sharded transactions fail when run against a multi-mongos cluster
41
+ skip "Test requires single mongos"
42
+ end
43
+ end
44
+ end
45
+
46
+ if expect_failure
47
+ it 'fails as expected' do
48
+ if test.group_reqs
49
+ unless test.group_reqs.any? { |r| r.satisfied? }
50
+ skip "Group requirements not satisfied"
51
+ end
52
+ end
53
+ if test.reqs
54
+ unless test.reqs.any? { |r| r.satisfied? }
55
+ skip "Requirements not satisfied"
56
+ end
57
+ end
58
+ begin
59
+ test.create_entities
60
+ test.set_initial_data
61
+ lambda do
62
+ test.run
63
+ test.assert_outcome
64
+ test.assert_events
65
+ # HACK: other errors are possible and likely will need to
66
+ # be added here later as the tests evolve.
67
+ end.should raise_error(Mongo::Error::OperationFailure)
68
+ ensure
69
+ test.cleanup
70
+ end
71
+ end
72
+ else
73
+ it 'passes' do
74
+ if test.group_reqs
75
+ unless test.group_reqs.any? { |r| r.satisfied? }
76
+ skip "Group requirements not satisfied"
77
+ end
78
+ end
79
+ if test.reqs
80
+ unless test.reqs.any? { |r| r.satisfied? }
81
+ skip "Requirements not satisfied"
82
+ end
83
+ end
84
+ test.create_entities
85
+ test.set_initial_data
86
+ test.run
87
+ test.assert_outcome
88
+ test.assert_events
89
+ test.cleanup
90
+ end
91
+ end
92
+ end
93
+ end
94
+ end
95
+ end
96
+ end