Index: webrtc/api/peerconnectioninterface_unittest.cc |
diff --git a/webrtc/api/peerconnectioninterface_unittest.cc b/webrtc/api/peerconnectioninterface_unittest.cc |
index 4d5eb966f5e2607556e0f460621b860bd85826fd..76f9c5defa4fd0dbd0c59db8a0026498fd16a95e 100644 |
--- a/webrtc/api/peerconnectioninterface_unittest.cc |
+++ b/webrtc/api/peerconnectioninterface_unittest.cc |
@@ -11,6 +11,7 @@ |
#include <string> |
#include <utility> |
+#include "testing/gmock/include/gmock/gmock.h" |
#include "webrtc/api/audiotrack.h" |
#include "webrtc/api/jsepsessiondescription.h" |
#include "webrtc/api/mediastream.h" |
@@ -240,6 +241,7 @@ static const char kSdpStringMs1Video1[] = |
using rtc::scoped_ptr; |
using rtc::scoped_refptr; |
+using ::testing::Exactly; |
using webrtc::AudioSourceInterface; |
using webrtc::AudioTrack; |
using webrtc::AudioTrackInterface; |
@@ -255,6 +257,8 @@ using webrtc::MockCreateSessionDescriptionObserver; |
using webrtc::MockDataChannelObserver; |
using webrtc::MockSetSessionDescriptionObserver; |
using webrtc::MockStatsObserver; |
+using webrtc::NotifierInterface; |
+using webrtc::ObserverInterface; |
using webrtc::PeerConnectionInterface; |
using webrtc::PeerConnectionObserver; |
using webrtc::RtpReceiverInterface; |
@@ -387,6 +391,29 @@ bool CompareStreamCollections(StreamCollectionInterface* s1, |
return true; |
} |
+// Helper class to test Observer. |
+class MockTrackObserver : public ObserverInterface { |
+ public: |
+ explicit MockTrackObserver(NotifierInterface* notifier) |
+ : notifier_(notifier) { |
+ notifier_->RegisterObserver(this); |
+ } |
+ |
+ ~MockTrackObserver() { Unregister(); } |
+ |
+ void Unregister() { |
+ if (notifier_) { |
+ notifier_->UnregisterObserver(this); |
+ notifier_ = nullptr; |
+ } |
+ } |
+ |
+ MOCK_METHOD0(OnChanged, void()); |
+ |
+ private: |
+ NotifierInterface* notifier_; |
+}; |
+ |
class MockPeerConnectionObserver : public PeerConnectionObserver { |
public: |
MockPeerConnectionObserver() : remote_streams_(StreamCollection::Create()) {} |
@@ -1843,8 +1870,9 @@ TEST_F(PeerConnectionInterfaceTest, CloseAndTestStreamsAndStates) { |
pc_->remote_streams()->at(0); |
EXPECT_EQ(MediaStreamTrackInterface::kEnded, |
remote_stream->GetVideoTracks()[0]->state()); |
- EXPECT_EQ(MediaStreamTrackInterface::kEnded, |
- remote_stream->GetAudioTracks()[0]->state()); |
+ // Audio source state changes are posted. |
+ EXPECT_EQ_WAIT(MediaStreamTrackInterface::kEnded, |
+ remote_stream->GetAudioTracks()[0]->state(), 1); |
} |
// Test that PeerConnection methods fails gracefully after |
@@ -1949,13 +1977,28 @@ TEST_F(PeerConnectionInterfaceTest, |
EXPECT_TRUE(DoSetRemoteDescription(desc_ms1_two_tracks.release())); |
EXPECT_TRUE(CompareStreamCollections(observer_.remote_streams(), |
reference_collection_)); |
+ scoped_refptr<AudioTrackInterface> audio_track2 = |
+ observer_.remote_streams()->at(0)->GetAudioTracks()[1]; |
+ EXPECT_EQ(webrtc::MediaStreamTrackInterface::kLive, audio_track2->state()); |
+ scoped_refptr<VideoTrackInterface> video_track2 = |
+ observer_.remote_streams()->at(0)->GetVideoTracks()[1]; |
+ EXPECT_EQ(webrtc::MediaStreamTrackInterface::kLive, video_track2->state()); |
// Remove the extra audio and video tracks. |
rtc::scoped_ptr<SessionDescriptionInterface> desc_ms2 = |
CreateSessionDescriptionAndReference(1, 1); |
+ MockTrackObserver audio_track_observer(audio_track2); |
+ MockTrackObserver video_track_observer(video_track2); |
+ |
+ EXPECT_CALL(audio_track_observer, OnChanged()).Times(Exactly(1)); |
+ EXPECT_CALL(video_track_observer, OnChanged()).Times(Exactly(1)); |
EXPECT_TRUE(DoSetRemoteDescription(desc_ms2.release())); |
EXPECT_TRUE(CompareStreamCollections(observer_.remote_streams(), |
reference_collection_)); |
+ // Audio source state changes are posted. |
+ EXPECT_EQ_WAIT(webrtc::MediaStreamTrackInterface::kEnded, |
+ audio_track2->state(), 1); |
+ EXPECT_EQ(webrtc::MediaStreamTrackInterface::kEnded, video_track2->state()); |
} |
// This tests that remote tracks are ended if a local session description is set |
@@ -2001,7 +2044,9 @@ TEST_F(PeerConnectionInterfaceTest, RejectMediaContent) { |
audio_info->rejected = true; |
EXPECT_TRUE(DoSetLocalDescription(local_offer.release())); |
EXPECT_EQ(webrtc::MediaStreamTrackInterface::kEnded, remote_video->state()); |
- EXPECT_EQ(webrtc::MediaStreamTrackInterface::kEnded, remote_audio->state()); |
+ // Audio source state changes are posted. |
+ EXPECT_EQ_WAIT(webrtc::MediaStreamTrackInterface::kEnded, |
+ remote_audio->state(), 1); |
} |
// This tests that we won't crash if the remote track has been removed outside |