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
metadata.gz.sig CHANGED
Binary file
@@ -1,56 +0,0 @@
1
- # Copyright (C) 2020 MongoDB Inc.
2
- #
3
- # Licensed under the Apache License, Version 2.0 (the "License");
4
- # you may not use this file except in compliance with the License.
5
- # You may obtain a copy of the License at
6
- #
7
- # http://www.apache.org/licenses/LICENSE-2.0
8
- #
9
- # Unless required by applicable law or agreed to in writing, software
10
- # distributed under the License is distributed on an "AS IS" BASIS,
11
- # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
- # See the License for the specific language governing permissions and
13
- # limitations under the License.
14
-
15
- module Mongo
16
- module Operation
17
- module CollectionsInfoOrListCollections
18
- include PolymorphicLookup
19
-
20
- # Execute the operation.
21
- #
22
- # @example
23
- # operation.execute(server, client: nil)
24
- #
25
- # @param [ Mongo::Server ] server The server to send the operation to.
26
- # @param [ Mongo::Client ] client The client that will be used to
27
- # perform auto-encryption if it is necessary to encrypt the command
28
- # being executed (optional).
29
- #
30
- # @return [ Mongo::Operation::CollectionsInfo::Result,
31
- # Mongo::Operation::ListCollections::Result ] The operation result.
32
- def execute(server, client:)
33
- server.with_connection do |connection|
34
- operation = final_operation(connection)
35
- operation.execute(connection, client: client)
36
- end
37
- end
38
-
39
- private
40
-
41
- def final_operation(connection)
42
- op_class = if connection.features.list_collections_enabled?
43
- if connection.features.op_msg_enabled?
44
- ListCollections::OpMsg
45
- else
46
- ListCollections::Command
47
- end
48
- else
49
- CollectionsInfo::Command
50
- end
51
-
52
- op_class.new(spec)
53
- end
54
- end
55
- end
56
- end
@@ -1,47 +0,0 @@
1
- # Copyright (C) 2018-2020 MongoDB Inc.
2
- #
3
- # Licensed under the Apache License, Version 2.0 (the "License");
4
- # you may not use this file except in compliance with the License.
5
- # You may obtain a copy of the License at
6
- #
7
- # http://www.apache.org/licenses/LICENSE-2.0
8
- #
9
- # Unless required by applicable law or agreed to in writing, software
10
- # distributed under the License is distributed on an "AS IS" BASIS,
11
- # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
- # See the License for the specific language governing permissions and
13
- # limitations under the License.
14
-
15
- module Mongo
16
- module Operation
17
-
18
- # Shared behavior of executing the operation as an OpMsg when supported,
19
- # as a Command when list indxes command is supported by the server, and as
20
- # Legacy otherwise.
21
- #
22
- # @api private
23
- module OpMsgOrListIndexesCommand
24
- include PolymorphicLookup
25
-
26
- def execute(server, client:)
27
- server.with_connection do |connection|
28
- operation = final_operation(connection)
29
- operation.execute(connection, client: client)
30
- end
31
- end
32
-
33
- private
34
-
35
- def final_operation(connection)
36
- cls = if connection.features.op_msg_enabled?
37
- polymorphic_class(self.class.name, :OpMsg)
38
- elsif connection.features.list_indexes_enabled?
39
- polymorphic_class(self.class.name, :Command)
40
- else
41
- polymorphic_class(self.class.name, :Legacy)
42
- end
43
- cls.new(spec)
44
- end
45
- end
46
- end
47
- end
@@ -1,78 +0,0 @@
1
- # frozen_string_literal: true
2
- # encoding: utf-8
3
-
4
- autoload :ChildProcess, 'childprocess'
5
- autoload :Tempfile, 'tempfile'
6
-
7
- module ChildProcessHelper
8
- class SpawnError < StandardError; end
9
-
10
- module_function def call(cmd, env: nil, cwd: nil)
11
- process = ChildProcess.new(*cmd)
12
- process.io.inherit!
13
- if cwd
14
- process.cwd = cwd
15
- end
16
- if env
17
- env.each do |k, v|
18
- process.environment[k.to_s] = v
19
- end
20
- end
21
- process.start
22
- process.wait
23
- process
24
- end
25
-
26
- module_function def check_call(cmd, env: nil, cwd: nil)
27
- process = call(cmd, env: env, cwd: cwd)
28
- unless process.exit_code == 0
29
- raise SpawnError, "Failed to execute: #{cmd}"
30
- end
31
- end
32
-
33
- module_function def get_output(cmd, env: nil, cwd: nil)
34
- process = ChildProcess.new(*cmd)
35
- process.io.inherit!
36
- if cwd
37
- process.cwd = cwd
38
- end
39
- if env
40
- env.each do |k, v|
41
- process.environment[k.to_s] = v
42
- end
43
- end
44
-
45
- output = ''
46
- r, w = IO.pipe
47
-
48
- begin
49
- process.io.stdout = w
50
- process.start
51
- w.close
52
-
53
- thread = Thread.new do
54
- begin
55
- loop do
56
- output << r.readpartial(16384)
57
- end
58
- rescue EOFError
59
- end
60
- end
61
-
62
- process.wait
63
- thread.join
64
- ensure
65
- r.close
66
- end
67
-
68
- [process, output]
69
- end
70
-
71
- module_function def check_output(*args)
72
- process, output = get_output(*args)
73
- unless process.exit_code == 0
74
- raise SpawnError,"Failed to execute: #{args}"
75
- end
76
- output
77
- end
78
- end
@@ -1,207 +0,0 @@
1
- require 'singleton'
2
-
3
- class ClusterConfig
4
- include Singleton
5
- include RSpec::Core::Pending
6
-
7
- def single_server?
8
- determine_cluster_config
9
- @single_server
10
- end
11
-
12
- def replica_set_name
13
- determine_cluster_config
14
- @replica_set_name
15
- end
16
-
17
- def server_version
18
- determine_cluster_config
19
- @server_version
20
- end
21
-
22
- def enterprise?
23
- determine_cluster_config
24
- @enterprise
25
- end
26
-
27
- def short_server_version
28
- server_version.split('.')[0..1].join('.')
29
- end
30
-
31
- def fcv
32
- determine_cluster_config
33
- @fcv
34
- end
35
-
36
- # Per https://jira.mongodb.org/browse/SERVER-39052, working with FCV
37
- # in sharded topologies is annoying. Also, FCV doesn't exist in servers
38
- # less than 3.4. This method returns FCV on 3.4+ servers when in single
39
- # or RS topologies, and otherwise returns the major.minor server version.
40
- def fcv_ish
41
- if server_version.nil?
42
- raise "Deployment server version not known - check that connection to deployment succeeded"
43
- end
44
-
45
- if server_version >= '3.4' && topology != :sharded
46
- fcv
47
- else
48
- if short_server_version == '4.1'
49
- '4.2'
50
- else
51
- short_server_version
52
- end
53
- end
54
- end
55
-
56
- # @return [ Mongo::Address ] The address of the primary in the deployment.
57
- def primary_address
58
- determine_cluster_config
59
- @primary_address
60
- end
61
-
62
- def primary_address_str
63
- determine_cluster_config
64
- @primary_address.seed
65
- end
66
-
67
- def primary_address_host
68
- both = primary_address_str
69
- both.split(':').first
70
- end
71
-
72
- def primary_address_port
73
- both = primary_address_str
74
- both.split(':')[1] || 27017
75
- end
76
-
77
- def primary_description
78
- determine_cluster_config
79
- @primary_description
80
- end
81
-
82
- # Try running a command on the admin database to see if the mongod was
83
- # started with auth.
84
- def auth_enabled?
85
- if @auth_enabled.nil?
86
- @auth_enabled = begin
87
- basic_client.use(:admin).command(getCmdLineOpts: 1).first["argv"].include?("--auth")
88
- rescue => e
89
- e.message =~ /(not authorized)|(unauthorized)|(no users authenticated)|(requires authentication)/
90
- end
91
- end
92
- @auth_enabled
93
- end
94
-
95
- def topology
96
- determine_cluster_config
97
- @topology
98
- end
99
-
100
- def storage_engine
101
- @storage_engine ||= begin
102
- # 2.6 does not have wired tiger
103
- if short_server_version == '2.6'
104
- :mmapv1
105
- else
106
- client = ClientRegistry.instance.global_client('root_authorized')
107
- if topology == :sharded
108
- shards = client.use(:admin).command(listShards: 1).first
109
- if shards['shards'].empty?
110
- raise 'Shards are empty'
111
- end
112
- shard = shards['shards'].first
113
- address_str = shard['host'].sub(/^.*\//, '').sub(/,.*/, '')
114
- client = ClusterTools.instance.direct_client(address_str,
115
- SpecConfig.instance.test_options.merge(SpecConfig.instance.auth_options).merge(connect: :direct))
116
- end
117
- rv = client.use(:admin).command(serverStatus: 1).first
118
- rv = rv['storageEngine']['name']
119
- rv_map = {
120
- 'wiredTiger' => :wired_tiger,
121
- 'mmapv1' => :mmapv1,
122
- }
123
- rv_map[rv] || rv
124
- end
125
- end
126
- end
127
-
128
- # This method returns an alternate address for connecting to the configured
129
- # deployment. For example, if the replica set is configured with nodes at
130
- # of localhost:27017 and so on, this method will return 127.0.0.:27017.
131
- #
132
- # Note that the "alternate" refers to replica set configuration, not the
133
- # addresses specified in test suite configuration. If the deployment topology
134
- # is not a replica set, "alternate" refers to test suite configuration as
135
- # this is the only configuration available.
136
- def alternate_address
137
- @alternate_address ||= begin
138
- address = primary_address_host
139
- str = case address
140
- when '127.0.0.1'
141
- 'localhost'
142
- when /^(\d+\.){3}\d+$/
143
- skip 'This test requires a hostname or 127.0.0.1 as address'
144
- else
145
- # We don't know if mongod is listening on ipv4 or ipv6, in principle.
146
- # Our tests use ipv4, so hardcode that for now.
147
- # To support both we need to try both addresses which will make this
148
- # test more complicated.
149
- #
150
- # JRuby chokes on primary_address_port as the port (e.g. 27017).
151
- # Since the port does not actually matter, use a common port like 80.
152
- resolved_address = Addrinfo.getaddrinfo(address, 80, Socket::PF_INET).first.ip_address
153
- if resolved_address.include?(':')
154
- "[#{resolved_address}]"
155
- else
156
- resolved_address
157
- end
158
- end + ":#{primary_address_port}"
159
- Mongo::Address.new(str)
160
- end
161
- end
162
-
163
- private
164
-
165
- def determine_cluster_config
166
- return if @primary_address
167
-
168
- # Run all commands to figure out the cluster configuration from the same
169
- # client. This is somewhat wasteful when running a single test, but reduces
170
- # test runtime for the suite overall because all commands are sent on the
171
- # same connection rather than each command connecting to the cluster by
172
- # itself.
173
- client = ClientRegistry.instance.global_client('root_authorized')
174
-
175
- primary = client.cluster.next_primary
176
- @primary_address = primary.address
177
- @primary_description = primary.description
178
- @replica_set_name = client.cluster.topology.replica_set_name
179
-
180
- @topology ||= begin
181
- topology = client.cluster.topology.class.name.sub(/.*::/, '')
182
- topology = topology.gsub(/([A-Z])/) { |match| '_' + match.downcase }.sub(/^_/, '')
183
- if topology =~ /^replica_set/
184
- topology = 'replica_set'
185
- end
186
- topology.to_sym
187
- end
188
-
189
- @single_server = client.cluster.servers_list.length == 1
190
-
191
- build_info = client.database.command(buildInfo: 1).first
192
-
193
- @server_version = build_info['version']
194
- @enterprise = build_info['modules'] && build_info['modules'].include?('enterprise')
195
-
196
- if @topology != :sharded && short_server_version >= '3.4'
197
- rv = client.use(:admin).command(getParameter: 1, featureCompatibilityVersion: 1).first['featureCompatibilityVersion']
198
- @fcv = rv['version'] || rv
199
- end
200
- end
201
-
202
- def basic_client
203
- # Do not cache the result here so that if the client gets closed,
204
- # client registry reconnects it in subsequent tests
205
- ClientRegistry.instance.global_client('basic')
206
- end
207
- end
@@ -1,141 +0,0 @@
1
- module LiteConstraints
2
- # Constrain tests that use TimeoutInterrupt to MRI (and Unix)
3
- def only_mri
4
- before(:all) do
5
- unless SpecConfig.instance.mri?
6
- skip "MRI required, we have #{SpecConfig.instance.platform}"
7
- end
8
- end
9
- end
10
-
11
- def require_jruby
12
- before(:all) do
13
- unless BSON::Environment.jruby?
14
- skip "JRuby required, we have #{SpecConfig.instance.platform}"
15
- end
16
- end
17
- end
18
-
19
- # This is for marking tests that fail on jruby that should
20
- # in principle work (as opposed to being fundamentally incompatible
21
- # with jruby).
22
- # Often times these failures happen only in Evergreen.
23
- def fails_on_jruby(version=nil)
24
- before(:all) do
25
- if BSON::Environment.jruby?
26
- if version
27
- min_parts = version.split('.').map(&:to_i)
28
- actual_parts = JRUBY_VERSION.split('.').map(&:to_i)[0...min_parts.length]
29
- actual = actual_parts.join('.')
30
- if actual <= version
31
- skip "Fails on jruby through #{version}"
32
- end
33
- else
34
- skip "Fails on jruby"
35
- end
36
- end
37
- end
38
- end
39
-
40
- def require_external_connectivity
41
- before(:all) do
42
- if ENV['EXTERNAL_DISABLED']
43
- skip "Test requires external connectivity"
44
- end
45
- end
46
- end
47
-
48
- def require_mongo_kerberos
49
- before(:all) do
50
- unless %w(1 yes true).include?(ENV['MONGO_RUBY_DRIVER_KERBEROS']&.downcase)
51
- skip 'Set MONGO_RUBY_DRIVER_KERBEROS=1 in environment to run Kerberos unit tests'
52
- end
53
- require 'mongo_kerberos'
54
- end
55
- end
56
-
57
- def require_linting
58
- before do
59
- unless Mongo::Lint.enabled?
60
- skip "Linting is not enabled"
61
- end
62
- end
63
- end
64
-
65
- def require_libmongocrypt
66
- before(:all) do
67
- unless ENV['LIBMONGOCRYPT_PATH']
68
- skip 'Test requires path to libmongocrypt to be specified in LIBMONGOCRYPT_PATH env variable'
69
- end
70
- end
71
- end
72
-
73
- def require_no_libmongocrypt
74
- before(:all) do
75
- if ENV['LIBMONGOCRYPT_PATH']
76
- skip 'Test requires libmongocrypt to not be configured'
77
- end
78
- end
79
- end
80
-
81
- # Some tests will fail if linting is enabled:
82
- # 1. Tests that pass invalid options to client, etc. which the linter
83
- # rejects.
84
- # 2. Tests that set expectations on topologies, server descriptions, etc.
85
- # (since setting expectations requires mutating said objects, and when
86
- # linting is on those objects are frozen).
87
- def skip_if_linting
88
- before do
89
- if Mongo::Lint.enabled?
90
- skip "Linting is enabled"
91
- end
92
- end
93
- end
94
-
95
- def require_aws_auth
96
- before(:all) do
97
- unless (ENV['AUTH'] || '') =~ /^aws/
98
- skip 'This test requires AUTH=aws* and an appropriately configured runtime environment'
99
- end
100
- end
101
- end
102
-
103
- def require_ec2_host
104
- before(:all) do
105
- if $have_aws.nil?
106
- $have_aws = begin
107
- require 'open-uri'
108
- begin
109
- Timeout.timeout(3.81) do
110
- URI.parse('http://169.254.169.254/latest/meta-data/profile').open.read
111
- end
112
- true
113
- # When trying to use the EC2 metadata endpoint on ECS:
114
- # Errno::EINVAL: Failed to open TCP connection to 169.254.169.254:80 (Invalid argument - connect(2) for "169.254.169.254" port 80)
115
- rescue Timeout::Error, Errno::ETIMEDOUT, Errno::EINVAL, OpenURI::HTTPError => $aws_error
116
- false
117
- end
118
- end
119
- end
120
- unless $have_aws
121
- skip "EC2 instance metadata is not available - assuming not running on an EC2 instance: #{$aws_error.class}: #{$aws_error}"
122
- end
123
- end
124
- end
125
-
126
- def require_stress
127
- before(:all) do
128
- if !SpecConfig.instance.stress?
129
- skip 'Set STRESS=1 in environment to run stress tests'
130
- end
131
- end
132
- end
133
-
134
- def require_fork
135
- before(:all) do
136
- if !SpecConfig.instance.fork?
137
- skip 'Set FORK=1 in environment to run fork tests'
138
- end
139
- end
140
- end
141
- end