• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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