1 // Copyright 2013 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.
5 #include "content/browser/renderer_host/media/media_stream_ui_proxy.h"
7 #include "base/message_loop/message_loop.h"
8 #include "content/browser/renderer_host/render_view_host_delegate.h"
9 #include "content/public/common/renderer_preferences.h"
10 #include "content/public/test/test_browser_thread.h"
11 #include "testing/gmock/include/gmock/gmock.h"
12 #include "testing/gtest/include/gtest/gtest.h"
13 #include "ui/gfx/rect.h"
16 using testing::SaveArg
;
21 class MockRenderViewHostDelegate
: public RenderViewHostDelegate
{
23 MOCK_METHOD2(RequestMediaAccessPermission
,
24 void(const MediaStreamRequest
& request
,
25 const MediaResponseCallback
& callback
));
27 // Stubs for pure virtual methods we don't care about.
28 virtual gfx::Rect
GetRootWindowResizerRect() const OVERRIDE
{
32 virtual RendererPreferences
GetRendererPrefs(
33 BrowserContext
* browser_context
) const OVERRIDE
{
35 return RendererPreferences();
39 class MockResponseCallback
{
41 MOCK_METHOD1(OnAccessRequestResponse
,
42 void(const MediaStreamDevices
& devices
));
45 class MockMediaStreamUI
: public MediaStreamUI
{
47 MOCK_METHOD1(OnStarted
, void(const base::Closure
& stop
));
50 class MockStopStreamHandler
{
52 MOCK_METHOD0(OnStop
, void());
58 class MediaStreamUIProxyTest
: public testing::Test
{
60 MediaStreamUIProxyTest()
61 : ui_thread_(BrowserThread::UI
, &message_loop_
),
62 io_thread_(BrowserThread::IO
, &message_loop_
) {
63 proxy_
= MediaStreamUIProxy::CreateForTests(&delegate_
);
66 virtual ~MediaStreamUIProxyTest() {
68 message_loop_
.RunUntilIdle();
72 base::MessageLoop message_loop_
;
73 TestBrowserThread ui_thread_
;
74 TestBrowserThread io_thread_
;
76 MockRenderViewHostDelegate delegate_
;
77 MockResponseCallback response_callback_
;
78 scoped_ptr
<MediaStreamUIProxy
> proxy_
;
81 MATCHER_P(SameRequest
, expected
, "") {
83 expected
.render_process_id
== arg
.render_process_id
&&
84 expected
.render_view_id
== arg
.render_view_id
&&
85 expected
.tab_capture_device_id
== arg
.tab_capture_device_id
&&
86 expected
.security_origin
== arg
.security_origin
&&
87 expected
.request_type
== arg
.request_type
&&
88 expected
.requested_audio_device_id
== arg
.requested_audio_device_id
&&
89 expected
.requested_video_device_id
== arg
.requested_video_device_id
&&
90 expected
.audio_type
== arg
.audio_type
&&
91 expected
.video_type
== arg
.video_type
;
94 TEST_F(MediaStreamUIProxyTest
, Deny
) {
95 MediaStreamRequest
request(0, 0, 0, GURL("http://origin/"),
96 MEDIA_GENERATE_STREAM
, std::string(),
98 MEDIA_DEVICE_AUDIO_CAPTURE
,
99 MEDIA_DEVICE_VIDEO_CAPTURE
);
100 proxy_
->RequestAccess(
101 request
, base::Bind(&MockResponseCallback::OnAccessRequestResponse
,
102 base::Unretained(&response_callback_
)));
103 MediaResponseCallback callback
;
104 EXPECT_CALL(delegate_
, RequestMediaAccessPermission(SameRequest(request
), _
))
105 .WillOnce(SaveArg
<1>(&callback
));
106 message_loop_
.RunUntilIdle();
107 ASSERT_FALSE(callback
.is_null());
109 MediaStreamDevices devices
;
110 callback
.Run(devices
, scoped_ptr
<MediaStreamUI
>());
112 MediaStreamDevices response
;
113 EXPECT_CALL(response_callback_
, OnAccessRequestResponse(_
))
114 .WillOnce(SaveArg
<0>(&response
));
115 message_loop_
.RunUntilIdle();
117 EXPECT_TRUE(response
.empty());
120 TEST_F(MediaStreamUIProxyTest
, AcceptAndStart
) {
121 MediaStreamRequest
request(0, 0, 0, GURL("http://origin/"),
122 MEDIA_GENERATE_STREAM
, std::string(),
124 MEDIA_DEVICE_AUDIO_CAPTURE
,
125 MEDIA_DEVICE_VIDEO_CAPTURE
);
126 proxy_
->RequestAccess(
127 request
, base::Bind(&MockResponseCallback::OnAccessRequestResponse
,
128 base::Unretained(&response_callback_
)));
129 MediaResponseCallback callback
;
130 EXPECT_CALL(delegate_
, RequestMediaAccessPermission(SameRequest(request
), _
))
131 .WillOnce(SaveArg
<1>(&callback
));
132 message_loop_
.RunUntilIdle();
133 ASSERT_FALSE(callback
.is_null());
135 MediaStreamDevices devices
;
137 MediaStreamDevice(MEDIA_DEVICE_AUDIO_CAPTURE
, "Mic", "Mic"));
138 scoped_ptr
<MockMediaStreamUI
> ui(new MockMediaStreamUI());
139 EXPECT_CALL(*ui
, OnStarted(_
));
140 callback
.Run(devices
, ui
.PassAs
<MediaStreamUI
>());
142 MediaStreamDevices response
;
143 EXPECT_CALL(response_callback_
, OnAccessRequestResponse(_
))
144 .WillOnce(SaveArg
<0>(&response
));
145 message_loop_
.RunUntilIdle();
147 EXPECT_FALSE(response
.empty());
149 proxy_
->OnStarted(base::Closure());
150 message_loop_
.RunUntilIdle();
153 // Verify that the proxy can be deleted before the request is processed.
154 TEST_F(MediaStreamUIProxyTest
, DeleteBeforeAccepted
) {
155 MediaStreamRequest
request(0, 0, 0, GURL("http://origin/"),
156 MEDIA_GENERATE_STREAM
, std::string(),
158 MEDIA_DEVICE_AUDIO_CAPTURE
,
159 MEDIA_DEVICE_VIDEO_CAPTURE
);
160 proxy_
->RequestAccess(
161 request
, base::Bind(&MockResponseCallback::OnAccessRequestResponse
,
162 base::Unretained(&response_callback_
)));
163 MediaResponseCallback callback
;
164 EXPECT_CALL(delegate_
, RequestMediaAccessPermission(SameRequest(request
), _
))
165 .WillOnce(SaveArg
<1>(&callback
));
166 message_loop_
.RunUntilIdle();
167 ASSERT_FALSE(callback
.is_null());
171 MediaStreamDevices devices
;
172 scoped_ptr
<MediaStreamUI
> ui
;
173 callback
.Run(devices
, ui
.Pass());
176 TEST_F(MediaStreamUIProxyTest
, StopFromUI
) {
177 MediaStreamRequest
request(0, 0, 0, GURL("http://origin/"),
178 MEDIA_GENERATE_STREAM
, std::string(),
180 MEDIA_DEVICE_AUDIO_CAPTURE
,
181 MEDIA_DEVICE_VIDEO_CAPTURE
);
182 proxy_
->RequestAccess(
183 request
, base::Bind(&MockResponseCallback::OnAccessRequestResponse
,
184 base::Unretained(&response_callback_
)));
185 MediaResponseCallback callback
;
186 EXPECT_CALL(delegate_
, RequestMediaAccessPermission(SameRequest(request
), _
))
187 .WillOnce(SaveArg
<1>(&callback
));
188 message_loop_
.RunUntilIdle();
189 ASSERT_FALSE(callback
.is_null());
191 base::Closure stop_callback
;
193 MediaStreamDevices devices
;
195 MediaStreamDevice(MEDIA_DEVICE_AUDIO_CAPTURE
, "Mic", "Mic"));
196 scoped_ptr
<MockMediaStreamUI
> ui(new MockMediaStreamUI());
197 EXPECT_CALL(*ui
, OnStarted(_
))
198 .WillOnce(SaveArg
<0>(&stop_callback
));
199 callback
.Run(devices
, ui
.PassAs
<MediaStreamUI
>());
201 MediaStreamDevices response
;
202 EXPECT_CALL(response_callback_
, OnAccessRequestResponse(_
))
203 .WillOnce(SaveArg
<0>(&response
));
204 message_loop_
.RunUntilIdle();
206 EXPECT_FALSE(response
.empty());
208 MockStopStreamHandler stop_handler
;
209 proxy_
->OnStarted(base::Bind(&MockStopStreamHandler::OnStop
,
210 base::Unretained(&stop_handler
)));
211 message_loop_
.RunUntilIdle();
213 ASSERT_FALSE(stop_callback
.is_null());
214 EXPECT_CALL(stop_handler
, OnStop());
216 message_loop_
.RunUntilIdle();