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.
- checksums.yaml +4 -4
- checksums.yaml.gz.sig +0 -0
- data.tar.gz.sig +1 -5
- data/Rakefile +50 -9
- data/lib/mongo.rb +13 -2
- data/lib/mongo/address.rb +1 -1
- data/lib/mongo/address/ipv4.rb +1 -1
- data/lib/mongo/address/ipv6.rb +1 -1
- data/lib/mongo/auth/aws/request.rb +31 -5
- data/lib/mongo/bulk_write.rb +18 -0
- data/lib/mongo/caching_cursor.rb +74 -0
- data/lib/mongo/client.rb +238 -31
- data/lib/mongo/cluster.rb +56 -20
- data/lib/mongo/cluster/sdam_flow.rb +13 -10
- data/lib/mongo/cluster/topology/replica_set_no_primary.rb +3 -2
- data/lib/mongo/cluster/topology/sharded.rb +1 -1
- data/lib/mongo/cluster/topology/single.rb +2 -2
- data/lib/mongo/collection.rb +66 -24
- data/lib/mongo/collection/view.rb +24 -20
- data/lib/mongo/collection/view/aggregation.rb +25 -4
- data/lib/mongo/collection/view/builder/find_command.rb +38 -18
- data/lib/mongo/collection/view/explainable.rb +27 -8
- data/lib/mongo/collection/view/iterable.rb +72 -12
- data/lib/mongo/collection/view/readable.rb +19 -3
- data/lib/mongo/collection/view/writable.rb +55 -5
- data/lib/mongo/crypt/encryption_io.rb +6 -6
- data/lib/mongo/cursor.rb +16 -3
- data/lib/mongo/database.rb +37 -4
- data/lib/mongo/database/view.rb +18 -3
- data/lib/mongo/distinguishing_semaphore.rb +55 -0
- data/lib/mongo/error.rb +5 -0
- data/lib/mongo/error/invalid_read_concern.rb +28 -0
- data/lib/mongo/error/invalid_server_auth_host.rb +22 -0
- data/lib/mongo/error/invalid_session.rb +2 -1
- data/lib/mongo/error/operation_failure.rb +11 -5
- data/lib/mongo/error/server_certificate_revoked.rb +22 -0
- data/lib/mongo/error/sessions_not_supported.rb +35 -0
- data/lib/mongo/error/unsupported_option.rb +14 -12
- data/lib/mongo/event/base.rb +6 -0
- data/lib/mongo/grid/file.rb +5 -0
- data/lib/mongo/grid/file/chunk.rb +2 -0
- data/lib/mongo/grid/fs_bucket.rb +15 -13
- data/lib/mongo/grid/stream/write.rb +9 -3
- data/lib/mongo/index/view.rb +3 -0
- data/lib/mongo/lint.rb +2 -1
- data/lib/mongo/logger.rb +3 -3
- data/lib/mongo/monitoring.rb +38 -0
- data/lib/mongo/monitoring/command_log_subscriber.rb +10 -2
- data/lib/mongo/monitoring/event/command_failed.rb +11 -0
- data/lib/mongo/monitoring/event/command_started.rb +37 -2
- data/lib/mongo/monitoring/event/command_succeeded.rb +11 -0
- data/lib/mongo/monitoring/event/server_closed.rb +1 -1
- data/lib/mongo/monitoring/event/server_description_changed.rb +27 -4
- data/lib/mongo/monitoring/event/server_heartbeat_failed.rb +9 -2
- data/lib/mongo/monitoring/event/server_heartbeat_started.rb +9 -2
- data/lib/mongo/monitoring/event/server_heartbeat_succeeded.rb +9 -2
- data/lib/mongo/monitoring/event/server_opening.rb +1 -1
- data/lib/mongo/monitoring/event/topology_changed.rb +1 -1
- data/lib/mongo/monitoring/event/topology_closed.rb +1 -1
- data/lib/mongo/monitoring/event/topology_opening.rb +1 -1
- data/lib/mongo/monitoring/publishable.rb +6 -3
- data/lib/mongo/monitoring/server_description_changed_log_subscriber.rb +9 -1
- data/lib/mongo/monitoring/topology_changed_log_subscriber.rb +1 -1
- data/lib/mongo/operation.rb +2 -0
- data/lib/mongo/operation/aggregate/result.rb +9 -8
- data/lib/mongo/operation/collections_info/command.rb +5 -0
- data/lib/mongo/operation/collections_info/result.rb +18 -1
- data/lib/mongo/operation/delete/bulk_result.rb +2 -0
- data/lib/mongo/operation/delete/result.rb +3 -0
- data/lib/mongo/operation/explain/command.rb +4 -0
- data/lib/mongo/operation/explain/legacy.rb +4 -0
- data/lib/mongo/operation/explain/op_msg.rb +6 -0
- data/lib/mongo/operation/explain/result.rb +3 -0
- data/lib/mongo/operation/find/legacy/result.rb +2 -0
- data/lib/mongo/operation/find/result.rb +13 -0
- data/lib/mongo/operation/get_more/result.rb +3 -0
- data/lib/mongo/operation/indexes/result.rb +5 -0
- data/lib/mongo/operation/insert/bulk_result.rb +5 -0
- data/lib/mongo/operation/insert/result.rb +5 -0
- data/lib/mongo/operation/list_collections/result.rb +5 -0
- data/lib/mongo/operation/map_reduce/result.rb +10 -0
- data/lib/mongo/operation/parallel_scan/result.rb +4 -0
- data/lib/mongo/operation/result.rb +35 -6
- data/lib/mongo/operation/shared/bypass_document_validation.rb +1 -0
- data/lib/mongo/operation/shared/causal_consistency_supported.rb +1 -0
- data/lib/mongo/operation/shared/collections_info_or_list_collections.rb +2 -0
- data/lib/mongo/operation/shared/executable.rb +1 -0
- data/lib/mongo/operation/shared/idable.rb +2 -1
- data/lib/mongo/operation/shared/limited.rb +1 -0
- data/lib/mongo/operation/shared/object_id_generator.rb +1 -0
- data/lib/mongo/operation/shared/result/aggregatable.rb +1 -0
- data/lib/mongo/operation/shared/sessions_supported.rb +1 -0
- data/lib/mongo/operation/shared/specifiable.rb +1 -0
- data/lib/mongo/operation/shared/write.rb +1 -0
- data/lib/mongo/operation/shared/write_concern_supported.rb +1 -0
- data/lib/mongo/operation/update/legacy/result.rb +7 -0
- data/lib/mongo/operation/update/result.rb +8 -0
- data/lib/mongo/operation/users_info/result.rb +3 -0
- data/lib/mongo/protocol/message.rb +47 -10
- data/lib/mongo/protocol/msg.rb +34 -1
- data/lib/mongo/protocol/query.rb +36 -0
- data/lib/mongo/protocol/serializers.rb +5 -2
- data/lib/mongo/query_cache.rb +242 -0
- data/lib/mongo/retryable.rb +8 -1
- data/lib/mongo/server.rb +15 -4
- data/lib/mongo/server/app_metadata.rb +27 -3
- data/lib/mongo/server/connection.rb +4 -4
- data/lib/mongo/server/connection_base.rb +38 -12
- data/lib/mongo/server/connection_common.rb +2 -2
- data/lib/mongo/server/connection_pool.rb +3 -0
- data/lib/mongo/server/description.rb +13 -1
- data/lib/mongo/server/monitor.rb +76 -44
- data/lib/mongo/server/monitor/connection.rb +57 -9
- data/lib/mongo/server/pending_connection.rb +14 -4
- data/lib/mongo/server/push_monitor.rb +173 -0
- data/{spec/runners/transactions/context.rb → lib/mongo/server/push_monitor/connection.rb} +9 -14
- data/lib/mongo/server_selector.rb +0 -1
- data/lib/mongo/server_selector/base.rb +583 -1
- data/lib/mongo/server_selector/nearest.rb +1 -6
- data/lib/mongo/server_selector/primary.rb +1 -6
- data/lib/mongo/server_selector/primary_preferred.rb +7 -10
- data/lib/mongo/server_selector/secondary.rb +1 -6
- data/lib/mongo/server_selector/secondary_preferred.rb +1 -7
- data/lib/mongo/session.rb +7 -1
- data/lib/mongo/socket.rb +26 -12
- data/lib/mongo/socket/ocsp_cache.rb +97 -0
- data/lib/mongo/socket/ocsp_verifier.rb +368 -0
- data/lib/mongo/socket/ssl.rb +46 -25
- data/lib/mongo/socket/tcp.rb +1 -1
- data/lib/mongo/srv/monitor.rb +7 -13
- data/lib/mongo/srv/resolver.rb +14 -10
- data/lib/mongo/timeout.rb +2 -0
- data/lib/mongo/topology_version.rb +9 -0
- data/lib/mongo/uri.rb +21 -390
- data/lib/mongo/uri/options_mapper.rb +582 -0
- data/lib/mongo/uri/srv_protocol.rb +3 -2
- data/lib/mongo/utils.rb +73 -0
- data/lib/mongo/version.rb +1 -1
- data/spec/NOTES.aws-auth.md +12 -7
- data/spec/README.aws-auth.md +2 -2
- data/spec/README.md +63 -1
- data/spec/integration/awaited_ismaster_spec.rb +28 -0
- data/spec/integration/bson_symbol_spec.rb +4 -2
- data/spec/integration/bulk_write_spec.rb +67 -0
- data/spec/integration/change_stream_examples_spec.rb +6 -2
- data/spec/integration/change_stream_spec.rb +1 -1
- data/spec/integration/check_clean_slate_spec.rb +16 -0
- data/spec/integration/client_authentication_options_spec.rb +92 -28
- data/spec/integration/client_construction_spec.rb +1 -0
- data/spec/integration/client_side_encryption/auto_encryption_bulk_writes_spec.rb +9 -5
- data/spec/integration/connect_single_rs_name_spec.rb +5 -2
- data/spec/integration/connection_pool_populator_spec.rb +4 -2
- data/spec/integration/connection_spec.rb +7 -4
- data/spec/integration/crud_spec.rb +4 -4
- data/spec/integration/cursor_reaping_spec.rb +54 -18
- data/spec/integration/docs_examples_spec.rb +6 -0
- data/spec/integration/fork_reconnect_spec.rb +56 -1
- data/spec/integration/grid_fs_bucket_spec.rb +48 -0
- data/spec/integration/heartbeat_events_spec.rb +4 -23
- data/spec/integration/ocsp_connectivity_spec.rb +26 -0
- data/spec/integration/ocsp_verifier_cache_spec.rb +188 -0
- data/spec/integration/ocsp_verifier_spec.rb +334 -0
- data/spec/integration/query_cache_spec.rb +1045 -0
- data/spec/integration/query_cache_transactions_spec.rb +190 -0
- data/spec/integration/read_concern_spec.rb +1 -1
- data/spec/integration/retryable_errors_spec.rb +1 -1
- data/spec/integration/retryable_writes/retryable_writes_40_and_newer_spec.rb +1 -0
- data/spec/integration/retryable_writes/shared/performs_legacy_retries.rb +4 -2
- data/spec/integration/retryable_writes/shared/performs_modern_retries.rb +3 -3
- data/spec/integration/retryable_writes/shared/performs_no_retries.rb +2 -2
- data/spec/integration/sdam_error_handling_spec.rb +122 -15
- data/spec/integration/sdam_events_spec.rb +80 -6
- data/spec/integration/sdam_prose_spec.rb +64 -0
- data/spec/integration/server_monitor_spec.rb +25 -1
- data/spec/integration/server_selection_spec.rb +36 -0
- data/spec/integration/size_limit_spec.rb +23 -5
- data/spec/integration/srv_monitoring_spec.rb +38 -3
- data/spec/integration/srv_spec.rb +56 -0
- data/spec/integration/ssl_uri_options_spec.rb +2 -2
- data/spec/integration/transactions_examples_spec.rb +17 -7
- data/spec/integration/zlib_compression_spec.rb +25 -0
- data/spec/lite_spec_helper.rb +20 -9
- data/spec/mongo/address_spec.rb +1 -1
- data/spec/mongo/auth/aws/request_region_spec.rb +42 -0
- data/spec/mongo/auth/aws/request_spec.rb +76 -0
- data/spec/mongo/auth/scram_spec.rb +1 -1
- data/spec/mongo/auth/user_spec.rb +1 -1
- data/spec/mongo/bulk_write_spec.rb +2 -2
- data/spec/mongo/caching_cursor_spec.rb +70 -0
- data/spec/mongo/client_construction_spec.rb +386 -3
- data/spec/mongo/client_encryption_spec.rb +16 -10
- data/spec/mongo/client_spec.rb +85 -3
- data/spec/mongo/cluster/topology/replica_set_spec.rb +53 -10
- data/spec/mongo/cluster/topology/sharded_spec.rb +1 -1
- data/spec/mongo/cluster/topology/single_spec.rb +19 -8
- data/spec/mongo/cluster/topology/unknown_spec.rb +1 -1
- data/spec/mongo/cluster/topology_spec.rb +1 -1
- data/spec/mongo/cluster_spec.rb +37 -35
- data/spec/mongo/collection/view/change_stream_resume_spec.rb +7 -7
- data/spec/mongo/collection/view/explainable_spec.rb +87 -4
- data/spec/mongo/collection/view/map_reduce_spec.rb +2 -0
- data/spec/mongo/collection/view/readable_spec.rb +36 -0
- data/spec/mongo/collection_spec.rb +572 -0
- data/spec/mongo/crypt/auto_decryption_context_spec.rb +1 -1
- data/spec/mongo/crypt/auto_encryption_context_spec.rb +1 -1
- data/spec/mongo/crypt/binary_spec.rb +1 -6
- data/spec/mongo/crypt/binding/binary_spec.rb +1 -6
- data/spec/mongo/crypt/binding/context_spec.rb +2 -7
- data/spec/mongo/crypt/binding/helpers_spec.rb +1 -6
- data/spec/mongo/crypt/binding/mongocrypt_spec.rb +2 -7
- data/spec/mongo/crypt/binding/status_spec.rb +1 -6
- data/spec/mongo/crypt/binding/version_spec.rb +1 -6
- data/spec/mongo/crypt/data_key_context_spec.rb +1 -1
- data/spec/mongo/crypt/explicit_decryption_context_spec.rb +1 -1
- data/spec/mongo/crypt/explicit_encryption_context_spec.rb +1 -1
- data/spec/mongo/crypt/status_spec.rb +1 -6
- data/spec/mongo/database_spec.rb +353 -8
- data/spec/mongo/distinguishing_semaphore_spec.rb +63 -0
- data/spec/mongo/error/no_server_available_spec.rb +1 -1
- data/spec/mongo/error/operation_failure_spec.rb +40 -0
- data/spec/mongo/index/view_spec.rb +148 -2
- data/spec/mongo/logger_spec.rb +13 -11
- data/spec/mongo/monitoring/event/server_closed_spec.rb +1 -1
- data/spec/mongo/monitoring/event/server_description_changed_spec.rb +1 -4
- data/spec/mongo/monitoring/event/server_opening_spec.rb +1 -1
- data/spec/mongo/monitoring/event/topology_changed_spec.rb +1 -1
- data/spec/mongo/monitoring/event/topology_closed_spec.rb +1 -1
- data/spec/mongo/monitoring/event/topology_opening_spec.rb +1 -1
- data/spec/mongo/operation/delete/op_msg_spec.rb +3 -3
- data/spec/mongo/operation/insert/command_spec.rb +2 -2
- data/spec/mongo/operation/insert/op_msg_spec.rb +3 -3
- data/spec/mongo/operation/read_preference_op_msg_spec.rb +1 -1
- data/spec/mongo/operation/update/command_spec.rb +2 -2
- data/spec/mongo/operation/update/op_msg_spec.rb +3 -3
- data/spec/mongo/protocol/msg_spec.rb +10 -0
- data/spec/mongo/query_cache_spec.rb +280 -0
- data/spec/mongo/semaphore_spec.rb +51 -0
- data/spec/mongo/server/app_metadata_shared.rb +82 -2
- data/spec/mongo/server/connection_auth_spec.rb +2 -2
- data/spec/mongo/server/connection_pool_spec.rb +7 -3
- data/spec/mongo/server/connection_spec.rb +15 -8
- data/spec/mongo/server/description_spec.rb +18 -0
- data/spec/mongo/server_selector/nearest_spec.rb +23 -23
- data/spec/mongo/server_selector/primary_preferred_spec.rb +26 -26
- data/spec/mongo/server_selector/primary_spec.rb +9 -9
- data/spec/mongo/server_selector/secondary_preferred_spec.rb +22 -22
- data/spec/mongo/server_selector/secondary_spec.rb +18 -18
- data/spec/mongo/server_selector_spec.rb +6 -6
- data/spec/mongo/session_spec.rb +35 -0
- data/spec/mongo/socket/ssl_spec.rb +4 -4
- data/spec/mongo/socket_spec.rb +1 -1
- data/spec/mongo/uri/srv_protocol_spec.rb +64 -33
- data/spec/mongo/uri_option_parsing_spec.rb +11 -11
- data/spec/mongo/uri_spec.rb +68 -41
- data/spec/mongo/utils_spec.rb +39 -0
- data/spec/runners/auth.rb +3 -0
- data/spec/runners/change_streams/test.rb +3 -3
- data/spec/runners/cmap.rb +1 -1
- data/spec/runners/command_monitoring.rb +3 -34
- data/spec/runners/connection_string.rb +35 -124
- data/spec/runners/crud/context.rb +9 -5
- data/spec/runners/crud/operation.rb +59 -27
- data/spec/runners/crud/spec.rb +0 -8
- data/spec/runners/crud/test.rb +1 -1
- data/spec/runners/crud/test_base.rb +0 -19
- data/spec/runners/sdam.rb +2 -2
- data/spec/runners/server_selection.rb +242 -28
- data/spec/runners/transactions.rb +12 -12
- data/spec/runners/transactions/operation.rb +151 -25
- data/spec/runners/transactions/test.rb +62 -18
- data/spec/shared/LICENSE +20 -0
- data/spec/shared/lib/mrss/child_process_helper.rb +80 -0
- data/spec/shared/lib/mrss/constraints.rb +303 -0
- data/spec/shared/lib/mrss/lite_constraints.rb +175 -0
- data/spec/shared/lib/mrss/spec_organizer.rb +149 -0
- data/spec/spec_helper.rb +3 -1
- data/spec/spec_tests/cmap_spec.rb +7 -3
- data/spec/spec_tests/command_monitoring_spec.rb +22 -12
- data/spec/spec_tests/crud_spec.rb +1 -1
- data/spec/spec_tests/data/change_streams/change-streams-errors.yml +4 -9
- data/spec/spec_tests/data/change_streams/change-streams-resume-whitelist.yml +66 -0
- data/spec/spec_tests/data/change_streams/change-streams.yml +0 -1
- data/spec/spec_tests/data/cmap/pool-checkout-connection.yml +6 -2
- data/spec/spec_tests/data/cmap/pool-create-min-size.yml +3 -0
- data/spec/spec_tests/data/connection_string/valid-warnings.yml +24 -0
- data/spec/spec_tests/data/max_staleness/ReplicaSetNoPrimary/MaxStalenessTooSmall.yml +15 -0
- data/spec/spec_tests/data/max_staleness/ReplicaSetNoPrimary/NoKnownServers.yml +4 -3
- data/spec/spec_tests/data/max_staleness/Unknown/SmallMaxStaleness.yml +1 -0
- data/spec/spec_tests/data/sdam_integration/cancel-server-check.yml +96 -0
- data/spec/spec_tests/data/sdam_integration/connectTimeoutMS.yml +88 -0
- data/spec/spec_tests/data/sdam_integration/find-network-error.yml +83 -0
- data/spec/spec_tests/data/sdam_integration/find-shutdown-error.yml +116 -0
- data/spec/spec_tests/data/sdam_integration/insert-network-error.yml +86 -0
- data/spec/spec_tests/data/sdam_integration/insert-shutdown-error.yml +115 -0
- data/spec/spec_tests/data/sdam_integration/isMaster-command-error.yml +168 -0
- data/spec/spec_tests/data/sdam_integration/isMaster-network-error.yml +162 -0
- data/spec/spec_tests/data/sdam_integration/isMaster-timeout.yml +229 -0
- data/spec/spec_tests/data/sdam_integration/rediscover-quickly-after-step-down.yml +87 -0
- data/spec/spec_tests/data/sdam_monitoring/discovered_standalone.yml +1 -3
- data/spec/spec_tests/data/sdam_monitoring/standalone.yml +2 -2
- data/spec/spec_tests/data/sdam_monitoring/standalone_repeated.yml +2 -2
- data/spec/spec_tests/data/sdam_monitoring/standalone_suppress_equal_description_changes.yml +2 -2
- data/spec/spec_tests/data/sdam_monitoring/standalone_to_rs_with_me_mismatch.yml +2 -2
- data/spec/spec_tests/data/uri_options/auth-options.yml +25 -0
- data/spec/spec_tests/data/uri_options/compression-options.yml +6 -3
- data/spec/spec_tests/data/uri_options/read-preference-options.yml +24 -0
- data/spec/spec_tests/data/uri_options/ruby-connection-options.yml +1 -0
- data/spec/spec_tests/data/uri_options/tls-options.yml +160 -4
- data/spec/spec_tests/dns_seedlist_discovery_spec.rb +9 -1
- data/spec/spec_tests/max_staleness_spec.rb +4 -142
- data/spec/spec_tests/retryable_reads_spec.rb +2 -2
- data/spec/spec_tests/sdam_integration_spec.rb +13 -0
- data/spec/spec_tests/sdam_monitoring_spec.rb +1 -2
- data/spec/spec_tests/server_selection_spec.rb +4 -116
- data/spec/spec_tests/uri_options_spec.rb +31 -33
- data/spec/stress/cleanup_spec.rb +17 -2
- data/spec/stress/connection_pool_stress_spec.rb +10 -8
- data/spec/stress/fork_reconnect_stress_spec.rb +1 -1
- data/spec/support/certificates/atlas-ocsp-ca.crt +28 -0
- data/spec/support/certificates/atlas-ocsp.crt +41 -0
- data/spec/support/client_registry.rb +1 -0
- data/spec/support/client_registry_macros.rb +11 -2
- data/spec/support/cluster_config.rb +4 -0
- data/spec/support/common_shortcuts.rb +45 -0
- data/spec/support/constraints.rb +6 -253
- data/spec/support/event_subscriber.rb +123 -33
- data/spec/support/keyword_struct.rb +26 -0
- data/spec/support/matchers.rb +16 -0
- data/spec/support/ocsp +1 -0
- data/spec/support/session_registry.rb +52 -0
- data/spec/support/shared/server_selector.rb +13 -1
- data/spec/support/spec_config.rb +60 -13
- data/spec/support/spec_setup.rb +1 -1
- data/spec/support/utils.rb +84 -1
- metadata +1027 -937
- metadata.gz.sig +0 -0
- data/lib/mongo/server_selector/selectable.rb +0 -560
- data/spec/runners/sdam_monitoring.rb +0 -89
- 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
|
-
#
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
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
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
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 =
|
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
|
-
|
73
|
-
|
74
|
-
|
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
|
-
|
79
|
-
|
80
|
-
|
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
|
138
|
+
# Cache the succeeded event.
|
85
139
|
#
|
86
140
|
# @param [ Event ] event The event.
|
87
141
|
#
|
88
142
|
# @since 2.5.0
|
89
|
-
def
|
143
|
+
def succeeded(event)
|
90
144
|
@mutex.synchronize do
|
91
|
-
|
145
|
+
succeeded_events << event
|
146
|
+
all_events << event
|
92
147
|
end
|
93
148
|
end
|
94
149
|
|
95
|
-
|
96
|
-
|
97
|
-
|
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
|
-
|
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
|
-
|
120
|
-
|
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
|
data/spec/support/matchers.rb
CHANGED
@@ -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
|
data/spec/support/ocsp
ADDED
@@ -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(:
|
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)
|
data/spec/support/spec_config.rb
CHANGED
@@ -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
|
-
|
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? ?
|
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:
|
423
|
-
connect_timeout:
|
424
|
-
socket_timeout:
|
425
|
-
max_idle_time:
|
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:
|
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
|
476
|
-
|
477
|
-
|
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
|