OLD | NEW |
1 /* | 1 /* |
2 * Copyright 2009 The WebRTC Project Authors. All rights reserved. | 2 * Copyright 2009 The WebRTC Project Authors. All rights reserved. |
3 * | 3 * |
4 * Use of this source code is governed by a BSD-style license | 4 * Use of this source code is governed by a BSD-style license |
5 * that can be found in the LICENSE file in the root of the source | 5 * that can be found in the LICENSE file in the root of the source |
6 * tree. An additional intellectual property rights grant can be found | 6 * tree. An additional intellectual property rights grant can be found |
7 * in the file PATENTS. All contributing project authors may | 7 * in the file PATENTS. All contributing project authors may |
8 * be found in the AUTHORS file in the root of the source tree. | 8 * be found in the AUTHORS file in the root of the source tree. |
9 */ | 9 */ |
10 | 10 |
(...skipping 626 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
637 for (size_t i = 0; i < candidates_.size(); ++i) { | 637 for (size_t i = 0; i < candidates_.size(); ++i) { |
638 EXPECT_EQ(std::string(cricket::RELAY_PORT_TYPE), candidates_[i].type()); | 638 EXPECT_EQ(std::string(cricket::RELAY_PORT_TYPE), candidates_[i].type()); |
639 EXPECT_EQ( | 639 EXPECT_EQ( |
640 candidates_[0].related_address(), | 640 candidates_[0].related_address(), |
641 rtc::EmptySocketAddressWithFamily(candidates_[0].address().family())); | 641 rtc::EmptySocketAddressWithFamily(candidates_[0].address().family())); |
642 } | 642 } |
643 } | 643 } |
644 | 644 |
645 TEST_F(PortAllocatorTest, TestCandidateFilterWithHostOnly) { | 645 TEST_F(PortAllocatorTest, TestCandidateFilterWithHostOnly) { |
646 AddInterface(kClientAddr); | 646 AddInterface(kClientAddr); |
647 allocator().set_flags(cricket::PORTALLOCATOR_ENABLE_SHARED_UFRAG | | 647 allocator().set_flags(cricket::PORTALLOCATOR_ENABLE_SHARED_SOCKET); |
648 cricket::PORTALLOCATOR_ENABLE_SHARED_SOCKET); | |
649 allocator().set_candidate_filter(cricket::CF_HOST); | 648 allocator().set_candidate_filter(cricket::CF_HOST); |
650 EXPECT_TRUE(CreateSession(cricket::ICE_CANDIDATE_COMPONENT_RTP)); | 649 EXPECT_TRUE(CreateSession(cricket::ICE_CANDIDATE_COMPONENT_RTP)); |
651 session_->StartGettingPorts(); | 650 session_->StartGettingPorts(); |
652 EXPECT_TRUE_WAIT(candidate_allocation_done_, kDefaultAllocationTimeout); | 651 EXPECT_TRUE_WAIT(candidate_allocation_done_, kDefaultAllocationTimeout); |
653 EXPECT_EQ(2U, candidates_.size()); // Host UDP/TCP candidates only. | 652 EXPECT_EQ(2U, candidates_.size()); // Host UDP/TCP candidates only. |
654 EXPECT_EQ(2U, ports_.size()); // UDP/TCP ports only. | 653 EXPECT_EQ(2U, ports_.size()); // UDP/TCP ports only. |
655 for (size_t i = 0; i < candidates_.size(); ++i) { | 654 for (size_t i = 0; i < candidates_.size(); ++i) { |
656 EXPECT_EQ(std::string(cricket::LOCAL_PORT_TYPE), candidates_[i].type()); | 655 EXPECT_EQ(std::string(cricket::LOCAL_PORT_TYPE), candidates_[i].type()); |
657 } | 656 } |
658 } | 657 } |
659 | 658 |
660 // Host is behind the NAT. | 659 // Host is behind the NAT. |
661 TEST_F(PortAllocatorTest, TestCandidateFilterWithReflexiveOnly) { | 660 TEST_F(PortAllocatorTest, TestCandidateFilterWithReflexiveOnly) { |
662 AddInterface(kPrivateAddr); | 661 AddInterface(kPrivateAddr); |
663 ResetWithNatServer(kStunAddr); | 662 ResetWithNatServer(kStunAddr); |
664 | 663 |
665 allocator().set_flags(cricket::PORTALLOCATOR_ENABLE_SHARED_UFRAG | | 664 allocator().set_flags(cricket::PORTALLOCATOR_ENABLE_SHARED_SOCKET); |
666 cricket::PORTALLOCATOR_ENABLE_SHARED_SOCKET); | |
667 allocator().set_candidate_filter(cricket::CF_REFLEXIVE); | 665 allocator().set_candidate_filter(cricket::CF_REFLEXIVE); |
668 EXPECT_TRUE(CreateSession(cricket::ICE_CANDIDATE_COMPONENT_RTP)); | 666 EXPECT_TRUE(CreateSession(cricket::ICE_CANDIDATE_COMPONENT_RTP)); |
669 session_->StartGettingPorts(); | 667 session_->StartGettingPorts(); |
670 EXPECT_TRUE_WAIT(candidate_allocation_done_, kDefaultAllocationTimeout); | 668 EXPECT_TRUE_WAIT(candidate_allocation_done_, kDefaultAllocationTimeout); |
671 // Host is behind NAT, no private address will be exposed. Hence only UDP | 669 // Host is behind NAT, no private address will be exposed. Hence only UDP |
672 // port with STUN candidate will be sent outside. | 670 // port with STUN candidate will be sent outside. |
673 EXPECT_EQ(1U, candidates_.size()); // Only STUN candidate. | 671 EXPECT_EQ(1U, candidates_.size()); // Only STUN candidate. |
674 EXPECT_EQ(1U, ports_.size()); // Only UDP port will be in ready state. | 672 EXPECT_EQ(1U, ports_.size()); // Only UDP port will be in ready state. |
675 for (size_t i = 0; i < candidates_.size(); ++i) { | 673 for (size_t i = 0; i < candidates_.size(); ++i) { |
676 EXPECT_EQ(std::string(cricket::STUN_PORT_TYPE), candidates_[i].type()); | 674 EXPECT_EQ(std::string(cricket::STUN_PORT_TYPE), candidates_[i].type()); |
677 EXPECT_EQ( | 675 EXPECT_EQ( |
678 candidates_[0].related_address(), | 676 candidates_[0].related_address(), |
679 rtc::EmptySocketAddressWithFamily(candidates_[0].address().family())); | 677 rtc::EmptySocketAddressWithFamily(candidates_[0].address().family())); |
680 } | 678 } |
681 } | 679 } |
682 | 680 |
683 // Host is not behind the NAT. | 681 // Host is not behind the NAT. |
684 TEST_F(PortAllocatorTest, TestCandidateFilterWithReflexiveOnlyAndNoNAT) { | 682 TEST_F(PortAllocatorTest, TestCandidateFilterWithReflexiveOnlyAndNoNAT) { |
685 AddInterface(kClientAddr); | 683 AddInterface(kClientAddr); |
686 allocator().set_flags(cricket::PORTALLOCATOR_ENABLE_SHARED_UFRAG | | 684 allocator().set_flags(cricket::PORTALLOCATOR_ENABLE_SHARED_SOCKET); |
687 cricket::PORTALLOCATOR_ENABLE_SHARED_SOCKET); | |
688 allocator().set_candidate_filter(cricket::CF_REFLEXIVE); | 685 allocator().set_candidate_filter(cricket::CF_REFLEXIVE); |
689 EXPECT_TRUE(CreateSession(cricket::ICE_CANDIDATE_COMPONENT_RTP)); | 686 EXPECT_TRUE(CreateSession(cricket::ICE_CANDIDATE_COMPONENT_RTP)); |
690 session_->StartGettingPorts(); | 687 session_->StartGettingPorts(); |
691 EXPECT_TRUE_WAIT(candidate_allocation_done_, kDefaultAllocationTimeout); | 688 EXPECT_TRUE_WAIT(candidate_allocation_done_, kDefaultAllocationTimeout); |
692 // Host has a public address, both UDP and TCP candidates will be exposed. | 689 // Host has a public address, both UDP and TCP candidates will be exposed. |
693 EXPECT_EQ(2U, candidates_.size()); // Local UDP + TCP candidate. | 690 EXPECT_EQ(2U, candidates_.size()); // Local UDP + TCP candidate. |
694 EXPECT_EQ(2U, ports_.size()); // UDP and TCP ports will be in ready state. | 691 EXPECT_EQ(2U, ports_.size()); // UDP and TCP ports will be in ready state. |
695 for (size_t i = 0; i < candidates_.size(); ++i) { | 692 for (size_t i = 0; i < candidates_.size(); ++i) { |
696 EXPECT_EQ(std::string(cricket::LOCAL_PORT_TYPE), candidates_[i].type()); | 693 EXPECT_EQ(std::string(cricket::LOCAL_PORT_TYPE), candidates_[i].type()); |
697 } | 694 } |
698 } | 695 } |
699 | 696 |
700 // Test that when the PORTALLOCATOR_ENABLE_SHARED_UFRAG is enabled we got same | 697 // Test that we get the same ufrag and pwd for all candidates. |
701 // ufrag and pwd for the collected candidates. | |
702 TEST_F(PortAllocatorTest, TestEnableSharedUfrag) { | 698 TEST_F(PortAllocatorTest, TestEnableSharedUfrag) { |
703 allocator().set_flags(allocator().flags() | | |
704 cricket::PORTALLOCATOR_ENABLE_SHARED_UFRAG); | |
705 AddInterface(kClientAddr); | 699 AddInterface(kClientAddr); |
706 EXPECT_TRUE(CreateSession(cricket::ICE_CANDIDATE_COMPONENT_RTP)); | 700 EXPECT_TRUE(CreateSession(cricket::ICE_CANDIDATE_COMPONENT_RTP)); |
707 session_->StartGettingPorts(); | 701 session_->StartGettingPorts(); |
708 ASSERT_EQ_WAIT(7U, candidates_.size(), kDefaultAllocationTimeout); | 702 ASSERT_EQ_WAIT(7U, candidates_.size(), kDefaultAllocationTimeout); |
709 EXPECT_PRED5(CheckCandidate, candidates_[0], | 703 EXPECT_PRED5(CheckCandidate, candidates_[0], |
710 cricket::ICE_CANDIDATE_COMPONENT_RTP, "local", "udp", kClientAddr); | 704 cricket::ICE_CANDIDATE_COMPONENT_RTP, "local", "udp", kClientAddr); |
711 EXPECT_PRED5(CheckCandidate, candidates_[1], | 705 EXPECT_PRED5(CheckCandidate, candidates_[1], |
712 cricket::ICE_CANDIDATE_COMPONENT_RTP, "stun", "udp", kClientAddr); | 706 cricket::ICE_CANDIDATE_COMPONENT_RTP, "stun", "udp", kClientAddr); |
713 EXPECT_PRED5(CheckCandidate, candidates_[5], | 707 EXPECT_PRED5(CheckCandidate, candidates_[5], |
714 cricket::ICE_CANDIDATE_COMPONENT_RTP, "local", "tcp", kClientAddr); | 708 cricket::ICE_CANDIDATE_COMPONENT_RTP, "local", "tcp", kClientAddr); |
715 EXPECT_EQ(4U, ports_.size()); | 709 EXPECT_EQ(4U, ports_.size()); |
716 EXPECT_EQ(kIceUfrag0, candidates_[0].username()); | 710 EXPECT_EQ(kIceUfrag0, candidates_[0].username()); |
717 EXPECT_EQ(kIceUfrag0, candidates_[1].username()); | 711 EXPECT_EQ(kIceUfrag0, candidates_[1].username()); |
718 EXPECT_EQ(kIceUfrag0, candidates_[2].username()); | 712 EXPECT_EQ(kIceUfrag0, candidates_[2].username()); |
719 EXPECT_EQ(kIcePwd0, candidates_[0].password()); | 713 EXPECT_EQ(kIcePwd0, candidates_[0].password()); |
720 EXPECT_EQ(kIcePwd0, candidates_[1].password()); | 714 EXPECT_EQ(kIcePwd0, candidates_[1].password()); |
721 EXPECT_TRUE(candidate_allocation_done_); | 715 EXPECT_TRUE(candidate_allocation_done_); |
722 } | 716 } |
723 | 717 |
724 // Test that when the PORTALLOCATOR_ENABLE_SHARED_UFRAG isn't enabled we got | |
725 // different ufrag and pwd for the collected candidates. | |
726 TEST_F(PortAllocatorTest, TestDisableSharedUfrag) { | |
727 allocator().set_flags(allocator().flags() & | |
728 ~cricket::PORTALLOCATOR_ENABLE_SHARED_UFRAG); | |
729 AddInterface(kClientAddr); | |
730 EXPECT_TRUE(CreateSession(cricket::ICE_CANDIDATE_COMPONENT_RTP)); | |
731 session_->StartGettingPorts(); | |
732 ASSERT_EQ_WAIT(7U, candidates_.size(), kDefaultAllocationTimeout); | |
733 EXPECT_PRED5(CheckCandidate, candidates_[0], | |
734 cricket::ICE_CANDIDATE_COMPONENT_RTP, "local", "udp", kClientAddr); | |
735 EXPECT_PRED5(CheckCandidate, candidates_[1], | |
736 cricket::ICE_CANDIDATE_COMPONENT_RTP, "stun", "udp", kClientAddr); | |
737 EXPECT_EQ(4U, ports_.size()); | |
738 // Port should generate random ufrag and pwd. | |
739 EXPECT_NE(kIceUfrag0, candidates_[0].username()); | |
740 EXPECT_NE(kIceUfrag0, candidates_[1].username()); | |
741 EXPECT_NE(candidates_[0].username(), candidates_[1].username()); | |
742 EXPECT_NE(kIcePwd0, candidates_[0].password()); | |
743 EXPECT_NE(kIcePwd0, candidates_[1].password()); | |
744 EXPECT_NE(candidates_[0].password(), candidates_[1].password()); | |
745 EXPECT_TRUE(candidate_allocation_done_); | |
746 } | |
747 | |
748 // Test that when PORTALLOCATOR_ENABLE_SHARED_SOCKET is enabled only one port | 718 // Test that when PORTALLOCATOR_ENABLE_SHARED_SOCKET is enabled only one port |
749 // is allocated for udp and stun. Also verify there is only one candidate | 719 // is allocated for udp and stun. Also verify there is only one candidate |
750 // (local) if stun candidate is same as local candidate, which will be the case | 720 // (local) if stun candidate is same as local candidate, which will be the case |
751 // in a public network like the below test. | 721 // in a public network like the below test. |
752 TEST_F(PortAllocatorTest, TestSharedSocketWithoutNat) { | 722 TEST_F(PortAllocatorTest, TestSharedSocketWithoutNat) { |
753 AddInterface(kClientAddr); | 723 AddInterface(kClientAddr); |
754 allocator_->set_flags(allocator().flags() | | 724 allocator_->set_flags(allocator().flags() | |
755 cricket::PORTALLOCATOR_ENABLE_SHARED_UFRAG | | |
756 cricket::PORTALLOCATOR_ENABLE_SHARED_SOCKET); | 725 cricket::PORTALLOCATOR_ENABLE_SHARED_SOCKET); |
757 EXPECT_TRUE(CreateSession(cricket::ICE_CANDIDATE_COMPONENT_RTP)); | 726 EXPECT_TRUE(CreateSession(cricket::ICE_CANDIDATE_COMPONENT_RTP)); |
758 session_->StartGettingPorts(); | 727 session_->StartGettingPorts(); |
759 ASSERT_EQ_WAIT(6U, candidates_.size(), kDefaultAllocationTimeout); | 728 ASSERT_EQ_WAIT(6U, candidates_.size(), kDefaultAllocationTimeout); |
760 EXPECT_EQ(3U, ports_.size()); | 729 EXPECT_EQ(3U, ports_.size()); |
761 EXPECT_PRED5(CheckCandidate, candidates_[0], | 730 EXPECT_PRED5(CheckCandidate, candidates_[0], |
762 cricket::ICE_CANDIDATE_COMPONENT_RTP, "local", "udp", kClientAddr); | 731 cricket::ICE_CANDIDATE_COMPONENT_RTP, "local", "udp", kClientAddr); |
763 EXPECT_TRUE_WAIT(candidate_allocation_done_, kDefaultAllocationTimeout); | 732 EXPECT_TRUE_WAIT(candidate_allocation_done_, kDefaultAllocationTimeout); |
764 } | 733 } |
765 | 734 |
766 // Test that when PORTALLOCATOR_ENABLE_SHARED_SOCKET is enabled only one port | 735 // Test that when PORTALLOCATOR_ENABLE_SHARED_SOCKET is enabled only one port |
767 // is allocated for udp and stun. In this test we should expect both stun and | 736 // is allocated for udp and stun. In this test we should expect both stun and |
768 // local candidates as client behind a nat. | 737 // local candidates as client behind a nat. |
769 TEST_F(PortAllocatorTest, TestSharedSocketWithNat) { | 738 TEST_F(PortAllocatorTest, TestSharedSocketWithNat) { |
770 AddInterface(kClientAddr); | 739 AddInterface(kClientAddr); |
771 ResetWithNatServer(kStunAddr); | 740 ResetWithNatServer(kStunAddr); |
772 | 741 |
773 allocator_->set_flags(allocator().flags() | | 742 allocator_->set_flags(allocator().flags() | |
774 cricket::PORTALLOCATOR_ENABLE_SHARED_UFRAG | | |
775 cricket::PORTALLOCATOR_ENABLE_SHARED_SOCKET); | 743 cricket::PORTALLOCATOR_ENABLE_SHARED_SOCKET); |
776 EXPECT_TRUE(CreateSession(cricket::ICE_CANDIDATE_COMPONENT_RTP)); | 744 EXPECT_TRUE(CreateSession(cricket::ICE_CANDIDATE_COMPONENT_RTP)); |
777 session_->StartGettingPorts(); | 745 session_->StartGettingPorts(); |
778 ASSERT_EQ_WAIT(3U, candidates_.size(), kDefaultAllocationTimeout); | 746 ASSERT_EQ_WAIT(3U, candidates_.size(), kDefaultAllocationTimeout); |
779 ASSERT_EQ(2U, ports_.size()); | 747 ASSERT_EQ(2U, ports_.size()); |
780 EXPECT_PRED5(CheckCandidate, candidates_[0], | 748 EXPECT_PRED5(CheckCandidate, candidates_[0], |
781 cricket::ICE_CANDIDATE_COMPONENT_RTP, "local", "udp", kClientAddr); | 749 cricket::ICE_CANDIDATE_COMPONENT_RTP, "local", "udp", kClientAddr); |
782 EXPECT_PRED5(CheckCandidate, candidates_[1], | 750 EXPECT_PRED5(CheckCandidate, candidates_[1], |
783 cricket::ICE_CANDIDATE_COMPONENT_RTP, "stun", "udp", | 751 cricket::ICE_CANDIDATE_COMPONENT_RTP, "stun", "udp", |
784 rtc::SocketAddress(kNatUdpAddr.ipaddr(), 0)); | 752 rtc::SocketAddress(kNatUdpAddr.ipaddr(), 0)); |
785 EXPECT_TRUE_WAIT(candidate_allocation_done_, kDefaultAllocationTimeout); | 753 EXPECT_TRUE_WAIT(candidate_allocation_done_, kDefaultAllocationTimeout); |
786 EXPECT_EQ(3U, candidates_.size()); | 754 EXPECT_EQ(3U, candidates_.size()); |
787 } | 755 } |
788 | 756 |
789 // Test TURN port in shared socket mode with UDP and TCP TURN server addresses. | 757 // Test TURN port in shared socket mode with UDP and TCP TURN server addresses. |
790 TEST_F(PortAllocatorTest, TestSharedSocketWithoutNatUsingTurn) { | 758 TEST_F(PortAllocatorTest, TestSharedSocketWithoutNatUsingTurn) { |
791 turn_server_.AddInternalSocket(kTurnTcpIntAddr, cricket::PROTO_TCP); | 759 turn_server_.AddInternalSocket(kTurnTcpIntAddr, cricket::PROTO_TCP); |
792 AddInterface(kClientAddr); | 760 AddInterface(kClientAddr); |
793 allocator_.reset(new cricket::BasicPortAllocator(&network_manager_)); | 761 allocator_.reset(new cricket::BasicPortAllocator(&network_manager_)); |
794 | 762 |
795 AddTurnServers(kTurnUdpIntAddr, kTurnTcpIntAddr); | 763 AddTurnServers(kTurnUdpIntAddr, kTurnTcpIntAddr); |
796 | 764 |
797 allocator_->set_step_delay(cricket::kMinimumStepDelay); | 765 allocator_->set_step_delay(cricket::kMinimumStepDelay); |
798 allocator_->set_flags(allocator().flags() | | 766 allocator_->set_flags(allocator().flags() | |
799 cricket::PORTALLOCATOR_ENABLE_SHARED_UFRAG | | |
800 cricket::PORTALLOCATOR_ENABLE_SHARED_SOCKET | | 767 cricket::PORTALLOCATOR_ENABLE_SHARED_SOCKET | |
801 cricket::PORTALLOCATOR_DISABLE_TCP); | 768 cricket::PORTALLOCATOR_DISABLE_TCP); |
802 | 769 |
803 EXPECT_TRUE(CreateSession(cricket::ICE_CANDIDATE_COMPONENT_RTP)); | 770 EXPECT_TRUE(CreateSession(cricket::ICE_CANDIDATE_COMPONENT_RTP)); |
804 session_->StartGettingPorts(); | 771 session_->StartGettingPorts(); |
805 | 772 |
806 ASSERT_EQ_WAIT(3U, candidates_.size(), kDefaultAllocationTimeout); | 773 ASSERT_EQ_WAIT(3U, candidates_.size(), kDefaultAllocationTimeout); |
807 ASSERT_EQ(3U, ports_.size()); | 774 ASSERT_EQ(3U, ports_.size()); |
808 EXPECT_PRED5(CheckCandidate, candidates_[0], | 775 EXPECT_PRED5(CheckCandidate, candidates_[0], |
809 cricket::ICE_CANDIDATE_COMPONENT_RTP, "local", "udp", kClientAddr); | 776 cricket::ICE_CANDIDATE_COMPONENT_RTP, "local", "udp", kClientAddr); |
(...skipping 17 matching lines...) Expand all Loading... |
827 cricket::RelayServerConfig relay_server(cricket::RELAY_TURN); | 794 cricket::RelayServerConfig relay_server(cricket::RELAY_TURN); |
828 cricket::RelayCredentials credentials(kTurnUsername, kTurnPassword); | 795 cricket::RelayCredentials credentials(kTurnUsername, kTurnPassword); |
829 relay_server.credentials = credentials; | 796 relay_server.credentials = credentials; |
830 relay_server.ports.push_back(cricket::ProtocolAddress( | 797 relay_server.ports.push_back(cricket::ProtocolAddress( |
831 rtc::SocketAddress("localhost", 3478), | 798 rtc::SocketAddress("localhost", 3478), |
832 cricket::PROTO_UDP, false)); | 799 cricket::PROTO_UDP, false)); |
833 allocator_->AddRelay(relay_server); | 800 allocator_->AddRelay(relay_server); |
834 | 801 |
835 allocator_->set_step_delay(cricket::kMinimumStepDelay); | 802 allocator_->set_step_delay(cricket::kMinimumStepDelay); |
836 allocator_->set_flags(allocator().flags() | | 803 allocator_->set_flags(allocator().flags() | |
837 cricket::PORTALLOCATOR_ENABLE_SHARED_UFRAG | | |
838 cricket::PORTALLOCATOR_ENABLE_SHARED_SOCKET | | 804 cricket::PORTALLOCATOR_ENABLE_SHARED_SOCKET | |
839 cricket::PORTALLOCATOR_DISABLE_TCP); | 805 cricket::PORTALLOCATOR_DISABLE_TCP); |
840 | 806 |
841 EXPECT_TRUE(CreateSession(cricket::ICE_CANDIDATE_COMPONENT_RTP)); | 807 EXPECT_TRUE(CreateSession(cricket::ICE_CANDIDATE_COMPONENT_RTP)); |
842 session_->StartGettingPorts(); | 808 session_->StartGettingPorts(); |
843 | 809 |
844 EXPECT_EQ_WAIT(2U, ports_.size(), kDefaultAllocationTimeout); | 810 EXPECT_EQ_WAIT(2U, ports_.size(), kDefaultAllocationTimeout); |
845 } | 811 } |
846 | 812 |
847 // Test that when PORTALLOCATOR_ENABLE_SHARED_SOCKET is enabled only one port | 813 // Test that when PORTALLOCATOR_ENABLE_SHARED_SOCKET is enabled only one port |
848 // is allocated for udp/stun/turn. In this test we should expect all local, | 814 // is allocated for udp/stun/turn. In this test we should expect all local, |
849 // stun and turn candidates. | 815 // stun and turn candidates. |
850 TEST_F(PortAllocatorTest, TestSharedSocketWithNatUsingTurn) { | 816 TEST_F(PortAllocatorTest, TestSharedSocketWithNatUsingTurn) { |
851 AddInterface(kClientAddr); | 817 AddInterface(kClientAddr); |
852 ResetWithNatServer(kStunAddr); | 818 ResetWithNatServer(kStunAddr); |
853 | 819 |
854 AddTurnServers(kTurnUdpIntAddr, rtc::SocketAddress()); | 820 AddTurnServers(kTurnUdpIntAddr, rtc::SocketAddress()); |
855 | 821 |
856 allocator_->set_flags(allocator().flags() | | 822 allocator_->set_flags(allocator().flags() | |
857 cricket::PORTALLOCATOR_ENABLE_SHARED_UFRAG | | |
858 cricket::PORTALLOCATOR_ENABLE_SHARED_SOCKET | | 823 cricket::PORTALLOCATOR_ENABLE_SHARED_SOCKET | |
859 cricket::PORTALLOCATOR_DISABLE_TCP); | 824 cricket::PORTALLOCATOR_DISABLE_TCP); |
860 | 825 |
861 EXPECT_TRUE(CreateSession(cricket::ICE_CANDIDATE_COMPONENT_RTP)); | 826 EXPECT_TRUE(CreateSession(cricket::ICE_CANDIDATE_COMPONENT_RTP)); |
862 session_->StartGettingPorts(); | 827 session_->StartGettingPorts(); |
863 | 828 |
864 ASSERT_EQ_WAIT(3U, candidates_.size(), kDefaultAllocationTimeout); | 829 ASSERT_EQ_WAIT(3U, candidates_.size(), kDefaultAllocationTimeout); |
865 ASSERT_EQ(2U, ports_.size()); | 830 ASSERT_EQ(2U, ports_.size()); |
866 EXPECT_PRED5(CheckCandidate, candidates_[0], | 831 EXPECT_PRED5(CheckCandidate, candidates_[0], |
867 cricket::ICE_CANDIDATE_COMPONENT_RTP, "local", "udp", kClientAddr); | 832 cricket::ICE_CANDIDATE_COMPONENT_RTP, "local", "udp", kClientAddr); |
(...skipping 18 matching lines...) Expand all Loading... |
886 // Use an empty SocketAddress to add a NAT without STUN server. | 851 // Use an empty SocketAddress to add a NAT without STUN server. |
887 ResetWithNatServer(SocketAddress()); | 852 ResetWithNatServer(SocketAddress()); |
888 AddTurnServers(kTurnUdpIntAddr, rtc::SocketAddress()); | 853 AddTurnServers(kTurnUdpIntAddr, rtc::SocketAddress()); |
889 | 854 |
890 // Must set the step delay to 0 to make sure the relay allocation phase is | 855 // Must set the step delay to 0 to make sure the relay allocation phase is |
891 // started before the STUN candidates are obtained, so that the STUN binding | 856 // started before the STUN candidates are obtained, so that the STUN binding |
892 // response is processed when both StunPort and TurnPort exist to reproduce | 857 // response is processed when both StunPort and TurnPort exist to reproduce |
893 // webrtc issue 3537. | 858 // webrtc issue 3537. |
894 allocator_->set_step_delay(0); | 859 allocator_->set_step_delay(0); |
895 allocator_->set_flags(allocator().flags() | | 860 allocator_->set_flags(allocator().flags() | |
896 cricket::PORTALLOCATOR_ENABLE_SHARED_UFRAG | | |
897 cricket::PORTALLOCATOR_ENABLE_SHARED_SOCKET | | 861 cricket::PORTALLOCATOR_ENABLE_SHARED_SOCKET | |
898 cricket::PORTALLOCATOR_DISABLE_TCP); | 862 cricket::PORTALLOCATOR_DISABLE_TCP); |
899 | 863 |
900 EXPECT_TRUE(CreateSession(cricket::ICE_CANDIDATE_COMPONENT_RTP)); | 864 EXPECT_TRUE(CreateSession(cricket::ICE_CANDIDATE_COMPONENT_RTP)); |
901 session_->StartGettingPorts(); | 865 session_->StartGettingPorts(); |
902 | 866 |
903 ASSERT_EQ_WAIT(3U, candidates_.size(), kDefaultAllocationTimeout); | 867 ASSERT_EQ_WAIT(3U, candidates_.size(), kDefaultAllocationTimeout); |
904 EXPECT_PRED5(CheckCandidate, candidates_[0], | 868 EXPECT_PRED5(CheckCandidate, candidates_[0], |
905 cricket::ICE_CANDIDATE_COMPONENT_RTP, "local", "udp", kClientAddr); | 869 cricket::ICE_CANDIDATE_COMPONENT_RTP, "local", "udp", kClientAddr); |
906 EXPECT_PRED5(CheckCandidate, candidates_[1], | 870 EXPECT_PRED5(CheckCandidate, candidates_[1], |
(...skipping 14 matching lines...) Expand all Loading... |
921 // Test that when only a TCP TURN server is available, we do NOT use it as | 885 // Test that when only a TCP TURN server is available, we do NOT use it as |
922 // a UDP STUN server, as this could leak our IP address. Thus we should only | 886 // a UDP STUN server, as this could leak our IP address. Thus we should only |
923 // expect two ports, a UDPPort and TurnPort. | 887 // expect two ports, a UDPPort and TurnPort. |
924 TEST_F(PortAllocatorTest, TestSharedSocketWithNatUsingTurnTcpOnly) { | 888 TEST_F(PortAllocatorTest, TestSharedSocketWithNatUsingTurnTcpOnly) { |
925 turn_server_.AddInternalSocket(kTurnTcpIntAddr, cricket::PROTO_TCP); | 889 turn_server_.AddInternalSocket(kTurnTcpIntAddr, cricket::PROTO_TCP); |
926 AddInterface(kClientAddr); | 890 AddInterface(kClientAddr); |
927 ResetWithNatServer(rtc::SocketAddress()); | 891 ResetWithNatServer(rtc::SocketAddress()); |
928 AddTurnServers(rtc::SocketAddress(), kTurnTcpIntAddr); | 892 AddTurnServers(rtc::SocketAddress(), kTurnTcpIntAddr); |
929 | 893 |
930 allocator_->set_flags(allocator().flags() | | 894 allocator_->set_flags(allocator().flags() | |
931 cricket::PORTALLOCATOR_ENABLE_SHARED_UFRAG | | |
932 cricket::PORTALLOCATOR_ENABLE_SHARED_SOCKET | | 895 cricket::PORTALLOCATOR_ENABLE_SHARED_SOCKET | |
933 cricket::PORTALLOCATOR_DISABLE_TCP); | 896 cricket::PORTALLOCATOR_DISABLE_TCP); |
934 | 897 |
935 EXPECT_TRUE(CreateSession(cricket::ICE_CANDIDATE_COMPONENT_RTP)); | 898 EXPECT_TRUE(CreateSession(cricket::ICE_CANDIDATE_COMPONENT_RTP)); |
936 session_->StartGettingPorts(); | 899 session_->StartGettingPorts(); |
937 | 900 |
938 ASSERT_EQ_WAIT(2U, candidates_.size(), kDefaultAllocationTimeout); | 901 ASSERT_EQ_WAIT(2U, candidates_.size(), kDefaultAllocationTimeout); |
939 ASSERT_EQ(2U, ports_.size()); | 902 ASSERT_EQ(2U, ports_.size()); |
940 EXPECT_PRED5(CheckCandidate, candidates_[0], | 903 EXPECT_PRED5(CheckCandidate, candidates_[0], |
941 cricket::ICE_CANDIDATE_COMPONENT_RTP, "local", "udp", | 904 cricket::ICE_CANDIDATE_COMPONENT_RTP, "local", "udp", |
(...skipping 12 matching lines...) Expand all Loading... |
954 // 'relay' candidates. | 917 // 'relay' candidates. |
955 // TODO(deadbeef): Remove this test when support for non-shared socket mode | 918 // TODO(deadbeef): Remove this test when support for non-shared socket mode |
956 // is removed. | 919 // is removed. |
957 TEST_F(PortAllocatorTest, TestNonSharedSocketWithNatUsingTurnAsStun) { | 920 TEST_F(PortAllocatorTest, TestNonSharedSocketWithNatUsingTurnAsStun) { |
958 AddInterface(kClientAddr); | 921 AddInterface(kClientAddr); |
959 // Use an empty SocketAddress to add a NAT without STUN server. | 922 // Use an empty SocketAddress to add a NAT without STUN server. |
960 ResetWithNatServer(SocketAddress()); | 923 ResetWithNatServer(SocketAddress()); |
961 AddTurnServers(kTurnUdpIntAddr, rtc::SocketAddress()); | 924 AddTurnServers(kTurnUdpIntAddr, rtc::SocketAddress()); |
962 | 925 |
963 allocator_->set_flags(allocator().flags() | | 926 allocator_->set_flags(allocator().flags() | |
964 cricket::PORTALLOCATOR_ENABLE_SHARED_UFRAG | | |
965 cricket::PORTALLOCATOR_DISABLE_TCP); | 927 cricket::PORTALLOCATOR_DISABLE_TCP); |
966 | 928 |
967 EXPECT_TRUE(CreateSession(cricket::ICE_CANDIDATE_COMPONENT_RTP)); | 929 EXPECT_TRUE(CreateSession(cricket::ICE_CANDIDATE_COMPONENT_RTP)); |
968 session_->StartGettingPorts(); | 930 session_->StartGettingPorts(); |
969 | 931 |
970 ASSERT_EQ_WAIT(3U, candidates_.size(), kDefaultAllocationTimeout); | 932 ASSERT_EQ_WAIT(3U, candidates_.size(), kDefaultAllocationTimeout); |
971 ASSERT_EQ(3U, ports_.size()); | 933 ASSERT_EQ(3U, ports_.size()); |
972 EXPECT_PRED5(CheckCandidate, candidates_[0], | 934 EXPECT_PRED5(CheckCandidate, candidates_[0], |
973 cricket::ICE_CANDIDATE_COMPONENT_RTP, "local", "udp", | 935 cricket::ICE_CANDIDATE_COMPONENT_RTP, "local", "udp", |
974 kClientAddr); | 936 kClientAddr); |
(...skipping 18 matching lines...) Expand all Loading... |
993 // server is used as a STUN server and we get a 'stun' candidate. | 955 // server is used as a STUN server and we get a 'stun' candidate. |
994 TEST_F(PortAllocatorTest, TestSharedSocketWithNatUsingTurnAndStun) { | 956 TEST_F(PortAllocatorTest, TestSharedSocketWithNatUsingTurnAndStun) { |
995 AddInterface(kClientAddr); | 957 AddInterface(kClientAddr); |
996 // Configure with STUN server but destroy it, so we can ensure that it's | 958 // Configure with STUN server but destroy it, so we can ensure that it's |
997 // the TURN server actually being used as a STUN server. | 959 // the TURN server actually being used as a STUN server. |
998 ResetWithNatServer(kStunAddr); | 960 ResetWithNatServer(kStunAddr); |
999 stun_server_.reset(); | 961 stun_server_.reset(); |
1000 AddTurnServers(kTurnUdpIntAddr, rtc::SocketAddress()); | 962 AddTurnServers(kTurnUdpIntAddr, rtc::SocketAddress()); |
1001 | 963 |
1002 allocator_->set_flags(allocator().flags() | | 964 allocator_->set_flags(allocator().flags() | |
1003 cricket::PORTALLOCATOR_ENABLE_SHARED_UFRAG | | |
1004 cricket::PORTALLOCATOR_ENABLE_SHARED_SOCKET | | 965 cricket::PORTALLOCATOR_ENABLE_SHARED_SOCKET | |
1005 cricket::PORTALLOCATOR_DISABLE_TCP); | 966 cricket::PORTALLOCATOR_DISABLE_TCP); |
1006 | 967 |
1007 EXPECT_TRUE(CreateSession(cricket::ICE_CANDIDATE_COMPONENT_RTP)); | 968 EXPECT_TRUE(CreateSession(cricket::ICE_CANDIDATE_COMPONENT_RTP)); |
1008 session_->StartGettingPorts(); | 969 session_->StartGettingPorts(); |
1009 | 970 |
1010 ASSERT_EQ_WAIT(3U, candidates_.size(), kDefaultAllocationTimeout); | 971 ASSERT_EQ_WAIT(3U, candidates_.size(), kDefaultAllocationTimeout); |
1011 EXPECT_PRED5(CheckCandidate, candidates_[0], | 972 EXPECT_PRED5(CheckCandidate, candidates_[0], |
1012 cricket::ICE_CANDIDATE_COMPONENT_RTP, "local", "udp", | 973 cricket::ICE_CANDIDATE_COMPONENT_RTP, "local", "udp", |
1013 kClientAddr); | 974 kClientAddr); |
1014 EXPECT_PRED5(CheckCandidate, candidates_[1], | 975 EXPECT_PRED5(CheckCandidate, candidates_[1], |
1015 cricket::ICE_CANDIDATE_COMPONENT_RTP, "stun", "udp", | 976 cricket::ICE_CANDIDATE_COMPONENT_RTP, "stun", "udp", |
1016 rtc::SocketAddress(kNatUdpAddr.ipaddr(), 0)); | 977 rtc::SocketAddress(kNatUdpAddr.ipaddr(), 0)); |
1017 EXPECT_PRED5(CheckCandidate, candidates_[2], | 978 EXPECT_PRED5(CheckCandidate, candidates_[2], |
1018 cricket::ICE_CANDIDATE_COMPONENT_RTP, "relay", "udp", | 979 cricket::ICE_CANDIDATE_COMPONENT_RTP, "relay", "udp", |
1019 rtc::SocketAddress(kTurnUdpExtAddr.ipaddr(), 0)); | 980 rtc::SocketAddress(kTurnUdpExtAddr.ipaddr(), 0)); |
1020 EXPECT_EQ(candidates_[2].related_address(), candidates_[1].address()); | 981 EXPECT_EQ(candidates_[2].related_address(), candidates_[1].address()); |
1021 | 982 |
1022 // Don't bother waiting for STUN timeout, since we already verified | 983 // Don't bother waiting for STUN timeout, since we already verified |
1023 // that we got a STUN candidate from the TURN server. | 984 // that we got a STUN candidate from the TURN server. |
1024 } | 985 } |
1025 | 986 |
1026 // This test verifies when PORTALLOCATOR_ENABLE_SHARED_SOCKET flag is enabled | 987 // This test verifies when PORTALLOCATOR_ENABLE_SHARED_SOCKET flag is enabled |
1027 // and fail to generate STUN candidate, local UDP candidate is generated | 988 // and fail to generate STUN candidate, local UDP candidate is generated |
1028 // properly. | 989 // properly. |
1029 TEST_F(PortAllocatorTest, TestSharedSocketNoUdpAllowed) { | 990 TEST_F(PortAllocatorTest, TestSharedSocketNoUdpAllowed) { |
1030 allocator().set_flags(allocator().flags() | | 991 allocator().set_flags(allocator().flags() | |
1031 cricket::PORTALLOCATOR_DISABLE_RELAY | | 992 cricket::PORTALLOCATOR_DISABLE_RELAY | |
1032 cricket::PORTALLOCATOR_DISABLE_TCP | | 993 cricket::PORTALLOCATOR_DISABLE_TCP | |
1033 cricket::PORTALLOCATOR_ENABLE_SHARED_UFRAG | | |
1034 cricket::PORTALLOCATOR_ENABLE_SHARED_SOCKET); | 994 cricket::PORTALLOCATOR_ENABLE_SHARED_SOCKET); |
1035 fss_->AddRule(false, rtc::FP_UDP, rtc::FD_ANY, kClientAddr); | 995 fss_->AddRule(false, rtc::FP_UDP, rtc::FD_ANY, kClientAddr); |
1036 AddInterface(kClientAddr); | 996 AddInterface(kClientAddr); |
1037 EXPECT_TRUE(CreateSession(cricket::ICE_CANDIDATE_COMPONENT_RTP)); | 997 EXPECT_TRUE(CreateSession(cricket::ICE_CANDIDATE_COMPONENT_RTP)); |
1038 session_->StartGettingPorts(); | 998 session_->StartGettingPorts(); |
1039 ASSERT_EQ_WAIT(1U, ports_.size(), kDefaultAllocationTimeout); | 999 ASSERT_EQ_WAIT(1U, ports_.size(), kDefaultAllocationTimeout); |
1040 EXPECT_EQ(1U, candidates_.size()); | 1000 EXPECT_EQ(1U, candidates_.size()); |
1041 EXPECT_PRED5(CheckCandidate, candidates_[0], | 1001 EXPECT_PRED5(CheckCandidate, candidates_[0], |
1042 cricket::ICE_CANDIDATE_COMPONENT_RTP, "local", "udp", kClientAddr); | 1002 cricket::ICE_CANDIDATE_COMPONENT_RTP, "local", "udp", kClientAddr); |
1043 // STUN timeout is 9sec. We need to wait to get candidate done signal. | 1003 // STUN timeout is 9sec. We need to wait to get candidate done signal. |
1044 EXPECT_TRUE_WAIT(candidate_allocation_done_, 10000); | 1004 EXPECT_TRUE_WAIT(candidate_allocation_done_, 10000); |
1045 EXPECT_EQ(1U, candidates_.size()); | 1005 EXPECT_EQ(1U, candidates_.size()); |
1046 } | 1006 } |
1047 | 1007 |
1048 // This test verifies allocator can use IPv6 addresses along with IPv4. | 1008 // This test verifies allocator can use IPv6 addresses along with IPv4. |
1049 TEST_F(PortAllocatorTest, TestEnableIPv6Addresses) { | 1009 TEST_F(PortAllocatorTest, TestEnableIPv6Addresses) { |
1050 allocator().set_flags(allocator().flags() | | 1010 allocator().set_flags(allocator().flags() | |
1051 cricket::PORTALLOCATOR_DISABLE_RELAY | | 1011 cricket::PORTALLOCATOR_DISABLE_RELAY | |
1052 cricket::PORTALLOCATOR_ENABLE_IPV6 | | 1012 cricket::PORTALLOCATOR_ENABLE_IPV6 | |
1053 cricket::PORTALLOCATOR_ENABLE_SHARED_UFRAG | | |
1054 cricket::PORTALLOCATOR_ENABLE_SHARED_SOCKET); | 1013 cricket::PORTALLOCATOR_ENABLE_SHARED_SOCKET); |
1055 AddInterface(kClientIPv6Addr); | 1014 AddInterface(kClientIPv6Addr); |
1056 AddInterface(kClientAddr); | 1015 AddInterface(kClientAddr); |
1057 allocator_->set_step_delay(cricket::kMinimumStepDelay); | 1016 allocator_->set_step_delay(cricket::kMinimumStepDelay); |
1058 EXPECT_TRUE(CreateSession(cricket::ICE_CANDIDATE_COMPONENT_RTP)); | 1017 EXPECT_TRUE(CreateSession(cricket::ICE_CANDIDATE_COMPONENT_RTP)); |
1059 session_->StartGettingPorts(); | 1018 session_->StartGettingPorts(); |
1060 ASSERT_EQ_WAIT(4U, ports_.size(), kDefaultAllocationTimeout); | 1019 ASSERT_EQ_WAIT(4U, ports_.size(), kDefaultAllocationTimeout); |
1061 EXPECT_EQ(4U, candidates_.size()); | 1020 EXPECT_EQ(4U, candidates_.size()); |
1062 EXPECT_TRUE_WAIT(candidate_allocation_done_, kDefaultAllocationTimeout); | 1021 EXPECT_TRUE_WAIT(candidate_allocation_done_, kDefaultAllocationTimeout); |
1063 EXPECT_PRED5(CheckCandidate, candidates_[0], | 1022 EXPECT_PRED5(CheckCandidate, candidates_[0], |
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1102 alloc.SetStunHosts(stun_servers); | 1061 alloc.SetStunHosts(stun_servers); |
1103 EXPECT_EQ(2U, alloc.relay_hosts().size()); | 1062 EXPECT_EQ(2U, alloc.relay_hosts().size()); |
1104 EXPECT_EQ(2U, alloc.stun_hosts().size()); | 1063 EXPECT_EQ(2U, alloc.stun_hosts().size()); |
1105 } | 1064 } |
1106 | 1065 |
1107 // Test that the HttpPortAllocator uses correct URL to create sessions. | 1066 // Test that the HttpPortAllocator uses correct URL to create sessions. |
1108 TEST(HttpPortAllocatorTest, TestSessionRequestUrl) { | 1067 TEST(HttpPortAllocatorTest, TestSessionRequestUrl) { |
1109 rtc::FakeNetworkManager network_manager; | 1068 rtc::FakeNetworkManager network_manager; |
1110 cricket::HttpPortAllocator alloc(&network_manager, "unit test agent"); | 1069 cricket::HttpPortAllocator alloc(&network_manager, "unit test agent"); |
1111 | 1070 |
1112 // Disable PORTALLOCATOR_ENABLE_SHARED_UFRAG. | |
1113 alloc.set_flags(alloc.flags() & ~cricket::PORTALLOCATOR_ENABLE_SHARED_UFRAG); | |
1114 rtc::scoped_ptr<cricket::HttpPortAllocatorSessionBase> session( | 1071 rtc::scoped_ptr<cricket::HttpPortAllocatorSessionBase> session( |
1115 static_cast<cricket::HttpPortAllocatorSession*>( | 1072 static_cast<cricket::HttpPortAllocatorSession*>( |
1116 alloc.CreateSessionInternal( | 1073 alloc.CreateSessionInternal( |
1117 "test content", 0, kIceUfrag0, kIcePwd0))); | 1074 "test content", 0, kIceUfrag0, kIcePwd0))); |
1118 std::string url = session->GetSessionRequestUrl(); | 1075 std::string url = session->GetSessionRequestUrl(); |
1119 LOG(LS_INFO) << "url: " << url; | 1076 LOG(LS_INFO) << "url: " << url; |
1120 EXPECT_EQ(std::string(cricket::HttpPortAllocator::kCreateSessionURL), url); | |
1121 | |
1122 // Enable PORTALLOCATOR_ENABLE_SHARED_UFRAG. | |
1123 alloc.set_flags(alloc.flags() | cricket::PORTALLOCATOR_ENABLE_SHARED_UFRAG); | |
1124 session.reset(static_cast<cricket::HttpPortAllocatorSession*>( | |
1125 alloc.CreateSessionInternal("test content", 0, kIceUfrag0, kIcePwd0))); | |
1126 url = session->GetSessionRequestUrl(); | |
1127 LOG(LS_INFO) << "url: " << url; | |
1128 std::vector<std::string> parts; | 1077 std::vector<std::string> parts; |
1129 rtc::split(url, '?', &parts); | 1078 rtc::split(url, '?', &parts); |
1130 ASSERT_EQ(2U, parts.size()); | 1079 ASSERT_EQ(2U, parts.size()); |
1131 | 1080 |
1132 std::vector<std::string> args_parts; | 1081 std::vector<std::string> args_parts; |
1133 rtc::split(parts[1], '&', &args_parts); | 1082 rtc::split(parts[1], '&', &args_parts); |
1134 | 1083 |
1135 std::map<std::string, std::string> args; | 1084 std::map<std::string, std::string> args; |
1136 for (std::vector<std::string>::iterator it = args_parts.begin(); | 1085 for (std::vector<std::string>::iterator it = args_parts.begin(); |
1137 it != args_parts.end(); ++it) { | 1086 it != args_parts.end(); ++it) { |
(...skipping 14 matching lines...) Expand all Loading... |
1152 EXPECT_TRUE(CreateSession(cricket::ICE_CANDIDATE_COMPONENT_RTP)); | 1101 EXPECT_TRUE(CreateSession(cricket::ICE_CANDIDATE_COMPONENT_RTP)); |
1153 session_->StartGettingPorts(); | 1102 session_->StartGettingPorts(); |
1154 ASSERT_EQ_WAIT(7U, candidates_.size(), kDefaultAllocationTimeout); | 1103 ASSERT_EQ_WAIT(7U, candidates_.size(), kDefaultAllocationTimeout); |
1155 EXPECT_EQ(4U, ports_.size()); | 1104 EXPECT_EQ(4U, ports_.size()); |
1156 | 1105 |
1157 auto it = ports_.begin(); | 1106 auto it = ports_.begin(); |
1158 for (; it != ports_.end(); ++it) { | 1107 for (; it != ports_.end(); ++it) { |
1159 (reinterpret_cast<cricket::Port*>(*it))->Destroy(); | 1108 (reinterpret_cast<cricket::Port*>(*it))->Destroy(); |
1160 } | 1109 } |
1161 } | 1110 } |
OLD | NEW |