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

Side by Side Diff: content/renderer/media/audio_renderer_impl_unittest.cc

Issue 9347029: Decouple 'give me more data' and 'rendered end of stream' audio callbacks. (Closed) Base URL: http://src.chromium.org/svn/trunk/src/
Patch Set: Created 8 years, 10 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 | 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/bind_helpers.h" 6 #include "base/bind_helpers.h"
7 #include "base/gtest_prod_util.h"
7 #include "base/message_loop.h" 8 #include "base/message_loop.h"
8 #include "base/process_util.h" 9 #include "base/process_util.h"
9 #include "base/synchronization/waitable_event.h" 10 #include "base/synchronization/waitable_event.h"
10 #include "base/test/test_timeouts.h" 11 #include "base/test/test_timeouts.h"
11 #include "base/time.h" 12 #include "base/time.h"
13 #include "base/threading/platform_thread.h"
12 #include "content/common/child_process.h" 14 #include "content/common/child_process.h"
13 #include "content/common/child_thread.h" 15 #include "content/common/child_thread.h"
14 #include "content/renderer/media/audio_renderer_impl.h" 16 #include "content/renderer/media/audio_renderer_impl.h"
15 #include "content/renderer/mock_content_renderer_client.h" 17 #include "content/renderer/mock_content_renderer_client.h"
16 #include "content/renderer/render_process.h" 18 #include "content/renderer/render_process.h"
17 #include "content/renderer/render_thread_impl.h" 19 #include "content/renderer/render_thread_impl.h"
18 #include "ipc/ipc_channel.h" 20 #include "ipc/ipc_channel.h"
19 #include "media/base/data_buffer.h" 21 #include "media/base/data_buffer.h"
20 #include "media/base/mock_callback.h" 22 #include "media/base/mock_callback.h"
21 #include "media/base/mock_filter_host.h" 23 #include "media/base/mock_filter_host.h"
(...skipping 27 matching lines...) Expand all
49 // additional tasks remain in the task queue. 51 // additional tasks remain in the task queue.
50 void WaitCallback(base::WaitableEvent* event) { 52 void WaitCallback(base::WaitableEvent* event) {
51 event->Signal(); 53 event->Signal();
52 } 54 }
53 55
54 // Class we would be testing. 56 // Class we would be testing.
55 class TestAudioRendererImpl : public AudioRendererImpl { 57 class TestAudioRendererImpl : public AudioRendererImpl {
56 public: 58 public:
57 explicit TestAudioRendererImpl(media::AudioRendererSink* sink) 59 explicit TestAudioRendererImpl(media::AudioRendererSink* sink)
58 : AudioRendererImpl(sink) { 60 : AudioRendererImpl(sink) {
61 ON_CALL(*this, current_message_loop_proxy())
62 .WillByDefault(Return(
63 ChildProcess::current()->io_message_loop_proxy()));
59 } 64 }
65
66 protected:
67 FRIEND_TEST_ALL_PREFIXES(AudioRendererImplTest, OnRenderEndOfStream);
68 FRIEND_TEST_ALL_PREFIXES(AudioRendererImplTest, OnRenderEndOfStreamStopped);
69 MOCK_METHOD0(SignalEndOfStream, void());
70
71 private:
72 FRIEND_TEST_ALL_PREFIXES(AudioRendererImplTest, OnRenderEndOfStream);
73 FRIEND_TEST_ALL_PREFIXES(AudioRendererImplTest, OnRenderEndOfStreamStopped);
74 MOCK_METHOD0(OnRenderEndOfStreamDelay, int64());
75 MOCK_METHOD0(current_message_loop_proxy, base::MessageLoopProxy*());
60 }; 76 };
61 77
62 class AudioRendererImplTest 78 class AudioRendererImplTest
63 : public ::testing::Test, 79 : public ::testing::Test,
64 public IPC::Channel::Listener { 80 public IPC::Channel::Listener {
65 public: 81 public:
66 // IPC::Channel::Listener implementation. 82 // IPC::Channel::Listener implementation.
67 virtual bool OnMessageReceived(const IPC::Message& message) { 83 virtual bool OnMessageReceived(const IPC::Message& message) {
68 NOTIMPLEMENTED(); 84 NOTIMPLEMENTED();
69 return true; 85 return true;
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after
129 base::TimeDelta current_time, base::TimeDelta max_time) { 145 base::TimeDelta current_time, base::TimeDelta max_time) {
130 CHECK(current_time <= max_time); 146 CHECK(current_time <= max_time);
131 } 147 }
132 148
133 media::AudioRenderer::AudioTimeCB NewAudioTimeClosure() { 149 media::AudioRenderer::AudioTimeCB NewAudioTimeClosure() {
134 return base::Bind(&AudioRendererImplTest::OnAudioTimeCallback, 150 return base::Bind(&AudioRendererImplTest::OnAudioTimeCallback,
135 base::Unretained(this)); 151 base::Unretained(this));
136 } 152 }
137 153
138 protected: 154 protected:
155 // Posts a DoSetPlayback task to the IO message loop.
156 void RendererSetPlaybackRate(float rate) {
157 ChildProcess::current()->io_message_loop()->PostTask(
158 FROM_HERE, base::Bind(&AudioRendererImplTest::DoSetPlaybackRate,
159 base::Unretained(this),
160 rate));
161 }
162
163 // Called in the message loop.
164 void DoSetPlaybackRate(float rate) {
165 renderer_->SetPlaybackRate(rate);
166 }
167
139 // Posts a final task to the IO message loop and waits for completion. 168 // Posts a final task to the IO message loop and waits for completion.
140 void WaitForIOThreadCompletion() { 169 void WaitForIOThreadCompletion() {
141 ChildProcess::current()->io_message_loop()->PostTask( 170 ChildProcess::current()->io_message_loop()->PostTask(
142 FROM_HERE, base::Bind(&WaitCallback, base::Unretained(event_.get()))); 171 FROM_HERE, base::Bind(&WaitCallback, base::Unretained(event_.get())));
143 EXPECT_TRUE(event_->TimedWait( 172 EXPECT_TRUE(event_->TimedWait(
144 base::TimeDelta::FromMilliseconds(TestTimeouts::action_timeout_ms()))); 173 base::TimeDelta::FromMilliseconds(TestTimeouts::action_timeout_ms())));
145 } 174 }
146 175
147 MessageLoopForIO message_loop_; 176 MessageLoopForIO message_loop_;
148 content::MockContentRendererClient mock_content_renderer_client_; 177 content::MockContentRendererClient mock_content_renderer_client_;
149 scoped_ptr<IPC::Channel> channel_; 178 scoped_ptr<IPC::Channel> channel_;
150 RenderThreadImpl* render_thread_; // owned by mock_process_ 179 RenderThreadImpl* render_thread_; // owned by mock_process_
151 scoped_ptr<MockRenderProcess> mock_process_; 180 scoped_ptr<MockRenderProcess> mock_process_;
152 scoped_refptr<media::MockAudioDecoder> decoder_; 181 scoped_refptr<media::MockAudioDecoder> decoder_;
153 scoped_refptr<AudioRendererImpl> renderer_; 182 scoped_refptr<TestAudioRendererImpl> renderer_;
154 scoped_ptr<base::WaitableEvent> event_; 183 scoped_ptr<base::WaitableEvent> event_;
155 184
156 private: 185 private:
157 DISALLOW_COPY_AND_ASSIGN(AudioRendererImplTest); 186 DISALLOW_COPY_AND_ASSIGN(AudioRendererImplTest);
158 }; 187 };
159 188
160 const int AudioRendererImplTest::kSize = 1024; 189 const int AudioRendererImplTest::kSize = 1024;
161 190
162 TEST_F(AudioRendererImplTest, SetPlaybackRate) { 191 TEST_F(AudioRendererImplTest, SetPlaybackRate) {
163 // Execute SetPlaybackRate() codepath by toggling play/pause. 192 // Execute SetPlaybackRate() codepath by toggling play/pause.
(...skipping 24 matching lines...) Expand all
188 base::Time time_now = base::Time(); // Null time by default. 217 base::Time time_now = base::Time(); // Null time by default.
189 renderer_->set_earliest_end_time(time_now); 218 renderer_->set_earliest_end_time(time_now);
190 renderer_->UpdateEarliestEndTime(renderer_->bytes_per_second(), 219 renderer_->UpdateEarliestEndTime(renderer_->bytes_per_second(),
191 base::TimeDelta::FromMilliseconds(100), 220 base::TimeDelta::FromMilliseconds(100),
192 time_now); 221 time_now);
193 int time_delta = (renderer_->earliest_end_time() - time_now).InMilliseconds(); 222 int time_delta = (renderer_->earliest_end_time() - time_now).InMilliseconds();
194 EXPECT_EQ(1100, time_delta); 223 EXPECT_EQ(1100, time_delta);
195 renderer_->Stop(media::NewExpectedClosure()); 224 renderer_->Stop(media::NewExpectedClosure());
196 WaitForIOThreadCompletion(); 225 WaitForIOThreadCompletion();
197 } 226 }
227
228 TEST_F(AudioRendererImplTest, OnRenderEndOfStream) {
scherkus (not reviewing) 2012/03/03 02:24:32 These tests rely way too much on internal knowledg
229 // Verifies that we would successfully receive end of stream signal.
230 RendererSetPlaybackRate(1.0f);
231 WaitForIOThreadCompletion();
232 renderer_->set_recieved_end_of_stream(true);
233 EXPECT_CALL(*renderer_, OnRenderEndOfStreamDelay())
234 .WillOnce(Return(0));
235 EXPECT_CALL(*renderer_, SignalEndOfStream());
236 renderer_->OnRenderEndOfStream();
237 WaitForIOThreadCompletion();
238 renderer_->Stop(media::NewExpectedClosure());
239 WaitForIOThreadCompletion();
240 }
241
242 TEST_F(AudioRendererImplTest, OnRenderEndOfStreamStopped) {
243 // Verifies that we can successfully cancel already scheduled
244 // signaling of end of stream.
245 RendererSetPlaybackRate(1.0f);
246 WaitForIOThreadCompletion();
247 renderer_->set_recieved_end_of_stream(true);
248 EXPECT_CALL(*renderer_, OnRenderEndOfStreamDelay())
249 .WillOnce(Return(100));
250 EXPECT_CALL(*renderer_, SignalEndOfStream())
251 .Times(0);
252 renderer_->OnRenderEndOfStream();
253 RendererSetPlaybackRate(0.0f);
254 base::PlatformThread::Sleep(base::TimeDelta::FromMilliseconds(150));
255 WaitForIOThreadCompletion();
256 renderer_->Stop(media::NewExpectedClosure());
257 WaitForIOThreadCompletion();
258 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698