| Index: webrtc/api/audio_codecs/test/audio_decoder_factory_template_unittest.cc
|
| diff --git a/webrtc/api/audio_codecs/test/audio_decoder_factory_template_unittest.cc b/webrtc/api/audio_codecs/test/audio_decoder_factory_template_unittest.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..170bba79bfc7311af19834dfaab678a8ce253450
|
| --- /dev/null
|
| +++ b/webrtc/api/audio_codecs/test/audio_decoder_factory_template_unittest.cc
|
| @@ -0,0 +1,113 @@
|
| +/*
|
| + * Copyright (c) 2017 The WebRTC project authors. All Rights Reserved.
|
| + *
|
| + * Use of this source code is governed by a BSD-style license
|
| + * that can be found in the LICENSE file in the root of the source
|
| + * tree. An additional intellectual property rights grant can be found
|
| + * in the file PATENTS. All contributing project authors may
|
| + * be found in the AUTHORS file in the root of the source tree.
|
| + */
|
| +
|
| +#include "webrtc/api/audio_codecs/audio_decoder_factory_template.h"
|
| +#include "webrtc/base/ptr_util.h"
|
| +#include "webrtc/test/gmock.h"
|
| +#include "webrtc/test/gtest.h"
|
| +#include "webrtc/test/mock_audio_decoder.h"
|
| +
|
| +namespace webrtc {
|
| +
|
| +namespace {
|
| +
|
| +struct BogusParams {
|
| + static SdpAudioFormat AudioFormat() { return {"bogus", 8000, 1}; }
|
| + static AudioCodecInfo CodecInfo() { return {8000, 1, 12345}; }
|
| +};
|
| +
|
| +struct ShamParams {
|
| + static SdpAudioFormat AudioFormat() {
|
| + return {"sham", 16000, 2, {{"param", "value"}}};
|
| + }
|
| + static AudioCodecInfo CodecInfo() { return {16000, 2, 23456}; }
|
| +};
|
| +
|
| +struct MyLittleConfig {
|
| + SdpAudioFormat audio_format;
|
| +};
|
| +
|
| +template <typename Params>
|
| +struct AudioDecoderFakeApi {
|
| + static rtc::Optional<MyLittleConfig> SdpToConfig(
|
| + const SdpAudioFormat& audio_format) {
|
| + if (Params::AudioFormat() == audio_format) {
|
| + MyLittleConfig config = {audio_format};
|
| + return rtc::Optional<MyLittleConfig>(config);
|
| + } else {
|
| + return rtc::Optional<MyLittleConfig>();
|
| + }
|
| + }
|
| +
|
| + static void AppendSupportedDecoders(std::vector<AudioCodecSpec>* specs) {
|
| + specs->push_back({Params::AudioFormat(), Params::CodecInfo()});
|
| + }
|
| +
|
| + static AudioCodecInfo QueryAudioDecoder(const MyLittleConfig&) {
|
| + return Params::CodecInfo();
|
| + }
|
| +
|
| + static std::unique_ptr<AudioDecoder> MakeAudioDecoder(const MyLittleConfig&) {
|
| + auto dec = rtc::MakeUnique<testing::StrictMock<MockAudioDecoder>>();
|
| + EXPECT_CALL(*dec, SampleRateHz())
|
| + .WillOnce(testing::Return(Params::CodecInfo().sample_rate_hz));
|
| + EXPECT_CALL(*dec, Die());
|
| + return std::move(dec);
|
| + }
|
| +};
|
| +
|
| +} // namespace
|
| +
|
| +TEST(AudioDecoderFactoryTemplateTest, NoDecoderTypes) {
|
| + rtc::scoped_refptr<AudioDecoderFactory> factory(
|
| + new rtc::RefCountedObject<
|
| + audio_decoder_factory_template_impl::AudioDecoderFactoryT<>>());
|
| + EXPECT_THAT(factory->GetSupportedDecoders(), testing::IsEmpty());
|
| + EXPECT_FALSE(factory->IsSupportedDecoder({"foo", 8000, 1}));
|
| + EXPECT_EQ(nullptr, factory->MakeAudioDecoder({"bar", 16000, 1}));
|
| +}
|
| +
|
| +TEST(AudioDecoderFactoryTemplateTest, OneDecoderType) {
|
| + auto factory = CreateAudioDecoderFactory<AudioDecoderFakeApi<BogusParams>>();
|
| + EXPECT_THAT(factory->GetSupportedDecoders(),
|
| + testing::ElementsAre(
|
| + AudioCodecSpec{{"bogus", 8000, 1}, {8000, 1, 12345}}));
|
| + EXPECT_FALSE(factory->IsSupportedDecoder({"foo", 8000, 1}));
|
| + EXPECT_TRUE(factory->IsSupportedDecoder({"bogus", 8000, 1}));
|
| + EXPECT_EQ(nullptr, factory->MakeAudioDecoder({"bar", 16000, 1}));
|
| + auto dec = factory->MakeAudioDecoder({"bogus", 8000, 1});
|
| + ASSERT_NE(nullptr, dec);
|
| + EXPECT_EQ(8000, dec->SampleRateHz());
|
| +}
|
| +
|
| +TEST(AudioDecoderFactoryTemplateTest, TwoDecoderTypes) {
|
| + auto factory = CreateAudioDecoderFactory<AudioDecoderFakeApi<BogusParams>,
|
| + AudioDecoderFakeApi<ShamParams>>();
|
| + EXPECT_THAT(factory->GetSupportedDecoders(),
|
| + testing::ElementsAre(
|
| + AudioCodecSpec{{"bogus", 8000, 1}, {8000, 1, 12345}},
|
| + AudioCodecSpec{{"sham", 16000, 2, {{"param", "value"}}},
|
| + {16000, 2, 23456}}));
|
| + EXPECT_FALSE(factory->IsSupportedDecoder({"foo", 8000, 1}));
|
| + EXPECT_TRUE(factory->IsSupportedDecoder({"bogus", 8000, 1}));
|
| + EXPECT_TRUE(
|
| + factory->IsSupportedDecoder({"sham", 16000, 2, {{"param", "value"}}}));
|
| + EXPECT_EQ(nullptr, factory->MakeAudioDecoder({"bar", 16000, 1}));
|
| + auto dec1 = factory->MakeAudioDecoder({"bogus", 8000, 1});
|
| + ASSERT_NE(nullptr, dec1);
|
| + EXPECT_EQ(8000, dec1->SampleRateHz());
|
| + EXPECT_EQ(nullptr, factory->MakeAudioDecoder({"sham", 16000, 2}));
|
| + auto dec2 =
|
| + factory->MakeAudioDecoder({"sham", 16000, 2, {{"param", "value"}}});
|
| + ASSERT_NE(nullptr, dec2);
|
| + EXPECT_EQ(16000, dec2->SampleRateHz());
|
| +}
|
| +
|
| +} // namespace webrtc
|
|
|