Chromium Code Reviews| 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. |
|
pthatcher1
2016/01/11 17:31:51
***
|
| +// 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); |