| 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 |
| 11 #include <string> | 11 #include <string> |
| 12 #include <utility> | 12 #include <utility> |
| 13 | 13 |
| 14 #include "testing/gmock/include/gmock/gmock.h" |
| 14 #include "webrtc/api/audiotrack.h" | 15 #include "webrtc/api/audiotrack.h" |
| 15 #include "webrtc/api/jsepsessiondescription.h" | 16 #include "webrtc/api/jsepsessiondescription.h" |
| 16 #include "webrtc/api/mediastream.h" | 17 #include "webrtc/api/mediastream.h" |
| 17 #include "webrtc/api/mediastreaminterface.h" | 18 #include "webrtc/api/mediastreaminterface.h" |
| 18 #include "webrtc/api/peerconnection.h" | 19 #include "webrtc/api/peerconnection.h" |
| 19 #include "webrtc/api/peerconnectioninterface.h" | 20 #include "webrtc/api/peerconnectioninterface.h" |
| 20 #include "webrtc/api/rtpreceiverinterface.h" | 21 #include "webrtc/api/rtpreceiverinterface.h" |
| 21 #include "webrtc/api/rtpsenderinterface.h" | 22 #include "webrtc/api/rtpsenderinterface.h" |
| 22 #include "webrtc/api/streamcollection.h" | 23 #include "webrtc/api/streamcollection.h" |
| 23 #ifdef WEBRTC_ANDROID | 24 #ifdef WEBRTC_ANDROID |
| (...skipping 209 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 233 "a=ssrc:4 msid:stream1 videotrack1\r\n"; | 234 "a=ssrc:4 msid:stream1 videotrack1\r\n"; |
| 234 | 235 |
| 235 #define MAYBE_SKIP_TEST(feature) \ | 236 #define MAYBE_SKIP_TEST(feature) \ |
| 236 if (!(feature())) { \ | 237 if (!(feature())) { \ |
| 237 LOG(LS_INFO) << "Feature disabled... skipping"; \ | 238 LOG(LS_INFO) << "Feature disabled... skipping"; \ |
| 238 return; \ | 239 return; \ |
| 239 } | 240 } |
| 240 | 241 |
| 241 using rtc::scoped_ptr; | 242 using rtc::scoped_ptr; |
| 242 using rtc::scoped_refptr; | 243 using rtc::scoped_refptr; |
| 244 using ::testing::Exactly; |
| 243 using webrtc::AudioSourceInterface; | 245 using webrtc::AudioSourceInterface; |
| 244 using webrtc::AudioTrack; | 246 using webrtc::AudioTrack; |
| 245 using webrtc::AudioTrackInterface; | 247 using webrtc::AudioTrackInterface; |
| 246 using webrtc::DataBuffer; | 248 using webrtc::DataBuffer; |
| 247 using webrtc::DataChannelInterface; | 249 using webrtc::DataChannelInterface; |
| 248 using webrtc::FakeConstraints; | 250 using webrtc::FakeConstraints; |
| 249 using webrtc::IceCandidateInterface; | 251 using webrtc::IceCandidateInterface; |
| 250 using webrtc::MediaConstraintsInterface; | 252 using webrtc::MediaConstraintsInterface; |
| 251 using webrtc::MediaStream; | 253 using webrtc::MediaStream; |
| 252 using webrtc::MediaStreamInterface; | 254 using webrtc::MediaStreamInterface; |
| 253 using webrtc::MediaStreamTrackInterface; | 255 using webrtc::MediaStreamTrackInterface; |
| 254 using webrtc::MockCreateSessionDescriptionObserver; | 256 using webrtc::MockCreateSessionDescriptionObserver; |
| 255 using webrtc::MockDataChannelObserver; | 257 using webrtc::MockDataChannelObserver; |
| 256 using webrtc::MockSetSessionDescriptionObserver; | 258 using webrtc::MockSetSessionDescriptionObserver; |
| 257 using webrtc::MockStatsObserver; | 259 using webrtc::MockStatsObserver; |
| 260 using webrtc::NotifierInterface; |
| 261 using webrtc::ObserverInterface; |
| 258 using webrtc::PeerConnectionInterface; | 262 using webrtc::PeerConnectionInterface; |
| 259 using webrtc::PeerConnectionObserver; | 263 using webrtc::PeerConnectionObserver; |
| 260 using webrtc::RtpReceiverInterface; | 264 using webrtc::RtpReceiverInterface; |
| 261 using webrtc::RtpSenderInterface; | 265 using webrtc::RtpSenderInterface; |
| 262 using webrtc::SdpParseError; | 266 using webrtc::SdpParseError; |
| 263 using webrtc::SessionDescriptionInterface; | 267 using webrtc::SessionDescriptionInterface; |
| 264 using webrtc::StreamCollection; | 268 using webrtc::StreamCollection; |
| 265 using webrtc::StreamCollectionInterface; | 269 using webrtc::StreamCollectionInterface; |
| 266 using webrtc::VideoTrackSourceInterface; | 270 using webrtc::VideoTrackSourceInterface; |
| 267 using webrtc::VideoTrack; | 271 using webrtc::VideoTrack; |
| (...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 380 } | 384 } |
| 381 for (size_t j = 0; j != video_tracks1.size(); ++j) { | 385 for (size_t j = 0; j != video_tracks1.size(); ++j) { |
| 382 if (video_tracks1[j]->id() != video_tracks2[j]->id()) { | 386 if (video_tracks1[j]->id() != video_tracks2[j]->id()) { |
| 383 return false; | 387 return false; |
| 384 } | 388 } |
| 385 } | 389 } |
| 386 } | 390 } |
| 387 return true; | 391 return true; |
| 388 } | 392 } |
| 389 | 393 |
| 394 // Helper class to test Observer. |
| 395 class MockTrackObserver : public ObserverInterface { |
| 396 public: |
| 397 explicit MockTrackObserver(NotifierInterface* notifier) |
| 398 : notifier_(notifier) { |
| 399 notifier_->RegisterObserver(this); |
| 400 } |
| 401 |
| 402 ~MockTrackObserver() { Unregister(); } |
| 403 |
| 404 void Unregister() { |
| 405 if (notifier_) { |
| 406 notifier_->UnregisterObserver(this); |
| 407 notifier_ = nullptr; |
| 408 } |
| 409 } |
| 410 |
| 411 MOCK_METHOD0(OnChanged, void()); |
| 412 |
| 413 private: |
| 414 NotifierInterface* notifier_; |
| 415 }; |
| 416 |
| 390 class MockPeerConnectionObserver : public PeerConnectionObserver { | 417 class MockPeerConnectionObserver : public PeerConnectionObserver { |
| 391 public: | 418 public: |
| 392 MockPeerConnectionObserver() : remote_streams_(StreamCollection::Create()) {} | 419 MockPeerConnectionObserver() : remote_streams_(StreamCollection::Create()) {} |
| 393 ~MockPeerConnectionObserver() { | 420 ~MockPeerConnectionObserver() { |
| 394 } | 421 } |
| 395 void SetPeerConnectionInterface(PeerConnectionInterface* pc) { | 422 void SetPeerConnectionInterface(PeerConnectionInterface* pc) { |
| 396 pc_ = pc; | 423 pc_ = pc; |
| 397 if (pc) { | 424 if (pc) { |
| 398 state_ = pc_->signaling_state(); | 425 state_ = pc_->signaling_state(); |
| 399 } | 426 } |
| (...skipping 1436 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1836 EXPECT_EQ(PeerConnectionInterface::kIceGatheringComplete, | 1863 EXPECT_EQ(PeerConnectionInterface::kIceGatheringComplete, |
| 1837 pc_->ice_gathering_state()); | 1864 pc_->ice_gathering_state()); |
| 1838 | 1865 |
| 1839 EXPECT_EQ(1u, pc_->local_streams()->count()); | 1866 EXPECT_EQ(1u, pc_->local_streams()->count()); |
| 1840 EXPECT_EQ(1u, pc_->remote_streams()->count()); | 1867 EXPECT_EQ(1u, pc_->remote_streams()->count()); |
| 1841 | 1868 |
| 1842 scoped_refptr<MediaStreamInterface> remote_stream = | 1869 scoped_refptr<MediaStreamInterface> remote_stream = |
| 1843 pc_->remote_streams()->at(0); | 1870 pc_->remote_streams()->at(0); |
| 1844 EXPECT_EQ(MediaStreamTrackInterface::kEnded, | 1871 EXPECT_EQ(MediaStreamTrackInterface::kEnded, |
| 1845 remote_stream->GetVideoTracks()[0]->state()); | 1872 remote_stream->GetVideoTracks()[0]->state()); |
| 1846 EXPECT_EQ(MediaStreamTrackInterface::kEnded, | 1873 // Audio source state changes are posted. |
| 1847 remote_stream->GetAudioTracks()[0]->state()); | 1874 EXPECT_EQ_WAIT(MediaStreamTrackInterface::kEnded, |
| 1875 remote_stream->GetAudioTracks()[0]->state(), 1); |
| 1848 } | 1876 } |
| 1849 | 1877 |
| 1850 // Test that PeerConnection methods fails gracefully after | 1878 // Test that PeerConnection methods fails gracefully after |
| 1851 // PeerConnection::Close has been called. | 1879 // PeerConnection::Close has been called. |
| 1852 TEST_F(PeerConnectionInterfaceTest, CloseAndTestMethods) { | 1880 TEST_F(PeerConnectionInterfaceTest, CloseAndTestMethods) { |
| 1853 CreatePeerConnection(); | 1881 CreatePeerConnection(); |
| 1854 AddAudioVideoStream(kStreamLabel1, "audio_label", "video_label"); | 1882 AddAudioVideoStream(kStreamLabel1, "audio_label", "video_label"); |
| 1855 CreateOfferAsRemoteDescription(); | 1883 CreateOfferAsRemoteDescription(); |
| 1856 CreateAnswerAsLocalDescription(); | 1884 CreateAnswerAsLocalDescription(); |
| 1857 | 1885 |
| (...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1942 EXPECT_TRUE(DoSetRemoteDescription(desc_ms1.release())); | 1970 EXPECT_TRUE(DoSetRemoteDescription(desc_ms1.release())); |
| 1943 EXPECT_TRUE(CompareStreamCollections(observer_.remote_streams(), | 1971 EXPECT_TRUE(CompareStreamCollections(observer_.remote_streams(), |
| 1944 reference_collection_)); | 1972 reference_collection_)); |
| 1945 | 1973 |
| 1946 // Add extra audio and video tracks to the same MediaStream. | 1974 // Add extra audio and video tracks to the same MediaStream. |
| 1947 rtc::scoped_ptr<SessionDescriptionInterface> desc_ms1_two_tracks = | 1975 rtc::scoped_ptr<SessionDescriptionInterface> desc_ms1_two_tracks = |
| 1948 CreateSessionDescriptionAndReference(2, 2); | 1976 CreateSessionDescriptionAndReference(2, 2); |
| 1949 EXPECT_TRUE(DoSetRemoteDescription(desc_ms1_two_tracks.release())); | 1977 EXPECT_TRUE(DoSetRemoteDescription(desc_ms1_two_tracks.release())); |
| 1950 EXPECT_TRUE(CompareStreamCollections(observer_.remote_streams(), | 1978 EXPECT_TRUE(CompareStreamCollections(observer_.remote_streams(), |
| 1951 reference_collection_)); | 1979 reference_collection_)); |
| 1980 scoped_refptr<AudioTrackInterface> audio_track2 = |
| 1981 observer_.remote_streams()->at(0)->GetAudioTracks()[1]; |
| 1982 EXPECT_EQ(webrtc::MediaStreamTrackInterface::kLive, audio_track2->state()); |
| 1983 scoped_refptr<VideoTrackInterface> video_track2 = |
| 1984 observer_.remote_streams()->at(0)->GetVideoTracks()[1]; |
| 1985 EXPECT_EQ(webrtc::MediaStreamTrackInterface::kLive, video_track2->state()); |
| 1952 | 1986 |
| 1953 // Remove the extra audio and video tracks. | 1987 // Remove the extra audio and video tracks. |
| 1954 rtc::scoped_ptr<SessionDescriptionInterface> desc_ms2 = | 1988 rtc::scoped_ptr<SessionDescriptionInterface> desc_ms2 = |
| 1955 CreateSessionDescriptionAndReference(1, 1); | 1989 CreateSessionDescriptionAndReference(1, 1); |
| 1990 MockTrackObserver audio_track_observer(audio_track2); |
| 1991 MockTrackObserver video_track_observer(video_track2); |
| 1992 |
| 1993 EXPECT_CALL(audio_track_observer, OnChanged()).Times(Exactly(1)); |
| 1994 EXPECT_CALL(video_track_observer, OnChanged()).Times(Exactly(1)); |
| 1956 EXPECT_TRUE(DoSetRemoteDescription(desc_ms2.release())); | 1995 EXPECT_TRUE(DoSetRemoteDescription(desc_ms2.release())); |
| 1957 EXPECT_TRUE(CompareStreamCollections(observer_.remote_streams(), | 1996 EXPECT_TRUE(CompareStreamCollections(observer_.remote_streams(), |
| 1958 reference_collection_)); | 1997 reference_collection_)); |
| 1998 // Audio source state changes are posted. |
| 1999 EXPECT_EQ_WAIT(webrtc::MediaStreamTrackInterface::kEnded, |
| 2000 audio_track2->state(), 1); |
| 2001 EXPECT_EQ(webrtc::MediaStreamTrackInterface::kEnded, video_track2->state()); |
| 1959 } | 2002 } |
| 1960 | 2003 |
| 1961 // This tests that remote tracks are ended if a local session description is set | 2004 // This tests that remote tracks are ended if a local session description is set |
| 1962 // that rejects the media content type. | 2005 // that rejects the media content type. |
| 1963 TEST_F(PeerConnectionInterfaceTest, RejectMediaContent) { | 2006 TEST_F(PeerConnectionInterfaceTest, RejectMediaContent) { |
| 1964 FakeConstraints constraints; | 2007 FakeConstraints constraints; |
| 1965 constraints.AddMandatory(webrtc::MediaConstraintsInterface::kEnableDtlsSrtp, | 2008 constraints.AddMandatory(webrtc::MediaConstraintsInterface::kEnableDtlsSrtp, |
| 1966 true); | 2009 true); |
| 1967 CreatePeerConnection(&constraints); | 2010 CreatePeerConnection(&constraints); |
| 1968 // First create and set a remote offer, then reject its video content in our | 2011 // First create and set a remote offer, then reject its video content in our |
| (...skipping 25 matching lines...) Expand all Loading... |
| 1994 EXPECT_TRUE(DoCreateOffer(&local_offer, nullptr)); | 2037 EXPECT_TRUE(DoCreateOffer(&local_offer, nullptr)); |
| 1995 video_info = local_offer->description()->GetContentByName("video"); | 2038 video_info = local_offer->description()->GetContentByName("video"); |
| 1996 ASSERT_TRUE(video_info != nullptr); | 2039 ASSERT_TRUE(video_info != nullptr); |
| 1997 video_info->rejected = true; | 2040 video_info->rejected = true; |
| 1998 cricket::ContentInfo* audio_info = | 2041 cricket::ContentInfo* audio_info = |
| 1999 local_offer->description()->GetContentByName("audio"); | 2042 local_offer->description()->GetContentByName("audio"); |
| 2000 ASSERT_TRUE(audio_info != nullptr); | 2043 ASSERT_TRUE(audio_info != nullptr); |
| 2001 audio_info->rejected = true; | 2044 audio_info->rejected = true; |
| 2002 EXPECT_TRUE(DoSetLocalDescription(local_offer.release())); | 2045 EXPECT_TRUE(DoSetLocalDescription(local_offer.release())); |
| 2003 EXPECT_EQ(webrtc::MediaStreamTrackInterface::kEnded, remote_video->state()); | 2046 EXPECT_EQ(webrtc::MediaStreamTrackInterface::kEnded, remote_video->state()); |
| 2004 EXPECT_EQ(webrtc::MediaStreamTrackInterface::kEnded, remote_audio->state()); | 2047 // Audio source state changes are posted. |
| 2048 EXPECT_EQ_WAIT(webrtc::MediaStreamTrackInterface::kEnded, |
| 2049 remote_audio->state(), 1); |
| 2005 } | 2050 } |
| 2006 | 2051 |
| 2007 // This tests that we won't crash if the remote track has been removed outside | 2052 // This tests that we won't crash if the remote track has been removed outside |
| 2008 // of PeerConnection and then PeerConnection tries to reject the track. | 2053 // of PeerConnection and then PeerConnection tries to reject the track. |
| 2009 TEST_F(PeerConnectionInterfaceTest, RemoveTrackThenRejectMediaContent) { | 2054 TEST_F(PeerConnectionInterfaceTest, RemoveTrackThenRejectMediaContent) { |
| 2010 FakeConstraints constraints; | 2055 FakeConstraints constraints; |
| 2011 constraints.AddMandatory(webrtc::MediaConstraintsInterface::kEnableDtlsSrtp, | 2056 constraints.AddMandatory(webrtc::MediaConstraintsInterface::kEnableDtlsSrtp, |
| 2012 true); | 2057 true); |
| 2013 CreatePeerConnection(&constraints); | 2058 CreatePeerConnection(&constraints); |
| 2014 CreateAndSetRemoteOffer(kSdpStringWithStream1); | 2059 CreateAndSetRemoteOffer(kSdpStringWithStream1); |
| (...skipping 676 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2691 FakeConstraints updated_answer_c; | 2736 FakeConstraints updated_answer_c; |
| 2692 answer_c.SetMandatoryReceiveAudio(false); | 2737 answer_c.SetMandatoryReceiveAudio(false); |
| 2693 answer_c.SetMandatoryReceiveVideo(false); | 2738 answer_c.SetMandatoryReceiveVideo(false); |
| 2694 | 2739 |
| 2695 cricket::MediaSessionOptions updated_answer_options; | 2740 cricket::MediaSessionOptions updated_answer_options; |
| 2696 EXPECT_TRUE( | 2741 EXPECT_TRUE( |
| 2697 ParseConstraintsForAnswer(&updated_answer_c, &updated_answer_options)); | 2742 ParseConstraintsForAnswer(&updated_answer_c, &updated_answer_options)); |
| 2698 EXPECT_TRUE(updated_answer_options.has_audio()); | 2743 EXPECT_TRUE(updated_answer_options.has_audio()); |
| 2699 EXPECT_TRUE(updated_answer_options.has_video()); | 2744 EXPECT_TRUE(updated_answer_options.has_video()); |
| 2700 } | 2745 } |
| OLD | NEW |