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
3 // found in the LICENSE file.
8 #include "base/message_loop/message_loop.h"
9 #include "media/base/gmock_callback_support.h"
10 #include "media/base/mock_filters.h"
11 #include "media/filters/audio_decoder_selector.h"
12 #include "media/filters/decrypting_demuxer_stream.h"
13 #include "testing/gtest/include/gtest/gtest.h"
16 using ::testing::IsNull;
17 using ::testing::NiceMock;
18 using ::testing::NotNull;
19 using ::testing::Return;
20 using ::testing::StrictMock;
24 class AudioDecoderSelectorTest : public ::testing::Test {
26 enum DecryptorCapability {
28 // Used to test Abort() during DecryptingAudioDecoder::Initialize() and
29 // DecryptingDemuxerStream::Initialize(). We don't need this for normal
30 // AudioDecoders since we use MockAudioDecoder.
36 AudioDecoderSelectorTest()
38 new StrictMock<MockDemuxerStream>(DemuxerStream::AUDIO)),
39 decryptor_(new NiceMock<MockDecryptor>()),
40 decoder_1_(new StrictMock<MockAudioDecoder>()),
41 decoder_2_(new StrictMock<MockAudioDecoder>()) {
42 all_decoders_.push_back(decoder_1_);
43 all_decoders_.push_back(decoder_2_);
46 MOCK_METHOD1(OnStatistics, void(const PipelineStatistics&));
47 MOCK_METHOD1(SetDecryptorReadyCallback, void(const media::DecryptorReadyCB&));
48 MOCK_METHOD2(OnDecoderSelected,
49 void(AudioDecoder*, DecryptingDemuxerStream*));
51 void MockOnDecoderSelected(
52 scoped_ptr<AudioDecoder> decoder,
53 scoped_ptr<DecryptingDemuxerStream> stream) {
54 OnDecoderSelected(decoder.get(), stream.get());
57 void UseClearStream() {
58 AudioDecoderConfig clear_audio_config(
59 kCodecVorbis, kSampleFormatPlanarF32, CHANNEL_LAYOUT_STEREO, 44100,
61 demuxer_stream_->set_audio_decoder_config(clear_audio_config);
64 void UseEncryptedStream() {
65 AudioDecoderConfig encrypted_audio_config(
66 kCodecVorbis, kSampleFormatPlanarF32, CHANNEL_LAYOUT_STEREO, 44100,
68 demuxer_stream_->set_audio_decoder_config(encrypted_audio_config);
71 void InitializeDecoderSelector(DecryptorCapability decryptor_capability,
73 SetDecryptorReadyCB set_decryptor_ready_cb;
74 if (decryptor_capability != kNoDecryptor) {
75 set_decryptor_ready_cb =
76 base::Bind(&AudioDecoderSelectorTest::SetDecryptorReadyCallback,
77 base::Unretained(this));
80 if (decryptor_capability == kDecryptOnly ||
81 decryptor_capability == kDecryptAndDecode) {
83 EXPECT_CALL(*this, SetDecryptorReadyCallback(_))
84 .WillRepeatedly(RunCallback<0>(decryptor_.get()));
86 if (decryptor_capability == kDecryptOnly) {
87 EXPECT_CALL(*decryptor_, InitializeAudioDecoder(_, _))
88 .WillRepeatedly(RunCallback<1>(false));
90 EXPECT_CALL(*decryptor_, InitializeAudioDecoder(_, _))
91 .WillRepeatedly(RunCallback<1>(true));
93 } else if (decryptor_capability == kHoldSetDecryptor) {
94 // Set DecryptorReadyCB but the callback is never fired.
95 EXPECT_CALL(*this, SetDecryptorReadyCallback(_));
98 DCHECK_GE(all_decoders_.size(), static_cast<size_t>(num_decoders));
100 all_decoders_.begin() + num_decoders, all_decoders_.end());
102 decoder_selector_.reset(new AudioDecoderSelector(
103 message_loop_.message_loop_proxy(),
104 all_decoders_.Pass(),
105 set_decryptor_ready_cb));
108 void SelectDecoder() {
109 decoder_selector_->SelectAudioDecoder(
110 demuxer_stream_.get(),
111 base::Bind(&AudioDecoderSelectorTest::OnStatistics,
112 base::Unretained(this)),
113 base::Bind(&AudioDecoderSelectorTest::MockOnDecoderSelected,
114 base::Unretained(this)));
115 message_loop_.RunUntilIdle();
118 void SelectDecoderAndAbort() {
121 EXPECT_CALL(*this, OnDecoderSelected(IsNull(), IsNull()));
122 decoder_selector_->Abort();
123 message_loop_.RunUntilIdle();
127 scoped_ptr<AudioDecoderSelector> decoder_selector_;
128 scoped_ptr<StrictMock<MockDemuxerStream> > demuxer_stream_;
129 // Use NiceMock since we don't care about most of calls on the decryptor, e.g.
130 // RegisterNewKeyCB().
131 scoped_ptr<NiceMock<MockDecryptor> > decryptor_;
132 StrictMock<MockAudioDecoder>* decoder_1_;
133 StrictMock<MockAudioDecoder>* decoder_2_;
134 ScopedVector<AudioDecoder> all_decoders_;
135 base::MessageLoop message_loop_;
138 DISALLOW_COPY_AND_ASSIGN(AudioDecoderSelectorTest);
141 // The stream is not encrypted but we have no clear decoder. No decoder can be
143 TEST_F(AudioDecoderSelectorTest, ClearStream_NoDecryptor_NoClearDecoder) {
145 InitializeDecoderSelector(kNoDecryptor, 0);
147 EXPECT_CALL(*this, OnDecoderSelected(IsNull(), IsNull()));
152 // The stream is not encrypted and we have one clear decoder. The decoder
154 TEST_F(AudioDecoderSelectorTest, ClearStream_NoDecryptor_OneClearDecoder) {
156 InitializeDecoderSelector(kNoDecryptor, 1);
158 EXPECT_CALL(*decoder_1_, Initialize(_, _, _))
159 .WillOnce(RunCallback<1>(PIPELINE_OK));
160 EXPECT_CALL(*this, OnDecoderSelected(decoder_1_, IsNull()));
165 TEST_F(AudioDecoderSelectorTest,
166 Abort_ClearStream_NoDecryptor_OneClearDecoder) {
168 InitializeDecoderSelector(kNoDecryptor, 1);
170 EXPECT_CALL(*decoder_1_, Initialize(_, _, _));
172 SelectDecoderAndAbort();
175 // The stream is not encrypted and we have multiple clear decoders. The first
176 // decoder that can decode the input stream will be selected.
177 TEST_F(AudioDecoderSelectorTest, ClearStream_NoDecryptor_MultipleClearDecoder) {
179 InitializeDecoderSelector(kNoDecryptor, 2);
181 EXPECT_CALL(*decoder_1_, Initialize(_, _, _))
182 .WillOnce(RunCallback<1>(DECODER_ERROR_NOT_SUPPORTED));
183 EXPECT_CALL(*decoder_2_, Initialize(_, _, _))
184 .WillOnce(RunCallback<1>(PIPELINE_OK));
185 EXPECT_CALL(*this, OnDecoderSelected(decoder_2_, IsNull()));
190 TEST_F(AudioDecoderSelectorTest,
191 Abort_ClearStream_NoDecryptor_MultipleClearDecoder) {
193 InitializeDecoderSelector(kNoDecryptor, 2);
195 EXPECT_CALL(*decoder_1_, Initialize(_, _, _))
196 .WillOnce(RunCallback<1>(DECODER_ERROR_NOT_SUPPORTED));
197 EXPECT_CALL(*decoder_2_, Initialize(_, _, _));
199 SelectDecoderAndAbort();
202 // There is a decryptor but the stream is not encrypted. The decoder will be
204 TEST_F(AudioDecoderSelectorTest, ClearStream_HasDecryptor) {
206 InitializeDecoderSelector(kDecryptOnly, 1);
208 EXPECT_CALL(*decoder_1_, Initialize(_, _, _))
209 .WillOnce(RunCallback<1>(PIPELINE_OK));
210 EXPECT_CALL(*this, OnDecoderSelected(decoder_1_, IsNull()));
215 TEST_F(AudioDecoderSelectorTest, Abort_ClearStream_HasDecryptor) {
217 InitializeDecoderSelector(kDecryptOnly, 1);
219 EXPECT_CALL(*decoder_1_, Initialize(_, _, _));
221 SelectDecoderAndAbort();
224 // The stream is encrypted and there's no decryptor. No decoder can be selected.
225 TEST_F(AudioDecoderSelectorTest, EncryptedStream_NoDecryptor) {
226 UseEncryptedStream();
227 InitializeDecoderSelector(kNoDecryptor, 1);
229 EXPECT_CALL(*this, OnDecoderSelected(IsNull(), IsNull()));
234 // Decryptor can only do decryption and there's no decoder available. No decoder
236 TEST_F(AudioDecoderSelectorTest, EncryptedStream_DecryptOnly_NoClearDecoder) {
237 UseEncryptedStream();
238 InitializeDecoderSelector(kDecryptOnly, 0);
240 EXPECT_CALL(*this, OnDecoderSelected(IsNull(), IsNull()));
245 TEST_F(AudioDecoderSelectorTest,
246 Abort_EncryptedStream_DecryptOnly_NoClearDecoder) {
247 UseEncryptedStream();
248 InitializeDecoderSelector(kHoldSetDecryptor, 0);
250 SelectDecoderAndAbort();
253 // Decryptor can do decryption-only and there's a decoder available. The decoder
254 // will be selected and a DecryptingDemuxerStream will be created.
255 TEST_F(AudioDecoderSelectorTest, EncryptedStream_DecryptOnly_OneClearDecoder) {
256 UseEncryptedStream();
257 InitializeDecoderSelector(kDecryptOnly, 1);
259 EXPECT_CALL(*decoder_1_, Initialize(_, _, _))
260 .WillOnce(RunCallback<1>(PIPELINE_OK));
261 EXPECT_CALL(*this, OnDecoderSelected(decoder_1_, NotNull()));
266 TEST_F(AudioDecoderSelectorTest,
267 Abort_EncryptedStream_DecryptOnly_OneClearDecoder) {
268 UseEncryptedStream();
269 InitializeDecoderSelector(kDecryptOnly, 1);
271 EXPECT_CALL(*decoder_1_, Initialize(_, _, _));
273 SelectDecoderAndAbort();
276 // Decryptor can only do decryption and there are multiple decoders available.
277 // The first decoder that can decode the input stream will be selected and
278 // a DecryptingDemuxerStream will be created.
279 TEST_F(AudioDecoderSelectorTest,
280 EncryptedStream_DecryptOnly_MultipleClearDecoder) {
281 UseEncryptedStream();
282 InitializeDecoderSelector(kDecryptOnly, 2);
284 EXPECT_CALL(*decoder_1_, Initialize(_, _, _))
285 .WillOnce(RunCallback<1>(DECODER_ERROR_NOT_SUPPORTED));
286 EXPECT_CALL(*decoder_2_, Initialize(_, _, _))
287 .WillOnce(RunCallback<1>(PIPELINE_OK));
288 EXPECT_CALL(*this, OnDecoderSelected(decoder_2_, NotNull()));
293 TEST_F(AudioDecoderSelectorTest,
294 Abort_EncryptedStream_DecryptOnly_MultipleClearDecoder) {
295 UseEncryptedStream();
296 InitializeDecoderSelector(kDecryptOnly, 2);
298 EXPECT_CALL(*decoder_1_, Initialize(_, _, _))
299 .WillOnce(RunCallback<1>(DECODER_ERROR_NOT_SUPPORTED));
300 EXPECT_CALL(*decoder_2_, Initialize(_, _, _));
302 SelectDecoderAndAbort();
305 // Decryptor can do decryption and decoding. A DecryptingAudioDecoder will be
306 // created and selected. The clear decoders should not be touched at all.
307 // No DecryptingDemuxerStream should to be created.
308 TEST_F(AudioDecoderSelectorTest, EncryptedStream_DecryptAndDecode) {
309 UseEncryptedStream();
310 InitializeDecoderSelector(kDecryptAndDecode, 1);
312 EXPECT_CALL(*this, OnDecoderSelected(NotNull(), IsNull()));
317 TEST_F(AudioDecoderSelectorTest, Abort_EncryptedStream_DecryptAndDecode) {
318 UseEncryptedStream();
319 InitializeDecoderSelector(kHoldSetDecryptor, 1);
321 SelectDecoderAndAbort();