Index: talk/app/webrtc/peerconnectioninterface_unittest.cc |
diff --git a/talk/app/webrtc/peerconnectioninterface_unittest.cc b/talk/app/webrtc/peerconnectioninterface_unittest.cc |
index 098f8aee692fc5c8112e718b9e436827747ae077..a1873f0be6bda10c3136d5cb27ad338ee92741a0 100644 |
--- a/talk/app/webrtc/peerconnectioninterface_unittest.cc |
+++ b/talk/app/webrtc/peerconnectioninterface_unittest.cc |
@@ -1020,6 +1020,101 @@ TEST_F(PeerConnectionInterfaceTest, RemoveStream) { |
EXPECT_EQ(0u, pc_->local_streams()->count()); |
} |
+// Test for AddTrack and RemoveTrack methods. |
+// Tests that the created offer includes tracks we added, |
+// and that the RtpSenders are created correctly. |
+// Also tests that RemoveTrack removes the tracks from subsequent offers. |
+TEST_F(PeerConnectionInterfaceTest, AddTrackRemoveTrack) { |
+ CreatePeerConnection(); |
+ // Create a dummy stream, so tracks share a stream label. |
+ scoped_refptr<MediaStreamInterface> stream( |
+ pc_factory_->CreateLocalMediaStream(kStreamLabel1)); |
+ std::vector<MediaStreamInterface*> stream_list; |
+ stream_list.push_back(stream.get()); |
+ scoped_refptr<AudioTrackInterface> audio_track( |
+ pc_factory_->CreateAudioTrack("audio_track", nullptr)); |
+ scoped_refptr<VideoTrackInterface> video_track( |
+ pc_factory_->CreateVideoTrack("video_track", nullptr)); |
+ auto audio_sender = pc_->AddTrack(audio_track, stream_list); |
+ auto video_sender = pc_->AddTrack(video_track, stream_list); |
+ EXPECT_EQ(kStreamLabel1, audio_sender->stream_id()); |
+ EXPECT_EQ("audio_track", audio_sender->id()); |
+ EXPECT_EQ(audio_track, audio_sender->track()); |
+ EXPECT_EQ(kStreamLabel1, video_sender->stream_id()); |
+ EXPECT_EQ("video_track", video_sender->id()); |
+ EXPECT_EQ(video_track, video_sender->track()); |
+ |
+ // Now create an offer and check for the senders. |
+ scoped_ptr<SessionDescriptionInterface> offer; |
+ ASSERT_TRUE(DoCreateOffer(offer.accept(), nullptr)); |
+ |
+ const cricket::ContentInfo* audio_content = |
+ cricket::GetFirstAudioContent(offer->description()); |
+ const cricket::AudioContentDescription* audio_desc = |
+ static_cast<const cricket::AudioContentDescription*>( |
+ audio_content->description); |
+ EXPECT_TRUE( |
+ ContainsTrack(audio_desc->streams(), kStreamLabel1, "audio_track")); |
+ |
+ const cricket::ContentInfo* video_content = |
+ cricket::GetFirstVideoContent(offer->description()); |
+ const cricket::VideoContentDescription* video_desc = |
+ static_cast<const cricket::VideoContentDescription*>( |
+ video_content->description); |
+ EXPECT_TRUE( |
+ ContainsTrack(video_desc->streams(), kStreamLabel1, "video_track")); |
+ |
+ EXPECT_TRUE(DoSetLocalDescription(offer.release())); |
+ |
+ // Now try removing the tracks. |
+ EXPECT_TRUE(pc_->RemoveTrack(audio_sender)); |
+ EXPECT_TRUE(pc_->RemoveTrack(video_sender)); |
+ |
+ // Create a new offer and ensure it doesn't contain the removed senders. |
+ ASSERT_TRUE(DoCreateOffer(offer.accept(), nullptr)); |
+ |
+ audio_content = cricket::GetFirstAudioContent(offer->description()); |
+ audio_desc = static_cast<const cricket::AudioContentDescription*>( |
+ audio_content->description); |
+ EXPECT_FALSE( |
+ ContainsTrack(audio_desc->streams(), kStreamLabel1, "audio_track")); |
+ |
+ video_content = cricket::GetFirstVideoContent(offer->description()); |
+ video_desc = static_cast<const cricket::VideoContentDescription*>( |
+ video_content->description); |
+ EXPECT_FALSE( |
+ ContainsTrack(video_desc->streams(), kStreamLabel1, "video_track")); |
+ |
+ EXPECT_TRUE(DoSetLocalDescription(offer.release())); |
+ |
+ // Calling RemoveTrack on a sender no longer attached to a PeerConnection |
+ // should return false. |
+ EXPECT_FALSE(pc_->RemoveTrack(audio_sender)); |
+ EXPECT_FALSE(pc_->RemoveTrack(video_sender)); |
+} |
+ |
+// Test creating senders without a stream specified, |
+// expecting a random stream ID to be generated. |
+TEST_F(PeerConnectionInterfaceTest, AddTrackWithoutStream) { |
+ CreatePeerConnection(); |
+ // Create a dummy stream, so tracks share a stream label. |
+ scoped_refptr<AudioTrackInterface> audio_track( |
+ pc_factory_->CreateAudioTrack("audio_track", nullptr)); |
+ scoped_refptr<VideoTrackInterface> video_track( |
+ pc_factory_->CreateVideoTrack("video_track", nullptr)); |
+ auto audio_sender = |
+ pc_->AddTrack(audio_track, std::vector<MediaStreamInterface*>()); |
+ auto video_sender = |
+ pc_->AddTrack(video_track, std::vector<MediaStreamInterface*>()); |
+ EXPECT_EQ("audio_track", audio_sender->id()); |
+ EXPECT_EQ(audio_track, audio_sender->track()); |
+ EXPECT_EQ("video_track", video_sender->id()); |
+ EXPECT_EQ(video_track, video_sender->track()); |
+ // If the ID is truly a random GUID, it should be infinitely unlikely they |
+ // will be the same. |
+ EXPECT_NE(video_sender->stream_id(), audio_sender->stream_id()); |
+} |
+ |
TEST_F(PeerConnectionInterfaceTest, CreateOfferReceiveAnswer) { |
InitiateCall(); |
WaitAndVerifyOnAddStream(kStreamLabel1); |