mongo 2.13.0.beta1 → 2.14.0

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 (339) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data.tar.gz.sig +1 -5
  4. data/Rakefile +50 -9
  5. data/lib/mongo.rb +13 -2
  6. data/lib/mongo/address.rb +1 -1
  7. data/lib/mongo/address/ipv4.rb +1 -1
  8. data/lib/mongo/address/ipv6.rb +1 -1
  9. data/lib/mongo/auth/aws/request.rb +31 -5
  10. data/lib/mongo/bulk_write.rb +18 -0
  11. data/lib/mongo/caching_cursor.rb +74 -0
  12. data/lib/mongo/client.rb +238 -31
  13. data/lib/mongo/cluster.rb +56 -20
  14. data/lib/mongo/cluster/sdam_flow.rb +13 -10
  15. data/lib/mongo/cluster/topology/replica_set_no_primary.rb +3 -2
  16. data/lib/mongo/cluster/topology/sharded.rb +1 -1
  17. data/lib/mongo/cluster/topology/single.rb +2 -2
  18. data/lib/mongo/collection.rb +66 -24
  19. data/lib/mongo/collection/view.rb +24 -20
  20. data/lib/mongo/collection/view/aggregation.rb +25 -4
  21. data/lib/mongo/collection/view/builder/find_command.rb +38 -18
  22. data/lib/mongo/collection/view/explainable.rb +27 -8
  23. data/lib/mongo/collection/view/iterable.rb +72 -12
  24. data/lib/mongo/collection/view/readable.rb +19 -3
  25. data/lib/mongo/collection/view/writable.rb +55 -5
  26. data/lib/mongo/crypt/encryption_io.rb +6 -6
  27. data/lib/mongo/cursor.rb +16 -3
  28. data/lib/mongo/database.rb +37 -4
  29. data/lib/mongo/database/view.rb +18 -3
  30. data/lib/mongo/distinguishing_semaphore.rb +55 -0
  31. data/lib/mongo/error.rb +5 -0
  32. data/lib/mongo/error/invalid_read_concern.rb +28 -0
  33. data/lib/mongo/error/invalid_server_auth_host.rb +22 -0
  34. data/lib/mongo/error/invalid_session.rb +2 -1
  35. data/lib/mongo/error/operation_failure.rb +11 -5
  36. data/lib/mongo/error/server_certificate_revoked.rb +22 -0
  37. data/lib/mongo/error/sessions_not_supported.rb +35 -0
  38. data/lib/mongo/error/unsupported_option.rb +14 -12
  39. data/lib/mongo/event/base.rb +6 -0
  40. data/lib/mongo/grid/file.rb +5 -0
  41. data/lib/mongo/grid/file/chunk.rb +2 -0
  42. data/lib/mongo/grid/fs_bucket.rb +15 -13
  43. data/lib/mongo/grid/stream/write.rb +9 -3
  44. data/lib/mongo/index/view.rb +3 -0
  45. data/lib/mongo/lint.rb +2 -1
  46. data/lib/mongo/logger.rb +3 -3
  47. data/lib/mongo/monitoring.rb +38 -0
  48. data/lib/mongo/monitoring/command_log_subscriber.rb +10 -2
  49. data/lib/mongo/monitoring/event/command_failed.rb +11 -0
  50. data/lib/mongo/monitoring/event/command_started.rb +37 -2
  51. data/lib/mongo/monitoring/event/command_succeeded.rb +11 -0
  52. data/lib/mongo/monitoring/event/server_closed.rb +1 -1
  53. data/lib/mongo/monitoring/event/server_description_changed.rb +27 -4
  54. data/lib/mongo/monitoring/event/server_heartbeat_failed.rb +9 -2
  55. data/lib/mongo/monitoring/event/server_heartbeat_started.rb +9 -2
  56. data/lib/mongo/monitoring/event/server_heartbeat_succeeded.rb +9 -2
  57. data/lib/mongo/monitoring/event/server_opening.rb +1 -1
  58. data/lib/mongo/monitoring/event/topology_changed.rb +1 -1
  59. data/lib/mongo/monitoring/event/topology_closed.rb +1 -1
  60. data/lib/mongo/monitoring/event/topology_opening.rb +1 -1
  61. data/lib/mongo/monitoring/publishable.rb +6 -3
  62. data/lib/mongo/monitoring/server_description_changed_log_subscriber.rb +9 -1
  63. data/lib/mongo/monitoring/topology_changed_log_subscriber.rb +1 -1
  64. data/lib/mongo/operation.rb +2 -0
  65. data/lib/mongo/operation/aggregate/result.rb +9 -8
  66. data/lib/mongo/operation/collections_info/command.rb +5 -0
  67. data/lib/mongo/operation/collections_info/result.rb +18 -1
  68. data/lib/mongo/operation/delete/bulk_result.rb +2 -0
  69. data/lib/mongo/operation/delete/result.rb +3 -0
  70. data/lib/mongo/operation/explain/command.rb +4 -0
  71. data/lib/mongo/operation/explain/legacy.rb +4 -0
  72. data/lib/mongo/operation/explain/op_msg.rb +6 -0
  73. data/lib/mongo/operation/explain/result.rb +3 -0
  74. data/lib/mongo/operation/find/legacy/result.rb +2 -0
  75. data/lib/mongo/operation/find/result.rb +13 -0
  76. data/lib/mongo/operation/get_more/result.rb +3 -0
  77. data/lib/mongo/operation/indexes/result.rb +5 -0
  78. data/lib/mongo/operation/insert/bulk_result.rb +5 -0
  79. data/lib/mongo/operation/insert/result.rb +5 -0
  80. data/lib/mongo/operation/list_collections/result.rb +5 -0
  81. data/lib/mongo/operation/map_reduce/result.rb +10 -0
  82. data/lib/mongo/operation/parallel_scan/result.rb +4 -0
  83. data/lib/mongo/operation/result.rb +35 -6
  84. data/lib/mongo/operation/shared/bypass_document_validation.rb +1 -0
  85. data/lib/mongo/operation/shared/causal_consistency_supported.rb +1 -0
  86. data/lib/mongo/operation/shared/collections_info_or_list_collections.rb +2 -0
  87. data/lib/mongo/operation/shared/executable.rb +1 -0
  88. data/lib/mongo/operation/shared/idable.rb +2 -1
  89. data/lib/mongo/operation/shared/limited.rb +1 -0
  90. data/lib/mongo/operation/shared/object_id_generator.rb +1 -0
  91. data/lib/mongo/operation/shared/result/aggregatable.rb +1 -0
  92. data/lib/mongo/operation/shared/sessions_supported.rb +1 -0
  93. data/lib/mongo/operation/shared/specifiable.rb +1 -0
  94. data/lib/mongo/operation/shared/write.rb +1 -0
  95. data/lib/mongo/operation/shared/write_concern_supported.rb +1 -0
  96. data/lib/mongo/operation/update/legacy/result.rb +7 -0
  97. data/lib/mongo/operation/update/result.rb +8 -0
  98. data/lib/mongo/operation/users_info/result.rb +3 -0
  99. data/lib/mongo/protocol/message.rb +47 -10
  100. data/lib/mongo/protocol/msg.rb +34 -1
  101. data/lib/mongo/protocol/query.rb +36 -0
  102. data/lib/mongo/protocol/serializers.rb +5 -2
  103. data/lib/mongo/query_cache.rb +242 -0
  104. data/lib/mongo/retryable.rb +8 -1
  105. data/lib/mongo/server.rb +15 -4
  106. data/lib/mongo/server/app_metadata.rb +27 -3
  107. data/lib/mongo/server/connection.rb +4 -4
  108. data/lib/mongo/server/connection_base.rb +38 -12
  109. data/lib/mongo/server/connection_common.rb +2 -2
  110. data/lib/mongo/server/connection_pool.rb +3 -0
  111. data/lib/mongo/server/description.rb +13 -1
  112. data/lib/mongo/server/monitor.rb +76 -44
  113. data/lib/mongo/server/monitor/connection.rb +57 -9
  114. data/lib/mongo/server/pending_connection.rb +14 -4
  115. data/lib/mongo/server/push_monitor.rb +173 -0
  116. data/{spec/runners/transactions/context.rb → lib/mongo/server/push_monitor/connection.rb} +9 -14
  117. data/lib/mongo/server_selector.rb +0 -1
  118. data/lib/mongo/server_selector/base.rb +583 -1
  119. data/lib/mongo/server_selector/nearest.rb +1 -6
  120. data/lib/mongo/server_selector/primary.rb +1 -6
  121. data/lib/mongo/server_selector/primary_preferred.rb +7 -10
  122. data/lib/mongo/server_selector/secondary.rb +1 -6
  123. data/lib/mongo/server_selector/secondary_preferred.rb +1 -7
  124. data/lib/mongo/session.rb +7 -1
  125. data/lib/mongo/socket.rb +26 -12
  126. data/lib/mongo/socket/ocsp_cache.rb +97 -0
  127. data/lib/mongo/socket/ocsp_verifier.rb +368 -0
  128. data/lib/mongo/socket/ssl.rb +46 -25
  129. data/lib/mongo/socket/tcp.rb +1 -1
  130. data/lib/mongo/srv/monitor.rb +7 -13
  131. data/lib/mongo/srv/resolver.rb +14 -10
  132. data/lib/mongo/timeout.rb +2 -0
  133. data/lib/mongo/topology_version.rb +9 -0
  134. data/lib/mongo/uri.rb +21 -390
  135. data/lib/mongo/uri/options_mapper.rb +582 -0
  136. data/lib/mongo/uri/srv_protocol.rb +3 -2
  137. data/lib/mongo/utils.rb +73 -0
  138. data/lib/mongo/version.rb +1 -1
  139. data/spec/NOTES.aws-auth.md +12 -7
  140. data/spec/README.aws-auth.md +2 -2
  141. data/spec/README.md +63 -1
  142. data/spec/integration/awaited_ismaster_spec.rb +28 -0
  143. data/spec/integration/bson_symbol_spec.rb +4 -2
  144. data/spec/integration/bulk_write_spec.rb +67 -0
  145. data/spec/integration/change_stream_examples_spec.rb +6 -2
  146. data/spec/integration/change_stream_spec.rb +1 -1
  147. data/spec/integration/check_clean_slate_spec.rb +16 -0
  148. data/spec/integration/client_authentication_options_spec.rb +92 -28
  149. data/spec/integration/client_construction_spec.rb +1 -0
  150. data/spec/integration/client_side_encryption/auto_encryption_bulk_writes_spec.rb +9 -5
  151. data/spec/integration/connect_single_rs_name_spec.rb +5 -2
  152. data/spec/integration/connection_pool_populator_spec.rb +4 -2
  153. data/spec/integration/connection_spec.rb +7 -4
  154. data/spec/integration/crud_spec.rb +4 -4
  155. data/spec/integration/cursor_reaping_spec.rb +54 -18
  156. data/spec/integration/docs_examples_spec.rb +6 -0
  157. data/spec/integration/fork_reconnect_spec.rb +56 -1
  158. data/spec/integration/grid_fs_bucket_spec.rb +48 -0
  159. data/spec/integration/heartbeat_events_spec.rb +4 -23
  160. data/spec/integration/ocsp_connectivity_spec.rb +26 -0
  161. data/spec/integration/ocsp_verifier_cache_spec.rb +188 -0
  162. data/spec/integration/ocsp_verifier_spec.rb +334 -0
  163. data/spec/integration/query_cache_spec.rb +1045 -0
  164. data/spec/integration/query_cache_transactions_spec.rb +190 -0
  165. data/spec/integration/read_concern_spec.rb +1 -1
  166. data/spec/integration/retryable_errors_spec.rb +1 -1
  167. data/spec/integration/retryable_writes/retryable_writes_40_and_newer_spec.rb +1 -0
  168. data/spec/integration/retryable_writes/shared/performs_legacy_retries.rb +4 -2
  169. data/spec/integration/retryable_writes/shared/performs_modern_retries.rb +3 -3
  170. data/spec/integration/retryable_writes/shared/performs_no_retries.rb +2 -2
  171. data/spec/integration/sdam_error_handling_spec.rb +122 -15
  172. data/spec/integration/sdam_events_spec.rb +80 -6
  173. data/spec/integration/sdam_prose_spec.rb +64 -0
  174. data/spec/integration/server_monitor_spec.rb +25 -1
  175. data/spec/integration/server_selection_spec.rb +36 -0
  176. data/spec/integration/size_limit_spec.rb +23 -5
  177. data/spec/integration/srv_monitoring_spec.rb +38 -3
  178. data/spec/integration/srv_spec.rb +56 -0
  179. data/spec/integration/ssl_uri_options_spec.rb +2 -2
  180. data/spec/integration/transactions_examples_spec.rb +17 -7
  181. data/spec/integration/zlib_compression_spec.rb +25 -0
  182. data/spec/lite_spec_helper.rb +20 -9
  183. data/spec/mongo/address_spec.rb +1 -1
  184. data/spec/mongo/auth/aws/request_region_spec.rb +42 -0
  185. data/spec/mongo/auth/aws/request_spec.rb +76 -0
  186. data/spec/mongo/auth/scram_spec.rb +1 -1
  187. data/spec/mongo/auth/user_spec.rb +1 -1
  188. data/spec/mongo/bulk_write_spec.rb +2 -2
  189. data/spec/mongo/caching_cursor_spec.rb +70 -0
  190. data/spec/mongo/client_construction_spec.rb +386 -3
  191. data/spec/mongo/client_encryption_spec.rb +16 -10
  192. data/spec/mongo/client_spec.rb +85 -3
  193. data/spec/mongo/cluster/topology/replica_set_spec.rb +53 -10
  194. data/spec/mongo/cluster/topology/sharded_spec.rb +1 -1
  195. data/spec/mongo/cluster/topology/single_spec.rb +19 -8
  196. data/spec/mongo/cluster/topology/unknown_spec.rb +1 -1
  197. data/spec/mongo/cluster/topology_spec.rb +1 -1
  198. data/spec/mongo/cluster_spec.rb +37 -35
  199. data/spec/mongo/collection/view/change_stream_resume_spec.rb +7 -7
  200. data/spec/mongo/collection/view/explainable_spec.rb +87 -4
  201. data/spec/mongo/collection/view/map_reduce_spec.rb +2 -0
  202. data/spec/mongo/collection/view/readable_spec.rb +36 -0
  203. data/spec/mongo/collection_spec.rb +572 -0
  204. data/spec/mongo/crypt/auto_decryption_context_spec.rb +1 -1
  205. data/spec/mongo/crypt/auto_encryption_context_spec.rb +1 -1
  206. data/spec/mongo/crypt/binary_spec.rb +1 -6
  207. data/spec/mongo/crypt/binding/binary_spec.rb +1 -6
  208. data/spec/mongo/crypt/binding/context_spec.rb +2 -7
  209. data/spec/mongo/crypt/binding/helpers_spec.rb +1 -6
  210. data/spec/mongo/crypt/binding/mongocrypt_spec.rb +2 -7
  211. data/spec/mongo/crypt/binding/status_spec.rb +1 -6
  212. data/spec/mongo/crypt/binding/version_spec.rb +1 -6
  213. data/spec/mongo/crypt/data_key_context_spec.rb +1 -1
  214. data/spec/mongo/crypt/explicit_decryption_context_spec.rb +1 -1
  215. data/spec/mongo/crypt/explicit_encryption_context_spec.rb +1 -1
  216. data/spec/mongo/crypt/status_spec.rb +1 -6
  217. data/spec/mongo/database_spec.rb +353 -8
  218. data/spec/mongo/distinguishing_semaphore_spec.rb +63 -0
  219. data/spec/mongo/error/no_server_available_spec.rb +1 -1
  220. data/spec/mongo/error/operation_failure_spec.rb +40 -0
  221. data/spec/mongo/index/view_spec.rb +148 -2
  222. data/spec/mongo/logger_spec.rb +13 -11
  223. data/spec/mongo/monitoring/event/server_closed_spec.rb +1 -1
  224. data/spec/mongo/monitoring/event/server_description_changed_spec.rb +1 -4
  225. data/spec/mongo/monitoring/event/server_opening_spec.rb +1 -1
  226. data/spec/mongo/monitoring/event/topology_changed_spec.rb +1 -1
  227. data/spec/mongo/monitoring/event/topology_closed_spec.rb +1 -1
  228. data/spec/mongo/monitoring/event/topology_opening_spec.rb +1 -1
  229. data/spec/mongo/operation/delete/op_msg_spec.rb +3 -3
  230. data/spec/mongo/operation/insert/command_spec.rb +2 -2
  231. data/spec/mongo/operation/insert/op_msg_spec.rb +3 -3
  232. data/spec/mongo/operation/read_preference_op_msg_spec.rb +1 -1
  233. data/spec/mongo/operation/update/command_spec.rb +2 -2
  234. data/spec/mongo/operation/update/op_msg_spec.rb +3 -3
  235. data/spec/mongo/protocol/msg_spec.rb +10 -0
  236. data/spec/mongo/query_cache_spec.rb +280 -0
  237. data/spec/mongo/semaphore_spec.rb +51 -0
  238. data/spec/mongo/server/app_metadata_shared.rb +82 -2
  239. data/spec/mongo/server/connection_auth_spec.rb +2 -2
  240. data/spec/mongo/server/connection_pool_spec.rb +7 -3
  241. data/spec/mongo/server/connection_spec.rb +15 -8
  242. data/spec/mongo/server/description_spec.rb +18 -0
  243. data/spec/mongo/server_selector/nearest_spec.rb +23 -23
  244. data/spec/mongo/server_selector/primary_preferred_spec.rb +26 -26
  245. data/spec/mongo/server_selector/primary_spec.rb +9 -9
  246. data/spec/mongo/server_selector/secondary_preferred_spec.rb +22 -22
  247. data/spec/mongo/server_selector/secondary_spec.rb +18 -18
  248. data/spec/mongo/server_selector_spec.rb +6 -6
  249. data/spec/mongo/session_spec.rb +35 -0
  250. data/spec/mongo/socket/ssl_spec.rb +4 -4
  251. data/spec/mongo/socket_spec.rb +1 -1
  252. data/spec/mongo/uri/srv_protocol_spec.rb +64 -33
  253. data/spec/mongo/uri_option_parsing_spec.rb +11 -11
  254. data/spec/mongo/uri_spec.rb +68 -41
  255. data/spec/mongo/utils_spec.rb +39 -0
  256. data/spec/runners/auth.rb +3 -0
  257. data/spec/runners/change_streams/test.rb +3 -3
  258. data/spec/runners/cmap.rb +1 -1
  259. data/spec/runners/command_monitoring.rb +3 -34
  260. data/spec/runners/connection_string.rb +35 -124
  261. data/spec/runners/crud/context.rb +9 -5
  262. data/spec/runners/crud/operation.rb +59 -27
  263. data/spec/runners/crud/spec.rb +0 -8
  264. data/spec/runners/crud/test.rb +1 -1
  265. data/spec/runners/crud/test_base.rb +0 -19
  266. data/spec/runners/sdam.rb +2 -2
  267. data/spec/runners/server_selection.rb +242 -28
  268. data/spec/runners/transactions.rb +12 -12
  269. data/spec/runners/transactions/operation.rb +151 -25
  270. data/spec/runners/transactions/test.rb +62 -18
  271. data/spec/shared/LICENSE +20 -0
  272. data/spec/shared/lib/mrss/child_process_helper.rb +80 -0
  273. data/spec/shared/lib/mrss/constraints.rb +303 -0
  274. data/spec/shared/lib/mrss/lite_constraints.rb +175 -0
  275. data/spec/shared/lib/mrss/spec_organizer.rb +149 -0
  276. data/spec/spec_helper.rb +3 -1
  277. data/spec/spec_tests/cmap_spec.rb +7 -3
  278. data/spec/spec_tests/command_monitoring_spec.rb +22 -12
  279. data/spec/spec_tests/crud_spec.rb +1 -1
  280. data/spec/spec_tests/data/change_streams/change-streams-errors.yml +4 -9
  281. data/spec/spec_tests/data/change_streams/change-streams-resume-whitelist.yml +66 -0
  282. data/spec/spec_tests/data/change_streams/change-streams.yml +0 -1
  283. data/spec/spec_tests/data/cmap/pool-checkout-connection.yml +6 -2
  284. data/spec/spec_tests/data/cmap/pool-create-min-size.yml +3 -0
  285. data/spec/spec_tests/data/connection_string/valid-warnings.yml +24 -0
  286. data/spec/spec_tests/data/max_staleness/ReplicaSetNoPrimary/MaxStalenessTooSmall.yml +15 -0
  287. data/spec/spec_tests/data/max_staleness/ReplicaSetNoPrimary/NoKnownServers.yml +4 -3
  288. data/spec/spec_tests/data/max_staleness/Unknown/SmallMaxStaleness.yml +1 -0
  289. data/spec/spec_tests/data/sdam_integration/cancel-server-check.yml +96 -0
  290. data/spec/spec_tests/data/sdam_integration/connectTimeoutMS.yml +88 -0
  291. data/spec/spec_tests/data/sdam_integration/find-network-error.yml +83 -0
  292. data/spec/spec_tests/data/sdam_integration/find-shutdown-error.yml +116 -0
  293. data/spec/spec_tests/data/sdam_integration/insert-network-error.yml +86 -0
  294. data/spec/spec_tests/data/sdam_integration/insert-shutdown-error.yml +115 -0
  295. data/spec/spec_tests/data/sdam_integration/isMaster-command-error.yml +168 -0
  296. data/spec/spec_tests/data/sdam_integration/isMaster-network-error.yml +162 -0
  297. data/spec/spec_tests/data/sdam_integration/isMaster-timeout.yml +229 -0
  298. data/spec/spec_tests/data/sdam_integration/rediscover-quickly-after-step-down.yml +87 -0
  299. data/spec/spec_tests/data/sdam_monitoring/discovered_standalone.yml +1 -3
  300. data/spec/spec_tests/data/sdam_monitoring/standalone.yml +2 -2
  301. data/spec/spec_tests/data/sdam_monitoring/standalone_repeated.yml +2 -2
  302. data/spec/spec_tests/data/sdam_monitoring/standalone_suppress_equal_description_changes.yml +2 -2
  303. data/spec/spec_tests/data/sdam_monitoring/standalone_to_rs_with_me_mismatch.yml +2 -2
  304. data/spec/spec_tests/data/uri_options/auth-options.yml +25 -0
  305. data/spec/spec_tests/data/uri_options/compression-options.yml +6 -3
  306. data/spec/spec_tests/data/uri_options/read-preference-options.yml +24 -0
  307. data/spec/spec_tests/data/uri_options/ruby-connection-options.yml +1 -0
  308. data/spec/spec_tests/data/uri_options/tls-options.yml +160 -4
  309. data/spec/spec_tests/dns_seedlist_discovery_spec.rb +9 -1
  310. data/spec/spec_tests/max_staleness_spec.rb +4 -142
  311. data/spec/spec_tests/retryable_reads_spec.rb +2 -2
  312. data/spec/spec_tests/sdam_integration_spec.rb +13 -0
  313. data/spec/spec_tests/sdam_monitoring_spec.rb +1 -2
  314. data/spec/spec_tests/server_selection_spec.rb +4 -116
  315. data/spec/spec_tests/uri_options_spec.rb +31 -33
  316. data/spec/stress/cleanup_spec.rb +17 -2
  317. data/spec/stress/connection_pool_stress_spec.rb +10 -8
  318. data/spec/stress/fork_reconnect_stress_spec.rb +1 -1
  319. data/spec/support/certificates/atlas-ocsp-ca.crt +28 -0
  320. data/spec/support/certificates/atlas-ocsp.crt +41 -0
  321. data/spec/support/client_registry.rb +1 -0
  322. data/spec/support/client_registry_macros.rb +11 -2
  323. data/spec/support/cluster_config.rb +4 -0
  324. data/spec/support/common_shortcuts.rb +45 -0
  325. data/spec/support/constraints.rb +6 -253
  326. data/spec/support/event_subscriber.rb +123 -33
  327. data/spec/support/keyword_struct.rb +26 -0
  328. data/spec/support/matchers.rb +16 -0
  329. data/spec/support/ocsp +1 -0
  330. data/spec/support/session_registry.rb +52 -0
  331. data/spec/support/shared/server_selector.rb +13 -1
  332. data/spec/support/spec_config.rb +60 -13
  333. data/spec/support/spec_setup.rb +1 -1
  334. data/spec/support/utils.rb +84 -1
  335. metadata +1027 -937
  336. metadata.gz.sig +0 -0
  337. data/lib/mongo/server_selector/selectable.rb +0 -560
  338. data/spec/runners/sdam_monitoring.rb +0 -89
  339. data/spec/support/lite_constraints.rb +0 -141
