Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(179)

Side by Side Diff: content/browser/renderer_host/media/audio_output_authorization_handler_unittest.cc

Issue 2869733005: Convert some audio code to OnceCallback. (Closed)
Patch Set: Rebase, comments on unretained. Created 3 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2016 The Chromium Authors. All rights reserved. 1 // Copyright 2016 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 // Unit tests for AudioOutputAuthorizationHandler. 5 // Unit tests for AudioOutputAuthorizationHandler.
6 6
7 #include "content/browser/renderer_host/media/audio_output_authorization_handler .h" 7 #include "content/browser/renderer_host/media/audio_output_authorization_handler .h"
8 8
9 #include "base/bind.h" 9 #include "base/bind.h"
10 #include "base/command_line.h" 10 #include "base/command_line.h"
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after
92 base::RunLoop().RunUntilIdle(); 92 base::RunLoop().RunUntilIdle();
93 SyncWith(BrowserThread::GetTaskRunnerForThread(BrowserThread::IO)); 93 SyncWith(BrowserThread::GetTaskRunnerForThread(BrowserThread::IO));
94 SyncWith(audio_manager_->GetWorkerTaskRunner()); 94 SyncWith(audio_manager_->GetWorkerTaskRunner());
95 } 95 }
96 } 96 }
97 97
98 std::string GetRawNondefaultId() { 98 std::string GetRawNondefaultId() {
99 std::string id; 99 std::string id;
100 BrowserThread::PostTask( 100 BrowserThread::PostTask(
101 BrowserThread::IO, FROM_HERE, 101 BrowserThread::IO, FROM_HERE,
102 base::Bind( 102 base::BindOnce(
103 &AudioOutputAuthorizationHandlerTest::GetRawNondefaultIdOnIOThread, 103 &AudioOutputAuthorizationHandlerTest::GetRawNondefaultIdOnIOThread,
104 base::Unretained(this), base::Unretained(&id))); 104 base::Unretained(this), base::Unretained(&id)));
105 SyncWithAllThreads(); 105 SyncWithAllThreads();
106 return id; 106 return id;
107 } 107 }
108 108
109 private: 109 private:
110 void SyncWith(scoped_refptr<base::SingleThreadTaskRunner> task_runner) { 110 void SyncWith(scoped_refptr<base::SingleThreadTaskRunner> task_runner) {
111 CHECK(task_runner); 111 CHECK(task_runner);
112 CHECK(!task_runner->BelongsToCurrentThread()); 112 CHECK(!task_runner->BelongsToCurrentThread());
113 base::WaitableEvent e = {base::WaitableEvent::ResetPolicy::MANUAL, 113 base::WaitableEvent e = {base::WaitableEvent::ResetPolicy::MANUAL,
114 base::WaitableEvent::InitialState::NOT_SIGNALED}; 114 base::WaitableEvent::InitialState::NOT_SIGNALED};
115 task_runner->PostTask(FROM_HERE, base::Bind(&base::WaitableEvent::Signal, 115 task_runner->PostTask(
116 base::Unretained(&e))); 116 FROM_HERE,
117 base::BindOnce(&base::WaitableEvent::Signal, base::Unretained(&e)));
117 e.Wait(); 118 e.Wait();
118 } 119 }
119 120
120 void GetRawNondefaultIdOnIOThread(std::string* out) { 121 void GetRawNondefaultIdOnIOThread(std::string* out) {
121 DCHECK_CURRENTLY_ON(BrowserThread::IO); 122 DCHECK_CURRENTLY_ON(BrowserThread::IO);
122 MediaDevicesManager::BoolDeviceTypes devices_to_enumerate; 123 MediaDevicesManager::BoolDeviceTypes devices_to_enumerate;
123 devices_to_enumerate[MEDIA_DEVICE_TYPE_AUDIO_OUTPUT] = true; 124 devices_to_enumerate[MEDIA_DEVICE_TYPE_AUDIO_OUTPUT] = true;
124 125
125 media_stream_manager_->media_devices_manager()->EnumerateDevices( 126 media_stream_manager_->media_devices_manager()->EnumerateDevices(
126 devices_to_enumerate, 127 devices_to_enumerate,
(...skipping 24 matching lines...) Expand all
151 MockAuthorizationCallback listener; 152 MockAuthorizationCallback listener;
152 EXPECT_CALL(listener, 153 EXPECT_CALL(listener,
153 Run(media::OUTPUT_DEVICE_STATUS_OK, false, _, kDefaultDeviceId)) 154 Run(media::OUTPUT_DEVICE_STATUS_OK, false, _, kDefaultDeviceId))
154 .Times(1); 155 .Times(1);
155 std::unique_ptr<AudioOutputAuthorizationHandler> handler = 156 std::unique_ptr<AudioOutputAuthorizationHandler> handler =
156 base::MakeUnique<AudioOutputAuthorizationHandler>( 157 base::MakeUnique<AudioOutputAuthorizationHandler>(
157 GetAudioSystem(), GetMediaStreamManager(), kRenderProcessId, kSalt); 158 GetAudioSystem(), GetMediaStreamManager(), kRenderProcessId, kSalt);
158 159
159 BrowserThread::PostTask( 160 BrowserThread::PostTask(
160 BrowserThread::IO, FROM_HERE, 161 BrowserThread::IO, FROM_HERE,
161 (base::Bind(&AudioOutputAuthorizationHandler::RequestDeviceAuthorization, 162 base::BindOnce(
162 base::Unretained(handler.get()), kRenderFrameId, 0, 163 &AudioOutputAuthorizationHandler::RequestDeviceAuthorization,
163 kDefaultDeviceId, SecurityOrigin(), listener.Get()))); 164 base::Unretained(handler.get()), kRenderFrameId, 0, kDefaultDeviceId,
165 SecurityOrigin(), listener.Get()));
164 166
165 SyncWithAllThreads(); 167 SyncWithAllThreads();
166 BrowserThread::DeleteSoon(BrowserThread::IO, FROM_HERE, handler.release()); 168 BrowserThread::DeleteSoon(BrowserThread::IO, FROM_HERE, handler.release());
167 SyncWithAllThreads(); 169 SyncWithAllThreads();
168 } 170 }
169 171
170 TEST_F(AudioOutputAuthorizationHandlerTest, 172 TEST_F(AudioOutputAuthorizationHandlerTest,
171 AuthorizeDefaultDeviceByEmptyId_Ok) { 173 AuthorizeDefaultDeviceByEmptyId_Ok) {
172 MockAuthorizationCallback listener; 174 MockAuthorizationCallback listener;
173 EXPECT_CALL(listener, 175 EXPECT_CALL(listener,
174 Run(media::OUTPUT_DEVICE_STATUS_OK, false, _, kDefaultDeviceId)) 176 Run(media::OUTPUT_DEVICE_STATUS_OK, false, _, kDefaultDeviceId))
175 .Times(1); 177 .Times(1);
176 std::unique_ptr<AudioOutputAuthorizationHandler> handler = 178 std::unique_ptr<AudioOutputAuthorizationHandler> handler =
177 base::MakeUnique<AudioOutputAuthorizationHandler>( 179 base::MakeUnique<AudioOutputAuthorizationHandler>(
178 GetAudioSystem(), GetMediaStreamManager(), kRenderProcessId, kSalt); 180 GetAudioSystem(), GetMediaStreamManager(), kRenderProcessId, kSalt);
179 181
180 BrowserThread::PostTask( 182 BrowserThread::PostTask(
181 BrowserThread::IO, FROM_HERE, 183 BrowserThread::IO, FROM_HERE,
182 (base::Bind(&AudioOutputAuthorizationHandler::RequestDeviceAuthorization, 184 base::BindOnce(
183 base::Unretained(handler.get()), kRenderFrameId, 0, 185 &AudioOutputAuthorizationHandler::RequestDeviceAuthorization,
184 kEmptyDeviceId, SecurityOrigin(), listener.Get()))); 186 base::Unretained(handler.get()), kRenderFrameId, 0, kEmptyDeviceId,
187 SecurityOrigin(), listener.Get()));
185 188
186 SyncWithAllThreads(); 189 SyncWithAllThreads();
187 BrowserThread::DeleteSoon(BrowserThread::IO, FROM_HERE, handler.release()); 190 BrowserThread::DeleteSoon(BrowserThread::IO, FROM_HERE, handler.release());
188 SyncWithAllThreads(); 191 SyncWithAllThreads();
189 } 192 }
190 193
191 TEST_F(AudioOutputAuthorizationHandlerTest, 194 TEST_F(AudioOutputAuthorizationHandlerTest,
192 AuthorizeNondefaultDeviceIdWithoutPermission_NotAuthorized) { 195 AuthorizeNondefaultDeviceIdWithoutPermission_NotAuthorized) {
193 std::string raw_nondefault_id = GetRawNondefaultId(); 196 std::string raw_nondefault_id = GetRawNondefaultId();
194 std::string hashed_id = MediaStreamManager::GetHMACForMediaDeviceID( 197 std::string hashed_id = MediaStreamManager::GetHMACForMediaDeviceID(
195 kSalt, SecurityOrigin(), raw_nondefault_id); 198 kSalt, SecurityOrigin(), raw_nondefault_id);
196 199
197 MockAuthorizationCallback listener; 200 MockAuthorizationCallback listener;
198 std::unique_ptr<AudioOutputAuthorizationHandler> handler = 201 std::unique_ptr<AudioOutputAuthorizationHandler> handler =
199 base::MakeUnique<AudioOutputAuthorizationHandler>( 202 base::MakeUnique<AudioOutputAuthorizationHandler>(
200 GetAudioSystem(), GetMediaStreamManager(), kRenderProcessId, kSalt); 203 GetAudioSystem(), GetMediaStreamManager(), kRenderProcessId, kSalt);
201 BrowserThread::PostTask( 204 BrowserThread::PostTask(
202 BrowserThread::IO, FROM_HERE, 205 BrowserThread::IO, FROM_HERE,
203 base::Bind( 206 base::BindOnce(
204 &AudioOutputAuthorizationHandler::OverridePermissionsForTesting, 207 &AudioOutputAuthorizationHandler::OverridePermissionsForTesting,
205 base::Unretained(handler.get()), false)); 208 base::Unretained(handler.get()), false));
206 SyncWithAllThreads(); 209 SyncWithAllThreads();
207 210
208 EXPECT_CALL(listener, Run(media::OUTPUT_DEVICE_STATUS_ERROR_NOT_AUTHORIZED, 211 EXPECT_CALL(listener, Run(media::OUTPUT_DEVICE_STATUS_ERROR_NOT_AUTHORIZED,
209 false, _, std::string())) 212 false, _, std::string()))
210 .Times(1); 213 .Times(1);
211 214
212 BrowserThread::PostTask( 215 BrowserThread::PostTask(
213 BrowserThread::IO, FROM_HERE, 216 BrowserThread::IO, FROM_HERE,
214 (base::Bind(&AudioOutputAuthorizationHandler::RequestDeviceAuthorization, 217 base::BindOnce(
215 base::Unretained(handler.get()), kRenderFrameId, 0, hashed_id, 218 &AudioOutputAuthorizationHandler::RequestDeviceAuthorization,
216 SecurityOrigin(), listener.Get()))); 219 base::Unretained(handler.get()), kRenderFrameId, 0, hashed_id,
220 SecurityOrigin(), listener.Get()));
217 221
218 SyncWithAllThreads(); 222 SyncWithAllThreads();
219 BrowserThread::DeleteSoon(BrowserThread::IO, FROM_HERE, handler.release()); 223 BrowserThread::DeleteSoon(BrowserThread::IO, FROM_HERE, handler.release());
220 SyncWithAllThreads(); 224 SyncWithAllThreads();
221 } 225 }
222 226
223 TEST_F(AudioOutputAuthorizationHandlerTest, 227 TEST_F(AudioOutputAuthorizationHandlerTest,
224 AuthorizeNondefaultDeviceIdWithPermission_Ok) { 228 AuthorizeNondefaultDeviceIdWithPermission_Ok) {
225 std::string raw_nondefault_id = GetRawNondefaultId(); 229 std::string raw_nondefault_id = GetRawNondefaultId();
226 std::string hashed_id = MediaStreamManager::GetHMACForMediaDeviceID( 230 std::string hashed_id = MediaStreamManager::GetHMACForMediaDeviceID(
227 kSalt, SecurityOrigin(), raw_nondefault_id); 231 kSalt, SecurityOrigin(), raw_nondefault_id);
228 MockAuthorizationCallback listener; 232 MockAuthorizationCallback listener;
229 std::unique_ptr<AudioOutputAuthorizationHandler> handler = 233 std::unique_ptr<AudioOutputAuthorizationHandler> handler =
230 base::MakeUnique<AudioOutputAuthorizationHandler>( 234 base::MakeUnique<AudioOutputAuthorizationHandler>(
231 GetAudioSystem(), GetMediaStreamManager(), kRenderProcessId, kSalt); 235 GetAudioSystem(), GetMediaStreamManager(), kRenderProcessId, kSalt);
232 BrowserThread::PostTask( 236 BrowserThread::PostTask(
233 BrowserThread::IO, FROM_HERE, 237 BrowserThread::IO, FROM_HERE,
234 base::Bind( 238 base::BindOnce(
235 &AudioOutputAuthorizationHandler::OverridePermissionsForTesting, 239 &AudioOutputAuthorizationHandler::OverridePermissionsForTesting,
236 base::Unretained(handler.get()), true)); 240 base::Unretained(handler.get()), true));
237 241
238 EXPECT_CALL(listener, 242 EXPECT_CALL(listener,
239 Run(media::OUTPUT_DEVICE_STATUS_OK, false, _, raw_nondefault_id)) 243 Run(media::OUTPUT_DEVICE_STATUS_OK, false, _, raw_nondefault_id))
240 .Times(1); 244 .Times(1);
241 245
242 BrowserThread::PostTask( 246 BrowserThread::PostTask(
243 BrowserThread::IO, FROM_HERE, 247 BrowserThread::IO, FROM_HERE,
244 (base::Bind(&AudioOutputAuthorizationHandler::RequestDeviceAuthorization, 248 base::BindOnce(
245 base::Unretained(handler.get()), kRenderFrameId, 0, hashed_id, 249 &AudioOutputAuthorizationHandler::RequestDeviceAuthorization,
246 SecurityOrigin(), listener.Get()))); 250 base::Unretained(handler.get()), kRenderFrameId, 0, hashed_id,
251 SecurityOrigin(), listener.Get()));
247 252
248 SyncWithAllThreads(); 253 SyncWithAllThreads();
249 BrowserThread::DeleteSoon(BrowserThread::IO, FROM_HERE, handler.release()); 254 BrowserThread::DeleteSoon(BrowserThread::IO, FROM_HERE, handler.release());
250 SyncWithAllThreads(); 255 SyncWithAllThreads();
251 } 256 }
252 257
253 TEST_F(AudioOutputAuthorizationHandlerTest, AuthorizeInvalidDeviceId_NotFound) { 258 TEST_F(AudioOutputAuthorizationHandlerTest, AuthorizeInvalidDeviceId_NotFound) {
254 std::unique_ptr<TestBrowserContext> context = 259 std::unique_ptr<TestBrowserContext> context =
255 base::MakeUnique<TestBrowserContext>(); 260 base::MakeUnique<TestBrowserContext>();
256 std::unique_ptr<MockRenderProcessHost> RPH = 261 std::unique_ptr<MockRenderProcessHost> RPH =
257 base::MakeUnique<MockRenderProcessHost>(context.get()); 262 base::MakeUnique<MockRenderProcessHost>(context.get());
258 MockAuthorizationCallback listener; 263 MockAuthorizationCallback listener;
259 std::unique_ptr<AudioOutputAuthorizationHandler> handler = 264 std::unique_ptr<AudioOutputAuthorizationHandler> handler =
260 base::MakeUnique<AudioOutputAuthorizationHandler>( 265 base::MakeUnique<AudioOutputAuthorizationHandler>(
261 GetAudioSystem(), GetMediaStreamManager(), RPH->GetID(), kSalt); 266 GetAudioSystem(), GetMediaStreamManager(), RPH->GetID(), kSalt);
262 EXPECT_EQ(RPH->bad_msg_count(), 0); 267 EXPECT_EQ(RPH->bad_msg_count(), 0);
263 268
264 EXPECT_CALL(listener, 269 EXPECT_CALL(listener,
265 Run(media::OUTPUT_DEVICE_STATUS_ERROR_NOT_FOUND, _, _, _)) 270 Run(media::OUTPUT_DEVICE_STATUS_ERROR_NOT_FOUND, _, _, _))
266 .Times(1); 271 .Times(1);
267 272
268 BrowserThread::PostTask( 273 BrowserThread::PostTask(
269 BrowserThread::IO, FROM_HERE, 274 BrowserThread::IO, FROM_HERE,
270 (base::Bind(&AudioOutputAuthorizationHandler::RequestDeviceAuthorization, 275 base::BindOnce(
271 base::Unretained(handler.get()), kRenderFrameId, 0, 276 &AudioOutputAuthorizationHandler::RequestDeviceAuthorization,
272 kInvalidDeviceId, SecurityOrigin(), listener.Get()))); 277 base::Unretained(handler.get()), kRenderFrameId, 0, kInvalidDeviceId,
278 SecurityOrigin(), listener.Get()));
273 279
274 SyncWithAllThreads(); 280 SyncWithAllThreads();
275 // It is possible to request an invalid device id from JS APIs, 281 // It is possible to request an invalid device id from JS APIs,
276 // so we don't want to crash the renderer for this. 282 // so we don't want to crash the renderer for this.
277 EXPECT_EQ(RPH->bad_msg_count(), 0); 283 EXPECT_EQ(RPH->bad_msg_count(), 0);
278 BrowserThread::DeleteSoon(BrowserThread::IO, FROM_HERE, handler.release()); 284 BrowserThread::DeleteSoon(BrowserThread::IO, FROM_HERE, handler.release());
279 SyncWithAllThreads(); 285 SyncWithAllThreads();
280 RPH.reset(); 286 RPH.reset();
281 context.reset(); 287 context.reset();
282 } 288 }
(...skipping 11 matching lines...) Expand all
294 std::unique_ptr<AudioOutputAuthorizationHandler> handler = 300 std::unique_ptr<AudioOutputAuthorizationHandler> handler =
295 base::MakeUnique<AudioOutputAuthorizationHandler>( 301 base::MakeUnique<AudioOutputAuthorizationHandler>(
296 GetAudioSystem(), GetMediaStreamManager(), RPH->GetID(), kSalt); 302 GetAudioSystem(), GetMediaStreamManager(), RPH->GetID(), kSalt);
297 303
298 EXPECT_EQ(RPH->bad_msg_count(), 0); 304 EXPECT_EQ(RPH->bad_msg_count(), 0);
299 // We must still get a callback by the contract of RequestDeviceAuthorization. 305 // We must still get a callback by the contract of RequestDeviceAuthorization.
300 EXPECT_CALL(listener, Run(_, _, _, _)).Times(1); 306 EXPECT_CALL(listener, Run(_, _, _, _)).Times(1);
301 307
302 BrowserThread::PostTask( 308 BrowserThread::PostTask(
303 BrowserThread::IO, FROM_HERE, 309 BrowserThread::IO, FROM_HERE,
304 (base::Bind(&AudioOutputAuthorizationHandler::RequestDeviceAuthorization, 310 base::BindOnce(
305 base::Unretained(handler.get()), kRenderFrameId, 0, hashed_id, 311 &AudioOutputAuthorizationHandler::RequestDeviceAuthorization,
306 BadSecurityOrigin(), listener.Get()))); 312 base::Unretained(handler.get()), kRenderFrameId, 0, hashed_id,
313 BadSecurityOrigin(), listener.Get()));
307 314
308 SyncWithAllThreads(); 315 SyncWithAllThreads();
309 EXPECT_EQ(RPH->bad_msg_count(), 1); 316 EXPECT_EQ(RPH->bad_msg_count(), 1);
310 BrowserThread::DeleteSoon(BrowserThread::IO, FROM_HERE, handler.release()); 317 BrowserThread::DeleteSoon(BrowserThread::IO, FROM_HERE, handler.release());
311 SyncWithAllThreads(); 318 SyncWithAllThreads();
312 RPH.reset(); 319 RPH.reset();
313 context.reset(); 320 context.reset();
314 } 321 }
315 322
316 TEST_F(AudioOutputAuthorizationHandlerTest, 323 TEST_F(AudioOutputAuthorizationHandlerTest,
317 AuthorizeWithSessionIdWithoutDevice_GivesDefault) { 324 AuthorizeWithSessionIdWithoutDevice_GivesDefault) {
318 MockAuthorizationCallback listener; 325 MockAuthorizationCallback listener;
319 std::unique_ptr<AudioOutputAuthorizationHandler> handler = 326 std::unique_ptr<AudioOutputAuthorizationHandler> handler =
320 base::MakeUnique<AudioOutputAuthorizationHandler>( 327 base::MakeUnique<AudioOutputAuthorizationHandler>(
321 GetAudioSystem(), GetMediaStreamManager(), kRenderProcessId, kSalt); 328 GetAudioSystem(), GetMediaStreamManager(), kRenderProcessId, kSalt);
322 329
323 EXPECT_CALL(listener, 330 EXPECT_CALL(listener,
324 Run(media::OUTPUT_DEVICE_STATUS_OK, false, _, kDefaultDeviceId)) 331 Run(media::OUTPUT_DEVICE_STATUS_OK, false, _, kDefaultDeviceId))
325 .Times(1); 332 .Times(1);
326 333
327 BrowserThread::PostTask( 334 BrowserThread::PostTask(
328 BrowserThread::IO, FROM_HERE, 335 BrowserThread::IO, FROM_HERE,
329 (base::Bind(&AudioOutputAuthorizationHandler::RequestDeviceAuthorization, 336 base::BindOnce(
330 base::Unretained(handler.get()), kRenderFrameId, kSessionId, 337 &AudioOutputAuthorizationHandler::RequestDeviceAuthorization,
331 std::string(), BadSecurityOrigin(), listener.Get()))); 338 base::Unretained(handler.get()), kRenderFrameId, kSessionId,
339 std::string(), BadSecurityOrigin(), listener.Get()));
332 340
333 SyncWithAllThreads(); 341 SyncWithAllThreads();
334 BrowserThread::DeleteSoon(BrowserThread::IO, FROM_HERE, handler.release()); 342 BrowserThread::DeleteSoon(BrowserThread::IO, FROM_HERE, handler.release());
335 SyncWithAllThreads(); 343 SyncWithAllThreads();
336 } 344 }
337 345
338 } // namespace content 346 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698