blob: 3358c87eb8eb8031a7e9b28cd091fe3afacf83a1 [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 Xucfbe0742018-11-21 15:03:32 -08006#include <private/dvr/buffer_hub_defs.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;
25const size_t kMaxClientsCount = dvr::BufferHubDefs::kMaxNumberOfClients;
26
27class BufferNodeTest : public ::testing::Test {
28protected:
29 void SetUp() override {
30 buffer_node =
31 new BufferNode(kWidth, kHeight, kLayerCount, kFormat, kUsage, kUserMetadataSize);
32 ASSERT_TRUE(buffer_node->IsValid());
33 }
34
35 void TearDown() override {
36 if (buffer_node != nullptr) {
37 delete buffer_node;
38 }
39 }
40
41 BufferNode* buffer_node = nullptr;
42};
43
44TEST_F(BufferNodeTest, TestCreateBufferNode) {
45 EXPECT_EQ(buffer_node->user_metadata_size(), kUserMetadataSize);
46 // Test the handle just allocated is good (i.e. able to be imported)
47 GraphicBufferMapper& mapper = GraphicBufferMapper::get();
48 const native_handle_t* outHandle;
49 status_t ret =
50 mapper.importBuffer(buffer_node->buffer_handle(), buffer_node->buffer_desc().width,
51 buffer_node->buffer_desc().height,
52 buffer_node->buffer_desc().layers,
53 buffer_node->buffer_desc().format, buffer_node->buffer_desc().usage,
54 buffer_node->buffer_desc().stride, &outHandle);
55 EXPECT_EQ(ret, OK);
56 EXPECT_THAT(outHandle, NotNull());
57}
58
59TEST_F(BufferNodeTest, TestAddNewActiveClientsBitToMask_twoNewClients) {
60 uint64_t new_client_state_mask_1 = buffer_node->AddNewActiveClientsBitToMask();
61 EXPECT_EQ(buffer_node->GetActiveClientsBitMask(), new_client_state_mask_1);
62
63 // Request and add a new client_state_mask again.
64 // Active clients bit mask should be the union of the two new
65 // client_state_masks.
66 uint64_t new_client_state_mask_2 = buffer_node->AddNewActiveClientsBitToMask();
67 EXPECT_EQ(buffer_node->GetActiveClientsBitMask(),
68 new_client_state_mask_1 | new_client_state_mask_2);
69}
70
71TEST_F(BufferNodeTest, TestAddNewActiveClientsBitToMask_32NewClients) {
72 uint64_t new_client_state_mask = 0ULL;
73 uint64_t current_mask = 0ULL;
74 uint64_t expected_mask = 0ULL;
75
76 for (int i = 0; i < kMaxClientsCount; ++i) {
77 new_client_state_mask = buffer_node->AddNewActiveClientsBitToMask();
78 EXPECT_NE(new_client_state_mask, 0);
79 EXPECT_FALSE(new_client_state_mask & current_mask);
80 expected_mask = current_mask | new_client_state_mask;
81 current_mask = buffer_node->GetActiveClientsBitMask();
82 EXPECT_EQ(current_mask, expected_mask);
83 }
84
85 // Method should fail upon requesting for more than maximum allowable clients.
86 new_client_state_mask = buffer_node->AddNewActiveClientsBitToMask();
87 EXPECT_EQ(new_client_state_mask, 0ULL);
88 EXPECT_EQ(errno, E2BIG);
89}
90
91TEST_F(BufferNodeTest, TestRemoveActiveClientsBitFromMask) {
92 buffer_node->AddNewActiveClientsBitToMask();
93 uint64_t current_mask = buffer_node->GetActiveClientsBitMask();
94 uint64_t new_client_state_mask = buffer_node->AddNewActiveClientsBitToMask();
95 EXPECT_NE(buffer_node->GetActiveClientsBitMask(), current_mask);
96
97 buffer_node->RemoveClientsBitFromMask(new_client_state_mask);
98 EXPECT_EQ(buffer_node->GetActiveClientsBitMask(), current_mask);
99
100 // Remove the test_mask again to the active client bit mask should not modify
101 // the value of active clients bit mask.
102 buffer_node->RemoveClientsBitFromMask(new_client_state_mask);
103 EXPECT_EQ(buffer_node->GetActiveClientsBitMask(), current_mask);
104}
105
106} // namespace
107
108} // namespace implementation
109} // namespace V1_0
110} // namespace bufferhub
111} // namespace frameworks
112} // namespace android