xref: /aosp_15_r20/external/webrtc/pc/media_stream_unittest.cc (revision d9f758449e529ab9291ac668be2861e7a55c2422)
1 /*
2  *  Copyright 2011 The WebRTC project authors. All Rights Reserved.
3  *
4  *  Use of this source code is governed by a BSD-style license
5  *  that can be found in the LICENSE file in the root of the source
6  *  tree. An additional intellectual property rights grant can be found
7  *  in the file PATENTS.  All contributing project authors may
8  *  be found in the AUTHORS file in the root of the source tree.
9  */
10 
11 #include "pc/media_stream.h"
12 
13 #include <stddef.h>
14 
15 #include "pc/audio_track.h"
16 #include "pc/test/fake_video_track_source.h"
17 #include "pc/video_track.h"
18 #include "rtc_base/thread.h"
19 #include "test/gmock.h"
20 #include "test/gtest.h"
21 
22 static const char kStreamId1[] = "local_stream_1";
23 static const char kVideoTrackId[] = "dummy_video_cam_1";
24 static const char kAudioTrackId[] = "dummy_microphone_1";
25 
26 using rtc::scoped_refptr;
27 using ::testing::Exactly;
28 
29 namespace webrtc {
30 
31 // Helper class to test Observer.
32 class MockObserver : public ObserverInterface {
33  public:
MockObserver(NotifierInterface * notifier)34   explicit MockObserver(NotifierInterface* notifier) : notifier_(notifier) {
35     notifier_->RegisterObserver(this);
36   }
37 
~MockObserver()38   ~MockObserver() { Unregister(); }
39 
Unregister()40   void Unregister() {
41     if (notifier_) {
42       notifier_->UnregisterObserver(this);
43       notifier_ = nullptr;
44     }
45   }
46 
47   MOCK_METHOD(void, OnChanged, (), (override));
48 
49  private:
50   NotifierInterface* notifier_;
51 };
52 
53 class MediaStreamTest : public ::testing::Test {
54  protected:
SetUp()55   virtual void SetUp() {
56     stream_ = MediaStream::Create(kStreamId1);
57     ASSERT_TRUE(stream_.get() != NULL);
58 
59     video_track_ = VideoTrack::Create(
60         kVideoTrackId, FakeVideoTrackSource::Create(), rtc::Thread::Current());
61     ASSERT_TRUE(video_track_.get() != NULL);
62     EXPECT_EQ(MediaStreamTrackInterface::kLive, video_track_->state());
63 
64     audio_track_ = AudioTrack::Create(kAudioTrackId, nullptr);
65 
66     ASSERT_TRUE(audio_track_.get() != NULL);
67     EXPECT_EQ(MediaStreamTrackInterface::kLive, audio_track_->state());
68 
69     EXPECT_TRUE(stream_->AddTrack(video_track_));
70     EXPECT_FALSE(stream_->AddTrack(video_track_));
71     EXPECT_TRUE(stream_->AddTrack(audio_track_));
72     EXPECT_FALSE(stream_->AddTrack(audio_track_));
73   }
74 
ChangeTrack(MediaStreamTrackInterface * track)75   void ChangeTrack(MediaStreamTrackInterface* track) {
76     MockObserver observer(track);
77 
78     EXPECT_CALL(observer, OnChanged()).Times(Exactly(1));
79     track->set_enabled(false);
80     EXPECT_FALSE(track->enabled());
81   }
82 
83   rtc::AutoThread main_thread_;
84   scoped_refptr<MediaStreamInterface> stream_;
85   scoped_refptr<AudioTrackInterface> audio_track_;
86   scoped_refptr<VideoTrackInterface> video_track_;
87 };
88 
TEST_F(MediaStreamTest,GetTrackInfo)89 TEST_F(MediaStreamTest, GetTrackInfo) {
90   ASSERT_EQ(1u, stream_->GetVideoTracks().size());
91   ASSERT_EQ(1u, stream_->GetAudioTracks().size());
92 
93   // Verify the video track.
94   scoped_refptr<webrtc::MediaStreamTrackInterface> video_track(
95       stream_->GetVideoTracks()[0]);
96   EXPECT_EQ(0, video_track->id().compare(kVideoTrackId));
97   EXPECT_TRUE(video_track->enabled());
98 
99   ASSERT_EQ(1u, stream_->GetVideoTracks().size());
100   EXPECT_TRUE(stream_->GetVideoTracks()[0].get() == video_track.get());
101   EXPECT_TRUE(stream_->FindVideoTrack(video_track->id()).get() ==
102               video_track.get());
103   video_track = stream_->GetVideoTracks()[0];
104   EXPECT_EQ(0, video_track->id().compare(kVideoTrackId));
105   EXPECT_TRUE(video_track->enabled());
106 
107   // Verify the audio track.
108   scoped_refptr<webrtc::MediaStreamTrackInterface> audio_track(
109       stream_->GetAudioTracks()[0]);
110   EXPECT_EQ(0, audio_track->id().compare(kAudioTrackId));
111   EXPECT_TRUE(audio_track->enabled());
112   ASSERT_EQ(1u, stream_->GetAudioTracks().size());
113   EXPECT_TRUE(stream_->GetAudioTracks()[0].get() == audio_track.get());
114   EXPECT_TRUE(stream_->FindAudioTrack(audio_track->id()).get() ==
115               audio_track.get());
116   audio_track = stream_->GetAudioTracks()[0];
117   EXPECT_EQ(0, audio_track->id().compare(kAudioTrackId));
118   EXPECT_TRUE(audio_track->enabled());
119 }
120 
TEST_F(MediaStreamTest,RemoveTrack)121 TEST_F(MediaStreamTest, RemoveTrack) {
122   MockObserver observer(stream_.get());
123 
124   EXPECT_CALL(observer, OnChanged()).Times(Exactly(2));
125 
126   EXPECT_TRUE(stream_->RemoveTrack(audio_track_));
127   EXPECT_FALSE(stream_->RemoveTrack(audio_track_));
128   EXPECT_EQ(0u, stream_->GetAudioTracks().size());
129   EXPECT_EQ(0u, stream_->GetAudioTracks().size());
130 
131   EXPECT_TRUE(stream_->RemoveTrack(video_track_));
132   EXPECT_FALSE(stream_->RemoveTrack(video_track_));
133 
134   EXPECT_EQ(0u, stream_->GetVideoTracks().size());
135   EXPECT_EQ(0u, stream_->GetVideoTracks().size());
136 
137   EXPECT_FALSE(stream_->RemoveTrack(rtc::scoped_refptr<AudioTrackInterface>()));
138   EXPECT_FALSE(stream_->RemoveTrack(rtc::scoped_refptr<VideoTrackInterface>()));
139 }
140 
TEST_F(MediaStreamTest,ChangeVideoTrack)141 TEST_F(MediaStreamTest, ChangeVideoTrack) {
142   scoped_refptr<webrtc::VideoTrackInterface> video_track(
143       stream_->GetVideoTracks()[0]);
144   ChangeTrack(video_track.get());
145 }
146 
TEST_F(MediaStreamTest,ChangeAudioTrack)147 TEST_F(MediaStreamTest, ChangeAudioTrack) {
148   scoped_refptr<webrtc::AudioTrackInterface> audio_track(
149       stream_->GetAudioTracks()[0]);
150   ChangeTrack(audio_track.get());
151 }
152 
153 }  // namespace webrtc
154