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

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

Issue 81953002: Remove MockMediaInternals and incestuous usage. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Fix shutdown. Created 7 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 | Annotate | Revision Log
« no previous file with comments | « no previous file | content/browser/renderer_host/media/mock_media_observer.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 "base/bind.h" 5 #include "base/bind.h"
6 #include "base/environment.h"
7 #include "base/memory/scoped_ptr.h" 6 #include "base/memory/scoped_ptr.h"
8 #include "base/message_loop/message_loop.h" 7 #include "base/run_loop.h"
9 #include "base/sync_socket.h" 8 #include "base/sync_socket.h"
10 #include "content/browser/browser_thread_impl.h" 9 #include "content/browser/media/media_internals.h"
11 #include "content/browser/renderer_host/media/audio_input_device_manager.h" 10 #include "content/browser/renderer_host/media/audio_input_device_manager.h"
12 #include "content/browser/renderer_host/media/audio_mirroring_manager.h" 11 #include "content/browser/renderer_host/media/audio_mirroring_manager.h"
13 #include "content/browser/renderer_host/media/audio_renderer_host.h" 12 #include "content/browser/renderer_host/media/audio_renderer_host.h"
14 #include "content/browser/renderer_host/media/media_stream_manager.h" 13 #include "content/browser/renderer_host/media/media_stream_manager.h"
15 #include "content/browser/renderer_host/media/mock_media_observer.h"
16 #include "content/common/media/audio_messages.h" 14 #include "content/common/media/audio_messages.h"
17 #include "content/common/media/media_stream_options.h" 15 #include "content/public/test/test_browser_thread_bundle.h"
18 #include "ipc/ipc_message_utils.h" 16 #include "ipc/ipc_message_utils.h"
19 #include "media/audio/audio_manager.h" 17 #include "media/audio/audio_manager.h"
20 #include "media/audio/audio_manager_base.h" 18 #include "media/base/bind_to_loop.h"
21 #include "media/audio/fake_audio_output_stream.h"
22 #include "net/url_request/url_request_context.h"
23 #include "testing/gmock/include/gmock/gmock.h" 19 #include "testing/gmock/include/gmock/gmock.h"
24 #include "testing/gtest/include/gtest/gtest.h" 20 #include "testing/gtest/include/gtest/gtest.h"
25 21
26 using ::testing::_; 22 using ::testing::_;
27 using ::testing::Assign; 23 using ::testing::Assign;
28 using ::testing::DoAll; 24 using ::testing::DoAll;
29 using ::testing::NotNull; 25 using ::testing::NotNull;
30 26
27 namespace {
28 const int kRenderProcessId = 1;
29 const int kRenderViewId = 4;
30 const int kStreamId = 50;
31 } // namespace
32
31 namespace content { 33 namespace content {
32 34
33 static const int kRenderProcessId = 1;
34 static const int kRenderViewId = 4;
35 static const int kStreamId = 50;
36
37 class MockAudioMirroringManager : public AudioMirroringManager { 35 class MockAudioMirroringManager : public AudioMirroringManager {
38 public: 36 public:
39 MockAudioMirroringManager() {} 37 MockAudioMirroringManager() {}
40 virtual ~MockAudioMirroringManager() {} 38 virtual ~MockAudioMirroringManager() {}
41 39
42 MOCK_METHOD3(AddDiverter, 40 MOCK_METHOD3(AddDiverter,
43 void(int render_process_id, int render_view_id, 41 void(int render_process_id,
42 int render_view_id,
44 Diverter* diverter)); 43 Diverter* diverter));
45 MOCK_METHOD3(RemoveDiverter, 44 MOCK_METHOD3(RemoveDiverter,
46 void(int render_process_id, int render_view_id, 45 void(int render_process_id,
46 int render_view_id,
47 Diverter* diverter)); 47 Diverter* diverter));
48 48
49 private: 49 private:
50 DISALLOW_COPY_AND_ASSIGN(MockAudioMirroringManager); 50 DISALLOW_COPY_AND_ASSIGN(MockAudioMirroringManager);
51 }; 51 };
52 52
53 class MockAudioRendererHost : public AudioRendererHost { 53 class MockAudioRendererHost : public AudioRendererHost {
54 public: 54 public:
55 explicit MockAudioRendererHost( 55 MockAudioRendererHost(media::AudioManager* audio_manager,
56 media::AudioManager* audio_manager, 56 AudioMirroringManager* mirroring_manager,
57 AudioMirroringManager* mirroring_manager, 57 MediaInternals* media_internals,
58 MediaInternals* media_internals, 58 MediaStreamManager* media_stream_manager)
59 MediaStreamManager* media_stream_manager)
60 : AudioRendererHost(kRenderProcessId, 59 : AudioRendererHost(kRenderProcessId,
61 audio_manager, 60 audio_manager,
62 mirroring_manager, 61 mirroring_manager,
63 media_internals, 62 media_internals,
64 media_stream_manager), 63 media_stream_manager),
65 shared_memory_length_(0) { 64 shared_memory_length_(0) {}
66 }
67 65
68 // A list of mock methods. 66 // A list of mock methods.
69 MOCK_METHOD2(OnStreamCreated, 67 MOCK_METHOD2(OnStreamCreated, void(int stream_id, int length));
70 void(int stream_id, int length));
71 MOCK_METHOD1(OnStreamPlaying, void(int stream_id)); 68 MOCK_METHOD1(OnStreamPlaying, void(int stream_id));
72 MOCK_METHOD1(OnStreamPaused, void(int stream_id)); 69 MOCK_METHOD1(OnStreamPaused, void(int stream_id));
73 MOCK_METHOD1(OnStreamError, void(int stream_id)); 70 MOCK_METHOD1(OnStreamError, void(int stream_id));
74 71
75 private: 72 private:
76 virtual ~MockAudioRendererHost() { 73 virtual ~MockAudioRendererHost() {
77 // Make sure all audio streams have been deleted. 74 // Make sure all audio streams have been deleted.
78 EXPECT_TRUE(audio_entries_.empty()); 75 EXPECT_TRUE(audio_entries_.empty());
79 } 76 }
80 77
(...skipping 12 matching lines...) Expand all
93 IPC_MESSAGE_HANDLER(AudioMsg_NotifyStreamStateChanged, 90 IPC_MESSAGE_HANDLER(AudioMsg_NotifyStreamStateChanged,
94 OnStreamStateChanged) 91 OnStreamStateChanged)
95 IPC_MESSAGE_UNHANDLED(handled = false) 92 IPC_MESSAGE_UNHANDLED(handled = false)
96 IPC_END_MESSAGE_MAP() 93 IPC_END_MESSAGE_MAP()
97 EXPECT_TRUE(handled); 94 EXPECT_TRUE(handled);
98 95
99 delete message; 96 delete message;
100 return true; 97 return true;
101 } 98 }
102 99
103 void OnStreamCreated(const IPC::Message& msg, int stream_id, 100 void OnStreamCreated(const IPC::Message& msg,
101 int stream_id,
104 base::SharedMemoryHandle handle, 102 base::SharedMemoryHandle handle,
105 #if defined(OS_WIN) 103 #if defined(OS_WIN)
106 base::SyncSocket::Handle socket_handle, 104 base::SyncSocket::Handle socket_handle,
107 #else 105 #else
108 base::FileDescriptor socket_descriptor, 106 base::FileDescriptor socket_descriptor,
109 #endif 107 #endif
110 uint32 length) { 108 uint32 length) {
111 // Maps the shared memory. 109 // Maps the shared memory.
112 shared_memory_.reset(new base::SharedMemory(handle, false)); 110 shared_memory_.reset(new base::SharedMemory(handle, false));
113 CHECK(shared_memory_->Map(length)); 111 CHECK(shared_memory_->Map(length));
114 CHECK(shared_memory_->memory()); 112 CHECK(shared_memory_->memory());
115 shared_memory_length_ = length; 113 shared_memory_length_ = length;
116 114
117 // Create the SyncSocket using the handle. 115 // Create the SyncSocket using the handle.
118 base::SyncSocket::Handle sync_socket_handle; 116 base::SyncSocket::Handle sync_socket_handle;
119 #if defined(OS_WIN) 117 #if defined(OS_WIN)
120 sync_socket_handle = socket_handle; 118 sync_socket_handle = socket_handle;
121 #else 119 #else
122 sync_socket_handle = socket_descriptor.fd; 120 sync_socket_handle = socket_descriptor.fd;
123 #endif 121 #endif
124 sync_socket_.reset(new base::SyncSocket(sync_socket_handle)); 122 sync_socket_.reset(new base::SyncSocket(sync_socket_handle));
125 123
126 // And then delegate the call to the mock method. 124 // And then delegate the call to the mock method.
127 OnStreamCreated(stream_id, length); 125 OnStreamCreated(stream_id, length);
128 } 126 }
129 127
130 void OnStreamStateChanged(const IPC::Message& msg, int stream_id, 128 void OnStreamStateChanged(const IPC::Message& msg,
129 int stream_id,
131 media::AudioOutputIPCDelegate::State state) { 130 media::AudioOutputIPCDelegate::State state) {
132 switch (state) { 131 switch (state) {
133 case media::AudioOutputIPCDelegate::kPlaying: 132 case media::AudioOutputIPCDelegate::kPlaying:
134 OnStreamPlaying(stream_id); 133 OnStreamPlaying(stream_id);
135 break; 134 break;
136 case media::AudioOutputIPCDelegate::kPaused: 135 case media::AudioOutputIPCDelegate::kPaused:
137 OnStreamPaused(stream_id); 136 OnStreamPaused(stream_id);
138 break; 137 break;
139 case media::AudioOutputIPCDelegate::kError: 138 case media::AudioOutputIPCDelegate::kError:
140 OnStreamError(stream_id); 139 OnStreamError(stream_id);
141 break; 140 break;
142 default: 141 default:
143 FAIL() << "Unknown stream state"; 142 FAIL() << "Unknown stream state";
144 break; 143 break;
145 } 144 }
146 } 145 }
147 146
148 scoped_ptr<base::SharedMemory> shared_memory_; 147 scoped_ptr<base::SharedMemory> shared_memory_;
149 scoped_ptr<base::SyncSocket> sync_socket_; 148 scoped_ptr<base::SyncSocket> sync_socket_;
150 uint32 shared_memory_length_; 149 uint32 shared_memory_length_;
151 150
152 DISALLOW_COPY_AND_ASSIGN(MockAudioRendererHost); 151 DISALLOW_COPY_AND_ASSIGN(MockAudioRendererHost);
153 }; 152 };
154 153
155 ACTION_P(QuitMessageLoop, message_loop) {
156 message_loop->PostTask(FROM_HERE, base::MessageLoop::QuitClosure());
157 }
158
159 class AudioRendererHostTest : public testing::Test { 154 class AudioRendererHostTest : public testing::Test {
160 public: 155 public:
161 AudioRendererHostTest() : is_stream_active_(false) {} 156 AudioRendererHostTest() {
162
163 protected:
164 virtual void SetUp() {
165 // Create a message loop so AudioRendererHost can use it.
166 message_loop_.reset(new base::MessageLoop(base::MessageLoop::TYPE_IO));
167
168 // Claim to be on both the UI and IO threads to pass all the DCHECKS.
169 io_thread_.reset(new BrowserThreadImpl(BrowserThread::IO,
170 message_loop_.get()));
171 ui_thread_.reset(new BrowserThreadImpl(BrowserThread::UI,
172 message_loop_.get()));
173 audio_manager_.reset(media::AudioManager::Create()); 157 audio_manager_.reset(media::AudioManager::Create());
174 media_stream_manager_.reset(new MediaStreamManager(audio_manager_.get())); 158 media_stream_manager_.reset(new MediaStreamManager(audio_manager_.get()));
175 media_stream_manager_->UseFakeDevice(); 159 media_stream_manager_->UseFakeDevice();
176 observer_.reset(new MockMediaInternals()); 160 host_ = new MockAudioRendererHost(audio_manager_.get(),
177 host_ = new MockAudioRendererHost( 161 &mirroring_manager_,
178 audio_manager_.get(), &mirroring_manager_, observer_.get(), 162 MediaInternals::GetInstance(),
179 media_stream_manager_.get()); 163 media_stream_manager_.get());
180 164
181 // Simulate IPC channel connected. 165 // Simulate IPC channel connected.
182 host_->set_peer_pid_for_testing(base::GetCurrentProcId()); 166 host_->set_peer_pid_for_testing(base::GetCurrentProcId());
183 } 167 }
184 168
185 virtual void TearDown() { 169 virtual ~AudioRendererHostTest() {
186 // Simulate closing the IPC channel. 170 // Simulate closing the IPC channel and give the audio thread time to close
171 // the underlying streams.
187 host_->OnChannelClosing(); 172 host_->OnChannelClosing();
173 SyncWithAudioThread();
188 174
189 // Release the reference to the mock object. The object will be destructed 175 // Release the reference to the mock object. The object will be destructed
190 // on message_loop_. 176 // on message_loop_.
191 host_ = NULL; 177 host_ = NULL;
192
193 // We need to continue running message_loop_ to complete all destructions.
194 SyncWithAudioThread();
195 audio_manager_.reset();
196
197 // Make sure the stream has been deleted before continuing.
198 while (is_stream_active_)
199 message_loop_->Run();
200
201 io_thread_.reset();
202 ui_thread_.reset();
203
204 // Delete the IO message loop. This will cause the MediaStreamManager to be
205 // notified so it will stop its device thread and device managers.
206 message_loop_.reset();
207 } 178 }
208 179
180 protected:
209 void Create(bool unified_stream) { 181 void Create(bool unified_stream) {
210 EXPECT_CALL(*host_.get(), OnStreamCreated(kStreamId, _)) 182 EXPECT_CALL(*host_.get(), OnStreamCreated(kStreamId, _));
211 .WillOnce(DoAll(Assign(&is_stream_active_, true), 183
212 QuitMessageLoop(message_loop_.get())));
213 EXPECT_CALL(mirroring_manager_, 184 EXPECT_CALL(mirroring_manager_,
214 AddDiverter(kRenderProcessId, kRenderViewId, NotNull())) 185 AddDiverter(kRenderProcessId, kRenderViewId, NotNull()))
215 .RetiresOnSaturation(); 186 .RetiresOnSaturation();
216 187
217 // Send a create stream message to the audio output stream and wait until 188 // Send a create stream message to the audio output stream and wait until
218 // we receive the created message. 189 // we receive the created message.
219 int session_id; 190 int session_id;
220 media::AudioParameters params; 191 media::AudioParameters params;
221 if (unified_stream) { 192 if (unified_stream) {
222 // Use AudioInputDeviceManager::kFakeOpenSessionId as the session id to 193 // Use AudioInputDeviceManager::kFakeOpenSessionId as the session id to
223 // pass the permission check. 194 // pass the permission check.
224 session_id = AudioInputDeviceManager::kFakeOpenSessionId; 195 session_id = AudioInputDeviceManager::kFakeOpenSessionId;
225 params = media::AudioParameters( 196 params = media::AudioParameters(
226 media::AudioParameters::AUDIO_FAKE, 197 media::AudioParameters::AUDIO_FAKE,
227 media::CHANNEL_LAYOUT_STEREO, 198 media::CHANNEL_LAYOUT_STEREO,
228 2, 199 2,
229 media::AudioParameters::kAudioCDSampleRate, 16, 200 media::AudioParameters::kAudioCDSampleRate, 16,
230 media::AudioParameters::kAudioCDSampleRate / 10); 201 media::AudioParameters::kAudioCDSampleRate / 10);
231 } else { 202 } else {
232 session_id = 0; 203 session_id = 0;
233 params = media::AudioParameters( 204 params = media::AudioParameters(
234 media::AudioParameters::AUDIO_FAKE, 205 media::AudioParameters::AUDIO_FAKE,
235 media::CHANNEL_LAYOUT_STEREO, 206 media::CHANNEL_LAYOUT_STEREO,
236 media::AudioParameters::kAudioCDSampleRate, 16, 207 media::AudioParameters::kAudioCDSampleRate, 16,
237 media::AudioParameters::kAudioCDSampleRate / 10); 208 media::AudioParameters::kAudioCDSampleRate / 10);
238 } 209 }
239 host_->OnCreateStream(kStreamId, kRenderViewId, session_id, params); 210 host_->OnCreateStream(kStreamId, kRenderViewId, session_id, params);
240 message_loop_->Run();
241 211
242 // At some point in the future, a corresponding RemoveDiverter() call must 212 // At some point in the future, a corresponding RemoveDiverter() call must
243 // be made. 213 // be made.
244 EXPECT_CALL(mirroring_manager_, 214 EXPECT_CALL(mirroring_manager_,
245 RemoveDiverter(kRenderProcessId, kRenderViewId, NotNull())) 215 RemoveDiverter(kRenderProcessId, kRenderViewId, NotNull()))
246 .RetiresOnSaturation(); 216 .RetiresOnSaturation();
247 217 SyncWithAudioThread();
248 // All created streams should ultimately be closed.
249 EXPECT_CALL(*observer_,
250 OnSetAudioStreamStatus(_, kStreamId, "closed"));
251
252 // Expect the audio stream will be deleted at some later point.
253 EXPECT_CALL(*observer_, OnDeleteAudioStream(_, kStreamId))
254 .WillOnce(DoAll(Assign(&is_stream_active_, false),
255 QuitMessageLoop(message_loop_.get())));
256 } 218 }
257 219
258 void Close() { 220 void Close() {
259 // Send a message to AudioRendererHost to tell it we want to close the 221 // Send a message to AudioRendererHost to tell it we want to close the
260 // stream. 222 // stream.
261 host_->OnCloseStream(kStreamId); 223 host_->OnCloseStream(kStreamId);
262 if (is_stream_active_) 224 SyncWithAudioThread();
263 message_loop_->Run();
264 else
265 message_loop_->RunUntilIdle();
266 } 225 }
267 226
268 void Play() { 227 void Play() {
269 EXPECT_CALL(*observer_, 228 EXPECT_CALL(*host_.get(), OnStreamPlaying(kStreamId));
270 OnSetAudioStreamPlaying(_, kStreamId, true));
271 EXPECT_CALL(*host_.get(), OnStreamPlaying(kStreamId))
272 .WillOnce(QuitMessageLoop(message_loop_.get()));
273
274 host_->OnPlayStream(kStreamId); 229 host_->OnPlayStream(kStreamId);
275 message_loop_->Run(); 230 SyncWithAudioThread();
276 } 231 }
277 232
278 void Pause() { 233 void Pause() {
279 EXPECT_CALL(*observer_, 234 EXPECT_CALL(*host_.get(), OnStreamPaused(kStreamId));
280 OnSetAudioStreamPlaying(_, kStreamId, false));
281 EXPECT_CALL(*host_.get(), OnStreamPaused(kStreamId))
282 .WillOnce(QuitMessageLoop(message_loop_.get()));
283
284 host_->OnPauseStream(kStreamId); 235 host_->OnPauseStream(kStreamId);
285 message_loop_->Run(); 236 SyncWithAudioThread();
286 } 237 }
287 238
288 void SetVolume(double volume) { 239 void SetVolume(double volume) {
289 EXPECT_CALL(*observer_,
290 OnSetAudioStreamVolume(_, kStreamId, volume));
291
292 host_->OnSetVolume(kStreamId, volume); 240 host_->OnSetVolume(kStreamId, volume);
293 message_loop_->RunUntilIdle(); 241 SyncWithAudioThread();
294 } 242 }
295 243
296 void SimulateError() { 244 void SimulateError() {
297 EXPECT_CALL(*observer_,
298 OnSetAudioStreamStatus(_, kStreamId, "error"));
299 EXPECT_EQ(1u, host_->audio_entries_.size()) 245 EXPECT_EQ(1u, host_->audio_entries_.size())
300 << "Calls Create() before calling this method"; 246 << "Calls Create() before calling this method";
301 247
302 // Expect an error signal sent through IPC. 248 // Expect an error signal sent through IPC.
303 EXPECT_CALL(*host_.get(), OnStreamError(kStreamId)); 249 EXPECT_CALL(*host_.get(), OnStreamError(kStreamId));
304 250
305 // Simulate an error sent from the audio device. 251 // Simulate an error sent from the audio device.
306 host_->ReportErrorAndClose(kStreamId); 252 host_->ReportErrorAndClose(kStreamId);
307 SyncWithAudioThread(); 253 SyncWithAudioThread();
308 254
309 // Expect the audio stream record is removed. 255 // Expect the audio stream record is removed.
310 EXPECT_EQ(0u, host_->audio_entries_.size()); 256 EXPECT_EQ(0u, host_->audio_entries_.size());
311 } 257 }
312 258
313 // Called on the audio thread.
314 static void PostQuitMessageLoop(base::MessageLoop* message_loop) {
315 message_loop->PostTask(FROM_HERE, base::MessageLoop::QuitClosure());
316 }
317
318 // Called on the main thread.
319 static void PostQuitOnAudioThread(media::AudioManager* audio_manager,
320 base::MessageLoop* message_loop) {
321 audio_manager->GetMessageLoop()->PostTask(FROM_HERE,
322 base::Bind(&PostQuitMessageLoop, message_loop));
323 }
324
325 // SyncWithAudioThread() waits until all pending tasks on the audio thread 259 // SyncWithAudioThread() waits until all pending tasks on the audio thread
326 // are executed while also processing pending task in message_loop_ on the 260 // are executed while also processing pending task in message_loop_ on the
327 // current thread. It is used to synchronize with the audio thread when we are 261 // current thread. It is used to synchronize with the audio thread when we are
328 // closing an audio stream. 262 // closing an audio stream.
329 void SyncWithAudioThread() { 263 void SyncWithAudioThread() {
330 // Don't use scoped_refptr to addref the media::AudioManager when posting 264 base::RunLoop().RunUntilIdle();
331 // to the thread that itself owns. 265
332 message_loop_->PostTask( 266 base::RunLoop run_loop;
333 FROM_HERE, base::Bind(&PostQuitOnAudioThread, 267 audio_manager_->GetMessageLoop()->PostTask(
334 base::Unretained(audio_manager_.get()), 268 FROM_HERE, media::BindToCurrentLoop(run_loop.QuitClosure()));
335 message_loop_.get())); 269 run_loop.Run();
336 message_loop_->Run();
337 } 270 }
338 271
339 private: 272 private:
340 scoped_ptr<MockMediaInternals> observer_; 273 // MediaStreamManager uses a DestructionObserver, so it must outlive the
274 // TestBrowserThreadBundle.
275 scoped_ptr<MediaStreamManager> media_stream_manager_;
276 TestBrowserThreadBundle thread_bundle_;
277 scoped_ptr<media::AudioManager> audio_manager_;
341 MockAudioMirroringManager mirroring_manager_; 278 MockAudioMirroringManager mirroring_manager_;
342 scoped_refptr<MockAudioRendererHost> host_; 279 scoped_refptr<MockAudioRendererHost> host_;
343 scoped_ptr<base::MessageLoop> message_loop_;
344 scoped_ptr<BrowserThreadImpl> io_thread_;
345 scoped_ptr<BrowserThreadImpl> ui_thread_;
346 scoped_ptr<media::AudioManager> audio_manager_;
347 scoped_ptr<MediaStreamManager> media_stream_manager_;
348
349 bool is_stream_active_;
350 280
351 DISALLOW_COPY_AND_ASSIGN(AudioRendererHostTest); 281 DISALLOW_COPY_AND_ASSIGN(AudioRendererHostTest);
352 }; 282 };
353 283
354 TEST_F(AudioRendererHostTest, CreateAndClose) { 284 TEST_F(AudioRendererHostTest, CreateAndClose) {
355 Create(false); 285 Create(false);
356 Close(); 286 Close();
357 } 287 }
358 288
359 // Simulate the case where a stream is not properly closed. 289 // Simulate the case where a stream is not properly closed.
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after
412 } 342 }
413 343
414 TEST_F(AudioRendererHostTest, CreateUnifiedStreamAndClose) { 344 TEST_F(AudioRendererHostTest, CreateUnifiedStreamAndClose) {
415 Create(true); 345 Create(true);
416 Close(); 346 Close();
417 } 347 }
418 348
419 // TODO(hclam): Add tests for data conversation in low latency mode. 349 // TODO(hclam): Add tests for data conversation in low latency mode.
420 350
421 } // namespace content 351 } // namespace content
OLDNEW
« no previous file with comments | « no previous file | content/browser/renderer_host/media/mock_media_observer.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698