1 /*
2 * Copyright (c) 2022-2022 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16 #include <cstdlib>
17 #include <memory>
18 #include <string>
19 #include "gtest/gtest.h"
20 #define private public
21 #define protected public
22 #include "filters/demux/data_packer.h"
23
24 namespace OHOS {
25 namespace Media {
26 namespace Test {
27 using namespace OHOS::Media::Plugin;
28
29 class TestDataPacker : public ::testing::Test {
30 public:
31 std::shared_ptr<DataPacker> dataPacker;
SetUp()32 void SetUp() override
33 {
34 dataPacker = std::make_shared<DataPacker>();
35 }
36
TearDown()37 void TearDown() override
38 {
39 }
40 };
41
CreateBuffer(size_t size,uint64_t offset=0)42 AVBufferPtr CreateBuffer(size_t size, uint64_t offset = 0)
43 {
44 const uint8_t* data = (uint8_t*)"1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
45 auto buffer = std::make_shared<AVBuffer>();
46 buffer->AllocMemory(nullptr, size);
47 buffer->GetMemory()->Write(data + offset, size);
48 return buffer;
49 }
50
CreateEmptyBuffer(size_t size)51 AVBufferPtr CreateEmptyBuffer(size_t size)
52 {
53 auto buffer = std::make_shared<AVBuffer>();
54 buffer->AllocMemory(nullptr, size);
55 buffer->GetMemory()->Write((uint8_t*)"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0", size);
56 return buffer;
57 }
58
TEST_F(TestDataPacker,can_push_one_buffer_to_datapacker)59 TEST_F(TestDataPacker, can_push_one_buffer_to_datapacker)
60 {
61 auto bufferPtr = CreateBuffer(10);
62 dataPacker->PushData(bufferPtr, 0);
63 ASSERT_STREQ("DataPacker (offset 0, size 10, buffer count 1)", dataPacker->ToString().c_str());
64 }
65
TEST_F(TestDataPacker,can_push_two_buffers_to_datapacker)66 TEST_F(TestDataPacker, can_push_two_buffers_to_datapacker)
67 {
68 auto bufferPtr = CreateBuffer(10);
69 dataPacker->PushData(bufferPtr, 0);
70 auto bufferPtr2 = CreateBuffer(4, 10);
71 dataPacker->PushData(bufferPtr2, 10);
72 ASSERT_STREQ("DataPacker (offset 0, size 14, buffer count 2)", dataPacker->ToString().c_str());
73 }
74
TEST_F(TestDataPacker,should_return_true_if_check_range_in_datapacker)75 TEST_F(TestDataPacker, should_return_true_if_check_range_in_datapacker)
76 {
77 auto bufferPtr = CreateBuffer(10);
78 dataPacker->PushData(bufferPtr, 0);
79 uint64_t curOffset = 0;
80 ASSERT_TRUE(dataPacker->IsDataAvailable(3, 2, curOffset));
81 ASSERT_EQ(curOffset, 10);
82 }
83
TEST_F(TestDataPacker,should_return_false_if_check_range_not_in_datapacker)84 TEST_F(TestDataPacker, should_return_false_if_check_range_not_in_datapacker)
85 {
86 auto bufferPtr = CreateBuffer(10);
87 dataPacker->PushData(bufferPtr, 0);
88 uint64_t curOffset = 0;
89 ASSERT_FALSE(dataPacker->IsDataAvailable(11, 2, curOffset));
90 }
91
TEST_F(TestDataPacker,should_update_cur_offset_to_get_range_offset_if_get_range_start_not_in_datapacker)92 TEST_F(TestDataPacker, should_update_cur_offset_to_get_range_offset_if_get_range_start_not_in_datapacker)
93 {
94 auto bufferPtr = CreateBuffer(10);
95 dataPacker->PushData(bufferPtr, 0);
96 uint64_t curOffset = 0;
97 ASSERT_FALSE(dataPacker->IsDataAvailable(11, 2, curOffset));
98 ASSERT_EQ(curOffset, 11);
99 }
100
TEST_F(TestDataPacker,should_update_cur_offset_to_datapacker_offset_end_if_get_range_start_in_datapacker)101 TEST_F(TestDataPacker, should_update_cur_offset_to_datapacker_offset_end_if_get_range_start_in_datapacker)
102 {
103 auto bufferPtr = CreateBuffer(10);
104 dataPacker->PushData(bufferPtr, 0);
105 uint64_t curOffset = 0;
106 ASSERT_FALSE(dataPacker->IsDataAvailable(8, 10, curOffset));
107 ASSERT_EQ(curOffset, 10);
108 }
109
TEST_F(TestDataPacker,can_get_data_in_the_middle_of_one_buffer)110 TEST_F(TestDataPacker, can_get_data_in_the_middle_of_one_buffer)
111 {
112 auto bufferPtr = CreateBuffer(10);
113 dataPacker->PushData(bufferPtr, 0);
114 ASSERT_STREQ("DataPacker (offset 0, size 10, buffer count 1)", dataPacker->ToString().c_str());
115 uint64_t curOffset = 0;
116 ASSERT_TRUE(dataPacker->IsDataAvailable(3, 2, curOffset));
117 ASSERT_EQ(curOffset, 10);
118 auto bufferOut = CreateEmptyBuffer(3);
119 dataPacker->GetRange(3, 2, bufferOut);
120 ASSERT_STREQ("45", (const char *)(bufferOut->GetMemory()->GetReadOnlyData()));
121 }
122
TEST_F(TestDataPacker,remove_old_data_after_second_get_range)123 TEST_F(TestDataPacker, remove_old_data_after_second_get_range)
124 {
125 auto bufferPtr = CreateBuffer(10);
126 dataPacker->PushData(bufferPtr, 0);
127 ASSERT_STREQ("DataPacker (offset 0, size 10, buffer count 1)", dataPacker->ToString().c_str());
128 uint64_t curOffset = 0;
129 ASSERT_TRUE(dataPacker->IsDataAvailable(3, 2, curOffset));
130 ASSERT_EQ(curOffset, 10);
131 auto bufferOut = CreateEmptyBuffer(5);
132 dataPacker->GetRange(3, 4, bufferOut);
133 bufferOut->GetMemory()->UpdateDataSize(0);
134 dataPacker->GetRange(5, 2, bufferOut);
135 ASSERT_STREQ("DataPacker (offset 5, size 5, buffer count 1)", dataPacker->ToString().c_str());
136 }
137
TEST_F(TestDataPacker,remove_old_data_after_second_get_range_when_two_buffers_in_datapacker)138 TEST_F(TestDataPacker, remove_old_data_after_second_get_range_when_two_buffers_in_datapacker)
139 {
140 auto bufferPtr = CreateBuffer(10);
141 dataPacker->PushData(bufferPtr, 0);
142 auto bufferPtr2 = CreateBuffer(4, 10);
143 dataPacker->PushData(bufferPtr2, 10);
144 ASSERT_STREQ("DataPacker (offset 0, size 14, buffer count 2)", dataPacker->ToString().c_str());
145
146 auto bufferOut = CreateEmptyBuffer(5);
147 dataPacker->GetRange(3, 4, bufferOut);
148 ASSERT_STREQ("DataPacker (offset 0, size 14, buffer count 2)", dataPacker->ToString().c_str());
149
150 bufferOut->GetMemory()->UpdateDataSize(0);
151 dataPacker->GetRange(11, 2, bufferOut);
152 ASSERT_STREQ("DataPacker (offset 11, size 3, buffer count 1)", dataPacker->ToString().c_str());
153 }
TEST_F(TestDataPacker,can_get_data_from_two_buffers)154 TEST_F(TestDataPacker, can_get_data_from_two_buffers)
155 {
156 auto bufferPtr = CreateBuffer(10);
157 dataPacker->PushData(bufferPtr, 0);
158 uint64_t curOffset = 0;
159 ASSERT_FALSE(dataPacker->IsDataAvailable(0, 15, curOffset));
160 ASSERT_EQ(curOffset, 10);
161 auto bufferPtr2 = CreateBuffer(10, curOffset);
162 dataPacker->PushData(bufferPtr2, curOffset);
163 auto bufferOut = CreateEmptyBuffer(16);
164 ASSERT_TRUE(dataPacker->GetRange(0, 15, bufferOut));
165 ASSERT_EQ(15, bufferOut->GetMemory()->GetSize());
166 ASSERT_STREQ("1234567890abcde", (const char*)(bufferOut->GetMemory()->GetReadOnlyData()));
167 }
168 } // namespace Test
169 } // namespace Media
170 } // namespace OHOS