14d949f91Sopenharmony_ci/* 24d949f91Sopenharmony_ci * Copyright (C) 2024 Huawei Device Co., Ltd. 34d949f91Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 44d949f91Sopenharmony_ci * you may not use this file except in compliance with the License. 54d949f91Sopenharmony_ci * You may obtain a copy of the License at 64d949f91Sopenharmony_ci * 74d949f91Sopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 84d949f91Sopenharmony_ci * 94d949f91Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software 104d949f91Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 114d949f91Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 124d949f91Sopenharmony_ci * See the License for the specific language governing permissions and 134d949f91Sopenharmony_ci * limitations under the License. 144d949f91Sopenharmony_ci */ 154d949f91Sopenharmony_ci 164d949f91Sopenharmony_ci#include "image_effect_inner_unittest.h" 174d949f91Sopenharmony_ci 184d949f91Sopenharmony_ci#include "efilter_factory.h" 194d949f91Sopenharmony_ci#include "brightness_efilter.h" 204d949f91Sopenharmony_ci#include "contrast_efilter.h" 214d949f91Sopenharmony_ci#include "test_common.h" 224d949f91Sopenharmony_ci#include "external_loader.h" 234d949f91Sopenharmony_ci#include "crop_efilter.h" 244d949f91Sopenharmony_ci 254d949f91Sopenharmony_ciusing namespace testing::ext; 264d949f91Sopenharmony_ciusing ::testing::_; 274d949f91Sopenharmony_ciusing ::testing::A; 284d949f91Sopenharmony_ciusing ::testing::InSequence; 294d949f91Sopenharmony_ciusing ::testing::Mock; 304d949f91Sopenharmony_ciusing ::testing::Return; 314d949f91Sopenharmony_ciusing namespace OHOS::Media::Effect::Test; 324d949f91Sopenharmony_ci 334d949f91Sopenharmony_cinamespace { 344d949f91Sopenharmony_ci constexpr uint32_t CROP_FACTOR = 2; 354d949f91Sopenharmony_ci} 364d949f91Sopenharmony_ci 374d949f91Sopenharmony_cinamespace OHOS { 384d949f91Sopenharmony_cinamespace Media { 394d949f91Sopenharmony_cinamespace Effect { 404d949f91Sopenharmony_ciclass FakeEFilter : public EFilter { 414d949f91Sopenharmony_cipublic: 424d949f91Sopenharmony_ci explicit FakeEFilter(const std::string &name) : EFilter(name) {} 434d949f91Sopenharmony_ci ~FakeEFilter() {} 444d949f91Sopenharmony_ci 454d949f91Sopenharmony_ci ErrorCode Render(EffectBuffer *buffer, std::shared_ptr<EffectContext> &context) override 464d949f91Sopenharmony_ci { 474d949f91Sopenharmony_ci return PushData(buffer, context); 484d949f91Sopenharmony_ci } 494d949f91Sopenharmony_ci 504d949f91Sopenharmony_ci ErrorCode Render(EffectBuffer *src, EffectBuffer *dst, std::shared_ptr<EffectContext> &context) override 514d949f91Sopenharmony_ci { 524d949f91Sopenharmony_ci return ErrorCode::SUCCESS; 534d949f91Sopenharmony_ci } 544d949f91Sopenharmony_ci 554d949f91Sopenharmony_ci ErrorCode Restore(const EffectJsonPtr &values) override 564d949f91Sopenharmony_ci { 574d949f91Sopenharmony_ci return ErrorCode::SUCCESS; 584d949f91Sopenharmony_ci } 594d949f91Sopenharmony_ci}; 604d949f91Sopenharmony_ci 614d949f91Sopenharmony_ciclass FakeImageEffect : public ImageEffect { 624d949f91Sopenharmony_cipublic: 634d949f91Sopenharmony_ci explicit FakeImageEffect() : ImageEffect("ImageEffect") {} 644d949f91Sopenharmony_ci ~FakeImageEffect() {} 654d949f91Sopenharmony_ci}; 664d949f91Sopenharmony_ci 674d949f91Sopenharmony_civoid ImageEffectInnerUnittest::SetUpTestCase() {} 684d949f91Sopenharmony_ci 694d949f91Sopenharmony_civoid ImageEffectInnerUnittest::TearDownTestCase() {} 704d949f91Sopenharmony_ci 714d949f91Sopenharmony_civoid ImageEffectInnerUnittest::SetUp() 724d949f91Sopenharmony_ci{ 734d949f91Sopenharmony_ci ExternLoader::Instance()->InitExt(); 744d949f91Sopenharmony_ci EFilterFactory::Instance()->functions_.clear(); 754d949f91Sopenharmony_ci EFilterFactory::Instance()->RegisterEFilter<BrightnessEFilter>(BRIGHTNESS_EFILTER); 764d949f91Sopenharmony_ci EFilterFactory::Instance()->RegisterEFilter<ContrastEFilter>(CONTRAST_EFILTER); 774d949f91Sopenharmony_ci EFilterFactory::Instance()->RegisterEFilter<CropEFilter>(CROP_EFILTER); 784d949f91Sopenharmony_ci EFilterFactory::Instance()->delegates_.clear(); 794d949f91Sopenharmony_ci mockPixelMap_ = new MockPixelMap(); 804d949f91Sopenharmony_ci imageEffect_ = new FakeImageEffect(); 814d949f91Sopenharmony_ci efilter_ = new FakeEFilter(BRIGHTNESS_EFILTER); 824d949f91Sopenharmony_ci 834d949f91Sopenharmony_ci std::shared_ptr<BufferInfo> info = std::make_unique<BufferInfo>(); 844d949f91Sopenharmony_ci info->width_ = mockPixelMap_->GetWidth(); 854d949f91Sopenharmony_ci info->height_ = mockPixelMap_->GetHeight(); 864d949f91Sopenharmony_ci info->rowStride_ = mockPixelMap_->GetRowStride(); 874d949f91Sopenharmony_ci info->len_ = mockPixelMap_->GetHeight() * mockPixelMap_->GetRowStride(); 884d949f91Sopenharmony_ci info->formatType_ = IEffectFormat::RGBA8888; 894d949f91Sopenharmony_ci std::shared_ptr<ExtraInfo> extraInfo = std::make_unique<ExtraInfo>(); 904d949f91Sopenharmony_ci extraInfo->dataType = DataType::PIXEL_MAP; 914d949f91Sopenharmony_ci extraInfo->bufferType = BufferType::HEAP_MEMORY; 924d949f91Sopenharmony_ci extraInfo->pixelMap = mockPixelMap_; 934d949f91Sopenharmony_ci extraInfo->surfaceBuffer = nullptr; 944d949f91Sopenharmony_ci effectBuffer_ = new EffectBuffer(info, (void *)mockPixelMap_->GetPixels(), extraInfo); 954d949f91Sopenharmony_ci} 964d949f91Sopenharmony_ci 974d949f91Sopenharmony_civoid ImageEffectInnerUnittest::TearDown() 984d949f91Sopenharmony_ci{ 994d949f91Sopenharmony_ci delete(mockPixelMap_); 1004d949f91Sopenharmony_ci Mock::AllowLeak(imageEffect_); 1014d949f91Sopenharmony_ci Mock::AllowLeak(efilter_); 1024d949f91Sopenharmony_ci delete(effectBuffer_); 1034d949f91Sopenharmony_ci} 1044d949f91Sopenharmony_ci 1054d949f91Sopenharmony_ciHWTEST_F(ImageEffectInnerUnittest, Image_effect_unittest_001, TestSize.Level1) 1064d949f91Sopenharmony_ci{ 1074d949f91Sopenharmony_ci InSequence s; 1084d949f91Sopenharmony_ci std::shared_ptr<EFilter> efilter = EFilterFactory::Instance()->Create(BRIGHTNESS_EFILTER); 1094d949f91Sopenharmony_ci imageEffect_->AddEFilter(efilter); 1104d949f91Sopenharmony_ci Plugin::Any value = 200.f; 1114d949f91Sopenharmony_ci efilter->SetValue(KEY_FILTER_INTENSITY, value); 1124d949f91Sopenharmony_ci ErrorCode result = imageEffect_->SetInputPixelMap(mockPixelMap_); 1134d949f91Sopenharmony_ci ASSERT_EQ(result, ErrorCode::SUCCESS); 1144d949f91Sopenharmony_ci result = imageEffect_->Start(); 1154d949f91Sopenharmony_ci ASSERT_EQ(result, ErrorCode::SUCCESS); 1164d949f91Sopenharmony_ci} 1174d949f91Sopenharmony_ci 1184d949f91Sopenharmony_ciHWTEST_F(ImageEffectInnerUnittest, Image_effect_unittest_002, TestSize.Level1) 1194d949f91Sopenharmony_ci{ 1204d949f91Sopenharmony_ci InSequence s; 1214d949f91Sopenharmony_ci std::shared_ptr<EFilter> efilter = EFilterFactory::Instance()->Create(BRIGHTNESS_EFILTER); 1224d949f91Sopenharmony_ci Plugin::Any value = 200.f; 1234d949f91Sopenharmony_ci efilter->SetValue(KEY_FILTER_INTENSITY, value); 1244d949f91Sopenharmony_ci std::shared_ptr<EffectBuffer> src = std::make_shared<EffectBuffer>( 1254d949f91Sopenharmony_ci effectBuffer_->bufferInfo_, effectBuffer_->buffer_, effectBuffer_->extraInfo_); 1264d949f91Sopenharmony_ci 1274d949f91Sopenharmony_ci ErrorCode result = efilter->Render(src, src); 1284d949f91Sopenharmony_ci ASSERT_EQ(result, ErrorCode::SUCCESS); 1294d949f91Sopenharmony_ci} 1304d949f91Sopenharmony_ci 1314d949f91Sopenharmony_ciHWTEST_F(ImageEffectInnerUnittest, Image_effect_unittest_003, TestSize.Level1) 1324d949f91Sopenharmony_ci{ 1334d949f91Sopenharmony_ci std::shared_ptr<EFilter> efilter = EFilterFactory::Instance()->Create(BRIGHTNESS_EFILTER); 1344d949f91Sopenharmony_ci imageEffect_->AddEFilter(efilter); 1354d949f91Sopenharmony_ci Plugin::Any value = 100.f; 1364d949f91Sopenharmony_ci efilter->SetValue(KEY_FILTER_INTENSITY, value); 1374d949f91Sopenharmony_ci ErrorCode result = imageEffect_->SetInputPixelMap(mockPixelMap_); 1384d949f91Sopenharmony_ci ASSERT_EQ(result, ErrorCode::SUCCESS); 1394d949f91Sopenharmony_ci result = imageEffect_->SetOutputPixelMap(mockPixelMap_); 1404d949f91Sopenharmony_ci ASSERT_EQ(result, ErrorCode::SUCCESS); 1414d949f91Sopenharmony_ci result = imageEffect_->Start(); 1424d949f91Sopenharmony_ci ASSERT_EQ(result, ErrorCode::SUCCESS); 1434d949f91Sopenharmony_ci} 1444d949f91Sopenharmony_ci 1454d949f91Sopenharmony_ciHWTEST_F(ImageEffectInnerUnittest, Image_effect_unittest_004, TestSize.Level1) 1464d949f91Sopenharmony_ci{ 1474d949f91Sopenharmony_ci std::shared_ptr<EFilter> efilter = EFilterFactory::Instance()->Create(CROP_EFILTER); 1484d949f91Sopenharmony_ci imageEffect_->AddEFilter(efilter); 1494d949f91Sopenharmony_ci uint32_t x1 = static_cast<uint32_t>(mockPixelMap_->GetWidth() / CROP_FACTOR); 1504d949f91Sopenharmony_ci uint32_t y1 = static_cast<uint32_t>(mockPixelMap_->GetHeight() / CROP_FACTOR); 1514d949f91Sopenharmony_ci uint32_t areaInfo[] = { 0, 0, x1, y1}; 1524d949f91Sopenharmony_ci Plugin::Any value = static_cast<void *>(areaInfo); 1534d949f91Sopenharmony_ci efilter->SetValue(KEY_FILTER_REGION, value); 1544d949f91Sopenharmony_ci ErrorCode result = imageEffect_->SetInputPixelMap(mockPixelMap_); 1554d949f91Sopenharmony_ci ASSERT_EQ(result, ErrorCode::SUCCESS); 1564d949f91Sopenharmony_ci result = imageEffect_->SetOutputPixelMap(mockPixelMap_); 1574d949f91Sopenharmony_ci ASSERT_EQ(result, ErrorCode::SUCCESS); 1584d949f91Sopenharmony_ci result = imageEffect_->Start(); 1594d949f91Sopenharmony_ci ASSERT_EQ(result, ErrorCode::SUCCESS); 1604d949f91Sopenharmony_ci} 1614d949f91Sopenharmony_ci 1624d949f91Sopenharmony_ciHWTEST_F(ImageEffectInnerUnittest, Image_effect_unittest_005, TestSize.Level1) 1634d949f91Sopenharmony_ci{ 1644d949f91Sopenharmony_ci std::shared_ptr<EFilter> efilter = EFilterFactory::Instance()->Create(CROP_EFILTER); 1654d949f91Sopenharmony_ci imageEffect_->AddEFilter(efilter); 1664d949f91Sopenharmony_ci uint32_t x1 = static_cast<uint32_t>(mockPixelMap_->GetWidth() / CROP_FACTOR); 1674d949f91Sopenharmony_ci uint32_t y1 = static_cast<uint32_t>(mockPixelMap_->GetHeight() / CROP_FACTOR); 1684d949f91Sopenharmony_ci uint32_t areaInfo[] = { 0, 0, x1, y1}; 1694d949f91Sopenharmony_ci Plugin::Any value = static_cast<void *>(areaInfo); 1704d949f91Sopenharmony_ci efilter->SetValue(KEY_FILTER_REGION, value); 1714d949f91Sopenharmony_ci ErrorCode result = imageEffect_->SetInputPixelMap(mockPixelMap_); 1724d949f91Sopenharmony_ci ASSERT_EQ(result, ErrorCode::SUCCESS); 1734d949f91Sopenharmony_ci result = imageEffect_->Start(); 1744d949f91Sopenharmony_ci ASSERT_EQ(result, ErrorCode::SUCCESS); 1754d949f91Sopenharmony_ci} 1764d949f91Sopenharmony_ci 1774d949f91Sopenharmony_ciHWTEST_F(ImageEffectInnerUnittest, Image_effect_unittest_006, TestSize.Level1) 1784d949f91Sopenharmony_ci{ 1794d949f91Sopenharmony_ci DataInfo dataInfo; 1804d949f91Sopenharmony_ci std::shared_ptr<BufferInfo> bufferInfo = std::make_unique<BufferInfo>(); 1814d949f91Sopenharmony_ci std::shared_ptr<ExtraInfo> extraInfo = std::make_unique<ExtraInfo>(); 1824d949f91Sopenharmony_ci std::shared_ptr<EffectBuffer> effectBuffer = std::make_unique<EffectBuffer>(bufferInfo, nullptr, extraInfo); 1834d949f91Sopenharmony_ci std::shared_ptr<ImageEffect> imageEffect = std::make_unique<ImageEffect>(); 1844d949f91Sopenharmony_ci 1854d949f91Sopenharmony_ci dataInfo.dataType_ = DataType::PATH; 1864d949f91Sopenharmony_ci dataInfo.path_ = "path"; 1874d949f91Sopenharmony_ci EXPECT_EQ(imageEffect->ParseDataInfo(dataInfo, effectBuffer, true), ErrorCode::SUCCESS); 1884d949f91Sopenharmony_ci 1894d949f91Sopenharmony_ci dataInfo.dataType_ = DataType::NATIVE_WINDOW; 1904d949f91Sopenharmony_ci EXPECT_EQ(imageEffect->ParseDataInfo(dataInfo, effectBuffer, false), ErrorCode::SUCCESS); 1914d949f91Sopenharmony_ci 1924d949f91Sopenharmony_ci dataInfo.dataType_ = DataType::UNKNOWN; 1934d949f91Sopenharmony_ci EXPECT_EQ(imageEffect->ParseDataInfo(dataInfo, effectBuffer, false), ErrorCode::ERR_NO_DATA); 1944d949f91Sopenharmony_ci 1954d949f91Sopenharmony_ci dataInfo.dataType_ = static_cast<DataType>(100); 1964d949f91Sopenharmony_ci EXPECT_EQ(imageEffect->ParseDataInfo(dataInfo, effectBuffer, false), ErrorCode::ERR_UNSUPPORTED_DATA_TYPE); 1974d949f91Sopenharmony_ci} 1984d949f91Sopenharmony_ci} // namespace Effect 1994d949f91Sopenharmony_ci} // namespace Media 2004d949f91Sopenharmony_ci} // namespace OHOS