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
@@ -76,7 +76,7 @@ describe Mongo::Crypt::AutoDecryptionContext do
76
76
  end
77
77
 
78
78
  let(:logger) do
79
- ::Logger.new($stdout).tap do |logger|
79
+ ::Logger.new(STDOUT).tap do |logger|
80
80
  logger.level = ::Logger::DEBUG
81
81
  end
82
82
  end
@@ -93,7 +93,7 @@ describe Mongo::Crypt::AutoEncryptionContext do
93
93
  end
94
94
 
95
95
  let(:logger) do
96
- ::Logger.new($stdout).tap do |logger|
96
+ ::Logger.new(STDOUT).tap do |logger|
97
97
  logger.level = ::Logger::DEBUG
98
98
  end
99
99
  end
@@ -1,9 +1,4 @@
1
- require 'mongo'
2
- require 'support/lite_constraints'
3
-
4
- RSpec.configure do |config|
5
- config.extend(LiteConstraints)
6
- end
1
+ require 'lite_spec_helper'
7
2
 
8
3
  describe Mongo::Crypt::Binary do
9
4
  require_libmongocrypt
@@ -1,9 +1,4 @@
1
- require 'mongo'
2
- require 'support/lite_constraints'
3
-
4
- RSpec.configure do |config|
5
- config.extend(LiteConstraints)
6
- end
1
+ require 'lite_spec_helper'
7
2
 
8
3
  describe 'Mongo::Crypt::Binding' do
9
4
  describe 'binary_t bindings' do
@@ -1,10 +1,5 @@
1
- require 'mongo'
2
- require 'support/lite_constraints'
3
- require 'mongo/crypt/helpers/mongo_crypt_spec_helper'
4
-
5
- RSpec.configure do |config|
6
- config.extend(LiteConstraints)
7
- end
1
+ require 'lite_spec_helper'
2
+ require_relative '../helpers/mongo_crypt_spec_helper'
8
3
 
9
4
  shared_context 'initialized for data key creation' do
10
5
  let(:master_key) { "ru\xfe\x00" * 24 }
@@ -1,9 +1,4 @@
1
- require 'mongo'
2
- require 'support/lite_constraints'
3
-
4
- RSpec.configure do |config|
5
- config.extend(LiteConstraints)
6
- end
1
+ require 'lite_spec_helper'
7
2
 
8
3
  describe 'Mongo::Crypt::Binding' do
9
4
  describe 'helper methods' do
@@ -1,10 +1,5 @@
1
- require 'mongo'
2
- require 'support/lite_constraints'
3
- require 'mongo/crypt/helpers/mongo_crypt_spec_helper'
4
-
5
- RSpec.configure do |config|
6
- config.extend(LiteConstraints)
7
- end
1
+ require 'lite_spec_helper'
2
+ require_relative '../helpers/mongo_crypt_spec_helper'
8
3
 
9
4
  describe 'Mongo::Crypt::Binding' do
10
5
  describe 'mongocrypt_t binding' do
@@ -1,9 +1,4 @@
1
- require 'mongo'
2
- require 'support/lite_constraints'
3
-
4
- RSpec.configure do |config|
5
- config.extend(LiteConstraints)
6
- end
1
+ require 'lite_spec_helper'
7
2
 
8
3
  describe 'Mongo::Crypt::Binding' do
9
4
  describe 'mongocrypt_status_t binding' do
@@ -1,9 +1,4 @@
1
- require 'mongo'
2
- require 'support/lite_constraints'
3
-
4
- RSpec.configure do |config|
5
- config.extend(LiteConstraints)
6
- end
1
+ require 'lite_spec_helper'
7
2
 
8
3
  describe 'Mongo::Crypt::Binding' do
9
4
  require_libmongocrypt
@@ -188,7 +188,7 @@ describe Mongo::Crypt::DataKeyContext do
188
188
  end
189
189
 
190
190
  context 'with valid endpoint' do
191
- let(:options) { { master_key: { region: 'us-east-2', key: 'arn', endpoint: 'endpoint/to/kms' } } }
191
+ let(:options) { { master_key: { region: 'us-east-2', key: 'arn', endpoint: 'kms.us-east-2.amazonaws.com:443' } } }
192
192
 
193
193
  it 'does not raise an exception' do
194
194
  expect do
@@ -57,7 +57,7 @@ describe Mongo::Crypt::ExplicitDecryptionContext do
57
57
  end
58
58
 
59
59
  let(:logger) do
60
- ::Logger.new($stdout).tap do |logger|
60
+ ::Logger.new(STDOUT).tap do |logger|
61
61
  logger.level = ::Logger::DEBUG
62
62
  end
63
63
  end
