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
@@ -0,0 +1,39 @@
|
|
1
|
+
require 'lite_spec_helper'
|
2
|
+
|
3
|
+
describe Mongo::Utils do
|
4
|
+
describe '#shallow_symbolize_keys' do
|
5
|
+
it 'symbolizes' do
|
6
|
+
described_class.shallow_symbolize_keys(
|
7
|
+
'foo' => 'bar',
|
8
|
+
'aKey' => 'aValue',
|
9
|
+
'a_key' => 'a_value',
|
10
|
+
key: :value,
|
11
|
+
).should == {
|
12
|
+
foo: 'bar',
|
13
|
+
aKey: 'aValue',
|
14
|
+
a_key: 'a_value',
|
15
|
+
key: :value,
|
16
|
+
}
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
describe '#shallow_camelize_keys' do
|
21
|
+
it 'camelizes' do
|
22
|
+
described_class.shallow_camelize_keys(
|
23
|
+
'foo' => 'bar',
|
24
|
+
'aKey' => 'aValue',
|
25
|
+
'aa_key' => 'a_value',
|
26
|
+
key: :value,
|
27
|
+
sKey: :sValue,
|
28
|
+
us_key: :us_value,
|
29
|
+
).should == {
|
30
|
+
'foo' => 'bar',
|
31
|
+
'aKey' => 'aValue',
|
32
|
+
'aaKey' => 'a_value',
|
33
|
+
'key' => :value,
|
34
|
+
'sKey' => :sValue,
|
35
|
+
'usKey' => :us_value,
|
36
|
+
}
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
data/spec/runners/auth.rb
CHANGED
@@ -67,10 +67,10 @@ module Mongo
|
|
67
67
|
end
|
68
68
|
|
69
69
|
# Work around https://jira.mongodb.org/browse/SERVER-17397
|
70
|
-
if ClusterConfig.instance.server_version < '4.
|
70
|
+
if ClusterConfig.instance.server_version < '4.4' &&
|
71
71
|
global_client.cluster.servers.length > 1
|
72
72
|
then
|
73
|
-
mongos_each_direct_client do |client|
|
73
|
+
::Utils.mongos_each_direct_client do |client|
|
74
74
|
client.database.command(flushRouterConfig: 1)
|
75
75
|
end
|
76
76
|
end
|
@@ -107,7 +107,7 @@ module Mongo
|
|
107
107
|
|
108
108
|
def run
|
109
109
|
change_stream = begin
|
110
|
-
@target.watch(@pipeline, Utils.snakeize_hash(@options))
|
110
|
+
@target.watch(@pipeline, ::Utils.snakeize_hash(@options))
|
111
111
|
rescue Mongo::Error::OperationFailure => e
|
112
112
|
return {
|
113
113
|
result: {
|
data/spec/runners/cmap.rb
CHANGED
@@ -40,7 +40,7 @@ module Mongo
|
|
40
40
|
@test = YAML.load(File.read(test_path))
|
41
41
|
|
42
42
|
@description = @test['description']
|
43
|
-
@pool_options = Utils.snakeize_hash(process_options(@test['poolOptions']))
|
43
|
+
@pool_options = ::Utils.snakeize_hash(process_options(@test['poolOptions']))
|
44
44
|
@spec_ops = @test['operations'].map { |o| Operation.new(self, o) }
|
45
45
|
@processed_ops = []
|
46
46
|
@expected_error = @test['error']
|
@@ -135,7 +135,7 @@ module Mongo
|
|
135
135
|
if expected.keys.first == '$numberLong'
|
136
136
|
converted = expected.values.first.to_i
|
137
137
|
if actual.is_a?(BSON::Int64)
|
138
|
-
actual = Utils.int64_value(actual)
|
138
|
+
actual = ::Utils.int64_value(actual)
|
139
139
|
elsif actual.is_a?(BSON::Int32)
|
140
140
|
return false
|
141
141
|
end
|
@@ -260,8 +260,9 @@ module Mongo
|
|
260
260
|
# @param [ Mongo::Collection ] collection The collection.
|
261
261
|
#
|
262
262
|
# @since 2.1.0
|
263
|
-
def run(collection)
|
263
|
+
def run(collection, subscriber)
|
264
264
|
collection.insert_many(@data)
|
265
|
+
subscriber.clear_events!
|
265
266
|
@operation.execute(collection)
|
266
267
|
end
|
267
268
|
end
|
@@ -338,37 +339,5 @@ module Mongo
|
|
338
339
|
"match_#{event_type}"
|
339
340
|
end
|
340
341
|
end
|
341
|
-
|
342
|
-
# The test subscriber to track the events.
|
343
|
-
#
|
344
|
-
# @since 2.1.0
|
345
|
-
class TestSubscriber
|
346
|
-
|
347
|
-
def started(event)
|
348
|
-
command_started_event[event.command_name] = event
|
349
|
-
end
|
350
|
-
|
351
|
-
def succeeded(event)
|
352
|
-
command_succeeded_event[event.command_name] = event
|
353
|
-
end
|
354
|
-
|
355
|
-
def failed(event)
|
356
|
-
command_failed_event[event.command_name] = event
|
357
|
-
end
|
358
|
-
|
359
|
-
private
|
360
|
-
|
361
|
-
def command_started_event
|
362
|
-
@started_events ||= BSON::Document.new
|
363
|
-
end
|
364
|
-
|
365
|
-
def command_succeeded_event
|
366
|
-
@succeeded_events ||= BSON::Document.new
|
367
|
-
end
|
368
|
-
|
369
|
-
def command_failed_event
|
370
|
-
@failed_events ||= BSON::Document.new
|
371
|
-
end
|
372
|
-
end
|
373
342
|
end
|
374
343
|
end
|
@@ -84,20 +84,6 @@ RSpec::Matchers.define :match_auth do |test|
|
|
84
84
|
end
|
85
85
|
end
|
86
86
|
|
87
|
-
RSpec::Matchers.define :match_options do |test|
|
88
|
-
|
89
|
-
match do |client|
|
90
|
-
options = test.options
|
91
|
-
return true unless options
|
92
|
-
options.match?(client.options)
|
93
|
-
end
|
94
|
-
|
95
|
-
failure_message do |client|
|
96
|
-
"With URI: #{test.uri_string}\n" +
|
97
|
-
"Expected that test options: #{test.options.options} would match client options: #{client.options}"
|
98
|
-
end
|
99
|
-
end
|
100
|
-
|
101
87
|
module Mongo
|
102
88
|
module ConnectionString
|
103
89
|
|
@@ -159,7 +145,7 @@ module Mongo
|
|
159
145
|
end
|
160
146
|
|
161
147
|
def options
|
162
|
-
@
|
148
|
+
@spec['options']
|
163
149
|
end
|
164
150
|
|
165
151
|
def client
|
@@ -239,115 +225,31 @@ module Mongo
|
|
239
225
|
end
|
240
226
|
end
|
241
227
|
|
242
|
-
|
243
|
-
|
244
|
-
|
245
|
-
|
246
|
-
|
247
|
-
|
248
|
-
|
249
|
-
|
250
|
-
|
251
|
-
'sockettimeoutms' => :socket_timeout,
|
252
|
-
'serverselectiontimeoutms' => :server_selection_timeout,
|
253
|
-
'localthresholdms' => :local_threshold,
|
254
|
-
'heartbeatfrequencyms' => :heartbeat_frequency,
|
255
|
-
'maxidletimems' => :max_idle_time,
|
256
|
-
|
257
|
-
# Write Options
|
258
|
-
'journal' => [:write_concern, 'j'],
|
259
|
-
'w' => [:write_concern, 'w'],
|
260
|
-
'wtimeoutms' => [:write_concern, 'wtimeout'],
|
261
|
-
|
262
|
-
# Read Options
|
263
|
-
'readpreference' => ['read', 'mode'],
|
264
|
-
'readpreferencetags' => ['read', 'tag_sets'],
|
265
|
-
'maxstalenessseconds' => ['read', 'max_staleness'],
|
266
|
-
|
267
|
-
# Pool Options
|
268
|
-
'minpoolsize' => :min_pool_size,
|
269
|
-
'maxpoolsize' => :max_pool_size,
|
270
|
-
|
271
|
-
# Security Options
|
272
|
-
'tls' => :ssl,
|
273
|
-
'tlsallowinvalidcertificates' => :ssl_verify_certificate,
|
274
|
-
'tlsallowinvalidhostnames' => :ssl_verify_hostname,
|
275
|
-
'tlscafile' => :ssl_ca_cert,
|
276
|
-
'tlscertificatekeyfile' => :ssl_cert,
|
277
|
-
'tlscertificatekeyfilepassword' => :ssl_key_pass_phrase,
|
278
|
-
'tlsinsecure' => :ssl_verify,
|
279
|
-
|
280
|
-
# Auth Options
|
281
|
-
'authsource' => :auth_source,
|
282
|
-
'authmechanism' => :auth_mech,
|
283
|
-
'authmechanismproperties' => :auth_mech_properties,
|
284
|
-
|
285
|
-
# Client Options
|
286
|
-
'appname' => :app_name,
|
287
|
-
'readconcernlevel' => [:read_concern, 'level'],
|
288
|
-
'retrywrites' => :retry_writes,
|
289
|
-
'zlibcompressionlevel' => :zlib_compression_level,
|
290
|
-
}
|
291
|
-
|
292
|
-
attr_reader :options
|
293
|
-
|
294
|
-
def initialize(options)
|
295
|
-
@options = options
|
296
|
-
end
|
297
|
-
|
298
|
-
def match?(opts)
|
299
|
-
@options.all? do |k, v|
|
300
|
-
k = k.downcase
|
301
|
-
|
302
|
-
expected =
|
303
|
-
case k
|
304
|
-
when 'authmechanism'
|
305
|
-
Mongo::URI::AUTH_MECH_MAP[v].downcase.to_s
|
306
|
-
when 'authmechanismproperties'
|
307
|
-
v.reduce({}) do |new_v, prop|
|
308
|
-
prop_key = prop.first.downcase
|
309
|
-
prop_val = prop.last == 'true' ? true : prop.last
|
310
|
-
new_v[prop_key] = prop_val
|
311
|
-
|
312
|
-
new_v
|
313
|
-
end
|
314
|
-
when 'compressors'
|
315
|
-
v.dup.tap do |compressors|
|
316
|
-
# The Ruby driver doesn't support snappy
|
317
|
-
compressors.delete('snappy')
|
318
|
-
end
|
319
|
-
when 'readpreference'
|
320
|
-
Mongo::URI::READ_MODE_MAP[v.downcase].to_s
|
321
|
-
when 'tlsallowinvalidcertificates', 'tlsallowinvalidhostnames', 'tlsinsecure'
|
322
|
-
!v
|
323
|
-
else
|
324
|
-
if k.end_with?('ms') && k != 'wtimeoutms'
|
325
|
-
v / 1000.0
|
326
|
-
elsif v.is_a?(String)
|
327
|
-
v.downcase
|
328
|
-
else
|
329
|
-
v
|
330
|
-
end
|
331
|
-
end
|
332
|
-
|
333
|
-
actual =
|
334
|
-
case MAPPINGS[k]
|
335
|
-
when nil
|
336
|
-
opts[k]
|
337
|
-
when Array
|
338
|
-
opts[MAPPINGS[k].first][MAPPINGS[k].last]
|
339
|
-
else
|
340
|
-
opts[MAPPINGS[k]]
|
341
|
-
end
|
342
|
-
|
343
|
-
if actual.is_a?(Symbol)
|
344
|
-
actual = actual.to_s
|
228
|
+
module_function def adjust_expected_mongo_client_options(options)
|
229
|
+
expected = options.dup.tap do |expected|
|
230
|
+
expected.each do |k, v|
|
231
|
+
# Ruby driver downcases auth mechanism properties when
|
232
|
+
# constructing the client.
|
233
|
+
#
|
234
|
+
# Some tests give options in all lower case.
|
235
|
+
if k.downcase == 'authmechanismproperties'
|
236
|
+
expected[k] = ::Utils.downcase_keys(v)
|
345
237
|
end
|
346
|
-
|
347
|
-
|
238
|
+
# Ruby driver does not support snappy.
|
239
|
+
if k == 'compressors'
|
240
|
+
expected[k] = v.reject { |sub_v| sub_v == 'snappy' }
|
348
241
|
end
|
349
|
-
|
350
|
-
|
242
|
+
end
|
243
|
+
# We omit retryReads/retryWrites=true because some tests do not
|
244
|
+
# provide those.
|
245
|
+
%w(retryReads retryWrites).each do |k, v|
|
246
|
+
if expected[k] == true
|
247
|
+
expected.delete(k)
|
248
|
+
end
|
249
|
+
end
|
250
|
+
# Fix appName case.
|
251
|
+
if expected.key?('appname') && !expected.key?('appName')
|
252
|
+
expected['appName'] = expected.delete('appname')
|
351
253
|
end
|
352
254
|
end
|
353
255
|
end
|
@@ -406,8 +308,17 @@ def define_connection_string_spec_tests(test_paths, spec_cls = Mongo::Connection
|
|
406
308
|
expect(test.client).to match_auth(test)
|
407
309
|
end
|
408
310
|
|
409
|
-
|
410
|
-
|
311
|
+
if test.options
|
312
|
+
it 'creates a client with the correct options' do
|
313
|
+
mapped = Mongo::URI::OptionsMapper.new.ruby_to_smc(test.client.options)
|
314
|
+
# Connection string spec tests do not use canonical URI option names
|
315
|
+
actual = Utils.downcase_keys(mapped)
|
316
|
+
actual.delete('authsource')
|
317
|
+
expected = Mongo::ConnectionString.adjust_expected_mongo_client_options(
|
318
|
+
test.options,
|
319
|
+
)
|
320
|
+
actual.should == expected
|
321
|
+
end
|
411
322
|
end
|
412
323
|
|
413
324
|
if test.read_concern_expectation
|
@@ -12,12 +12,16 @@
|
|
12
12
|
# See the License for the specific language governing permissions and
|
13
13
|
# limitations under the License.
|
14
14
|
|
15
|
+
require 'support/keyword_struct'
|
16
|
+
|
15
17
|
module Mongo
|
16
18
|
module CRUD
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
19
|
+
Context = KeywordStruct.new(
|
20
|
+
:session0,
|
21
|
+
:session1,
|
22
|
+
:sdam_subscriber,
|
23
|
+
:threads,
|
24
|
+
:primary_address,
|
25
|
+
)
|
22
26
|
end
|
23
27
|
end
|
@@ -88,7 +88,7 @@ module Mongo
|
|
88
88
|
#
|
89
89
|
# @since 2.0.0
|
90
90
|
def execute(target)
|
91
|
-
op_name = Utils.underscore(name)
|
91
|
+
op_name = ::Utils.underscore(name)
|
92
92
|
if target.is_a?(Mongo::Database)
|
93
93
|
op_name = "db_#{op_name}"
|
94
94
|
elsif target.is_a?(Mongo::Client)
|
@@ -99,14 +99,14 @@ module Mongo
|
|
99
99
|
|
100
100
|
def database_options
|
101
101
|
if opts = @spec['databaseOptions']
|
102
|
-
Utils.convert_operation_options(opts)
|
102
|
+
::Utils.convert_operation_options(opts)
|
103
103
|
else
|
104
104
|
nil
|
105
105
|
end
|
106
106
|
end
|
107
107
|
|
108
108
|
def collection_options
|
109
|
-
Utils.convert_operation_options(@spec['collectionOptions'])
|
109
|
+
::Utils.convert_operation_options(@spec['collectionOptions'])
|
110
110
|
end
|
111
111
|
|
112
112
|
private
|
@@ -114,31 +114,31 @@ module Mongo
|
|
114
114
|
# read operations
|
115
115
|
|
116
116
|
def aggregate(collection, context)
|
117
|
-
collection.aggregate(arguments['pipeline'], context
|
117
|
+
collection.aggregate(arguments['pipeline'], transformed_options(context)).to_a
|
118
118
|
end
|
119
119
|
|
120
120
|
def db_aggregate(database, context)
|
121
|
-
database.aggregate(arguments['pipeline'], context
|
121
|
+
database.aggregate(arguments['pipeline'], transformed_options(context)).to_a
|
122
122
|
end
|
123
123
|
|
124
124
|
def count(collection, context)
|
125
|
-
collection.count(arguments['filter'], context
|
125
|
+
collection.count(arguments['filter'], transformed_options(context))
|
126
126
|
end
|
127
127
|
|
128
128
|
def count_documents(collection, context)
|
129
|
-
collection.count_documents(arguments['filter'], context
|
129
|
+
collection.count_documents(arguments['filter'], transformed_options(context))
|
130
130
|
end
|
131
131
|
|
132
132
|
def distinct(collection, context)
|
133
|
-
collection.distinct(arguments['fieldName'], arguments['filter'], context
|
133
|
+
collection.distinct(arguments['fieldName'], arguments['filter'], transformed_options(context))
|
134
134
|
end
|
135
135
|
|
136
136
|
def estimated_document_count(collection, context)
|
137
|
-
collection.estimated_document_count(context
|
137
|
+
collection.estimated_document_count(transformed_options(context))
|
138
138
|
end
|
139
139
|
|
140
140
|
def find(collection, context)
|
141
|
-
opts = context
|
141
|
+
opts = transformed_options(context)
|
142
142
|
if arguments['modifiers']
|
143
143
|
opts = opts.merge(modifiers: BSON::Document.new(arguments['modifiers']))
|
144
144
|
end
|
@@ -183,7 +183,7 @@ module Mongo
|
|
183
183
|
# write operations
|
184
184
|
|
185
185
|
def bulk_write(collection, context)
|
186
|
-
result = collection.bulk_write(requests, context
|
186
|
+
result = collection.bulk_write(requests, transformed_options(context))
|
187
187
|
return_doc = {}
|
188
188
|
return_doc['deletedCount'] = result.deleted_count || 0
|
189
189
|
return_doc['insertedIds'] = result.inserted_ids if result.inserted_ids
|
@@ -197,50 +197,50 @@ module Mongo
|
|
197
197
|
end
|
198
198
|
|
199
199
|
def delete_many(collection, context)
|
200
|
-
result = collection.delete_many(arguments['filter'], context
|
200
|
+
result = collection.delete_many(arguments['filter'], transformed_options(context))
|
201
201
|
{ 'deletedCount' => result.deleted_count }
|
202
202
|
end
|
203
203
|
|
204
204
|
def delete_one(collection, context)
|
205
|
-
result = collection.delete_one(arguments['filter'], context
|
205
|
+
result = collection.delete_one(arguments['filter'], transformed_options(context))
|
206
206
|
{ 'deletedCount' => result.deleted_count }
|
207
207
|
end
|
208
208
|
|
209
209
|
def insert_many(collection, context)
|
210
|
-
result = collection.insert_many(arguments['documents'], context
|
210
|
+
result = collection.insert_many(arguments['documents'], transformed_options(context))
|
211
211
|
{ 'insertedIds' => result.inserted_ids }
|
212
212
|
end
|
213
213
|
|
214
214
|
def insert_one(collection, context)
|
215
|
-
result = collection.insert_one(arguments['document'], context
|
215
|
+
result = collection.insert_one(arguments['document'], transformed_options(context))
|
216
216
|
{ 'insertedId' => result.inserted_id }
|
217
217
|
end
|
218
218
|
|
219
219
|
def replace_one(collection, context)
|
220
|
-
result = collection.replace_one(arguments['filter'], arguments['replacement'], context
|
220
|
+
result = collection.replace_one(arguments['filter'], arguments['replacement'], transformed_options(context))
|
221
221
|
update_return_doc(result)
|
222
222
|
end
|
223
223
|
|
224
224
|
def update_many(collection, context)
|
225
|
-
result = collection.update_many(arguments['filter'], arguments['update'], context
|
225
|
+
result = collection.update_many(arguments['filter'], arguments['update'], transformed_options(context))
|
226
226
|
update_return_doc(result)
|
227
227
|
end
|
228
228
|
|
229
229
|
def update_one(collection, context)
|
230
|
-
result = collection.update_one(arguments['filter'], arguments['update'], context
|
230
|
+
result = collection.update_one(arguments['filter'], arguments['update'], transformed_options(context))
|
231
231
|
update_return_doc(result)
|
232
232
|
end
|
233
233
|
|
234
234
|
def find_one_and_delete(collection, context)
|
235
|
-
collection.find_one_and_delete(arguments['filter'], context
|
235
|
+
collection.find_one_and_delete(arguments['filter'], transformed_options(context))
|
236
236
|
end
|
237
237
|
|
238
238
|
def find_one_and_replace(collection, context)
|
239
|
-
collection.find_one_and_replace(arguments['filter'], arguments['replacement'], context
|
239
|
+
collection.find_one_and_replace(arguments['filter'], arguments['replacement'], transformed_options(context))
|
240
240
|
end
|
241
241
|
|
242
242
|
def find_one_and_update(collection, context)
|
243
|
-
collection.find_one_and_update(arguments['filter'], arguments['update'], context
|
243
|
+
collection.find_one_and_update(arguments['filter'], arguments['update'], transformed_options(context))
|
244
244
|
end
|
245
245
|
|
246
246
|
# ddl
|
@@ -270,7 +270,8 @@ module Mongo
|
|
270
270
|
end
|
271
271
|
|
272
272
|
def create_collection(database, context)
|
273
|
-
|
273
|
+
opts = transformed_options(context)
|
274
|
+
database[arguments.fetch('collection')].create(session: opts[:session])
|
274
275
|
end
|
275
276
|
|
276
277
|
def rename(collection, context)
|
@@ -351,6 +352,16 @@ module Mongo
|
|
351
352
|
end
|
352
353
|
end
|
353
354
|
|
355
|
+
def configure_fail_point(client, context)
|
356
|
+
fp = arguments.fetch('failPoint')
|
357
|
+
$disable_fail_points ||= []
|
358
|
+
$disable_fail_points << [
|
359
|
+
fp,
|
360
|
+
ClusterConfig.instance.primary_address,
|
361
|
+
]
|
362
|
+
client.use('admin').database.command(fp)
|
363
|
+
end
|
364
|
+
|
354
365
|
# options & arguments
|
355
366
|
|
356
367
|
def options
|
@@ -360,7 +371,7 @@ module Mongo
|
|
360
371
|
# bulk write test is an exception in that it has an "options" key
|
361
372
|
# with the options.
|
362
373
|
arguments.merge(arguments['options'] || {}).each do |spec_k, v|
|
363
|
-
ruby_k = Utils.underscore(spec_k).to_sym
|
374
|
+
ruby_k = ::Utils.underscore(spec_k).to_sym
|
364
375
|
|
365
376
|
if v.is_a?(Hash) && v['$numberLong']
|
366
377
|
v = v['$numberLong'].to_i
|
@@ -390,8 +401,8 @@ module Mongo
|
|
390
401
|
end
|
391
402
|
|
392
403
|
def bulk_request(request)
|
393
|
-
op_name = Utils.underscore(request['name'])
|
394
|
-
args = Utils.shallow_snakeize_hash(request['arguments'])
|
404
|
+
op_name = ::Utils.underscore(request['name'])
|
405
|
+
args = ::Utils.shallow_snakeize_hash(request['arguments'])
|
395
406
|
if args[:document]
|
396
407
|
unless args.keys == [:document]
|
397
408
|
raise "If :document is given, it must be the only key"
|
@@ -406,7 +417,7 @@ module Mongo
|
|
406
417
|
end
|
407
418
|
|
408
419
|
def transform_return_document(v)
|
409
|
-
Utils.underscore(v).to_sym
|
420
|
+
::Utils.underscore(v).to_sym
|
410
421
|
end
|
411
422
|
|
412
423
|
def update
|
@@ -414,7 +425,7 @@ module Mongo
|
|
414
425
|
end
|
415
426
|
|
416
427
|
def transform_read_preference(v)
|
417
|
-
Utils.snakeize_hash(v)
|
428
|
+
::Utils.snakeize_hash(v)
|
418
429
|
end
|
419
430
|
|
420
431
|
def read_preference
|
@@ -429,6 +440,27 @@ module Mongo
|
|
429
440
|
return_doc['modifiedCount'] = result.modified_count if result.modified_count
|
430
441
|
return_doc
|
431
442
|
end
|
443
|
+
|
444
|
+
def transformed_options(context)
|
445
|
+
opts = options.dup
|
446
|
+
if opts[:session]
|
447
|
+
opts[:session] = case opts[:session]
|
448
|
+
when 'session0'
|
449
|
+
unless context.session0
|
450
|
+
raise "Trying to use session0 but it is not in context"
|
451
|
+
end
|
452
|
+
context.session0
|
453
|
+
when 'session1'
|
454
|
+
unless context.session1
|
455
|
+
raise "Trying to use session1 but it is not in context"
|
456
|
+
end
|
457
|
+
context.session1
|
458
|
+
else
|
459
|
+
raise "Invalid session name '#{opts[:session]}'"
|
460
|
+
end
|
461
|
+
end
|
462
|
+
opts
|
463
|
+
end
|
432
464
|
end
|
433
465
|
end
|
434
466
|
end
|