blob: 2dfd4fc52ec52e5a2c1f03c3e4ef1942a3fa3cbf [file] [log] [blame]
Fan Xu574a6852018-11-02 13:22:42 -07001#include <errno.h>
Fan Xucfbe0742018-11-21 15:03:32 -08002
3#include <bufferhub/BufferNode.h>
Fan Xu574a6852018-11-02 13:22:42 -07004#include <gmock/gmock.h>
5#include <gtest/gtest.h>
Fan Xud34a80a2018-12-04 11:32:39 -08006#include <ui/BufferHubDefs.h>
Fan Xu574a6852018-11-02 13:22:42 -07007#include <ui/GraphicBufferMapper.h>
8
9namespace android {
10namespace frameworks {
11namespace bufferhub {
12namespace V1_0 {
13namespace implementation {
14
15namespace {
16
17using testing::NotNull;
18
19const uint32_t kWidth = 640;
20const uint32_t kHeight = 480;
21const uint32_t kLayerCount = 1;
22const uint32_t kFormat = 1;
23const uint64_t kUsage = 0;
24const size_t kUserMetadataSize = 0;
Fan Xu574a6852018-11-02 13:22:42 -070025
26class BufferNodeTest : public ::testing::Test {
27protected:
28 void SetUp() override {
Tianyu Jiangc9d8d582019-02-10 22:05:34 -080029 mBufferNode =
Fan Xu574a6852018-11-02 13:22:42 -070030 new BufferNode(kWidth, kHeight, kLayerCount, kFormat, kUsage, kUserMetadataSize);
Tianyu Jiangc9d8d582019-02-10 22:05:34 -080031 ASSERT_TRUE(mBufferNode->isValid());
Fan Xu574a6852018-11-02 13:22:42 -070032 }
33
34 void TearDown() override {
Tianyu Jiangc9d8d582019-02-10 22:05:34 -080035 if (mBufferNode != nullptr) {
36 delete mBufferNode;
Fan Xu574a6852018-11-02 13:22:42 -070037 }
38 }
39
Tianyu Jiangc9d8d582019-02-10 22:05:34 -080040 BufferNode* mBufferNode = nullptr;
Fan Xu574a6852018-11-02 13:22:42 -070041};
42
43TEST_F(BufferNodeTest, TestCreateBufferNode) {
Tianyu Jiangc9d8d582019-02-10 22:05:34 -080044 EXPECT_EQ(mBufferNode->userMetadataSize(), kUserMetadataSize);
Fan Xu574a6852018-11-02 13:22:42 -070045 // Test the handle just allocated is good (i.e. able to be imported)
46 GraphicBufferMapper& mapper = GraphicBufferMapper::get();
47 const native_handle_t* outHandle;
48 status_t ret =
Tianyu Jiangc9d8d582019-02-10 22:05:34 -080049 mapper.importBuffer(mBufferNode->bufferHandle(), mBufferNode->bufferDesc().width,
50 mBufferNode->bufferDesc().height, mBufferNode->bufferDesc().layers,
51 mBufferNode->bufferDesc().format, mBufferNode->bufferDesc().usage,
52 mBufferNode->bufferDesc().stride, &outHandle);
Fan Xu574a6852018-11-02 13:22:42 -070053 EXPECT_EQ(ret, OK);
54 EXPECT_THAT(outHandle, NotNull());
55}
56
Tianyu Jiang727ede42019-02-01 11:44:51 -080057TEST_F(BufferNodeTest, TestaddNewActiveClientsBitToMask_twoNewClients) {
Tianyu Jiangc9d8d582019-02-10 22:05:34 -080058 uint32_t newClientStateMask1 = mBufferNode->addNewActiveClientsBitToMask();
59 EXPECT_EQ(mBufferNode->getActiveClientsBitMask(), newClientStateMask1);
Fan Xu574a6852018-11-02 13:22:42 -070060
61 // Request and add a new client_state_mask again.
62 // Active clients bit mask should be the union of the two new
63 // client_state_masks.
Tianyu Jiangc9d8d582019-02-10 22:05:34 -080064 uint32_t newClientStateMask2 = mBufferNode->addNewActiveClientsBitToMask();
65 EXPECT_EQ(mBufferNode->getActiveClientsBitMask(), newClientStateMask1 | newClientStateMask2);
Fan Xu574a6852018-11-02 13:22:42 -070066}
67
Tianyu Jiang727ede42019-02-01 11:44:51 -080068TEST_F(BufferNodeTest, TestaddNewActiveClientsBitToMask_32NewClients) {
Tianyu Jiangc9d8d582019-02-10 22:05:34 -080069 uint32_t newClientStateMask = 0U;
70 uint32_t currentMask = 0U;
71 uint32_t expectedMask = 0U;
Fan Xu574a6852018-11-02 13:22:42 -070072
Fan Xud34a80a2018-12-04 11:32:39 -080073 for (int i = 0; i < BufferHubDefs::kMaxNumberOfClients; ++i) {
Tianyu Jiangc9d8d582019-02-10 22:05:34 -080074 newClientStateMask = mBufferNode->addNewActiveClientsBitToMask();
75 EXPECT_NE(newClientStateMask, 0U);
76 EXPECT_FALSE(newClientStateMask & currentMask);
77 expectedMask = currentMask | newClientStateMask;
78 currentMask = mBufferNode->getActiveClientsBitMask();
79 EXPECT_EQ(currentMask, expectedMask);
Fan Xu574a6852018-11-02 13:22:42 -070080 }
81
82 // Method should fail upon requesting for more than maximum allowable clients.
Tianyu Jiangc9d8d582019-02-10 22:05:34 -080083 newClientStateMask = mBufferNode->addNewActiveClientsBitToMask();
84 EXPECT_EQ(newClientStateMask, 0U);
Fan Xu574a6852018-11-02 13:22:42 -070085 EXPECT_EQ(errno, E2BIG);
86}
87
88TEST_F(BufferNodeTest, TestRemoveActiveClientsBitFromMask) {
Tianyu Jiangc9d8d582019-02-10 22:05:34 -080089 mBufferNode->addNewActiveClientsBitToMask();
90 uint32_t currentMask = mBufferNode->getActiveClientsBitMask();
91 uint32_t newClientStateMask = mBufferNode->addNewActiveClientsBitToMask();
92 EXPECT_NE(mBufferNode->getActiveClientsBitMask(), currentMask);
Fan Xu574a6852018-11-02 13:22:42 -070093
Tianyu Jiangc9d8d582019-02-10 22:05:34 -080094 mBufferNode->removeClientsBitFromMask(newClientStateMask);
95 EXPECT_EQ(mBufferNode->getActiveClientsBitMask(), currentMask);
Fan Xu574a6852018-11-02 13:22:42 -070096
97 // Remove the test_mask again to the active client bit mask should not modify
98 // the value of active clients bit mask.
Tianyu Jiangc9d8d582019-02-10 22:05:34 -080099 mBufferNode->removeClientsBitFromMask(newClientStateMask);
100 EXPECT_EQ(mBufferNode->getActiveClientsBitMask(), currentMask);
Fan Xu574a6852018-11-02 13:22:42 -0700101}
102
103} // namespace
104
105} // namespace implementation
106} // namespace V1_0
107} // namespace bufferhub
108} // namespace frameworks
109} // namespace android