@@ -153,7 +153,7 @@ describe Mongo::Crypt::ExplicitEncryptionContext do
153
153
 
154
154
  let(:key_alt_name) { nil }
155
155
  let(:logger) do
156
- ::Logger.new($stdout).tap do |logger|
156
+ ::Logger.new(STDOUT).tap do |logger|
157
157
  logger.level = ::Logger::DEBUG
158
158
  end
159
159
  end
@@ -1,9 +1,4 @@
1
- require 'mongo'
2
- require 'support/lite_constraints'
3
-
4
- RSpec.configure do |config|
5
- config.extend(LiteConstraints)
6
- end
1
+ require 'lite_spec_helper'
7
2
 
8
3
  describe Mongo::Crypt::Status do
9
4
  require_libmongocrypt
@@ -2,6 +2,19 @@ require 'spec_helper'
2
2
 
3
3
  describe Mongo::Database do
4
4
 
5
+ shared_context 'more than 100 collections' do
6
+ let(:client) do
7
+ root_authorized_client.use('many-collections')
8
+ end
9
+
10
+ before do
11
+ 120.times do |i|
12
+ client["coll-#{i}"].drop
13
+ client["coll-#{i}"].create
14
+ end
15
+ end
16
+ end
17
+
5
18
  describe '#==' do
6
19
 
7
20
  let(:database) do
@@ -82,6 +95,26 @@ describe Mongo::Database do
82
95
  expect(collection.server_selector).to eq(Mongo::ServerSelector.get(mode: :secondary))
83
96
  expect(collection.read_preference).to eq(BSON::Document.new(mode: :secondary))
84
97
  end
98
+
99
+ context ':server_api option' do
100
+
101
+ let(:client) do
102
+ new_local_client_nmio(['localhost'], server_api: {version: '1'})
103
+ end
104
+
105
+ it 'is not transfered to the collection' do
106
+ client.options[:server_api].should == {'version' => '1'}
107
+ collection.options[:server_api].should be nil
108
+ end
109
+ end
110
+ end
111
+
112
+ context 'when providing :server_api option' do
113
+ it 'is rejected' do
114
+ lambda do
115
+ database['foo', server_api: {version: '1'}]
116
+ end.should raise_error(ArgumentError, 'The :server_api option cannot be specified for collection objects. It can only be specified on Client level')
117
+ end
85
118
  end
86
119
  end
87
120
 
@@ -228,6 +261,20 @@ describe Mongo::Database do
228
261
  end
229
262
  end
230
263
  end
264
+
265
+ context 'when there are more than 100 collections' do
266
+ include_context 'more than 100 collections'
267
+
268
+ let(:collection_names) do
269
+ client.database.collection_names.sort
270
+ end
271
+
272
+ it 'lists all collections' do
273
+ collection_names.length.should == 120
274
+ collection_names.should include('coll-0')
275
+ collection_names.should include('coll-119')
276
+ end
277
+ end
231
278
  end
232
279
 
233
280
  describe '#list_collections' do
@@ -292,21 +339,40 @@ describe Mongo::Database do
292
339
  described_class.new(root_authorized_client, 'admin')
293
340
  end
294
341
 
295
- it 'does not include system collections' do
296
- expect(result.none? { |name| name =~ /(^|\.)system\./ }).to be true
342
+ shared_examples 'does not include system collections' do
343
+ it 'does not include system collections' do
344
+ expect(result.none? { |name| name =~ /(^|\.)system\./ }).to be true
345
+ end
346
+ end
347
+
348
+ context 'server 4.7+' do
349
+ min_server_fcv '4.7'
350
+ # https://jira.mongodb.org/browse/SERVER-35804
351
+ require_topology :single, :replica_set
352
+
353
+ include_examples 'does not include system collections'
354
+
355
+ it 'returns results' do
356
+ expect(result).to include('acol')
357
+ end
297
358
  end
298
359
 
299
- context 'server 3.0+' do
360
+ context 'server 3.0-4.5' do
300
361
  min_server_fcv '3.0'
362
+ max_server_version '4.5'
363
+
364
+ include_examples 'does not include system collections'
301
365
 
302
366
  it 'returns results' do
303
367
  expect(result).to include('acol')
304
368
  end
305
369
  end
306
370
 
307
- context 'server 2.6-' do
371
+ context 'server 2.6' do
308
372
  max_server_version '2.6'
309
373
 
374
+ include_examples 'does not include system collections'
375
+
310
376
  it 'returns results' do
311
377
  expect(result).to include('admin.acol')
312
378
  end
@@ -391,6 +457,25 @@ describe Mongo::Database do
391
457
  end
392
458
  end
393
459
  end