@@ -3,6 +3,21 @@
3
3
  # @since 2.5.0
4
4
  class EventSubscriber
5
5
 
6
+ # The mappings of event names to types.
7
+ #
8
+ # @since 2.4.0
9
+ MAPPINGS = {
10
+ 'topology_opening_event' => Mongo::Monitoring::Event::TopologyOpening,
11
+ 'topology_description_changed_event' => Mongo::Monitoring::Event::TopologyChanged,
12
+ 'topology_closed_event' => Mongo::Monitoring::Event::TopologyClosed,
13
+ 'server_opening_event' => Mongo::Monitoring::Event::ServerOpening,
14
+ 'server_description_changed_event' => Mongo::Monitoring::Event::ServerDescriptionChanged,
15
+ 'server_closed_event' => Mongo::Monitoring::Event::ServerClosed
16
+ }.freeze
17
+
18
+ # All events.
19
+ attr_reader :all_events
20
+
6
21
  # The started events.
7
22
  #
8
23
  # @since 2.5.0
@@ -20,25 +35,40 @@ class EventSubscriber
20
35
 
21
36
  attr_reader :published_events
22
37
 
23
- # Cache the succeeded event.
24
- #
25
- # @param [ Event ] event The event.
26
- #
27
- # @since 2.5.0
28
- def succeeded(event)
29
- @mutex.synchronize do
30
- succeeded_events.push(event)
38
+ # @param [ String ] name Optional name for the event subscriber.
39
+ def initialize(name: nil)
40
+ @mutex = Mutex.new
41
+ clear_events!
42
+ @name = name
43
+ end
44
+
45
+ def to_s
46
+ %Q`#<EventSubscriber:#{@name ? "\"#{@name}\"" : '%x' % object_id} \
47
+ started=#{started_events.length} \
48
+ succeeded=#{succeeded_events.length} \
49
+ failed=#{failed_events.length} \
50
+ published=#{published_events.length}>`
51
+ end
52
+
53
+ alias :inspect :to_s
54
+
55
+ # Event retrieval
56
+
57
+ def select_started_events(cls)
58
+ started_events.select do |event|
59
+ event.is_a?(cls)
31
60
  end
