summaryrefslogtreecommitdiffstats
path: root/chromium/content/renderer/media/media_stream_video_capture_source_unittest.cc
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/content/renderer/media/media_stream_video_capture_source_unittest.cc')
-rw-r--r--chromium/content/renderer/media/media_stream_video_capture_source_unittest.cc200
1 files changed, 200 insertions, 0 deletions
diff --git a/chromium/content/renderer/media/media_stream_video_capture_source_unittest.cc b/chromium/content/renderer/media/media_stream_video_capture_source_unittest.cc
new file mode 100644
index 00000000000..fca4562a93d
--- /dev/null
+++ b/chromium/content/renderer/media/media_stream_video_capture_source_unittest.cc
@@ -0,0 +1,200 @@
+// Copyright 2014 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 "base/bind.h"
+#include "base/callback_helpers.h"
+#include "base/message_loop/message_loop.h"
+#include "base/run_loop.h"
+#include "base/strings/utf_string_conversions.h"
+#include "content/child/child_process.h"
+#include "content/public/renderer/media_stream_video_sink.h"
+#include "content/renderer/media/media_stream_video_capturer_source.h"
+#include "content/renderer/media/media_stream_video_track.h"
+#include "content/renderer/media/mock_media_constraint_factory.h"
+#include "media/base/bind_to_current_loop.h"
+#include "testing/gmock/include/gmock/gmock.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace content {
+
+class MockVideoCapturerDelegate : public VideoCapturerDelegate {
+ public:
+ explicit MockVideoCapturerDelegate(const StreamDeviceInfo& device_info)
+ : VideoCapturerDelegate(device_info) {}
+
+ MOCK_METHOD3(StartCapture,
+ void(const media::VideoCaptureParams& params,
+ const VideoCaptureDeliverFrameCB& new_frame_callback,
+ const RunningCallback& running_callback));
+ MOCK_METHOD0(StopCapture, void());
+
+ private:
+ virtual ~MockVideoCapturerDelegate() {}
+};
+
+class MediaStreamVideoCapturerSourceTest : public testing::Test {
+ public:
+ MediaStreamVideoCapturerSourceTest()
+ : child_process_(new ChildProcess()),
+ source_(NULL) {
+ }
+
+ void InitWithDeviceInfo(const StreamDeviceInfo& device_info) {
+ delegate_ = new MockVideoCapturerDelegate(device_info);
+ source_ = new MediaStreamVideoCapturerSource(
+ device_info,
+ MediaStreamSource::SourceStoppedCallback(),
+ delegate_);
+
+ webkit_source_.initialize(base::UTF8ToUTF16("dummy_source_id"),
+ blink::WebMediaStreamSource::TypeVideo,
+ base::UTF8ToUTF16("dummy_source_name"));
+ webkit_source_.setExtraData(source_);
+ }
+
+ blink::WebMediaStreamTrack StartSource() {
+ MockMediaConstraintFactory factory;
+ bool enabled = true;
+ // CreateVideoTrack will trigger OnConstraintsApplied.
+ return MediaStreamVideoTrack::CreateVideoTrack(
+ source_, factory.CreateWebMediaConstraints(),
+ base::Bind(
+ &MediaStreamVideoCapturerSourceTest::OnConstraintsApplied,
+ base::Unretained(this)),
+ enabled);
+ }
+
+ MockVideoCapturerDelegate& mock_delegate() {
+ return *static_cast<MockVideoCapturerDelegate*>(delegate_.get());
+ }
+
+ protected:
+ void OnConstraintsApplied(MediaStreamSource* source, bool success) {
+ }
+
+ base::MessageLoopForUI message_loop_;
+ scoped_ptr<ChildProcess> child_process_;
+ blink::WebMediaStreamSource webkit_source_;
+ MediaStreamVideoCapturerSource* source_; // owned by webkit_source.
+ scoped_refptr<VideoCapturerDelegate> delegate_;
+};
+
+TEST_F(MediaStreamVideoCapturerSourceTest, TabCaptureAllowResolutionChange) {
+ StreamDeviceInfo device_info;
+ device_info.device.type = MEDIA_TAB_VIDEO_CAPTURE;
+ InitWithDeviceInfo(device_info);
+
+ EXPECT_CALL(mock_delegate(), StartCapture(
+ testing::Field(&media::VideoCaptureParams::allow_resolution_change, true),
+ testing::_,
+ testing::_)).Times(1);
+ blink::WebMediaStreamTrack track = StartSource();
+ // When the track goes out of scope, the source will be stopped.
+ EXPECT_CALL(mock_delegate(), StopCapture());
+}
+
+TEST_F(MediaStreamVideoCapturerSourceTest,
+ DesktopCaptureAllowResolutionChange) {
+ StreamDeviceInfo device_info;
+ device_info.device.type = MEDIA_DESKTOP_VIDEO_CAPTURE;
+ InitWithDeviceInfo(device_info);
+
+ EXPECT_CALL(mock_delegate(), StartCapture(
+ testing::Field(&media::VideoCaptureParams::allow_resolution_change, true),
+ testing::_,
+ testing::_)).Times(1);
+ blink::WebMediaStreamTrack track = StartSource();
+ // When the track goes out of scope, the source will be stopped.
+ EXPECT_CALL(mock_delegate(), StopCapture());
+}
+
+TEST_F(MediaStreamVideoCapturerSourceTest, Ended) {
+ StreamDeviceInfo device_info;
+ device_info.device.type = MEDIA_DESKTOP_VIDEO_CAPTURE;
+ delegate_ = new VideoCapturerDelegate(device_info);
+ source_ = new MediaStreamVideoCapturerSource(
+ device_info,
+ MediaStreamSource::SourceStoppedCallback(),
+ delegate_);
+ webkit_source_.initialize(base::UTF8ToUTF16("dummy_source_id"),
+ blink::WebMediaStreamSource::TypeVideo,
+ base::UTF8ToUTF16("dummy_source_name"));
+ webkit_source_.setExtraData(source_);
+ blink::WebMediaStreamTrack track = StartSource();
+ message_loop_.RunUntilIdle();
+
+ delegate_->OnStateUpdateOnRenderThread(VIDEO_CAPTURE_STATE_STARTED);
+ message_loop_.RunUntilIdle();
+ EXPECT_EQ(blink::WebMediaStreamSource::ReadyStateLive,
+ webkit_source_.readyState());
+
+ delegate_->OnStateUpdateOnRenderThread(VIDEO_CAPTURE_STATE_ERROR);
+ message_loop_.RunUntilIdle();
+ EXPECT_EQ(blink::WebMediaStreamSource::ReadyStateEnded,
+ webkit_source_.readyState());
+}
+
+class FakeMediaStreamVideoSink : public MediaStreamVideoSink {
+ public:
+ FakeMediaStreamVideoSink(base::TimeTicks* capture_time,
+ base::Closure got_frame_cb)
+ : capture_time_(capture_time),
+ got_frame_cb_(got_frame_cb) {
+ }
+
+ void OnVideoFrame(const scoped_refptr<media::VideoFrame>& frame,
+ const media::VideoCaptureFormat& format,
+ const base::TimeTicks& capture_time) {
+ *capture_time_ = capture_time;
+ base::ResetAndReturn(&got_frame_cb_).Run();
+ }
+
+ private:
+ base::TimeTicks* capture_time_;
+ base::Closure got_frame_cb_;
+};
+
+TEST_F(MediaStreamVideoCapturerSourceTest, CaptureTime) {
+ StreamDeviceInfo device_info;
+ device_info.device.type = MEDIA_DESKTOP_VIDEO_CAPTURE;
+ InitWithDeviceInfo(device_info);
+
+ VideoCaptureDeliverFrameCB deliver_frame_cb;
+ VideoCapturerDelegate::RunningCallback running_cb;
+
+ EXPECT_CALL(mock_delegate(), StartCapture(
+ testing::_,
+ testing::_,
+ testing::_))
+ .Times(1)
+ .WillOnce(testing::DoAll(testing::SaveArg<1>(&deliver_frame_cb),
+ testing::SaveArg<2>(&running_cb)));
+ EXPECT_CALL(mock_delegate(), StopCapture());
+ blink::WebMediaStreamTrack track = StartSource();
+ running_cb.Run(true);
+
+ base::RunLoop run_loop;
+ base::TimeTicks reference_capture_time =
+ base::TimeTicks::FromInternalValue(60013);
+ base::TimeTicks capture_time;
+ FakeMediaStreamVideoSink fake_sink(
+ &capture_time,
+ media::BindToCurrentLoop(run_loop.QuitClosure()));
+ FakeMediaStreamVideoSink::AddToVideoTrack(
+ &fake_sink,
+ base::Bind(&FakeMediaStreamVideoSink::OnVideoFrame,
+ base::Unretained(&fake_sink)),
+ track);
+ child_process_->io_message_loop()->PostTask(
+ FROM_HERE,
+ base::Bind(deliver_frame_cb,
+ media::VideoFrame::CreateBlackFrame(gfx::Size(2, 2)),
+ media::VideoCaptureFormat(),
+ reference_capture_time));
+ run_loop.Run();
+ FakeMediaStreamVideoSink::RemoveFromVideoTrack(&fake_sink, track);
+ EXPECT_EQ(reference_capture_time, capture_time);
+}
+
+} // namespace content