1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
7 #include "base/strings/utf_string_conversions.h"
8 #include "content/renderer/media/media_stream_video_source.h"
9 #include "content/renderer/media/mock_media_stream_dependency_factory.h"
10 #include "media/base/video_frame.h"
11 #include "testing/gtest/include/gtest/gtest.h"
15 class DummyMediaStreamVideoSource : public MediaStreamVideoSource {
17 DummyMediaStreamVideoSource(MediaStreamDependencyFactory* factory)
18 : MediaStreamVideoSource(factory) {
21 virtual ~DummyMediaStreamVideoSource() {
24 void OnNewFrame(const scoped_refptr<media::VideoFrame>& frame) {
25 MediaStreamVideoSource::DeliverVideoFrame(frame);
29 class MediaStreamVideoSourceTest
30 : public ::testing::Test {
32 MediaStreamVideoSourceTest()
33 : number_of_successful_constraints_applied_(0),
34 number_of_failed_constraints_applied_(0) {
35 webkit_source_.initialize(base::UTF8ToUTF16("dummy_source_id"),
36 blink::WebMediaStreamSource::TypeVideo,
37 base::UTF8ToUTF16("dummy_source_name"));
38 webkit_source_.setExtraData(new DummyMediaStreamVideoSource(&factory_));
42 // Create a track that's associated with |webkit_source_|.
43 blink::WebMediaStreamTrack CreateTrack(
44 const std::string& id,
45 const blink::WebMediaConstraints& constraints) {
46 blink::WebMediaStreamTrack track;
47 track.initialize(base::UTF8ToUTF16(id), webkit_source_);
49 DummyMediaStreamVideoSource* source =
50 static_cast<DummyMediaStreamVideoSource*>(track.source().extraData());
52 source->AddTrack(track,
55 &MediaStreamVideoSourceTest::OnConstraintsApplied,
56 base::Unretained(this)));
60 // Simulate that the underlying device start successfully.
62 factory_.last_video_source()->SetLive();
65 // Simulate that the underlying device fail to start.
66 void FailToStartSource() {
67 factory_.last_video_source()->SetEnded();
70 void VerifyFrame(int width, int height, int num) {
71 DummyMediaStreamVideoSource* source =
72 static_cast<DummyMediaStreamVideoSource*>(webkit_source_.extraData());
73 MockVideoSource* adapter =
74 static_cast<MockVideoSource*>(source->GetAdapter());
75 EXPECT_EQ(width, adapter->GetLastFrameWidth());
76 EXPECT_EQ(height, adapter->GetLastFrameHeight());
77 EXPECT_EQ(num, adapter->GetFrameNum());
80 int NumberOfSuccessConstraintsCallbacks() const {
81 return number_of_successful_constraints_applied_;
84 int NumberOfFailedConstraintsCallbacks() const {
85 return number_of_failed_constraints_applied_;
89 void OnConstraintsApplied(MediaStreamSource* source, bool success) {
90 ASSERT_EQ(source, webkit_source_.extraData());
93 ++number_of_successful_constraints_applied_;
95 ++number_of_failed_constraints_applied_;
98 int number_of_successful_constraints_applied_;
99 int number_of_failed_constraints_applied_;
100 MockMediaStreamDependencyFactory factory_;
101 blink::WebMediaStreamSource webkit_source_;
104 TEST_F(MediaStreamVideoSourceTest, AddTrackAndStartAdapter) {
105 blink::WebMediaConstraints constraints;
106 blink::WebMediaStreamTrack track = CreateTrack("123", constraints);
108 EXPECT_EQ(1, NumberOfSuccessConstraintsCallbacks());
111 TEST_F(MediaStreamVideoSourceTest, AddTwoTracksBeforeAdapterStart) {
112 blink::WebMediaConstraints constraints;
113 blink::WebMediaStreamTrack track1 = CreateTrack("123", constraints);
114 blink::WebMediaStreamTrack track2 = CreateTrack("123", constraints);
115 EXPECT_EQ(0, NumberOfSuccessConstraintsCallbacks());
117 EXPECT_EQ(2, NumberOfSuccessConstraintsCallbacks());
120 TEST_F(MediaStreamVideoSourceTest, AddTrackAfterAdapterStart) {
121 blink::WebMediaConstraints constraints;
122 blink::WebMediaStreamTrack track1 = CreateTrack("123", constraints);
124 EXPECT_EQ(1, NumberOfSuccessConstraintsCallbacks());
125 blink::WebMediaStreamTrack track2 = CreateTrack("123", constraints);
126 EXPECT_EQ(2, NumberOfSuccessConstraintsCallbacks());
129 TEST_F(MediaStreamVideoSourceTest, AddTrackAndFailToStartAdapter) {
130 blink::WebMediaConstraints constraints;
131 blink::WebMediaStreamTrack track = CreateTrack("123", constraints);
133 EXPECT_EQ(1, NumberOfFailedConstraintsCallbacks());
136 TEST_F(MediaStreamVideoSourceTest, DeliverVideoFrame) {
137 blink::WebMediaConstraints constraints;
138 blink::WebMediaStreamTrack track = CreateTrack("123", constraints);
140 DummyMediaStreamVideoSource* source =
141 static_cast<DummyMediaStreamVideoSource*>(track.source().extraData());
142 VerifyFrame(0, 0, 0);
143 const int kWidth = 640;
144 const int kHeight = 480;
145 scoped_refptr<media::VideoFrame> frame =
146 media::VideoFrame::CreateBlackFrame(gfx::Size(kWidth, kHeight));
147 ASSERT_TRUE(frame.get());
148 source->OnNewFrame(frame);
149 VerifyFrame(640, 480, 1);
150 source->OnNewFrame(frame);
151 VerifyFrame(640, 480, 2);
152 source->RemoveTrack(track);
155 } // namespace content