BufferQueue_test.cpp revision a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0b
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 58a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopianstruct DummyConsumer : public BnConsumerListener { 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); 65595264f1af12e25dce57d7c5b1d52ed86ac0d0c9Mathias Agopian mBQ->consumerConnect(dc, false); 662adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden IGraphicBufferProducer::QueueBufferOutput qbo; 67595264f1af12e25dce57d7c5b1d52ed86ac0d0c9Mathias Agopian mBQ->connect(NATIVE_WINDOW_API_CPU, false, &qbo); 689e75ddda93888755d0b14144b62e896cd9f78f3aJamie Gennis mBQ->setBufferCount(4); 699e75ddda93888755d0b14144b62e896cd9f78f3aJamie Gennis 709e75ddda93888755d0b14144b62e896cd9f78f3aJamie Gennis int slot; 719e75ddda93888755d0b14144b62e896cd9f78f3aJamie Gennis sp<Fence> fence; 729e75ddda93888755d0b14144b62e896cd9f78f3aJamie Gennis sp<GraphicBuffer> buf; 732adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden IGraphicBufferProducer::QueueBufferInput qbi(0, Rect(0, 0, 1, 1), 747cdd786fa80cf03551291ae8feca7b77583be1c5Mathias Agopian NATIVE_WINDOW_SCALING_MODE_FREEZE, 0, false, Fence::NO_FENCE); 759e75ddda93888755d0b14144b62e896cd9f78f3aJamie Gennis BufferQueue::BufferItem item; 769e75ddda93888755d0b14144b62e896cd9f78f3aJamie Gennis 779e75ddda93888755d0b14144b62e896cd9f78f3aJamie Gennis for (int i = 0; i < 2; i++) { 782adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden ASSERT_EQ(IGraphicBufferProducer::BUFFER_NEEDS_REALLOCATION, 797cdd786fa80cf03551291ae8feca7b77583be1c5Mathias Agopian mBQ->dequeueBuffer(&slot, &fence, false, 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)); 831585c4d9fbbba3ba70ae625923b85cd02cb8a0fdAndy McFadden ASSERT_EQ(OK, mBQ->acquireBuffer(&item, 0)); 849e75ddda93888755d0b14144b62e896cd9f78f3aJamie Gennis } 859e75ddda93888755d0b14144b62e896cd9f78f3aJamie Gennis 862adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden ASSERT_EQ(IGraphicBufferProducer::BUFFER_NEEDS_REALLOCATION, 877cdd786fa80cf03551291ae8feca7b77583be1c5Mathias Agopian mBQ->dequeueBuffer(&slot, &fence, false, 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. 931585c4d9fbbba3ba70ae625923b85cd02cb8a0fdAndy McFadden ASSERT_EQ(INVALID_OPERATION, mBQ->acquireBuffer(&item, 0)); 949e75ddda93888755d0b14144b62e896cd9f78f3aJamie Gennis} 959e75ddda93888755d0b14144b62e896cd9f78f3aJamie Gennis 96c68f2ecfa02037144d1a3856f637a77f523cf416Jamie GennisTEST_F(BufferQueueTest, SetMaxAcquiredBufferCountWithIllegalValues_ReturnsError) { 97c68f2ecfa02037144d1a3856f637a77f523cf416Jamie Gennis sp<DummyConsumer> dc(new DummyConsumer); 98595264f1af12e25dce57d7c5b1d52ed86ac0d0c9Mathias Agopian mBQ->consumerConnect(dc, false); 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); 109595264f1af12e25dce57d7c5b1d52ed86ac0d0c9Mathias Agopian mBQ->consumerConnect(dc, false); 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