OLD | NEW |
1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 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/callback.h" | |
6 #include "base/process_util.h" | 5 #include "base/process_util.h" |
7 #include "chrome/common/render_messages.h" | 6 #include "chrome/common/render_messages.h" |
8 #include "chrome/common/render_messages_params.h" | 7 #include "chrome/common/render_messages_params.h" |
9 #include "chrome/renderer/media/audio_renderer_impl.h" | 8 #include "chrome/renderer/media/audio_renderer_impl.h" |
10 #include "media/base/data_buffer.h" | 9 #include "media/base/data_buffer.h" |
11 #include "media/base/media_format.h" | 10 #include "media/base/media_format.h" |
| 11 #include "media/base/mock_callback.h" |
12 #include "media/base/mock_filter_host.h" | 12 #include "media/base/mock_filter_host.h" |
13 #include "media/base/mock_filters.h" | 13 #include "media/base/mock_filters.h" |
14 #include "testing/gtest/include/gtest/gtest.h" | 14 #include "testing/gtest/include/gtest/gtest.h" |
15 | 15 |
16 using ::testing::ReturnRef; | 16 using ::testing::ReturnRef; |
17 | 17 |
18 class AudioRendererImplTest : public ::testing::Test { | 18 class AudioRendererImplTest : public ::testing::Test { |
19 public: | 19 public: |
20 static const int kRouteId = 0; | 20 static const int kRouteId = 0; |
21 static const int kSize = 1024; | 21 static const int kSize = 1024; |
22 | 22 |
23 AudioRendererImplTest() { | 23 AudioRendererImplTest() { |
24 message_loop_.reset(new MessageLoop(MessageLoop::TYPE_IO)); | 24 message_loop_.reset(new MessageLoop(MessageLoop::TYPE_IO)); |
25 | 25 |
26 // TODO(scherkus): use gmock with AudioMessageFilter to verify | 26 // TODO(scherkus): use gmock with AudioMessageFilter to verify |
27 // AudioRendererImpl calls or doesn't call Send(). | 27 // AudioRendererImpl calls or doesn't call Send(). |
28 filter_ = new AudioMessageFilter(kRouteId); | 28 filter_ = new AudioMessageFilter(kRouteId); |
29 filter_->message_loop_ = message_loop_.get(); | 29 filter_->message_loop_ = message_loop_.get(); |
30 | 30 |
31 // Create temporary shared memory. | 31 // Create temporary shared memory. |
32 CHECK(shared_mem_.CreateAnonymous(kSize)); | 32 CHECK(shared_mem_.CreateAnonymous(kSize)); |
33 | 33 |
34 // Setup expectations for initialization. | 34 // Setup expectations for initialization. |
35 EXPECT_CALL(callback_, OnFilterCallback()); | |
36 EXPECT_CALL(callback_, OnCallbackDestroyed()); | |
37 decoder_ = new media::MockAudioDecoder(); | 35 decoder_ = new media::MockAudioDecoder(); |
38 | 36 |
39 // Associate media format with decoder | 37 // Associate media format with decoder |
40 decoder_media_format_.SetAsString(media::MediaFormat::kMimeType, | 38 decoder_media_format_.SetAsString(media::MediaFormat::kMimeType, |
41 media::mime_type::kUncompressedAudio); | 39 media::mime_type::kUncompressedAudio); |
42 decoder_media_format_.SetAsInteger(media::MediaFormat::kChannels, 2); | 40 decoder_media_format_.SetAsInteger(media::MediaFormat::kChannels, 2); |
43 decoder_media_format_.SetAsInteger(media::MediaFormat::kSampleRate, 48000); | 41 decoder_media_format_.SetAsInteger(media::MediaFormat::kSampleRate, 48000); |
44 decoder_media_format_.SetAsInteger(media::MediaFormat::kSampleBits, 16); | 42 decoder_media_format_.SetAsInteger(media::MediaFormat::kSampleBits, 16); |
45 EXPECT_CALL(*decoder_, media_format()) | 43 EXPECT_CALL(*decoder_, media_format()) |
46 .WillRepeatedly(ReturnRef(decoder_media_format_)); | 44 .WillRepeatedly(ReturnRef(decoder_media_format_)); |
47 | 45 |
48 // Create and initialize audio renderer. | 46 // Create and initialize audio renderer. |
49 renderer_ = new AudioRendererImpl(filter_); | 47 renderer_ = new AudioRendererImpl(filter_); |
50 renderer_->set_host(&host_); | 48 renderer_->set_host(&host_); |
51 renderer_->set_message_loop(message_loop_.get()); | 49 renderer_->set_message_loop(message_loop_.get()); |
52 renderer_->Initialize(decoder_, callback_.NewCallback()); | 50 renderer_->Initialize(decoder_, media::NewExpectedCallback()); |
53 | 51 |
54 // Run pending tasks and simulate responding with a created audio stream. | 52 // Run pending tasks and simulate responding with a created audio stream. |
55 message_loop_->RunAllPending(); | 53 message_loop_->RunAllPending(); |
56 | 54 |
57 // Duplicate the shared memory handle so both the test and the callee can | 55 // Duplicate the shared memory handle so both the test and the callee can |
58 // close their copy. | 56 // close their copy. |
59 base::SharedMemoryHandle duplicated_handle; | 57 base::SharedMemoryHandle duplicated_handle; |
60 EXPECT_TRUE(shared_mem_.ShareToProcess(base::GetCurrentProcessHandle(), | 58 EXPECT_TRUE(shared_mem_.ShareToProcess(base::GetCurrentProcessHandle(), |
61 &duplicated_handle)); | 59 &duplicated_handle)); |
62 | 60 |
63 renderer_->OnCreated(duplicated_handle, kSize); | 61 renderer_->OnCreated(duplicated_handle, kSize); |
64 } | 62 } |
65 | 63 |
66 virtual ~AudioRendererImplTest() { | 64 virtual ~AudioRendererImplTest() { |
67 } | 65 } |
68 | 66 |
69 protected: | 67 protected: |
70 // Fixtures. | 68 // Fixtures. |
71 scoped_ptr<MessageLoop> message_loop_; | 69 scoped_ptr<MessageLoop> message_loop_; |
72 scoped_refptr<AudioMessageFilter> filter_; | 70 scoped_refptr<AudioMessageFilter> filter_; |
73 base::SharedMemory shared_mem_; | 71 base::SharedMemory shared_mem_; |
74 media::MockFilterHost host_; | 72 media::MockFilterHost host_; |
75 media::MockFilterCallback callback_; | |
76 media::MockFilterCallback stop_callback_; | |
77 scoped_refptr<media::MockAudioDecoder> decoder_; | 73 scoped_refptr<media::MockAudioDecoder> decoder_; |
78 scoped_refptr<AudioRendererImpl> renderer_; | 74 scoped_refptr<AudioRendererImpl> renderer_; |
79 media::MediaFormat decoder_media_format_; | 75 media::MediaFormat decoder_media_format_; |
80 | 76 |
81 private: | 77 private: |
82 DISALLOW_COPY_AND_ASSIGN(AudioRendererImplTest); | 78 DISALLOW_COPY_AND_ASSIGN(AudioRendererImplTest); |
83 }; | 79 }; |
84 | 80 |
85 TEST_F(AudioRendererImplTest, SetPlaybackRate) { | 81 TEST_F(AudioRendererImplTest, SetPlaybackRate) { |
86 // Execute SetPlaybackRate() codepath to create an IPC message. | 82 // Execute SetPlaybackRate() codepath to create an IPC message. |
87 | 83 |
88 // Toggle play/pause to generate some IPC messages. | 84 // Toggle play/pause to generate some IPC messages. |
89 renderer_->SetPlaybackRate(0.0f); | 85 renderer_->SetPlaybackRate(0.0f); |
90 renderer_->SetPlaybackRate(1.0f); | 86 renderer_->SetPlaybackRate(1.0f); |
91 renderer_->SetPlaybackRate(0.0f); | 87 renderer_->SetPlaybackRate(0.0f); |
92 | 88 |
93 EXPECT_CALL(stop_callback_, OnFilterCallback()); | 89 renderer_->Stop(media::NewExpectedCallback()); |
94 renderer_->Stop(stop_callback_.NewCallback()); | |
95 message_loop_->RunAllPending(); | 90 message_loop_->RunAllPending(); |
96 } | 91 } |
97 | 92 |
98 TEST_F(AudioRendererImplTest, SetVolume) { | 93 TEST_F(AudioRendererImplTest, SetVolume) { |
99 // Execute SetVolume() codepath to create an IPC message. | 94 // Execute SetVolume() codepath to create an IPC message. |
100 renderer_->SetVolume(0.5f); | 95 renderer_->SetVolume(0.5f); |
101 EXPECT_CALL(stop_callback_, OnFilterCallback()); | 96 renderer_->Stop(media::NewExpectedCallback()); |
102 renderer_->Stop(stop_callback_.NewCallback()); | |
103 message_loop_->RunAllPending(); | 97 message_loop_->RunAllPending(); |
104 } | 98 } |
105 | 99 |
106 TEST_F(AudioRendererImplTest, Stop) { | 100 TEST_F(AudioRendererImplTest, Stop) { |
107 // Declare some state messages. | 101 // Declare some state messages. |
108 const ViewMsg_AudioStreamState_Params kError( | 102 const ViewMsg_AudioStreamState_Params kError( |
109 ViewMsg_AudioStreamState_Params::kError); | 103 ViewMsg_AudioStreamState_Params::kError); |
110 const ViewMsg_AudioStreamState_Params kPlaying( | 104 const ViewMsg_AudioStreamState_Params kPlaying( |
111 ViewMsg_AudioStreamState_Params::kPlaying); | 105 ViewMsg_AudioStreamState_Params::kPlaying); |
112 const ViewMsg_AudioStreamState_Params kPaused( | 106 const ViewMsg_AudioStreamState_Params kPaused( |
113 ViewMsg_AudioStreamState_Params::kPaused); | 107 ViewMsg_AudioStreamState_Params::kPaused); |
114 | 108 |
115 // Execute Stop() codepath to create an IPC message. | 109 // Execute Stop() codepath to create an IPC message. |
116 EXPECT_CALL(stop_callback_, OnFilterCallback()); | 110 renderer_->Stop(media::NewExpectedCallback()); |
117 renderer_->Stop(stop_callback_.NewCallback()); | |
118 message_loop_->RunAllPending(); | 111 message_loop_->RunAllPending(); |
119 | 112 |
120 // Run AudioMessageFilter::Delegate methods, which can be executed after being | 113 // Run AudioMessageFilter::Delegate methods, which can be executed after being |
121 // stopped. AudioRendererImpl shouldn't create any messages. | 114 // stopped. AudioRendererImpl shouldn't create any messages. |
122 renderer_->OnRequestPacket(AudioBuffersState(kSize, 0)); | 115 renderer_->OnRequestPacket(AudioBuffersState(kSize, 0)); |
123 renderer_->OnStateChanged(kError); | 116 renderer_->OnStateChanged(kError); |
124 renderer_->OnStateChanged(kPlaying); | 117 renderer_->OnStateChanged(kPlaying); |
125 renderer_->OnStateChanged(kPaused); | 118 renderer_->OnStateChanged(kPaused); |
126 renderer_->OnCreated(shared_mem_.handle(), kSize); | 119 renderer_->OnCreated(shared_mem_.handle(), kSize); |
127 renderer_->OnVolume(0.5); | 120 renderer_->OnVolume(0.5); |
128 | 121 |
129 // It's possible that the upstream decoder replies right after being stopped. | 122 // It's possible that the upstream decoder replies right after being stopped. |
130 scoped_refptr<media::Buffer> buffer(new media::DataBuffer(kSize)); | 123 scoped_refptr<media::Buffer> buffer(new media::DataBuffer(kSize)); |
131 renderer_->ConsumeAudioSamples(buffer); | 124 renderer_->ConsumeAudioSamples(buffer); |
132 } | 125 } |
133 | 126 |
134 TEST_F(AudioRendererImplTest, DestroyedMessageLoop_SetPlaybackRate) { | 127 TEST_F(AudioRendererImplTest, DestroyedMessageLoop_SetPlaybackRate) { |
135 // Kill the message loop and verify SetPlaybackRate() still works. | 128 // Kill the message loop and verify SetPlaybackRate() still works. |
136 message_loop_.reset(); | 129 message_loop_.reset(); |
137 renderer_->SetPlaybackRate(0.0f); | 130 renderer_->SetPlaybackRate(0.0f); |
138 renderer_->SetPlaybackRate(1.0f); | 131 renderer_->SetPlaybackRate(1.0f); |
139 renderer_->SetPlaybackRate(0.0f); | 132 renderer_->SetPlaybackRate(0.0f); |
140 EXPECT_CALL(stop_callback_, OnFilterCallback()); | 133 renderer_->Stop(media::NewExpectedCallback()); |
141 renderer_->Stop(stop_callback_.NewCallback()); | |
142 } | 134 } |
143 | 135 |
144 TEST_F(AudioRendererImplTest, DestroyedMessageLoop_SetVolume) { | 136 TEST_F(AudioRendererImplTest, DestroyedMessageLoop_SetVolume) { |
145 // Kill the message loop and verify SetVolume() still works. | 137 // Kill the message loop and verify SetVolume() still works. |
146 message_loop_.reset(); | 138 message_loop_.reset(); |
147 renderer_->SetVolume(0.5f); | 139 renderer_->SetVolume(0.5f); |
148 EXPECT_CALL(stop_callback_, OnFilterCallback()); | 140 renderer_->Stop(media::NewExpectedCallback()); |
149 renderer_->Stop(stop_callback_.NewCallback()); | |
150 } | 141 } |
151 | 142 |
152 TEST_F(AudioRendererImplTest, DestroyedMessageLoop_ConsumeAudioSamples) { | 143 TEST_F(AudioRendererImplTest, DestroyedMessageLoop_ConsumeAudioSamples) { |
153 // Kill the message loop and verify OnReadComplete() still works. | 144 // Kill the message loop and verify OnReadComplete() still works. |
154 message_loop_.reset(); | 145 message_loop_.reset(); |
155 scoped_refptr<media::Buffer> buffer(new media::DataBuffer(kSize)); | 146 scoped_refptr<media::Buffer> buffer(new media::DataBuffer(kSize)); |
156 renderer_->ConsumeAudioSamples(buffer); | 147 renderer_->ConsumeAudioSamples(buffer); |
157 EXPECT_CALL(stop_callback_, OnFilterCallback()); | 148 renderer_->Stop(media::NewExpectedCallback()); |
158 renderer_->Stop(stop_callback_.NewCallback()); | |
159 } | 149 } |
OLD | NEW |