19e75ddda93888755d0b14144b62e896cd9f78f3aJamie Gennis/* 29e75ddda93888755d0b14144b62e896cd9f78f3aJamie Gennis * Copyright (C) 2012 The Android Open Source Project 39e75ddda93888755d0b14144b62e896cd9f78f3aJamie Gennis * 49e75ddda93888755d0b14144b62e896cd9f78f3aJamie Gennis * Licensed under the Apache License, Version 2.0 (the "License"); 59e75ddda93888755d0b14144b62e896cd9f78f3aJamie Gennis * you may not use this file except in compliance with the License. 69e75ddda93888755d0b14144b62e896cd9f78f3aJamie Gennis * You may obtain a copy of the License at 79e75ddda93888755d0b14144b62e896cd9f78f3aJamie Gennis * 89e75ddda93888755d0b14144b62e896cd9f78f3aJamie Gennis * http://www.apache.org/licenses/LICENSE-2.0 99e75ddda93888755d0b14144b62e896cd9f78f3aJamie Gennis * 109e75ddda93888755d0b14144b62e896cd9f78f3aJamie Gennis * Unless required by applicable law or agreed to in writing, software 119e75ddda93888755d0b14144b62e896cd9f78f3aJamie Gennis * distributed under the License is distributed on an "AS IS" BASIS, 129e75ddda93888755d0b14144b62e896cd9f78f3aJamie Gennis * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 139e75ddda93888755d0b14144b62e896cd9f78f3aJamie Gennis * See the License for the specific language governing permissions and 149e75ddda93888755d0b14144b62e896cd9f78f3aJamie Gennis * limitations under the License. 159e75ddda93888755d0b14144b62e896cd9f78f3aJamie Gennis */ 169e75ddda93888755d0b14144b62e896cd9f78f3aJamie Gennis 179e75ddda93888755d0b14144b62e896cd9f78f3aJamie Gennis#define LOG_TAG "BufferQueue_test" 189e75ddda93888755d0b14144b62e896cd9f78f3aJamie Gennis//#define LOG_NDEBUG 0 199e75ddda93888755d0b14144b62e896cd9f78f3aJamie Gennis 209e75ddda93888755d0b14144b62e896cd9f78f3aJamie Gennis#include <gtest/gtest.h> 219e75ddda93888755d0b14144b62e896cd9f78f3aJamie Gennis 229e75ddda93888755d0b14144b62e896cd9f78f3aJamie Gennis#include <utils/String8.h> 239e75ddda93888755d0b14144b62e896cd9f78f3aJamie Gennis#include <utils/threads.h> 249e75ddda93888755d0b14144b62e896cd9f78f3aJamie Gennis 259e75ddda93888755d0b14144b62e896cd9f78f3aJamie Gennis#include <ui/GraphicBuffer.h> 269e75ddda93888755d0b14144b62e896cd9f78f3aJamie Gennis#include <ui/FramebufferNativeWindow.h> 279e75ddda93888755d0b14144b62e896cd9f78f3aJamie Gennis 289e75ddda93888755d0b14144b62e896cd9f78f3aJamie Gennis#include <gui/BufferQueue.h> 299e75ddda93888755d0b14144b62e896cd9f78f3aJamie Gennis 309e75ddda93888755d0b14144b62e896cd9f78f3aJamie Gennisnamespace android { 319e75ddda93888755d0b14144b62e896cd9f78f3aJamie Gennis 329e75ddda93888755d0b14144b62e896cd9f78f3aJamie Gennisclass BufferQueueTest : public ::testing::Test { 339e75ddda93888755d0b14144b62e896cd9f78f3aJamie Gennisprotected: 349e75ddda93888755d0b14144b62e896cd9f78f3aJamie Gennis 359e75ddda93888755d0b14144b62e896cd9f78f3aJamie Gennis BufferQueueTest() {} 369e75ddda93888755d0b14144b62e896cd9f78f3aJamie Gennis 379e75ddda93888755d0b14144b62e896cd9f78f3aJamie Gennis virtual void SetUp() { 389e75ddda93888755d0b14144b62e896cd9f78f3aJamie Gennis const ::testing::TestInfo* const testInfo = 399e75ddda93888755d0b14144b62e896cd9f78f3aJamie Gennis ::testing::UnitTest::GetInstance()->current_test_info(); 409e75ddda93888755d0b14144b62e896cd9f78f3aJamie Gennis ALOGV("Begin test: %s.%s", testInfo->test_case_name(), 419e75ddda93888755d0b14144b62e896cd9f78f3aJamie Gennis testInfo->name()); 429e75ddda93888755d0b14144b62e896cd9f78f3aJamie Gennis 439e75ddda93888755d0b14144b62e896cd9f78f3aJamie Gennis mBQ = new BufferQueue(); 449e75ddda93888755d0b14144b62e896cd9f78f3aJamie Gennis } 459e75ddda93888755d0b14144b62e896cd9f78f3aJamie Gennis 469e75ddda93888755d0b14144b62e896cd9f78f3aJamie Gennis virtual void TearDown() { 479e75ddda93888755d0b14144b62e896cd9f78f3aJamie Gennis mBQ.clear(); 489e75ddda93888755d0b14144b62e896cd9f78f3aJamie Gennis 499e75ddda93888755d0b14144b62e896cd9f78f3aJamie Gennis const ::testing::TestInfo* const testInfo = 509e75ddda93888755d0b14144b62e896cd9f78f3aJamie Gennis ::testing::UnitTest::GetInstance()->current_test_info(); 519e75ddda93888755d0b14144b62e896cd9f78f3aJamie Gennis ALOGV("End test: %s.%s", testInfo->test_case_name(), 529e75ddda93888755d0b14144b62e896cd9f78f3aJamie Gennis testInfo->name()); 539e75ddda93888755d0b14144b62e896cd9f78f3aJamie Gennis } 549e75ddda93888755d0b14144b62e896cd9f78f3aJamie Gennis 559e75ddda93888755d0b14144b62e896cd9f78f3aJamie Gennis sp<BufferQueue> mBQ; 569e75ddda93888755d0b14144b62e896cd9f78f3aJamie Gennis}; 579e75ddda93888755d0b14144b62e896cd9f78f3aJamie Gennis 589e75ddda93888755d0b14144b62e896cd9f78f3aJamie Gennisstruct DummyConsumer : public BufferQueue::ConsumerListener { 599e75ddda93888755d0b14144b62e896cd9f78f3aJamie Gennis virtual void onFrameAvailable() {} 609e75ddda93888755d0b14144b62e896cd9f78f3aJamie Gennis virtual void onBuffersReleased() {} 619e75ddda93888755d0b14144b62e896cd9f78f3aJamie Gennis}; 629e75ddda93888755d0b14144b62e896cd9f78f3aJamie Gennis 639e75ddda93888755d0b14144b62e896cd9f78f3aJamie GennisTEST_F(BufferQueueTest, AcquireBuffer_ExceedsMaxAcquireCount_Fails) { 649e75ddda93888755d0b14144b62e896cd9f78f3aJamie Gennis sp<DummyConsumer> dc(new DummyConsumer); 659e75ddda93888755d0b14144b62e896cd9f78f3aJamie Gennis mBQ->consumerConnect(dc); 669e75ddda93888755d0b14144b62e896cd9f78f3aJamie Gennis ISurfaceTexture::QueueBufferOutput qbo; 679e75ddda93888755d0b14144b62e896cd9f78f3aJamie Gennis mBQ->connect(NATIVE_WINDOW_API_CPU, &qbo); 689e75ddda93888755d0b14144b62e896cd9f78f3aJamie Gennis mBQ->setBufferCount(4); 699e75ddda93888755d0b14144b62e896cd9f78f3aJamie Gennis 709e75ddda93888755d0b14144b62e896cd9f78f3aJamie Gennis int slot; 719e75ddda93888755d0b14144b62e896cd9f78f3aJamie Gennis sp<Fence> fence; 729e75ddda93888755d0b14144b62e896cd9f78f3aJamie Gennis sp<GraphicBuffer> buf; 739e75ddda93888755d0b14144b62e896cd9f78f3aJamie Gennis ISurfaceTexture::QueueBufferInput qbi(0, Rect(0, 0, 1, 1), 749e75ddda93888755d0b14144b62e896cd9f78f3aJamie Gennis NATIVE_WINDOW_SCALING_MODE_FREEZE, 0, fence); 759e75ddda93888755d0b14144b62e896cd9f78f3aJamie Gennis BufferQueue::BufferItem item; 769e75ddda93888755d0b14144b62e896cd9f78f3aJamie Gennis 779e75ddda93888755d0b14144b62e896cd9f78f3aJamie Gennis for (int i = 0; i < 2; i++) { 789e75ddda93888755d0b14144b62e896cd9f78f3aJamie Gennis ASSERT_EQ(ISurfaceTexture::BUFFER_NEEDS_REALLOCATION, 799e75ddda93888755d0b14144b62e896cd9f78f3aJamie Gennis mBQ->dequeueBuffer(&slot, fence, 1, 1, 0, 809e75ddda93888755d0b14144b62e896cd9f78f3aJamie Gennis GRALLOC_USAGE_SW_READ_OFTEN)); 819e75ddda93888755d0b14144b62e896cd9f78f3aJamie Gennis ASSERT_EQ(OK, mBQ->requestBuffer(slot, &buf)); 829e75ddda93888755d0b14144b62e896cd9f78f3aJamie Gennis ASSERT_EQ(OK, mBQ->queueBuffer(slot, qbi, &qbo)); 839e75ddda93888755d0b14144b62e896cd9f78f3aJamie Gennis ASSERT_EQ(OK, mBQ->acquireBuffer(&item)); 849e75ddda93888755d0b14144b62e896cd9f78f3aJamie Gennis } 859e75ddda93888755d0b14144b62e896cd9f78f3aJamie Gennis 869e75ddda93888755d0b14144b62e896cd9f78f3aJamie Gennis ASSERT_EQ(ISurfaceTexture::BUFFER_NEEDS_REALLOCATION, 879e75ddda93888755d0b14144b62e896cd9f78f3aJamie Gennis mBQ->dequeueBuffer(&slot, fence, 1, 1, 0, 889e75ddda93888755d0b14144b62e896cd9f78f3aJamie Gennis GRALLOC_USAGE_SW_READ_OFTEN)); 899e75ddda93888755d0b14144b62e896cd9f78f3aJamie Gennis ASSERT_EQ(OK, mBQ->requestBuffer(slot, &buf)); 909e75ddda93888755d0b14144b62e896cd9f78f3aJamie Gennis ASSERT_EQ(OK, mBQ->queueBuffer(slot, qbi, &qbo)); 919e75ddda93888755d0b14144b62e896cd9f78f3aJamie Gennis 929e75ddda93888755d0b14144b62e896cd9f78f3aJamie Gennis // Acquire the third buffer, which should fail. 939e75ddda93888755d0b14144b62e896cd9f78f3aJamie Gennis ASSERT_EQ(INVALID_OPERATION, mBQ->acquireBuffer(&item)); 949e75ddda93888755d0b14144b62e896cd9f78f3aJamie Gennis} 959e75ddda93888755d0b14144b62e896cd9f78f3aJamie Gennis 96c68f2ecfa02037144d1a3856f637a77f523cf416Jamie GennisTEST_F(BufferQueueTest, SetMaxAcquiredBufferCountWithIllegalValues_ReturnsError) { 97c68f2ecfa02037144d1a3856f637a77f523cf416Jamie Gennis sp<DummyConsumer> dc(new DummyConsumer); 98c68f2ecfa02037144d1a3856f637a77f523cf416Jamie Gennis mBQ->consumerConnect(dc); 99c68f2ecfa02037144d1a3856f637a77f523cf416Jamie Gennis 100c68f2ecfa02037144d1a3856f637a77f523cf416Jamie Gennis ASSERT_EQ(BAD_VALUE, mBQ->setMaxAcquiredBufferCount(0)); 101c68f2ecfa02037144d1a3856f637a77f523cf416Jamie Gennis ASSERT_EQ(BAD_VALUE, mBQ->setMaxAcquiredBufferCount(-3)); 102c68f2ecfa02037144d1a3856f637a77f523cf416Jamie Gennis ASSERT_EQ(BAD_VALUE, mBQ->setMaxAcquiredBufferCount( 103c68f2ecfa02037144d1a3856f637a77f523cf416Jamie Gennis BufferQueue::MAX_MAX_ACQUIRED_BUFFERS+1)); 104c68f2ecfa02037144d1a3856f637a77f523cf416Jamie Gennis ASSERT_EQ(BAD_VALUE, mBQ->setMaxAcquiredBufferCount(100)); 105c68f2ecfa02037144d1a3856f637a77f523cf416Jamie Gennis} 106c68f2ecfa02037144d1a3856f637a77f523cf416Jamie Gennis 107c68f2ecfa02037144d1a3856f637a77f523cf416Jamie GennisTEST_F(BufferQueueTest, SetMaxAcquiredBufferCountWithLegalValues_Succeeds) { 108c68f2ecfa02037144d1a3856f637a77f523cf416Jamie Gennis sp<DummyConsumer> dc(new DummyConsumer); 109c68f2ecfa02037144d1a3856f637a77f523cf416Jamie Gennis mBQ->consumerConnect(dc); 110c68f2ecfa02037144d1a3856f637a77f523cf416Jamie Gennis 111c68f2ecfa02037144d1a3856f637a77f523cf416Jamie Gennis ASSERT_EQ(OK, mBQ->setMaxAcquiredBufferCount(1)); 112c68f2ecfa02037144d1a3856f637a77f523cf416Jamie Gennis ASSERT_EQ(OK, mBQ->setMaxAcquiredBufferCount(2)); 113c68f2ecfa02037144d1a3856f637a77f523cf416Jamie Gennis ASSERT_EQ(OK, mBQ->setMaxAcquiredBufferCount( 114c68f2ecfa02037144d1a3856f637a77f523cf416Jamie Gennis BufferQueue::MAX_MAX_ACQUIRED_BUFFERS)); 115c68f2ecfa02037144d1a3856f637a77f523cf416Jamie Gennis} 116c68f2ecfa02037144d1a3856f637a77f523cf416Jamie Gennis 1179e75ddda93888755d0b14144b62e896cd9f78f3aJamie Gennis} // namespace android 118