Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(3)

Side by Side Diff: webrtc/api/webrtcsession_unittest.cc

Issue 1671173002: Track pending ICE restarts independently for different media sections. (Closed) Base URL: https://chromium.googlesource.com/external/webrtc.git@master
Patch Set: Extend ICE restart test to check that a second answer has new credentials. Created 4 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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 741 matching lines...) Expand 10 before | Expand all | Expand 10 after
752 } 752 }
753 if (transport_desc1->ice_pwd != transport_desc2->ice_pwd || 753 if (transport_desc1->ice_pwd != transport_desc2->ice_pwd ||
754 transport_desc1->ice_ufrag != transport_desc2->ice_ufrag) { 754 transport_desc1->ice_ufrag != transport_desc2->ice_ufrag) {
755 EXPECT_FALSE(expect_equal); 755 EXPECT_FALSE(expect_equal);
756 return; 756 return;
757 } 757 }
758 } 758 }
759 EXPECT_TRUE(expect_equal); 759 EXPECT_TRUE(expect_equal);
760 } 760 }
761 761
762 // Compares ufrag/password only for the specified media type.
763 void CompareIceUfragAndPassword(const cricket::SessionDescription* desc1,
764 const cricket::SessionDescription* desc2,
765 cricket::MediaType media_type,
766 bool expect_equal) {
pthatcher1 2016/02/17 06:46:58 Can you wrap this in something with the name "Expe
Taylor Brandstetter 2016/02/17 21:43:50 Again, just copy/pasted code. But I'll fix it...
767 if (desc1->contents().size() != desc2->contents().size()) {
768 EXPECT_FALSE(expect_equal);
pthatcher1 2016/02/17 06:46:58 The test errors will be easier to read if you writ
Taylor Brandstetter 2016/02/17 21:43:50 I just made this function return a bool. I think i
769 return;
770 }
771
772 const cricket::ContentInfo* cinfo =
773 cricket::GetFirstMediaContent(desc1->contents(), media_type);
774 const cricket::TransportDescription* transport_desc1 =
775 desc1->GetTransportDescriptionByName(cinfo->name);
776 const cricket::TransportDescription* transport_desc2 =
777 desc2->GetTransportDescriptionByName(cinfo->name);
778 if (!transport_desc1 || !transport_desc2) {
779 EXPECT_FALSE(expect_equal);
780 return;
781 }
782 if (transport_desc1->ice_pwd != transport_desc2->ice_pwd ||
783 transport_desc1->ice_ufrag != transport_desc2->ice_ufrag) {
784 EXPECT_FALSE(expect_equal);
785 return;
786 }
787 EXPECT_TRUE(expect_equal);
788 }
789
762 void RemoveIceUfragPwdLines(const SessionDescriptionInterface* current_desc, 790 void RemoveIceUfragPwdLines(const SessionDescriptionInterface* current_desc,
763 std::string *sdp) { 791 std::string *sdp) {
764 const cricket::SessionDescription* desc = current_desc->description(); 792 const cricket::SessionDescription* desc = current_desc->description();
765 EXPECT_TRUE(current_desc->ToString(sdp)); 793 EXPECT_TRUE(current_desc->ToString(sdp));
766 794
767 const cricket::ContentInfos& contents = desc->contents(); 795 const cricket::ContentInfos& contents = desc->contents();
768 cricket::ContentInfos::const_iterator it = contents.begin(); 796 cricket::ContentInfos::const_iterator it = contents.begin();
769 // Replace ufrag and pwd lines with empty strings. 797 // Replace ufrag and pwd lines with empty strings.
770 for (; it != contents.end(); ++it) { 798 for (; it != contents.end(); ++it) {
771 const cricket::TransportDescription* transport_desc = 799 const cricket::TransportDescription* transport_desc =
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
805 std::string mod_pwd = "a=ice-pwd:" + modified_ice_pwd + "\r\n"; 833 std::string mod_pwd = "a=ice-pwd:" + modified_ice_pwd + "\r\n";
806 rtc::replace_substrs(ufrag_line.c_str(), ufrag_line.length(), 834 rtc::replace_substrs(ufrag_line.c_str(), ufrag_line.length(),
807 mod_ufrag.c_str(), mod_ufrag.length(), 835 mod_ufrag.c_str(), mod_ufrag.length(),
808 sdp); 836 sdp);
809 rtc::replace_substrs(pwd_line.c_str(), pwd_line.length(), 837 rtc::replace_substrs(pwd_line.c_str(), pwd_line.length(),
810 mod_pwd.c_str(), mod_pwd.length(), 838 mod_pwd.c_str(), mod_pwd.length(),
811 sdp); 839 sdp);
812 } 840 }
813 } 841 }
814 842
843 // Modifies ufrag/pwd for specified |media_type|, by directly modifying the
844 // description.
845 void ModifyIceUfragPwd(SessionDescriptionInterface* current_desc,
846 cricket::MediaType media_type,
847 const std::string& modified_ice_ufrag,
848 const std::string& modified_ice_pwd) {
pthatcher1 2016/02/17 06:46:58 Why not just call it SetIceUfragPwd and remove the
pthatcher1 2016/02/17 06:46:58 I think |ufrag| and |pwd| are probably sufficient
Taylor Brandstetter 2016/02/17 21:43:50 Done.
Taylor Brandstetter 2016/02/17 21:43:50 Done.
849 cricket::SessionDescription* desc = current_desc->description();
850 const cricket::ContentInfo* cinfo =
851 cricket::GetFirstMediaContent(desc->contents(), media_type);
852 // Replace ufrag and pwd with |modified_ice_ufrag| and
853 // |modified_ice_pwd| strings.
854 TransportInfo* transport_info = desc->GetTransportInfoByName(cinfo->name);
855 cricket::TransportDescription* transport_desc =
856 &transport_info->description;
857 transport_desc->ice_ufrag = modified_ice_ufrag;
858 transport_desc->ice_pwd = modified_ice_pwd;
859 }
860
815 // Creates a remote offer and and applies it as a remote description, 861 // Creates a remote offer and and applies it as a remote description,
816 // creates a local answer and applies is as a local description. 862 // creates a local answer and applies is as a local description.
817 // Call SendAudioVideoStreamX() before this function 863 // Call SendAudioVideoStreamX() before this function
818 // to decide which local and remote streams to create. 864 // to decide which local and remote streams to create.
819 void CreateAndSetRemoteOfferAndLocalAnswer() { 865 void CreateAndSetRemoteOfferAndLocalAnswer() {
820 SessionDescriptionInterface* offer = CreateRemoteOffer(); 866 SessionDescriptionInterface* offer = CreateRemoteOffer();
821 SetRemoteDescriptionWithoutError(offer); 867 SetRemoteDescriptionWithoutError(offer);
822 SessionDescriptionInterface* answer = CreateAnswer(NULL); 868 SessionDescriptionInterface* answer = CreateAnswer(NULL);
823 SetLocalDescriptionWithoutError(answer); 869 SetLocalDescriptionWithoutError(answer);
824 } 870 }
(...skipping 2810 matching lines...) Expand 10 before | Expand all | Expand 10 after
3635 rtc::scoped_ptr<JsepSessionDescription> offer( 3681 rtc::scoped_ptr<JsepSessionDescription> offer(
3636 CreateRemoteOffer(options)); 3682 CreateRemoteOffer(options));
3637 SetRemoteDescriptionWithoutError(offer.release()); 3683 SetRemoteDescriptionWithoutError(offer.release());
3638 3684
3639 SendAudioVideoStream1(); 3685 SendAudioVideoStream1();
3640 rtc::scoped_ptr<SessionDescriptionInterface> answer( 3686 rtc::scoped_ptr<SessionDescriptionInterface> answer(
3641 CreateAnswer(NULL)); 3687 CreateAnswer(NULL));
3642 SetLocalDescriptionWithoutError(answer.release()); 3688 SetLocalDescriptionWithoutError(answer.release());
3643 3689
3644 // Receive an offer with new ufrag and password. 3690 // Receive an offer with new ufrag and password.
3645 options.audio_transport_options.ice_restart = true; 3691 for (const cricket::ContentInfo& content :
3646 options.video_transport_options.ice_restart = true; 3692 session_->local_description()->description()->contents()) {
3647 options.data_transport_options.ice_restart = true; 3693 options.transport_options[content.name].ice_restart = true;
3694 }
3648 rtc::scoped_ptr<JsepSessionDescription> updated_offer1( 3695 rtc::scoped_ptr<JsepSessionDescription> updated_offer1(
3649 CreateRemoteOffer(options, session_->remote_description())); 3696 CreateRemoteOffer(options, session_->remote_description()));
3650 SetRemoteDescriptionWithoutError(updated_offer1.release()); 3697 SetRemoteDescriptionWithoutError(updated_offer1.release());
3651 3698
3652 rtc::scoped_ptr<SessionDescriptionInterface> updated_answer1( 3699 rtc::scoped_ptr<SessionDescriptionInterface> updated_answer1(
3653 CreateAnswer(NULL)); 3700 CreateAnswer(NULL));
3654 3701
3655 CompareIceUfragAndPassword(updated_answer1->description(), 3702 CompareIceUfragAndPassword(updated_answer1->description(),
3656 session_->local_description()->description(), 3703 session_->local_description()->description(),
3657 false); 3704 false);
3658 3705
3659 SetLocalDescriptionWithoutError(updated_answer1.release()); 3706 // Even a second answer (created before the description is set) should have
3707 // a new ufrag/password.
3708 rtc::scoped_ptr<SessionDescriptionInterface> updated_answer2(
3709 CreateAnswer(NULL));
3710
3711 CompareIceUfragAndPassword(updated_answer2->description(),
3712 session_->local_description()->description(),
3713 false);
3714
3715 SetLocalDescriptionWithoutError(updated_answer2.release());
3660 } 3716 }
3661 3717
3662 // This test verifies that an answer contains old ufrag and password if an offer 3718 // This test verifies that an answer contains old ufrag and password if an offer
3663 // with old ufrag and password is received. 3719 // with old ufrag and password is received.
3664 TEST_F(WebRtcSessionTest, TestCreateAnswerWithOldUfragAndPassword) { 3720 TEST_F(WebRtcSessionTest, TestCreateAnswerWithOldUfragAndPassword) {
3665 Init(); 3721 Init();
3666 cricket::MediaSessionOptions options; 3722 cricket::MediaSessionOptions options;
3667 options.recv_video = true; 3723 options.recv_video = true;
3668 rtc::scoped_ptr<JsepSessionDescription> offer( 3724 rtc::scoped_ptr<JsepSessionDescription> offer(
3669 CreateRemoteOffer(options)); 3725 CreateRemoteOffer(options));
3670 SetRemoteDescriptionWithoutError(offer.release()); 3726 SetRemoteDescriptionWithoutError(offer.release());
3671 3727
3672 SendAudioVideoStream1(); 3728 SendAudioVideoStream1();
3673 rtc::scoped_ptr<SessionDescriptionInterface> answer( 3729 rtc::scoped_ptr<SessionDescriptionInterface> answer(
3674 CreateAnswer(NULL)); 3730 CreateAnswer(NULL));
3675 SetLocalDescriptionWithoutError(answer.release()); 3731 SetLocalDescriptionWithoutError(answer.release());
3676 3732
3677 // Receive an offer without changed ufrag or password. 3733 // Receive an offer without changed ufrag or password.
3678 options.audio_transport_options.ice_restart = false;
3679 options.video_transport_options.ice_restart = false;
3680 options.data_transport_options.ice_restart = false;
3681 rtc::scoped_ptr<JsepSessionDescription> updated_offer2( 3734 rtc::scoped_ptr<JsepSessionDescription> updated_offer2(
3682 CreateRemoteOffer(options, session_->remote_description())); 3735 CreateRemoteOffer(options, session_->remote_description()));
3683 SetRemoteDescriptionWithoutError(updated_offer2.release()); 3736 SetRemoteDescriptionWithoutError(updated_offer2.release());
3684 3737
3685 rtc::scoped_ptr<SessionDescriptionInterface> updated_answer2( 3738 rtc::scoped_ptr<SessionDescriptionInterface> updated_answer2(
3686 CreateAnswer(NULL)); 3739 CreateAnswer(NULL));
3687 3740
3688 CompareIceUfragAndPassword(updated_answer2->description(), 3741 CompareIceUfragAndPassword(updated_answer2->description(),
3689 session_->local_description()->description(), 3742 session_->local_description()->description(),
3690 true); 3743 true);
3691 3744
3692 SetLocalDescriptionWithoutError(updated_answer2.release()); 3745 SetLocalDescriptionWithoutError(updated_answer2.release());
3693 } 3746 }
3694 3747
3748 // This test verifies that if an offer does an ICE restart on some, but not all
3749 // media sections, the answer will change the ufrag/password in the correct
3750 // media sections.
3751 TEST_F(WebRtcSessionTest, TestCreateAnswerWithNewAndOldUfragAndPassword) {
3752 Init();
3753 cricket::MediaSessionOptions options;
3754 options.recv_video = true;
3755 options.recv_audio = true;
3756 options.bundle_enabled = false;
3757 rtc::scoped_ptr<JsepSessionDescription> offer(CreateRemoteOffer(options));
3758
3759 ModifyIceUfragPwd(offer.get(), cricket::MEDIA_TYPE_AUDIO, "aaaa",
3760 "aaaaaaaaaaaaaaaaaaaaaa");
pthatcher1 2016/02/17 06:46:58 This might be more readable as "ufrag_a1" and "pwd
Taylor Brandstetter 2016/02/17 21:43:50 I think "a", "b" and "c" makes it more clear since
3761 ModifyIceUfragPwd(offer.get(), cricket::MEDIA_TYPE_VIDEO, "bbbb",
3762 "bbbbbbbbbbbbbbbbbbbbbb");
3763 SetRemoteDescriptionWithoutError(offer.release());
3764
3765 SendAudioVideoStream1();
3766 rtc::scoped_ptr<SessionDescriptionInterface> answer(CreateAnswer(nullptr));
3767 SetLocalDescriptionWithoutError(answer.release());
3768
3769 // Receive an offer with new ufrag and password, but only for the video media
3770 // section.
3771 rtc::scoped_ptr<JsepSessionDescription> updated_offer(
3772 CreateRemoteOffer(options, session_->remote_description()));
3773 ModifyIceUfragPwd(updated_offer.get(), cricket::MEDIA_TYPE_VIDEO, "cccc",
3774 "cccccccccccccccccccccc");
3775 SetRemoteDescriptionWithoutError(updated_offer.release());
3776
3777 rtc::scoped_ptr<SessionDescriptionInterface> updated_answer(
3778 CreateAnswer(nullptr));
3779
3780 CompareIceUfragAndPassword(updated_answer->description(),
3781 session_->local_description()->description(),
3782 cricket::MEDIA_TYPE_AUDIO, true);
3783
3784 CompareIceUfragAndPassword(updated_answer->description(),
3785 session_->local_description()->description(),
3786 cricket::MEDIA_TYPE_VIDEO, false);
3787
3788 SetLocalDescriptionWithoutError(updated_answer.release());
pthatcher1 2016/02/17 06:46:58 Should we also test if you change only the ufrag o
Taylor Brandstetter 2016/02/17 21:43:50 Maybe? What SHOULD we do when that happens? Is it
pthatcher1 2016/02/17 21:53:38 I think we should treat changing either as restart
Taylor Brandstetter 2016/02/18 00:33:21 I was more asking what the spec says. The spec def
3789 }
3790
3695 TEST_F(WebRtcSessionTest, TestSessionContentError) { 3791 TEST_F(WebRtcSessionTest, TestSessionContentError) {
3696 Init(); 3792 Init();
3697 SendAudioVideoStream1(); 3793 SendAudioVideoStream1();
3698 SessionDescriptionInterface* offer = CreateOffer(); 3794 SessionDescriptionInterface* offer = CreateOffer();
3699 const std::string session_id_orig = offer->session_id(); 3795 const std::string session_id_orig = offer->session_id();
3700 const std::string session_version_orig = offer->session_version(); 3796 const std::string session_version_orig = offer->session_version();
3701 SetLocalDescriptionWithoutError(offer); 3797 SetLocalDescriptionWithoutError(offer);
3702 3798
3703 video_channel_ = media_engine_->GetVideoChannel(0); 3799 video_channel_ = media_engine_->GetVideoChannel(0);
3704 video_channel_->set_fail_set_send_codecs(true); 3800 video_channel_->set_fail_set_send_codecs(true);
(...skipping 571 matching lines...) Expand 10 before | Expand all | Expand 10 after
4276 } 4372 }
4277 4373
4278 // TODO(bemasc): Add a TestIceStatesBundle with BUNDLE enabled. That test 4374 // TODO(bemasc): Add a TestIceStatesBundle with BUNDLE enabled. That test
4279 // currently fails because upon disconnection and reconnection OnIceComplete is 4375 // currently fails because upon disconnection and reconnection OnIceComplete is
4280 // called more than once without returning to IceGatheringGathering. 4376 // called more than once without returning to IceGatheringGathering.
4281 4377
4282 INSTANTIATE_TEST_CASE_P(WebRtcSessionTests, 4378 INSTANTIATE_TEST_CASE_P(WebRtcSessionTests,
4283 WebRtcSessionTest, 4379 WebRtcSessionTest,
4284 testing::Values(ALREADY_GENERATED, 4380 testing::Values(ALREADY_GENERATED,
4285 DTLS_IDENTITY_STORE)); 4381 DTLS_IDENTITY_STORE));
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698