| /* | 
 |  *  Copyright 2011 The WebRTC project authors. All Rights Reserved. | 
 |  * | 
 |  *  Use of this source code is governed by a BSD-style license | 
 |  *  that can be found in the LICENSE file in the root of the source | 
 |  *  tree. An additional intellectual property rights grant can be found | 
 |  *  in the file PATENTS.  All contributing project authors may | 
 |  *  be found in the AUTHORS file in the root of the source tree. | 
 |  */ | 
 |  | 
 | #include "pc/media_stream.h" | 
 |  | 
 | #include <stddef.h> | 
 |  | 
 | #include "api/media_stream_interface.h" | 
 | #include "api/scoped_refptr.h" | 
 | #include "pc/audio_track.h" | 
 | #include "pc/test/fake_video_track_source.h" | 
 | #include "pc/video_track.h" | 
 | #include "rtc_base/thread.h" | 
 | #include "test/gmock.h" | 
 | #include "test/gtest.h" | 
 |  | 
 | static const char kStreamId1[] = "local_stream_1"; | 
 | static const char kVideoTrackId[] = "dummy_video_cam_1"; | 
 | static const char kAudioTrackId[] = "dummy_microphone_1"; | 
 |  | 
 | using ::testing::Exactly; | 
 | using webrtc::scoped_refptr; | 
 |  | 
 | namespace webrtc { | 
 |  | 
 | // Helper class to test Observer. | 
 | class MockObserver : public ObserverInterface { | 
 |  public: | 
 |   explicit MockObserver(NotifierInterface* notifier) : notifier_(notifier) { | 
 |     notifier_->RegisterObserver(this); | 
 |   } | 
 |  | 
 |   ~MockObserver() override { Unregister(); } | 
 |  | 
 |   void Unregister() { | 
 |     if (notifier_) { | 
 |       notifier_->UnregisterObserver(this); | 
 |       notifier_ = nullptr; | 
 |     } | 
 |   } | 
 |  | 
 |   MOCK_METHOD(void, OnChanged, (), (override)); | 
 |  | 
 |  private: | 
 |   NotifierInterface* notifier_; | 
 | }; | 
 |  | 
 | class MediaStreamTest : public ::testing::Test { | 
 |  protected: | 
 |   void SetUp() override { | 
 |     stream_ = MediaStream::Create(kStreamId1); | 
 |     ASSERT_TRUE(stream_.get() != nullptr); | 
 |  | 
 |     video_track_ = VideoTrack::Create( | 
 |         kVideoTrackId, FakeVideoTrackSource::Create(), Thread::Current()); | 
 |     ASSERT_TRUE(video_track_.get() != nullptr); | 
 |     EXPECT_EQ(MediaStreamTrackInterface::kLive, video_track_->state()); | 
 |  | 
 |     audio_track_ = AudioTrack::Create(kAudioTrackId, nullptr); | 
 |  | 
 |     ASSERT_TRUE(audio_track_.get() != nullptr); | 
 |     EXPECT_EQ(MediaStreamTrackInterface::kLive, audio_track_->state()); | 
 |  | 
 |     EXPECT_TRUE(stream_->AddTrack(video_track_)); | 
 |     EXPECT_FALSE(stream_->AddTrack(video_track_)); | 
 |     EXPECT_TRUE(stream_->AddTrack(audio_track_)); | 
 |     EXPECT_FALSE(stream_->AddTrack(audio_track_)); | 
 |   } | 
 |  | 
 |   void ChangeTrack(MediaStreamTrackInterface* track) { | 
 |     MockObserver observer(track); | 
 |  | 
 |     EXPECT_CALL(observer, OnChanged()).Times(Exactly(1)); | 
 |     track->set_enabled(false); | 
 |     EXPECT_FALSE(track->enabled()); | 
 |   } | 
 |  | 
 |   AutoThread main_thread_; | 
 |   scoped_refptr<MediaStreamInterface> stream_; | 
 |   scoped_refptr<AudioTrackInterface> audio_track_; | 
 |   scoped_refptr<VideoTrackInterface> video_track_; | 
 | }; | 
 |  | 
 | TEST_F(MediaStreamTest, GetTrackInfo) { | 
 |   ASSERT_EQ(1u, stream_->GetVideoTracks().size()); | 
 |   ASSERT_EQ(1u, stream_->GetAudioTracks().size()); | 
 |  | 
 |   // Verify the video track. | 
 |   scoped_refptr<MediaStreamTrackInterface> video_track( | 
 |       stream_->GetVideoTracks()[0]); | 
 |   EXPECT_EQ(0, video_track->id().compare(kVideoTrackId)); | 
 |   EXPECT_TRUE(video_track->enabled()); | 
 |  | 
 |   ASSERT_EQ(1u, stream_->GetVideoTracks().size()); | 
 |   EXPECT_TRUE(stream_->GetVideoTracks()[0].get() == video_track.get()); | 
 |   EXPECT_TRUE(stream_->FindVideoTrack(video_track->id()).get() == | 
 |               video_track.get()); | 
 |   video_track = stream_->GetVideoTracks()[0]; | 
 |   EXPECT_EQ(0, video_track->id().compare(kVideoTrackId)); | 
 |   EXPECT_TRUE(video_track->enabled()); | 
 |  | 
 |   // Verify the audio track. | 
 |   scoped_refptr<MediaStreamTrackInterface> audio_track( | 
 |       stream_->GetAudioTracks()[0]); | 
 |   EXPECT_EQ(0, audio_track->id().compare(kAudioTrackId)); | 
 |   EXPECT_TRUE(audio_track->enabled()); | 
 |   ASSERT_EQ(1u, stream_->GetAudioTracks().size()); | 
 |   EXPECT_TRUE(stream_->GetAudioTracks()[0].get() == audio_track.get()); | 
 |   EXPECT_TRUE(stream_->FindAudioTrack(audio_track->id()).get() == | 
 |               audio_track.get()); | 
 |   audio_track = stream_->GetAudioTracks()[0]; | 
 |   EXPECT_EQ(0, audio_track->id().compare(kAudioTrackId)); | 
 |   EXPECT_TRUE(audio_track->enabled()); | 
 | } | 
 |  | 
 | TEST_F(MediaStreamTest, RemoveTrack) { | 
 |   MockObserver observer(stream_.get()); | 
 |  | 
 |   EXPECT_CALL(observer, OnChanged()).Times(Exactly(2)); | 
 |  | 
 |   EXPECT_TRUE(stream_->RemoveTrack(audio_track_)); | 
 |   EXPECT_FALSE(stream_->RemoveTrack(audio_track_)); | 
 |   EXPECT_EQ(0u, stream_->GetAudioTracks().size()); | 
 |   EXPECT_EQ(0u, stream_->GetAudioTracks().size()); | 
 |  | 
 |   EXPECT_TRUE(stream_->RemoveTrack(video_track_)); | 
 |   EXPECT_FALSE(stream_->RemoveTrack(video_track_)); | 
 |  | 
 |   EXPECT_EQ(0u, stream_->GetVideoTracks().size()); | 
 |   EXPECT_EQ(0u, stream_->GetVideoTracks().size()); | 
 |  | 
 |   EXPECT_FALSE(stream_->RemoveTrack(scoped_refptr<AudioTrackInterface>())); | 
 |   EXPECT_FALSE(stream_->RemoveTrack(scoped_refptr<VideoTrackInterface>())); | 
 | } | 
 |  | 
 | TEST_F(MediaStreamTest, ChangeVideoTrack) { | 
 |   scoped_refptr<VideoTrackInterface> video_track(stream_->GetVideoTracks()[0]); | 
 |   ChangeTrack(video_track.get()); | 
 | } | 
 |  | 
 | TEST_F(MediaStreamTest, ChangeAudioTrack) { | 
 |   scoped_refptr<AudioTrackInterface> audio_track(stream_->GetAudioTracks()[0]); | 
 |   ChangeTrack(audio_track.get()); | 
 | } | 
 |  | 
 | }  // namespace webrtc |