BufferQueue_test.cpp revision 2e336496c3b3b78910cf1c496e21dc4909ee32ad
1/* 2 * Copyright (C) 2012 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17#define LOG_TAG "BufferQueue_test" 18//#define LOG_NDEBUG 0 19 20#include <gtest/gtest.h> 21 22#include <utils/String8.h> 23#include <utils/threads.h> 24 25#include <ui/GraphicBuffer.h> 26 27#include <gui/BufferQueue.h> 28 29namespace android { 30 31class BufferQueueTest : public ::testing::Test { 32protected: 33 34 BufferQueueTest() {} 35 36 virtual void SetUp() { 37 const ::testing::TestInfo* const testInfo = 38 ::testing::UnitTest::GetInstance()->current_test_info(); 39 ALOGV("Begin test: %s.%s", testInfo->test_case_name(), 40 testInfo->name()); 41 42 mBQ = new BufferQueue(); 43 } 44 45 virtual void TearDown() { 46 mBQ.clear(); 47 48 const ::testing::TestInfo* const testInfo = 49 ::testing::UnitTest::GetInstance()->current_test_info(); 50 ALOGV("End test: %s.%s", testInfo->test_case_name(), 51 testInfo->name()); 52 } 53 54 void GetMinUndequeuedBufferCount(int* bufferCount) { 55 ASSERT_NE((void*)NULL, bufferCount); 56 ASSERT_EQ(OK, mBQ->query(NATIVE_WINDOW_MIN_UNDEQUEUED_BUFFERS, bufferCount)); 57 ASSERT_LE(0, *bufferCount); // non-negative 58 } 59 60 sp<BufferQueue> mBQ; 61}; 62 63struct DummyConsumer : public BnConsumerListener { 64 virtual void onFrameAvailable() {} 65 virtual void onBuffersReleased() {} 66}; 67 68TEST_F(BufferQueueTest, AcquireBuffer_ExceedsMaxAcquireCount_Fails) { 69 sp<DummyConsumer> dc(new DummyConsumer); 70 mBQ->consumerConnect(dc, false); 71 IGraphicBufferProducer::QueueBufferOutput qbo; 72 mBQ->connect(NULL, NATIVE_WINDOW_API_CPU, false, &qbo); 73 mBQ->setBufferCount(4); 74 75 int slot; 76 sp<Fence> fence; 77 sp<GraphicBuffer> buf; 78 IGraphicBufferProducer::QueueBufferInput qbi(0, false, Rect(0, 0, 1, 1), 79 NATIVE_WINDOW_SCALING_MODE_FREEZE, 0, false, Fence::NO_FENCE); 80 BufferQueue::BufferItem item; 81 82 for (int i = 0; i < 2; i++) { 83 ASSERT_EQ(IGraphicBufferProducer::BUFFER_NEEDS_REALLOCATION, 84 mBQ->dequeueBuffer(&slot, &fence, false, 1, 1, 0, 85 GRALLOC_USAGE_SW_READ_OFTEN)); 86 ASSERT_EQ(OK, mBQ->requestBuffer(slot, &buf)); 87 ASSERT_EQ(OK, mBQ->queueBuffer(slot, qbi, &qbo)); 88 ASSERT_EQ(OK, mBQ->acquireBuffer(&item, 0)); 89 } 90 91 ASSERT_EQ(IGraphicBufferProducer::BUFFER_NEEDS_REALLOCATION, 92 mBQ->dequeueBuffer(&slot, &fence, false, 1, 1, 0, 93 GRALLOC_USAGE_SW_READ_OFTEN)); 94 ASSERT_EQ(OK, mBQ->requestBuffer(slot, &buf)); 95 ASSERT_EQ(OK, mBQ->queueBuffer(slot, qbi, &qbo)); 96 97 // Acquire the third buffer, which should fail. 98 ASSERT_EQ(INVALID_OPERATION, mBQ->acquireBuffer(&item, 0)); 99} 100 101TEST_F(BufferQueueTest, SetMaxAcquiredBufferCountWithIllegalValues_ReturnsError) { 102 sp<DummyConsumer> dc(new DummyConsumer); 103 mBQ->consumerConnect(dc, false); 104 105 int minBufferCount; 106 ASSERT_NO_FATAL_FAILURE(GetMinUndequeuedBufferCount(&minBufferCount)); 107 EXPECT_EQ(BAD_VALUE, mBQ->setMaxAcquiredBufferCount(minBufferCount - 1)); 108 109 EXPECT_EQ(BAD_VALUE, mBQ->setMaxAcquiredBufferCount(0)); 110 EXPECT_EQ(BAD_VALUE, mBQ->setMaxAcquiredBufferCount(-3)); 111 EXPECT_EQ(BAD_VALUE, mBQ->setMaxAcquiredBufferCount( 112 BufferQueue::MAX_MAX_ACQUIRED_BUFFERS+1)); 113 EXPECT_EQ(BAD_VALUE, mBQ->setMaxAcquiredBufferCount(100)); 114} 115 116TEST_F(BufferQueueTest, SetMaxAcquiredBufferCountWithLegalValues_Succeeds) { 117 sp<DummyConsumer> dc(new DummyConsumer); 118 mBQ->consumerConnect(dc, false); 119 120 int minBufferCount; 121 ASSERT_NO_FATAL_FAILURE(GetMinUndequeuedBufferCount(&minBufferCount)); 122 123 EXPECT_EQ(OK, mBQ->setMaxAcquiredBufferCount(1)); 124 EXPECT_EQ(OK, mBQ->setMaxAcquiredBufferCount(2)); 125 EXPECT_EQ(OK, mBQ->setMaxAcquiredBufferCount(minBufferCount)); 126 EXPECT_EQ(OK, mBQ->setMaxAcquiredBufferCount( 127 BufferQueue::MAX_MAX_ACQUIRED_BUFFERS)); 128} 129 130} // namespace android 131