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