1 /*
2  * Copyright (C) 2024 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 "image_effect_inner_unittest.h"
17 
18 #include "efilter_factory.h"
19 #include "brightness_efilter.h"
20 #include "contrast_efilter.h"
21 #include "test_common.h"
22 #include "external_loader.h"
23 #include "crop_efilter.h"
24 
25 using namespace testing::ext;
26 using ::testing::_;
27 using ::testing::A;
28 using ::testing::InSequence;
29 using ::testing::Mock;
30 using ::testing::Return;
31 using namespace OHOS::Media::Effect::Test;
32 
33 namespace {
34     constexpr uint32_t CROP_FACTOR = 2;
35 }
36 
37 namespace OHOS {
38 namespace Media {
39 namespace Effect {
40 class FakeEFilter : public EFilter {
41 public:
FakeEFilter(const std::string &name)42     explicit FakeEFilter(const std::string &name) : EFilter(name) {}
~FakeEFilter()43     ~FakeEFilter() {}
44 
45     ErrorCode Render(EffectBuffer *buffer, std::shared_ptr<EffectContext> &context) override
46     {
47         return PushData(buffer, context);
48     }
49 
50     ErrorCode Render(EffectBuffer *src, EffectBuffer *dst, std::shared_ptr<EffectContext> &context) override
51     {
52         return ErrorCode::SUCCESS;
53     }
54 
55     ErrorCode Restore(const EffectJsonPtr &values) override
56     {
57         return ErrorCode::SUCCESS;
58     }
59 };
60 
61 class FakeImageEffect : public ImageEffect {
62 public:
FakeImageEffect()63     explicit FakeImageEffect() : ImageEffect("ImageEffect") {}
~FakeImageEffect()64     ~FakeImageEffect() {}
65 };
66 
SetUpTestCase()67 void ImageEffectInnerUnittest::SetUpTestCase() {}
68 
TearDownTestCase()69 void ImageEffectInnerUnittest::TearDownTestCase() {}
70 
SetUp()71 void ImageEffectInnerUnittest::SetUp()
72 {
73     ExternLoader::Instance()->InitExt();
74     EFilterFactory::Instance()->functions_.clear();
75     EFilterFactory::Instance()->RegisterEFilter<BrightnessEFilter>(BRIGHTNESS_EFILTER);
76     EFilterFactory::Instance()->RegisterEFilter<ContrastEFilter>(CONTRAST_EFILTER);
77     EFilterFactory::Instance()->RegisterEFilter<CropEFilter>(CROP_EFILTER);
78     EFilterFactory::Instance()->delegates_.clear();
79     mockPixelMap_ = new MockPixelMap();
80     imageEffect_ = new FakeImageEffect();
81     efilter_ = new FakeEFilter(BRIGHTNESS_EFILTER);
82 
83     std::shared_ptr<BufferInfo> info = std::make_unique<BufferInfo>();
84     info->width_ = mockPixelMap_->GetWidth();
85     info->height_ = mockPixelMap_->GetHeight();
86     info->rowStride_ = mockPixelMap_->GetRowStride();
87     info->len_ = mockPixelMap_->GetHeight() * mockPixelMap_->GetRowStride();
88     info->formatType_ = IEffectFormat::RGBA8888;
89     std::shared_ptr<ExtraInfo> extraInfo = std::make_unique<ExtraInfo>();
90     extraInfo->dataType = DataType::PIXEL_MAP;
91     extraInfo->bufferType = BufferType::HEAP_MEMORY;
92     extraInfo->pixelMap = mockPixelMap_;
93     extraInfo->surfaceBuffer = nullptr;
94     effectBuffer_ = new EffectBuffer(info, (void *)mockPixelMap_->GetPixels(), extraInfo);
95 }
96 
TearDown()97 void ImageEffectInnerUnittest::TearDown()
98 {
99     delete(mockPixelMap_);
100     Mock::AllowLeak(imageEffect_);
101     Mock::AllowLeak(efilter_);
102     delete(effectBuffer_);
103 }
104 
HWTEST_F(ImageEffectInnerUnittest, Image_effect_unittest_001, TestSize.Level1)105 HWTEST_F(ImageEffectInnerUnittest, Image_effect_unittest_001, TestSize.Level1)
106 {
107     InSequence s;
108     std::shared_ptr<EFilter> efilter = EFilterFactory::Instance()->Create(BRIGHTNESS_EFILTER);
109     imageEffect_->AddEFilter(efilter);
110     Plugin::Any value = 200.f;
111     efilter->SetValue(KEY_FILTER_INTENSITY, value);
112     ErrorCode result = imageEffect_->SetInputPixelMap(mockPixelMap_);
113     ASSERT_EQ(result, ErrorCode::SUCCESS);
114     result = imageEffect_->Start();
115     ASSERT_EQ(result, ErrorCode::SUCCESS);
116 }
117 
HWTEST_F(ImageEffectInnerUnittest, Image_effect_unittest_002, TestSize.Level1)118 HWTEST_F(ImageEffectInnerUnittest, Image_effect_unittest_002, TestSize.Level1)
119 {
120     InSequence s;
121     std::shared_ptr<EFilter> efilter = EFilterFactory::Instance()->Create(BRIGHTNESS_EFILTER);
122     Plugin::Any value = 200.f;
123     efilter->SetValue(KEY_FILTER_INTENSITY, value);
124     std::shared_ptr<EffectBuffer> src = std::make_shared<EffectBuffer>(
125         effectBuffer_->bufferInfo_, effectBuffer_->buffer_, effectBuffer_->extraInfo_);
126 
127     ErrorCode result = efilter->Render(src, src);
128     ASSERT_EQ(result, ErrorCode::SUCCESS);
129 }
130 
HWTEST_F(ImageEffectInnerUnittest, Image_effect_unittest_003, TestSize.Level1)131 HWTEST_F(ImageEffectInnerUnittest, Image_effect_unittest_003, TestSize.Level1)
132 {
133     std::shared_ptr<EFilter> efilter = EFilterFactory::Instance()->Create(BRIGHTNESS_EFILTER);
134     imageEffect_->AddEFilter(efilter);
135     Plugin::Any value = 100.f;
136     efilter->SetValue(KEY_FILTER_INTENSITY, value);
137     ErrorCode result = imageEffect_->SetInputPixelMap(mockPixelMap_);
138     ASSERT_EQ(result, ErrorCode::SUCCESS);
139     result = imageEffect_->SetOutputPixelMap(mockPixelMap_);
140     ASSERT_EQ(result, ErrorCode::SUCCESS);
141     result = imageEffect_->Start();
142     ASSERT_EQ(result, ErrorCode::SUCCESS);
143 }
144 
HWTEST_F(ImageEffectInnerUnittest, Image_effect_unittest_004, TestSize.Level1)145 HWTEST_F(ImageEffectInnerUnittest, Image_effect_unittest_004, TestSize.Level1)
146 {
147     std::shared_ptr<EFilter> efilter = EFilterFactory::Instance()->Create(CROP_EFILTER);
148     imageEffect_->AddEFilter(efilter);
149     uint32_t x1 = static_cast<uint32_t>(mockPixelMap_->GetWidth() / CROP_FACTOR);
150     uint32_t y1 = static_cast<uint32_t>(mockPixelMap_->GetHeight() / CROP_FACTOR);
151     uint32_t areaInfo[] = { 0, 0, x1, y1};
152     Plugin::Any value = static_cast<void *>(areaInfo);
153     efilter->SetValue(KEY_FILTER_REGION, value);
154     ErrorCode result = imageEffect_->SetInputPixelMap(mockPixelMap_);
155     ASSERT_EQ(result, ErrorCode::SUCCESS);
156     result = imageEffect_->SetOutputPixelMap(mockPixelMap_);
157     ASSERT_EQ(result, ErrorCode::SUCCESS);
158     result = imageEffect_->Start();
159     ASSERT_EQ(result, ErrorCode::SUCCESS);
160 }
161 
HWTEST_F(ImageEffectInnerUnittest, Image_effect_unittest_005, TestSize.Level1)162 HWTEST_F(ImageEffectInnerUnittest, Image_effect_unittest_005, TestSize.Level1)
163 {
164     std::shared_ptr<EFilter> efilter = EFilterFactory::Instance()->Create(CROP_EFILTER);
165     imageEffect_->AddEFilter(efilter);
166     uint32_t x1 = static_cast<uint32_t>(mockPixelMap_->GetWidth() / CROP_FACTOR);
167     uint32_t y1 = static_cast<uint32_t>(mockPixelMap_->GetHeight() / CROP_FACTOR);
168     uint32_t areaInfo[] = { 0, 0, x1, y1};
169     Plugin::Any value = static_cast<void *>(areaInfo);
170     efilter->SetValue(KEY_FILTER_REGION, value);
171     ErrorCode result = imageEffect_->SetInputPixelMap(mockPixelMap_);
172     ASSERT_EQ(result, ErrorCode::SUCCESS);
173     result = imageEffect_->Start();
174     ASSERT_EQ(result, ErrorCode::SUCCESS);
175 }
176 
HWTEST_F(ImageEffectInnerUnittest, Image_effect_unittest_006, TestSize.Level1)177 HWTEST_F(ImageEffectInnerUnittest, Image_effect_unittest_006, TestSize.Level1)
178 {
179     DataInfo dataInfo;
180     std::shared_ptr<BufferInfo> bufferInfo = std::make_unique<BufferInfo>();
181     std::shared_ptr<ExtraInfo> extraInfo = std::make_unique<ExtraInfo>();
182     std::shared_ptr<EffectBuffer> effectBuffer = std::make_unique<EffectBuffer>(bufferInfo, nullptr, extraInfo);
183     std::shared_ptr<ImageEffect> imageEffect = std::make_unique<ImageEffect>();
184 
185     dataInfo.dataType_ = DataType::PATH;
186     dataInfo.path_ = "path";
187     EXPECT_EQ(imageEffect->ParseDataInfo(dataInfo, effectBuffer, true), ErrorCode::SUCCESS);
188 
189     dataInfo.dataType_ = DataType::NATIVE_WINDOW;
190     EXPECT_EQ(imageEffect->ParseDataInfo(dataInfo, effectBuffer, false), ErrorCode::SUCCESS);
191 
192     dataInfo.dataType_ = DataType::UNKNOWN;
193     EXPECT_EQ(imageEffect->ParseDataInfo(dataInfo, effectBuffer, false), ErrorCode::ERR_NO_DATA);
194 
195     dataInfo.dataType_ = static_cast<DataType>(100);
196     EXPECT_EQ(imageEffect->ParseDataInfo(dataInfo, effectBuffer, false), ErrorCode::ERR_UNSUPPORTED_DATA_TYPE);
197 }
198 } // namespace Effect
199 } // namespace Media
200 } // namespace OHOS