32
61
  end
33
62
 
34
- # Cache the started event.
35
- #
36
- # @param [ Event ] event The event.
37
- #
38
- # @since 2.5.0
39
- def started(event)
40
- @mutex.synchronize do
41
- started_events.push(event)
63
+ def select_succeeded_events(cls)
64
+ succeeded_events.select do |event|
65
+ event.is_a?(cls)
66
+ end
67
+ end
68
+
69
+ def select_published_events(cls)
70
+ published_events.select do |event|
71
+ event.is_a?(cls)
42
72
  end
43
73
  end
44
74
 
@@ -59,8 +89,13 @@ class EventSubscriber
59
89
 
60
90
  # Locates command stated events for the specified command name,
61
91
  # asserts that there is exactly one such event, and returns it.
62
- def single_command_started_event(command_name)
63
- events = started_events.select do |event|
92
+ def single_command_started_event(command_name, include_auth: false)
93
+ events = if include_auth
94
+ started_events
95
+ else
96
+ non_auth_command_started_events
97
+ end
98
+ events.select! do |event|
64
99
  event.command[command_name]
65
100
  end
66
101
  if events.length != 1
@@ -69,38 +104,65 @@ class EventSubscriber
69
104
  events.first
70
105
  end
71
106
 
72
- def select_started_events(cls)
73
- @started_events.select do |event|
74
- event.is_a?(cls)
107
+ # Get the first succeeded event published for the name, and then delete it.
108
+ #
109
+ # @param [ String ] name The event name.
110
+ #
111
+ # @return [ Event ] The matching event.
112
+ def first_event(name)
113
+ cls = MAPPINGS[name]
114
+ if cls.nil?
115
+ raise ArgumentError, "Bogus event name #{name}"
75
116
  end
