Index: content/renderer/media/webrtc/webrtc_media_stream_track_adapter_unittest.cc |
diff --git a/content/renderer/media/webrtc/webrtc_media_stream_track_adapter_unittest.cc b/content/renderer/media/webrtc/webrtc_media_stream_track_adapter_unittest.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..2a14cc4b86ff256da5c24055dd7e163e3055e228 |
--- /dev/null |
+++ b/content/renderer/media/webrtc/webrtc_media_stream_track_adapter_unittest.cc |
@@ -0,0 +1,198 @@ |
+// Copyright (c) 2017 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#include "content/renderer/media/webrtc/webrtc_media_stream_track_adapter.h" |
+ |
+#include <memory> |
+ |
+#include "base/memory/ref_counted.h" |
+#include "base/message_loop/message_loop.h" |
+#include "base/run_loop.h" |
+#include "base/single_thread_task_runner.h" |
+#include "base/synchronization/waitable_event.h" |
+#include "content/child/child_process.h" |
+#include "content/renderer/media/media_stream_audio_source.h" |
+#include "content/renderer/media/media_stream_video_track.h" |
+#include "content/renderer/media/mock_media_stream_video_sink.h" |
+#include "content/renderer/media/mock_media_stream_video_source.h" |
+#include "content/renderer/media/webrtc/mock_peer_connection_dependency_factory.h" |
+#include "testing/gtest/include/gtest/gtest.h" |
+#include "third_party/WebKit/public/platform/WebMediaStreamSource.h" |
+#include "third_party/WebKit/public/platform/WebMediaStreamTrack.h" |
+#include "third_party/WebKit/public/platform/WebString.h" |
+#include "third_party/WebKit/public/web/WebHeap.h" |
+ |
+namespace content { |
+ |
+class WebRtcMediaStreamTrackAdapterTest : public ::testing::Test { |
+ public: |
+ void SetUp() override { |
+ dependency_factory_.reset(new MockPeerConnectionDependencyFactory()); |
+ main_thread_ = base::ThreadTaskRunnerHandle::Get(); |
+ } |
+ |
+ void TearDown() override { |
+ if (track_adapter_) { |
+ EXPECT_TRUE(track_adapter_->is_initialized()); |
+ track_adapter_->Dispose(); |
+ EXPECT_FALSE(track_adapter_->is_initialized()); |
+ track_adapter_ = nullptr; |
+ RunMessageLoopsUntilIdle(); |
+ } |
+ blink::WebHeap::CollectAllGarbageForTesting(); |
+ } |
+ |
+ blink::WebMediaStreamTrack CreateLocalAudioTrack() { |
+ blink::WebMediaStreamSource web_source; |
+ web_source.Initialize(blink::WebString::FromUTF8("local_audio_id"), |
+ blink::WebMediaStreamSource::kTypeAudio, |
+ blink::WebString::FromUTF8("local_audio_track"), |
+ false); |
+ MediaStreamAudioSource* audio_source = new MediaStreamAudioSource(true); |
+ // Takes ownership of |audio_source|. |
+ web_source.SetExtraData(audio_source); |
+ |
+ blink::WebMediaStreamTrack web_track; |
+ web_track.Initialize(web_source.Id(), web_source); |
+ audio_source->ConnectToTrack(web_track); |
+ return web_track; |
+ } |
+ |
+ blink::WebMediaStreamTrack CreateLocalVideoTrack() { |
+ blink::WebMediaStreamSource web_source; |
+ web_source.Initialize(blink::WebString::FromUTF8("local_video_id"), |
+ blink::WebMediaStreamSource::kTypeVideo, |
+ blink::WebString::FromUTF8("local_video_track"), |
+ false); |
+ MockMediaStreamVideoSource* video_source = |
+ new MockMediaStreamVideoSource(true); |
+ // Takes ownership of |video_source|. |
+ web_source.SetExtraData(video_source); |
+ |
+ return MediaStreamVideoTrack::CreateVideoTrack( |
+ video_source, MediaStreamVideoSource::ConstraintsCallback(), true); |
+ } |
+ |
+ void CreateRemoteTrackAdapter( |
+ webrtc::MediaStreamTrackInterface* webrtc_track) { |
+ track_adapter_ = WebRtcMediaStreamTrackAdapter::CreateRemoteTrackAdapter( |
+ dependency_factory_.get(), main_thread_, webrtc_track); |
+ } |
+ |
+ // Runs message loops on the webrtc signaling thread and the main thread until |
+ // idle. |
+ void RunMessageLoopsUntilIdle() { |
+ base::WaitableEvent waitable_event( |
+ base::WaitableEvent::ResetPolicy::MANUAL, |
+ base::WaitableEvent::InitialState::NOT_SIGNALED); |
+ dependency_factory_->GetWebRtcSignalingThread()->PostTask( |
+ FROM_HERE, base::Bind(&WebRtcMediaStreamTrackAdapterTest:: |
+ RunMessageLoopUntilIdleOnSignalingThread, |
+ base::Unretained(this), &waitable_event)); |
+ waitable_event.Wait(); |
+ base::RunLoop().RunUntilIdle(); |
+ } |
+ |
+ void RunMessageLoopUntilIdleOnSignalingThread( |
+ base::WaitableEvent* waitable_event) { |
+ DCHECK(dependency_factory_->GetWebRtcSignalingThread() |
+ ->BelongsToCurrentThread()); |
+ base::RunLoop().RunUntilIdle(); |
+ waitable_event->Signal(); |
+ } |
+ |
+ protected: |
+ // Message loop and child processes is needed for task queues and threading to |
+ // work, as is necessary to create tracks and adapters. |
+ base::MessageLoop message_loop_; |
+ ChildProcess child_process_; |
+ |
+ std::unique_ptr<MockPeerConnectionDependencyFactory> dependency_factory_; |
+ scoped_refptr<base::SingleThreadTaskRunner> main_thread_; |
+ scoped_refptr<WebRtcMediaStreamTrackAdapter> track_adapter_; |
+}; |
+ |
+TEST_F(WebRtcMediaStreamTrackAdapterTest, LocalAudioTrack) { |
+ track_adapter_ = WebRtcMediaStreamTrackAdapter::CreateLocalTrackAdapter( |
+ dependency_factory_.get(), main_thread_, CreateLocalAudioTrack()); |
+ EXPECT_TRUE(track_adapter_->is_initialized()); |
+ EXPECT_TRUE(!track_adapter_->web_track().IsNull()); |
+ EXPECT_EQ(track_adapter_->web_track().Source().GetType(), |
+ blink::WebMediaStreamSource::kTypeAudio); |
+ EXPECT_TRUE(track_adapter_->webrtc_track()); |
+ EXPECT_EQ(track_adapter_->webrtc_track()->kind(), |
+ webrtc::MediaStreamTrackInterface::kAudioKind); |
+ EXPECT_EQ(track_adapter_->webrtc_track()->id().c_str(), |
+ track_adapter_->web_track().Id()); |
+ EXPECT_TRUE(track_adapter_->GetLocalTrackAudioSinkForTesting()); |
+ EXPECT_EQ( |
+ track_adapter_->GetLocalTrackAudioSinkForTesting()->webrtc_audio_track(), |
+ track_adapter_->webrtc_track()); |
+} |
+ |
+TEST_F(WebRtcMediaStreamTrackAdapterTest, LocalVideoTrack) { |
+ track_adapter_ = WebRtcMediaStreamTrackAdapter::CreateLocalTrackAdapter( |
+ dependency_factory_.get(), main_thread_, CreateLocalVideoTrack()); |
+ EXPECT_TRUE(track_adapter_->is_initialized()); |
+ EXPECT_TRUE(!track_adapter_->web_track().IsNull()); |
+ EXPECT_EQ(track_adapter_->web_track().Source().GetType(), |
+ blink::WebMediaStreamSource::kTypeVideo); |
+ EXPECT_TRUE(track_adapter_->webrtc_track()); |
+ EXPECT_EQ(track_adapter_->webrtc_track()->kind(), |
+ webrtc::MediaStreamTrackInterface::kVideoKind); |
+ EXPECT_EQ(track_adapter_->webrtc_track()->id().c_str(), |
+ track_adapter_->web_track().Id()); |
+ EXPECT_TRUE(track_adapter_->GetLocalTrackVideoSinkForTesting()); |
+ EXPECT_EQ( |
+ track_adapter_->GetLocalTrackVideoSinkForTesting()->webrtc_video_track(), |
+ track_adapter_->webrtc_track()); |
+} |
+ |
+TEST_F(WebRtcMediaStreamTrackAdapterTest, RemoteAudioTrack) { |
+ scoped_refptr<MockWebRtcAudioTrack> webrtc_track = |
+ MockWebRtcAudioTrack::Create("remote_audio_track"); |
+ dependency_factory_->GetWebRtcSignalingThread()->PostTask( |
+ FROM_HERE, |
+ base::Bind(&WebRtcMediaStreamTrackAdapterTest::CreateRemoteTrackAdapter, |
+ base::Unretained(this), webrtc_track.get())); |
+ RunMessageLoopsUntilIdle(); |
+ DCHECK(track_adapter_); |
+ EXPECT_TRUE(track_adapter_->is_initialized()); |
+ EXPECT_TRUE(!track_adapter_->web_track().IsNull()); |
+ EXPECT_EQ(track_adapter_->web_track().Source().GetType(), |
+ blink::WebMediaStreamSource::kTypeAudio); |
+ EXPECT_TRUE(track_adapter_->webrtc_track()); |
+ EXPECT_EQ(track_adapter_->webrtc_track()->kind(), |
+ webrtc::MediaStreamTrackInterface::kAudioKind); |
+ EXPECT_EQ(track_adapter_->webrtc_track()->id().c_str(), |
+ track_adapter_->web_track().Id()); |
+ EXPECT_TRUE(track_adapter_->GetRemoteAudioTrackAdapterForTesting()); |
+ EXPECT_TRUE( |
+ track_adapter_->GetRemoteAudioTrackAdapterForTesting()->initialized()); |
+} |
+ |
+TEST_F(WebRtcMediaStreamTrackAdapterTest, RemoteVideoTrack) { |
+ scoped_refptr<MockWebRtcVideoTrack> webrtc_track = |
+ MockWebRtcVideoTrack::Create("remote_video_track"); |
+ dependency_factory_->GetWebRtcSignalingThread()->PostTask( |
+ FROM_HERE, |
+ base::Bind(&WebRtcMediaStreamTrackAdapterTest::CreateRemoteTrackAdapter, |
+ base::Unretained(this), webrtc_track.get())); |
+ RunMessageLoopsUntilIdle(); |
+ DCHECK(track_adapter_); |
+ EXPECT_TRUE(track_adapter_->is_initialized()); |
+ EXPECT_TRUE(!track_adapter_->web_track().IsNull()); |
+ EXPECT_EQ(track_adapter_->web_track().Source().GetType(), |
+ blink::WebMediaStreamSource::kTypeVideo); |
+ EXPECT_TRUE(track_adapter_->webrtc_track()); |
+ EXPECT_EQ(track_adapter_->webrtc_track()->kind(), |
+ webrtc::MediaStreamTrackInterface::kVideoKind); |
+ EXPECT_EQ(track_adapter_->webrtc_track()->id().c_str(), |
+ track_adapter_->web_track().Id()); |
+ EXPECT_TRUE(track_adapter_->GetRemoteVideoTrackAdapterForTesting()); |
+ EXPECT_TRUE( |
+ track_adapter_->GetRemoteVideoTrackAdapterForTesting()->initialized()); |
+} |
+ |
+} // namespace content |