blob: df31d78b8918b8cbc890b1ff013853f0b7c5c196 [file] [log] [blame]
Fan Xu574a6852018-11-02 13:22:42 -07001#include <bufferhub/BufferNode.h>
2#include <errno.h>
3#include <gmock/gmock.h>
4#include <gtest/gtest.h>
5#include <ui/GraphicBufferMapper.h>
6
7namespace android {
8namespace frameworks {
9namespace bufferhub {
10namespace V1_0 {
11namespace implementation {
12
13namespace {
14
15using testing::NotNull;
16
17const uint32_t kWidth = 640;
18const uint32_t kHeight = 480;
19const uint32_t kLayerCount = 1;
20const uint32_t kFormat = 1;
21const uint64_t kUsage = 0;
22const size_t kUserMetadataSize = 0;
23const size_t kMaxClientsCount = dvr::BufferHubDefs::kMaxNumberOfClients;
24
25class BufferNodeTest : public ::testing::Test {
26protected:
27 void SetUp() override {
28 buffer_node =
29 new BufferNode(kWidth, kHeight, kLayerCount, kFormat, kUsage, kUserMetadataSize);
30 ASSERT_TRUE(buffer_node->IsValid());
31 }
32
33 void TearDown() override {
34 if (buffer_node != nullptr) {
35 delete buffer_node;
36 }
37 }
38
39 BufferNode* buffer_node = nullptr;
40};
41
42TEST_F(BufferNodeTest, TestCreateBufferNode) {
43 EXPECT_EQ(buffer_node->user_metadata_size(), kUserMetadataSize);
44 // Test the handle just allocated is good (i.e. able to be imported)
45 GraphicBufferMapper& mapper = GraphicBufferMapper::get();
46 const native_handle_t* outHandle;
47 status_t ret =
48 mapper.importBuffer(buffer_node->buffer_handle(), buffer_node->buffer_desc().width,
49 buffer_node->buffer_desc().height,
50 buffer_node->buffer_desc().layers,
51 buffer_node->buffer_desc().format, buffer_node->buffer_desc().usage,
52 buffer_node->buffer_desc().stride, &outHandle);
53 EXPECT_EQ(ret, OK);
54 EXPECT_THAT(outHandle, NotNull());
55}
56
57TEST_F(BufferNodeTest, TestAddNewActiveClientsBitToMask_twoNewClients) {
58 uint64_t new_client_state_mask_1 = buffer_node->AddNewActiveClientsBitToMask();
59 EXPECT_EQ(buffer_node->GetActiveClientsBitMask(), new_client_state_mask_1);
60
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.
64 uint64_t new_client_state_mask_2 = buffer_node->AddNewActiveClientsBitToMask();
65 EXPECT_EQ(buffer_node->GetActiveClientsBitMask(),
66 new_client_state_mask_1 | new_client_state_mask_2);
67}
68
69TEST_F(BufferNodeTest, TestAddNewActiveClientsBitToMask_32NewClients) {
70 uint64_t new_client_state_mask = 0ULL;
71 uint64_t current_mask = 0ULL;
72 uint64_t expected_mask = 0ULL;
73
74 for (int i = 0; i < kMaxClientsCount; ++i) {
75 new_client_state_mask = buffer_node->AddNewActiveClientsBitToMask();
76 EXPECT_NE(new_client_state_mask, 0);
77 EXPECT_FALSE(new_client_state_mask & current_mask);
78 expected_mask = current_mask | new_client_state_mask;
79 current_mask = buffer_node->GetActiveClientsBitMask();
80 EXPECT_EQ(current_mask, expected_mask);
81 }
82
83 // Method should fail upon requesting for more than maximum allowable clients.
84 new_client_state_mask = buffer_node->AddNewActiveClientsBitToMask();
85 EXPECT_EQ(new_client_state_mask, 0ULL);
86 EXPECT_EQ(errno, E2BIG);
87}
88
89TEST_F(BufferNodeTest, TestRemoveActiveClientsBitFromMask) {
90 buffer_node->AddNewActiveClientsBitToMask();
91 uint64_t current_mask = buffer_node->GetActiveClientsBitMask();
92 uint64_t new_client_state_mask = buffer_node->AddNewActiveClientsBitToMask();
93 EXPECT_NE(buffer_node->GetActiveClientsBitMask(), current_mask);
94
95 buffer_node->RemoveClientsBitFromMask(new_client_state_mask);
96 EXPECT_EQ(buffer_node->GetActiveClientsBitMask(), current_mask);
97
98 // Remove the test_mask again to the active client bit mask should not modify
99 // the value of active clients bit mask.
100 buffer_node->RemoveClientsBitFromMask(new_client_state_mask);
101 EXPECT_EQ(buffer_node->GetActiveClientsBitMask(), current_mask);
102}
103
104} // namespace
105
106} // namespace implementation
107} // namespace V1_0
108} // namespace bufferhub
109} // namespace frameworks
110} // namespace android