117
+ matching = succeeded_events.find do |event|
118
+ cls === event
119
+ end
120
+ succeeded_events.delete(matching)
121
+ matching
76
122
  end
77
123
 
78
- def select_succeeded_events(cls)
79
- @succeeded_events.select do |event|
80
- event.is_a?(cls)
124
+ # Event recording
125
+
126
+ # Cache the started event.
127
+ #
128
+ # @param [ Event ] event The event.
129
+ #
130
+ # @since 2.5.0
131
+ def started(event)
132
+ @mutex.synchronize do
133
+ started_events << event
134
+ all_events << event
81
135
  end
82
136
  end
83
137
 
84
- # Cache the failed event.
138
+ # Cache the succeeded event.
85
139
  #
86
140
  # @param [ Event ] event The event.
87
141
  #
88
142
  # @since 2.5.0
89
- def failed(event)
143
+ def succeeded(event)
90
144
  @mutex.synchronize do
91
- failed_events.push(event)
145
+ succeeded_events << event
146
+ all_events << event
92
147
  end
93
148
  end
94
149
 
95
- def select_published_events(cls)
96
- @published_events.select do |event|
97
- event.is_a?(cls)
150
+ # Cache the failed event.
151
+ #
152
+ # @param [ Event ] event The event.
153
+ #
154
+ # @since 2.5.0
155
+ def failed(event)
156
+ @mutex.synchronize do
157
+ failed_events << event
158
+ all_events << event
98
159
  end
