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