1 #include "gtest/gtest.h" 2 #include "gmock/gmock.h" 3 #define private public 4 #include "avcodec_audio_codec_inner_impl.h" 5 #undef private 6 #include "i_avcodec_service.h" 7 #include "avcodec_log.h" 8 #include "avcodec_errors.h" 9 #include "avcodec_trace.h" 10 11 using namespace testing; 12 using namespace testing::ext; 13 using namespace OHOS::MediaAVCodec; 14 15 namespace { 16 constexpr int32_t DEFAULT_BUFFER_SIZE = 4; 17 } 18 19 namespace OHOS { 20 namespace Media { 21 22 class MockCodecService : public ICodecService { 23 public: 24 MOCK_METHOD(int32_t, Init, 25 (AVCodecType type, bool isMimeType, const std::string &name, Meta &callerInfo, API_VERSION apiVersion), 26 (override)); 27 MOCK_METHOD(int32_t, Configure, (const Format &format), (override)); 28 MOCK_METHOD(int32_t, SetCustomBuffer, (std::shared_ptr<AVBuffer> buffer), (override)); 29 MOCK_METHOD(int32_t, Start, (), (override)); 30 MOCK_METHOD(int32_t, Stop, (), (override)); 31 MOCK_METHOD(int32_t, Flush, (), (override)); 32 MOCK_METHOD(int32_t, Reset, (), (override)); 33 MOCK_METHOD(int32_t, Release, (), (override)); 34 MOCK_METHOD(int32_t, NotifyEos, (), (override)); 35 MOCK_METHOD(sptr<Surface>, CreateInputSurface, (), (override)); 36 MOCK_METHOD(int32_t, SetOutputSurface, (sptr<Surface> surface), (override)); 37 MOCK_METHOD( 38 int32_t, QueueInputBuffer, (uint32_t index, AVCodecBufferInfo info, AVCodecBufferFlag flag), (override)); 39 MOCK_METHOD(int32_t, QueueInputBuffer, (uint32_t index), (override)); 40 MOCK_METHOD(int32_t, QueueInputParameter, (uint32_t index), (override)); 41 MOCK_METHOD(int32_t, GetOutputFormat, (Format & format), (override)); 42 MOCK_METHOD(int32_t, ReleaseOutputBuffer, (uint32_t index, bool render), (override)); 43 MOCK_METHOD(int32_t, RenderOutputBufferAtTime, (uint32_t index, int64_t renderTimestampNs), (override)); 44 MOCK_METHOD(int32_t, SetParameter, (const Format &format), (override)); 45 MOCK_METHOD(int32_t, SetCallback, (const std::shared_ptr<AVCodecCallback> &callback), (override)); 46 MOCK_METHOD(int32_t, SetCallback, (const std::shared_ptr<MediaCodecCallback> &callback), (override)); 47 MOCK_METHOD(int32_t, SetCallback, (const std::shared_ptr<MediaCodecParameterCallback> &callback), (override)); 48 MOCK_METHOD( 49 int32_t, SetCallback, (const std::shared_ptr<MediaCodecParameterWithAttrCallback> &callback), (override)); 50 MOCK_METHOD(int32_t, ChangePlugin, (const std::string &mime, bool isEncoder, const std::shared_ptr<Meta> &meta), 51 (override)); 52 MOCK_METHOD(int32_t, SetCodecCallback, (const std::shared_ptr<MediaCodecCallback> &codecCallback), (override)); 53 MOCK_METHOD(void, SetDumpInfo, (bool isDump, uint64_t instanceId), (override)); 54 MOCK_METHOD(int32_t, GetInputFormat, (Format & format), (override)); 55 MOCK_METHOD(int32_t, SetDecryptConfig, 56 (const sptr<DrmStandard::IMediaKeySessionService> &keySession, const bool svpFlag), (override)); 57 MOCK_METHOD(int32_t, CreateCodecByName, (const std::string &name), (override)); 58 MOCK_METHOD(int32_t, Configure, (const std::shared_ptr<Meta> &meta), (override)); 59 MOCK_METHOD(int32_t, SetParameter, (const std::shared_ptr<Meta> ¶meter), (override)); 60 MOCK_METHOD(int32_t, GetOutputFormat, (std::shared_ptr<Meta> & parameter), (override)); 61 MOCK_METHOD(int32_t, SetOutputBufferQueue, (const sptr<AVBufferQueueProducer> &bufferQueueProducer), (override)); 62 MOCK_METHOD(int32_t, Prepare, (), (override)); 63 MOCK_METHOD(sptr<AVBufferQueueProducer>, GetInputBufferQueue, (), (override)); 64 MOCK_METHOD(void, ProcessInputBuffer, (), (override)); 65 MOCK_METHOD(bool, CheckRunning, (), (override)); 66 MOCK_METHOD(int32_t, SetAudioDecryptionConfig, 67 (const sptr<DrmStandard::IMediaKeySessionService> &keySession, const bool svpFlag), (override)); 68 MOCK_METHOD(sptr<AVBufferQueueConsumer>, GetInputBufferQueueConsumer, (), (override)); 69 MOCK_METHOD(sptr<AVBufferQueueProducer>, GetOutputBufferQueueProducer, (), (override)); 70 MOCK_METHOD( 71 void, ProcessInputBufferInner, (bool isTriggeredByOutPort, bool isFlushed, uint32_t &bufferStatus), (override)); 72 73 MOCK_METHOD(int32_t, GetChannelId, (int32_t & channelId)); 74 MOCK_METHOD(int32_t, SetLowPowerPlayerMode, (bool isLpp)); 75 MOCK_METHOD(int32_t, NotifyMemoryExchange, (const bool exchangeFlag), (override)); 76 }; 77 78 class AudioCodecInnerTest : public ::testing::Test { 79 protected: SetUp()80 void SetUp() override 81 { 82 mockCodecService_ = std::make_shared<MockCodecService>(); 83 avCodecAudioCodecInnerImpl_ = std::make_unique<AVCodecAudioCodecInnerImpl>(); 84 avCodecAudioCodecInnerImpl_->codecService_ = mockCodecService_; 85 innerBufferQueue_ = 86 AVBufferQueue::Create(DEFAULT_BUFFER_SIZE, MemoryType::SHARED_MEMORY, "AudioCodecInnerTest"); 87 } 88 TearDown()89 void TearDown() override 90 {} 91 92 std::shared_ptr<MockCodecService> mockCodecService_; 93 std::unique_ptr<AVCodecAudioCodecInnerImpl> avCodecAudioCodecInnerImpl_; 94 std::shared_ptr<AVBufferQueue> innerBufferQueue_; 95 }; 96 97 HWTEST_F(AudioCodecInnerTest, ATC_Configure_ShouldReturnInvalidOperation_WhenCodecServiceIsNull, TestSize.Level0) 98 { 99 avCodecAudioCodecInnerImpl_->codecService_.reset(); 100 std::shared_ptr<Meta> meta = std::make_shared<Meta>(); 101 int32_t result = avCodecAudioCodecInnerImpl_->Configure(meta); 102 EXPECT_EQ(static_cast<int32_t>(AVCodecServiceErrCode::AVCS_ERR_INVALID_OPERATION), result); 103 } 104 105 HWTEST_F(AudioCodecInnerTest, ATC_Configure_ShouldCreateSyncCodecAdapter_WhenSyncModeIsEnabled, TestSize.Level0) 106 { 107 std::shared_ptr<Meta> meta = std::make_shared<Meta>(); 108 meta->Set<Tag::AV_CODEC_ENABLE_SYNC_MODE>(true); 109 EXPECT_CALL(*mockCodecService_, SetOutputBufferQueue(_)) 110 .WillOnce(Return(static_cast<int32_t>(AVCodecServiceErrCode::AVCS_ERR_OK))); 111 112 int32_t result = avCodecAudioCodecInnerImpl_->Configure(meta); 113 EXPECT_EQ(static_cast<int32_t>(AVCodecServiceErrCode::AVCS_ERR_OK), result); 114 EXPECT_NE(nullptr, avCodecAudioCodecInnerImpl_->syncCodecAdapter_); 115 } 116 117 HWTEST_F(AudioCodecInnerTest, ATC_Configure_ShouldResetSyncCodecAdapter_WhenSetProducerFails, TestSize.Level0) 118 { 119 std::shared_ptr<Meta> meta = std::make_shared<Meta>(); 120 meta->Set<Tag::AV_CODEC_ENABLE_SYNC_MODE>(true); 121 EXPECT_CALL(*mockCodecService_, SetOutputBufferQueue(_)) 122 .WillOnce(Return(static_cast<int32_t>(AVCodecServiceErrCode::AVCS_ERR_UNKNOWN))); 123 int32_t result = avCodecAudioCodecInnerImpl_->Configure(meta); 124 EXPECT_EQ(static_cast<int32_t>(AVCodecServiceErrCode::AVCS_ERR_UNKNOWN), result); 125 EXPECT_EQ(nullptr, avCodecAudioCodecInnerImpl_->syncCodecAdapter_); 126 } 127 128 HWTEST_F(AudioCodecInnerTest, ATC_Configure_ShouldCallCodecServiceConfigure_WhenSyncModeIsDisabled, TestSize.Level0) 129 { 130 std::shared_ptr<Meta> meta = std::make_shared<Meta>(); 131 EXPECT_CALL(*mockCodecService_, Configure(meta)) 132 .WillOnce(Return(static_cast<int32_t>(AVCodecServiceErrCode::AVCS_ERR_OK))); 133 134 int32_t result = avCodecAudioCodecInnerImpl_->Configure(meta); 135 EXPECT_EQ(static_cast<int32_t>(AVCodecServiceErrCode::AVCS_ERR_OK), result); 136 EXPECT_EQ(nullptr, avCodecAudioCodecInnerImpl_->syncCodecAdapter_); 137 } 138 139 HWTEST_F( 140 AudioCodecInnerTest, ATC_SetOutputBufferQueue_ShouldReturnInvalidOperation_WhenCodecServiceIsNull, TestSize.Level0) 141 { 142 avCodecAudioCodecInnerImpl_->codecService_.reset(); 143 int32_t result = avCodecAudioCodecInnerImpl_->SetOutputBufferQueue(nullptr); 144 EXPECT_EQ(static_cast<int32_t>(AVCodecServiceErrCode::AVCS_ERR_INVALID_OPERATION), result); 145 } 146 147 HWTEST_F(AudioCodecInnerTest, ATC_SetOutputBufferQueue_ShouldReturnOk_WhenSyncCodecAdapterIsNotNull, TestSize.Level0) 148 { 149 avCodecAudioCodecInnerImpl_->syncCodecAdapter_ = std::make_shared<AVCodecAudioCodecInnerImpl::SyncCodecAdapter>(4); 150 int32_t result = avCodecAudioCodecInnerImpl_->SetOutputBufferQueue(innerBufferQueue_->GetProducer()); 151 EXPECT_EQ(static_cast<int32_t>(AVCodecServiceErrCode::AVCS_ERR_OK), result); 152 } 153 154 HWTEST_F(AudioCodecInnerTest, 155 ATC_SetOutputBufferQueue_ShouldCallCodecServiceSetOutputBufferQueue_WhenSyncCodecAdapterIsNull, TestSize.Level0) 156 { 157 EXPECT_CALL(*mockCodecService_, SetOutputBufferQueue(innerBufferQueue_->GetProducer())) 158 .WillOnce(Return(static_cast<int32_t>(AVCodecServiceErrCode::AVCS_ERR_OK))); 159 int32_t result = avCodecAudioCodecInnerImpl_->SetOutputBufferQueue(innerBufferQueue_->GetProducer()); 160 EXPECT_EQ(static_cast<int32_t>(AVCodecServiceErrCode::AVCS_ERR_OK), result); 161 } 162 163 HWTEST_F(AudioCodecInnerTest, ATC_QueryInputBuffer_ShouldReturnInvalid_WhenSyncModeIsDisabled, TestSize.Level0) 164 { 165 uint32_t index = 0; 166 const size_t bufferSize = 0; 167 const int64_t timeoutUs = 0; 168 int32_t result = avCodecAudioCodecInnerImpl_->QueryInputBuffer(&index, bufferSize, timeoutUs); 169 EXPECT_EQ(static_cast<int32_t>(AVCodecServiceErrCode::AVCS_ERR_INVALID_VAL), result); 170 } 171 172 HWTEST_F(AudioCodecInnerTest, ATC_GetInputBuffer_ShouldReturnInvalid_WhenSyncModeIsDisabled, TestSize.Level0) 173 { 174 const uint32_t index = 0; 175 auto result = avCodecAudioCodecInnerImpl_->GetInputBuffer(index); 176 EXPECT_EQ(nullptr, result); 177 } 178 179 HWTEST_F(AudioCodecInnerTest, ATC_PushInputBuffer_ShouldReturnInvalid_WhenSyncModeIsDisabled, TestSize.Level0) 180 { 181 const uint32_t index = 0; 182 int32_t result = avCodecAudioCodecInnerImpl_->PushInputBuffer(index, true); 183 EXPECT_EQ(static_cast<int32_t>(AVCodecServiceErrCode::AVCS_ERR_INVALID_VAL), result); 184 } 185 186 HWTEST_F(AudioCodecInnerTest, ATC_GetOutputBuffer_ShouldReturnInvalid_WhenSyncModeIsDisabled, TestSize.Level0) 187 { 188 const int64_t timeoutUs = 0; 189 auto result = avCodecAudioCodecInnerImpl_->GetOutputBuffer(timeoutUs); 190 EXPECT_EQ(nullptr, result); 191 } 192 193 HWTEST_F(AudioCodecInnerTest, ATC_ReleaseOutputBuffer_ShouldReturnInvalid_WhenSyncModeIsDisabled, TestSize.Level0) 194 { 195 std::shared_ptr<AVBuffer> buffer; 196 int32_t result = avCodecAudioCodecInnerImpl_->ReleaseOutputBuffer(buffer); 197 EXPECT_EQ(static_cast<int32_t>(AVCodecServiceErrCode::AVCS_ERR_INVALID_VAL), result); 198 } 199 } // namespace Media 200 } // namespace OHOS