99
160
  end
100
161
 
101
162
  def published(event)
102
163
  @mutex.synchronize do
103
- @published_events << event
164
+ published_events << event
165
+ all_events << event
104
166
  end
105
167
  end
106
168
 
@@ -108,15 +170,43 @@ class EventSubscriber
108
170
  #
109
171
  # @since 2.5.1
110
172
  def clear_events!
173
+ @all_events = []
111
174
  @started_events = []
112
175
  @succeeded_events = []
113
176
  @failed_events = []
114
177
  @published_events = []
115
178
  self
116
179
  end
180
+ end
117
181
 
182
+ # Only handles succeeded events correctly.
183
+ class PhasedEventSubscriber < EventSubscriber
118
184
  def initialize
119
- @mutex = Mutex.new
120
- clear_events!
185
+ super
186
+ @phase_events = {}
187
+ end
188
+
189
+ def phase_finished(phase_index)
190
+ @phase_events[phase_index] = succeeded_events
191
+ @succeeded_events = []
192
+ end
193
+
194
+ def phase_events(phase_index)
195
+ @phase_events[phase_index]
196
+ end
197
+
198
+ def event_count
199
+ @phase_events.inject(0) do |sum, event|
200
+ sum + event.length
201
+ end
202
+ end
203
+ end
204
+
205
+ class VerboseEventSubscriber < EventSubscriber
206
+ %w(started succeeded failed published).each do |meth|
207
+ define_method(meth) do |event|
208
+ puts event.summary
209
+ super(event)
210
+ end
121
211
  end
