OLD | NEW |
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "content/browser/renderer_host/media/media_stream_ui_proxy.h" | 5 #include "content/browser/renderer_host/media/media_stream_ui_proxy.h" |
6 | 6 |
7 #include <utility> | 7 #include <utility> |
8 | 8 |
9 #include "base/message_loop/message_loop.h" | 9 #include "base/message_loop/message_loop.h" |
| 10 #include "base/run_loop.h" |
10 #include "content/browser/frame_host/render_frame_host_delegate.h" | 11 #include "content/browser/frame_host/render_frame_host_delegate.h" |
11 #include "content/public/test/test_browser_thread.h" | 12 #include "content/public/test/test_browser_thread.h" |
12 #include "testing/gmock/include/gmock/gmock.h" | 13 #include "testing/gmock/include/gmock/gmock.h" |
13 #include "testing/gtest/include/gtest/gtest.h" | 14 #include "testing/gtest/include/gtest/gtest.h" |
14 #include "ui/gfx/geometry/rect.h" | 15 #include "ui/gfx/geometry/rect.h" |
15 #include "url/gurl.h" | 16 #include "url/gurl.h" |
16 #include "url/origin.h" | 17 #include "url/origin.h" |
17 | 18 |
18 using testing::_; | 19 using testing::_; |
19 using testing::Return; | 20 using testing::Return; |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
57 class MediaStreamUIProxyTest : public testing::Test { | 58 class MediaStreamUIProxyTest : public testing::Test { |
58 public: | 59 public: |
59 MediaStreamUIProxyTest() | 60 MediaStreamUIProxyTest() |
60 : ui_thread_(BrowserThread::UI, &message_loop_), | 61 : ui_thread_(BrowserThread::UI, &message_loop_), |
61 io_thread_(BrowserThread::IO, &message_loop_) { | 62 io_thread_(BrowserThread::IO, &message_loop_) { |
62 proxy_ = MediaStreamUIProxy::CreateForTests(&delegate_); | 63 proxy_ = MediaStreamUIProxy::CreateForTests(&delegate_); |
63 } | 64 } |
64 | 65 |
65 ~MediaStreamUIProxyTest() override { | 66 ~MediaStreamUIProxyTest() override { |
66 proxy_.reset(); | 67 proxy_.reset(); |
67 message_loop_.RunUntilIdle(); | 68 base::RunLoop().RunUntilIdle(); |
68 } | 69 } |
69 | 70 |
70 protected: | 71 protected: |
71 base::MessageLoop message_loop_; | 72 base::MessageLoop message_loop_; |
72 TestBrowserThread ui_thread_; | 73 TestBrowserThread ui_thread_; |
73 TestBrowserThread io_thread_; | 74 TestBrowserThread io_thread_; |
74 | 75 |
75 MockRenderFrameHostDelegate delegate_; | 76 MockRenderFrameHostDelegate delegate_; |
76 MockResponseCallback response_callback_; | 77 MockResponseCallback response_callback_; |
77 std::unique_ptr<MediaStreamUIProxy> proxy_; | 78 std::unique_ptr<MediaStreamUIProxy> proxy_; |
(...skipping 18 matching lines...) Expand all Loading... |
96 MEDIA_DEVICE_VIDEO_CAPTURE)); | 97 MEDIA_DEVICE_VIDEO_CAPTURE)); |
97 MediaStreamRequest* request_ptr = request.get(); | 98 MediaStreamRequest* request_ptr = request.get(); |
98 proxy_->RequestAccess( | 99 proxy_->RequestAccess( |
99 std::move(request), | 100 std::move(request), |
100 base::Bind(&MockResponseCallback::OnAccessRequestResponse, | 101 base::Bind(&MockResponseCallback::OnAccessRequestResponse, |
101 base::Unretained(&response_callback_))); | 102 base::Unretained(&response_callback_))); |
102 MediaResponseCallback callback; | 103 MediaResponseCallback callback; |
103 EXPECT_CALL(delegate_, RequestMediaAccessPermission(SameRequest(request_ptr), | 104 EXPECT_CALL(delegate_, RequestMediaAccessPermission(SameRequest(request_ptr), |
104 _)) | 105 _)) |
105 .WillOnce(SaveArg<1>(&callback)); | 106 .WillOnce(SaveArg<1>(&callback)); |
106 message_loop_.RunUntilIdle(); | 107 base::RunLoop().RunUntilIdle(); |
107 ASSERT_FALSE(callback.is_null()); | 108 ASSERT_FALSE(callback.is_null()); |
108 | 109 |
109 MediaStreamDevices devices; | 110 MediaStreamDevices devices; |
110 callback.Run(devices, MEDIA_DEVICE_OK, std::unique_ptr<MediaStreamUI>()); | 111 callback.Run(devices, MEDIA_DEVICE_OK, std::unique_ptr<MediaStreamUI>()); |
111 | 112 |
112 MediaStreamDevices response; | 113 MediaStreamDevices response; |
113 EXPECT_CALL(response_callback_, OnAccessRequestResponse(_, _)) | 114 EXPECT_CALL(response_callback_, OnAccessRequestResponse(_, _)) |
114 .WillOnce(SaveArg<0>(&response)); | 115 .WillOnce(SaveArg<0>(&response)); |
115 message_loop_.RunUntilIdle(); | 116 base::RunLoop().RunUntilIdle(); |
116 | 117 |
117 EXPECT_TRUE(response.empty()); | 118 EXPECT_TRUE(response.empty()); |
118 } | 119 } |
119 | 120 |
120 TEST_F(MediaStreamUIProxyTest, AcceptAndStart) { | 121 TEST_F(MediaStreamUIProxyTest, AcceptAndStart) { |
121 std::unique_ptr<MediaStreamRequest> request(new MediaStreamRequest( | 122 std::unique_ptr<MediaStreamRequest> request(new MediaStreamRequest( |
122 0, 0, 0, GURL("http://origin/"), false, MEDIA_GENERATE_STREAM, | 123 0, 0, 0, GURL("http://origin/"), false, MEDIA_GENERATE_STREAM, |
123 std::string(), std::string(), MEDIA_DEVICE_AUDIO_CAPTURE, | 124 std::string(), std::string(), MEDIA_DEVICE_AUDIO_CAPTURE, |
124 MEDIA_DEVICE_VIDEO_CAPTURE)); | 125 MEDIA_DEVICE_VIDEO_CAPTURE)); |
125 MediaStreamRequest* request_ptr = request.get(); | 126 MediaStreamRequest* request_ptr = request.get(); |
126 proxy_->RequestAccess( | 127 proxy_->RequestAccess( |
127 std::move(request), | 128 std::move(request), |
128 base::Bind(&MockResponseCallback::OnAccessRequestResponse, | 129 base::Bind(&MockResponseCallback::OnAccessRequestResponse, |
129 base::Unretained(&response_callback_))); | 130 base::Unretained(&response_callback_))); |
130 MediaResponseCallback callback; | 131 MediaResponseCallback callback; |
131 EXPECT_CALL(delegate_, RequestMediaAccessPermission(SameRequest(request_ptr), | 132 EXPECT_CALL(delegate_, RequestMediaAccessPermission(SameRequest(request_ptr), |
132 _)) | 133 _)) |
133 .WillOnce(SaveArg<1>(&callback)); | 134 .WillOnce(SaveArg<1>(&callback)); |
134 message_loop_.RunUntilIdle(); | 135 base::RunLoop().RunUntilIdle(); |
135 ASSERT_FALSE(callback.is_null()); | 136 ASSERT_FALSE(callback.is_null()); |
136 | 137 |
137 MediaStreamDevices devices; | 138 MediaStreamDevices devices; |
138 devices.push_back( | 139 devices.push_back( |
139 MediaStreamDevice(MEDIA_DEVICE_AUDIO_CAPTURE, "Mic", "Mic")); | 140 MediaStreamDevice(MEDIA_DEVICE_AUDIO_CAPTURE, "Mic", "Mic")); |
140 std::unique_ptr<MockMediaStreamUI> ui(new MockMediaStreamUI()); | 141 std::unique_ptr<MockMediaStreamUI> ui(new MockMediaStreamUI()); |
141 EXPECT_CALL(*ui, OnStarted(_)).WillOnce(Return(0)); | 142 EXPECT_CALL(*ui, OnStarted(_)).WillOnce(Return(0)); |
142 callback.Run(devices, MEDIA_DEVICE_OK, std::move(ui)); | 143 callback.Run(devices, MEDIA_DEVICE_OK, std::move(ui)); |
143 | 144 |
144 MediaStreamDevices response; | 145 MediaStreamDevices response; |
145 EXPECT_CALL(response_callback_, OnAccessRequestResponse(_, _)) | 146 EXPECT_CALL(response_callback_, OnAccessRequestResponse(_, _)) |
146 .WillOnce(SaveArg<0>(&response)); | 147 .WillOnce(SaveArg<0>(&response)); |
147 message_loop_.RunUntilIdle(); | 148 base::RunLoop().RunUntilIdle(); |
148 | 149 |
149 EXPECT_FALSE(response.empty()); | 150 EXPECT_FALSE(response.empty()); |
150 | 151 |
151 proxy_->OnStarted(base::Closure(), MediaStreamUIProxy::WindowIdCallback()); | 152 proxy_->OnStarted(base::Closure(), MediaStreamUIProxy::WindowIdCallback()); |
152 message_loop_.RunUntilIdle(); | 153 base::RunLoop().RunUntilIdle(); |
153 } | 154 } |
154 | 155 |
155 // Verify that the proxy can be deleted before the request is processed. | 156 // Verify that the proxy can be deleted before the request is processed. |
156 TEST_F(MediaStreamUIProxyTest, DeleteBeforeAccepted) { | 157 TEST_F(MediaStreamUIProxyTest, DeleteBeforeAccepted) { |
157 std::unique_ptr<MediaStreamRequest> request(new MediaStreamRequest( | 158 std::unique_ptr<MediaStreamRequest> request(new MediaStreamRequest( |
158 0, 0, 0, GURL("http://origin/"), false, MEDIA_GENERATE_STREAM, | 159 0, 0, 0, GURL("http://origin/"), false, MEDIA_GENERATE_STREAM, |
159 std::string(), std::string(), MEDIA_DEVICE_AUDIO_CAPTURE, | 160 std::string(), std::string(), MEDIA_DEVICE_AUDIO_CAPTURE, |
160 MEDIA_DEVICE_VIDEO_CAPTURE)); | 161 MEDIA_DEVICE_VIDEO_CAPTURE)); |
161 MediaStreamRequest* request_ptr = request.get(); | 162 MediaStreamRequest* request_ptr = request.get(); |
162 proxy_->RequestAccess( | 163 proxy_->RequestAccess( |
163 std::move(request), | 164 std::move(request), |
164 base::Bind(&MockResponseCallback::OnAccessRequestResponse, | 165 base::Bind(&MockResponseCallback::OnAccessRequestResponse, |
165 base::Unretained(&response_callback_))); | 166 base::Unretained(&response_callback_))); |
166 MediaResponseCallback callback; | 167 MediaResponseCallback callback; |
167 EXPECT_CALL(delegate_, RequestMediaAccessPermission(SameRequest(request_ptr) | 168 EXPECT_CALL(delegate_, RequestMediaAccessPermission(SameRequest(request_ptr) |
168 , _)) | 169 , _)) |
169 .WillOnce(SaveArg<1>(&callback)); | 170 .WillOnce(SaveArg<1>(&callback)); |
170 message_loop_.RunUntilIdle(); | 171 base::RunLoop().RunUntilIdle(); |
171 ASSERT_FALSE(callback.is_null()); | 172 ASSERT_FALSE(callback.is_null()); |
172 | 173 |
173 proxy_.reset(); | 174 proxy_.reset(); |
174 | 175 |
175 MediaStreamDevices devices; | 176 MediaStreamDevices devices; |
176 std::unique_ptr<MediaStreamUI> ui; | 177 std::unique_ptr<MediaStreamUI> ui; |
177 callback.Run(devices, MEDIA_DEVICE_OK, std::move(ui)); | 178 callback.Run(devices, MEDIA_DEVICE_OK, std::move(ui)); |
178 } | 179 } |
179 | 180 |
180 TEST_F(MediaStreamUIProxyTest, StopFromUI) { | 181 TEST_F(MediaStreamUIProxyTest, StopFromUI) { |
181 std::unique_ptr<MediaStreamRequest> request(new MediaStreamRequest( | 182 std::unique_ptr<MediaStreamRequest> request(new MediaStreamRequest( |
182 0, 0, 0, GURL("http://origin/"), false, MEDIA_GENERATE_STREAM, | 183 0, 0, 0, GURL("http://origin/"), false, MEDIA_GENERATE_STREAM, |
183 std::string(), std::string(), MEDIA_DEVICE_AUDIO_CAPTURE, | 184 std::string(), std::string(), MEDIA_DEVICE_AUDIO_CAPTURE, |
184 MEDIA_DEVICE_VIDEO_CAPTURE)); | 185 MEDIA_DEVICE_VIDEO_CAPTURE)); |
185 MediaStreamRequest* request_ptr = request.get(); | 186 MediaStreamRequest* request_ptr = request.get(); |
186 proxy_->RequestAccess( | 187 proxy_->RequestAccess( |
187 std::move(request), | 188 std::move(request), |
188 base::Bind(&MockResponseCallback::OnAccessRequestResponse, | 189 base::Bind(&MockResponseCallback::OnAccessRequestResponse, |
189 base::Unretained(&response_callback_))); | 190 base::Unretained(&response_callback_))); |
190 MediaResponseCallback callback; | 191 MediaResponseCallback callback; |
191 EXPECT_CALL(delegate_, RequestMediaAccessPermission(SameRequest(request_ptr) | 192 EXPECT_CALL(delegate_, RequestMediaAccessPermission(SameRequest(request_ptr) |
192 , _)) | 193 , _)) |
193 .WillOnce(SaveArg<1>(&callback)); | 194 .WillOnce(SaveArg<1>(&callback)); |
194 message_loop_.RunUntilIdle(); | 195 base::RunLoop().RunUntilIdle(); |
195 ASSERT_FALSE(callback.is_null()); | 196 ASSERT_FALSE(callback.is_null()); |
196 | 197 |
197 base::Closure stop_callback; | 198 base::Closure stop_callback; |
198 | 199 |
199 MediaStreamDevices devices; | 200 MediaStreamDevices devices; |
200 devices.push_back( | 201 devices.push_back( |
201 MediaStreamDevice(MEDIA_DEVICE_AUDIO_CAPTURE, "Mic", "Mic")); | 202 MediaStreamDevice(MEDIA_DEVICE_AUDIO_CAPTURE, "Mic", "Mic")); |
202 std::unique_ptr<MockMediaStreamUI> ui(new MockMediaStreamUI()); | 203 std::unique_ptr<MockMediaStreamUI> ui(new MockMediaStreamUI()); |
203 EXPECT_CALL(*ui, OnStarted(_)) | 204 EXPECT_CALL(*ui, OnStarted(_)) |
204 .WillOnce(testing::DoAll(SaveArg<0>(&stop_callback), Return(0))); | 205 .WillOnce(testing::DoAll(SaveArg<0>(&stop_callback), Return(0))); |
205 callback.Run(devices, MEDIA_DEVICE_OK, std::move(ui)); | 206 callback.Run(devices, MEDIA_DEVICE_OK, std::move(ui)); |
206 | 207 |
207 MediaStreamDevices response; | 208 MediaStreamDevices response; |
208 EXPECT_CALL(response_callback_, OnAccessRequestResponse(_, _)) | 209 EXPECT_CALL(response_callback_, OnAccessRequestResponse(_, _)) |
209 .WillOnce(SaveArg<0>(&response)); | 210 .WillOnce(SaveArg<0>(&response)); |
210 message_loop_.RunUntilIdle(); | 211 base::RunLoop().RunUntilIdle(); |
211 | 212 |
212 EXPECT_FALSE(response.empty()); | 213 EXPECT_FALSE(response.empty()); |
213 | 214 |
214 MockStopStreamHandler stop_handler; | 215 MockStopStreamHandler stop_handler; |
215 proxy_->OnStarted(base::Bind(&MockStopStreamHandler::OnStop, | 216 proxy_->OnStarted(base::Bind(&MockStopStreamHandler::OnStop, |
216 base::Unretained(&stop_handler)), | 217 base::Unretained(&stop_handler)), |
217 MediaStreamUIProxy::WindowIdCallback()); | 218 MediaStreamUIProxy::WindowIdCallback()); |
218 message_loop_.RunUntilIdle(); | 219 base::RunLoop().RunUntilIdle(); |
219 | 220 |
220 ASSERT_FALSE(stop_callback.is_null()); | 221 ASSERT_FALSE(stop_callback.is_null()); |
221 EXPECT_CALL(stop_handler, OnStop()); | 222 EXPECT_CALL(stop_handler, OnStop()); |
222 stop_callback.Run(); | 223 stop_callback.Run(); |
223 message_loop_.RunUntilIdle(); | 224 base::RunLoop().RunUntilIdle(); |
224 } | 225 } |
225 | 226 |
226 TEST_F(MediaStreamUIProxyTest, WindowIdCallbackCalled) { | 227 TEST_F(MediaStreamUIProxyTest, WindowIdCallbackCalled) { |
227 std::unique_ptr<MediaStreamRequest> request(new MediaStreamRequest( | 228 std::unique_ptr<MediaStreamRequest> request(new MediaStreamRequest( |
228 0, 0, 0, GURL("http://origin/"), false, MEDIA_GENERATE_STREAM, | 229 0, 0, 0, GURL("http://origin/"), false, MEDIA_GENERATE_STREAM, |
229 std::string(), std::string(), MEDIA_NO_SERVICE, | 230 std::string(), std::string(), MEDIA_NO_SERVICE, |
230 MEDIA_DESKTOP_VIDEO_CAPTURE)); | 231 MEDIA_DESKTOP_VIDEO_CAPTURE)); |
231 MediaStreamRequest* request_ptr = request.get(); | 232 MediaStreamRequest* request_ptr = request.get(); |
232 | 233 |
233 proxy_->RequestAccess( | 234 proxy_->RequestAccess( |
234 std::move(request), | 235 std::move(request), |
235 base::Bind(&MockResponseCallback::OnAccessRequestResponse, | 236 base::Bind(&MockResponseCallback::OnAccessRequestResponse, |
236 base::Unretained(&response_callback_))); | 237 base::Unretained(&response_callback_))); |
237 MediaResponseCallback callback; | 238 MediaResponseCallback callback; |
238 EXPECT_CALL(delegate_, RequestMediaAccessPermission(SameRequest(request_ptr), | 239 EXPECT_CALL(delegate_, RequestMediaAccessPermission(SameRequest(request_ptr), |
239 _)) | 240 _)) |
240 .WillOnce(SaveArg<1>(&callback)); | 241 .WillOnce(SaveArg<1>(&callback)); |
241 message_loop_.RunUntilIdle(); | 242 base::RunLoop().RunUntilIdle(); |
242 | 243 |
243 const int kWindowId = 1; | 244 const int kWindowId = 1; |
244 std::unique_ptr<MockMediaStreamUI> ui(new MockMediaStreamUI()); | 245 std::unique_ptr<MockMediaStreamUI> ui(new MockMediaStreamUI()); |
245 EXPECT_CALL(*ui, OnStarted(_)).WillOnce(Return(kWindowId)); | 246 EXPECT_CALL(*ui, OnStarted(_)).WillOnce(Return(kWindowId)); |
246 | 247 |
247 callback.Run(MediaStreamDevices(), MEDIA_DEVICE_OK, std::move(ui)); | 248 callback.Run(MediaStreamDevices(), MEDIA_DEVICE_OK, std::move(ui)); |
248 EXPECT_CALL(response_callback_, OnAccessRequestResponse(_, _)); | 249 EXPECT_CALL(response_callback_, OnAccessRequestResponse(_, _)); |
249 | 250 |
250 MockStopStreamHandler handler; | 251 MockStopStreamHandler handler; |
251 EXPECT_CALL(handler, OnWindowId(kWindowId)); | 252 EXPECT_CALL(handler, OnWindowId(kWindowId)); |
252 | 253 |
253 proxy_->OnStarted( | 254 proxy_->OnStarted( |
254 base::Bind(&MockStopStreamHandler::OnStop, base::Unretained(&handler)), | 255 base::Bind(&MockStopStreamHandler::OnStop, base::Unretained(&handler)), |
255 base::Bind(&MockStopStreamHandler::OnWindowId, | 256 base::Bind(&MockStopStreamHandler::OnWindowId, |
256 base::Unretained(&handler))); | 257 base::Unretained(&handler))); |
257 message_loop_.RunUntilIdle(); | 258 base::RunLoop().RunUntilIdle(); |
258 } | 259 } |
259 | 260 |
260 TEST_F(MediaStreamUIProxyTest, CheckAccess) { | 261 TEST_F(MediaStreamUIProxyTest, CheckAccess) { |
261 proxy_->CheckAccess(url::Origin(GURL("http://origin/")), | 262 proxy_->CheckAccess(url::Origin(GURL("http://origin/")), |
262 MEDIA_DEVICE_AUDIO_CAPTURE, 0, 0, | 263 MEDIA_DEVICE_AUDIO_CAPTURE, 0, 0, |
263 base::Bind(&MockResponseCallback::OnCheckResponse, | 264 base::Bind(&MockResponseCallback::OnCheckResponse, |
264 base::Unretained(&response_callback_))); | 265 base::Unretained(&response_callback_))); |
265 EXPECT_CALL(delegate_, CheckMediaAccessPermission(_, _)); | 266 EXPECT_CALL(delegate_, CheckMediaAccessPermission(_, _)); |
266 EXPECT_CALL(response_callback_, OnCheckResponse(_)); | 267 EXPECT_CALL(response_callback_, OnCheckResponse(_)); |
267 message_loop_.RunUntilIdle(); | 268 base::RunLoop().RunUntilIdle(); |
268 } | 269 } |
269 | 270 |
270 } // namespace content | 271 } // namespace content |
OLD | NEW |