mongo 2.10.5 → 2.11.0.rc0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- checksums.yaml.gz.sig +0 -0
- data.tar.gz.sig +0 -0
- data/CONTRIBUTING.md +1 -1
- data/lib/mongo.rb +2 -0
- data/lib/mongo/address.rb +4 -0
- data/lib/mongo/address/validator.rb +99 -0
- data/lib/mongo/auth.rb +7 -2
- data/lib/mongo/auth/user.rb +1 -7
- data/lib/mongo/background_thread.rb +135 -0
- data/lib/mongo/bulk_write/transformable.rb +3 -3
- data/lib/mongo/client.rb +74 -16
- data/lib/mongo/cluster.rb +193 -41
- data/lib/mongo/cluster/periodic_executor.rb +31 -43
- data/lib/mongo/cluster/sdam_flow.rb +26 -3
- data/lib/mongo/cluster/srv_monitor.rb +127 -0
- data/lib/mongo/collection/view/readable.rb +3 -5
- data/lib/mongo/collection/view/writable.rb +3 -3
- data/lib/mongo/cursor/builder/get_more_command.rb +1 -4
- data/lib/mongo/cursor/builder/kill_cursors_command.rb +5 -23
- data/lib/mongo/cursor/builder/op_get_more.rb +2 -2
- data/lib/mongo/cursor/builder/op_kill_cursors.rb +5 -24
- data/lib/mongo/error.rb +1 -0
- data/lib/mongo/error/auth_error.rb +1 -1
- data/lib/mongo/error/connection_check_out_timeout.rb +7 -8
- data/lib/mongo/error/invalid_address.rb +24 -0
- data/lib/mongo/error/notable.rb +2 -2
- data/lib/mongo/error/operation_failure.rb +3 -3
- data/lib/mongo/error/pool_closed_error.rb +11 -4
- data/lib/mongo/event.rb +1 -1
- data/lib/mongo/grid/file.rb +0 -5
- data/lib/mongo/grid/file/chunk.rb +0 -2
- data/lib/mongo/grid/fs_bucket.rb +13 -15
- data/lib/mongo/grid/stream/write.rb +3 -9
- data/lib/mongo/loggable.rb +5 -1
- data/lib/mongo/monitoring.rb +1 -0
- data/lib/mongo/monitoring/event/cmap/connection_check_out_failed.rb +7 -0
- data/lib/mongo/monitoring/event/cmap/connection_checked_in.rb +11 -3
- data/lib/mongo/monitoring/event/cmap/connection_checked_out.rb +11 -3
- data/lib/mongo/monitoring/event/cmap/pool_closed.rb +11 -3
- data/lib/mongo/monitoring/event/cmap/pool_created.rb +12 -3
- data/lib/mongo/monitoring/unified_sdam_log_subscriber.rb +62 -0
- data/lib/mongo/operation/shared/executable.rb +5 -10
- data/lib/mongo/operation/shared/sessions_supported.rb +1 -5
- data/lib/mongo/protocol/get_more.rb +1 -2
- data/lib/mongo/protocol/kill_cursors.rb +13 -6
- data/lib/mongo/protocol/serializers.rb +4 -20
- data/lib/mongo/retryable.rb +9 -34
- data/lib/mongo/semaphore.rb +1 -1
- data/lib/mongo/server.rb +113 -42
- data/lib/mongo/server/connection.rb +12 -5
- data/lib/mongo/server/connection_pool.rb +250 -40
- data/lib/mongo/server/connection_pool/populator.rb +58 -0
- data/lib/mongo/server/description.rb +9 -2
- data/lib/mongo/server/monitor.rb +68 -93
- data/lib/mongo/server/monitor/connection.rb +2 -0
- data/lib/mongo/server_selector/selectable.rb +13 -5
- data/lib/mongo/session.rb +0 -13
- data/lib/mongo/srv.rb +17 -0
- data/lib/mongo/srv/monitor.rb +96 -0
- data/lib/mongo/srv/resolver.rb +130 -0
- data/lib/mongo/srv/result.rb +126 -0
- data/lib/mongo/srv/warning_result.rb +35 -0
- data/lib/mongo/uri.rb +45 -55
- data/lib/mongo/uri/srv_protocol.rb +89 -42
- data/lib/mongo/version.rb +1 -1
- data/mongo.gemspec +3 -4
- data/spec/README.md +6 -1
- data/spec/enterprise_auth/kerberos_spec.rb +7 -6
- data/spec/integration/change_stream_examples_spec.rb +0 -4
- data/spec/integration/client_construction_spec.rb +14 -2
- data/spec/integration/connect_single_rs_name_spec.rb +2 -2
- data/spec/integration/connection_pool_populator_spec.rb +296 -0
- data/spec/integration/connection_spec.rb +31 -22
- data/spec/integration/cursor_reaping_spec.rb +1 -2
- data/spec/integration/docs_examples_spec.rb +0 -4
- data/spec/integration/heartbeat_events_spec.rb +17 -15
- data/spec/integration/reconnect_spec.rb +144 -1
- data/spec/integration/retryable_writes_errors_spec.rb +0 -4
- data/spec/integration/retryable_writes_spec.rb +36 -36
- data/spec/integration/sdam_error_handling_spec.rb +31 -25
- data/spec/integration/sdam_events_spec.rb +2 -6
- data/spec/integration/server_monitor_spec.rb +28 -0
- data/spec/integration/server_selector_spec.rb +7 -5
- data/spec/integration/srv_monitoring_spec.rb +360 -0
- data/spec/integration/step_down_spec.rb +4 -6
- data/spec/lite_spec_helper.rb +22 -0
- data/spec/mongo/address/validator_spec.rb +51 -0
- data/spec/mongo/auth/cr_spec.rb +1 -29
- data/spec/mongo/auth/ldap_spec.rb +1 -29
- data/spec/mongo/auth/scram/conversation_spec.rb +0 -2
- data/spec/mongo/auth/scram/negotiation_spec.rb +1 -1
- data/spec/mongo/auth/scram_spec.rb +1 -29
- data/spec/mongo/auth/user/view_spec.rb +1 -36
- data/spec/mongo/auth/user_spec.rb +0 -12
- data/spec/mongo/auth/x509_spec.rb +1 -29
- data/spec/mongo/bulk_write_spec.rb +2 -2
- data/spec/mongo/client_construction_spec.rb +56 -15
- data/spec/mongo/client_spec.rb +31 -27
- data/spec/mongo/cluster/periodic_executor_spec.rb +16 -0
- data/spec/mongo/cluster/srv_monitor_spec.rb +214 -0
- data/spec/mongo/cluster/topology/replica_set_spec.rb +16 -11
- data/spec/mongo/cluster/topology/sharded_spec.rb +12 -9
- data/spec/mongo/cluster/topology/single_spec.rb +20 -11
- data/spec/mongo/cluster_spec.rb +45 -29
- data/spec/mongo/collection/view/map_reduce_spec.rb +14 -9
- data/spec/mongo/collection/view/readable_spec.rb +0 -16
- data/spec/mongo/collection_spec.rb +0 -44
- data/spec/mongo/cursor/builder/get_more_command_spec.rb +2 -4
- data/spec/mongo/cursor/builder/op_get_more_spec.rb +2 -4
- data/spec/mongo/cursor_spec.rb +27 -7
- data/spec/mongo/monitoring/event/cmap/connection_checked_in_spec.rb +10 -3
- data/spec/mongo/monitoring/event/cmap/connection_checked_out_spec.rb +10 -3
- data/spec/mongo/monitoring/event/cmap/pool_closed_spec.rb +10 -3
- data/spec/mongo/monitoring/event/cmap/pool_created_spec.rb +10 -3
- data/spec/mongo/operation/delete/op_msg_spec.rb +17 -8
- data/spec/mongo/operation/insert/op_msg_spec.rb +50 -35
- data/spec/mongo/operation/update/op_msg_spec.rb +14 -7
- data/spec/mongo/retryable_spec.rb +52 -31
- data/spec/mongo/server/app_metadata_spec.rb +0 -8
- data/spec/mongo/server/connection_auth_spec.rb +5 -2
- data/spec/mongo/server/connection_pool/populator_spec.rb +101 -0
- data/spec/mongo/server/connection_pool_spec.rb +256 -107
- data/spec/mongo/server/connection_spec.rb +22 -33
- data/spec/mongo/server/description_spec.rb +42 -4
- data/spec/mongo/server/monitor/connection_spec.rb +22 -11
- data/spec/mongo/server/monitor_spec.rb +66 -107
- data/spec/mongo/server_spec.rb +82 -60
- data/spec/mongo/session/session_pool_spec.rb +1 -5
- data/spec/mongo/session_spec.rb +0 -4
- data/spec/mongo/socket/ssl_spec.rb +2 -2
- data/spec/mongo/srv/monitor_spec.rb +211 -0
- data/spec/mongo/srv/result_spec.rb +54 -0
- data/spec/mongo/uri/srv_protocol_spec.rb +30 -15
- data/spec/mongo/uri_spec.rb +125 -4
- data/spec/spec_helper.rb +6 -0
- data/spec/spec_tests/auth_spec.rb +39 -0
- data/spec/spec_tests/cmap_spec.rb +55 -8
- data/spec/spec_tests/connection_string_spec.rb +6 -31
- data/spec/spec_tests/data/auth/connection-string.yml +297 -0
- data/spec/spec_tests/data/cmap/pool-checkout-error-closed.yml +4 -1
- data/spec/spec_tests/data/cmap/pool-create-with-options.yml +1 -0
- data/spec/spec_tests/data/command_monitoring/insertMany.yml +1 -1
- data/spec/spec_tests/data/connection_string/invalid-uris.yml +20 -0
- data/spec/spec_tests/data/connection_string/valid-auth.yml +16 -0
- data/spec/spec_tests/data/connection_string/valid-warnings.yml +26 -30
- data/spec/spec_tests/data/transactions/abort.yml +3 -3
- data/spec/spec_tests/data/transactions/error-labels.yml +3 -3
- data/spec/spec_tests/data/transactions_api/callback-retry.yml +3 -3
- data/spec/spec_tests/data/uri_options/auth-options.yml +1 -1
- data/spec/spec_tests/max_staleness_spec.rb +7 -2
- data/spec/spec_tests/retryable_reads_spec.rb +0 -31
- data/spec/spec_tests/sdam_monitoring_spec.rb +12 -12
- data/spec/spec_tests/sdam_spec.rb +4 -7
- data/spec/spec_tests/server_selection_spec.rb +6 -2
- data/spec/spec_tests/transactions_spec.rb +0 -2
- data/spec/spec_tests/uri_options_spec.rb +4 -2
- data/spec/stress/connection_pool_stress_spec.rb +203 -0
- data/spec/stress/connection_pool_timing_spec.rb +181 -0
- data/spec/support/auth.rb +113 -0
- data/spec/support/background_thread_registry.rb +63 -0
- data/spec/support/client_registry.rb +11 -2
- data/spec/support/cluster_config.rb +65 -46
- data/spec/support/cluster_tools.rb +2 -2
- data/spec/support/cmap.rb +13 -14
- data/spec/support/cmap/verifier.rb +4 -5
- data/spec/support/command_monitoring.rb +0 -5
- data/spec/support/common_shortcuts.rb +101 -1
- data/spec/support/constraints.rb +25 -0
- data/spec/support/dns.rb +13 -0
- data/spec/support/event_subscriber.rb +0 -7
- data/spec/support/json_ext_formatter.rb +5 -1
- data/spec/support/lite_constraints.rb +22 -6
- data/spec/support/local_resource_registry.rb +34 -0
- data/spec/support/sdam_monitoring.rb +115 -0
- data/spec/support/spec_config.rb +20 -6
- data/spec/support/spec_setup.rb +2 -2
- data/spec/support/transactions.rb +1 -1
- data/spec/support/transactions/test.rb +1 -1
- data/spec/support/utils.rb +1 -16
- metadata +685 -659
- metadata.gz.sig +0 -0
- data/lib/mongo/event/description_changed.rb +0 -52
- data/spec/integration/bson_symbol_spec.rb +0 -34
- data/spec/integration/crud_spec.rb +0 -45
- data/spec/integration/get_more_spec.rb +0 -32
- data/spec/integration/grid_fs_bucket_spec.rb +0 -48
- data/spec/integration/retryable_errors_spec.rb +0 -265
- data/spec/integration/size_limit_spec.rb~12e1e9c4f... RUBY-2242 Fix zlib compression (#2021) +0 -98
- data/spec/mongo/cursor/builder/op_kill_cursors_spec.rb +0 -56
- data/spec/runners/sdam/verifier.rb +0 -88
@@ -0,0 +1,54 @@
|
|
1
|
+
require 'lite_spec_helper'
|
2
|
+
|
3
|
+
describe Mongo::Srv::Result do
|
4
|
+
let(:result) do
|
5
|
+
described_class.new('bar.com')
|
6
|
+
end
|
7
|
+
|
8
|
+
describe '#add_record' do
|
9
|
+
context 'when incoming hostname is in mixed case' do
|
10
|
+
let(:record) do
|
11
|
+
double('record').tap do |record|
|
12
|
+
allow(record).to receive(:target).and_return('FOO.bar.COM')
|
13
|
+
allow(record).to receive(:port).and_return(42)
|
14
|
+
allow(record).to receive(:ttl).and_return(1)
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
it 'stores hostname in lower case' do
|
19
|
+
result.add_record(record)
|
20
|
+
expect(result.address_strs).to eq(['foo.bar.com:42'])
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
describe '#normalize_hostname' do
|
26
|
+
let(:actual) do
|
27
|
+
result.send(:normalize_hostname, hostname)
|
28
|
+
end
|
29
|
+
|
30
|
+
context 'when hostname is in mixed case' do
|
31
|
+
let(:hostname) { 'FOO.bar.COM' }
|
32
|
+
|
33
|
+
it 'converts to lower case' do
|
34
|
+
expect(actual).to eq('foo.bar.com')
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
context 'when hostname has one trailing dot' do
|
39
|
+
let(:hostname) { 'foo.' }
|
40
|
+
|
41
|
+
it 'removes the trailing dot' do
|
42
|
+
expect(actual).to eq('foo')
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
context 'when hostname has multiple trailing dots' do
|
47
|
+
let(:hostname) { 'foo..' }
|
48
|
+
|
49
|
+
it 'returns hostname unchanged' do
|
50
|
+
expect(actual).to eq('foo..')
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
@@ -1,4 +1,4 @@
|
|
1
|
-
require '
|
1
|
+
require 'spec_helper'
|
2
2
|
|
3
3
|
describe Mongo::URI::SRVProtocol do
|
4
4
|
clean_slate_for_all
|
@@ -588,7 +588,11 @@ describe Mongo::URI::SRVProtocol do
|
|
588
588
|
end
|
589
589
|
|
590
590
|
context 'auth mechanism provided' do
|
591
|
-
let(:options)
|
591
|
+
let(:options) { "authMechanism=#{mechanism}" }
|
592
|
+
let(:string) { "#{scheme}#{credentials}@#{servers}/?#{options}" }
|
593
|
+
let(:user) { 'tyler' }
|
594
|
+
let(:password) { 's3kr4t' }
|
595
|
+
let(:credentials) { "#{user}:#{password}" }
|
592
596
|
|
593
597
|
context 'plain' do
|
594
598
|
let(:mechanism) { 'PLAIN' }
|
@@ -603,7 +607,8 @@ describe Mongo::URI::SRVProtocol do
|
|
603
607
|
end
|
604
608
|
|
605
609
|
it 'is case-insensitive' do
|
606
|
-
|
610
|
+
client = new_local_client_nmio(string.downcase)
|
611
|
+
expect(client.options[:auth_mech]).to eq(expected)
|
607
612
|
end
|
608
613
|
end
|
609
614
|
|
@@ -620,13 +625,17 @@ describe Mongo::URI::SRVProtocol do
|
|
620
625
|
end
|
621
626
|
|
622
627
|
it 'is case-insensitive' do
|
623
|
-
|
628
|
+
client = new_local_client_nmio(string.downcase)
|
629
|
+
expect(client.options[:auth_mech]).to eq(expected)
|
624
630
|
end
|
625
631
|
end
|
626
632
|
|
627
633
|
context 'gssapi' do
|
634
|
+
require_mongo_kerberos
|
635
|
+
|
628
636
|
let(:mechanism) { 'GSSAPI' }
|
629
|
-
let(:expected)
|
637
|
+
let(:expected) { :gssapi }
|
638
|
+
let(:options) { "authMechanism=#{mechanism}&authSource=$external" }
|
630
639
|
|
631
640
|
it 'sets the auth mechanism to :gssapi' do
|
632
641
|
expect(uri.uri_options[:auth_mech]).to eq(expected)
|
@@ -637,7 +646,8 @@ describe Mongo::URI::SRVProtocol do
|
|
637
646
|
end
|
638
647
|
|
639
648
|
it 'is case-insensitive' do
|
640
|
-
|
649
|
+
client = new_local_client_nmio(string.downcase)
|
650
|
+
expect(client.options[:auth_mech]).to eq(expected)
|
641
651
|
end
|
642
652
|
end
|
643
653
|
|
@@ -654,13 +664,16 @@ describe Mongo::URI::SRVProtocol do
|
|
654
664
|
end
|
655
665
|
|
656
666
|
it 'is case-insensitive' do
|
657
|
-
|
667
|
+
client = new_local_client_nmio(string.downcase)
|
668
|
+
expect(client.options[:auth_mech]).to eq(expected)
|
658
669
|
end
|
659
670
|
end
|
660
671
|
|
661
672
|
context 'mongodb-x509' do
|
662
|
-
let(:
|
663
|
-
let(:
|
673
|
+
let(:options) { "authMechanism=#{mechanism}&authSource=$external" }
|
674
|
+
let(:mechanism) { 'MONGODB-X509' }
|
675
|
+
let(:expected) { :mongodb_x509 }
|
676
|
+
let(:credentials) { user }
|
664
677
|
|
665
678
|
it 'sets the auth mechanism to :mongodb_x509' do
|
666
679
|
expect(uri.uri_options[:auth_mech]).to eq(expected)
|
@@ -671,14 +684,16 @@ describe Mongo::URI::SRVProtocol do
|
|
671
684
|
end
|
672
685
|
|
673
686
|
it 'is case-insensitive' do
|
674
|
-
|
687
|
+
client = new_local_client_nmio(string.downcase)
|
688
|
+
expect(client.options[:auth_mech]).to eq(expected)
|
675
689
|
end
|
676
690
|
|
677
691
|
context 'when a username is not provided' do
|
678
|
-
|
692
|
+
let(:string) { "#{scheme}#{servers}/?#{options}" }
|
679
693
|
it 'recognizes the mechanism with no username' do
|
680
|
-
|
681
|
-
expect(
|
694
|
+
client = new_local_client_nmio(string.downcase)
|
695
|
+
expect(client.options[:auth_mech]).to eq(expected)
|
696
|
+
expect(client.options[:user]).to be_nil
|
682
697
|
end
|
683
698
|
end
|
684
699
|
end
|
@@ -947,7 +962,7 @@ describe Mongo::URI::SRVProtocol do
|
|
947
962
|
end
|
948
963
|
end
|
949
964
|
|
950
|
-
describe '#
|
965
|
+
describe '#validate_srv_hostname' do
|
951
966
|
let(:valid_hostname) do
|
952
967
|
end
|
953
968
|
|
@@ -956,7 +971,7 @@ describe Mongo::URI::SRVProtocol do
|
|
956
971
|
end
|
957
972
|
|
958
973
|
let(:validate) do
|
959
|
-
dummy_uri.send(:
|
974
|
+
dummy_uri.send(:validate_srv_hostname, hostname)
|
960
975
|
end
|
961
976
|
|
962
977
|
context 'when the hostname is valid' do
|
data/spec/mongo/uri_spec.rb
CHANGED
@@ -352,7 +352,7 @@ describe Mongo::URI do
|
|
352
352
|
let(:servers) { '%2Ftmp%2Fmongodb-27017.sock' }
|
353
353
|
|
354
354
|
it 'returns an array with the parsed server' do
|
355
|
-
expect(uri.servers).to eq([URI
|
355
|
+
expect(uri.servers).to eq([URI.unescape(servers)])
|
356
356
|
end
|
357
357
|
end
|
358
358
|
|
@@ -703,7 +703,11 @@ describe Mongo::URI do
|
|
703
703
|
end
|
704
704
|
|
705
705
|
context 'auth mechanism provided' do
|
706
|
-
let(:
|
706
|
+
let(:string) { "#{scheme}#{credentials}@#{servers}/?#{options}" }
|
707
|
+
let(:user) { 'tyler' }
|
708
|
+
let(:password) { 's3kr4t' }
|
709
|
+
let(:credentials) { "#{user}:#{password}" }
|
710
|
+
let(:options) { "authMechanism=#{mechanism}" }
|
707
711
|
|
708
712
|
context 'plain' do
|
709
713
|
let(:mechanism) { 'PLAIN' }
|
@@ -722,6 +726,16 @@ describe Mongo::URI do
|
|
722
726
|
client = new_local_client_nmio(string.downcase)
|
723
727
|
expect(client.options[:auth_mech]).to eq(expected)
|
724
728
|
end
|
729
|
+
|
730
|
+
context 'when mechanism_properties are provided' do
|
731
|
+
let(:options) { "authMechanism=#{mechanism}&authMechanismProperties=CANONICALIZE_HOST_NAME:true" }
|
732
|
+
|
733
|
+
it 'does not allow a client to be created' do
|
734
|
+
expect {
|
735
|
+
new_local_client_nmio(string)
|
736
|
+
}.to raise_error(Mongo::Auth::InvalidConfiguration, /mechanism_properties are not supported/)
|
737
|
+
end
|
738
|
+
end
|
725
739
|
end
|
726
740
|
|
727
741
|
context 'mongodb-cr' do
|
@@ -741,9 +755,21 @@ describe Mongo::URI do
|
|
741
755
|
client = new_local_client_nmio(string.downcase)
|
742
756
|
expect(client.options[:auth_mech]).to eq(expected)
|
743
757
|
end
|
758
|
+
|
759
|
+
context 'when mechanism_properties are provided' do
|
760
|
+
let(:options) { "authMechanism=#{mechanism}&authMechanismProperties=CANONICALIZE_HOST_NAME:true" }
|
761
|
+
|
762
|
+
it 'does not allow a client to be created' do
|
763
|
+
expect {
|
764
|
+
new_local_client_nmio(string)
|
765
|
+
}.to raise_error(Mongo::Auth::InvalidConfiguration, /mechanism_properties are not supported/)
|
766
|
+
end
|
767
|
+
end
|
744
768
|
end
|
745
769
|
|
746
770
|
context 'gssapi' do
|
771
|
+
require_mongo_kerberos
|
772
|
+
|
747
773
|
let(:mechanism) { 'GSSAPI' }
|
748
774
|
let(:expected) { :gssapi }
|
749
775
|
|
@@ -760,6 +786,25 @@ describe Mongo::URI do
|
|
760
786
|
client = new_local_client_nmio(string.downcase)
|
761
787
|
expect(client.options[:auth_mech]).to eq(expected)
|
762
788
|
end
|
789
|
+
|
790
|
+
context 'when auth source is invalid' do
|
791
|
+
let(:options) { "authMechanism=#{mechanism}&authSource=foo" }
|
792
|
+
|
793
|
+
it 'does not allow a client to be created' do
|
794
|
+
expect {
|
795
|
+
new_local_client_nmio(string)
|
796
|
+
}.to raise_error(Mongo::Auth::InvalidConfiguration, /invalid auth source/)
|
797
|
+
end
|
798
|
+
end
|
799
|
+
|
800
|
+
context 'when mechanism_properties are provided' do
|
801
|
+
let(:options) { "authMechanism=#{mechanism}&authMechanismProperties=SERVICE_NAME:other,CANONICALIZE_HOST_NAME:true" }
|
802
|
+
|
803
|
+
it 'sets the options on a client created with the uri' do
|
804
|
+
client = new_local_client_nmio(string)
|
805
|
+
expect(client.options[:auth_mech_properties]).to eq({ 'canonicalize_host_name' => true, 'service_name' => 'other' })
|
806
|
+
end
|
807
|
+
end
|
763
808
|
end
|
764
809
|
|
765
810
|
context 'scram-sha-1' do
|
@@ -779,11 +824,22 @@ describe Mongo::URI do
|
|
779
824
|
client = new_local_client_nmio(string.downcase)
|
780
825
|
expect(client.options[:auth_mech]).to eq(expected)
|
781
826
|
end
|
827
|
+
|
828
|
+
context 'when mechanism_properties are provided' do
|
829
|
+
let(:options) { "authMechanism=#{mechanism}&authMechanismProperties=CANONICALIZE_HOST_NAME:true" }
|
830
|
+
|
831
|
+
it 'does not allow a client to be created' do
|
832
|
+
expect {
|
833
|
+
new_local_client_nmio(string)
|
834
|
+
}.to raise_error(Mongo::Auth::InvalidConfiguration, /mechanism_properties are not supported/)
|
835
|
+
end
|
836
|
+
end
|
782
837
|
end
|
783
838
|
|
784
839
|
context 'mongodb-x509' do
|
785
840
|
let(:mechanism) { 'MONGODB-X509' }
|
786
|
-
let(:expected)
|
841
|
+
let(:expected) { :mongodb_x509 }
|
842
|
+
let(:credentials) { user }
|
787
843
|
|
788
844
|
it 'sets the auth mechanism to :mongodb_x509' do
|
789
845
|
expect(uri.uri_options[:auth_mech]).to eq(expected)
|
@@ -799,7 +855,18 @@ describe Mongo::URI do
|
|
799
855
|
expect(client.options[:auth_mech]).to eq(expected)
|
800
856
|
end
|
801
857
|
|
858
|
+
context 'when auth source is invalid' do
|
859
|
+
let(:options) { "authMechanism=#{mechanism}&authSource=foo" }
|
860
|
+
|
861
|
+
it 'does not allow a client to be created' do
|
862
|
+
expect {
|
863
|
+
new_local_client_nmio(string)
|
864
|
+
}.to raise_error(Mongo::Auth::InvalidConfiguration, /invalid auth source/)
|
865
|
+
end
|
866
|
+
end
|
867
|
+
|
802
868
|
context 'when a username is not provided' do
|
869
|
+
let(:string) { "#{scheme}#{servers}/?#{options}" }
|
803
870
|
|
804
871
|
it 'recognizes the mechanism with no username' do
|
805
872
|
client = new_local_client_nmio(string.downcase)
|
@@ -807,6 +874,61 @@ describe Mongo::URI do
|
|
807
874
|
expect(client.options[:user]).to be_nil
|
808
875
|
end
|
809
876
|
end
|
877
|
+
|
878
|
+
context 'when a password is provided' do
|
879
|
+
let(:credentials) { "#{user}:#{password}"}
|
880
|
+
let(:password) { 's3kr4t' }
|
881
|
+
|
882
|
+
it 'does not allow a client to be created' do
|
883
|
+
expect {
|
884
|
+
new_local_client_nmio(string)
|
885
|
+
}.to raise_error(Mongo::Auth::InvalidConfiguration, /password is not supported/)
|
886
|
+
end
|
887
|
+
end
|
888
|
+
|
889
|
+
context 'when mechanism_properties are provided' do
|
890
|
+
let(:options) { "authMechanism=#{mechanism}&authMechanismProperties=CANONICALIZE_HOST_NAME:true" }
|
891
|
+
|
892
|
+
it 'does not allow a client to be created' do
|
893
|
+
expect {
|
894
|
+
new_local_client_nmio(string)
|
895
|
+
}.to raise_error(Mongo::Auth::InvalidConfiguration, /mechanism_properties are not supported/)
|
896
|
+
end
|
897
|
+
end
|
898
|
+
end
|
899
|
+
end
|
900
|
+
|
901
|
+
context 'auth mechanism is not provided' do
|
902
|
+
let(:string) { "#{scheme}#{credentials}@#{servers}/" }
|
903
|
+
|
904
|
+
context 'with no credentials' do
|
905
|
+
let(:string) { "#{scheme}#{servers}/" }
|
906
|
+
|
907
|
+
it 'sets user and password as nil' do
|
908
|
+
expect(uri.credentials[:user]).to be_nil
|
909
|
+
expect(uri.credentials[:password]).to be_nil
|
910
|
+
end
|
911
|
+
|
912
|
+
it 'sets the options on a client created with the uri' do
|
913
|
+
client = new_local_client_nmio(string)
|
914
|
+
expect(client.options[:user]).to be_nil
|
915
|
+
expect(client.options[:password]).to be_nil
|
916
|
+
end
|
917
|
+
end
|
918
|
+
|
919
|
+
context 'with empty credentials' do
|
920
|
+
let(:credentials) { '' }
|
921
|
+
|
922
|
+
it 'sets user as an empty string and password as nil' do
|
923
|
+
expect(uri.credentials[:user]).to eq('')
|
924
|
+
expect(uri.credentials[:password]).to be_nil
|
925
|
+
end
|
926
|
+
|
927
|
+
it 'does not allow a client to be created with default auth mechanism' do
|
928
|
+
expect {
|
929
|
+
new_local_client_nmio(string)
|
930
|
+
}.to raise_error(Mongo::Auth::InvalidConfiguration, /empty username is not supported/)
|
931
|
+
end
|
810
932
|
end
|
811
933
|
end
|
812
934
|
|
@@ -847,7 +969,6 @@ describe Mongo::URI do
|
|
847
969
|
let(:options) do
|
848
970
|
"authMechanismProperties=SERVICE_NAME:#{service_name}"
|
849
971
|
end
|
850
|
-
|
851
972
|
let(:service_name) { 'foo' }
|
852
973
|
let(:expected) { Mongo::Options::Redacted.new({ service_name: service_name }) }
|
853
974
|
|
data/spec/spec_helper.rb
CHANGED
@@ -12,6 +12,7 @@ require 'support/cluster_config'
|
|
12
12
|
require 'support/cluster_tools'
|
13
13
|
require 'rspec/retry'
|
14
14
|
require 'support/monitoring_ext'
|
15
|
+
require 'support/local_resource_registry'
|
15
16
|
|
16
17
|
RSpec.configure do |config|
|
17
18
|
config.include(Authorization)
|
@@ -22,6 +23,11 @@ RSpec.configure do |config|
|
|
22
23
|
kill_all_server_sessions
|
23
24
|
end
|
24
25
|
end
|
26
|
+
|
27
|
+
config.after do
|
28
|
+
LocalResourceRegistry.instance.close_all
|
29
|
+
ClientRegistry.instance.close_local_clients
|
30
|
+
end
|
25
31
|
end
|
26
32
|
|
27
33
|
# require all shared examples
|
@@ -0,0 +1,39 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe 'Auth' do
|
4
|
+
include Mongo::Auth
|
5
|
+
|
6
|
+
AUTH_TESTS.each do |file|
|
7
|
+
spec = Mongo::Auth::Spec.new(file)
|
8
|
+
|
9
|
+
context(spec.description) do
|
10
|
+
spec.tests.each_with_index do |test, index|
|
11
|
+
context test.description do
|
12
|
+
if test.description.downcase.include?("gssapi")
|
13
|
+
require_mongo_kerberos
|
14
|
+
end
|
15
|
+
|
16
|
+
context 'when the auth configuration is invalid', unless: test.valid? do
|
17
|
+
it 'raises an error' do
|
18
|
+
expect {
|
19
|
+
test.client
|
20
|
+
}.to raise_error(Mongo::Auth::InvalidConfiguration)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
context 'when the auth configuration is valid' do
|
25
|
+
context 'with empty credentials', if: test.valid? && test.credential.nil? do
|
26
|
+
it 'creates a client with no credential information' do
|
27
|
+
expect(test.client).to have_blank_credentials
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
it 'creates a client with the correct credentials', if: test.valid? && test.credential do
|
32
|
+
expect(test.received_credential).to eq(test.expected_credential)
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
@@ -1,6 +1,10 @@
|
|
1
|
-
require '
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
# Temporary scopes in all of the tests are needed to exclude endSessions
|
4
|
+
# commands being sent during cleanup from interfering with assertions.
|
2
5
|
|
3
6
|
describe 'Cmap' do
|
7
|
+
clean_slate
|
4
8
|
|
5
9
|
declare_topology_double
|
6
10
|
|
@@ -8,21 +12,58 @@ describe 'Cmap' do
|
|
8
12
|
double('cluster').tap do |cl|
|
9
13
|
allow(cl).to receive(:topology).and_return(topology)
|
10
14
|
allow(cl).to receive(:options).and_return({})
|
15
|
+
allow(cl).to receive(:app_metadata).and_return(Mongo::Server::AppMetadata.new({}))
|
16
|
+
allow(cl).to receive(:run_sdam_flow)
|
17
|
+
allow(cl).to receive(:update_cluster_time)
|
18
|
+
allow(cl).to receive(:cluster_time).and_return(nil)
|
11
19
|
end
|
12
20
|
end
|
13
21
|
|
22
|
+
let(:options) do
|
23
|
+
SpecConfig.instance.ssl_options.merge(SpecConfig.instance.compressor_options)
|
24
|
+
.merge(SpecConfig.instance.retry_writes_options).merge(SpecConfig.instance.auth_options)
|
25
|
+
.merge(monitoring_io: false)
|
26
|
+
end
|
27
|
+
|
14
28
|
CMAP_TESTS.each do |file|
|
15
29
|
spec = Mongo::Cmap::Spec.new(file)
|
16
30
|
|
17
31
|
context("#{spec.description} (#{file.sub(%r'.*/data/cmap/', '')})") do
|
32
|
+
|
18
33
|
before do
|
19
|
-
|
34
|
+
subscriber = EventSubscriber.new
|
35
|
+
|
36
|
+
monitoring = Mongo::Monitoring.new(monitoring: false)
|
37
|
+
monitoring.subscribe(Mongo::Monitoring::CONNECTION_POOL, subscriber)
|
38
|
+
|
39
|
+
@server = register_server(
|
40
|
+
Mongo::Server.new(
|
41
|
+
ClusterConfig.instance.primary_address,
|
42
|
+
cluster,
|
43
|
+
monitoring,
|
44
|
+
Mongo::Event::Listeners.new,
|
45
|
+
options.merge(spec.pool_options)
|
46
|
+
).tap do |server|
|
47
|
+
allow(server).to receive(:description).and_return(ClusterConfig.instance.primary_description)
|
48
|
+
end
|
49
|
+
)
|
50
|
+
spec.setup(@server, subscriber)
|
51
|
+
end
|
52
|
+
|
53
|
+
after do
|
54
|
+
if @server && (pool = @server.instance_variable_get('@pool'))
|
55
|
+
begin
|
56
|
+
pool.disconnect!
|
57
|
+
rescue Mongo::Error::PoolClosedError
|
58
|
+
end
|
59
|
+
end
|
20
60
|
end
|
21
61
|
|
22
62
|
let!(:result) do
|
23
|
-
|
24
|
-
allow(
|
25
|
-
|
63
|
+
socket = double('fake socket')
|
64
|
+
allow(socket).to receive(:close)
|
65
|
+
|
66
|
+
allow_any_instance_of(Mongo::Server::Connection).to receive(:do_connect).and_return(socket)
|
26
67
|
spec.run
|
27
68
|
end
|
28
69
|
|
@@ -31,18 +72,24 @@ describe 'Cmap' do
|
|
31
72
|
end
|
32
73
|
|
33
74
|
it 'raises the correct error' do
|
34
|
-
|
75
|
+
RSpec::Mocks.with_temporary_scope do
|
76
|
+
expect(result['error']).to eq(spec.expected_error)
|
77
|
+
end
|
35
78
|
end
|
36
79
|
|
37
80
|
let(:actual_events) { result['events'].freeze }
|
38
81
|
|
39
82
|
it 'emits the correct number of events' do
|
40
|
-
|
83
|
+
RSpec::Mocks.with_temporary_scope do
|
84
|
+
expect(actual_events.length).to eq(spec.expected_events.length)
|
85
|
+
end
|
41
86
|
end
|
42
87
|
|
43
88
|
spec.expected_events.each_with_index do |expected_event, index|
|
44
89
|
it "emits correct event #{index+1}" do
|
45
|
-
|
90
|
+
RSpec::Mocks.with_temporary_scope do
|
91
|
+
verifier.verify_hashes(actual_events[index], expected_event)
|
92
|
+
end
|
46
93
|
end
|
47
94
|
end
|
48
95
|
end
|