460
+
461
+ context 'when there are more than 100 collections' do
462
+ include_context 'more than 100 collections'
463
+
464
+ let(:collections) do
465
+ client.database.list_collections
466
+ end
467
+
468
+ let(:collection_names) do
469
+ # 2.6 server prefixes collection names with database name
470
+ collections.map { |info| info['name'].sub(/^many-collections\./, '') }.sort
471
+ end
472
+
473
+ it 'lists all collections' do
474
+ collections.length.should == 120
475
+ collection_names.should include('coll-0')
476
+ collection_names.should include('coll-119')
477
+ end
478
+ end
394
479
  end
395
480
 
396
481
  describe '#collections' do
@@ -541,6 +626,24 @@ describe Mongo::Database do
541
626
  end
542
627
  end
543
628
  end
629
+
630
+ context 'when there are more than 100 collections' do
631
+ include_context 'more than 100 collections'
632
+
633
+ let(:collections) do
634
+ client.database.collections
635
+ end
636
+
637
+ let(:collection_names) do
638
+ collections.map(&:name).sort
639
+ end
640
+
641
+ it 'lists all collections' do
642
+ collections.length.should == 120
643
+ collection_names.should include('coll-0')
644
+ collection_names.should include('coll-119')
645
+ end
646
+ end
544
647
  end
545
648
 
546
649
  describe '#command' do
@@ -772,6 +875,29 @@ describe Mongo::Database do
772
875
  end
773
876
  end
774
877
  end
878
+
879
+ context 'when client server api is not set' do
880
+ require_no_required_api_version
881
+ min_server_fcv '4.7'
882
+
883
+ it 'passes server api parameters' do
884
+ lambda do
885
+ database.command(ping: 1, apiVersion: 'does-not-exist')
886
+ end.should raise_error(
887
+ an_instance_of(Mongo::Error::OperationFailure).and having_attributes(code: 322))
888
+ end
889
+ end
890
+
891
+ context 'when client server api is set' do
892
+ require_required_api_version
893
+ min_server_fcv '4.7'
894
+
895
+ it 'reports server api conflict' do
896
+ lambda do
897
+ database.command(ping: 1, apiVersion: 'does-not-exist')
898
+ end.should raise_error(Mongo::Error::ServerApiConflict)
899
+ end
900
+ end
775
901
  end
776
902
 
777
903
  describe '#drop' do
@@ -825,6 +951,50 @@ describe Mongo::Database do
825
951
  end
826
952
  end
827
953
 
954
+ context 'when write concern is passed in as an option' do
955
+ min_server_fcv '3.4'
956
+ require_topology :single
957
+
958
+ let(:client_options) do
959
+ {
960
+ write_concern: {w: 0},
961
+ database: :test
962
+ }
963
+ end
964
+
965
+ let(:session) do
966
+ client.start_session
967
+ end
968
+
969
+ let(:subscriber) { EventSubscriber.new }
970
+
971
+ let(:client) do
972
+ root_authorized_client.tap do |client|
973
+ client.subscribe(Mongo::Monitoring::COMMAND, subscriber)
974
+ end.with(client_options)
975
+ end
976
+
977
+ let(:events) do
978
+ subscriber.command_started_events('dropDatabase')
979
+ end
980
+
981
+ let(:database_test_wc) do
982
+ client.database
983
+ end
984
+
985
+ let!(:command) do
986
+ Utils.get_command_event(client, 'dropDatabase') do |client|
987
+ database_test_wc.drop({ write_concern: {w: 'majority'} })
988
+ end.command
989
+ end
990
+
991
+ it 'applies the write concern passed in as an option' do
992
+ expect(events.length).to eq(1)
993
+ expect(command).to_not be_nil
994
+ expect(command[:writeConcern][:w]).to eq('majority')
995
+ end
996
+ end
997
+
828
998
  context 'when the server does not support write concern on the dropDatabase command' do
829
999
  max_server_version '3.2'
830
1000
 
@@ -31,19 +31,19 @@ describe Mongo::Error::BulkWriteError do
31
31
 
32
32
  describe '#message' do
33
33
  it 'is correct' do
34
- expect(error.message).to eq("message1 (1), message2 (2) (note1, note2)")
34
+ expect(error.message).to eq("Multiple errors: [1]: message1; [2]: message2 (note1, note2)")
35
35
  end
36
36
  end
37
37
 
38
38
  describe '#to_s' do
39
39
  it 'is correct' do
40
- expect(error.to_s).to eq("message1 (1), message2 (2) (note1, note2)")
40
+ expect(error.to_s).to eq("Multiple errors: [1]: message1; [2]: message2 (note1, note2)")
41
41
  end
42
42
  end
43
43
 
