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