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

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

Issue 2529853002: Fix shutdown crash in AudioOutputAuthorizationHandler. (Closed)
Patch Set: . Created 4 years 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 83 matching lines...) Expand 10 before | Expand all | Expand 10 after
94 SyncWithAllThreads(); 94 SyncWithAllThreads();
95 } 95 }
96 96
97 ~AudioOutputAuthorizationHandlerTest() override { SyncWithAllThreads(); } 97 ~AudioOutputAuthorizationHandlerTest() override { SyncWithAllThreads(); }
98 98
99 protected: 99 protected:
100 MediaStreamManager* GetMediaStreamManager() { 100 MediaStreamManager* GetMediaStreamManager() {
101 return media_stream_manager_.get(); 101 return media_stream_manager_.get();
102 } 102 }
103 103
104 media::AudioManager* GetAudioManager() { return audio_manager_.get(); }
105
104 void SyncWithAllThreads() { 106 void SyncWithAllThreads() {
105 // New tasks might be posted while we are syncing, but in 107 // New tasks might be posted while we are syncing, but in
106 // every iteration at least one task will be run. 20 iterations should be 108 // every iteration at least one task will be run. 20 iterations should be
107 // enough for our code. 109 // enough for our code.
108 for (int i = 0; i < 20; ++i) { 110 for (int i = 0; i < 20; ++i) {
109 base::RunLoop().RunUntilIdle(); 111 base::RunLoop().RunUntilIdle();
110 SyncWith(BrowserThread::GetTaskRunnerForThread(BrowserThread::IO)); 112 SyncWith(BrowserThread::GetTaskRunnerForThread(BrowserThread::IO));
111 SyncWith(audio_thread_->task_runner()); 113 SyncWith(audio_thread_->task_runner());
112 } 114 }
113 } 115 }
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
165 }; 167 };
166 168
167 TEST_F(AudioOutputAuthorizationHandlerTest, AuthorizeDefaultDevice_Ok) { 169 TEST_F(AudioOutputAuthorizationHandlerTest, AuthorizeDefaultDevice_Ok) {
168 MockListener listener; 170 MockListener listener;
169 EXPECT_CALL(listener, 171 EXPECT_CALL(listener,
170 MockAuthorizationCallback(media::OUTPUT_DEVICE_STATUS_OK, false, 172 MockAuthorizationCallback(media::OUTPUT_DEVICE_STATUS_OK, false,
171 _, kDefaultDeviceId)) 173 _, kDefaultDeviceId))
172 .Times(1); 174 .Times(1);
173 std::unique_ptr<AudioOutputAuthorizationHandler> handler = 175 std::unique_ptr<AudioOutputAuthorizationHandler> handler =
174 base::MakeUnique<AudioOutputAuthorizationHandler>( 176 base::MakeUnique<AudioOutputAuthorizationHandler>(
175 GetMediaStreamManager(), kRenderProcessId, kSalt); 177 GetAudioManager(), GetMediaStreamManager(), kRenderProcessId, kSalt);
176 178
177 BrowserThread::PostTask( 179 BrowserThread::PostTask(
178 BrowserThread::IO, FROM_HERE, 180 BrowserThread::IO, FROM_HERE,
179 (base::Bind(&AudioOutputAuthorizationHandler::RequestDeviceAuthorization, 181 (base::Bind(&AudioOutputAuthorizationHandler::RequestDeviceAuthorization,
180 base::Unretained(handler.get()), kRenderFrameId, 0, 182 base::Unretained(handler.get()), kRenderFrameId, 0,
181 kDefaultDeviceId, SecurityOrigin(), listener.GetCallback()))); 183 kDefaultDeviceId, SecurityOrigin(), listener.GetCallback())));
182 184
183 SyncWithAllThreads(); 185 SyncWithAllThreads();
184 BrowserThread::DeleteSoon(BrowserThread::IO, FROM_HERE, handler.release()); 186 BrowserThread::DeleteSoon(BrowserThread::IO, FROM_HERE, handler.release());
185 SyncWithAllThreads(); 187 SyncWithAllThreads();
186 } 188 }
187 189
188 TEST_F(AudioOutputAuthorizationHandlerTest, 190 TEST_F(AudioOutputAuthorizationHandlerTest,
189 AuthorizeDefaultDeviceByEmptyId_Ok) { 191 AuthorizeDefaultDeviceByEmptyId_Ok) {
190 MockListener listener; 192 MockListener listener;
191 EXPECT_CALL(listener, 193 EXPECT_CALL(listener,
192 MockAuthorizationCallback(media::OUTPUT_DEVICE_STATUS_OK, false, 194 MockAuthorizationCallback(media::OUTPUT_DEVICE_STATUS_OK, false,
193 _, kDefaultDeviceId)) 195 _, kDefaultDeviceId))
194 .Times(1); 196 .Times(1);
195 std::unique_ptr<AudioOutputAuthorizationHandler> handler = 197 std::unique_ptr<AudioOutputAuthorizationHandler> handler =
196 base::MakeUnique<AudioOutputAuthorizationHandler>( 198 base::MakeUnique<AudioOutputAuthorizationHandler>(
197 GetMediaStreamManager(), kRenderProcessId, kSalt); 199 GetAudioManager(), GetMediaStreamManager(), kRenderProcessId, kSalt);
198 200
199 BrowserThread::PostTask( 201 BrowserThread::PostTask(
200 BrowserThread::IO, FROM_HERE, 202 BrowserThread::IO, FROM_HERE,
201 (base::Bind(&AudioOutputAuthorizationHandler::RequestDeviceAuthorization, 203 (base::Bind(&AudioOutputAuthorizationHandler::RequestDeviceAuthorization,
202 base::Unretained(handler.get()), kRenderFrameId, 0, 204 base::Unretained(handler.get()), kRenderFrameId, 0,
203 kEmptyDeviceId, SecurityOrigin(), listener.GetCallback()))); 205 kEmptyDeviceId, SecurityOrigin(), listener.GetCallback())));
204 206
205 SyncWithAllThreads(); 207 SyncWithAllThreads();
206 BrowserThread::DeleteSoon(BrowserThread::IO, FROM_HERE, handler.release()); 208 BrowserThread::DeleteSoon(BrowserThread::IO, FROM_HERE, handler.release());
207 SyncWithAllThreads(); 209 SyncWithAllThreads();
208 } 210 }
209 211
210 TEST_F(AudioOutputAuthorizationHandlerTest, 212 TEST_F(AudioOutputAuthorizationHandlerTest,
211 AuthorizeNondefaultDeviceIdWithoutPermission_NotAuthorized) { 213 AuthorizeNondefaultDeviceIdWithoutPermission_NotAuthorized) {
212 std::string raw_nondefault_id = GetRawNondefaultId(); 214 std::string raw_nondefault_id = GetRawNondefaultId();
213 std::string hashed_id = MediaStreamManager::GetHMACForMediaDeviceID( 215 std::string hashed_id = MediaStreamManager::GetHMACForMediaDeviceID(
214 kSalt, SecurityOrigin(), raw_nondefault_id); 216 kSalt, SecurityOrigin(), raw_nondefault_id);
215 217
216 MockListener listener; 218 MockListener listener;
217 std::unique_ptr<AudioOutputAuthorizationHandler> handler = 219 std::unique_ptr<AudioOutputAuthorizationHandler> handler =
218 base::MakeUnique<AudioOutputAuthorizationHandler>( 220 base::MakeUnique<AudioOutputAuthorizationHandler>(
219 GetMediaStreamManager(), kRenderProcessId, kSalt); 221 GetAudioManager(), GetMediaStreamManager(), kRenderProcessId, kSalt);
220 BrowserThread::PostTask( 222 BrowserThread::PostTask(
221 BrowserThread::IO, FROM_HERE, 223 BrowserThread::IO, FROM_HERE,
222 base::Bind( 224 base::Bind(
223 &AudioOutputAuthorizationHandler::OverridePermissionsForTesting, 225 &AudioOutputAuthorizationHandler::OverridePermissionsForTesting,
224 base::Unretained(handler.get()), false)); 226 base::Unretained(handler.get()), false));
225 SyncWithAllThreads(); 227 SyncWithAllThreads();
226 228
227 EXPECT_CALL(listener, MockAuthorizationCallback( 229 EXPECT_CALL(listener, MockAuthorizationCallback(
228 media::OUTPUT_DEVICE_STATUS_ERROR_NOT_AUTHORIZED, 230 media::OUTPUT_DEVICE_STATUS_ERROR_NOT_AUTHORIZED,
229 false, _, std::string())) 231 false, _, std::string()))
(...skipping 11 matching lines...) Expand all
241 } 243 }
242 244
243 TEST_F(AudioOutputAuthorizationHandlerTest, 245 TEST_F(AudioOutputAuthorizationHandlerTest,
244 AuthorizeNondefaultDeviceIdWithPermission_Ok) { 246 AuthorizeNondefaultDeviceIdWithPermission_Ok) {
245 std::string raw_nondefault_id = GetRawNondefaultId(); 247 std::string raw_nondefault_id = GetRawNondefaultId();
246 std::string hashed_id = MediaStreamManager::GetHMACForMediaDeviceID( 248 std::string hashed_id = MediaStreamManager::GetHMACForMediaDeviceID(
247 kSalt, SecurityOrigin(), raw_nondefault_id); 249 kSalt, SecurityOrigin(), raw_nondefault_id);
248 MockListener listener; 250 MockListener listener;
249 std::unique_ptr<AudioOutputAuthorizationHandler> handler = 251 std::unique_ptr<AudioOutputAuthorizationHandler> handler =
250 base::MakeUnique<AudioOutputAuthorizationHandler>( 252 base::MakeUnique<AudioOutputAuthorizationHandler>(
251 GetMediaStreamManager(), kRenderProcessId, kSalt); 253 GetAudioManager(), GetMediaStreamManager(), kRenderProcessId, kSalt);
252 BrowserThread::PostTask( 254 BrowserThread::PostTask(
253 BrowserThread::IO, FROM_HERE, 255 BrowserThread::IO, FROM_HERE,
254 base::Bind( 256 base::Bind(
255 &AudioOutputAuthorizationHandler::OverridePermissionsForTesting, 257 &AudioOutputAuthorizationHandler::OverridePermissionsForTesting,
256 base::Unretained(handler.get()), true)); 258 base::Unretained(handler.get()), true));
257 259
258 EXPECT_CALL(listener, 260 EXPECT_CALL(listener,
259 MockAuthorizationCallback(media::OUTPUT_DEVICE_STATUS_OK, false, 261 MockAuthorizationCallback(media::OUTPUT_DEVICE_STATUS_OK, false,
260 _, raw_nondefault_id)) 262 _, raw_nondefault_id))
261 .Times(1); 263 .Times(1);
(...skipping 10 matching lines...) Expand all
272 } 274 }
273 275
274 TEST_F(AudioOutputAuthorizationHandlerTest, 276 TEST_F(AudioOutputAuthorizationHandlerTest,
275 AuthorizeInvalidDeviceId_BadMessage) { 277 AuthorizeInvalidDeviceId_BadMessage) {
276 std::unique_ptr<TestBrowserContext> context = 278 std::unique_ptr<TestBrowserContext> context =
277 base::MakeUnique<TestBrowserContext>(); 279 base::MakeUnique<TestBrowserContext>();
278 std::unique_ptr<MockRenderProcessHost> RPH = 280 std::unique_ptr<MockRenderProcessHost> RPH =
279 base::MakeUnique<MockRenderProcessHost>(context.get()); 281 base::MakeUnique<MockRenderProcessHost>(context.get());
280 MockListener listener; 282 MockListener listener;
281 std::unique_ptr<AudioOutputAuthorizationHandler> handler = 283 std::unique_ptr<AudioOutputAuthorizationHandler> handler =
282 base::MakeUnique<AudioOutputAuthorizationHandler>(GetMediaStreamManager(), 284 base::MakeUnique<AudioOutputAuthorizationHandler>(
283 RPH->GetID(), kSalt); 285 GetAudioManager(), GetMediaStreamManager(), RPH->GetID(), kSalt);
284 EXPECT_EQ(RPH->bad_msg_count(), 0); 286 EXPECT_EQ(RPH->bad_msg_count(), 0);
285 287
286 EXPECT_CALL(listener, MockAuthorizationCallback(_, _, _, _)).Times(0); 288 EXPECT_CALL(listener, MockAuthorizationCallback(_, _, _, _)).Times(0);
287 289
288 BrowserThread::PostTask( 290 BrowserThread::PostTask(
289 BrowserThread::IO, FROM_HERE, 291 BrowserThread::IO, FROM_HERE,
290 (base::Bind(&AudioOutputAuthorizationHandler::RequestDeviceAuthorization, 292 (base::Bind(&AudioOutputAuthorizationHandler::RequestDeviceAuthorization,
291 base::Unretained(handler.get()), kRenderFrameId, 0, 293 base::Unretained(handler.get()), kRenderFrameId, 0,
292 kInvalidDeviceId, SecurityOrigin(), listener.GetCallback()))); 294 kInvalidDeviceId, SecurityOrigin(), listener.GetCallback())));
293 295
294 SyncWithAllThreads(); 296 SyncWithAllThreads();
295 EXPECT_EQ(RPH->bad_msg_count(), 1); 297 EXPECT_EQ(RPH->bad_msg_count(), 1);
296 BrowserThread::DeleteSoon(BrowserThread::IO, FROM_HERE, handler.release()); 298 BrowserThread::DeleteSoon(BrowserThread::IO, FROM_HERE, handler.release());
297 SyncWithAllThreads(); 299 SyncWithAllThreads();
298 RPH.reset(); 300 RPH.reset();
299 context.reset(); 301 context.reset();
300 } 302 }
301 303
302 TEST_F(AudioOutputAuthorizationHandlerTest, 304 TEST_F(AudioOutputAuthorizationHandlerTest,
303 AuthorizeNondefaultDeviceIdWithBadOrigin_BadMessage) { 305 AuthorizeNondefaultDeviceIdWithBadOrigin_BadMessage) {
304 std::string raw_nondefault_id = GetRawNondefaultId(); 306 std::string raw_nondefault_id = GetRawNondefaultId();
305 std::string hashed_id = MediaStreamManager::GetHMACForMediaDeviceID( 307 std::string hashed_id = MediaStreamManager::GetHMACForMediaDeviceID(
306 kSalt, SecurityOrigin(), raw_nondefault_id); 308 kSalt, SecurityOrigin(), raw_nondefault_id);
307 std::unique_ptr<TestBrowserContext> context = 309 std::unique_ptr<TestBrowserContext> context =
308 base::MakeUnique<TestBrowserContext>(); 310 base::MakeUnique<TestBrowserContext>();
309 std::unique_ptr<MockRenderProcessHost> RPH = 311 std::unique_ptr<MockRenderProcessHost> RPH =
310 base::MakeUnique<MockRenderProcessHost>(context.get()); 312 base::MakeUnique<MockRenderProcessHost>(context.get());
311 MockListener listener; 313 MockListener listener;
312 std::unique_ptr<AudioOutputAuthorizationHandler> handler = 314 std::unique_ptr<AudioOutputAuthorizationHandler> handler =
313 base::MakeUnique<AudioOutputAuthorizationHandler>(GetMediaStreamManager(), 315 base::MakeUnique<AudioOutputAuthorizationHandler>(
314 RPH->GetID(), kSalt); 316 GetAudioManager(), GetMediaStreamManager(), RPH->GetID(), kSalt);
315 317
316 EXPECT_EQ(RPH->bad_msg_count(), 0); 318 EXPECT_EQ(RPH->bad_msg_count(), 0);
317 EXPECT_CALL(listener, MockAuthorizationCallback(_, _, _, _)).Times(0); 319 EXPECT_CALL(listener, MockAuthorizationCallback(_, _, _, _)).Times(0);
318 320
319 BrowserThread::PostTask( 321 BrowserThread::PostTask(
320 BrowserThread::IO, FROM_HERE, 322 BrowserThread::IO, FROM_HERE,
321 (base::Bind(&AudioOutputAuthorizationHandler::RequestDeviceAuthorization, 323 (base::Bind(&AudioOutputAuthorizationHandler::RequestDeviceAuthorization,
322 base::Unretained(handler.get()), kRenderFrameId, 0, hashed_id, 324 base::Unretained(handler.get()), kRenderFrameId, 0, hashed_id,
323 BadSecurityOrigin(), listener.GetCallback()))); 325 BadSecurityOrigin(), listener.GetCallback())));
324 326
325 SyncWithAllThreads(); 327 SyncWithAllThreads();
326 EXPECT_EQ(RPH->bad_msg_count(), 1); 328 EXPECT_EQ(RPH->bad_msg_count(), 1);
327 BrowserThread::DeleteSoon(BrowserThread::IO, FROM_HERE, handler.release()); 329 BrowserThread::DeleteSoon(BrowserThread::IO, FROM_HERE, handler.release());
328 SyncWithAllThreads(); 330 SyncWithAllThreads();
329 RPH.reset(); 331 RPH.reset();
330 context.reset(); 332 context.reset();
331 } 333 }
332 334
333 TEST_F(AudioOutputAuthorizationHandlerTest, 335 TEST_F(AudioOutputAuthorizationHandlerTest,
334 AuthorizeWithSessionIdWithoutDevice_GivesDefault) { 336 AuthorizeWithSessionIdWithoutDevice_GivesDefault) {
335 MockListener listener; 337 MockListener listener;
336 std::unique_ptr<AudioOutputAuthorizationHandler> handler = 338 std::unique_ptr<AudioOutputAuthorizationHandler> handler =
337 base::MakeUnique<AudioOutputAuthorizationHandler>( 339 base::MakeUnique<AudioOutputAuthorizationHandler>(
338 GetMediaStreamManager(), kRenderProcessId, kSalt); 340 GetAudioManager(), GetMediaStreamManager(), kRenderProcessId, kSalt);
339 341
340 EXPECT_CALL(listener, 342 EXPECT_CALL(listener,
341 MockAuthorizationCallback(media::OUTPUT_DEVICE_STATUS_OK, false, 343 MockAuthorizationCallback(media::OUTPUT_DEVICE_STATUS_OK, false,
342 _, kDefaultDeviceId)) 344 _, kDefaultDeviceId))
343 .Times(1); 345 .Times(1);
344 346
345 BrowserThread::PostTask( 347 BrowserThread::PostTask(
346 BrowserThread::IO, FROM_HERE, 348 BrowserThread::IO, FROM_HERE,
347 (base::Bind(&AudioOutputAuthorizationHandler::RequestDeviceAuthorization, 349 (base::Bind(&AudioOutputAuthorizationHandler::RequestDeviceAuthorization,
348 base::Unretained(handler.get()), kRenderFrameId, kSessionId, 350 base::Unretained(handler.get()), kRenderFrameId, kSessionId,
349 std::string(), BadSecurityOrigin(), listener.GetCallback()))); 351 std::string(), BadSecurityOrigin(), listener.GetCallback())));
350 352
351 SyncWithAllThreads(); 353 SyncWithAllThreads();
352 BrowserThread::DeleteSoon(BrowserThread::IO, FROM_HERE, handler.release()); 354 BrowserThread::DeleteSoon(BrowserThread::IO, FROM_HERE, handler.release());
353 SyncWithAllThreads(); 355 SyncWithAllThreads();
354 } 356 }
355 357
356 } // namespace content 358 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698