10e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org/* 20e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * libjingle 30e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * Copyright 2011, Google Inc. 40e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * 50e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * Redistribution and use in source and binary forms, with or without 60e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * modification, are permitted provided that the following conditions are met: 70e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * 80e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * 1. Redistributions of source code must retain the above copyright notice, 90e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * this list of conditions and the following disclaimer. 100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * 2. Redistributions in binary form must reproduce the above copyright notice, 110e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * this list of conditions and the following disclaimer in the documentation 120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * and/or other materials provided with the distribution. 130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * 3. The name of the author may not be used to endorse or promote products 140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * derived from this software without specific prior written permission. 150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * 160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED 170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO 190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; 220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 240e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF 250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org */ 270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 280e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include <string> 290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include "talk/app/webrtc/audiotrack.h" 310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include "talk/app/webrtc/mediastream.h" 320e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include "talk/app/webrtc/videotrack.h" 33890e5875bea3af49a763bd49eba6d55dc4cbd190xians@webrtc.org#include "testing/gmock/include/gmock/gmock.h" 34890e5875bea3af49a763bd49eba6d55dc4cbd190xians@webrtc.org#include "testing/gtest/include/gtest/gtest.h" 35cf81adffe15fa8ea0f333432e41f6d504148f18abuildbot@webrtc.org#include "webrtc/base/gunit.h" 36cf81adffe15fa8ea0f333432e41f6d504148f18abuildbot@webrtc.org#include "webrtc/base/refcount.h" 37cf81adffe15fa8ea0f333432e41f6d504148f18abuildbot@webrtc.org#include "webrtc/base/scoped_ptr.h" 380e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgstatic const char kStreamLabel1[] = "local_stream_1"; 400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgstatic const char kVideoTrackId[] = "dummy_video_cam_1"; 410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgstatic const char kAudioTrackId[] = "dummy_microphone_1"; 420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 432a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.orgusing rtc::scoped_refptr; 440e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgusing ::testing::Exactly; 450e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 460e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgnamespace webrtc { 470e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Helper class to test Observer. 490e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgclass MockObserver : public ObserverInterface { 500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org public: 510e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org MockObserver() {} 520e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 530e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org MOCK_METHOD0(OnChanged, void()); 540e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}; 550e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 560e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgclass MediaStreamTest: public testing::Test { 570e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org protected: 580e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org virtual void SetUp() { 590e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org stream_ = MediaStream::Create(kStreamLabel1); 600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ASSERT_TRUE(stream_.get() != NULL); 610e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 620e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org video_track_ = VideoTrack::Create(kVideoTrackId, NULL); 630e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ASSERT_TRUE(video_track_.get() != NULL); 640e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(MediaStreamTrackInterface::kInitializing, video_track_->state()); 650e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 660e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org audio_track_ = AudioTrack::Create(kAudioTrackId, NULL); 670e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 680e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ASSERT_TRUE(audio_track_.get() != NULL); 690e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(MediaStreamTrackInterface::kInitializing, audio_track_->state()); 700e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 710e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(stream_->AddTrack(video_track_)); 720e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_FALSE(stream_->AddTrack(video_track_)); 730e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(stream_->AddTrack(audio_track_)); 740e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_FALSE(stream_->AddTrack(audio_track_)); 750e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 760e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 770e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org void ChangeTrack(MediaStreamTrackInterface* track) { 780e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org MockObserver observer; 790e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org track->RegisterObserver(&observer); 800e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 810e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_CALL(observer, OnChanged()) 820e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org .Times(Exactly(1)); 830e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org track->set_enabled(false); 840e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_FALSE(track->enabled()); 850e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 860e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_CALL(observer, OnChanged()) 870e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org .Times(Exactly(1)); 880e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org track->set_state(MediaStreamTrackInterface::kLive); 890e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(MediaStreamTrackInterface::kLive, track->state()); 900e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 910e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 920e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org scoped_refptr<MediaStreamInterface> stream_; 930e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org scoped_refptr<AudioTrackInterface> audio_track_; 940e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org scoped_refptr<VideoTrackInterface> video_track_; 950e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}; 960e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 970e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(MediaStreamTest, GetTrackInfo) { 980e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ASSERT_EQ(1u, stream_->GetVideoTracks().size()); 990e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ASSERT_EQ(1u, stream_->GetAudioTracks().size()); 1000e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1010e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Verify the video track. 1020e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org scoped_refptr<webrtc::MediaStreamTrackInterface> video_track( 1030e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org stream_->GetVideoTracks()[0]); 1040e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(0, video_track->id().compare(kVideoTrackId)); 1050e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(video_track->enabled()); 1060e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1070e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ASSERT_EQ(1u, stream_->GetVideoTracks().size()); 1080e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(stream_->GetVideoTracks()[0].get() == video_track.get()); 1090e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(stream_->FindVideoTrack(video_track->id()).get() 1100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org == video_track.get()); 1110e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org video_track = stream_->GetVideoTracks()[0]; 1120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(0, video_track->id().compare(kVideoTrackId)); 1130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(video_track->enabled()); 1140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Verify the audio track. 1160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org scoped_refptr<webrtc::MediaStreamTrackInterface> audio_track( 1170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org stream_->GetAudioTracks()[0]); 1180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(0, audio_track->id().compare(kAudioTrackId)); 1190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(audio_track->enabled()); 1200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ASSERT_EQ(1u, stream_->GetAudioTracks().size()); 1210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(stream_->GetAudioTracks()[0].get() == audio_track.get()); 1220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(stream_->FindAudioTrack(audio_track->id()).get() 1230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org == audio_track.get()); 1240e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org audio_track = stream_->GetAudioTracks()[0]; 1250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(0, audio_track->id().compare(kAudioTrackId)); 1260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(audio_track->enabled()); 1270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 1280e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(MediaStreamTest, RemoveTrack) { 1300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org MockObserver observer; 1310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org stream_->RegisterObserver(&observer); 1320e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1330e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_CALL(observer, OnChanged()) 1340e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org .Times(Exactly(2)); 1350e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1360e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(stream_->RemoveTrack(audio_track_)); 1370e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_FALSE(stream_->RemoveTrack(audio_track_)); 1380e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(0u, stream_->GetAudioTracks().size()); 1390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(0u, stream_->GetAudioTracks().size()); 1400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(stream_->RemoveTrack(video_track_)); 1420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_FALSE(stream_->RemoveTrack(video_track_)); 1430e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1440e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(0u, stream_->GetVideoTracks().size()); 1450e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(0u, stream_->GetVideoTracks().size()); 1460e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1470e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_FALSE(stream_->RemoveTrack(static_cast<AudioTrackInterface*>(NULL))); 1480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_FALSE(stream_->RemoveTrack(static_cast<VideoTrackInterface*>(NULL))); 1490e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 1500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1510e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(MediaStreamTest, ChangeVideoTrack) { 1520e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org scoped_refptr<webrtc::VideoTrackInterface> video_track( 1530e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org stream_->GetVideoTracks()[0]); 1540e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ChangeTrack(video_track.get()); 1550e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 1560e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1570e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(MediaStreamTest, ChangeAudioTrack) { 1580e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org scoped_refptr<webrtc::AudioTrackInterface> audio_track( 1590e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org stream_->GetAudioTracks()[0]); 1600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ChangeTrack(audio_track.get()); 1610e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 1620e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1630e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} // namespace webrtc 164