Home | History | Annotate | Download | only in tests
      1 /*
      2  * Copyright 2018 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 "GraphicBufferTest"
     18 
     19 #include <ui/BufferHubBuffer.h>
     20 #include <ui/GraphicBuffer.h>
     21 
     22 #include <gtest/gtest.h>
     23 
     24 namespace android {
     25 
     26 namespace {
     27 
     28 constexpr uint32_t kTestWidth = 1024;
     29 constexpr uint32_t kTestHeight = 1;
     30 constexpr uint32_t kTestFormat = HAL_PIXEL_FORMAT_BLOB;
     31 constexpr uint32_t kTestLayerCount = 1;
     32 constexpr uint64_t kTestUsage = GraphicBuffer::USAGE_SW_WRITE_OFTEN;
     33 
     34 } // namespace
     35 
     36 class GraphicBufferTest : public testing::Test {};
     37 
     38 TEST_F(GraphicBufferTest, CreateFromBufferHubBuffer) {
     39     std::unique_ptr<BufferHubBuffer> b1 =
     40             BufferHubBuffer::create(kTestWidth, kTestHeight, kTestLayerCount, kTestFormat,
     41                                     kTestUsage, /*userMetadataSize=*/0);
     42     ASSERT_NE(b1, nullptr);
     43     EXPECT_TRUE(b1->isValid());
     44 
     45     sp<GraphicBuffer> gb(new GraphicBuffer(std::move(b1)));
     46     EXPECT_TRUE(gb->isBufferHubBuffer());
     47 
     48     EXPECT_EQ(gb->getWidth(), kTestWidth);
     49     EXPECT_EQ(gb->getHeight(), kTestHeight);
     50     EXPECT_EQ(static_cast<uint32_t>(gb->getPixelFormat()), kTestFormat);
     51     EXPECT_EQ(gb->getUsage(), kTestUsage);
     52     EXPECT_EQ(gb->getLayerCount(), kTestLayerCount);
     53 }
     54 
     55 TEST_F(GraphicBufferTest, InvalidBufferIdForNoneBufferHubBuffer) {
     56     sp<GraphicBuffer> gb(
     57             new GraphicBuffer(kTestWidth, kTestHeight, kTestFormat, kTestLayerCount, kTestUsage));
     58     EXPECT_FALSE(gb->isBufferHubBuffer());
     59     EXPECT_EQ(gb->getBufferId(), -1);
     60 }
     61 
     62 TEST_F(GraphicBufferTest, BufferIdMatchesBufferHubBufferId) {
     63     std::unique_ptr<BufferHubBuffer> b1 =
     64             BufferHubBuffer::create(kTestWidth, kTestHeight, kTestLayerCount, kTestFormat,
     65                                     kTestUsage, /*userMetadataSize=*/0);
     66     EXPECT_NE(b1, nullptr);
     67     EXPECT_TRUE(b1->isValid());
     68 
     69     int b1_id = b1->id();
     70     EXPECT_GE(b1_id, 0);
     71 
     72     sp<GraphicBuffer> gb(new GraphicBuffer(std::move(b1)));
     73     EXPECT_TRUE(gb->isBufferHubBuffer());
     74     EXPECT_EQ(gb->getBufferId(), b1_id);
     75 }
     76 
     77 TEST_F(GraphicBufferTest, flattenAndUnflatten) {
     78     std::unique_ptr<BufferHubBuffer> b1 =
     79             BufferHubBuffer::create(kTestWidth, kTestHeight, kTestLayerCount, kTestFormat,
     80                                     kTestUsage, /*userMetadataSize=*/0);
     81     ASSERT_NE(b1, nullptr);
     82     sp<GraphicBuffer> gb1(new GraphicBuffer(std::move(b1)));
     83     gb1->setGenerationNumber(42);
     84 
     85     size_t flattenedSize = gb1->getFlattenedSize();
     86     EXPECT_EQ(flattenedSize, 48);
     87     size_t fdCount = gb1->getFdCount();
     88     EXPECT_EQ(fdCount, 0);
     89 
     90     int data[flattenedSize];
     91     int fds[0];
     92 
     93     // Make copies of needed items since flatten modifies them.
     94     size_t flattenedSizeCopy = flattenedSize;
     95     size_t fdCountCopy = fdCount;
     96     void* dataStart = data;
     97     int* fdsStart = fds;
     98     status_t err = gb1->flatten(dataStart, flattenedSizeCopy, fdsStart, fdCountCopy);
     99     ASSERT_EQ(err, NO_ERROR);
    100     EXPECT_EQ(flattenedSizeCopy, 0);
    101     EXPECT_EQ(fdCountCopy, 0);
    102 
    103     size_t unflattenSize = flattenedSize;
    104     size_t unflattenFdCount = fdCount;
    105     const void* unflattenData = static_cast<const void*>(dataStart);
    106     const int* unflattenFdData = static_cast<const int*>(fdsStart);
    107 
    108     GraphicBuffer* gb2 = new GraphicBuffer();
    109     err = gb2->unflatten(unflattenData, unflattenSize, unflattenFdData, unflattenFdCount);
    110     ASSERT_EQ(err, NO_ERROR);
    111     EXPECT_TRUE(gb2->isBufferHubBuffer());
    112 
    113     EXPECT_EQ(gb2->getWidth(), kTestWidth);
    114     EXPECT_EQ(gb2->getHeight(), kTestHeight);
    115     EXPECT_EQ(static_cast<uint32_t>(gb2->getPixelFormat()), kTestFormat);
    116     EXPECT_EQ(gb2->getUsage(), kTestUsage);
    117     EXPECT_EQ(gb2->getLayerCount(), kTestLayerCount);
    118     EXPECT_EQ(gb1->getBufferId(), gb2->getBufferId());
    119     EXPECT_EQ(gb2->getGenerationNumber(), 42);
    120 }
    121 
    122 } // namespace android
    123