BufferQueue_test.cpp revision 7ea777f097784492f880623067becac1b276f884
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 557ea777f097784492f880623067becac1b276f884Igor Murashkin void GetMinUndequeuedBufferCount(int* bufferCount) { 567ea777f097784492f880623067becac1b276f884Igor Murashkin ASSERT_NE((void*)NULL, bufferCount); 577ea777f097784492f880623067becac1b276f884Igor Murashkin ASSERT_EQ(OK, mBQ->query(NATIVE_WINDOW_MIN_UNDEQUEUED_BUFFERS, bufferCount)); 587ea777f097784492f880623067becac1b276f884Igor Murashkin ASSERT_LE(0, *bufferCount); // non-negative 597ea777f097784492f880623067becac1b276f884Igor Murashkin } 607ea777f097784492f880623067becac1b276f884Igor Murashkin 619e75ddda93888755d0b14144b62e896cd9f78f3aJamie Gennis sp<BufferQueue> mBQ; 629e75ddda93888755d0b14144b62e896cd9f78f3aJamie Gennis}; 639e75ddda93888755d0b14144b62e896cd9f78f3aJamie Gennis 64a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopianstruct DummyConsumer : public BnConsumerListener { 659e75ddda93888755d0b14144b62e896cd9f78f3aJamie Gennis virtual void onFrameAvailable() {} 669e75ddda93888755d0b14144b62e896cd9f78f3aJamie Gennis virtual void onBuffersReleased() {} 679e75ddda93888755d0b14144b62e896cd9f78f3aJamie Gennis}; 689e75ddda93888755d0b14144b62e896cd9f78f3aJamie Gennis 699e75ddda93888755d0b14144b62e896cd9f78f3aJamie GennisTEST_F(BufferQueueTest, AcquireBuffer_ExceedsMaxAcquireCount_Fails) { 709e75ddda93888755d0b14144b62e896cd9f78f3aJamie Gennis sp<DummyConsumer> dc(new DummyConsumer); 71595264f1af12e25dce57d7c5b1d52ed86ac0d0c9Mathias Agopian mBQ->consumerConnect(dc, false); 722adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden IGraphicBufferProducer::QueueBufferOutput qbo; 73799f51268006f319f6ae538dca670bfc7f522688Mathias Agopian mBQ->connect(NULL, NATIVE_WINDOW_API_CPU, false, &qbo); 749e75ddda93888755d0b14144b62e896cd9f78f3aJamie Gennis mBQ->setBufferCount(4); 759e75ddda93888755d0b14144b62e896cd9f78f3aJamie Gennis 769e75ddda93888755d0b14144b62e896cd9f78f3aJamie Gennis int slot; 779e75ddda93888755d0b14144b62e896cd9f78f3aJamie Gennis sp<Fence> fence; 789e75ddda93888755d0b14144b62e896cd9f78f3aJamie Gennis sp<GraphicBuffer> buf; 798b308ed70ed782f68c8075aac2a6b66bbfcdb9afAndy McFadden IGraphicBufferProducer::QueueBufferInput qbi(0, false, Rect(0, 0, 1, 1), 807cdd786fa80cf03551291ae8feca7b77583be1c5Mathias Agopian NATIVE_WINDOW_SCALING_MODE_FREEZE, 0, false, Fence::NO_FENCE); 819e75ddda93888755d0b14144b62e896cd9f78f3aJamie Gennis BufferQueue::BufferItem item; 829e75ddda93888755d0b14144b62e896cd9f78f3aJamie Gennis 839e75ddda93888755d0b14144b62e896cd9f78f3aJamie Gennis for (int i = 0; i < 2; i++) { 842adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden ASSERT_EQ(IGraphicBufferProducer::BUFFER_NEEDS_REALLOCATION, 857cdd786fa80cf03551291ae8feca7b77583be1c5Mathias Agopian mBQ->dequeueBuffer(&slot, &fence, false, 1, 1, 0, 869e75ddda93888755d0b14144b62e896cd9f78f3aJamie Gennis GRALLOC_USAGE_SW_READ_OFTEN)); 879e75ddda93888755d0b14144b62e896cd9f78f3aJamie Gennis ASSERT_EQ(OK, mBQ->requestBuffer(slot, &buf)); 889e75ddda93888755d0b14144b62e896cd9f78f3aJamie Gennis ASSERT_EQ(OK, mBQ->queueBuffer(slot, qbi, &qbo)); 891585c4d9fbbba3ba70ae625923b85cd02cb8a0fdAndy McFadden ASSERT_EQ(OK, mBQ->acquireBuffer(&item, 0)); 909e75ddda93888755d0b14144b62e896cd9f78f3aJamie Gennis } 919e75ddda93888755d0b14144b62e896cd9f78f3aJamie Gennis 922adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden ASSERT_EQ(IGraphicBufferProducer::BUFFER_NEEDS_REALLOCATION, 937cdd786fa80cf03551291ae8feca7b77583be1c5Mathias Agopian mBQ->dequeueBuffer(&slot, &fence, false, 1, 1, 0, 949e75ddda93888755d0b14144b62e896cd9f78f3aJamie Gennis GRALLOC_USAGE_SW_READ_OFTEN)); 959e75ddda93888755d0b14144b62e896cd9f78f3aJamie Gennis ASSERT_EQ(OK, mBQ->requestBuffer(slot, &buf)); 969e75ddda93888755d0b14144b62e896cd9f78f3aJamie Gennis ASSERT_EQ(OK, mBQ->queueBuffer(slot, qbi, &qbo)); 979e75ddda93888755d0b14144b62e896cd9f78f3aJamie Gennis 989e75ddda93888755d0b14144b62e896cd9f78f3aJamie Gennis // Acquire the third buffer, which should fail. 991585c4d9fbbba3ba70ae625923b85cd02cb8a0fdAndy McFadden ASSERT_EQ(INVALID_OPERATION, mBQ->acquireBuffer(&item, 0)); 1009e75ddda93888755d0b14144b62e896cd9f78f3aJamie Gennis} 1019e75ddda93888755d0b14144b62e896cd9f78f3aJamie Gennis 102c68f2ecfa02037144d1a3856f637a77f523cf416Jamie GennisTEST_F(BufferQueueTest, SetMaxAcquiredBufferCountWithIllegalValues_ReturnsError) { 103c68f2ecfa02037144d1a3856f637a77f523cf416Jamie Gennis sp<DummyConsumer> dc(new DummyConsumer); 104595264f1af12e25dce57d7c5b1d52ed86ac0d0c9Mathias Agopian mBQ->consumerConnect(dc, false); 105c68f2ecfa02037144d1a3856f637a77f523cf416Jamie Gennis 1067ea777f097784492f880623067becac1b276f884Igor Murashkin int minBufferCount; 1077ea777f097784492f880623067becac1b276f884Igor Murashkin ASSERT_NO_FATAL_FAILURE(GetMinUndequeuedBufferCount(&minBufferCount)); 1087ea777f097784492f880623067becac1b276f884Igor Murashkin EXPECT_EQ(BAD_VALUE, mBQ->setMaxAcquiredBufferCount(minBufferCount - 1)); 1097ea777f097784492f880623067becac1b276f884Igor Murashkin 1107ea777f097784492f880623067becac1b276f884Igor Murashkin EXPECT_EQ(BAD_VALUE, mBQ->setMaxAcquiredBufferCount(0)); 1117ea777f097784492f880623067becac1b276f884Igor Murashkin EXPECT_EQ(BAD_VALUE, mBQ->setMaxAcquiredBufferCount(-3)); 1127ea777f097784492f880623067becac1b276f884Igor Murashkin EXPECT_EQ(BAD_VALUE, mBQ->setMaxAcquiredBufferCount( 113c68f2ecfa02037144d1a3856f637a77f523cf416Jamie Gennis BufferQueue::MAX_MAX_ACQUIRED_BUFFERS+1)); 1147ea777f097784492f880623067becac1b276f884Igor Murashkin EXPECT_EQ(BAD_VALUE, mBQ->setMaxAcquiredBufferCount(100)); 115c68f2ecfa02037144d1a3856f637a77f523cf416Jamie Gennis} 116c68f2ecfa02037144d1a3856f637a77f523cf416Jamie Gennis 117c68f2ecfa02037144d1a3856f637a77f523cf416Jamie GennisTEST_F(BufferQueueTest, SetMaxAcquiredBufferCountWithLegalValues_Succeeds) { 118c68f2ecfa02037144d1a3856f637a77f523cf416Jamie Gennis sp<DummyConsumer> dc(new DummyConsumer); 119595264f1af12e25dce57d7c5b1d52ed86ac0d0c9Mathias Agopian mBQ->consumerConnect(dc, false); 120c68f2ecfa02037144d1a3856f637a77f523cf416Jamie Gennis 1217ea777f097784492f880623067becac1b276f884Igor Murashkin int minBufferCount; 1227ea777f097784492f880623067becac1b276f884Igor Murashkin ASSERT_NO_FATAL_FAILURE(GetMinUndequeuedBufferCount(&minBufferCount)); 1237ea777f097784492f880623067becac1b276f884Igor Murashkin 1247ea777f097784492f880623067becac1b276f884Igor Murashkin EXPECT_EQ(OK, mBQ->setMaxAcquiredBufferCount(1)); 1257ea777f097784492f880623067becac1b276f884Igor Murashkin EXPECT_EQ(OK, mBQ->setMaxAcquiredBufferCount(2)); 1267ea777f097784492f880623067becac1b276f884Igor Murashkin EXPECT_EQ(OK, mBQ->setMaxAcquiredBufferCount(minBufferCount)); 1277ea777f097784492f880623067becac1b276f884Igor Murashkin EXPECT_EQ(OK, mBQ->setMaxAcquiredBufferCount( 128c68f2ecfa02037144d1a3856f637a77f523cf416Jamie Gennis BufferQueue::MAX_MAX_ACQUIRED_BUFFERS)); 129c68f2ecfa02037144d1a3856f637a77f523cf416Jamie Gennis} 130c68f2ecfa02037144d1a3856f637a77f523cf416Jamie Gennis 1319e75ddda93888755d0b14144b62e896cd9f78f3aJamie Gennis} // namespace android 132