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