diff --git a/media/webrtc/signaling/gtest/jsep_session_unittest.cpp b/media/webrtc/signaling/gtest/jsep_session_unittest.cpp index cb5060edb23b..2c5c6db92dec 100644 --- a/media/webrtc/signaling/gtest/jsep_session_unittest.cpp +++ b/media/webrtc/signaling/gtest/jsep_session_unittest.cpp @@ -4223,4 +4223,879 @@ TEST_F(JsepSessionTest, TestNonDefaultProtocol) parsedOffer->GetMediaSection(1).GetProtocol()); } +TEST_F(JsepSessionTest, CreateOfferNoVideoStreamRecvVideo) +{ + types.push_back(SdpMediaSection::kAudio); + AddTracks(mSessionOff, "audio"); + + JsepOfferOptions options; + options.mOfferToReceiveAudio = Some(static_cast(1U)); + options.mOfferToReceiveVideo = Some(static_cast(1U)); + + CreateOffer(Some(options)); +} + +TEST_F(JsepSessionTest, CreateOfferNoAudioStreamRecvAudio) +{ + types.push_back(SdpMediaSection::kVideo); + AddTracks(mSessionOff, "video"); + + JsepOfferOptions options; + options.mOfferToReceiveAudio = Some(static_cast(1U)); + options.mOfferToReceiveVideo = Some(static_cast(1U)); + + CreateOffer(Some(options)); +} + +TEST_F(JsepSessionTest, CreateOfferNoVideoStream) +{ + types.push_back(SdpMediaSection::kAudio); + AddTracks(mSessionOff, "audio"); + + JsepOfferOptions options; + options.mOfferToReceiveAudio = Some(static_cast(1U)); + options.mOfferToReceiveVideo = Some(static_cast(0U)); + + CreateOffer(Some(options)); +} + +TEST_F(JsepSessionTest, CreateOfferNoAudioStream) +{ + types.push_back(SdpMediaSection::kVideo); + AddTracks(mSessionOff, "video"); + + JsepOfferOptions options; + options.mOfferToReceiveAudio = Some(static_cast(0U)); + options.mOfferToReceiveVideo = Some(static_cast(1U)); + + CreateOffer(Some(options)); +} + +TEST_F(JsepSessionTest, CreateOfferDontReceiveAudio) +{ + types.push_back(SdpMediaSection::kAudio); + types.push_back(SdpMediaSection::kVideo); + AddTracks(mSessionOff, "audio,video"); + + JsepOfferOptions options; + options.mOfferToReceiveAudio = Some(static_cast(0U)); + options.mOfferToReceiveVideo = Some(static_cast(1U)); + + CreateOffer(Some(options)); +} + +TEST_F(JsepSessionTest, CreateOfferDontReceiveVideo) +{ + types.push_back(SdpMediaSection::kAudio); + types.push_back(SdpMediaSection::kVideo); + AddTracks(mSessionOff, "audio,video"); + + JsepOfferOptions options; + options.mOfferToReceiveAudio = Some(static_cast(1U)); + options.mOfferToReceiveVideo = Some(static_cast(0U)); + + CreateOffer(Some(options)); +} + +TEST_F(JsepSessionTest, CreateOfferRemoveAudioTrack) +{ + types.push_back(SdpMediaSection::kAudio); + types.push_back(SdpMediaSection::kVideo); + AddTracks(mSessionOff, "audio,video"); + + JsepOfferOptions options; + options.mOfferToReceiveAudio = Some(static_cast(1U)); + options.mOfferToReceiveVideo = Some(static_cast(0U)); + + RefPtr removedTrack = GetTrackOff(0, types.front()); + ASSERT_TRUE(removedTrack); + ASSERT_EQ(NS_OK, mSessionOff.RemoveTrack(removedTrack->GetStreamId(), + removedTrack->GetTrackId())); + + CreateOffer(Some(options)); +} + +TEST_F(JsepSessionTest, CreateOfferDontReceiveAudioRemoveAudioTrack) +{ + types.push_back(SdpMediaSection::kAudio); + types.push_back(SdpMediaSection::kVideo); + AddTracks(mSessionOff, "audio,video"); + + JsepOfferOptions options; + options.mOfferToReceiveAudio = Some(static_cast(0U)); + options.mOfferToReceiveVideo = Some(static_cast(1U)); + + RefPtr removedTrack = GetTrackOff(0, types.front()); + ASSERT_TRUE(removedTrack); + ASSERT_EQ(NS_OK, mSessionOff.RemoveTrack(removedTrack->GetStreamId(), + removedTrack->GetTrackId())); + + CreateOffer(Some(options)); +} + +TEST_F(JsepSessionTest, CreateOfferDontReceiveVideoRemoveVideoTrack) +{ + types.push_back(SdpMediaSection::kAudio); + types.push_back(SdpMediaSection::kVideo); + AddTracks(mSessionOff, "audio,video"); + + JsepOfferOptions options; + options.mOfferToReceiveAudio = Some(static_cast(1U)); + options.mOfferToReceiveVideo = Some(static_cast(0U)); + + RefPtr removedTrack = GetTrackOff(0, types.back()); + ASSERT_TRUE(removedTrack); + ASSERT_EQ(NS_OK, mSessionOff.RemoveTrack(removedTrack->GetStreamId(), + removedTrack->GetTrackId())); + + CreateOffer(Some(options)); +} + +static const std::string strSampleCandidate = + "a=candidate:1 1 UDP 2130706431 192.168.2.1 50005 typ host\r\n"; + +static const unsigned short nSamplelevel = 2; + +TEST_F(JsepSessionTest, CreateOfferAddCandidate) +{ + types.push_back(SdpMediaSection::kAudio); + AddTracks(mSessionOff, "audio"); + std::string offer = CreateOffer(); + SetLocalOffer(offer); + + std::string mid; + bool skipped; + nsresult rv; + rv = mSessionOff.AddLocalIceCandidate(strSampleCandidate, + nSamplelevel, &mid, &skipped); + ASSERT_EQ(NS_OK, rv); +} + +TEST_F(JsepSessionTest, AddIceCandidateEarly) +{ + std::string mid; + bool skipped; + nsresult rv; + rv = mSessionOff.AddLocalIceCandidate(strSampleCandidate, + nSamplelevel, &mid, &skipped); + + // This can't succeed without a local description + ASSERT_NE(NS_OK, rv); +} + +TEST_F(JsepSessionTest, OfferAnswerDontAddAudioStreamOnAnswerNoOptions) +{ + types.push_back(SdpMediaSection::kAudio); + types.push_back(SdpMediaSection::kVideo); + AddTracks(mSessionOff, "audio,video"); + AddTracks(mSessionAns, "video"); + + JsepOfferOptions options; + options.mOfferToReceiveAudio = Some(static_cast(1U)); + options.mOfferToReceiveVideo = Some(static_cast(1U)); + + CreateOffer(Some(options)); + std::string offer = CreateOffer(Some(options)); + SetLocalOffer(offer); + SetRemoteOffer(offer); + std::string answer = CreateAnswer(); + SetLocalAnswer(answer, CHECK_SUCCESS); + SetRemoteAnswer(answer, CHECK_SUCCESS); +} + +TEST_F(JsepSessionTest, OfferAnswerDontAddVideoStreamOnAnswerNoOptions) +{ + types.push_back(SdpMediaSection::kAudio); + types.push_back(SdpMediaSection::kVideo); + AddTracks(mSessionOff, "audio,video"); + AddTracks(mSessionAns, "audio"); + + JsepOfferOptions options; + options.mOfferToReceiveAudio = Some(static_cast(1U)); + options.mOfferToReceiveVideo = Some(static_cast(1U)); + + CreateOffer(Some(options)); + std::string offer = CreateOffer(Some(options)); + SetLocalOffer(offer); + SetRemoteOffer(offer); + std::string answer = CreateAnswer(); + SetLocalAnswer(answer, CHECK_SUCCESS); + SetRemoteAnswer(answer, CHECK_SUCCESS); +} + +TEST_F(JsepSessionTest, OfferAnswerDontAddAudioVideoStreamsOnAnswerNoOptions) +{ + types.push_back(SdpMediaSection::kAudio); + types.push_back(SdpMediaSection::kVideo); + AddTracks(mSessionOff, "audio,video"); + AddTracks(mSessionAns); + + JsepOfferOptions options; + options.mOfferToReceiveAudio = Some(static_cast(1U)); + options.mOfferToReceiveVideo = Some(static_cast(1U)); + + OfferAnswer(); +} + +TEST_F(JsepSessionTest, OfferAndAnswerWithExtraCodec) +{ + types.push_back(SdpMediaSection::kAudio); + AddTracks(mSessionOff, "audio"); + AddTracks(mSessionAns, "audio"); + std::string offer = CreateOffer(); + SetLocalOffer(offer); + SetRemoteOffer(offer); + std::string answer = CreateAnswer(); + + UniquePtr munge = Parse(answer); + SdpMediaSection& mediaSection = munge->GetMediaSection(0); + mediaSection.AddCodec("8", "PCMA", 8000, 1); + std::string sdpString = munge->ToString(); + + SetLocalAnswer(sdpString); + SetRemoteAnswer(answer); +} + +TEST_F(JsepSessionTest, AddCandidateInHaveLocalOffer) { + types.push_back(SdpMediaSection::kAudio); + AddTracks(mSessionOff, "audio"); + std::string offer = CreateOffer(); + SetLocalOffer(offer); + + nsresult rv; + std::string mid; + rv = mSessionOff.AddRemoteIceCandidate(strSampleCandidate, + mid, nSamplelevel); + ASSERT_EQ(NS_ERROR_UNEXPECTED, rv); +} + +TEST_F(JsepSessionTest, SetLocalWithoutCreateOffer) { + types.push_back(SdpMediaSection::kAudio); + AddTracks(mSessionOff, "audio"); + AddTracks(mSessionAns, "audio"); + + std::string offer = CreateOffer(); + nsresult rv = mSessionAns.SetLocalDescription(kJsepSdpOffer, offer); + ASSERT_EQ(NS_ERROR_UNEXPECTED, rv); +} + +TEST_F(JsepSessionTest, SetLocalWithoutCreateAnswer) { + types.push_back(SdpMediaSection::kAudio); + AddTracks(mSessionOff, "audio"); + AddTracks(mSessionAns, "audio"); + + std::string offer = CreateOffer(); + SetRemoteOffer(offer); + nsresult rv = mSessionAns.SetLocalDescription(kJsepSdpAnswer, offer); + ASSERT_EQ(NS_ERROR_UNEXPECTED, rv); +} + +// Test for Bug 843595 +TEST_F(JsepSessionTest, missingUfrag) +{ + types.push_back(SdpMediaSection::kAudio); + AddTracks(mSessionOff, "audio"); + AddTracks(mSessionAns, "audio"); + std::string offer = CreateOffer(); + std::string ufrag = "ice-ufrag"; + std::size_t pos = offer.find(ufrag); + ASSERT_NE(pos, std::string::npos); + offer.replace(pos, ufrag.length(), "ice-ufrog"); + nsresult rv = mSessionAns.SetRemoteDescription(kJsepSdpOffer, offer); + ASSERT_EQ(NS_ERROR_INVALID_ARG, rv); +} + +TEST_F(JsepSessionTest, AudioOnlyCalleeNoRtcpMux) +{ + types.push_back(SdpMediaSection::kAudio); + AddTracks(mSessionOff, "audio"); + AddTracks(mSessionAns, "audio"); + std::string offer = CreateOffer(); + std::string rtcp_mux = "a=rtcp-mux\r\n"; + std::size_t pos = offer.find(rtcp_mux); + ASSERT_NE(pos, std::string::npos); + offer.replace(pos, rtcp_mux.length(), ""); + SetLocalOffer(offer); + SetRemoteOffer(offer); + std::string answer = CreateAnswer(); + pos = answer.find(rtcp_mux); + ASSERT_EQ(pos, std::string::npos); +} + +// This test comes from Bug 810220 +TEST_F(JsepSessionTest, AudioOnlyG711Call) +{ + std::string offer = + "v=0\r\n" + "o=- 1 1 IN IP4 148.147.200.251\r\n" + "s=-\r\n" + "b=AS:64\r\n" + "t=0 0\r\n" + "a=fingerprint:sha-256 F3:FA:20:C0:CD:48:C4:5F:02:5F:A5:D3:21:D0:2D:48:" + "7B:31:60:5C:5A:D8:0D:CD:78:78:6C:6D:CE:CC:0C:67\r\n" + "m=audio 9000 UDP/TLS/RTP/SAVPF 0 8 126\r\n" + "c=IN IP4 148.147.200.251\r\n" + "b=TIAS:64000\r\n" + "a=rtpmap:0 PCMU/8000\r\n" + "a=rtpmap:8 PCMA/8000\r\n" + "a=rtpmap:126 telephone-event/8000\r\n" + "a=candidate:0 1 udp 2130706432 148.147.200.251 9000 typ host\r\n" + "a=candidate:0 2 udp 2130706432 148.147.200.251 9005 typ host\r\n" + "a=ice-ufrag:cYuakxkEKH+RApYE\r\n" + "a=ice-pwd:bwtpzLZD+3jbu8vQHvEa6Xuq\r\n" + "a=setup:active\r\n" + "a=sendrecv\r\n"; + + types.push_back(SdpMediaSection::kAudio); + AddTracks(mSessionAns, "audio"); + SetRemoteOffer(offer, CHECK_SUCCESS); + std::string answer = CreateAnswer(); + + // They didn't offer opus, so our answer shouldn't include it. + ASSERT_EQ(answer.find(" opus/"), std::string::npos); + + // They also didn't offer video or application + ASSERT_EQ(answer.find("video"), std::string::npos); + ASSERT_EQ(answer.find("application"), std::string::npos); + + // We should answer with PCMU and telephone-event + ASSERT_NE(answer.find(" PCMU/8000"), std::string::npos); + + // Double-check the directionality + ASSERT_NE(answer.find("\r\na=sendrecv"), std::string::npos); + +} + +TEST_F(JsepSessionTest, AudioOnlyG722Only) +{ + types.push_back(SdpMediaSection::kAudio); + AddTracks(mSessionOff, "audio"); + AddTracks(mSessionAns, "audio"); + std::string offer = CreateOffer(); + SetLocalOffer(offer); + + std::string audio = "m=audio 9 UDP/TLS/RTP/SAVPF 109 9 0 8 101\r\n"; + std::size_t pos = offer.find(audio); + ASSERT_NE(pos, std::string::npos); + offer.replace(pos, audio.length(), + "m=audio 65375 UDP/TLS/RTP/SAVPF 9\r\n"); + SetRemoteOffer(offer); + + std::string answer = CreateAnswer(); + SetLocalAnswer(answer); + ASSERT_NE(mSessionAns.GetLocalDescription().find("UDP/TLS/RTP/SAVPF 9\r"), + std::string::npos); + ASSERT_NE(mSessionAns.GetLocalDescription().find("a=rtpmap:9 G722/8000"), + std::string::npos); +} + +TEST_F(JsepSessionTest, AudioOnlyG722Rejected) +{ + types.push_back(SdpMediaSection::kAudio); + AddTracks(mSessionOff, "audio"); + AddTracks(mSessionAns, "audio"); + std::string offer = CreateOffer(); + SetLocalOffer(offer); + + std::string audio = "m=audio 9 UDP/TLS/RTP/SAVPF 109 9 0 8 101\r\n"; + std::size_t pos = offer.find(audio); + ASSERT_NE(pos, std::string::npos); + offer.replace(pos, audio.length(), + "m=audio 65375 UDP/TLS/RTP/SAVPF 0 8\r\n"); + SetRemoteOffer(offer); + + std::string answer = CreateAnswer(); + SetLocalAnswer(answer); + SetRemoteAnswer(answer); + + // TODO(bug 814227): Use commented out code instead. + ASSERT_NE(mSessionAns.GetLocalDescription().find("UDP/TLS/RTP/SAVPF 0\r"), + std::string::npos); + // ASSERT_NE(mSessionAns.GetLocalDescription().find("UDP/TLS/RTP/SAVPF 0 8\r"), std::string::npos); + ASSERT_NE(mSessionAns.GetLocalDescription().find("a=rtpmap:0 PCMU/8000"), std::string::npos); + ASSERT_EQ(mSessionAns.GetLocalDescription().find("a=rtpmap:109 opus/48000/2"), std::string::npos); + ASSERT_EQ(mSessionAns.GetLocalDescription().find("a=rtpmap:9 G722/8000"), std::string::npos); +} + +// This test doesn't make sense for bundle +TEST_F(JsepSessionTest, DISABLED_FullCallAudioNoMuxVideoMux) +{ + types.push_back(SdpMediaSection::kAudio); + AddTracks(mSessionOff, "audio,video"); + AddTracks(mSessionAns, "audio,video"); + std::string offer = CreateOffer(); + SetLocalOffer(offer); + std::string rtcp_mux = "a=rtcp-mux\r\n"; + std::size_t pos = offer.find(rtcp_mux); + ASSERT_NE(pos, std::string::npos); + offer.replace(pos, rtcp_mux.length(), ""); + SetRemoteOffer(offer); + std::string answer = CreateAnswer(); + + size_t match = mSessionAns.GetLocalDescription().find("\r\na=rtcp-mux"); + ASSERT_NE(match, std::string::npos); + match = mSessionAns.GetLocalDescription().find("\r\na=rtcp-mux", match + 1); + ASSERT_EQ(match, std::string::npos); +} + +// Disabled pending resolution of bug 818640. +// Actually, this test is completely broken; you can't just call +// SetRemote/CreateAnswer over and over again. +TEST_F(JsepSessionTest, DISABLED_OfferAllDynamicTypes) +{ + types.push_back(SdpMediaSection::kAudio); + AddTracks(mSessionAns, "audio"); + + std::string offer; + for (int i = 96; i < 128; i++) + { + std::stringstream ss; + ss << i; + std::cout << "Trying dynamic pt = " << i << std::endl; + offer = + "v=0\r\n" + "o=- 1 1 IN IP4 148.147.200.251\r\n" + "s=-\r\n" + "b=AS:64\r\n" + "t=0 0\r\n" + "a=fingerprint:sha-256 F3:FA:20:C0:CD:48:C4:5F:02:5F:A5:D3:21:D0:2D:48:" + "7B:31:60:5C:5A:D8:0D:CD:78:78:6C:6D:CE:CC:0C:67\r\n" + "m=audio 9000 RTP/AVP " + ss.str() + "\r\n" + "c=IN IP4 148.147.200.251\r\n" + "b=TIAS:64000\r\n" + "a=rtpmap:" + ss.str() +" opus/48000/2\r\n" + "a=candidate:0 1 udp 2130706432 148.147.200.251 9000 typ host\r\n" + "a=candidate:0 2 udp 2130706432 148.147.200.251 9005 typ host\r\n" + "a=ice-ufrag:cYuakxkEKH+RApYE\r\n" + "a=ice-pwd:bwtpzLZD+3jbu8vQHvEa6Xuq\r\n" + "a=sendrecv\r\n"; + + SetRemoteOffer(offer, CHECK_SUCCESS); + std::string answer = CreateAnswer(); + ASSERT_NE(answer.find(ss.str() + " opus/"), std::string::npos); + } +} + +TEST_F(JsepSessionTest, ipAddrAnyOffer) +{ + std::string offer = + "v=0\r\n" + "o=- 1 1 IN IP4 127.0.0.1\r\n" + "s=-\r\n" + "b=AS:64\r\n" + "t=0 0\r\n" + "a=fingerprint:sha-256 F3:FA:20:C0:CD:48:C4:5F:02:5F:A5:D3:21:D0:2D:48:" + "7B:31:60:5C:5A:D8:0D:CD:78:78:6C:6D:CE:CC:0C:67\r\n" + "m=audio 9000 UDP/TLS/RTP/SAVPF 99\r\n" + "c=IN IP4 0.0.0.0\r\n" + "a=rtpmap:99 opus/48000/2\r\n" + "a=ice-ufrag:cYuakxkEKH+RApYE\r\n" + "a=ice-pwd:bwtpzLZD+3jbu8vQHvEa6Xuq\r\n" + "a=setup:active\r\n" + "a=sendrecv\r\n"; + + types.push_back(SdpMediaSection::kAudio); + AddTracks(mSessionAns, "audio"); + SetRemoteOffer(offer, CHECK_SUCCESS); + std::string answer = CreateAnswer(); + + ASSERT_NE(answer.find("a=sendrecv"), std::string::npos); +} + +static void CreateSDPForBigOTests(std::string& offer, const std::string& number) { + offer = + "v=0\r\n" + "o=- "; + offer += number; + offer += " "; + offer += number; + offer += " IN IP4 127.0.0.1\r\n" + "s=-\r\n" + "b=AS:64\r\n" + "t=0 0\r\n" + "a=fingerprint:sha-256 F3:FA:20:C0:CD:48:C4:5F:02:5F:A5:D3:21:D0:2D:48:" + "7B:31:60:5C:5A:D8:0D:CD:78:78:6C:6D:CE:CC:0C:67\r\n" + "m=audio 9000 RTP/AVP 99\r\n" + "c=IN IP4 0.0.0.0\r\n" + "a=rtpmap:99 opus/48000/2\r\n" + "a=ice-ufrag:cYuakxkEKH+RApYE\r\n" + "a=ice-pwd:bwtpzLZD+3jbu8vQHvEa6Xuq\r\n" + "a=setup:active\r\n" + "a=sendrecv\r\n"; +} + +TEST_F(JsepSessionTest, BigOValues) +{ + std::string offer; + + CreateSDPForBigOTests(offer, "12345678901234567"); + + types.push_back(SdpMediaSection::kAudio); + AddTracks(mSessionAns, "audio"); + SetRemoteOffer(offer, CHECK_SUCCESS); +} + +TEST_F(JsepSessionTest, BigOValuesExtraChars) +{ + std::string offer; + + CreateSDPForBigOTests(offer, "12345678901234567FOOBAR"); + + types.push_back(SdpMediaSection::kAudio); + AddTracks(mSessionAns, "audio"); + // The signaling state will remain "stable" because the unparsable + // SDP leads to a failure in SetRemoteDescription. + SetRemoteOffer(offer, NO_CHECKS); + ASSERT_EQ(kJsepStateStable, mSessionAns.GetState()); +} + +TEST_F(JsepSessionTest, BigOValuesTooBig) +{ + std::string offer; + + CreateSDPForBigOTests(offer, "18446744073709551615"); + types.push_back(SdpMediaSection::kAudio); + AddTracks(mSessionAns, "audio"); + + // The signaling state will remain "stable" because the unparsable + // SDP leads to a failure in SetRemoteDescription. + SetRemoteOffer(offer, NO_CHECKS); + ASSERT_EQ(kJsepStateStable, mSessionAns.GetState()); +} + + +TEST_F(JsepSessionTest, SetLocalAnswerInStable) +{ + types.push_back(SdpMediaSection::kAudio); + AddTracks(mSessionOff, "audio"); + std::string offer = CreateOffer(); + + // The signaling state will remain "stable" because the + // SetLocalDescription call fails. + SetLocalAnswer(offer, NO_CHECKS); + ASSERT_EQ(kJsepStateStable, mSessionOff.GetState()); +} + +TEST_F(JsepSessionTest, SetRemoteAnswerInStable) +{ + const std::string answer = + "v=0\r\n" + "o=Mozilla-SIPUA 4949 0 IN IP4 10.86.255.143\r\n" + "s=SIP Call\r\n" + "t=0 0\r\n" + "a=ice-ufrag:qkEP\r\n" + "a=ice-pwd:ed6f9GuHjLcoCN6sC/Eh7fVl\r\n" + "m=audio 16384 RTP/AVP 0 8 9 101\r\n" + "c=IN IP4 10.86.255.143\r\n" + "a=rtpmap:0 PCMU/8000\r\n" + "a=rtpmap:8 PCMA/8000\r\n" + "a=rtpmap:9 G722/8000\r\n" + "a=rtpmap:101 telephone-event/8000\r\n" + "a=fmtp:101 0-15\r\n" + "a=sendrecv\r\n" + "a=candidate:1 1 UDP 2130706431 192.168.2.1 50005 typ host\r\n" + "a=candidate:2 2 UDP 2130706431 192.168.2.2 50006 typ host\r\n" + "m=video 1024 RTP/AVP 97\r\n" + "c=IN IP4 10.86.255.143\r\n" + "a=rtpmap:120 VP8/90000\r\n" + "a=fmtp:97 profile-level-id=42E00C\r\n" + "a=sendrecv\r\n" + "a=candidate:1 1 UDP 2130706431 192.168.2.3 50007 typ host\r\n" + "a=candidate:2 2 UDP 2130706431 192.168.2.4 50008 typ host\r\n"; + + // The signaling state will remain "stable" because the + // SetRemoteDescription call fails. + nsresult rv = mSessionOff.SetRemoteDescription(kJsepSdpAnswer, answer); + ASSERT_NE(NS_OK, rv); + ASSERT_EQ(kJsepStateStable, mSessionOff.GetState()); +} + +TEST_F(JsepSessionTest, SetLocalAnswerInHaveLocalOffer) +{ + types.push_back(SdpMediaSection::kAudio); + AddTracks(mSessionOff, "audio"); + std::string offer = CreateOffer(); + + SetLocalOffer(offer); + ASSERT_EQ(kJsepStateHaveLocalOffer, mSessionOff.GetState()); + + // The signaling state will remain "have-local-offer" because the + // SetLocalDescription call fails. + nsresult rv = mSessionOff.SetLocalDescription(kJsepSdpAnswer, offer); + ASSERT_NE(NS_OK, rv); + ASSERT_EQ(kJsepStateHaveLocalOffer, mSessionOff.GetState()); +} + +TEST_F(JsepSessionTest, SetRemoteOfferInHaveLocalOffer) +{ + types.push_back(SdpMediaSection::kAudio); + AddTracks(mSessionOff, "audio"); + std::string offer = CreateOffer(); + + SetLocalOffer(offer); + ASSERT_EQ(kJsepStateHaveLocalOffer, mSessionOff.GetState()); + + // The signaling state will remain "have-local-offer" because the + // SetRemoteDescription call fails. + nsresult rv = mSessionOff.SetRemoteDescription(kJsepSdpOffer, offer); + ASSERT_NE(NS_OK, rv); + ASSERT_EQ(kJsepStateHaveLocalOffer, mSessionOff.GetState()); +} + +TEST_F(JsepSessionTest, SetLocalOfferInHaveRemoteOffer) +{ + types.push_back(SdpMediaSection::kAudio); + AddTracks(mSessionOff, "audio"); + std::string offer = CreateOffer(); + + SetRemoteOffer(offer); + ASSERT_EQ(kJsepStateHaveRemoteOffer, mSessionAns.GetState()); + + // The signaling state will remain "have-remote-offer" because the + // SetLocalDescription call fails. + nsresult rv = mSessionAns.SetLocalDescription(kJsepSdpOffer, offer); + ASSERT_NE(NS_OK, rv); + ASSERT_EQ(kJsepStateHaveRemoteOffer, mSessionAns.GetState()); +} + +TEST_F(JsepSessionTest, SetRemoteAnswerInHaveRemoteOffer) +{ + types.push_back(SdpMediaSection::kAudio); + AddTracks(mSessionOff, "audio"); + std::string offer = CreateOffer(); + + SetRemoteOffer(offer); + ASSERT_EQ(kJsepStateHaveRemoteOffer, mSessionAns.GetState()); + + // The signaling state will remain "have-remote-offer" because the + // SetRemoteDescription call fails. + nsresult rv = mSessionAns.SetRemoteDescription(kJsepSdpAnswer, offer); + ASSERT_NE(NS_OK, rv); + + ASSERT_EQ(kJsepStateHaveRemoteOffer, mSessionAns.GetState()); +} + +TEST_F(JsepSessionTest, RtcpFbInOffer) +{ + types.push_back(SdpMediaSection::kAudio); + types.push_back(SdpMediaSection::kVideo); + AddTracks(mSessionOff, "audio,video"); + std::string offer = CreateOffer(); + + std::map expected; + expected["nack"] = false; + expected["nack pli"] = false; + expected["ccm fir"] = false; + + size_t prev = 0; + size_t found = 0; + for(;;) { + found = offer.find('\n', found + 1); + if (found == std::string::npos) + break; + + std::string line = offer.substr(prev, (found - prev)); + + // ensure no other rtcp-fb values are present + if (line.find("a=rtcp-fb:") != std::string::npos) { + size_t space = line.find(' '); + //strip trailing \r\n + std::string value = line.substr(space + 1, line.length() - space - 2); + std::map::iterator entry = expected.find(value); + ASSERT_NE(entry, expected.end()); + entry->second = true; + } + + prev = found + 1; + } + + // ensure all values are present + for (std::map::iterator it = expected.begin(); it != expected.end(); ++it) { + ASSERT_EQ(it->second, true); + } +} + +// In this test we will change the offer SDP's a=setup value +// from actpass to passive. This will make the answer do active. +TEST_F(JsepSessionTest, AudioCallForceDtlsRoles) +{ + types.push_back(SdpMediaSection::kAudio); + AddTracks(mSessionOff, "audio"); + AddTracks(mSessionAns, "audio"); + std::string offer = CreateOffer(); + std::string actpass = "\r\na=setup:actpass"; + size_t match = offer.find(actpass); + ASSERT_NE(match, std::string::npos); + offer.replace(match, actpass.length(), "\r\na=setup:passive"); + SetLocalOffer(offer); + SetRemoteOffer(offer); + std::string answer = CreateAnswer(); + match = answer.find("\r\na=setup:active"); + ASSERT_NE(match, std::string::npos); +} + +// In this test we will change the offer SDP's a=setup value +// from actpass to active. This will make the answer do passive +TEST_F(JsepSessionTest, AudioCallReverseDtlsRoles) +{ + types.push_back(SdpMediaSection::kAudio); + AddTracks(mSessionOff, "audio"); + AddTracks(mSessionAns, "audio"); + std::string offer = CreateOffer(); + std::string actpass = "\r\na=setup:actpass"; + size_t match = offer.find(actpass); + ASSERT_NE(match, std::string::npos); + offer.replace(match, actpass.length(), "\r\na=setup:active"); + SetLocalOffer(offer); + SetRemoteOffer(offer); + std::string answer = CreateAnswer(); + match = answer.find("\r\na=setup:passive"); + ASSERT_NE(match, std::string::npos); +} + +// In this test we will change the answer SDP's a=setup value +// from active to passive. This will make both sides do +// active and should not connect. +TEST_F(JsepSessionTest, AudioCallMismatchDtlsRoles) +{ + types.push_back(SdpMediaSection::kAudio); + AddTracks(mSessionOff, "audio"); + AddTracks(mSessionAns, "audio"); + std::string offer = CreateOffer(); + std::string actpass = "\r\na=setup:actpass"; + size_t match = offer.find(actpass); + ASSERT_NE(match, std::string::npos); + SetLocalOffer(offer); + SetRemoteOffer(offer); + std::string answer = CreateAnswer(); + std::string active = "\r\na=setup:active"; + match = answer.find(active); + ASSERT_NE(match, std::string::npos); + SetLocalAnswer(answer); + answer.replace(match, active.length(), "\r\na=setup:passive"); + SetRemoteAnswer(answer); +} + +// In this test we will change the offer SDP's a=setup value +// from actpass to garbage. It should ignore the garbage value +// and respond with setup:active +TEST_F(JsepSessionTest, AudioCallGarbageSetup) +{ + types.push_back(SdpMediaSection::kAudio); + AddTracks(mSessionOff, "audio"); + AddTracks(mSessionAns, "audio"); + std::string offer = CreateOffer(); + std::string actpass = "\r\na=setup:actpass"; + size_t match = offer.find(actpass); + ASSERT_NE(match, std::string::npos); + offer.replace(match, actpass.length(), "\r\na=setup:G4rb4g3V4lu3"); + SetLocalOffer(offer); + SetRemoteOffer(offer); + std::string answer = CreateAnswer(); + match = answer.find("\r\na=setup:active"); + ASSERT_NE(match, std::string::npos); +} + +// In this test we will change the offer SDP to remove the +// a=setup line. Answer should respond with a=setup:active. +TEST_F(JsepSessionTest, AudioCallOfferNoSetupOrConnection) +{ + types.push_back(SdpMediaSection::kAudio); + AddTracks(mSessionOff, "audio"); + AddTracks(mSessionAns, "audio"); + std::string offer = CreateOffer(); + std::string actpass = "\r\na=setup:actpass"; + size_t match = offer.find(actpass); + ASSERT_NE(match, std::string::npos); + offer.replace(match, actpass.length(), ""); + SetLocalOffer(offer); + SetRemoteOffer(offer); + std::string answer = CreateAnswer(); + match = answer.find("\r\na=setup:active"); + ASSERT_NE(match, std::string::npos); +} + +// In this test we will change the answer SDP to remove the +// a=setup line. TODO: This used to be a signaling test so it also tested that +// ICE would still connect since active would be assumed. +TEST_F(JsepSessionTest, AudioCallAnswerNoSetupOrConnection) +{ + types.push_back(SdpMediaSection::kAudio); + AddTracks(mSessionOff, "audio"); + AddTracks(mSessionAns, "audio"); + std::string offer = CreateOffer(); + size_t match = offer.find("\r\na=setup:actpass"); + ASSERT_NE(match, std::string::npos); + + SetLocalOffer(offer); + SetRemoteOffer(offer); + std::string answer = CreateAnswer(); + std::string active = "\r\na=setup:active"; + match = answer.find(active); + ASSERT_NE(match, std::string::npos); + answer.replace(match, active.length(), ""); + SetLocalAnswer(answer); + SetRemoteAnswer(answer); +} + +// Remove H.264 P1 and VP8 from offer, check answer negotiates H.264 P0 +TEST_F(JsepSessionTest, OfferWithOnlyH264P0) +{ + for (JsepCodecDescription* codec : mSessionOff.Codecs()) { + if (codec->mName != "H264" || codec->mDefaultPt == "126") { + codec->mEnabled = false; + } + } + + types.push_back(SdpMediaSection::kAudio); + types.push_back(SdpMediaSection::kVideo); + AddTracks(mSessionOff, "audio,video"); + AddTracks(mSessionAns, "audio,video"); + std::string offer = CreateOffer(); + + ASSERT_EQ(offer.find("a=rtpmap:126 H264/90000"), std::string::npos); + ASSERT_EQ(offer.find("a=rtpmap:120 VP8/90000"), std::string::npos); + + SetLocalOffer(offer); + SetRemoteOffer(offer); + std::string answer = CreateAnswer(); + size_t match = answer.find("\r\na=setup:active"); + ASSERT_NE(match, std::string::npos); + + // validate answer SDP + ASSERT_NE(answer.find("a=rtpmap:97 H264/90000"), std::string::npos); + ASSERT_NE(answer.find("a=rtcp-fb:97 nack"), std::string::npos); + ASSERT_NE(answer.find("a=rtcp-fb:97 nack pli"), std::string::npos); + ASSERT_NE(answer.find("a=rtcp-fb:97 ccm fir"), std::string::npos); + // Ensure VP8 and P1 removed + ASSERT_EQ(answer.find("a=rtpmap:126 H264/90000"), std::string::npos); + ASSERT_EQ(answer.find("a=rtpmap:120 VP8/90000"), std::string::npos); + ASSERT_EQ(answer.find("a=rtcp-fb:120"), std::string::npos); + ASSERT_EQ(answer.find("a=rtcp-fb:126"), std::string::npos); +} + +// Test negotiating an answer which has only H.264 P1 +// Which means replace VP8 with H.264 P1 in answer +TEST_F(JsepSessionTest, AnswerWithoutVP8) +{ + types.push_back(SdpMediaSection::kAudio); + types.push_back(SdpMediaSection::kVideo); + AddTracks(mSessionOff, "audio,video"); + AddTracks(mSessionAns, "audio,video"); + std::string offer = CreateOffer(); + SetLocalOffer(offer); + SetRemoteOffer(offer); + + for (JsepCodecDescription* codec : mSessionOff.Codecs()) { + if (codec->mName != "H264" || codec->mDefaultPt == "126") { + codec->mEnabled = false; + } + } + + std::string answer = CreateAnswer(); + + SetLocalAnswer(answer); + SetRemoteAnswer(answer); +} + } // namespace mozilla diff --git a/media/webrtc/signaling/test/signaling_unittests.cpp b/media/webrtc/signaling/test/signaling_unittests.cpp index c9204b8c9e99..32348060071e 100644 --- a/media/webrtc/signaling/test/signaling_unittests.cpp +++ b/media/webrtc/signaling/test/signaling_unittests.cpp @@ -2247,78 +2247,6 @@ TEST_P(SignalingTest, CreateOfferAudioVideoOptionUndefined) CreateOffer(options, OFFER_AV); } -TEST_P(SignalingTest, CreateOfferNoVideoStreamRecvVideo) -{ - OfferOptions options; - options.setInt32Option("OfferToReceiveAudio", 1); - options.setInt32Option("OfferToReceiveVideo", 1); - CreateOffer(options, OFFER_AUDIO); -} - -TEST_P(SignalingTest, CreateOfferNoAudioStreamRecvAudio) -{ - OfferOptions options; - options.setInt32Option("OfferToReceiveAudio", 1); - options.setInt32Option("OfferToReceiveVideo", 1); - CreateOffer(options, OFFER_VIDEO); -} - -TEST_P(SignalingTest, CreateOfferNoVideoStream) -{ - OfferOptions options; - options.setInt32Option("OfferToReceiveAudio", 1); - options.setInt32Option("OfferToReceiveVideo", 0); - CreateOffer(options, OFFER_AUDIO); -} - -TEST_P(SignalingTest, CreateOfferNoAudioStream) -{ - OfferOptions options; - options.setInt32Option("OfferToReceiveAudio", 0); - options.setInt32Option("OfferToReceiveVideo", 1); - CreateOffer(options, OFFER_VIDEO); -} - -TEST_P(SignalingTest, CreateOfferDontReceiveAudio) -{ - OfferOptions options; - options.setInt32Option("OfferToReceiveAudio", 0); - options.setInt32Option("OfferToReceiveVideo", 1); - CreateOffer(options, OFFER_AV); -} - -TEST_P(SignalingTest, CreateOfferDontReceiveVideo) -{ - OfferOptions options; - options.setInt32Option("OfferToReceiveAudio", 1); - options.setInt32Option("OfferToReceiveVideo", 0); - CreateOffer(options, OFFER_AV); -} - -TEST_P(SignalingTest, CreateOfferRemoveAudioTrack) -{ - OfferOptions options; - options.setInt32Option("OfferToReceiveAudio", 1); - options.setInt32Option("OfferToReceiveVideo", 1); - CreateOfferRemoveTrack(options, false); -} - -TEST_P(SignalingTest, CreateOfferDontReceiveAudioRemoveAudioTrack) -{ - OfferOptions options; - options.setInt32Option("OfferToReceiveAudio", 0); - options.setInt32Option("OfferToReceiveVideo", 1); - CreateOfferRemoveTrack(options, false); -} - -TEST_P(SignalingTest, CreateOfferDontReceiveVideoRemoveVideoTrack) -{ - OfferOptions options; - options.setInt32Option("OfferToReceiveAudio", 1); - options.setInt32Option("OfferToReceiveVideo", 0); - CreateOfferRemoveTrack(options, true); -} - TEST_P(SignalingTest, OfferAnswerNothingDisabled) { OfferOptions options; @@ -2384,44 +2312,6 @@ TEST_P(SignalingTest, OfferAnswerVideoInactive) CloseStreams(); } -TEST_P(SignalingTest, CreateOfferAddCandidate) -{ - OfferOptions options; - CreateOfferAddCandidate(options, strSampleCandidate, - strSampleMid, nSamplelevel); -} - -TEST_P(SignalingTest, AddIceCandidateEarly) -{ - OfferOptions options; - AddIceCandidateEarly(strSampleCandidate, - strSampleMid, nSamplelevel); -} - -TEST_P(SignalingTest, OfferAnswerDontAddAudioStreamOnAnswerNoOptions) -{ - OfferOptions options; - options.setInt32Option("OfferToReceiveAudio", 1); - options.setInt32Option("OfferToReceiveVideo", 1); - OfferAnswer(options, OFFER_AV | ANSWER_VIDEO); -} - -TEST_P(SignalingTest, OfferAnswerDontAddVideoStreamOnAnswerNoOptions) -{ - OfferOptions options; - options.setInt32Option("OfferToReceiveAudio", 1); - options.setInt32Option("OfferToReceiveVideo", 1); - OfferAnswer(options, OFFER_AV | ANSWER_AUDIO); -} - -TEST_P(SignalingTest, OfferAnswerDontAddAudioVideoStreamsOnAnswerNoOptions) -{ - OfferOptions options; - options.setInt32Option("OfferToReceiveAudio", 1); - options.setInt32Option("OfferToReceiveVideo", 1); - OfferAnswer(options, OFFER_AV | ANSWER_NONE); -} - TEST_P(SignalingTest, RenegotiationOffererAddsTracks) { OfferOptions options; @@ -2459,19 +2349,6 @@ TEST_P(SignalingTest, RenegotiationBothRemoveThenAddTrack) CloseStreams(); } -TEST_P(SignalingTest, RenegotiationOffererReplacesTrack) -{ - OfferOptions options; - OfferAnswer(options, OFFER_AV | ANSWER_AV); - - a1_->RemoveTrack(0, false); - - // OFFER_AUDIO causes a new audio track to be added on both sides - OfferAnswer(options, OFFER_AUDIO); - - CloseStreams(); -} - TEST_P(SignalingTest, RenegotiationOffererSwapsMsids) { OfferOptions options; @@ -2568,31 +2445,6 @@ TEST_P(SignalingTest, FullCallVideoOnly) CloseStreams(); } -TEST_P(SignalingTest, OfferAndAnswerWithExtraCodec) -{ - EnsureInit(); - OfferOptions options; - Offer(options, OFFER_AUDIO); - - a2_->CreateAnswer(OFFER_AUDIO | ANSWER_AUDIO); - a2_->SetLocal(TestObserver::ANSWER, a2_->answer()); - ParsedSDP sdpWrapper(a2_->answer()); - sdpWrapper.ReplaceLine("m=audio", - "m=audio 65375 UDP/TLS/RTP/SAVPF 109 8\r\n"); - sdpWrapper.AddLine("a=rtpmap:8 PCMA/8000\r\n"); - std::cout << "Modified SDP " << std::endl - << indent(sdpWrapper.getSdp()) << std::endl; - - a1_->SetRemote(TestObserver::ANSWER, sdpWrapper.getSdp()); - - WaitForCompleted(); - - CheckPipelines(); - CheckStreams(); - - CloseStreams(); -} - TEST_P(SignalingTest, FullCallTrickle) { OfferOptions options; @@ -2636,38 +2488,6 @@ TEST_P(SignalingTest, FullCallTrickleBeforeSetLocal) CloseStreams(); } -// This test comes from Bug 810220 -// TODO: Move this to jsep_session_unittest -TEST_P(SignalingTest, AudioOnlyG711Call) -{ - EnsureInit(); - - OfferOptions options; - const std::string& offer(strG711SdpOffer); - - std::cout << "Setting offer to:" << std::endl << indent(offer) << std::endl; - a2_->SetRemote(TestObserver::OFFER, offer); - - std::cout << "Creating answer:" << std::endl; - a2_->CreateAnswer(OFFER_AUDIO | ANSWER_AUDIO); - - std::string answer = a2_->answer(); - - // They didn't offer opus, so our answer shouldn't include it. - ASSERT_EQ(answer.find(" opus/"), std::string::npos); - - // They also didn't offer video or application - ASSERT_EQ(answer.find("video"), std::string::npos); - ASSERT_EQ(answer.find("application"), std::string::npos); - - // We should answer with PCMU and telephone-event - ASSERT_NE(answer.find(" PCMU/8000"), std::string::npos); - - // Double-check the directionality - ASSERT_NE(answer.find("\r\na=sendrecv"), std::string::npos); - -} - TEST_P(SignalingTest, IncomingOfferIceLite) { EnsureInit(); @@ -2860,245 +2680,6 @@ TEST_P(SignalingTest, FullChromeHandshake) ASSERT_NE(answer.find("111 opus/"), std::string::npos); } -// Disabled pending resolution of bug 818640. -// Actually, this test is completely broken; you can't just call -// SetRemote/CreateAnswer over and over again. -// If we were to test this sort of thing, it would belong in -// jsep_session_unitest -TEST_P(SignalingTest, DISABLED_OfferAllDynamicTypes) -{ - EnsureInit(); - - std::string offer; - for (int i = 96; i < 128; i++) - { - std::stringstream ss; - ss << i; - std::cout << "Trying dynamic pt = " << i << std::endl; - offer = - "v=0\r\n" - "o=- 1 1 IN IP4 148.147.200.251\r\n" - "s=-\r\n" - "b=AS:64\r\n" - "t=0 0\r\n" - "a=fingerprint:sha-256 F3:FA:20:C0:CD:48:C4:5F:02:5F:A5:D3:21:D0:2D:48:" - "7B:31:60:5C:5A:D8:0D:CD:78:78:6C:6D:CE:CC:0C:67\r\n" - "m=audio 9000 RTP/AVP " + ss.str() + "\r\n" - "c=IN IP4 148.147.200.251\r\n" - "b=TIAS:64000\r\n" - "a=rtpmap:" + ss.str() +" opus/48000/2\r\n" - "a=candidate:0 1 udp 2130706432 148.147.200.251 9000 typ host\r\n" - "a=candidate:0 2 udp 2130706432 148.147.200.251 9005 typ host\r\n" - "a=ice-ufrag:cYuakxkEKH+RApYE\r\n" - "a=ice-pwd:bwtpzLZD+3jbu8vQHvEa6Xuq\r\n" - "a=sendrecv\r\n"; - - /* - std::cout << "Setting offer to:" << std::endl - << indent(offer) << std::endl; - */ - a2_->SetRemote(TestObserver::OFFER, offer); - - //std::cout << "Creating answer:" << std::endl; - a2_->CreateAnswer(OFFER_AUDIO | ANSWER_AUDIO); - - std::string answer = a2_->answer(); - - ASSERT_NE(answer.find(ss.str() + " opus/"), std::string::npos); - } - -} - -// TODO: Move to jsep_session_unittest -TEST_P(SignalingTest, ipAddrAnyOffer) -{ - EnsureInit(); - - std::string offer = - "v=0\r\n" - "o=- 1 1 IN IP4 127.0.0.1\r\n" - "s=-\r\n" - "b=AS:64\r\n" - "t=0 0\r\n" - "a=fingerprint:sha-256 F3:FA:20:C0:CD:48:C4:5F:02:5F:A5:D3:21:D0:2D:48:" - "7B:31:60:5C:5A:D8:0D:CD:78:78:6C:6D:CE:CC:0C:67\r\n" - "m=audio 9000 RTP/AVP 99\r\n" - "c=IN IP4 0.0.0.0\r\n" - "a=rtpmap:99 opus/48000/2\r\n" - "a=ice-ufrag:cYuakxkEKH+RApYE\r\n" - "a=ice-pwd:bwtpzLZD+3jbu8vQHvEa6Xuq\r\n" - "a=setup:active\r\n" - "a=sendrecv\r\n"; - - a2_->SetRemote(TestObserver::OFFER, offer); - ASSERT_TRUE(a2_->pObserver->state == TestObserver::stateSuccess); - a2_->CreateAnswer(OFFER_AUDIO | ANSWER_AUDIO); - ASSERT_TRUE(a2_->pObserver->state == TestObserver::stateSuccess); - std::string answer = a2_->answer(); - ASSERT_NE(answer.find("a=sendrecv"), std::string::npos); -} - -static void CreateSDPForBigOTests(std::string& offer, const std::string& number) { - offer = - "v=0\r\n" - "o=- "; - offer += number; - offer += " "; - offer += number; - offer += " IN IP4 127.0.0.1\r\n" - "s=-\r\n" - "b=AS:64\r\n" - "t=0 0\r\n" - "a=fingerprint:sha-256 F3:FA:20:C0:CD:48:C4:5F:02:5F:A5:D3:21:D0:2D:48:" - "7B:31:60:5C:5A:D8:0D:CD:78:78:6C:6D:CE:CC:0C:67\r\n" - "m=audio 9000 RTP/AVP 99\r\n" - "c=IN IP4 0.0.0.0\r\n" - "a=rtpmap:99 opus/48000/2\r\n" - "a=ice-ufrag:cYuakxkEKH+RApYE\r\n" - "a=ice-pwd:bwtpzLZD+3jbu8vQHvEa6Xuq\r\n" - "a=setup:active\r\n" - "a=sendrecv\r\n"; -} - -// TODO: Move to jsep_session_unittest -TEST_P(SignalingTest, BigOValues) -{ - EnsureInit(); - - std::string offer; - - CreateSDPForBigOTests(offer, "12345678901234567"); - - a2_->SetRemote(TestObserver::OFFER, offer); - ASSERT_EQ(a2_->pObserver->state, TestObserver::stateSuccess); -} - -// TODO: Move to jsep_session_unittest -// We probably need to retain at least one test case for each API entry point -// that verifies that errors are propagated correctly, though. -TEST_P(SignalingTest, BigOValuesExtraChars) -{ - EnsureInit(); - - std::string offer; - - CreateSDPForBigOTests(offer, "12345678901234567FOOBAR"); - - // The signaling state will remain "stable" because the unparsable - // SDP leads to a failure in SetRemoteDescription. - a2_->SetRemote(TestObserver::OFFER, offer, true, - PCImplSignalingState::SignalingStable); - ASSERT_TRUE(a2_->pObserver->state == TestObserver::stateError); -} - -// TODO: Move to jsep_session_unittest -TEST_P(SignalingTest, BigOValuesTooBig) -{ - EnsureInit(); - - std::string offer; - - CreateSDPForBigOTests(offer, "18446744073709551615"); - - // The signaling state will remain "stable" because the unparsable - // SDP leads to a failure in SetRemoteDescription. - a2_->SetRemote(TestObserver::OFFER, offer, true, - PCImplSignalingState::SignalingStable); - ASSERT_TRUE(a2_->pObserver->state == TestObserver::stateError); -} - -// TODO: Move to jsep_session_unittest -TEST_P(SignalingTest, SetLocalAnswerInStable) -{ - EnsureInit(); - - OfferOptions options; - CreateOffer(options, OFFER_AUDIO); - - // The signaling state will remain "stable" because the - // SetLocalDescription call fails. - a1_->SetLocal(TestObserver::ANSWER, a1_->offer(), true, - PCImplSignalingState::SignalingStable); - ASSERT_EQ(a1_->pObserver->lastStatusCode, - PeerConnectionImpl::kInvalidState); -} - -// TODO: Move to jsep_session_unittest -TEST_P(SignalingTest, SetRemoteAnswerInStable) { - EnsureInit(); - - // The signaling state will remain "stable" because the - // SetRemoteDescription call fails. - a1_->SetRemote(TestObserver::ANSWER, strSampleSdpAudioVideoNoIce, true, - PCImplSignalingState::SignalingStable); - ASSERT_EQ(a1_->pObserver->lastStatusCode, - PeerConnectionImpl::kInvalidState); -} - -// TODO: Move to jsep_session_unittest -TEST_P(SignalingTest, SetLocalAnswerInHaveLocalOffer) { - OfferOptions options; - CreateOffer(options, OFFER_AUDIO); - a1_->SetLocal(TestObserver::OFFER, a1_->offer()); - ASSERT_EQ(a1_->pObserver->lastStatusCode, - PeerConnectionImpl::kNoError); - - // The signaling state will remain "have-local-offer" because the - // SetLocalDescription call fails. - a1_->SetLocal(TestObserver::ANSWER, a1_->offer(), true, - PCImplSignalingState::SignalingHaveLocalOffer); - ASSERT_EQ(a1_->pObserver->lastStatusCode, - PeerConnectionImpl::kInvalidState); -} - -// TODO: Move to jsep_session_unittest -TEST_P(SignalingTest, SetRemoteOfferInHaveLocalOffer) { - OfferOptions options; - CreateOffer(options, OFFER_AUDIO); - a1_->SetLocal(TestObserver::OFFER, a1_->offer()); - ASSERT_EQ(a1_->pObserver->lastStatusCode, - PeerConnectionImpl::kNoError); - - // The signaling state will remain "have-local-offer" because the - // SetRemoteDescription call fails. - a1_->SetRemote(TestObserver::OFFER, a1_->offer(), true, - PCImplSignalingState::SignalingHaveLocalOffer); - ASSERT_EQ(a1_->pObserver->lastStatusCode, - PeerConnectionImpl::kInvalidState); -} - -// TODO: Move to jsep_session_unittest -TEST_P(SignalingTest, SetLocalOfferInHaveRemoteOffer) { - OfferOptions options; - CreateOffer(options, OFFER_AUDIO); - a2_->SetRemote(TestObserver::OFFER, a1_->offer()); - ASSERT_EQ(a2_->pObserver->lastStatusCode, - PeerConnectionImpl::kNoError); - - // The signaling state will remain "have-remote-offer" because the - // SetLocalDescription call fails. - a2_->SetLocal(TestObserver::OFFER, a1_->offer(), true, - PCImplSignalingState::SignalingHaveRemoteOffer); - ASSERT_EQ(a2_->pObserver->lastStatusCode, - PeerConnectionImpl::kInvalidState); -} - -// TODO: Move to jsep_session_unittest -TEST_P(SignalingTest, SetRemoteAnswerInHaveRemoteOffer) { - OfferOptions options; - CreateOffer(options, OFFER_AUDIO); - a2_->SetRemote(TestObserver::OFFER, a1_->offer()); - ASSERT_EQ(a2_->pObserver->lastStatusCode, - PeerConnectionImpl::kNoError); - - // The signaling state will remain "have-remote-offer" because the - // SetRemoteDescription call fails. - a2_->SetRemote(TestObserver::ANSWER, a1_->offer(), true, - PCImplSignalingState::SignalingHaveRemoteOffer); - ASSERT_EQ(a2_->pObserver->lastStatusCode, - PeerConnectionImpl::kInvalidState); -} - // Disabled until the spec adds a failure callback to addStream // Actually, this is allowed I think, it just triggers a negotiationneeded TEST_P(SignalingTest, DISABLED_AddStreamInHaveLocalOffer) { @@ -3125,18 +2706,6 @@ TEST_P(SignalingTest, DISABLED_RemoveStreamInHaveLocalOffer) { PeerConnectionImpl::kInvalidState); } -TEST_P(SignalingTest, AddCandidateInHaveLocalOffer) { - OfferOptions options; - CreateOffer(options, OFFER_AUDIO); - a1_->SetLocal(TestObserver::OFFER, a1_->offer()); - ASSERT_EQ(a1_->pObserver->lastAddIceStatusCode, - PeerConnectionImpl::kNoError); - a1_->AddIceCandidate(strSampleCandidate, - strSampleMid, nSamplelevel, false); - ASSERT_EQ(PeerConnectionImpl::kInvalidState, - a1_->pObserver->lastAddIceStatusCode); -} - TEST_F(SignalingAgentTest, CreateOffer) { CreateAgent(TestStunServer::GetInstance()->addr(), TestStunServer::GetInstance()->port()); @@ -3144,38 +2713,6 @@ TEST_F(SignalingAgentTest, CreateOffer) { agent(0)->CreateOffer(options, OFFER_AUDIO); } -TEST_F(SignalingAgentTest, SetLocalWithoutCreateOffer) { - CreateAgent(TestStunServer::GetInstance()->addr(), - TestStunServer::GetInstance()->port()); - CreateAgent(TestStunServer::GetInstance()->addr(), - TestStunServer::GetInstance()->port()); - OfferOptions options; - agent(0)->CreateOffer(options, OFFER_AUDIO); - agent(1)->SetLocal(TestObserver::OFFER, - agent(0)->offer(), - true, - PCImplSignalingState::SignalingStable); -} - -TEST_F(SignalingAgentTest, SetLocalWithoutCreateAnswer) { - CreateAgent(TestStunServer::GetInstance()->addr(), - TestStunServer::GetInstance()->port()); - CreateAgent(TestStunServer::GetInstance()->addr(), - TestStunServer::GetInstance()->port()); - CreateAgent(TestStunServer::GetInstance()->addr(), - TestStunServer::GetInstance()->port()); - OfferOptions options; - agent(0)->CreateOffer(options, OFFER_AUDIO); - agent(1)->SetRemote(TestObserver::OFFER, agent(0)->offer()); - agent(1)->CreateAnswer(ANSWER_AUDIO); - agent(2)->SetRemote(TestObserver::OFFER, agent(0)->offer()); - // Use agent 1's answer on agent 2, should fail - agent(2)->SetLocal(TestObserver::ANSWER, - agent(1)->answer(), - true, - PCImplSignalingState::SignalingHaveRemoteOffer); -} - TEST_F(SignalingAgentTest, CreateOfferSetLocalTrickleTestServer) { TestStunServer::GetInstance()->SetActive(false); TestStunServer::GetInstance()->SetResponseAddr( @@ -3206,7 +2743,6 @@ TEST_F(SignalingAgentTest, CreateOfferSetLocalTrickleTestServer) { ASSERT_LT(0U, match); } - TEST_F(SignalingAgentTest, CreateAnswerSetLocalTrickleTestServer) { TestStunServer::GetInstance()->SetActive(false); TestStunServer::GetInstance()->SetResponseAddr( @@ -3242,8 +2778,6 @@ TEST_F(SignalingAgentTest, CreateAnswerSetLocalTrickleTestServer) { ASSERT_LT(0U, match); } - - TEST_F(SignalingAgentTest, CreateLotsAndWait) { int i; @@ -3261,126 +2795,6 @@ TEST_F(SignalingAgentTest, CreateNoInit) { } -/* - * Test for Bug 843595 - */ -TEST_P(SignalingTest, missingUfrag) -{ - EnsureInit(); - - OfferOptions options; - std::string offer = - "v=0\r\n" - "o=Mozilla-SIPUA 2208 0 IN IP4 0.0.0.0\r\n" - "s=SIP Call\r\n" - "t=0 0\r\n" - "a=ice-pwd:4450d5a4a5f097855c16fa079893be18\r\n" - "a=fingerprint:sha-256 23:9A:2E:43:94:42:CF:46:68:FC:62:F9:F4:48:61:DB:" - "2F:8C:C9:FF:6B:25:54:9D:41:09:EF:83:A8:19:FC:B6\r\n" - "m=audio 56187 UDP/TLS/RTP/SAVPF 109 0 8 101\r\n" - "c=IN IP4 77.9.79.167\r\n" - "a=rtpmap:109 opus/48000/2\r\n" - "a=ptime:20\r\n" - "a=rtpmap:0 PCMU/8000\r\n" - "a=rtpmap:8 PCMA/8000\r\n" - "a=rtpmap:101 telephone-event/8000\r\n" - "a=fmtp:101 0-15\r\n" - "a=sendrecv\r\n" - "a=candidate:0 1 UDP 2113601791 192.168.178.20 56187 typ host\r\n" - "a=candidate:1 1 UDP 1694236671 77.9.79.167 56187 typ srflx raddr " - "192.168.178.20 rport 56187\r\n" - "a=candidate:0 2 UDP 2113601790 192.168.178.20 52955 typ host\r\n" - "a=candidate:1 2 UDP 1694236670 77.9.79.167 52955 typ srflx raddr " - "192.168.178.20 rport 52955\r\n" - "m=video 49929 UDP/TLS/RTP/SAVPF 120\r\n" - "c=IN IP4 77.9.79.167\r\n" - "a=rtpmap:120 VP8/90000\r\n" - "a=recvonly\r\n" - "a=candidate:0 1 UDP 2113601791 192.168.178.20 49929 typ host\r\n" - "a=candidate:1 1 UDP 1694236671 77.9.79.167 49929 typ srflx raddr " - "192.168.178.20 rport 49929\r\n" - "a=candidate:0 2 UDP 2113601790 192.168.178.20 50769 typ host\r\n" - "a=candidate:1 2 UDP 1694236670 77.9.79.167 50769 typ srflx raddr " - "192.168.178.20 rport 50769\r\n" - "m=application 54054 DTLS/SCTP 5000\r\n" - "c=IN IP4 77.9.79.167\r\n" - "a=fmtp:HuRUu]Dtcl\\zM,7(OmEU%O$gU]x/z\tD protocol=webrtc-datachannel;" - "streams=16\r\n" - "a=sendrecv\r\n"; - - // Need to create an offer, since that's currently required by our - // FSM. This may change in the future. - a1_->CreateOffer(options, OFFER_AV); - a1_->SetLocal(TestObserver::OFFER, a1_->offer(), true); - // We now detect the missing ICE parameters at SetRemoteDescription - a2_->SetRemote(TestObserver::OFFER, offer, true, - PCImplSignalingState::SignalingStable); - ASSERT_TRUE(a2_->pObserver->state == TestObserver::stateError); -} - -TEST_P(SignalingTest, AudioOnlyCalleeNoRtcpMux) -{ - EnsureInit(); - - OfferOptions options; - - a1_->CreateOffer(options, OFFER_AUDIO); - a1_->SetLocal(TestObserver::OFFER, a1_->offer(), false); - ParsedSDP sdpWrapper(a1_->offer()); - sdpWrapper.DeleteLine("a=rtcp-mux"); - std::cout << "Modified SDP " << std::endl - << indent(sdpWrapper.getSdp()) << std::endl; - a2_->SetRemote(TestObserver::OFFER, sdpWrapper.getSdp(), false); - a2_->CreateAnswer(OFFER_AUDIO | ANSWER_AUDIO); - a2_->SetLocal(TestObserver::ANSWER, a2_->answer(), false); - a1_->SetRemote(TestObserver::ANSWER, a2_->answer(), false); - - a1_->mExpectRtcpMuxAudio = false; - a2_->mExpectRtcpMuxAudio = false; - - // Answer should not have a=rtcp-mux - ASSERT_EQ(a2_->getLocalDescription().find("\r\na=rtcp-mux"), - std::string::npos) << "SDP was: " << a2_->getLocalDescription(); - - WaitForCompleted(); - - CheckPipelines(); - CheckStreams(); - - CloseStreams(); -} - - - -TEST_P(SignalingTest, AudioOnlyG722Only) -{ - EnsureInit(); - - OfferOptions options; - - a1_->CreateOffer(options, OFFER_AUDIO); - a1_->SetLocal(TestObserver::OFFER, a1_->offer(), false); - ParsedSDP sdpWrapper(a1_->offer()); - sdpWrapper.ReplaceLine("m=audio", - "m=audio 65375 UDP/TLS/RTP/SAVPF 9\r\n"); - std::cout << "Modified SDP " << std::endl - << indent(sdpWrapper.getSdp()) << std::endl; - a2_->SetRemote(TestObserver::OFFER, sdpWrapper.getSdp(), false); - a2_->CreateAnswer(OFFER_AUDIO | ANSWER_AUDIO); - a2_->SetLocal(TestObserver::ANSWER, a2_->answer(), false); - a1_->SetRemote(TestObserver::ANSWER, a2_->answer(), false); - ASSERT_NE(a2_->getLocalDescription().find("UDP/TLS/RTP/SAVPF 9\r"), - std::string::npos); - ASSERT_NE(a2_->getLocalDescription().find("a=rtpmap:9 G722/8000"), std::string::npos); - - WaitForCompleted(); - - CheckPipelines(); - CheckStreams(); - - CloseStreams(); -} - TEST_P(SignalingTest, AudioOnlyG722MostPreferred) { EnsureInit(); @@ -3408,39 +2822,6 @@ TEST_P(SignalingTest, AudioOnlyG722MostPreferred) CloseStreams(); } -TEST_P(SignalingTest, AudioOnlyG722Rejected) -{ - EnsureInit(); - - OfferOptions options; - - a1_->CreateOffer(options, OFFER_AUDIO); - // creating different SDPs as a workaround for rejecting codecs - // this way the answerer should pick a codec with lower priority - a1_->SetLocal(TestObserver::OFFER, a1_->offer(), false); - ParsedSDP sdpWrapper(a1_->offer()); - sdpWrapper.ReplaceLine("m=audio", - "m=audio 65375 UDP/TLS/RTP/SAVPF 0 8\r\n"); - std::cout << "Modified SDP offer " << std::endl - << indent(sdpWrapper.getSdp()) << std::endl; - a2_->SetRemote(TestObserver::OFFER, sdpWrapper.getSdp(), false); - a2_->CreateAnswer(OFFER_AUDIO | ANSWER_AUDIO); - a2_->SetLocal(TestObserver::ANSWER, a2_->answer(), false); - a1_->SetRemote(TestObserver::ANSWER, a2_->answer(), false); - // TODO(bug 814227): Use commented out code instead. - ASSERT_NE(a2_->getLocalDescription().find("UDP/TLS/RTP/SAVPF 0\r"), - std::string::npos); - // ASSERT_NE(a2_->getLocalDescription().find("UDP/TLS/RTP/SAVPF 0 8\r"), std::string::npos); - ASSERT_NE(a2_->getLocalDescription().find("a=rtpmap:0 PCMU/8000"), std::string::npos); - ASSERT_EQ(a2_->getLocalDescription().find("a=rtpmap:109 opus/48000/2"), std::string::npos); - ASSERT_EQ(a2_->getLocalDescription().find("a=rtpmap:9 G722/8000"), std::string::npos); - - CheckPipelines(); - CheckStreams(); - - CloseStreams(); -} - TEST_P(SignalingTest, RestartIce) { OfferOptions options; @@ -3452,53 +2833,7 @@ TEST_P(SignalingTest, RestartIce) CloseStreams(); } -TEST_P(SignalingTest, FullCallAudioNoMuxVideoMux) -{ - if (UseBundle()) { - // This test doesn't make sense for bundle - return; - } - EnsureInit(); - - OfferOptions options; - - a1_->CreateOffer(options, OFFER_AV); - a1_->SetLocal(TestObserver::OFFER, a1_->offer(), false); - ParsedSDP sdpWrapper(a1_->offer()); - sdpWrapper.DeleteLine("a=rtcp-mux"); - std::cout << "Modified SDP " << std::endl - << indent(sdpWrapper.getSdp()) << std::endl; - a2_->SetRemote(TestObserver::OFFER, sdpWrapper.getSdp(), false); - a2_->CreateAnswer(OFFER_AV | ANSWER_AV); - a2_->SetLocal(TestObserver::ANSWER, a2_->answer(), false); - a1_->SetRemote(TestObserver::ANSWER, a2_->answer(), false); - - // Answer should have only one a=rtcp-mux line - size_t match = a2_->getLocalDescription().find("\r\na=rtcp-mux"); - ASSERT_NE(match, std::string::npos); - match = a2_->getLocalDescription().find("\r\na=rtcp-mux", match + 1); - ASSERT_EQ(match, std::string::npos); - - a1_->mExpectRtcpMuxAudio = false; - a2_->mExpectRtcpMuxAudio = false; - - WaitForCompleted(); - CheckPipelines(); - CheckStreams(); - - CloseStreams(); -} - -// TODO: Move to jsep_sesion_unittest -TEST_P(SignalingTest, RtcpFbInOffer) -{ - EnsureInit(); - OfferOptions options; - a1_->CreateOffer(options, OFFER_AV); - const char *expected[] = { "nack", "nack pli", "ccm fir" }; - CheckRtcpFbSdp(a1_->offer(), ARRAY_TO_SET(std::string, expected)); -} TEST_P(SignalingTest, RtcpFbOfferAll) { @@ -3628,273 +2963,6 @@ TEST_P(SignalingTest, RtcpFbAnswerNoFeedback) VideoSessionConduit::FrameRequestNone); } -// In this test we will change the offer SDP's a=setup value -// from actpass to passive. This will make the answer do active. -TEST_P(SignalingTest, AudioCallForceDtlsRoles) -{ - EnsureInit(); - - OfferOptions options; - size_t match; - - a1_->CreateOffer(options, OFFER_AUDIO); - - // By default the offer should give actpass - std::string offer(a1_->offer()); - match = offer.find("\r\na=setup:actpass"); - ASSERT_NE(match, std::string::npos); - // Now replace the actpass with passive so that the answer will - // return active - offer.replace(match, strlen("\r\na=setup:actpass"), - "\r\na=setup:passive"); - std::cout << "Modified SDP " << std::endl - << indent(offer) << std::endl; - - a1_->SetLocal(TestObserver::OFFER, offer, false); - a2_->SetRemote(TestObserver::OFFER, offer, false); - a2_->CreateAnswer(OFFER_AUDIO | ANSWER_AUDIO); - - // Now the answer should contain a=setup:active - std::string answer(a2_->answer()); - match = answer.find("\r\na=setup:active"); - ASSERT_NE(match, std::string::npos); - - // This should setup the DTLS with the same roles - // as the regular tests above. - a2_->SetLocal(TestObserver::ANSWER, a2_->answer(), false); - a1_->SetRemote(TestObserver::ANSWER, a2_->answer(), false); - - WaitForCompleted(); - - CheckPipelines(); - CheckStreams(); - - CloseStreams(); -} - -// In this test we will change the offer SDP's a=setup value -// from actpass to active. This will make the answer do passive -TEST_P(SignalingTest, AudioCallReverseDtlsRoles) -{ - EnsureInit(); - - OfferOptions options; - size_t match; - - a1_->CreateOffer(options, OFFER_AUDIO); - - // By default the offer should give actpass - std::string offer(a1_->offer()); - match = offer.find("\r\na=setup:actpass"); - ASSERT_NE(match, std::string::npos); - // Now replace the actpass with active so that the answer will - // return passive - offer.replace(match, strlen("\r\na=setup:actpass"), - "\r\na=setup:active"); - std::cout << "Modified SDP " << std::endl - << indent(offer) << std::endl; - - a1_->SetLocal(TestObserver::OFFER, offer, false); - a2_->SetRemote(TestObserver::OFFER, offer, false); - a2_->CreateAnswer(OFFER_AUDIO | ANSWER_AUDIO); - - // Now the answer should contain a=setup:passive - std::string answer(a2_->answer()); - match = answer.find("\r\na=setup:passive"); - ASSERT_NE(match, std::string::npos); - - // This should setup the DTLS with the opposite roles - // than the regular tests above. - a2_->SetLocal(TestObserver::ANSWER, a2_->answer(), false); - a1_->SetRemote(TestObserver::ANSWER, a2_->answer(), false); - - WaitForCompleted(); - - CheckPipelines(); - CheckStreams(); - - CloseStreams(); -} - -// In this test we will change the answer SDP's a=setup value -// from active to passive. This will make both sides do -// active and should not connect. -TEST_P(SignalingTest, AudioCallMismatchDtlsRoles) -{ - EnsureInit(); - - OfferOptions options; - size_t match; - - a1_->CreateOffer(options, OFFER_AUDIO); - - // By default the offer should give actpass - std::string offer(a1_->offer()); - match = offer.find("\r\na=setup:actpass"); - ASSERT_NE(match, std::string::npos); - a1_->SetLocal(TestObserver::OFFER, offer, false); - a2_->SetRemote(TestObserver::OFFER, offer, false); - a2_->CreateAnswer(OFFER_AUDIO | ANSWER_AUDIO); - - // Now the answer should contain a=setup:active - std::string answer(a2_->answer()); - match = answer.find("\r\na=setup:active"); - ASSERT_NE(match, std::string::npos); - a2_->SetLocal(TestObserver::ANSWER, answer, false); - - // Now replace the active with passive so that the offerer will - // also do active. - answer.replace(match, strlen("\r\na=setup:active"), - "\r\na=setup:passive"); - std::cout << "Modified SDP " << std::endl - << indent(answer) << std::endl; - - // This should setup the DTLS with both sides playing active - a1_->SetRemote(TestObserver::ANSWER, answer, false); - - WaitForCompleted(); - - // Not using ASSERT_TRUE_WAIT here because we expect failure - PR_Sleep(500); // Wait for some data to get written - - CloseStreams(); - - ASSERT_GE(a1_->GetPacketsSent(0), 4); - // In this case we should receive nothing. - ASSERT_EQ(a2_->GetPacketsReceived(0), 0); -} - -// In this test we will change the offer SDP's a=setup value -// from actpass to garbage. It should ignore the garbage value -// and respond with setup:active -TEST_P(SignalingTest, AudioCallGarbageSetup) -{ - EnsureInit(); - - OfferOptions options; - size_t match; - - a1_->CreateOffer(options, OFFER_AUDIO); - - // By default the offer should give actpass - std::string offer(a1_->offer()); - match = offer.find("\r\na=setup:actpass"); - ASSERT_NE(match, std::string::npos); - // Now replace the actpass with a garbage value - offer.replace(match, strlen("\r\na=setup:actpass"), - "\r\na=setup:G4rb4g3V4lu3"); - std::cout << "Modified SDP " << std::endl - << indent(offer) << std::endl; - - a1_->SetLocal(TestObserver::OFFER, offer, false); - a2_->SetRemote(TestObserver::OFFER, offer, false); - a2_->CreateAnswer(OFFER_AUDIO | ANSWER_AUDIO); - - // Now the answer should contain a=setup:active - std::string answer(a2_->answer()); - match = answer.find("\r\na=setup:active"); - ASSERT_NE(match, std::string::npos); - - // This should setup the DTLS with the same roles - // as the regular tests above. - a2_->SetLocal(TestObserver::ANSWER, a2_->answer(), false); - a1_->SetRemote(TestObserver::ANSWER, a2_->answer(), false); - - WaitForCompleted(); - - CheckPipelines(); - CheckStreams(); - - CloseStreams(); -} - -// In this test we will change the offer SDP to remove the -// a=setup line. Answer should respond with a=setup:active. -TEST_P(SignalingTest, AudioCallOfferNoSetupOrConnection) -{ - EnsureInit(); - - OfferOptions options; - size_t match; - - a1_->CreateOffer(options, OFFER_AUDIO); - - std::string offer(a1_->offer()); - a1_->SetLocal(TestObserver::OFFER, offer, false); - - // By default the offer should give setup:actpass - match = offer.find("\r\na=setup:actpass"); - ASSERT_NE(match, std::string::npos); - // Remove the a=setup line - offer.replace(match, strlen("\r\na=setup:actpass"), ""); - std::cout << "Modified SDP " << std::endl - << indent(offer) << std::endl; - - a2_->SetRemote(TestObserver::OFFER, offer, false); - a2_->CreateAnswer(OFFER_AUDIO | ANSWER_AUDIO); - - // Now the answer should contain a=setup:active - std::string answer(a2_->answer()); - match = answer.find("\r\na=setup:active"); - ASSERT_NE(match, std::string::npos); - - // This should setup the DTLS with the same roles - // as the regular tests above. - a2_->SetLocal(TestObserver::ANSWER, a2_->answer(), false); - a1_->SetRemote(TestObserver::ANSWER, a2_->answer(), false); - - WaitForCompleted(); - - CheckPipelines(); - CheckStreams(); - - CloseStreams(); -} - -// In this test we will change the answer SDP to remove the -// a=setup line. ICE should still connect since active will -// be assumed. -TEST_P(SignalingTest, AudioCallAnswerNoSetupOrConnection) -{ - EnsureInit(); - - OfferOptions options; - size_t match; - - a1_->CreateOffer(options, OFFER_AUDIO); - - // By default the offer should give setup:actpass - std::string offer(a1_->offer()); - match = offer.find("\r\na=setup:actpass"); - ASSERT_NE(match, std::string::npos); - - a1_->SetLocal(TestObserver::OFFER, offer, false); - a2_->SetRemote(TestObserver::OFFER, offer, false); - a2_->CreateAnswer(OFFER_AUDIO | ANSWER_AUDIO); - - // Now the answer should contain a=setup:active - std::string answer(a2_->answer()); - match = answer.find("\r\na=setup:active"); - ASSERT_NE(match, std::string::npos); - // Remove the a=setup line - answer.replace(match, strlen("\r\na=setup:active"), ""); - std::cout << "Modified SDP " << std::endl - << indent(answer) << std::endl; - - // This should setup the DTLS with the same roles - // as the regular tests above. - a2_->SetLocal(TestObserver::ANSWER, answer, false); - a1_->SetRemote(TestObserver::ANSWER, answer, false); - - WaitForCompleted(); - - CheckPipelines(); - CheckStreams(); - - CloseStreams(); -} - - TEST_P(SignalingTest, FullCallRealTrickle) { OfferOptions options; @@ -4201,136 +3269,6 @@ TEST_P(SignalingTest, OfferWithH264BeforeVP8) ASSERT_NE(answer.find("a=rtcp-fb:126 ccm fir"), std::string::npos); } -#ifdef H264_P0_SUPPORTED -// Remove H.264 P1 and VP8 from offer, check answer negotiates H.264 P0 -TEST_P(SignalingTest, OfferWithOnlyH264P0) -{ - EnsureInit(); - - OfferOptions options; - size_t match; - - a1_->CreateOffer(options, OFFER_AV); - - // Remove VP8 from offer - std::string offer = a1_->offer(); - match = offer.find("UDP/TLS/RTP/SAVPF 120 126"); - ASSERT_NE(std::string::npos, match); - offer.replace(match, - strlen("UDP/TLS/RTP/SAVPF 120 126"), - "UDP/TLS/RTP/SAVPF"); - - ParsedSDP sdpWrapper(offer); - sdpWrapper.DeleteLines("a=rtcp-fb:120"); - sdpWrapper.DeleteLine("a=rtpmap:120"); - sdpWrapper.DeleteLines("a=rtcp-fb:126"); - sdpWrapper.DeleteLine("a=rtpmap:126"); - sdpWrapper.DeleteLine("a=fmtp:126"); - - std::cout << "Modified SDP " << std::endl - << indent(sdpWrapper.getSdp()) << std::endl; - - // Offer shouldn't have P1 or VP8 now - offer = sdpWrapper.getSdp(); - ASSERT_EQ(offer.find("a=rtpmap:126 H264/90000"), std::string::npos); - ASSERT_EQ(offer.find("a=rtpmap:120 VP8/90000"), std::string::npos); - - // P0 should be offered first - ASSERT_NE(offer.find("UDP/TLS/RTP/SAVPF 97"), std::string::npos); - - a1_->SetLocal(TestObserver::OFFER, offer); - a2_->SetRemote(TestObserver::OFFER, offer, false); - a2_->CreateAnswer(OFFER_AV|ANSWER_AV); - - std::string answer(a2_->answer()); - - // validate answer SDP - ASSERT_NE(answer.find("UDP/TLS/RTP/SAVPF 97"), std::string::npos); - ASSERT_NE(answer.find("a=rtpmap:97 H264/90000"), std::string::npos); - ASSERT_NE(answer.find("a=rtcp-fb:97 nack"), std::string::npos); - ASSERT_NE(answer.find("a=rtcp-fb:97 nack pli"), std::string::npos); - ASSERT_NE(answer.find("a=rtcp-fb:97 ccm fir"), std::string::npos); - // Ensure VP8 and P1 removed - ASSERT_EQ(answer.find("a=rtpmap:126 H264/90000"), std::string::npos); - ASSERT_EQ(answer.find("a=rtpmap:120 VP8/90000"), std::string::npos); - ASSERT_EQ(answer.find("a=rtcp-fb:120"), std::string::npos); - ASSERT_EQ(answer.find("a=rtcp-fb:126"), std::string::npos); -} -#endif - -// Test negotiating an answer which has only H.264 P1 -// Which means replace VP8 with H.264 P1 in answer -TEST_P(SignalingTest, AnswerWithoutVP8) -{ - EnsureInit(); - - OfferOptions options; - - a1_->CreateOffer(options, OFFER_AV); - a1_->SetLocal(TestObserver::OFFER, a1_->offer()); - a2_->SetRemote(TestObserver::OFFER, a1_->offer(), false); - a2_->CreateAnswer(OFFER_AV|ANSWER_AV); - - std::string answer(a2_->answer()); - - // Ensure answer has VP8 - ASSERT_NE(answer.find("\r\na=rtpmap:120 VP8/90000"), std::string::npos); - - // Replace VP8 with H.264 P1 - ParsedSDP sdpWrapper(a2_->answer()); - sdpWrapper.AddLine("a=fmtp:126 profile-level-id=42e00c;level-asymmetry-allowed=1;packetization-mode=1\r\n"); - size_t match; - answer = sdpWrapper.getSdp(); - - match = answer.find("UDP/TLS/RTP/SAVPF 120"); - ASSERT_NE(std::string::npos, match); - answer.replace(match, - strlen("UDP/TLS/RTP/SAVPF 120"), - "UDP/TLS/RTP/SAVPF 126"); - - match = answer.find("\r\na=rtpmap:120 VP8/90000"); - ASSERT_NE(std::string::npos, match); - answer.replace(match, - strlen("\r\na=rtpmap:126 H264/90000"), - "\r\na=rtpmap:126 H264/90000"); - - match = answer.find("\r\na=rtcp-fb:120 nack"); - ASSERT_NE(std::string::npos, match); - answer.replace(match, - strlen("\r\na=rtcp-fb:126 nack"), - "\r\na=rtcp-fb:126 nack"); - - match = answer.find("\r\na=rtcp-fb:120 nack pli"); - ASSERT_NE(std::string::npos, match); - answer.replace(match, - strlen("\r\na=rtcp-fb:126 nack pli"), - "\r\na=rtcp-fb:126 nack pli"); - - match = answer.find("\r\na=rtcp-fb:120 ccm fir"); - ASSERT_NE(std::string::npos, match); - answer.replace(match, - strlen("\r\na=rtcp-fb:126 ccm fir"), - "\r\na=rtcp-fb:126 ccm fir"); - - std::cout << "Modified SDP " << std::endl << indent(answer) << std::endl; - - a2_->SetLocal(TestObserver::ANSWER, answer, false); - - ASSERT_EQ(a2_->pObserver->lastStatusCode, - PeerConnectionImpl::kNoError); - - a1_->SetRemote(TestObserver::ANSWER, answer, false); - - ASSERT_EQ(a1_->pObserver->lastStatusCode, - PeerConnectionImpl::kNoError); - - WaitForCompleted(); - - // We cannot check pipelines/streams since the H264 stuff won't init. - - CloseStreams(); -} - // Test using a non preferred dynamic video payload type on answer negotiation TEST_P(SignalingTest, UseNonPrefferedPayloadTypeOnAnswer) {