| Index: content/renderer/media/webrtc/media_stream_remote_video_source_unittest.cc
|
| diff --git a/content/renderer/media/webrtc/media_stream_remote_video_source_unittest.cc b/content/renderer/media/webrtc/media_stream_remote_video_source_unittest.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..068320fac3806f0e0af5ccbe2f9efe7a757bb90f
|
| --- /dev/null
|
| +++ b/content/renderer/media/webrtc/media_stream_remote_video_source_unittest.cc
|
| @@ -0,0 +1,160 @@
|
| +// 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/strings/utf_string_conversions.h"
|
| +#include "content/public/renderer/media_stream_video_sink.h"
|
| +#include "content/renderer/media/media_stream_video_track.h"
|
| +#include "content/renderer/media/mock_media_stream_dependency_factory.h"
|
| +#include "content/renderer/media/webrtc/media_stream_remote_video_source.h"
|
| +#include "media/base/video_frame.h"
|
| +#include "testing/gtest/include/gtest/gtest.h"
|
| +#include "third_party/libjingle/source/talk/media/webrtc/webrtcvideoframe.h"
|
| +
|
| +namespace content {
|
| +
|
| +class MockVideoSink : public MediaStreamVideoSink {
|
| + public:
|
| + MockVideoSink()
|
| + : number_of_frames_(0),
|
| + state_(blink::WebMediaStreamSource::ReadyStateLive) {
|
| + }
|
| +
|
| + virtual void OnVideoFrame(
|
| + const scoped_refptr<media::VideoFrame>& frame) OVERRIDE {
|
| + ++number_of_frames_;
|
| + }
|
| +
|
| + virtual void OnReadyStateChanged(
|
| + blink::WebMediaStreamSource::ReadyState state) OVERRIDE {
|
| + state_ = state;
|
| + }
|
| +
|
| + int number_of_frames() const { return number_of_frames_; }
|
| + blink::WebMediaStreamSource::ReadyState state() const { return state_; }
|
| +
|
| + private:
|
| + int number_of_frames_;
|
| + blink::WebMediaStreamSource::ReadyState state_;
|
| +};
|
| +
|
| +class MediaStreamRemoteVideoSourceUnderTest
|
| + : public MediaStreamRemoteVideoSource {
|
| + public:
|
| + MediaStreamRemoteVideoSourceUnderTest(webrtc::VideoTrackInterface* track)
|
| + : MediaStreamRemoteVideoSource(track) {
|
| + }
|
| + using MediaStreamRemoteVideoSource::RenderFrame;
|
| +};
|
| +
|
| +class MediaStreamRemoteVideoSourceTest
|
| + : public ::testing::Test {
|
| + public:
|
| + MediaStreamRemoteVideoSourceTest()
|
| + : mock_factory_(new MockMediaStreamDependencyFactory()),
|
| + webrtc_video_track_(
|
| + mock_factory_->CreateLocalVideoTrack(
|
| + "test",
|
| + static_cast<cricket::VideoCapturer*>(NULL))),
|
| + remote_source_(
|
| + new MediaStreamRemoteVideoSourceUnderTest(webrtc_video_track_)),
|
| + number_of_successful_constraints_applied_(0),
|
| + number_of_failed_constraints_applied_(0) {
|
| + webkit_source_.initialize(base::UTF8ToUTF16("dummy_source_id"),
|
| + blink::WebMediaStreamSource::TypeVideo,
|
| + base::UTF8ToUTF16("dummy_source_name"));
|
| + webkit_source_.setExtraData(remote_source_);
|
| + }
|
| + virtual ~MediaStreamRemoteVideoSourceTest() {}
|
| +
|
| + MediaStreamRemoteVideoSourceUnderTest* source() {
|
| + return remote_source_;
|
| + }
|
| +
|
| + MediaStreamVideoTrack* CreateTrack() {
|
| + bool enabled = true;
|
| + blink::WebMediaConstraints constraints;
|
| + constraints.initialize();
|
| + MediaStreamDependencyFactory* factory = NULL;
|
| + return new MediaStreamVideoTrack(
|
| + source(),
|
| + constraints,
|
| + base::Bind(
|
| + &MediaStreamRemoteVideoSourceTest::OnConstraintsApplied,
|
| + base::Unretained(this)),
|
| + enabled, factory);
|
| + }
|
| +
|
| + int NumberOfSuccessConstraintsCallbacks() const {
|
| + return number_of_successful_constraints_applied_;
|
| + }
|
| +
|
| + int NumberOfFailedConstraintsCallbacks() const {
|
| + return number_of_failed_constraints_applied_;
|
| + }
|
| +
|
| + void StopWebRtcTrack() {
|
| + static_cast<MockWebRtcVideoTrack*>(webrtc_video_track_.get())->set_state(
|
| + webrtc::MediaStreamTrackInterface::kEnded);
|
| + }
|
| +
|
| + base::MessageLoop* message_loop() { return &message_loop_; }
|
| +
|
| + const blink::WebMediaStreamSource& webkit_source() const {
|
| + return webkit_source_;
|
| + }
|
| +
|
| + private:
|
| + void OnConstraintsApplied(MediaStreamSource* source, bool success) {
|
| + ASSERT_EQ(source, remote_source_);
|
| + if (success)
|
| + ++number_of_successful_constraints_applied_;
|
| + else
|
| + ++number_of_failed_constraints_applied_;
|
| + }
|
| +
|
| + base::MessageLoop message_loop_;
|
| + scoped_ptr<MockMediaStreamDependencyFactory> mock_factory_;
|
| + scoped_refptr<webrtc::VideoTrackInterface> webrtc_video_track_;
|
| + // |remote_source_| is owned by |webkit_source_|.
|
| + MediaStreamRemoteVideoSourceUnderTest* remote_source_;
|
| + blink::WebMediaStreamSource webkit_source_;
|
| + int number_of_successful_constraints_applied_;
|
| + int number_of_failed_constraints_applied_;
|
| +};
|
| +
|
| +TEST_F(MediaStreamRemoteVideoSourceTest, StartTrack) {
|
| + scoped_ptr<MediaStreamVideoTrack> track(CreateTrack());
|
| + EXPECT_EQ(0, NumberOfSuccessConstraintsCallbacks());
|
| +
|
| + MockVideoSink sink;
|
| + track->AddSink(&sink);
|
| +
|
| + cricket::WebRtcVideoFrame webrtc_frame;
|
| + webrtc_frame.InitToBlack(320, 240, 1, 1, 0, 1);
|
| + source()->RenderFrame(&webrtc_frame);
|
| + message_loop()->RunUntilIdle();
|
| +
|
| + EXPECT_EQ(1, NumberOfSuccessConstraintsCallbacks());
|
| + EXPECT_EQ(1, sink.number_of_frames());
|
| + track->RemoveSink(&sink);
|
| +}
|
| +
|
| +TEST_F(MediaStreamRemoteVideoSourceTest, RemoteTrackStop) {
|
| + scoped_ptr<MediaStreamVideoTrack> track(CreateTrack());
|
| +
|
| + MockVideoSink sink;
|
| + track->AddSink(&sink);
|
| +
|
| + EXPECT_EQ(blink::WebMediaStreamSource::ReadyStateLive, sink.state());
|
| + EXPECT_EQ(blink::WebMediaStreamSource::ReadyStateLive,
|
| + webkit_source().readyState());
|
| + StopWebRtcTrack();
|
| + EXPECT_EQ(blink::WebMediaStreamSource::ReadyStateEnded,
|
| + webkit_source().readyState());
|
| + EXPECT_EQ(blink::WebMediaStreamSource::ReadyStateEnded, sink.state());
|
| +
|
| + track->RemoveSink(&sink);
|
| +}
|
| +
|
| +} // namespace content
|
|
|