122
212
  end
@@ -0,0 +1,26 @@
1
+ # Intermediate step between a Struct and an OpenStruct. Allows only designated
2
+ # field names to be read or written but allows passing fields to constructor
3
+ # as keyword arguments.
4
+ class KeywordStruct
5
+ def self.new(*field_names, &block)
6
+ Class.new.tap do |cls|
7
+ cls.class_exec do
8
+ define_method(:initialize) do |**fields|
9
+ fields.each do |field, value|
10
+ unless field_names.include?(field)
11
+ raise ArgumentError, "Unknown field #{field}"
12
+ end
13
+
14
+ instance_variable_set("@#{field}", value)
15
+ end
16
+ end
17
+
18
+ attr_accessor *field_names
19
+ end
20
+
21
+ if block_given?
22
+ cls.class_exec(&block)
23
+ end
24
+ end
25
+ end
26
+ end
@@ -54,3 +54,19 @@ RSpec::Matchers.define :be_uuid do
54
54
  object.is_a?(BSON::Binary) && object.type == :uuid
55
55
  end
56
56
  end
57
+
58
+ RSpec::Matchers.define :take_longer_than do |min_expected_time|
59
+ match do |proc|
60
+ start_time = Time.now
61
+ proc.call
62
+ (Time.now - start_time).should > min_expected_time
63
+ end
64
+ end
65
+
66
+ RSpec::Matchers.define :take_shorter_than do |min_expected_time|
67
+ match do |proc|
68
+ start_time = Time.now
69
+ proc.call
70
+ (Time.now - start_time).should < min_expected_time
71
+ end
72
+ end
@@ -0,0 +1 @@
1
+ spec/support/../../.mod/drivers-evergreen-tools/.evergreen/ocsp
@@ -0,0 +1,52 @@
1
+ require 'singleton'
2
+
3
+ module Mongo
4
+ class Client
5
+ alias :get_session_without_tracking :get_session
6
+
7
+ def get_session(options = {})
8
+ get_session_without_tracking(options).tap do |session|
9
+ SessionRegistry.instance.register(session)
10
+ end
11
+ end
12
+ end
13
+
14
+ class Session
15
+ alias :end_session_without_tracking :end_session
16
+
17
+ def end_session
18
+ SessionRegistry.instance.unregister(self)
19
+ end_session_without_tracking
20
+ end
21
+ end
22
+ end
23
+
24
+
25
+ class SessionRegistry
26
+ include Singleton
27
+
28
+ def initialize
29
+ @registry = {}
30
+ end
31
+
32
+ def register(session)
33
+ @registry[session.session_id] = session if session
34
+ end
35
+
36
+ def unregister(session)
37
+ @registry.delete(session.session_id) unless session.ended?
38
+ end
39
+
40
+ def verify_sessions_ended!
41
+ @registry.delete_if { |_, session| session.ended? }
42
+
43
+ unless @registry.empty?
44
+ sessions = @registry.map { |_, session| session }
45
+ raise "Session registry contains live sessions: #{sessions.join(', ')}"
46
+ end
47
+ end
48
+
49
+ def clear_registry
50
+ @registry = {}
51
+ end
52
+ end
@@ -22,7 +22,19 @@ shared_context 'server selector' do
22
22
  expect(server.unknown?).to be true
