OLD | NEW |
1 /* | 1 /* |
2 * Copyright 2012 The WebRTC project authors. All Rights Reserved. | 2 * Copyright 2012 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 713 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
724 scoped_ptr<JsepSessionDescription> offer( | 724 scoped_ptr<JsepSessionDescription> offer( |
725 CreateRemoteOffer(options, cricket::SEC_REQUIRED)); | 725 CreateRemoteOffer(options, cricket::SEC_REQUIRED)); |
726 ASSERT_TRUE(offer.get() != NULL); | 726 ASSERT_TRUE(offer.get() != NULL); |
727 VerifyCryptoParams(offer->description()); | 727 VerifyCryptoParams(offer->description()); |
728 SetRemoteDescriptionWithoutError(offer.release()); | 728 SetRemoteDescriptionWithoutError(offer.release()); |
729 scoped_ptr<SessionDescriptionInterface> answer(CreateAnswer(NULL)); | 729 scoped_ptr<SessionDescriptionInterface> answer(CreateAnswer(NULL)); |
730 ASSERT_TRUE(answer.get() != NULL); | 730 ASSERT_TRUE(answer.get() != NULL); |
731 VerifyCryptoParams(answer->description()); | 731 VerifyCryptoParams(answer->description()); |
732 } | 732 } |
733 | 733 |
734 void CompareIceUfragAndPassword(const cricket::SessionDescription* desc1, | 734 bool IceUfragPwdEqual(const cricket::SessionDescription* desc1, |
735 const cricket::SessionDescription* desc2, | 735 const cricket::SessionDescription* desc2) { |
736 bool expect_equal) { | |
737 if (desc1->contents().size() != desc2->contents().size()) { | 736 if (desc1->contents().size() != desc2->contents().size()) { |
738 EXPECT_FALSE(expect_equal); | 737 return false; |
739 return; | |
740 } | 738 } |
741 | 739 |
742 const cricket::ContentInfos& contents = desc1->contents(); | 740 const cricket::ContentInfos& contents = desc1->contents(); |
743 cricket::ContentInfos::const_iterator it = contents.begin(); | 741 cricket::ContentInfos::const_iterator it = contents.begin(); |
744 | 742 |
745 for (; it != contents.end(); ++it) { | 743 for (; it != contents.end(); ++it) { |
746 const cricket::TransportDescription* transport_desc1 = | 744 const cricket::TransportDescription* transport_desc1 = |
747 desc1->GetTransportDescriptionByName(it->name); | 745 desc1->GetTransportDescriptionByName(it->name); |
748 const cricket::TransportDescription* transport_desc2 = | 746 const cricket::TransportDescription* transport_desc2 = |
749 desc2->GetTransportDescriptionByName(it->name); | 747 desc2->GetTransportDescriptionByName(it->name); |
750 if (!transport_desc1 || !transport_desc2) { | 748 if (!transport_desc1 || !transport_desc2) { |
751 EXPECT_FALSE(expect_equal); | 749 return false; |
752 return; | |
753 } | 750 } |
754 if (transport_desc1->ice_pwd != transport_desc2->ice_pwd || | 751 if (transport_desc1->ice_pwd != transport_desc2->ice_pwd || |
755 transport_desc1->ice_ufrag != transport_desc2->ice_ufrag) { | 752 transport_desc1->ice_ufrag != transport_desc2->ice_ufrag) { |
756 EXPECT_FALSE(expect_equal); | 753 return false; |
757 return; | |
758 } | 754 } |
759 } | 755 } |
760 EXPECT_TRUE(expect_equal); | 756 return true; |
| 757 } |
| 758 |
| 759 // Compares ufrag/password only for the specified |media_type|. |
| 760 bool IceUfragPwdEqual(const cricket::SessionDescription* desc1, |
| 761 const cricket::SessionDescription* desc2, |
| 762 cricket::MediaType media_type) { |
| 763 if (desc1->contents().size() != desc2->contents().size()) { |
| 764 return false; |
| 765 } |
| 766 |
| 767 const cricket::ContentInfo* cinfo = |
| 768 cricket::GetFirstMediaContent(desc1->contents(), media_type); |
| 769 const cricket::TransportDescription* transport_desc1 = |
| 770 desc1->GetTransportDescriptionByName(cinfo->name); |
| 771 const cricket::TransportDescription* transport_desc2 = |
| 772 desc2->GetTransportDescriptionByName(cinfo->name); |
| 773 if (!transport_desc1 || !transport_desc2) { |
| 774 return false; |
| 775 } |
| 776 if (transport_desc1->ice_pwd != transport_desc2->ice_pwd || |
| 777 transport_desc1->ice_ufrag != transport_desc2->ice_ufrag) { |
| 778 return false; |
| 779 } |
| 780 return true; |
761 } | 781 } |
762 | 782 |
763 void RemoveIceUfragPwdLines(const SessionDescriptionInterface* current_desc, | 783 void RemoveIceUfragPwdLines(const SessionDescriptionInterface* current_desc, |
764 std::string *sdp) { | 784 std::string *sdp) { |
765 const cricket::SessionDescription* desc = current_desc->description(); | 785 const cricket::SessionDescription* desc = current_desc->description(); |
766 EXPECT_TRUE(current_desc->ToString(sdp)); | 786 EXPECT_TRUE(current_desc->ToString(sdp)); |
767 | 787 |
768 const cricket::ContentInfos& contents = desc->contents(); | 788 const cricket::ContentInfos& contents = desc->contents(); |
769 cricket::ContentInfos::const_iterator it = contents.begin(); | 789 cricket::ContentInfos::const_iterator it = contents.begin(); |
770 // Replace ufrag and pwd lines with empty strings. | 790 // Replace ufrag and pwd lines with empty strings. |
771 for (; it != contents.end(); ++it) { | 791 for (; it != contents.end(); ++it) { |
772 const cricket::TransportDescription* transport_desc = | 792 const cricket::TransportDescription* transport_desc = |
773 desc->GetTransportDescriptionByName(it->name); | 793 desc->GetTransportDescriptionByName(it->name); |
774 std::string ufrag_line = "a=ice-ufrag:" + transport_desc->ice_ufrag | 794 std::string ufrag_line = "a=ice-ufrag:" + transport_desc->ice_ufrag |
775 + "\r\n"; | 795 + "\r\n"; |
776 std::string pwd_line = "a=ice-pwd:" + transport_desc->ice_pwd | 796 std::string pwd_line = "a=ice-pwd:" + transport_desc->ice_pwd |
777 + "\r\n"; | 797 + "\r\n"; |
778 rtc::replace_substrs(ufrag_line.c_str(), ufrag_line.length(), | 798 rtc::replace_substrs(ufrag_line.c_str(), ufrag_line.length(), |
779 "", 0, | 799 "", 0, |
780 sdp); | 800 sdp); |
781 rtc::replace_substrs(pwd_line.c_str(), pwd_line.length(), | 801 rtc::replace_substrs(pwd_line.c_str(), pwd_line.length(), |
782 "", 0, | 802 "", 0, |
783 sdp); | 803 sdp); |
784 } | 804 } |
785 } | 805 } |
786 | 806 |
787 void ModifyIceUfragPwdLines(const SessionDescriptionInterface* current_desc, | 807 void SetIceUfragPwd(SessionDescriptionInterface* current_desc, |
788 const std::string& modified_ice_ufrag, | 808 const std::string& ufrag, |
789 const std::string& modified_ice_pwd, | 809 const std::string& pwd) { |
790 std::string* sdp) { | 810 cricket::SessionDescription* desc = current_desc->description(); |
791 const cricket::SessionDescription* desc = current_desc->description(); | 811 for (TransportInfo& transport_info : desc->transport_infos()) { |
792 EXPECT_TRUE(current_desc->ToString(sdp)); | 812 cricket::TransportDescription& transport_desc = |
| 813 transport_info.description; |
| 814 transport_desc.ice_ufrag = ufrag; |
| 815 transport_desc.ice_pwd = pwd; |
| 816 } |
| 817 } |
793 | 818 |
794 const cricket::ContentInfos& contents = desc->contents(); | 819 // Sets ufrag/pwd for specified |media_type|. |
795 cricket::ContentInfos::const_iterator it = contents.begin(); | 820 void SetIceUfragPwd(SessionDescriptionInterface* current_desc, |
796 // Replace ufrag and pwd lines with |modified_ice_ufrag| and | 821 cricket::MediaType media_type, |
797 // |modified_ice_pwd| strings. | 822 const std::string& ufrag, |
798 for (; it != contents.end(); ++it) { | 823 const std::string& pwd) { |
799 const cricket::TransportDescription* transport_desc = | 824 cricket::SessionDescription* desc = current_desc->description(); |
800 desc->GetTransportDescriptionByName(it->name); | 825 const cricket::ContentInfo* cinfo = |
801 std::string ufrag_line = "a=ice-ufrag:" + transport_desc->ice_ufrag | 826 cricket::GetFirstMediaContent(desc->contents(), media_type); |
802 + "\r\n"; | 827 TransportInfo* transport_info = desc->GetTransportInfoByName(cinfo->name); |
803 std::string pwd_line = "a=ice-pwd:" + transport_desc->ice_pwd | 828 cricket::TransportDescription* transport_desc = |
804 + "\r\n"; | 829 &transport_info->description; |
805 std::string mod_ufrag = "a=ice-ufrag:" + modified_ice_ufrag + "\r\n"; | 830 transport_desc->ice_ufrag = ufrag; |
806 std::string mod_pwd = "a=ice-pwd:" + modified_ice_pwd + "\r\n"; | 831 transport_desc->ice_pwd = pwd; |
807 rtc::replace_substrs(ufrag_line.c_str(), ufrag_line.length(), | |
808 mod_ufrag.c_str(), mod_ufrag.length(), | |
809 sdp); | |
810 rtc::replace_substrs(pwd_line.c_str(), pwd_line.length(), | |
811 mod_pwd.c_str(), mod_pwd.length(), | |
812 sdp); | |
813 } | |
814 } | 832 } |
815 | 833 |
816 // Creates a remote offer and and applies it as a remote description, | 834 // Creates a remote offer and and applies it as a remote description, |
817 // creates a local answer and applies is as a local description. | 835 // creates a local answer and applies is as a local description. |
818 // Call SendAudioVideoStreamX() before this function | 836 // Call SendAudioVideoStreamX() before this function |
819 // to decide which local and remote streams to create. | 837 // to decide which local and remote streams to create. |
820 void CreateAndSetRemoteOfferAndLocalAnswer() { | 838 void CreateAndSetRemoteOfferAndLocalAnswer() { |
821 SessionDescriptionInterface* offer = CreateRemoteOffer(); | 839 SessionDescriptionInterface* offer = CreateRemoteOffer(); |
822 SetRemoteDescriptionWithoutError(offer); | 840 SetRemoteDescriptionWithoutError(offer); |
823 SessionDescriptionInterface* answer = CreateAnswer(NULL); | 841 SessionDescriptionInterface* answer = CreateAnswer(NULL); |
(...skipping 1944 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2768 CreateSessionDescription(JsepSessionDescription::kOffer, sdp, NULL); | 2786 CreateSessionDescription(JsepSessionDescription::kOffer, sdp, NULL); |
2769 SetRemoteDescriptionOfferExpectError(kSdpWithoutIceUfragPwd, modified_offer); | 2787 SetRemoteDescriptionOfferExpectError(kSdpWithoutIceUfragPwd, modified_offer); |
2770 } | 2788 } |
2771 | 2789 |
2772 // This test verifies that setLocalDescription fails if local offer has | 2790 // This test verifies that setLocalDescription fails if local offer has |
2773 // too short ice ufrag and pwd strings. | 2791 // too short ice ufrag and pwd strings. |
2774 TEST_F(WebRtcSessionTest, TestSetLocalDescriptionInvalidIceCredentials) { | 2792 TEST_F(WebRtcSessionTest, TestSetLocalDescriptionInvalidIceCredentials) { |
2775 Init(); | 2793 Init(); |
2776 SendAudioVideoStream1(); | 2794 SendAudioVideoStream1(); |
2777 rtc::scoped_ptr<SessionDescriptionInterface> offer(CreateOffer()); | 2795 rtc::scoped_ptr<SessionDescriptionInterface> offer(CreateOffer()); |
2778 | |
2779 std::string sdp; | |
2780 // Modifying ice ufrag and pwd in local offer with strings smaller than the | 2796 // Modifying ice ufrag and pwd in local offer with strings smaller than the |
2781 // recommended values of 4 and 22 bytes respectively. | 2797 // recommended values of 4 and 22 bytes respectively. |
2782 ModifyIceUfragPwdLines(offer.get(), "ice", "icepwd", &sdp); | 2798 SetIceUfragPwd(offer.get(), "ice", "icepwd"); |
2783 SessionDescriptionInterface* modified_offer = | |
2784 CreateSessionDescription(JsepSessionDescription::kOffer, sdp, NULL); | |
2785 std::string error; | 2799 std::string error; |
2786 EXPECT_FALSE(session_->SetLocalDescription(modified_offer, &error)); | 2800 EXPECT_FALSE(session_->SetLocalDescription(offer.release(), &error)); |
2787 | 2801 |
2788 // Test with string greater than 256. | 2802 // Test with string greater than 256. |
2789 sdp.clear(); | 2803 offer.reset(CreateOffer()); |
2790 ModifyIceUfragPwdLines(offer.get(), kTooLongIceUfragPwd, kTooLongIceUfragPwd, | 2804 SetIceUfragPwd(offer.get(), kTooLongIceUfragPwd, kTooLongIceUfragPwd); |
2791 &sdp); | 2805 EXPECT_FALSE(session_->SetLocalDescription(offer.release(), &error)); |
2792 modified_offer = CreateSessionDescription(JsepSessionDescription::kOffer, sdp, | |
2793 NULL); | |
2794 EXPECT_FALSE(session_->SetLocalDescription(modified_offer, &error)); | |
2795 } | 2806 } |
2796 | 2807 |
2797 // This test verifies that setRemoteDescription fails if remote offer has | 2808 // This test verifies that setRemoteDescription fails if remote offer has |
2798 // too short ice ufrag and pwd strings. | 2809 // too short ice ufrag and pwd strings. |
2799 TEST_F(WebRtcSessionTest, TestSetRemoteDescriptionInvalidIceCredentials) { | 2810 TEST_F(WebRtcSessionTest, TestSetRemoteDescriptionInvalidIceCredentials) { |
2800 Init(); | 2811 Init(); |
2801 rtc::scoped_ptr<SessionDescriptionInterface> offer(CreateRemoteOffer()); | 2812 rtc::scoped_ptr<SessionDescriptionInterface> offer(CreateRemoteOffer()); |
2802 std::string sdp; | |
2803 // Modifying ice ufrag and pwd in remote offer with strings smaller than the | 2813 // Modifying ice ufrag and pwd in remote offer with strings smaller than the |
2804 // recommended values of 4 and 22 bytes respectively. | 2814 // recommended values of 4 and 22 bytes respectively. |
2805 ModifyIceUfragPwdLines(offer.get(), "ice", "icepwd", &sdp); | 2815 SetIceUfragPwd(offer.get(), "ice", "icepwd"); |
2806 SessionDescriptionInterface* modified_offer = | |
2807 CreateSessionDescription(JsepSessionDescription::kOffer, sdp, NULL); | |
2808 std::string error; | 2816 std::string error; |
2809 EXPECT_FALSE(session_->SetRemoteDescription(modified_offer, &error)); | 2817 EXPECT_FALSE(session_->SetRemoteDescription(offer.release(), &error)); |
2810 | 2818 |
2811 sdp.clear(); | 2819 offer.reset(CreateRemoteOffer()); |
2812 ModifyIceUfragPwdLines(offer.get(), kTooLongIceUfragPwd, kTooLongIceUfragPwd, | 2820 SetIceUfragPwd(offer.get(), kTooLongIceUfragPwd, kTooLongIceUfragPwd); |
2813 &sdp); | 2821 EXPECT_FALSE(session_->SetRemoteDescription(offer.release(), &error)); |
2814 modified_offer = CreateSessionDescription(JsepSessionDescription::kOffer, sdp, | |
2815 NULL); | |
2816 EXPECT_FALSE(session_->SetRemoteDescription(modified_offer, &error)); | |
2817 } | 2822 } |
2818 | 2823 |
2819 // Test that if the remote offer indicates the peer requested ICE restart (via | 2824 // Test that if the remote offer indicates the peer requested ICE restart (via |
2820 // a new ufrag or pwd), the old ICE candidates are not copied, and vice versa. | 2825 // a new ufrag or pwd), the old ICE candidates are not copied, and vice versa. |
2821 TEST_F(WebRtcSessionTest, TestSetRemoteOfferWithIceRestart) { | 2826 TEST_F(WebRtcSessionTest, TestSetRemoteOfferWithIceRestart) { |
2822 Init(); | 2827 Init(); |
2823 scoped_ptr<SessionDescriptionInterface> offer(CreateRemoteOffer()); | |
2824 | 2828 |
2825 // Create the first offer. | 2829 // Create the first offer. |
2826 std::string sdp; | 2830 scoped_ptr<SessionDescriptionInterface> offer(CreateRemoteOffer()); |
2827 ModifyIceUfragPwdLines(offer.get(), "0123456789012345", | 2831 SetIceUfragPwd(offer.get(), "0123456789012345", "abcdefghijklmnopqrstuvwx"); |
2828 "abcdefghijklmnopqrstuvwx", &sdp); | |
2829 SessionDescriptionInterface* offer1 = | |
2830 CreateSessionDescription(JsepSessionDescription::kOffer, sdp, NULL); | |
2831 cricket::Candidate candidate1(1, "udp", rtc::SocketAddress("1.1.1.1", 5000), | 2832 cricket::Candidate candidate1(1, "udp", rtc::SocketAddress("1.1.1.1", 5000), |
2832 0, "", "", "relay", 0, ""); | 2833 0, "", "", "relay", 0, ""); |
2833 JsepIceCandidate ice_candidate1(kMediaContentName0, kMediaContentIndex0, | 2834 JsepIceCandidate ice_candidate1(kMediaContentName0, kMediaContentIndex0, |
2834 candidate1); | 2835 candidate1); |
2835 EXPECT_TRUE(offer1->AddCandidate(&ice_candidate1)); | 2836 EXPECT_TRUE(offer->AddCandidate(&ice_candidate1)); |
2836 SetRemoteDescriptionWithoutError(offer1); | 2837 SetRemoteDescriptionWithoutError(offer.release()); |
2837 EXPECT_EQ(1, session_->remote_description()->candidates(0)->count()); | 2838 EXPECT_EQ(1, session_->remote_description()->candidates(0)->count()); |
2838 | 2839 |
2839 // The second offer has the same ufrag and pwd but different address. | 2840 // The second offer has the same ufrag and pwd but different address. |
2840 sdp.clear(); | 2841 offer.reset(CreateRemoteOffer()); |
2841 ModifyIceUfragPwdLines(offer.get(), "0123456789012345", | 2842 SetIceUfragPwd(offer.get(), "0123456789012345", "abcdefghijklmnopqrstuvwx"); |
2842 "abcdefghijklmnopqrstuvwx", &sdp); | |
2843 SessionDescriptionInterface* offer2 = | |
2844 CreateSessionDescription(JsepSessionDescription::kOffer, sdp, NULL); | |
2845 candidate1.set_address(rtc::SocketAddress("1.1.1.1", 6000)); | 2843 candidate1.set_address(rtc::SocketAddress("1.1.1.1", 6000)); |
2846 JsepIceCandidate ice_candidate2(kMediaContentName0, kMediaContentIndex0, | 2844 JsepIceCandidate ice_candidate2(kMediaContentName0, kMediaContentIndex0, |
2847 candidate1); | 2845 candidate1); |
2848 EXPECT_TRUE(offer2->AddCandidate(&ice_candidate2)); | 2846 EXPECT_TRUE(offer->AddCandidate(&ice_candidate2)); |
2849 SetRemoteDescriptionWithoutError(offer2); | 2847 SetRemoteDescriptionWithoutError(offer.release()); |
2850 EXPECT_EQ(2, session_->remote_description()->candidates(0)->count()); | 2848 EXPECT_EQ(2, session_->remote_description()->candidates(0)->count()); |
2851 | 2849 |
2852 // The third offer has a different ufrag and different address. | 2850 // The third offer has a different ufrag and different address. |
2853 sdp.clear(); | 2851 offer.reset(CreateRemoteOffer()); |
2854 ModifyIceUfragPwdLines(offer.get(), "0123456789012333", | 2852 SetIceUfragPwd(offer.get(), "0123456789012333", "abcdefghijklmnopqrstuvwx"); |
2855 "abcdefghijklmnopqrstuvwx", &sdp); | |
2856 SessionDescriptionInterface* offer3 = | |
2857 CreateSessionDescription(JsepSessionDescription::kOffer, sdp, NULL); | |
2858 candidate1.set_address(rtc::SocketAddress("1.1.1.1", 7000)); | 2853 candidate1.set_address(rtc::SocketAddress("1.1.1.1", 7000)); |
2859 JsepIceCandidate ice_candidate3(kMediaContentName0, kMediaContentIndex0, | 2854 JsepIceCandidate ice_candidate3(kMediaContentName0, kMediaContentIndex0, |
2860 candidate1); | 2855 candidate1); |
2861 EXPECT_TRUE(offer3->AddCandidate(&ice_candidate3)); | 2856 EXPECT_TRUE(offer->AddCandidate(&ice_candidate3)); |
2862 SetRemoteDescriptionWithoutError(offer3); | 2857 SetRemoteDescriptionWithoutError(offer.release()); |
2863 EXPECT_EQ(1, session_->remote_description()->candidates(0)->count()); | 2858 EXPECT_EQ(1, session_->remote_description()->candidates(0)->count()); |
2864 | 2859 |
2865 // The fourth offer has no candidate but a different ufrag/pwd. | 2860 // The fourth offer has no candidate but a different ufrag/pwd. |
2866 sdp.clear(); | 2861 offer.reset(CreateRemoteOffer()); |
2867 ModifyIceUfragPwdLines(offer.get(), "0123456789012444", | 2862 SetIceUfragPwd(offer.get(), "0123456789012444", "abcdefghijklmnopqrstuvyz"); |
2868 "abcdefghijklmnopqrstuvyz", &sdp); | 2863 SetRemoteDescriptionWithoutError(offer.release()); |
2869 SessionDescriptionInterface* offer4 = | |
2870 CreateSessionDescription(JsepSessionDescription::kOffer, sdp, NULL); | |
2871 SetRemoteDescriptionWithoutError(offer4); | |
2872 EXPECT_EQ(0, session_->remote_description()->candidates(0)->count()); | 2864 EXPECT_EQ(0, session_->remote_description()->candidates(0)->count()); |
2873 } | 2865 } |
2874 | 2866 |
2875 // Test that if the remote answer indicates the peer requested ICE restart (via | 2867 // Test that if the remote answer indicates the peer requested ICE restart (via |
2876 // a new ufrag or pwd), the old ICE candidates are not copied, and vice versa. | 2868 // a new ufrag or pwd), the old ICE candidates are not copied, and vice versa. |
2877 TEST_F(WebRtcSessionTest, TestSetRemoteAnswerWithIceRestart) { | 2869 TEST_F(WebRtcSessionTest, TestSetRemoteAnswerWithIceRestart) { |
2878 Init(); | 2870 Init(); |
2879 SessionDescriptionInterface* offer = CreateOffer(); | 2871 SessionDescriptionInterface* offer = CreateOffer(); |
2880 SetLocalDescriptionWithoutError(offer); | 2872 SetLocalDescriptionWithoutError(offer); |
2881 scoped_ptr<SessionDescriptionInterface> answer(CreateRemoteAnswer(offer)); | |
2882 | 2873 |
2883 // Create the first answer. | 2874 // Create the first answer. |
2884 std::string sdp; | 2875 scoped_ptr<JsepSessionDescription> answer(CreateRemoteAnswer(offer)); |
2885 ModifyIceUfragPwdLines(answer.get(), "0123456789012345", | 2876 answer->set_type(JsepSessionDescription::kPrAnswer); |
2886 "abcdefghijklmnopqrstuvwx", &sdp); | 2877 SetIceUfragPwd(answer.get(), "0123456789012345", "abcdefghijklmnopqrstuvwx"); |
2887 SessionDescriptionInterface* answer1 = | |
2888 CreateSessionDescription(JsepSessionDescription::kPrAnswer, sdp, NULL); | |
2889 cricket::Candidate candidate1(1, "udp", rtc::SocketAddress("1.1.1.1", 5000), | 2878 cricket::Candidate candidate1(1, "udp", rtc::SocketAddress("1.1.1.1", 5000), |
2890 0, "", "", "relay", 0, ""); | 2879 0, "", "", "relay", 0, ""); |
2891 JsepIceCandidate ice_candidate1(kMediaContentName0, kMediaContentIndex0, | 2880 JsepIceCandidate ice_candidate1(kMediaContentName0, kMediaContentIndex0, |
2892 candidate1); | 2881 candidate1); |
2893 EXPECT_TRUE(answer1->AddCandidate(&ice_candidate1)); | 2882 EXPECT_TRUE(answer->AddCandidate(&ice_candidate1)); |
2894 SetRemoteDescriptionWithoutError(answer1); | 2883 SetRemoteDescriptionWithoutError(answer.release()); |
2895 EXPECT_EQ(1, session_->remote_description()->candidates(0)->count()); | 2884 EXPECT_EQ(1, session_->remote_description()->candidates(0)->count()); |
2896 | 2885 |
2897 // The second answer has the same ufrag and pwd but different address. | 2886 // The second answer has the same ufrag and pwd but different address. |
2898 sdp.clear(); | 2887 answer.reset(CreateRemoteAnswer(offer)); |
2899 ModifyIceUfragPwdLines(answer.get(), "0123456789012345", | 2888 answer->set_type(JsepSessionDescription::kPrAnswer); |
2900 "abcdefghijklmnopqrstuvwx", &sdp); | 2889 SetIceUfragPwd(answer.get(), "0123456789012345", "abcdefghijklmnopqrstuvwx"); |
2901 SessionDescriptionInterface* answer2 = | |
2902 CreateSessionDescription(JsepSessionDescription::kPrAnswer, sdp, NULL); | |
2903 candidate1.set_address(rtc::SocketAddress("1.1.1.1", 6000)); | 2890 candidate1.set_address(rtc::SocketAddress("1.1.1.1", 6000)); |
2904 JsepIceCandidate ice_candidate2(kMediaContentName0, kMediaContentIndex0, | 2891 JsepIceCandidate ice_candidate2(kMediaContentName0, kMediaContentIndex0, |
2905 candidate1); | 2892 candidate1); |
2906 EXPECT_TRUE(answer2->AddCandidate(&ice_candidate2)); | 2893 EXPECT_TRUE(answer->AddCandidate(&ice_candidate2)); |
2907 SetRemoteDescriptionWithoutError(answer2); | 2894 SetRemoteDescriptionWithoutError(answer.release()); |
2908 EXPECT_EQ(2, session_->remote_description()->candidates(0)->count()); | 2895 EXPECT_EQ(2, session_->remote_description()->candidates(0)->count()); |
2909 | 2896 |
2910 // The third answer has a different ufrag and different address. | 2897 // The third answer has a different ufrag and different address. |
2911 sdp.clear(); | 2898 answer.reset(CreateRemoteAnswer(offer)); |
2912 ModifyIceUfragPwdLines(answer.get(), "0123456789012333", | 2899 answer->set_type(JsepSessionDescription::kPrAnswer); |
2913 "abcdefghijklmnopqrstuvwx", &sdp); | 2900 SetIceUfragPwd(answer.get(), "0123456789012333", "abcdefghijklmnopqrstuvwx"); |
2914 SessionDescriptionInterface* answer3 = | |
2915 CreateSessionDescription(JsepSessionDescription::kPrAnswer, sdp, NULL); | |
2916 candidate1.set_address(rtc::SocketAddress("1.1.1.1", 7000)); | 2901 candidate1.set_address(rtc::SocketAddress("1.1.1.1", 7000)); |
2917 JsepIceCandidate ice_candidate3(kMediaContentName0, kMediaContentIndex0, | 2902 JsepIceCandidate ice_candidate3(kMediaContentName0, kMediaContentIndex0, |
2918 candidate1); | 2903 candidate1); |
2919 EXPECT_TRUE(answer3->AddCandidate(&ice_candidate3)); | 2904 EXPECT_TRUE(answer->AddCandidate(&ice_candidate3)); |
2920 SetRemoteDescriptionWithoutError(answer3); | 2905 SetRemoteDescriptionWithoutError(answer.release()); |
2921 EXPECT_EQ(1, session_->remote_description()->candidates(0)->count()); | 2906 EXPECT_EQ(1, session_->remote_description()->candidates(0)->count()); |
2922 | 2907 |
2923 // The fourth answer has no candidate but a different ufrag/pwd. | 2908 // The fourth answer has no candidate but a different ufrag/pwd. |
2924 sdp.clear(); | 2909 answer.reset(CreateRemoteAnswer(offer)); |
2925 ModifyIceUfragPwdLines(answer.get(), "0123456789012444", | 2910 answer->set_type(JsepSessionDescription::kPrAnswer); |
2926 "abcdefghijklmnopqrstuvyz", &sdp); | 2911 SetIceUfragPwd(answer.get(), "0123456789012444", "abcdefghijklmnopqrstuvyz"); |
2927 SessionDescriptionInterface* offer4 = | 2912 SetRemoteDescriptionWithoutError(answer.release()); |
2928 CreateSessionDescription(JsepSessionDescription::kPrAnswer, sdp, NULL); | |
2929 SetRemoteDescriptionWithoutError(offer4); | |
2930 EXPECT_EQ(0, session_->remote_description()->candidates(0)->count()); | 2913 EXPECT_EQ(0, session_->remote_description()->candidates(0)->count()); |
2931 } | 2914 } |
2932 | 2915 |
2933 // Test that candidates sent to the "video" transport do not get pushed down to | 2916 // Test that candidates sent to the "video" transport do not get pushed down to |
2934 // the "audio" transport channel when bundling. | 2917 // the "audio" transport channel when bundling. |
2935 TEST_F(WebRtcSessionTest, TestIgnoreCandidatesForUnusedTransportWhenBundling) { | 2918 TEST_F(WebRtcSessionTest, TestIgnoreCandidatesForUnusedTransportWhenBundling) { |
2936 AddInterface(rtc::SocketAddress(kClientAddrHost1, kClientAddrPort)); | 2919 AddInterface(rtc::SocketAddress(kClientAddrHost1, kClientAddrPort)); |
2937 | 2920 |
2938 InitWithBundlePolicy(PeerConnectionInterface::kBundlePolicyBalanced); | 2921 InitWithBundlePolicy(PeerConnectionInterface::kBundlePolicyBalanced); |
2939 SendAudioVideoStream1(); | 2922 SendAudioVideoStream1(); |
(...skipping 696 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3636 rtc::scoped_ptr<JsepSessionDescription> offer( | 3619 rtc::scoped_ptr<JsepSessionDescription> offer( |
3637 CreateRemoteOffer(options)); | 3620 CreateRemoteOffer(options)); |
3638 SetRemoteDescriptionWithoutError(offer.release()); | 3621 SetRemoteDescriptionWithoutError(offer.release()); |
3639 | 3622 |
3640 SendAudioVideoStream1(); | 3623 SendAudioVideoStream1(); |
3641 rtc::scoped_ptr<SessionDescriptionInterface> answer( | 3624 rtc::scoped_ptr<SessionDescriptionInterface> answer( |
3642 CreateAnswer(NULL)); | 3625 CreateAnswer(NULL)); |
3643 SetLocalDescriptionWithoutError(answer.release()); | 3626 SetLocalDescriptionWithoutError(answer.release()); |
3644 | 3627 |
3645 // Receive an offer with new ufrag and password. | 3628 // Receive an offer with new ufrag and password. |
3646 options.audio_transport_options.ice_restart = true; | 3629 for (const cricket::ContentInfo& content : |
3647 options.video_transport_options.ice_restart = true; | 3630 session_->local_description()->description()->contents()) { |
3648 options.data_transport_options.ice_restart = true; | 3631 options.transport_options[content.name].ice_restart = true; |
| 3632 } |
3649 rtc::scoped_ptr<JsepSessionDescription> updated_offer1( | 3633 rtc::scoped_ptr<JsepSessionDescription> updated_offer1( |
3650 CreateRemoteOffer(options, session_->remote_description())); | 3634 CreateRemoteOffer(options, session_->remote_description())); |
3651 SetRemoteDescriptionWithoutError(updated_offer1.release()); | 3635 SetRemoteDescriptionWithoutError(updated_offer1.release()); |
3652 | 3636 |
3653 rtc::scoped_ptr<SessionDescriptionInterface> updated_answer1( | 3637 rtc::scoped_ptr<SessionDescriptionInterface> updated_answer1( |
3654 CreateAnswer(NULL)); | 3638 CreateAnswer(NULL)); |
3655 | 3639 |
3656 CompareIceUfragAndPassword(updated_answer1->description(), | 3640 EXPECT_FALSE(IceUfragPwdEqual(updated_answer1->description(), |
3657 session_->local_description()->description(), | 3641 session_->local_description()->description())); |
3658 false); | |
3659 | 3642 |
| 3643 // Even a second answer (created before the description is set) should have |
| 3644 // a new ufrag/password. |
| 3645 rtc::scoped_ptr<SessionDescriptionInterface> updated_answer2( |
| 3646 CreateAnswer(NULL)); |
| 3647 |
| 3648 EXPECT_FALSE(IceUfragPwdEqual(updated_answer2->description(), |
| 3649 session_->local_description()->description())); |
| 3650 |
| 3651 SetLocalDescriptionWithoutError(updated_answer2.release()); |
| 3652 } |
| 3653 |
| 3654 // This test verifies that an answer contains new ufrag and password if an offer |
| 3655 // that changes either the ufrag or password (but not both) is received. |
| 3656 // RFC 5245 says: "If the offer contained a change in the a=ice-ufrag or |
| 3657 // a=ice-pwd attributes compared to the previous SDP from the peer, it |
| 3658 // indicates that ICE is restarting for this media stream." |
| 3659 TEST_F(WebRtcSessionTest, TestOfferChangingOnlyUfragOrPassword) { |
| 3660 Init(); |
| 3661 cricket::MediaSessionOptions options; |
| 3662 options.recv_audio = true; |
| 3663 options.recv_video = true; |
| 3664 // Create an offer with audio and video. |
| 3665 rtc::scoped_ptr<JsepSessionDescription> offer(CreateRemoteOffer(options)); |
| 3666 SetIceUfragPwd(offer.get(), "original_ufrag", "original_password12345"); |
| 3667 SetRemoteDescriptionWithoutError(offer.release()); |
| 3668 |
| 3669 SendAudioVideoStream1(); |
| 3670 rtc::scoped_ptr<SessionDescriptionInterface> answer(CreateAnswer(nullptr)); |
| 3671 SetLocalDescriptionWithoutError(answer.release()); |
| 3672 |
| 3673 // Receive an offer with a new ufrag but stale password. |
| 3674 rtc::scoped_ptr<JsepSessionDescription> ufrag_changed_offer( |
| 3675 CreateRemoteOffer(options, session_->remote_description())); |
| 3676 SetIceUfragPwd(ufrag_changed_offer.get(), "modified_ufrag", |
| 3677 "original_password12345"); |
| 3678 SetRemoteDescriptionWithoutError(ufrag_changed_offer.release()); |
| 3679 |
| 3680 rtc::scoped_ptr<SessionDescriptionInterface> updated_answer1( |
| 3681 CreateAnswer(nullptr)); |
| 3682 EXPECT_FALSE(IceUfragPwdEqual(updated_answer1->description(), |
| 3683 session_->local_description()->description())); |
3660 SetLocalDescriptionWithoutError(updated_answer1.release()); | 3684 SetLocalDescriptionWithoutError(updated_answer1.release()); |
| 3685 |
| 3686 // Receive an offer with a new password but stale ufrag. |
| 3687 rtc::scoped_ptr<JsepSessionDescription> password_changed_offer( |
| 3688 CreateRemoteOffer(options, session_->remote_description())); |
| 3689 SetIceUfragPwd(password_changed_offer.get(), "modified_ufrag", |
| 3690 "modified_password12345"); |
| 3691 SetRemoteDescriptionWithoutError(password_changed_offer.release()); |
| 3692 |
| 3693 rtc::scoped_ptr<SessionDescriptionInterface> updated_answer2( |
| 3694 CreateAnswer(nullptr)); |
| 3695 EXPECT_FALSE(IceUfragPwdEqual(updated_answer2->description(), |
| 3696 session_->local_description()->description())); |
| 3697 SetLocalDescriptionWithoutError(updated_answer2.release()); |
3661 } | 3698 } |
3662 | 3699 |
3663 // This test verifies that an answer contains old ufrag and password if an offer | 3700 // This test verifies that an answer contains old ufrag and password if an offer |
3664 // with old ufrag and password is received. | 3701 // with old ufrag and password is received. |
3665 TEST_F(WebRtcSessionTest, TestCreateAnswerWithOldUfragAndPassword) { | 3702 TEST_F(WebRtcSessionTest, TestCreateAnswerWithOldUfragAndPassword) { |
3666 Init(); | 3703 Init(); |
3667 cricket::MediaSessionOptions options; | 3704 cricket::MediaSessionOptions options; |
3668 options.recv_video = true; | 3705 options.recv_video = true; |
3669 rtc::scoped_ptr<JsepSessionDescription> offer( | 3706 rtc::scoped_ptr<JsepSessionDescription> offer( |
3670 CreateRemoteOffer(options)); | 3707 CreateRemoteOffer(options)); |
3671 SetRemoteDescriptionWithoutError(offer.release()); | 3708 SetRemoteDescriptionWithoutError(offer.release()); |
3672 | 3709 |
3673 SendAudioVideoStream1(); | 3710 SendAudioVideoStream1(); |
3674 rtc::scoped_ptr<SessionDescriptionInterface> answer( | 3711 rtc::scoped_ptr<SessionDescriptionInterface> answer( |
3675 CreateAnswer(NULL)); | 3712 CreateAnswer(NULL)); |
3676 SetLocalDescriptionWithoutError(answer.release()); | 3713 SetLocalDescriptionWithoutError(answer.release()); |
3677 | 3714 |
3678 // Receive an offer without changed ufrag or password. | 3715 // Receive an offer without changed ufrag or password. |
3679 options.audio_transport_options.ice_restart = false; | |
3680 options.video_transport_options.ice_restart = false; | |
3681 options.data_transport_options.ice_restart = false; | |
3682 rtc::scoped_ptr<JsepSessionDescription> updated_offer2( | 3716 rtc::scoped_ptr<JsepSessionDescription> updated_offer2( |
3683 CreateRemoteOffer(options, session_->remote_description())); | 3717 CreateRemoteOffer(options, session_->remote_description())); |
3684 SetRemoteDescriptionWithoutError(updated_offer2.release()); | 3718 SetRemoteDescriptionWithoutError(updated_offer2.release()); |
3685 | 3719 |
3686 rtc::scoped_ptr<SessionDescriptionInterface> updated_answer2( | 3720 rtc::scoped_ptr<SessionDescriptionInterface> updated_answer2( |
3687 CreateAnswer(NULL)); | 3721 CreateAnswer(NULL)); |
3688 | 3722 |
3689 CompareIceUfragAndPassword(updated_answer2->description(), | 3723 EXPECT_TRUE(IceUfragPwdEqual(updated_answer2->description(), |
3690 session_->local_description()->description(), | 3724 session_->local_description()->description())); |
3691 true); | |
3692 | 3725 |
3693 SetLocalDescriptionWithoutError(updated_answer2.release()); | 3726 SetLocalDescriptionWithoutError(updated_answer2.release()); |
3694 } | 3727 } |
3695 | 3728 |
| 3729 // This test verifies that if an offer does an ICE restart on some, but not all |
| 3730 // media sections, the answer will change the ufrag/password in the correct |
| 3731 // media sections. |
| 3732 TEST_F(WebRtcSessionTest, TestCreateAnswerWithNewAndOldUfragAndPassword) { |
| 3733 Init(); |
| 3734 cricket::MediaSessionOptions options; |
| 3735 options.recv_video = true; |
| 3736 options.recv_audio = true; |
| 3737 options.bundle_enabled = false; |
| 3738 rtc::scoped_ptr<JsepSessionDescription> offer(CreateRemoteOffer(options)); |
| 3739 |
| 3740 SetIceUfragPwd(offer.get(), cricket::MEDIA_TYPE_AUDIO, "aaaa", |
| 3741 "aaaaaaaaaaaaaaaaaaaaaa"); |
| 3742 SetIceUfragPwd(offer.get(), cricket::MEDIA_TYPE_VIDEO, "bbbb", |
| 3743 "bbbbbbbbbbbbbbbbbbbbbb"); |
| 3744 SetRemoteDescriptionWithoutError(offer.release()); |
| 3745 |
| 3746 SendAudioVideoStream1(); |
| 3747 rtc::scoped_ptr<SessionDescriptionInterface> answer(CreateAnswer(nullptr)); |
| 3748 SetLocalDescriptionWithoutError(answer.release()); |
| 3749 |
| 3750 // Receive an offer with new ufrag and password, but only for the video media |
| 3751 // section. |
| 3752 rtc::scoped_ptr<JsepSessionDescription> updated_offer( |
| 3753 CreateRemoteOffer(options, session_->remote_description())); |
| 3754 SetIceUfragPwd(updated_offer.get(), cricket::MEDIA_TYPE_VIDEO, "cccc", |
| 3755 "cccccccccccccccccccccc"); |
| 3756 SetRemoteDescriptionWithoutError(updated_offer.release()); |
| 3757 |
| 3758 rtc::scoped_ptr<SessionDescriptionInterface> updated_answer( |
| 3759 CreateAnswer(nullptr)); |
| 3760 |
| 3761 EXPECT_TRUE(IceUfragPwdEqual(updated_answer->description(), |
| 3762 session_->local_description()->description(), |
| 3763 cricket::MEDIA_TYPE_AUDIO)); |
| 3764 |
| 3765 EXPECT_FALSE(IceUfragPwdEqual(updated_answer->description(), |
| 3766 session_->local_description()->description(), |
| 3767 cricket::MEDIA_TYPE_VIDEO)); |
| 3768 |
| 3769 SetLocalDescriptionWithoutError(updated_answer.release()); |
| 3770 } |
| 3771 |
3696 TEST_F(WebRtcSessionTest, TestSessionContentError) { | 3772 TEST_F(WebRtcSessionTest, TestSessionContentError) { |
3697 Init(); | 3773 Init(); |
3698 SendAudioVideoStream1(); | 3774 SendAudioVideoStream1(); |
3699 SessionDescriptionInterface* offer = CreateOffer(); | 3775 SessionDescriptionInterface* offer = CreateOffer(); |
3700 const std::string session_id_orig = offer->session_id(); | 3776 const std::string session_id_orig = offer->session_id(); |
3701 const std::string session_version_orig = offer->session_version(); | 3777 const std::string session_version_orig = offer->session_version(); |
3702 SetLocalDescriptionWithoutError(offer); | 3778 SetLocalDescriptionWithoutError(offer); |
3703 | 3779 |
3704 video_channel_ = media_engine_->GetVideoChannel(0); | 3780 video_channel_ = media_engine_->GetVideoChannel(0); |
3705 video_channel_->set_fail_set_send_codecs(true); | 3781 video_channel_->set_fail_set_send_codecs(true); |
(...skipping 549 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4255 } | 4331 } |
4256 | 4332 |
4257 // TODO(bemasc): Add a TestIceStatesBundle with BUNDLE enabled. That test | 4333 // TODO(bemasc): Add a TestIceStatesBundle with BUNDLE enabled. That test |
4258 // currently fails because upon disconnection and reconnection OnIceComplete is | 4334 // currently fails because upon disconnection and reconnection OnIceComplete is |
4259 // called more than once without returning to IceGatheringGathering. | 4335 // called more than once without returning to IceGatheringGathering. |
4260 | 4336 |
4261 INSTANTIATE_TEST_CASE_P(WebRtcSessionTests, | 4337 INSTANTIATE_TEST_CASE_P(WebRtcSessionTests, |
4262 WebRtcSessionTest, | 4338 WebRtcSessionTest, |
4263 testing::Values(ALREADY_GENERATED, | 4339 testing::Values(ALREADY_GENERATED, |
4264 DTLS_IDENTITY_STORE)); | 4340 DTLS_IDENTITY_STORE)); |
OLD | NEW |