44
44
  describe '#inspect' do
45
45
  it 'is correct' do
46
- expect(error.inspect).to eq("#<Mongo::Error::BulkWriteError: message1 (1), message2 (2) (note1, note2)>")
46
+ expect(error.inspect).to eq("#<Mongo::Error::BulkWriteError: Multiple errors: [1]: message1; [2]: message2 (note1, note2)>")
47
47
  end
48
48
  end
49
49
  end
@@ -16,7 +16,7 @@ describe Mongo::Error::NoServerAvailable do
16
16
  end
17
17
 
18
18
  it 'is correct' do
19
- expect(error.message).to eq('No primary server is available in cluster: #<Cluster topology=Unknown[127.0.0.1:27017] servers=[#<Server address=127.0.0.1:27017 UNKNOWN>]> with timeout=30, LT=0.015')
19
+ expect(error.message).to eq('No primary server is available in cluster: #<Cluster topology=Unknown[127.0.0.1:27017] servers=[#<Server address=127.0.0.1:27017 UNKNOWN NO-MONITORING>]> with timeout=30, LT=0.015')
20
20
  end
21
21
 
22
22
  context 'when cluster is nil' do
@@ -25,10 +25,22 @@ describe Mongo::Error::Parser do
25
25
  end
26
26
 
27
27
  it 'returns the message' do
28
- expect(parser.message).to eq('no such command: notacommand (59)')
28
+ expect(parser.message).to eq('[59]: no such command: notacommand')
29
29
  end
30
30
  end
31
31
 
32
+ context 'when the document contains an errmsg and code name' do
33
+
34
+ let(:document) do
35
+ { 'errmsg' => 'no such command: notacommand', 'code' => 59, 'codeName' => 'foo' }
36
+ end
37
+
38
+ it 'returns the message' do
39
+ expect(parser.message).to eq('[59:foo]: no such command: notacommand')
40
+ end
41
+ end
42
+
43
+ =begin
32
44
  context 'when the document contains writeErrors' do
33
45
 
34
46
  context 'when only a single error exists' do
@@ -38,7 +50,7 @@ describe Mongo::Error::Parser do
38
50
  end
39
51
 
40
52
  it 'returns the message' do
41
- expect(parser.message).to eq('Unknown modifier: $st (9)')
53
+ expect(parser.message).to eq('[9]: Unknown modifier: $st')
42
54
  end
43
55
  end
44
56
 
@@ -55,11 +67,30 @@ describe Mongo::Error::Parser do
55
67
 
56
68
  it 'returns the messages concatenated' do
57
69
  expect(parser.message).to eq(
58
- 'Unknown modifier: $st (9), Unknown modifier: $bl (9)'
70
+ 'Multiple errors: 9: Unknown modifier: $st; 9: Unknown modifier: $bl'
71
+ )
72
+ end
73
+ end
74
+
75
+ context 'when multiple errors with code names exist' do
76
+
77
+ let(:document) do
78
+ {
79
+ 'writeErrors' => [
80
+ { 'code' => 9, 'codeName' => 'foo', 'errmsg' => 'Unknown modifier: $st' },
81
+ { 'code' => 9, 'codeName' => 'foo', 'errmsg' => 'Unknown modifier: $bl' },
82
+ ]
83
+ }
84
+ end
85
+
86
+ it 'returns the messages concatenated' do
87
+ expect(parser.message).to eq(
88
+ 'Multiple errors: [9:foo]: Unknown modifier: $st; [9:foo]: Unknown modifier: $bl'
59
89
  )
60
90
  end
61
91
  end
62
92
  end
93
+ =end
63
94
 
64
95
  context 'when the document contains $err' do
65
96
 
@@ -68,7 +99,7 @@ describe Mongo::Error::Parser do
68
99
  end
69
100
 
70
101
  it 'returns the message' do
71
- expect(parser.message).to eq('not authorized for query (13)')
102
+ expect(parser.message).to eq('[13]: not authorized for query')
72
103
  end
73
104
  end
74
105
 
@@ -79,7 +110,7 @@ describe Mongo::Error::Parser do
79
110
  end
80
111
 
81
112
  it 'returns the message' do
82
- expect(parser.message).to eq('not authorized for query (13)')
113
+ expect(parser.message).to eq('[13]: not authorized for query')
83
114
  end
84
115
  end
85
116
 
@@ -90,7 +121,7 @@ describe Mongo::Error::Parser do
90
121
  end
91
122
 
92
123
  it 'returns the message' do
93
- expect(parser.message).to eq('Not enough data-bearing nodes (100)')
124
+ expect(parser.message).to eq('[100]: Not enough data-bearing nodes')
94
125
  end
95
126
  end
96
127
  end