23
23
  end
24
24
  end
25
- let(:options) { { :mode => name, :tag_sets => tag_sets, max_staleness: max_staleness, hedge: hedge } }
25
+ let(:server_selection_timeout_options) do
26
+ {
27
+ server_selection_timeout: 0.1,
28
+ }
29
+ end
30
+ let(:options) do
31
+ {
32
+ mode: name,
33
+ tag_sets: tag_sets,
34
+ max_staleness: max_staleness,
35
+ hedge: hedge,
36
+ }
37
+ end
26
38
  let(:selector) { described_class.new(options) }
27
39
  let(:monitoring) do
28
40
  Mongo::Monitoring.new(monitoring: false)
@@ -74,7 +74,7 @@ class SpecConfig
74
74
  # TLS options need to be merged for evergreen due to
75
75
  # https://github.com/10gen/mongo-orchestration/issues/268
76
76
  client = Mongo::Client.new(addresses, Mongo::Options::Redacted.new(
77
- server_selection_timeout: 5,
77
+ server_selection_timeout: 5.03,
78
78
  ).merge(ssl_options))
79
79
 
80
80
  begin
@@ -99,7 +99,7 @@ class SpecConfig
99
99
  # Environment
100
100
 
101
101
  def ci?
102
- !!ENV['CI']
102
+ %w(1 true yes).include?(ENV['CI']&.downcase)
103
103
  end
104
104
 
105
105
  def mri?
@@ -122,6 +122,24 @@ class SpecConfig
122
122
  %w(1 true yes).include?(ENV['FORK']&.downcase)
123
123
  end
124
124
 
