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

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

Issue 2443573003: Factor out AudioOutputDelegate from AudioRendererHost. (Closed)
Patch Set: Add AudioOutputDelegate::Deleter. Created 4 years, 1 month 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 (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 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/audio_renderer_host.h" 5 #include "content/browser/renderer_host/media/audio_renderer_host.h"
6 6
7 #include <stdint.h> 7 #include <stdint.h>
8 8
9 #include <memory> 9 #include <memory>
10 10
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after
94 set_render_frame_id_validate_function_for_testing(&ValidateRenderFrameId); 94 set_render_frame_id_validate_function_for_testing(&ValidateRenderFrameId);
95 } 95 }
96 96
97 // A list of mock methods. 97 // A list of mock methods.
98 MOCK_METHOD0(ShutdownForBadMessage, void()); 98 MOCK_METHOD0(ShutdownForBadMessage, void());
99 MOCK_METHOD4(OnDeviceAuthorized, 99 MOCK_METHOD4(OnDeviceAuthorized,
100 void(int stream_id, 100 void(int stream_id,
101 media::OutputDeviceStatus device_status, 101 media::OutputDeviceStatus device_status,
102 const media::AudioParameters& output_params, 102 const media::AudioParameters& output_params,
103 const std::string& matched_device_id)); 103 const std::string& matched_device_id));
104 MOCK_METHOD2(OnStreamCreated, void(int stream_id, int length)); 104 MOCK_METHOD2(WasNotifiedOfCreation, void(int stream_id, int length));
105 MOCK_METHOD1(OnStreamError, void(int stream_id)); 105 MOCK_METHOD1(WasNotifiedOfStreamCreation, void(int stream_id));
o1ka 2016/10/27 09:52:39 This pair of names looks strange: what's the diffe
Max Morin 2016/10/27 15:04:38 I messed them up, the second one is supposed to be
106 106
107 private: 107 private:
108 virtual ~MockAudioRendererHost() { 108 virtual ~MockAudioRendererHost() {
109 // Make sure all audio streams have been deleted. 109 // Make sure all audio streams have been deleted.
110 EXPECT_TRUE(audio_entries_.empty()); 110 EXPECT_TRUE(delegates_.empty());
111 } 111 }
112 112
113 // This method is used to dispatch IPC messages to the renderer. We intercept 113 // This method is used to dispatch IPC messages to the renderer. We intercept
114 // these messages here and dispatch to our mock methods to verify the 114 // these messages here and dispatch to our mock methods to verify the
115 // conversation between this object and the renderer. 115 // conversation between this object and the renderer.
116 // Note: this means that file descriptors won't be duplicated, 116 // Note: this means that file descriptors won't be duplicated,
117 // leading to double-close errors from SyncSocket. 117 // leading to double-close errors from SyncSocket.
118 // See crbug.com/647659. 118 // See crbug.com/647659.
119 virtual bool Send(IPC::Message* message) { 119 virtual bool Send(IPC::Message* message) {
120 CHECK(message); 120 CHECK(message);
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
155 CHECK(shared_memory_->Map(length)); 155 CHECK(shared_memory_->Map(length));
156 CHECK(shared_memory_->memory()); 156 CHECK(shared_memory_->memory());
157 shared_memory_length_ = length; 157 shared_memory_length_ = length;
158 158
159 // Create the SyncSocket using the handle. 159 // Create the SyncSocket using the handle.
160 base::SyncSocket::Handle sync_socket_handle = 160 base::SyncSocket::Handle sync_socket_handle =
161 base::SyncSocket::UnwrapHandle(socket_descriptor); 161 base::SyncSocket::UnwrapHandle(socket_descriptor);
162 sync_socket_.reset(new base::SyncSocket(sync_socket_handle)); 162 sync_socket_.reset(new base::SyncSocket(sync_socket_handle));
163 163
164 // And then delegate the call to the mock method. 164 // And then delegate the call to the mock method.
165 OnStreamCreated(stream_id, length); 165 WasNotifiedOfCreation(stream_id, length);
166 } 166 }
167 167
168 void OnNotifyStreamError(int stream_id) { OnStreamError(stream_id); } 168 void OnNotifyStreamError(int stream_id) {
169 WasNotifiedOfStreamCreation(stream_id);
o1ka 2016/10/27 09:52:39 Do not quite get it: why notified of stream creati
Max Morin 2016/10/27 15:04:38 Typo :)
170 }
169 171
170 std::unique_ptr<base::SharedMemory> shared_memory_; 172 std::unique_ptr<base::SharedMemory> shared_memory_;
171 std::unique_ptr<base::SyncSocket> sync_socket_; 173 std::unique_ptr<base::SyncSocket> sync_socket_;
172 uint32_t shared_memory_length_; 174 uint32_t shared_memory_length_;
173 base::RunLoop* auth_run_loop_; // Used to wait for authorization. 175 base::RunLoop* auth_run_loop_; // Used to wait for authorization.
174 176
175 DISALLOW_COPY_AND_ASSIGN(MockAudioRendererHost); 177 DISALLOW_COPY_AND_ASSIGN(MockAudioRendererHost);
176 }; 178 };
177 179
178 class AudioRendererHostTest : public testing::Test { 180 class AudioRendererHostTest : public testing::Test {
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
218 device_id == kDefaultDeviceId 220 device_id == kDefaultDeviceId
219 ? media::OUTPUT_DEVICE_STATUS_OK 221 ? media::OUTPUT_DEVICE_STATUS_OK
220 : device_id == kBadDeviceId 222 : device_id == kBadDeviceId
221 ? media::OUTPUT_DEVICE_STATUS_ERROR_NOT_AUTHORIZED 223 ? media::OUTPUT_DEVICE_STATUS_ERROR_NOT_AUTHORIZED
222 : media::OUTPUT_DEVICE_STATUS_ERROR_NOT_FOUND; 224 : media::OUTPUT_DEVICE_STATUS_ERROR_NOT_FOUND;
223 225
224 EXPECT_CALL(*host_.get(), 226 EXPECT_CALL(*host_.get(),
225 OnDeviceAuthorized(kStreamId, expected_device_status, _, _)); 227 OnDeviceAuthorized(kStreamId, expected_device_status, _, _));
226 228
227 if (expected_device_status == media::OUTPUT_DEVICE_STATUS_OK) { 229 if (expected_device_status == media::OUTPUT_DEVICE_STATUS_OK) {
228 EXPECT_CALL(*host_.get(), OnStreamCreated(kStreamId, _)); 230 EXPECT_CALL(*host_.get(), WasNotifiedOfCreation(kStreamId, _));
229 EXPECT_CALL(mirroring_manager_, 231 EXPECT_CALL(mirroring_manager_,
230 AddDiverter(kRenderProcessId, kRenderFrameId, NotNull())) 232 AddDiverter(kRenderProcessId, kRenderFrameId, NotNull()))
231 .RetiresOnSaturation(); 233 .RetiresOnSaturation();
232 } 234 }
233 235
234 // Send a create stream message to the audio output stream and wait until 236 // Send a create stream message to the audio output stream and wait until
235 // we receive the created message. 237 // we receive the created message.
236 media::AudioParameters params( 238 media::AudioParameters params(
237 media::AudioParameters::AUDIO_FAKE, media::CHANNEL_LAYOUT_STEREO, 239 media::AudioParameters::AUDIO_FAKE, media::CHANNEL_LAYOUT_STEREO,
238 media::AudioParameters::kAudioCDSampleRate, 16, 240 media::AudioParameters::kAudioCDSampleRate, 16,
(...skipping 29 matching lines...) Expand all
268 SyncWithAudioThread(); 270 SyncWithAudioThread();
269 } 271 }
270 272
271 void CreateWithoutWaitingForAuth(const std::string& device_id) { 273 void CreateWithoutWaitingForAuth(const std::string& device_id) {
272 Create(false, device_id, url::Origin(GURL(kSecurityOrigin)), false); 274 Create(false, device_id, url::Origin(GURL(kSecurityOrigin)), false);
273 } 275 }
274 276
275 void CreateWithInvalidRenderFrameId() { 277 void CreateWithInvalidRenderFrameId() {
276 // When creating a stream with an invalid render frame ID, the host will 278 // When creating a stream with an invalid render frame ID, the host will
277 // reply with a stream error message. 279 // reply with a stream error message.
278 EXPECT_CALL(*host_, OnStreamError(kStreamId)); 280 EXPECT_CALL(*host_, WasNotifiedOfStreamCreation(kStreamId));
279 281
280 // However, validation does not block stream creation, so these method calls 282 // However, validation does not block stream creation, so these method calls
281 // might be made: 283 // might be made:
282 EXPECT_CALL(*host_, OnStreamCreated(kStreamId, _)).Times(AtLeast(0)); 284 EXPECT_CALL(*host_, WasNotifiedOfCreation(kStreamId, _)).Times(AtLeast(0));
283 EXPECT_CALL(mirroring_manager_, AddDiverter(_, _, _)).Times(AtLeast(0)); 285 EXPECT_CALL(mirroring_manager_, AddDiverter(_, _, _)).Times(AtLeast(0));
284 EXPECT_CALL(mirroring_manager_, RemoveDiverter(_)).Times(AtLeast(0)); 286 EXPECT_CALL(mirroring_manager_, RemoveDiverter(_)).Times(AtLeast(0));
285 287
286 // Provide a seemingly-valid render frame ID; and it should be rejected when 288 // Provide a seemingly-valid render frame ID; and it should be rejected when
287 // AudioRendererHost calls ValidateRenderFrameId(). 289 // AudioRendererHost calls ValidateRenderFrameId().
288 const int kInvalidRenderFrameId = kRenderFrameId + 1; 290 const int kInvalidRenderFrameId = kRenderFrameId + 1;
289 const media::AudioParameters params( 291 const media::AudioParameters params(
290 media::AudioParameters::AUDIO_FAKE, media::CHANNEL_LAYOUT_STEREO, 292 media::AudioParameters::AUDIO_FAKE, media::CHANNEL_LAYOUT_STEREO,
291 media::AudioParameters::kAudioCDSampleRate, 16, 293 media::AudioParameters::kAudioCDSampleRate, 16,
292 media::AudioParameters::kAudioCDSampleRate / 10); 294 media::AudioParameters::kAudioCDSampleRate / 10);
(...skipping 17 matching lines...) Expand all
310 host_->OnPauseStream(kStreamId); 312 host_->OnPauseStream(kStreamId);
311 SyncWithAudioThread(); 313 SyncWithAudioThread();
312 } 314 }
313 315
314 void SetVolume(double volume) { 316 void SetVolume(double volume) {
315 host_->OnSetVolume(kStreamId, volume); 317 host_->OnSetVolume(kStreamId, volume);
316 SyncWithAudioThread(); 318 SyncWithAudioThread();
317 } 319 }
318 320
319 void SimulateError() { 321 void SimulateError() {
320 EXPECT_EQ(1u, host_->audio_entries_.size()) 322 EXPECT_EQ(1u, host_->delegates_.size())
321 << "Calls Create() before calling this method"; 323 << "Calls Create() before calling this method";
322 324
323 // Expect an error signal sent through IPC. 325 // Expect an error signal sent through IPC.
324 EXPECT_CALL(*host_.get(), OnStreamError(kStreamId)); 326 EXPECT_CALL(*host_.get(), WasNotifiedOfStreamCreation(kStreamId));
325 327
326 // Simulate an error sent from the audio device. 328 // Simulate an error sent from the audio device.
327 host_->ReportErrorAndClose(kStreamId); 329 host_->OnStreamError(kStreamId);
328 SyncWithAudioThread(); 330 SyncWithAudioThread();
329 331
330 // Expect the audio stream record is removed. 332 // Expect the audio stream record is removed.
331 EXPECT_EQ(0u, host_->audio_entries_.size()); 333 EXPECT_EQ(0u, host_->delegates_.size());
332 } 334 }
333 335
334 // SyncWithAudioThread() waits until all pending tasks on the audio thread 336 // SyncWithAudioThread() waits until all pending tasks on the audio thread
335 // are executed while also processing pending task in message_loop_ on the 337 // are executed while also processing pending task in message_loop_ on the
336 // current thread. It is used to synchronize with the audio thread when we are 338 // current thread. It is used to synchronize with the audio thread when we are
337 // closing an audio stream. 339 // closing an audio stream.
338 void SyncWithAudioThread() { 340 void SyncWithAudioThread() {
339 base::RunLoop().RunUntilIdle(); 341 base::RunLoop().RunUntilIdle();
340 342
341 base::RunLoop run_loop; 343 base::RunLoop run_loop;
(...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after
449 } 451 }
450 452
451 TEST_F(AudioRendererHostTest, CreateFailsForInvalidRenderFrame) { 453 TEST_F(AudioRendererHostTest, CreateFailsForInvalidRenderFrame) {
452 CreateWithInvalidRenderFrameId(); 454 CreateWithInvalidRenderFrameId();
453 Close(); 455 Close();
454 } 456 }
455 457
456 // TODO(hclam): Add tests for data conversation in low latency mode. 458 // TODO(hclam): Add tests for data conversation in low latency mode.
457 459
458 } // namespace content 460 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698