mongo 2.13.3 → 2.14.0.rc1
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/lib/mongo/address/ipv4.rb +1 -1
- data/lib/mongo/address/ipv6.rb +1 -1
- data/lib/mongo/address.rb +1 -1
- data/lib/mongo/bulk_write.rb +17 -0
- data/lib/mongo/caching_cursor.rb +74 -0
- data/lib/mongo/client.rb +47 -8
- data/lib/mongo/cluster/topology/single.rb +1 -1
- data/lib/mongo/cluster.rb +3 -3
- 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 +12 -2
- data/lib/mongo/collection/view/writable.rb +15 -1
- data/lib/mongo/collection/view.rb +24 -20
- data/lib/mongo/collection.rb +26 -2
- data/lib/mongo/crypt/encryption_io.rb +6 -6
- data/lib/mongo/cursor.rb +1 -0
- data/lib/mongo/database/view.rb +1 -1
- data/lib/mongo/database.rb +8 -14
- data/lib/mongo/error/invalid_read_concern.rb +28 -0
- data/lib/mongo/error/server_certificate_revoked.rb +22 -0
- data/lib/mongo/error/unsupported_option.rb +14 -12
- data/lib/mongo/error.rb +2 -0
- data/lib/mongo/grid/fs_bucket.rb +37 -37
- data/lib/mongo/lint.rb +2 -1
- data/lib/mongo/logger.rb +3 -3
- data/lib/mongo/operation/aggregate/result.rb +9 -8
- data/lib/mongo/operation/collections_info/command.rb +0 -5
- data/lib/mongo/operation/collections_info/result.rb +3 -16
- 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 +3 -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/command.rb +2 -1
- 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/read_preference_supported.rb +36 -38
- data/lib/mongo/operation/shared/result/aggregatable.rb +1 -0
- data/lib/mongo/operation/shared/sessions_supported.rb +3 -3
- 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/operation.rb +2 -0
- data/lib/mongo/protocol/msg.rb +2 -2
- data/lib/mongo/protocol/query.rb +11 -11
- data/lib/mongo/query_cache.rb +242 -0
- data/lib/mongo/retryable.rb +8 -1
- data/lib/mongo/server/connection_common.rb +2 -2
- data/lib/mongo/server/connection_pool.rb +3 -0
- data/lib/mongo/server/monitor/connection.rb +3 -3
- data/lib/mongo/server/monitor.rb +1 -1
- data/lib/mongo/server/pending_connection.rb +2 -2
- data/lib/mongo/server/push_monitor.rb +1 -1
- data/lib/mongo/server.rb +5 -1
- data/lib/mongo/server_selector/base.rb +5 -1
- data/lib/mongo/server_selector/secondary_preferred.rb +7 -2
- data/lib/mongo/session.rb +3 -0
- data/lib/mongo/socket/ocsp_cache.rb +97 -0
- data/lib/mongo/socket/ocsp_verifier.rb +368 -0
- data/lib/mongo/socket/ssl.rb +45 -24
- data/lib/mongo/socket.rb +6 -4
- 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/uri/options_mapper.rb +582 -0
- data/lib/mongo/uri/srv_protocol.rb +3 -2
- data/lib/mongo/uri.rb +21 -390
- data/lib/mongo/utils.rb +12 -1
- data/lib/mongo/version.rb +1 -1
- data/lib/mongo.rb +9 -0
- data/spec/NOTES.aws-auth.md +12 -7
- data/spec/README.md +56 -1
- data/spec/integration/bson_symbol_spec.rb +2 -4
- data/spec/integration/bulk_write_spec.rb +48 -0
- data/spec/integration/client_authentication_options_spec.rb +55 -28
- data/spec/integration/connection_pool_populator_spec.rb +3 -1
- data/spec/integration/cursor_reaping_spec.rb +53 -17
- 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 +179 -0
- data/spec/integration/retryable_writes/retryable_writes_40_and_newer_spec.rb +1 -0
- data/spec/integration/retryable_writes/shared/performs_legacy_retries.rb +2 -0
- data/spec/integration/sdam_error_handling_spec.rb +69 -18
- data/spec/integration/sdam_events_spec.rb +7 -8
- data/spec/integration/server_selection_spec.rb +36 -0
- data/spec/integration/srv_monitoring_spec.rb +38 -3
- data/spec/integration/srv_spec.rb +56 -0
- data/spec/lite_spec_helper.rb +4 -2
- data/spec/mongo/address_spec.rb +1 -1
- data/spec/mongo/caching_cursor_spec.rb +70 -0
- data/spec/mongo/client_construction_spec.rb +54 -1
- data/spec/mongo/client_encryption_spec.rb +10 -16
- data/spec/mongo/client_spec.rb +40 -0
- data/spec/mongo/cluster/topology/single_spec.rb +14 -5
- data/spec/mongo/cluster_spec.rb +3 -0
- 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_spec.rb +60 -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/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/database_spec.rb +44 -64
- data/spec/mongo/error/no_server_available_spec.rb +1 -1
- data/spec/mongo/index/view_spec.rb +2 -4
- data/spec/mongo/logger_spec.rb +13 -11
- data/spec/mongo/operation/read_preference_legacy_spec.rb +19 -9
- data/spec/mongo/operation/read_preference_op_msg_spec.rb +3 -3
- data/spec/mongo/query_cache_spec.rb +279 -0
- data/spec/mongo/server/app_metadata_shared.rb +7 -33
- data/spec/mongo/server/connection_pool_spec.rb +7 -3
- data/spec/mongo/server/connection_spec.rb +14 -7
- data/spec/mongo/server_selector/secondary_preferred_spec.rb +6 -6
- data/spec/mongo/socket/ssl_spec.rb +1 -1
- 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/connection_string.rb +35 -124
- data/spec/runners/transactions/operation.rb +2 -13
- data/spec/spec_tests/cmap_spec.rb +7 -3
- data/spec/spec_tests/data/change_streams/change-streams-errors.yml +0 -1
- 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/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/uri_options_spec.rb +31 -33
- 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 +4 -8
- data/spec/support/client_registry_macros.rb +4 -4
- data/spec/support/common_shortcuts.rb +45 -0
- data/spec/support/constraints.rb +23 -0
- data/spec/support/lite_constraints.rb +24 -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/spec_config.rb +22 -12
- data/spec/support/spec_setup.rb +38 -48
- data/spec/support/utils.rb +19 -1
- data.tar.gz.sig +1 -3
- metadata +938 -933
- metadata.gz.sig +0 -0
- data/spec/integration/secondary_reads_spec.rb +0 -102
- data/spec/shared/LICENSE +0 -20
- data/spec/shared/bin/get-mongodb-download-url +0 -17
- data/spec/shared/lib/mrss/child_process_helper.rb +0 -80
- data/spec/shared/lib/mrss/cluster_config.rb +0 -221
- data/spec/shared/lib/mrss/constraints.rb +0 -346
- data/spec/shared/lib/mrss/docker_runner.rb +0 -265
- data/spec/shared/lib/mrss/lite_constraints.rb +0 -191
- data/spec/shared/lib/mrss/server_version_registry.rb +0 -115
- data/spec/shared/lib/mrss/spec_organizer.rb +0 -152
- data/spec/shared/lib/mrss/utils.rb +0 -15
- data/spec/shared/share/Dockerfile.erb +0 -231
- data/spec/shared/shlib/distro.sh +0 -73
- data/spec/shared/shlib/server.sh +0 -290
- data/spec/shared/shlib/set_env.sh +0 -128
@@ -199,37 +199,37 @@ describe Mongo::URI do
|
|
199
199
|
|
200
200
|
context 'authMechanismProperties' do
|
201
201
|
|
202
|
-
let(:string) { 'mongodb://example.com/?authmechanismproperties=
|
202
|
+
let(:string) { 'mongodb://example.com/?authmechanismproperties=SERVICE_realm:foo,CANONICALIZE_HOST_name:TRUE' }
|
203
203
|
|
204
204
|
it_behaves_like 'parses successfully'
|
205
205
|
|
206
206
|
it 'parses correctly' do
|
207
207
|
expect(uri.uri_options[:auth_mech_properties]).to eq(BSON::Document.new(
|
208
|
-
|
209
|
-
|
208
|
+
SERVICE_realm: 'foo',
|
209
|
+
CANONICALIZE_HOST_name: true,
|
210
210
|
))
|
211
211
|
end
|
212
212
|
|
213
213
|
context 'canonicalize host name is false' do
|
214
214
|
|
215
|
-
let(:string) { 'mongodb://example.com/?authmechanismproperties=
|
215
|
+
let(:string) { 'mongodb://example.com/?authmechanismproperties=SERVICE_realm:foo,CANONICALIZE_HOST_name:false' }
|
216
216
|
|
217
217
|
it 'parses correctly' do
|
218
218
|
expect(uri.uri_options[:auth_mech_properties]).to eq(BSON::Document.new(
|
219
|
-
|
220
|
-
|
219
|
+
SERVICE_realm: 'foo',
|
220
|
+
CANONICALIZE_HOST_name: false,
|
221
221
|
))
|
222
222
|
end
|
223
223
|
end
|
224
224
|
|
225
225
|
context 'canonicalize host name is true in mixed case' do
|
226
226
|
|
227
|
-
let(:string) { 'mongodb://example.com/?authmechanismproperties=
|
227
|
+
let(:string) { 'mongodb://example.com/?authmechanismproperties=SERVICE_realm:foo,CANONICALIZE_HOST_name:TrUe' }
|
228
228
|
|
229
229
|
it 'parses correctly' do
|
230
230
|
expect(uri.uri_options[:auth_mech_properties]).to eq(BSON::Document.new(
|
231
|
-
|
232
|
-
|
231
|
+
SERVICE_realm: 'foo',
|
232
|
+
CANONICALIZE_HOST_name: true,
|
233
233
|
))
|
234
234
|
end
|
235
235
|
end
|
@@ -350,8 +350,8 @@ describe Mongo::URI do
|
|
350
350
|
|
351
351
|
it_behaves_like 'parses successfully'
|
352
352
|
|
353
|
-
it 'is
|
354
|
-
|
353
|
+
it 'is omitted' do
|
354
|
+
uri.uri_options.should_not have_key(:read)
|
355
355
|
end
|
356
356
|
end
|
357
357
|
end
|
data/spec/mongo/uri_spec.rb
CHANGED
@@ -727,9 +727,9 @@ describe Mongo::URI do
|
|
727
727
|
'readPreference=secondary&maxStalenessSeconds=89'
|
728
728
|
end
|
729
729
|
|
730
|
-
it 'does not raise an exception
|
730
|
+
it 'does not raise an exception and drops the option' do
|
731
731
|
client = new_local_client_nmio(string)
|
732
|
-
expect(client.read_preference).to eq(BSON::Document.new(mode: :secondary
|
732
|
+
expect(client.read_preference).to eq(BSON::Document.new(mode: :secondary))
|
733
733
|
end
|
734
734
|
end
|
735
735
|
end
|
@@ -854,16 +854,16 @@ describe Mongo::URI do
|
|
854
854
|
context 'when a mapping value is missing' do
|
855
855
|
let(:options) { "authMechanism=#{mechanism}&authMechanismProperties=SERVICE_NAME:,CANONICALIZE_HOST_NAME:" }
|
856
856
|
|
857
|
-
it 'sets the options
|
858
|
-
expect(client.options[:auth_mech_properties]).to eq({ '
|
857
|
+
it 'sets the options to defaults' do
|
858
|
+
expect(client.options[:auth_mech_properties]).to eq({ 'service_name' => 'mongodb' })
|
859
859
|
end
|
860
860
|
end
|
861
861
|
|
862
862
|
context 'when a mapping value is missing but another is present' do
|
863
863
|
let(:options) { "authMechanism=#{mechanism}&authMechanismProperties=SERVICE_NAME:foo,CANONICALIZE_HOST_NAME:" }
|
864
864
|
|
865
|
-
it 'sets the
|
866
|
-
expect(client.options[:auth_mech_properties]).to eq({ '
|
865
|
+
it 'only sets the present value' do
|
866
|
+
expect(client.options[:auth_mech_properties]).to eq({ 'service_name' => 'foo' })
|
867
867
|
end
|
868
868
|
end
|
869
869
|
end
|
@@ -1013,84 +1013,111 @@ describe Mongo::URI do
|
|
1013
1013
|
|
1014
1014
|
context 'auth mechanism properties provided' do
|
1015
1015
|
|
1016
|
+
shared_examples 'sets options in the expected manner' do
|
1017
|
+
it 'preserves case in auth mechanism properties returned from URI' do
|
1018
|
+
expect(uri.uri_options[:auth_mech_properties]).to eq(expected_uri_options)
|
1019
|
+
end
|
1020
|
+
|
1021
|
+
it 'downcases auth mechanism properties keys in client options' do
|
1022
|
+
client = new_local_client_nmio(string)
|
1023
|
+
expect(client.options[:auth_mech_properties]).to eq(expected_client_options)
|
1024
|
+
end
|
1025
|
+
end
|
1026
|
+
|
1016
1027
|
context 'service_name' do
|
1017
1028
|
let(:options) do
|
1018
|
-
"authMechanismProperties=
|
1029
|
+
"authMechanismProperties=SERVICE_name:#{service_name}"
|
1019
1030
|
end
|
1031
|
+
|
1020
1032
|
let(:service_name) { 'foo' }
|
1021
|
-
let(:expected) { Mongo::Options::Redacted.new({ service_name: service_name }) }
|
1022
1033
|
|
1023
|
-
|
1024
|
-
|
1034
|
+
let(:expected_uri_options) do
|
1035
|
+
Mongo::Options::Redacted.new(
|
1036
|
+
SERVICE_name: service_name,
|
1037
|
+
)
|
1025
1038
|
end
|
1026
1039
|
|
1027
|
-
|
1028
|
-
|
1029
|
-
|
1040
|
+
let(:expected_client_options) do
|
1041
|
+
Mongo::Options::Redacted.new(
|
1042
|
+
service_name: service_name,
|
1043
|
+
)
|
1030
1044
|
end
|
1045
|
+
|
1046
|
+
include_examples 'sets options in the expected manner'
|
1031
1047
|
end
|
1032
1048
|
|
1033
1049
|
context 'canonicalize_host_name' do
|
1034
1050
|
let(:options) do
|
1035
|
-
"authMechanismProperties=
|
1051
|
+
"authMechanismProperties=CANONICALIZE_HOST_name:#{canonicalize_host_name}"
|
1036
1052
|
end
|
1053
|
+
|
1037
1054
|
let(:canonicalize_host_name) { 'true' }
|
1038
|
-
let(:expected) { Mongo::Options::Redacted.new({ canonicalize_host_name: true }) }
|
1039
1055
|
|
1040
|
-
|
1041
|
-
|
1056
|
+
let(:expected_uri_options) do
|
1057
|
+
Mongo::Options::Redacted.new(
|
1058
|
+
CANONICALIZE_HOST_name: true,
|
1059
|
+
)
|
1042
1060
|
end
|
1043
1061
|
|
1044
|
-
|
1045
|
-
|
1046
|
-
|
1062
|
+
let(:expected_client_options) do
|
1063
|
+
Mongo::Options::Redacted.new(
|
1064
|
+
canonicalize_host_name: true,
|
1065
|
+
)
|
1047
1066
|
end
|
1067
|
+
|
1068
|
+
include_examples 'sets options in the expected manner'
|
1048
1069
|
end
|
1049
1070
|
|
1050
1071
|
context 'service_realm' do
|
1051
1072
|
let(:options) do
|
1052
|
-
"authMechanismProperties=
|
1073
|
+
"authMechanismProperties=SERVICE_realm:#{service_realm}"
|
1053
1074
|
end
|
1054
1075
|
|
1055
1076
|
let(:service_realm) { 'dumdum' }
|
1056
|
-
let(:expected) { Mongo::Options::Redacted.new({ service_realm: service_realm }) }
|
1057
1077
|
|
1058
|
-
|
1059
|
-
|
1060
|
-
|
1078
|
+
let(:expected_uri_options) do
|
1079
|
+
Mongo::Options::Redacted.new(
|
1080
|
+
SERVICE_realm: service_realm,
|
1081
|
+
)
|
1061
1082
|
end
|
1062
1083
|
|
1063
|
-
|
1064
|
-
|
1065
|
-
|
1084
|
+
let(:expected_client_options) do
|
1085
|
+
Mongo::Options::Redacted.new(
|
1086
|
+
service_realm: service_realm,
|
1087
|
+
)
|
1066
1088
|
end
|
1089
|
+
|
1090
|
+
include_examples 'sets options in the expected manner'
|
1067
1091
|
end
|
1068
1092
|
|
1069
1093
|
context 'multiple properties' do
|
1070
1094
|
let(:options) do
|
1071
|
-
"authMechanismProperties=
|
1072
|
-
"
|
1073
|
-
"
|
1095
|
+
"authMechanismProperties=SERVICE_realm:#{service_realm}," +
|
1096
|
+
"CANONICALIZE_HOST_name:#{canonicalize_host_name}," +
|
1097
|
+
"SERVICE_name:#{service_name}"
|
1074
1098
|
end
|
1075
1099
|
|
1076
1100
|
let(:service_name) { 'foo' }
|
1077
1101
|
let(:canonicalize_host_name) { 'true' }
|
1078
1102
|
let(:service_realm) { 'dumdum' }
|
1079
1103
|
|
1080
|
-
let(:
|
1081
|
-
Mongo::Options::Redacted.new(
|
1082
|
-
|
1083
|
-
|
1104
|
+
let(:expected_uri_options) do
|
1105
|
+
Mongo::Options::Redacted.new(
|
1106
|
+
SERVICE_name: service_name,
|
1107
|
+
CANONICALIZE_HOST_name: true,
|
1108
|
+
SERVICE_realm: service_realm,
|
1109
|
+
)
|
1084
1110
|
end
|
1085
1111
|
|
1086
|
-
|
1087
|
-
|
1112
|
+
let(:expected_client_options) do
|
1113
|
+
Mongo::Options::Redacted.new(
|
1114
|
+
service_name: service_name,
|
1115
|
+
canonicalize_host_name: true,
|
1116
|
+
service_realm: service_realm,
|
1117
|
+
)
|
1088
1118
|
end
|
1089
1119
|
|
1090
|
-
|
1091
|
-
client = new_local_client_nmio(string)
|
1092
|
-
expect(client.options[:auth_mech_properties]).to eq(expected)
|
1093
|
-
end
|
1120
|
+
include_examples 'sets options in the expected manner'
|
1094
1121
|
end
|
1095
1122
|
end
|
1096
1123
|
|
@@ -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
@@ -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
|
@@ -191,19 +191,8 @@ module Mongo
|
|
191
191
|
|
192
192
|
def assert_event_count(client, context)
|
193
193
|
events = _select_events(context)
|
194
|
-
|
195
|
-
|
196
|
-
# This means sometimes there are two ServerMarkedUnknownEvent
|
197
|
-
# events published for the same server transition.
|
198
|
-
# Allow actual event count to be at least the expected event count
|
199
|
-
# in case there are multiple transitions in a single test.
|
200
|
-
unless events.length >= arguments['count']
|
201
|
-
raise "Expected #{arguments['count']} #{arguments['event']} events, but have #{events.length}"
|
202
|
-
end
|
203
|
-
else
|
204
|
-
unless events.length == arguments['count']
|
205
|
-
raise "Expected #{arguments['count']} #{arguments['event']} events, but have #{events.length}"
|
206
|
-
end
|
194
|
+
unless events.length == arguments['count']
|
195
|
+
raise "Exppected #{arguments['count']} #{arguments['event']} events, but have #{events.length}"
|
207
196
|
end
|
208
197
|
end
|
209
198
|
|
@@ -22,9 +22,13 @@ describe 'Cmap' do
|
|
22
22
|
end
|
23
23
|
|
24
24
|
let(:options) do
|
25
|
-
|
26
|
-
|
27
|
-
|
25
|
+
Mongo::Utils.shallow_symbolize_keys(Mongo::Client.canonicalize_ruby_options(
|
26
|
+
SpecConfig.instance.all_test_options,
|
27
|
+
)).update(monitoring_io: false).tap do |options|
|
28
|
+
# We have a wait queue timeout set in the test suite options, but having
|
29
|
+
# this option set interferes with assertions in the cmap spec tests.
|
30
|
+
options.delete(:wait_queue_timeout)
|
31
|
+
end
|
28
32
|
end
|
29
33
|
|
30
34
|
CMAP_TESTS.each do |file|
|
@@ -6,10 +6,14 @@ operations:
|
|
6
6
|
events:
|
7
7
|
- type: ConnectionCheckOutStarted
|
8
8
|
address: 42
|
9
|
+
- type: ConnectionCreated
|
10
|
+
connectionId: 1
|
11
|
+
address: 42
|
12
|
+
- type: ConnectionReady
|
13
|
+
connectionId: 1
|
14
|
+
address: 42
|
9
15
|
- type: ConnectionCheckedOut
|
10
16
|
connectionId: 1
|
11
17
|
address: 42
|
12
18
|
ignore:
|
13
19
|
- ConnectionPoolCreated
|
14
|
-
- ConnectionCreated
|
15
|
-
- ConnectionReady
|
@@ -49,3 +49,27 @@ tests:
|
|
49
49
|
auth: ~
|
50
50
|
options:
|
51
51
|
wtimeoutms: 10
|
52
|
+
-
|
53
|
+
description: "Empty integer option values are ignored"
|
54
|
+
uri: "mongodb://localhost/?maxIdleTimeMS="
|
55
|
+
valid: true
|
56
|
+
warning: true
|
57
|
+
hosts:
|
58
|
+
-
|
59
|
+
type: "hostname"
|
60
|
+
host: "localhost"
|
61
|
+
port: ~
|
62
|
+
auth: ~
|
63
|
+
options: ~
|
64
|
+
-
|
65
|
+
description: "Empty boolean option value are ignored"
|
66
|
+
uri: "mongodb://localhost/?journal="
|
67
|
+
valid: true
|
68
|
+
warning: true
|
69
|
+
hosts:
|
70
|
+
-
|
71
|
+
type: "hostname"
|
72
|
+
host: "localhost"
|
73
|
+
port: ~
|
74
|
+
auth: ~
|
75
|
+
options: ~
|
@@ -1,7 +1,5 @@
|
|
1
|
-
# This is a Ruby driver-specific test because other drivers
|
2
|
-
# do not allow discovering a standalone topology.
|
3
1
|
description: "Monitoring a discovered standalone connection"
|
4
|
-
uri: "mongodb://a:27017"
|
2
|
+
uri: "mongodb://a:27017/?directConnection=false"
|
5
3
|
phases:
|
6
4
|
-
|
7
5
|
responses:
|
@@ -1,5 +1,5 @@
|
|
1
|
-
description: "Monitoring a
|
2
|
-
uri: "mongodb://a:27017/?
|
1
|
+
description: "Monitoring a direct connection with repeated ismaster response"
|
2
|
+
uri: "mongodb://a:27017/?directConnection=true"
|
3
3
|
phases:
|
4
4
|
# phase 1
|
5
5
|
- responses: []
|
@@ -1,5 +1,5 @@
|
|
1
|
-
description: "Monitoring a
|
2
|
-
uri: "mongodb://a:27017/?
|
1
|
+
description: "Monitoring a direct connection - suppress update events for equal server descriptions"
|
2
|
+
uri: "mongodb://a:27017/?directConnection=true"
|
3
3
|
phases:
|
4
4
|
-
|
5
5
|
responses:
|