125
+ # OCSP tests require python and various dependencies.
126
+ # Assumes an OCSP responder is running on port 8100 (configured externally
127
+ # to the test suite).
128
+ def ocsp?
129
+ %w(1 true yes).include?(ENV['OCSP']&.downcase)
130
+ end
131
+
132
+ # OCSP tests require python and various dependencies.
133
+ # When testing OCSP verifier, there cannot be a responder running on
134
+ # port 8100 or the tests will fail.
135
+ def ocsp_verifier?
136
+ %w(1 true yes).include?(ENV['OCSP_VERIFIER']&.downcase)
137
+ end
138
+
139
+ def ocsp_connectivity?
140
+ ENV.key?('OCSP_CONNECTIVITY') && ENV['OCSP_CONNECTIVITY'] != ''
141
+ end
142
+
125
143
  # Test suite configuration
126
144
 
127
145
  def client_debug?
@@ -221,6 +239,10 @@ EOT
221
239
  Pathname.new("#{spec_root}/support/certificates")
222
240
  end
223
241
 
242
+ def ocsp_files_dir
243
+ Pathname.new("#{spec_root}/../.mod/drivers-evergreen-tools/.evergreen/ocsp")
244
+ end
245
+
224
246
  # TLS certificates & keys
225
247
 
226
248
  def local_client_key_path
@@ -414,15 +436,19 @@ EOT
414
436
  # means the test suite hangs for about 4 seconds before
415
437
  # failing.
416
438
  # Server selection timeout of 1 is insufficient for evergreen.
417
- server_selection_timeout: uri_options[:server_selection_timeout] || (ssl? ? 4.01 : 2.01),
439
+ server_selection_timeout: uri_options[:server_selection_timeout] || (ssl? ? 8.01 : 7.01),
418
440
 
419
441
  # Since connections are established under the wait queue timeout,
420
442
  # the wait queue timeout should be at least as long as the
421
443
  # connect timeout.
422
- wait_queue_timeout: 4,
423
- connect_timeout: 3,
424
- socket_timeout: 3,
425
- max_idle_time: 5
444
+ wait_queue_timeout: 6.04,
445
+ connect_timeout: 2.91,
446
+ socket_timeout: 5.09,
447
+ max_idle_time: 100.02,
448
+
449
+ # Uncomment to have exceptions in background threads log complete
450
+ # backtraces.
451
+ #bg_error_backtrace: true,
426
452
  }
427
453
  end
428
454
 
@@ -437,6 +463,14 @@ EOT
437
463
  test_options.merge(auth_options)
438
464
  end
439
465
 
466
+ def authorized_test_options
467
+ test_options.merge(credentials_or_external_user(
468
+ user: test_user.name,
469
+ password: test_user.password,
470
+ auth_source: auth_options[:auth_source],
471
+ ))
472
+ end
473
+
440
474
  # User objects
441
475
 
442
476
  # Gets the root system administrator user.
@@ -457,8 +491,8 @@ EOT
457
491
  # Get the default test user for the suite on versions 2.6 and higher.
458
492
  def test_user
459
493
  Mongo::Auth::User.new(
460
- database: test_db,
461
- user: 'test-user',
494
+ database: 'admin',
495
+ user: 'ruby-test-user',
462
496
  password: 'password',
463
497
  roles: [
464
498
  { role: Mongo::Auth::Roles::READ_WRITE, db: test_db },
@@ -472,10 +506,23 @@ EOT
472
506
  { role: Mongo::Auth::Roles::READ_WRITE, db: 'reporting' },
473
507
  { role: Mongo::Auth::Roles::DATABASE_ADMIN, db: 'reporting' },
474
508
 
475
- # For transaction api spec tests
476
- #{ role: Mongo::Auth::Roles::READ_WRITE, db: 'withTransaction-tests' },
477
- #{ role: Mongo::Auth::Roles::DATABASE_ADMIN, db: 'withTransaction-tests' },
478
-
509
+ # For spec tests
510
+ { role: Mongo::Auth::Roles::READ_WRITE, db: 'crud-tests' },
511
+ { role: Mongo::Auth::Roles::DATABASE_ADMIN, db: 'crud-tests' },
512
+ { role: Mongo::Auth::Roles::READ_WRITE, db: 'crud-default' },
513
+ { role: Mongo::Auth::Roles::DATABASE_ADMIN, db: 'crud-default' },
514
+ { role: Mongo::Auth::Roles::READ_WRITE, db: 'default_write_concern_db' },
515
+ { role: Mongo::Auth::Roles::DATABASE_ADMIN, db: 'default_write_concern_db' },
516
+ { role: Mongo::Auth::Roles::READ_WRITE, db: 'retryable-reads-tests' },
517
+ { role: Mongo::Auth::Roles::DATABASE_ADMIN, db: 'retryable-reads-tests' },
518
+ { role: Mongo::Auth::Roles::READ_WRITE, db: 'sdam-tests' },
519
+ { role: Mongo::Auth::Roles::DATABASE_ADMIN, db: 'sdam-tests' },
520
+ { role: Mongo::Auth::Roles::READ_WRITE, db: 'transaction-tests' },
521
+ { role: Mongo::Auth::Roles::DATABASE_ADMIN, db: 'transaction-tests' },
522
+ { role: Mongo::Auth::Roles::READ_WRITE, db: 'withTransaction-tests' },
523
+ { role: Mongo::Auth::Roles::DATABASE_ADMIN, db: 'withTransaction-tests' },
524
+ { role: Mongo::Auth::Roles::READ_WRITE, db: 'admin' },
525
+ { role: Mongo::Auth::Roles::DATABASE_ADMIN, db: 'admin' },
479
526
  ]
480
527
  )
481
528
  end