• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 #include "mock_picture.h"
25 #include "mock_producer_surface.h"
26 
27 using namespace testing::ext;
28 using ::testing::_;
29 using ::testing::A;
30 using ::testing::InSequence;
31 using ::testing::Mock;
32 using ::testing::Return;
33 using namespace OHOS::Media::Effect::Test;
34 
35 namespace {
36     constexpr uint32_t CROP_FACTOR = 2;
37 }
38 
39 namespace OHOS {
40 namespace Media {
41 namespace Effect {
42 class FakeEFilter : public EFilter {
43 public:
FakeEFilter(const std::string & name)44     explicit FakeEFilter(const std::string &name) : EFilter(name) {}
~FakeEFilter()45     ~FakeEFilter() {}
46 
Render(EffectBuffer * buffer,std::shared_ptr<EffectContext> & context)47     ErrorCode Render(EffectBuffer *buffer, std::shared_ptr<EffectContext> &context) override
48     {
49         return PushData(buffer, context);
50     }
51 
Render(EffectBuffer * src,EffectBuffer * dst,std::shared_ptr<EffectContext> & context)52     ErrorCode Render(EffectBuffer *src, EffectBuffer *dst, std::shared_ptr<EffectContext> &context) override
53     {
54         return ErrorCode::SUCCESS;
55     }
56 
Restore(const EffectJsonPtr & values)57     ErrorCode Restore(const EffectJsonPtr &values) override
58     {
59         return ErrorCode::SUCCESS;
60     }
61 };
62 
63 class FakeImageEffect : public ImageEffect {
64 public:
FakeImageEffect()65     explicit FakeImageEffect() : ImageEffect("ImageEffect") {}
~FakeImageEffect()66     ~FakeImageEffect() {}
67 };
68 
SetUpTestCase()69 void ImageEffectInnerUnittest::SetUpTestCase() {}
70 
TearDownTestCase()71 void ImageEffectInnerUnittest::TearDownTestCase() {}
72 
SetUp()73 void ImageEffectInnerUnittest::SetUp()
74 {
75     ExternLoader::Instance()->InitExt();
76     EFilterFactory::Instance()->functions_.clear();
77     EFilterFactory::Instance()->RegisterEFilter<BrightnessEFilter>(BRIGHTNESS_EFILTER);
78     EFilterFactory::Instance()->RegisterEFilter<ContrastEFilter>(CONTRAST_EFILTER);
79     EFilterFactory::Instance()->RegisterEFilter<CropEFilter>(CROP_EFILTER);
80     EFilterFactory::Instance()->delegates_.clear();
81     mockPixelMap_ = new MockPixelMap();
82     imageEffect_ = new FakeImageEffect();
83     efilter_ = new FakeEFilter(BRIGHTNESS_EFILTER);
84 
85     std::shared_ptr<BufferInfo> info = std::make_unique<BufferInfo>();
86     info->width_ = mockPixelMap_->GetWidth();
87     info->height_ = mockPixelMap_->GetHeight();
88     info->rowStride_ = mockPixelMap_->GetRowStride();
89     info->len_ = mockPixelMap_->GetHeight() * mockPixelMap_->GetRowStride();
90     info->formatType_ = IEffectFormat::RGBA8888;
91     std::shared_ptr<ExtraInfo> extraInfo = std::make_unique<ExtraInfo>();
92     extraInfo->dataType = DataType::PIXEL_MAP;
93     extraInfo->bufferType = BufferType::HEAP_MEMORY;
94     extraInfo->pixelMap = mockPixelMap_;
95     extraInfo->surfaceBuffer = nullptr;
96     effectBuffer_ = new EffectBuffer(info, (void *)mockPixelMap_->GetPixels(), extraInfo);
97 }
98 
TearDown()99 void ImageEffectInnerUnittest::TearDown()
100 {
101     delete(mockPixelMap_);
102     mockPixelMap_ = nullptr;
103     Mock::AllowLeak(imageEffect_);
104     Mock::AllowLeak(efilter_);
105     delete(effectBuffer_);
106     effectBuffer_ = nullptr;
107 }
108 
109 HWTEST_F(ImageEffectInnerUnittest, Image_effect_unittest_001, TestSize.Level1)
110 {
111     InSequence s;
112     std::shared_ptr<EFilter> efilter = EFilterFactory::Instance()->Create(BRIGHTNESS_EFILTER);
113     imageEffect_->AddEFilter(efilter);
114     Plugin::Any value = 200.f;
115     efilter->SetValue(KEY_FILTER_INTENSITY, value);
116     ErrorCode result = imageEffect_->SetInputPixelMap(mockPixelMap_);
117     ASSERT_EQ(result, ErrorCode::SUCCESS);
118     result = imageEffect_->Start();
119     ASSERT_EQ(result, ErrorCode::SUCCESS);
120 }
121 
122 HWTEST_F(ImageEffectInnerUnittest, Image_effect_unittest_002, TestSize.Level1)
123 {
124     InSequence s;
125     std::shared_ptr<EFilter> efilter = EFilterFactory::Instance()->Create(BRIGHTNESS_EFILTER);
126     Plugin::Any value = 200.f;
127     efilter->SetValue(KEY_FILTER_INTENSITY, value);
128     std::shared_ptr<EffectBuffer> src = std::make_shared<EffectBuffer>(
129         effectBuffer_->bufferInfo_, effectBuffer_->buffer_, effectBuffer_->extraInfo_);
130 
131     ErrorCode result = efilter->Render(src, src);
132     ASSERT_EQ(result, ErrorCode::SUCCESS);
133 }
134 
135 HWTEST_F(ImageEffectInnerUnittest, Image_effect_unittest_003, TestSize.Level1)
136 {
137     std::shared_ptr<EFilter> efilter = EFilterFactory::Instance()->Create(BRIGHTNESS_EFILTER);
138     imageEffect_->AddEFilter(efilter);
139     Plugin::Any value = 100.f;
140     efilter->SetValue(KEY_FILTER_INTENSITY, value);
141     ErrorCode result = imageEffect_->SetInputPixelMap(mockPixelMap_);
142     ASSERT_EQ(result, ErrorCode::SUCCESS);
143     result = imageEffect_->SetOutputPixelMap(mockPixelMap_);
144     ASSERT_EQ(result, ErrorCode::SUCCESS);
145     result = imageEffect_->Start();
146     ASSERT_EQ(result, ErrorCode::SUCCESS);
147 }
148 
149 HWTEST_F(ImageEffectInnerUnittest, Image_effect_unittest_004, TestSize.Level1)
150 {
151     std::shared_ptr<EFilter> efilter = EFilterFactory::Instance()->Create(CROP_EFILTER);
152     imageEffect_->AddEFilter(efilter);
153     uint32_t x1 = static_cast<uint32_t>(mockPixelMap_->GetWidth() / CROP_FACTOR);
154     uint32_t y1 = static_cast<uint32_t>(mockPixelMap_->GetHeight() / CROP_FACTOR);
155     uint32_t areaInfo[] = { 0, 0, x1, y1};
156     Plugin::Any value = static_cast<void *>(areaInfo);
157     efilter->SetValue(KEY_FILTER_REGION, value);
158     ErrorCode result = imageEffect_->SetInputPixelMap(mockPixelMap_);
159     ASSERT_EQ(result, ErrorCode::SUCCESS);
160     result = imageEffect_->SetOutputPixelMap(mockPixelMap_);
161     ASSERT_EQ(result, ErrorCode::SUCCESS);
162     result = imageEffect_->Start();
163     ASSERT_EQ(result, ErrorCode::SUCCESS);
164 }
165 
166 HWTEST_F(ImageEffectInnerUnittest, Image_effect_unittest_005, TestSize.Level1)
167 {
168     std::shared_ptr<EFilter> efilter = EFilterFactory::Instance()->Create(CROP_EFILTER);
169     imageEffect_->AddEFilter(efilter);
170     uint32_t x1 = static_cast<uint32_t>(mockPixelMap_->GetWidth() / CROP_FACTOR);
171     uint32_t y1 = static_cast<uint32_t>(mockPixelMap_->GetHeight() / CROP_FACTOR);
172     uint32_t areaInfo[] = { 0, 0, x1, y1};
173     Plugin::Any value = static_cast<void *>(areaInfo);
174     efilter->SetValue(KEY_FILTER_REGION, value);
175     ErrorCode result = imageEffect_->SetInputPixelMap(mockPixelMap_);
176     ASSERT_EQ(result, ErrorCode::SUCCESS);
177     result = imageEffect_->Start();
178     ASSERT_EQ(result, ErrorCode::SUCCESS);
179 }
180 
181 HWTEST_F(ImageEffectInnerUnittest, Image_effect_unittest_006, TestSize.Level1)
182 {
183     DataInfo dataInfo;
184     std::shared_ptr<BufferInfo> bufferInfo = std::make_unique<BufferInfo>();
185     std::shared_ptr<ExtraInfo> extraInfo = std::make_unique<ExtraInfo>();
186     std::shared_ptr<EffectBuffer> effectBuffer = std::make_unique<EffectBuffer>(bufferInfo, nullptr, extraInfo);
187     std::shared_ptr<ImageEffect> imageEffect = std::make_unique<ImageEffect>();
188 
189     dataInfo.dataType_ = DataType::PATH;
190     dataInfo.path_ = "path";
191     IEffectFormat format = IEffectFormat::RGBA8888;
192     EXPECT_EQ(imageEffect->ParseDataInfo(dataInfo, effectBuffer, true, format), ErrorCode::SUCCESS);
193 
194     dataInfo.dataType_ = DataType::NATIVE_WINDOW;
195     EXPECT_EQ(imageEffect->ParseDataInfo(dataInfo, effectBuffer, false, format), ErrorCode::SUCCESS);
196 
197     dataInfo.dataType_ = DataType::UNKNOWN;
198     EXPECT_EQ(imageEffect->ParseDataInfo(dataInfo, effectBuffer, false, format), ErrorCode::ERR_NO_DATA);
199 
200     dataInfo.dataType_ = static_cast<DataType>(100);
201     EXPECT_EQ(imageEffect->ParseDataInfo(dataInfo, effectBuffer, false, format), ErrorCode::ERR_UNSUPPORTED_DATA_TYPE);
202 }
203 
204 HWTEST_F(ImageEffectInnerUnittest, SetOutputPicture_001, TestSize.Level1)
205 {
206     std::shared_ptr<ImageEffect> imageEffect_ = std::make_unique<ImageEffect>(IMAGE_EFFECT_NAME);
207     ErrorCode result = imageEffect_->SetOutputPicture(nullptr);
208     ASSERT_EQ(result, ErrorCode::SUCCESS);
209 }
210 
211 HWTEST_F(ImageEffectInnerUnittest, SetOutputPicture_002, TestSize.Level1)
212 {
213     std::shared_ptr<ImageEffect> imageEffect_ = std::make_unique<ImageEffect>(IMAGE_EFFECT_NAME);
214     std::shared_ptr<Picture> picture = std::make_shared<MockPicture>();
215     ErrorCode result = imageEffect_->SetOutputPicture(picture.get());
216     ASSERT_EQ(result, ErrorCode::SUCCESS);
217 }
218 
219 HWTEST_F(ImageEffectInnerUnittest, SetInputPicture_001, TestSize.Level1)
220 {
221     std::shared_ptr<ImageEffect> imageEffect_ = std::make_unique<ImageEffect>(IMAGE_EFFECT_NAME);
222     ErrorCode result = imageEffect_->SetInputPicture(nullptr);
223     ASSERT_NE(result, ErrorCode::SUCCESS);
224 }
225 
226 HWTEST_F(ImageEffectInnerUnittest, SetInputPicture_002, TestSize.Level1)
227 {
228     std::shared_ptr<ImageEffect> imageEffect_ = std::make_unique<ImageEffect>(IMAGE_EFFECT_NAME);
229     std::shared_ptr<Picture> picture = std::make_shared<MockPicture>();
230     ErrorCode result = imageEffect_->SetInputPicture(picture.get());
231     ASSERT_EQ(result, ErrorCode::SUCCESS);
232 }
233 
234 HWTEST_F(ImageEffectInnerUnittest, SetExtraInfo_001, TestSize.Level1)
235 {
236     std::shared_ptr<ImageEffect> imageEffect_ = std::make_unique<ImageEffect>(IMAGE_EFFECT_NAME);
237     ErrorCode result = imageEffect_->SetExtraInfo(nullptr);
238     ASSERT_EQ(result, ErrorCode::SUCCESS);
239 }
240 
241 HWTEST_F(ImageEffectInnerUnittest, SetOutputSurfaceBuffer_001, TestSize.Level1)
242 {
243     std::shared_ptr<ImageEffect> imageEffect_ = std::make_unique<ImageEffect>(IMAGE_EFFECT_NAME);
244     ErrorCode result = imageEffect_->SetOutputSurfaceBuffer(nullptr);
245     ASSERT_EQ(result, ErrorCode::SUCCESS);
246 }
247 
248 HWTEST_F(ImageEffectInnerUnittest, SetOutputSurfaceBuffer_002, TestSize.Level1)
249 {
250     std::shared_ptr<ImageEffect> imageEffect_ = std::make_unique<ImageEffect>(IMAGE_EFFECT_NAME);
251     sptr<SurfaceBuffer> surfaceBuffer;
252     MockProducerSurface::AllocDmaMemory(surfaceBuffer);
253     ErrorCode result = imageEffect_->SetOutputSurfaceBuffer(surfaceBuffer);
254     ASSERT_EQ(result, ErrorCode::SUCCESS);
255     MockProducerSurface::ReleaseDmaBuffer(surfaceBuffer);
256 }
257 
258 HWTEST_F(ImageEffectInnerUnittest, SetInputSurfaceBuffer_001, TestSize.Level1)
259 {
260     std::shared_ptr<ImageEffect> imageEffect_ = std::make_unique<ImageEffect>(IMAGE_EFFECT_NAME);
261     ErrorCode result = imageEffect_->SetInputSurfaceBuffer(nullptr);
262     ASSERT_NE(result, ErrorCode::SUCCESS);
263 }
264 
265 HWTEST_F(ImageEffectInnerUnittest, SetInputSurfaceBuffer_002, TestSize.Level1)
266 {
267     std::shared_ptr<ImageEffect> imageEffect_ = std::make_unique<ImageEffect>(IMAGE_EFFECT_NAME);
268     sptr<SurfaceBuffer> surfaceBuffer;
269     MockProducerSurface::AllocDmaMemory(surfaceBuffer);
270     ErrorCode result = imageEffect_->SetInputSurfaceBuffer(surfaceBuffer);
271     ASSERT_EQ(result, ErrorCode::SUCCESS);
272     MockProducerSurface::ReleaseDmaBuffer(surfaceBuffer);
273 }
274 
275 HWTEST_F(ImageEffectInnerUnittest, SetOutputSurface_001, TestSize.Level1)
276 {
277     std::shared_ptr<ImageEffect> imageEffect_ = std::make_unique<ImageEffect>(IMAGE_EFFECT_NAME);
278     sptr<Surface> surface = nullptr;
279     ErrorCode result = imageEffect_->SetOutputSurface(surface);
280     ASSERT_NE(result, ErrorCode::SUCCESS);
281 }
282 
283 HWTEST_F(ImageEffectInnerUnittest, SetOutputPixelMap_001, TestSize.Level1)
284 {
285     std::shared_ptr<ImageEffect> imageEffect_ = std::make_unique<ImageEffect>(IMAGE_EFFECT_NAME);
286     ErrorCode result = imageEffect_->SetOutputPixelMap(nullptr);
287     ASSERT_EQ(result, ErrorCode::SUCCESS);
288 }
289 
290 HWTEST_F(ImageEffectInnerUnittest, SetInputPixelMap_001, TestSize.Level1)
291 {
292     std::shared_ptr<ImageEffect> imageEffect_ = std::make_unique<ImageEffect>(IMAGE_EFFECT_NAME);
293     ErrorCode result = imageEffect_->SetInputPixelMap(nullptr);
294     ASSERT_NE(result, ErrorCode::SUCCESS);
295 }
296 
297 HWTEST_F(ImageEffectInnerUnittest, SetOutNativeWindow_001, TestSize.Level1)
298 {
299     std::shared_ptr<ImageEffect> imageEffect_ = std::make_unique<ImageEffect>(IMAGE_EFFECT_NAME);
300     ErrorCode result = imageEffect_->SetOutNativeWindow(nullptr);
301     ASSERT_NE(result, ErrorCode::SUCCESS);
302 }
303 
304 HWTEST_F(ImageEffectInnerUnittest, SetOutNativeWindow_002, TestSize.Level1)
305 {
306     std::shared_ptr<ImageEffect> imageEffect_ = std::make_unique<ImageEffect>(IMAGE_EFFECT_NAME);
307     OHNativeWindow *nativeWindow = new OHNativeWindow();
308     nativeWindow->surface = nullptr;
309     ErrorCode result = imageEffect_->SetOutNativeWindow(nativeWindow);
310     ASSERT_NE(result, ErrorCode::SUCCESS);
311     delete nativeWindow;
312     nativeWindow = nullptr;
313 }
314 
315 HWTEST_F(ImageEffectInnerUnittest, ReplaceEFilter_001, TestSize.Level1)
316 {
317     std::shared_ptr<ImageEffect> imageEffect_ = std::make_unique<ImageEffect>(IMAGE_EFFECT_NAME);
318     std::shared_ptr<EFilter> efilter = EFilterFactory::Instance()->Create(BRIGHTNESS_EFILTER);
319     imageEffect_->AddEFilter(efilter);
320     std::shared_ptr<EFilter> efilter2 = EFilterFactory::Instance()->Create(CONTRAST_EFILTER);
321 
322     ErrorCode result = imageEffect_->ReplaceEFilter(efilter2, -1);
323     ASSERT_NE(result, ErrorCode::SUCCESS);
324 
325     result = imageEffect_->ReplaceEFilter(efilter2, 0);
326     ASSERT_EQ(result, ErrorCode::SUCCESS);
327 }
328 
329 HWTEST_F(ImageEffectInnerUnittest, SetInputUri_001, TestSize.Level1)
330 {
331     std::string g_jpgUri = std::string("file:///data/test/resource/image_effect_1k_test1.jpg");
332     std::string g_notJpgUri = std::string("file:///data/test/resource/image_effect_1k_test1.png");
333     std::shared_ptr<ImageEffect> imageEffect_ = std::make_unique<ImageEffect>(IMAGE_EFFECT_NAME);
334 
335     ErrorCode result = imageEffect_->SetInputUri(g_notJpgUri);
336     EXPECT_NE(result, ErrorCode::SUCCESS);
337 
338     result = imageEffect_->SetInputUri(g_jpgUri);
339     EXPECT_EQ(result, ErrorCode::SUCCESS);
340 }
341 
342 HWTEST_F(ImageEffectInnerUnittest, SetOutputUri_001, TestSize.Level1)
343 {
344     std::string g_jpgUri = std::string("file:///data/test/resource/image_effect_1k_test1.jpg");
345     std::string g_notJpgUri = std::string("file:///data/test/resource/image_effect_1k_test1.png");
346     std::shared_ptr<ImageEffect> imageEffect_ = std::make_unique<ImageEffect>(IMAGE_EFFECT_NAME);
347 
348     ErrorCode result = imageEffect_->SetOutputUri("");
349     EXPECT_EQ(result, ErrorCode::SUCCESS);
350 
351     result = imageEffect_->SetOutputUri(g_notJpgUri);
352     EXPECT_NE(result, ErrorCode::SUCCESS);
353 
354     result = imageEffect_->SetOutputUri(g_jpgUri);
355     EXPECT_EQ(result, ErrorCode::SUCCESS);
356 }
357 
358 HWTEST_F(ImageEffectInnerUnittest, SetInputPath_001, TestSize.Level1)
359 {
360     std::string g_jpgPath = std::string("/data/test/resource/image_effect_1k_test1.jpg");
361     std::string g_notJpgPath = std::string("/data/test/resource/image_effect_1k_test1.png");
362     std::shared_ptr<ImageEffect> imageEffect_ = std::make_unique<ImageEffect>(IMAGE_EFFECT_NAME);
363 
364     ErrorCode result = imageEffect_->SetInputPath(g_notJpgPath);
365     EXPECT_NE(result, ErrorCode::SUCCESS);
366 
367     result = imageEffect_->SetInputPath(g_jpgPath);
368     EXPECT_EQ(result, ErrorCode::SUCCESS);
369 }
370 
371 HWTEST_F(ImageEffectInnerUnittest, SetOutputPath_001, TestSize.Level1)
372 {
373     std::string g_jpgPath = std::string("/data/test/resource/image_effect_1k_test1.jpg");
374     std::string g_notJpgPath = std::string("/data/test/resource/image_effect_1k_test1.png");
375     std::shared_ptr<ImageEffect> imageEffect_ = std::make_unique<ImageEffect>(IMAGE_EFFECT_NAME);
376 
377     ErrorCode result = imageEffect_->SetOutputPath("");
378     EXPECT_EQ(result, ErrorCode::SUCCESS);
379 
380     result = imageEffect_->SetOutputPath(g_notJpgPath);
381     EXPECT_NE(result, ErrorCode::SUCCESS);
382 
383     result = imageEffect_->SetOutputPath(g_jpgPath);
384     EXPECT_EQ(result, ErrorCode::SUCCESS);
385 }
386 
387 HWTEST_F(ImageEffectInnerUnittest, Save_001, TestSize.Level1)
388 {
389     std::shared_ptr<ImageEffect> imageEffect_ = std::make_unique<ImageEffect>(IMAGE_EFFECT_NAME);
390     EffectJsonPtr jsonValues = EffectJsonHelper::CreateObject();
391     ErrorCode result = imageEffect_->Save(jsonValues);
392     ASSERT_EQ(result, ErrorCode::SUCCESS);
393 }
394 } // namespace Effect
395 } // namespace Media
396 } // namespace OHOS
397