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

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: Polish. Created 7 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 | Annotate | Revision Log
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 explicit MockAudioRendererHost(media::AudioManager* audio_manager,
tommi (sloooow) - chröme 2013/11/22 11:55:31 no need for explicit
DaleCurtis 2013/11/22 20:33:33 Done.
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.
187 host_->OnChannelClosing(); 171 host_->OnChannelClosing();
188 172
189 // Release the reference to the mock object. The object will be destructed 173 // Release the reference to the mock object. The object will be destructed
190 // on message_loop_. 174 // on message_loop_.
191 host_ = NULL; 175 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 } 176 }
208 177
178 protected:
209 void Create(bool unified_stream) { 179 void Create(bool unified_stream) {
210 EXPECT_CALL(*host_.get(), OnStreamCreated(kStreamId, _)) 180 EXPECT_CALL(*host_.get(), OnStreamCreated(kStreamId, _));
211 .WillOnce(DoAll(Assign(&is_stream_active_, true), 181
212 QuitMessageLoop(message_loop_.get())));
213 EXPECT_CALL(mirroring_manager_, 182 EXPECT_CALL(mirroring_manager_,
214 AddDiverter(kRenderProcessId, kRenderViewId, NotNull())) 183 AddDiverter(kRenderProcessId, kRenderViewId, NotNull()))
215 .RetiresOnSaturation(); 184 .RetiresOnSaturation();
216 185
217 // Send a create stream message to the audio output stream and wait until 186 // Send a create stream message to the audio output stream and wait until
218 // we receive the created message. 187 // we receive the created message.
219 int session_id; 188 int session_id;
220 media::AudioParameters params; 189 media::AudioParameters params;
221 if (unified_stream) { 190 if (unified_stream) {
222 // Use AudioInputDeviceManager::kFakeOpenSessionId as the session id to 191 // Use AudioInputDeviceManager::kFakeOpenSessionId as the session id to
223 // pass the permission check. 192 // pass the permission check.
224 session_id = AudioInputDeviceManager::kFakeOpenSessionId; 193 session_id = AudioInputDeviceManager::kFakeOpenSessionId;
225 params = media::AudioParameters( 194 params = media::AudioParameters(
226 media::AudioParameters::AUDIO_FAKE, 195 media::AudioParameters::AUDIO_FAKE,
227 media::CHANNEL_LAYOUT_STEREO, 196 media::CHANNEL_LAYOUT_STEREO,
228 2, 197 2,
229 media::AudioParameters::kAudioCDSampleRate, 16, 198 media::AudioParameters::kAudioCDSampleRate, 16,
230 media::AudioParameters::kAudioCDSampleRate / 10); 199 media::AudioParameters::kAudioCDSampleRate / 10);
231 } else { 200 } else {
232 session_id = 0; 201 session_id = 0;
233 params = media::AudioParameters( 202 params = media::AudioParameters(
234 media::AudioParameters::AUDIO_FAKE, 203 media::AudioParameters::AUDIO_FAKE,
235 media::CHANNEL_LAYOUT_STEREO, 204 media::CHANNEL_LAYOUT_STEREO,
236 media::AudioParameters::kAudioCDSampleRate, 16, 205 media::AudioParameters::kAudioCDSampleRate, 16,
237 media::AudioParameters::kAudioCDSampleRate / 10); 206 media::AudioParameters::kAudioCDSampleRate / 10);
238 } 207 }
239 host_->OnCreateStream(kStreamId, kRenderViewId, session_id, params); 208 host_->OnCreateStream(kStreamId, kRenderViewId, session_id, params);
240 message_loop_->Run();
241 209
242 // At some point in the future, a corresponding RemoveDiverter() call must 210 // At some point in the future, a corresponding RemoveDiverter() call must
243 // be made. 211 // be made.
244 EXPECT_CALL(mirroring_manager_, 212 EXPECT_CALL(mirroring_manager_,
245 RemoveDiverter(kRenderProcessId, kRenderViewId, NotNull())) 213 RemoveDiverter(kRenderProcessId, kRenderViewId, NotNull()))
246 .RetiresOnSaturation(); 214 .RetiresOnSaturation();
247 215 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 } 216 }
257 217
258 void Close() { 218 void Close() {
259 // Send a message to AudioRendererHost to tell it we want to close the 219 // Send a message to AudioRendererHost to tell it we want to close the
260 // stream. 220 // stream.
261 host_->OnCloseStream(kStreamId); 221 host_->OnCloseStream(kStreamId);
262 if (is_stream_active_) 222 SyncWithAudioThread();
263 message_loop_->Run();
264 else
265 message_loop_->RunUntilIdle();
266 } 223 }
267 224
268 void Play() { 225 void Play() {
269 EXPECT_CALL(*observer_, 226 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); 227 host_->OnPlayStream(kStreamId);
275 message_loop_->Run(); 228 SyncWithAudioThread();
276 } 229 }
277 230
278 void Pause() { 231 void Pause() {
279 EXPECT_CALL(*observer_, 232 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); 233 host_->OnPauseStream(kStreamId);
285 message_loop_->Run(); 234 SyncWithAudioThread();
286 } 235 }
287 236
288 void SetVolume(double volume) { 237 void SetVolume(double volume) {
289 EXPECT_CALL(*observer_,
290 OnSetAudioStreamVolume(_, kStreamId, volume));
291
292 host_->OnSetVolume(kStreamId, volume); 238 host_->OnSetVolume(kStreamId, volume);
293 message_loop_->RunUntilIdle(); 239 SyncWithAudioThread();
294 } 240 }
295 241
296 void SimulateError() { 242 void SimulateError() {
297 EXPECT_CALL(*observer_,
298 OnSetAudioStreamStatus(_, kStreamId, "error"));
299 EXPECT_EQ(1u, host_->audio_entries_.size()) 243 EXPECT_EQ(1u, host_->audio_entries_.size())
300 << "Calls Create() before calling this method"; 244 << "Calls Create() before calling this method";
301 245
302 // Expect an error signal sent through IPC. 246 // Expect an error signal sent through IPC.
303 EXPECT_CALL(*host_.get(), OnStreamError(kStreamId)); 247 EXPECT_CALL(*host_.get(), OnStreamError(kStreamId));
304 248
305 // Simulate an error sent from the audio device. 249 // Simulate an error sent from the audio device.
306 host_->ReportErrorAndClose(kStreamId); 250 host_->ReportErrorAndClose(kStreamId);
307 SyncWithAudioThread(); 251 SyncWithAudioThread();
308 252
309 // Expect the audio stream record is removed. 253 // Expect the audio stream record is removed.
310 EXPECT_EQ(0u, host_->audio_entries_.size()); 254 EXPECT_EQ(0u, host_->audio_entries_.size());
311 } 255 }
312 256
313 // Called on the audio thread. 257 // Called on the audio thread.
314 static void PostQuitMessageLoop(base::MessageLoop* message_loop) { 258 static void PostQuitMessageLoop(const base::Closure& quit_closure) {
315 message_loop->PostTask(FROM_HERE, base::MessageLoop::QuitClosure()); 259 quit_closure.Run();
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 } 260 }
324 261
325 // SyncWithAudioThread() waits until all pending tasks on the audio thread 262 // SyncWithAudioThread() waits until all pending tasks on the audio thread
326 // are executed while also processing pending task in message_loop_ on the 263 // 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 264 // current thread. It is used to synchronize with the audio thread when we are
328 // closing an audio stream. 265 // closing an audio stream.
329 void SyncWithAudioThread() { 266 void SyncWithAudioThread() {
330 // Don't use scoped_refptr to addref the media::AudioManager when posting 267 base::RunLoop().RunUntilIdle();
331 // to the thread that itself owns. 268
332 message_loop_->PostTask( 269 base::RunLoop run_loop;
333 FROM_HERE, base::Bind(&PostQuitOnAudioThread, 270 audio_manager_->GetMessageLoop()->PostTask(
334 base::Unretained(audio_manager_.get()), 271 FROM_HERE, media::BindToCurrentLoop(base::Bind(
335 message_loop_.get())); 272 &AudioRendererHostTest::PostQuitMessageLoop,
acolwell GONE FROM CHROMIUM 2013/11/22 19:12:48 Why do you need PostQuitMessageLoop? You should be
DaleCurtis 2013/11/22 20:33:33 Derp. It was left over from a previous incarnation
336 message_loop_->Run(); 273 run_loop.QuitClosure())));
274 run_loop.Run();
337 } 275 }
338 276
339 private: 277 private:
340 scoped_ptr<MockMediaInternals> observer_; 278 // MediaStreamManager uses a DestructionObserver, so it must outlive the
279 // TestBrowserThreadBundle.
280 scoped_ptr<MediaStreamManager> media_stream_manager_;
281 TestBrowserThreadBundle thread_bundle_;
282 scoped_ptr<media::AudioManager> audio_manager_;
341 MockAudioMirroringManager mirroring_manager_; 283 MockAudioMirroringManager mirroring_manager_;
342 scoped_refptr<MockAudioRendererHost> host_; 284 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 285
351 DISALLOW_COPY_AND_ASSIGN(AudioRendererHostTest); 286 DISALLOW_COPY_AND_ASSIGN(AudioRendererHostTest);
352 }; 287 };
353 288
354 TEST_F(AudioRendererHostTest, CreateAndClose) { 289 TEST_F(AudioRendererHostTest, CreateAndClose) {
355 Create(false); 290 Create(false);
356 Close(); 291 Close();
357 } 292 }
358 293
359 // Simulate the case where a stream is not properly closed. 294 // Simulate the case where a stream is not properly closed.
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after
412 } 347 }
413 348
414 TEST_F(AudioRendererHostTest, CreateUnifiedStreamAndClose) { 349 TEST_F(AudioRendererHostTest, CreateUnifiedStreamAndClose) {
415 Create(true); 350 Create(true);
416 Close(); 351 Close();
417 } 352 }
418 353
419 // TODO(hclam): Add tests for data conversation in low latency mode. 354 // TODO(hclam): Add tests for data conversation in low latency mode.
420 355
421 } // namespace content 356 } // namespace content
OLDNEW
« no previous file with comments | « no previous file | content/browser/renderer_host/media/mock_media_observer.h » ('j') | content/test/webrtc_audio_device_test.h » ('J')

Powered by Google App Engine
This is Rietveld 408576698