summaryrefslogtreecommitdiff
path: root/chromium/media/gpu/vaapi/vaapi_wrapper_unittest.cc
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/media/gpu/vaapi/vaapi_wrapper_unittest.cc')
-rw-r--r--chromium/media/gpu/vaapi/vaapi_wrapper_unittest.cc149
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