diff options
Diffstat (limited to 'chromium/media/gpu/vaapi/vaapi_wrapper_unittest.cc')
-rw-r--r-- | chromium/media/gpu/vaapi/vaapi_wrapper_unittest.cc | 149 |
1 files changed, 149 insertions, 0 deletions
diff --git a/chromium/media/gpu/vaapi/vaapi_wrapper_unittest.cc b/chromium/media/gpu/vaapi/vaapi_wrapper_unittest.cc new file mode 100644 index 00000000000..cded354e7e8 --- /dev/null +++ b/chromium/media/gpu/vaapi/vaapi_wrapper_unittest.cc @@ -0,0 +1,149 @@ +// Copyright 2021 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include <va/va.h> + +#include "media/gpu/vaapi/vaapi_wrapper.h" +#include "testing/gmock/include/gmock/gmock.h" +#include "testing/gtest/include/gtest/gtest.h" + +using ::testing::_; +using ::testing::Invoke; +using ::testing::Return; + +namespace media { +namespace { +VaapiWrapper::VABufferDescriptor CreateVABufferDescriptor() { + constexpr static char kData[] = "vaBufferData"; + return VaapiWrapper::VABufferDescriptor{VAProcPipelineParameterBufferType, + sizeof(kData), kData}; +} + +class MockVaapiWrapper : public VaapiWrapper { + public: + MockVaapiWrapper() : VaapiWrapper(kVideoProcess) {} + MOCK_METHOD1(SubmitBuffer_Locked, bool(const VABufferDescriptor&)); + MOCK_METHOD0(DestroyPendingBuffers_Locked, void()); + + protected: + ~MockVaapiWrapper() override = default; +}; +} // namespace + +class VaapiWrapperTest : public testing::Test { + public: + VaapiWrapperTest() = default; + + void SetUp() override { + // Create a VaapiWrapper for testing. + mock_vaapi_wrapper_ = base::MakeRefCounted<MockVaapiWrapper>(); + ASSERT_TRUE(mock_vaapi_wrapper_); + + ON_CALL(*mock_vaapi_wrapper_, SubmitBuffer_Locked) + .WillByDefault( + Invoke(this, &VaapiWrapperTest::DefaultSubmitBuffer_Locked)); + ON_CALL(*mock_vaapi_wrapper_, DestroyPendingBuffers_Locked) + .WillByDefault(Invoke( + this, &VaapiWrapperTest::DefaultDestroyPendingBuffers_Locked)); + } + void TearDown() override { + // The VaapiWrapper destructor calls DestroyPendingBuffers_Locked(). Since + // MockVaapiWrapper is a derived class, + // MockVaapiWrapper::DestroyPendingBuffers_Locked() won't get called during + // destruction even though it's a virtual function. Instead, + // VaapiWrapper::DestroyPendingBuffers_Locked() will get called. Therefore, + // we need to clear |pending_va_buffers_| before this happens so that + // VaapiWrapper::DestroyPendingBuffers_Locked() doesn't call + // vaDestroyBuffer(). + mock_vaapi_wrapper_->pending_va_buffers_.clear(); + mock_vaapi_wrapper_.reset(); + } + + bool DefaultSubmitBuffer_Locked( + const VaapiWrapper::VABufferDescriptor& va_buffer) + EXCLUSIVE_LOCKS_REQUIRED(mock_vaapi_wrapper_->va_lock_) { + if (va_buffer.data) { + constexpr VABufferID kFakeBufferId = 1234; + mock_vaapi_wrapper_->pending_va_buffers_.push_back(kFakeBufferId); + return true; + } + // When |va_buffer|.data is null, the base method should return false and + // no libva calls should be made. + const bool submit_buffer_res = + (*mock_vaapi_wrapper_).VaapiWrapper::SubmitBuffer_Locked(va_buffer); + if (submit_buffer_res) + ADD_FAILURE(); + return false; + } + + void DefaultDestroyPendingBuffers_Locked() + EXCLUSIVE_LOCKS_REQUIRED(mock_vaapi_wrapper_->va_lock_) { + mock_vaapi_wrapper_->pending_va_buffers_.clear(); + } + + size_t GetPendingBuffersSize() const { + return mock_vaapi_wrapper_->pending_va_buffers_.size(); + } + + protected: + scoped_refptr<MockVaapiWrapper> mock_vaapi_wrapper_; +}; + +// This test ensures SubmitBuffer() calls SubmitBuffer_Locked(). +TEST_F(VaapiWrapperTest, SubmitBuffer) { + constexpr size_t kNumBuffers = 3; + auto va_buffer = CreateVABufferDescriptor(); + + EXPECT_CALL(*mock_vaapi_wrapper_, SubmitBuffer_Locked(_)).Times(kNumBuffers); + for (size_t i = 0; i < kNumBuffers; ++i) { + EXPECT_TRUE(mock_vaapi_wrapper_->SubmitBuffer( + va_buffer.type, va_buffer.size, va_buffer.data)); + } + EXPECT_EQ(GetPendingBuffersSize(), kNumBuffers); +} + +// This test ensures SubmitBuffers() calls SubmitBuffer_Locked() as many times +// as the number of passed buffers. +TEST_F(VaapiWrapperTest, SubmitBuffers) { + constexpr size_t kNumBuffers = 3; + auto va_buffer = CreateVABufferDescriptor(); + std::vector<VaapiWrapper::VABufferDescriptor> buffers(kNumBuffers, va_buffer); + + EXPECT_CALL(*mock_vaapi_wrapper_, SubmitBuffer_Locked(_)).Times(kNumBuffers); + EXPECT_TRUE(mock_vaapi_wrapper_->SubmitBuffers(buffers)); + EXPECT_EQ(GetPendingBuffersSize(), kNumBuffers); +} + +// This test ensures DestroyPendingBuffers_Locked() is executed on a failure of +// SubmitBuffer(). +TEST_F(VaapiWrapperTest, FailOnSubmitBuffer) { + auto va_buffer = CreateVABufferDescriptor(); + + ::testing::InSequence s; + EXPECT_CALL(*mock_vaapi_wrapper_, SubmitBuffer_Locked(_)).Times(2); + EXPECT_CALL(*mock_vaapi_wrapper_, DestroyPendingBuffers_Locked); + EXPECT_TRUE(mock_vaapi_wrapper_->SubmitBuffer(va_buffer.type, va_buffer.size, + va_buffer.data)); + EXPECT_FALSE(mock_vaapi_wrapper_->SubmitBuffer(va_buffer.type, va_buffer.size, + /*data=*/nullptr)); + EXPECT_EQ(GetPendingBuffersSize(), 0u); +} + +// This test ensures DestroyPendingBuffers_Locked() is executed on a failure of +// SubmitBuffers(). +TEST_F(VaapiWrapperTest, FailOnSubmitBuffers) { + constexpr size_t kNumBuffers = 3; + auto va_buffer = CreateVABufferDescriptor(); + std::vector<VaapiWrapper::VABufferDescriptor> buffers(kNumBuffers, va_buffer); + // Set data to nullptr so that VaapiWrapper::SubmitBuffer_Locked() fails. + buffers[1].data = nullptr; + + ::testing::InSequence s; + EXPECT_CALL(*mock_vaapi_wrapper_, SubmitBuffer_Locked(_)) + .Times(kNumBuffers - 1); + EXPECT_CALL(*mock_vaapi_wrapper_, DestroyPendingBuffers_Locked); + EXPECT_FALSE(mock_vaapi_wrapper_->SubmitBuffers(buffers)); + EXPECT_EQ(GetPendingBuffersSize(), 0u); +} +} // namespace media |