1 /*
2 * Copyright (c) 2022-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 #define protected public
17 #define private public
18
19 #include <cstddef>
20 #include <optional>
21 #include <vector>
22
23 #include "gtest/gtest.h"
24 #include "test/mock/base/mock_pixel_map.h"
25 #include "test/mock/core/common/mock_container.h"
26 #include "test/mock/core/common/mock_interaction_interface.h"
27 #include "test/mock/core/image_provider/mock_image_file_cache.cpp"
28 #include "test/mock/core/image_provider/mock_image_loader.h"
29 #include "test/mock/core/pipeline/mock_pipeline_context.h"
30
31 #include "base/geometry/ng/size_t.h"
32 #include "base/geometry/size.h"
33 #include "base/image/pixel_map.h"
34 #include "base/utils/system_properties.h"
35 #include "core/components/common/layout/constants.h"
36 #include "core/components_ng/image_provider/drawing_image_data.h"
37 #include "core/components_ng/image_provider/animated_image_object.h"
38 #include "core/components_ng/image_provider/image_data.h"
39 #include "core/components_ng/image_provider/image_loading_context.h"
40 #include "core/components_ng/image_provider/image_provider.h"
41 #include "core/components_ng/image_provider/image_state_manager.h"
42 #include "core/components_ng/image_provider/pixel_map_image_object.h"
43 #include "core/components_ng/image_provider/static_image_object.h"
44 #include "core/components_ng/render/canvas_image.h"
45 #include "core/components_ng/render/image_painter.h"
46 #include "core/image/image_cache.h"
47 #include "core/image/image_source_info.h"
48
49 using namespace testing;
50 using namespace testing::ext;
51
52 namespace {
53 const char* SRC_JPG = "file://data/data/com.example.test/res/exampleAlt.jpg";
54 const char* SRC_THUMBNAIL = "datashare:///media/9/thumbnail/300/300";
55 constexpr int32_t LENGTH_100 = 100;
56 constexpr int32_t LENGTH_65 = 65;
57 constexpr int32_t LENGTH_64 = 64;
58 constexpr int32_t LENGTH_63 = 63;
59 constexpr int32_t LENGTH_128 = 128;
60 constexpr uint64_t MAX_WAITING_TIME_FOR_TASKS = 1000; // 1000ms
61 int32_t callbackFlag = 0;
62 } // namespace
63
64 namespace OHOS::Ace::NG {
65 class ImageProviderTestNg : public testing::Test {
66 public:
67 static void SetUpTestSuite();
68 static void TearDownTestSuite();
69 static void WaitForAsyncTasks();
70
71 void SetUp() override;
72 void TearDown() override;
73 };
74
75 class MockImageData : public ImageData {
76 public:
77 MOCK_METHOD(size_t, GetSize, (), (const, override));
78 MOCK_METHOD(const void*, GetData, (), (const, override));
79 MOCK_METHOD(std::string, ToString, (), (const, override));
80 };
81
SetUpTestSuite()82 void ImageProviderTestNg::SetUpTestSuite()
83 {
84 MockPipelineContext::SetUp();
85 g_threads = std::vector<std::thread>();
86 }
87
SetUp()88 void ImageProviderTestNg::SetUp()
89 {
90 g_loader = AceType::MakeRefPtr<MockImageLoader>();
91 }
92
TearDown()93 void ImageProviderTestNg::TearDown()
94 {
95 g_loader = nullptr;
96 }
97
TearDownTestSuite()98 void ImageProviderTestNg::TearDownTestSuite()
99 {
100 MockPipelineContext::TearDown();
101 g_loader = nullptr;
102 }
103
104 // wait for load task to finish
WaitForAsyncTasks()105 void ImageProviderTestNg::WaitForAsyncTasks()
106 {
107 for (auto& thread : g_threads) {
108 thread.join();
109 }
110 g_threads.clear();
111 }
112
113 /**
114 * @tc.name: CreateFun001
115 * @tc.desc: Test CreateFun.
116 * @tc.type: FUNC
117 */
118 HWTEST_F(ImageProviderTestNg, CreateFunc001, TestSize.Level1)
119 {
120 auto src = ImageSourceInfo(SRC_JPG);
121 auto ctx = AceType::MakeRefPtr<ImageLoadingContext>(src, LoadNotifier(nullptr, nullptr, nullptr), true);
122 EXPECT_NE(ctx, nullptr);
123
124 auto src1 = ImageSourceInfo(SRC_JPG);
125 src1.srcType_ = SrcType::PIXMAP;
126 auto ctx1 = AceType::MakeRefPtr<ImageLoadingContext>(src1, LoadNotifier(nullptr, nullptr, nullptr), true);
127 EXPECT_NE(ctx1, nullptr);
128 }
129
130 /**
131 * @tc.name: Destruction001
132 * @tc.desc: Test Destruction.
133 * @tc.type: FUNC
134 */
135 HWTEST_F(ImageProviderTestNg, Destruction001, TestSize.Level1)
136 {
137 auto src = ImageSourceInfo(SRC_JPG);
138 auto ctx = AceType::MakeRefPtr<ImageLoadingContext>(src, LoadNotifier(nullptr, nullptr, nullptr), true);
139 EXPECT_NE(ctx, nullptr);
140 ctx->syncLoad_ = false;
141
142 auto src1 = ImageSourceInfo(SRC_JPG);
143 auto ctx1 = AceType::MakeRefPtr<ImageLoadingContext>(src1, LoadNotifier(nullptr, nullptr, nullptr), true);
144 EXPECT_NE(ctx1, nullptr);
145
146 ctx->stateManager_ = AceType::MakeRefPtr<ImageStateManager>(ctx1);
147 ctx->stateManager_->state_ = ImageLoadingState::MAKE_CANVAS_IMAGE;
148 EXPECT_NE(ctx, nullptr);
149 }
150
151 /**
152 * @tc.name: Destruction002
153 * @tc.desc: Test Destruction.
154 * @tc.type: FUNC
155 */
156 HWTEST_F(ImageProviderTestNg, Destruction002, TestSize.Level1)
157 {
158 auto src = ImageSourceInfo(SRC_JPG);
159 auto ctx = AceType::MakeRefPtr<ImageLoadingContext>(src, LoadNotifier(nullptr, nullptr, nullptr), true);
160 EXPECT_NE(ctx, nullptr);
161 ctx->syncLoad_ = false;
162
163 auto src1 = ImageSourceInfo(SRC_JPG);
164 auto ctx1 = AceType::MakeRefPtr<ImageLoadingContext>(src1, LoadNotifier(nullptr, nullptr, nullptr), true);
165 EXPECT_NE(ctx1, nullptr);
166
167 ctx->stateManager_ = AceType::MakeRefPtr<ImageStateManager>(ctx1);
168 ctx->stateManager_->state_ = ImageLoadingState::MAKE_CANVAS_IMAGE;
169 ctx->imageObj_ = AceType::MakeRefPtr<NG::StaticImageObject>(ImageSourceInfo(SRC_JPG), SizeF(1000, 1000), nullptr);
170 EXPECT_NE(ctx, nullptr);
171 }
172
173 /**
174 * @tc.name: HandleCommand001
175 * @tc.desc: Test HandleCommand.
176 * @tc.type: FUNC
177 */
178 HWTEST_F(ImageProviderTestNg, HandleCommand001, TestSize.Level1)
179 {
180 auto src = ImageSourceInfo(SRC_JPG);
181 auto ctx = AceType::MakeRefPtr<ImageLoadingContext>(src, LoadNotifier(nullptr, nullptr, nullptr), true);
182 EXPECT_NE(ctx, nullptr);
183 ctx->syncLoad_ = false;
184
185 auto src1 = ImageSourceInfo(SRC_JPG);
186 auto ctx1 = AceType::MakeRefPtr<ImageLoadingContext>(src1, LoadNotifier(nullptr, nullptr, nullptr), true);
187 EXPECT_NE(ctx1, nullptr);
188
189 ctx->stateManager_ = AceType::MakeRefPtr<ImageStateManager>(ctx1);
190 ctx->stateManager_->state_ = ImageLoadingState::MAKE_CANVAS_IMAGE;
191 EXPECT_NE(ctx, nullptr);
192
193 ctx->stateManager_->state_ = ImageLoadingState::LOAD_FAIL;
194 ctx->stateManager_->HandleCommand(ImageLoadingCommand::LOAD_FAIL);
195 EXPECT_NE(ctx, nullptr);
196
197 ctx->stateManager_->state_ = ImageLoadingState(-1);
198 ctx->stateManager_->HandleCommand(ImageLoadingCommand::LOAD_FAIL);
199 EXPECT_NE(ctx, nullptr);
200 }
201
202 /**
203 * @tc.name: NotifiersTest001
204 * @tc.desc: Test NotifiersTest.
205 * @tc.type: FUNC
206 */
207 HWTEST_F(ImageProviderTestNg, NotifiersTest001, TestSize.Level1)
208 {
209 auto src = ImageSourceInfo(SRC_JPG);
210 auto ctx = AceType::MakeRefPtr<ImageLoadingContext>(src, LoadNotifier(nullptr, nullptr, nullptr), true);
211 EXPECT_NE(ctx, nullptr);
212
213 callbackFlag = 0;
__anon80a153220202(const ImageSourceInfo& src) 214 auto callback1 = [](const ImageSourceInfo& src) {
215 callbackFlag = 1;
216 return;
217 };
__anon80a153220302(const ImageSourceInfo& src) 218 auto callback2 = [](const ImageSourceInfo& src) {
219 callbackFlag = 2;
220 return;
221 };
__anon80a153220402(const ImageSourceInfo& src, const std::string& errorMsg, const ImageErrorInfo& errorInfo) 222 auto callback3 = [](const ImageSourceInfo& src, const std::string& errorMsg, const ImageErrorInfo& errorInfo) {
223 callbackFlag = 3;
224 return;
225 };
226 ctx->notifiers_ = LoadNotifier(std::move(callback1), std::move(callback2), std::move(callback3));
__anon80a153220502() 227 std::function<void()> func = []() {};
228 ctx->pendingMakeCanvasImageTask_ = func;
229 ctx->OnLoadFail();
230 EXPECT_EQ(callbackFlag, 3);
231 ctx->OnDataReady();
232 EXPECT_EQ(callbackFlag, 1);
233 ctx->OnLoadSuccess();
234 EXPECT_EQ(callbackFlag, 2);
235 }
236
237 /**
238 * @tc.name: ImageProviderTestNg001
239 * @tc.desc: Test ImageProvider Synchronous CreateImageObj failure
240 * @tc.type: FUNC
241 */
242 HWTEST_F(ImageProviderTestNg, ImageProviderTestNg001, TestSize.Level1)
243 {
244 EXPECT_CALL(*g_loader, LoadImageData).Times(1);
245 auto src = ImageSourceInfo(SRC_JPG);
246 auto ctx = AceType::MakeRefPtr<ImageLoadingContext>(src, LoadNotifier(nullptr, nullptr, nullptr), true);
247 EXPECT_EQ(ctx->stateManager_->GetCurrentState(), ImageLoadingState::UNLOADED);
248 ctx->LoadImageData();
249
250 EXPECT_EQ(ctx->syncLoad_, true);
251 EXPECT_EQ(ctx->imageObj_, nullptr);
252 EXPECT_EQ(ctx->stateManager_->GetCurrentState(), ImageLoadingState::DATA_LOADING);
253
254 auto src1 = ImageSourceInfo(SRC_JPG);
255 src1.srcType_ = SrcType::PIXMAP;
256 auto ctx1 = AceType::MakeRefPtr<ImageLoadingContext>(src1, LoadNotifier(nullptr, nullptr, nullptr), true);
257 EXPECT_NE(ctx1, nullptr);
258 }
259
260 /**
261 * @tc.name: CalculateTargetSize001
262 * @tc.desc: Test CalculateTargetSize
263 * @tc.type: FUNC
264 */
265 HWTEST_F(ImageProviderTestNg, CalculateTargetSize001, TestSize.Level1)
266 {
267 auto src = ImageSourceInfo(SRC_JPG);
268 auto ctx = AceType::MakeRefPtr<ImageLoadingContext>(src, LoadNotifier(nullptr, nullptr, nullptr), true);
269 EXPECT_EQ(ctx->stateManager_->GetCurrentState(), ImageLoadingState::UNLOADED);
270
271 SizeF srcSize(1, 1);
272 SizeF dstSize(2, 2);
273 SizeF rawImageSize(3, 3);
274 auto size = ctx->CalculateTargetSize(srcSize, dstSize, rawImageSize);
275 EXPECT_EQ(size, rawImageSize);
276
277 auto context = PipelineContext::GetCurrentContext();
278 context.Reset();
279
280 srcSize.SetSizeT(SizeF(-1, -1));
281 size = ctx->CalculateTargetSize(srcSize, dstSize, rawImageSize);
282 EXPECT_EQ(size, rawImageSize);
283
284 srcSize.SetSizeT(SizeF(4, 4));
285 size = ctx->CalculateTargetSize(srcSize, dstSize, rawImageSize);
286 EXPECT_EQ(size, SizeF(1.5, 1.5));
287
288 srcSize.SetSizeT(SizeF(4, 1));
289 size = ctx->CalculateTargetSize(srcSize, dstSize, rawImageSize);
290 EXPECT_EQ(size, rawImageSize);
291
292 srcSize.SetSizeT(SizeF(1, 4));
293 size = ctx->CalculateTargetSize(srcSize, dstSize, rawImageSize);
294 EXPECT_EQ(size, rawImageSize);
295 }
296
297 /**
298 * @tc.name: SourceSizeTest001
299 * @tc.desc: Test SourceSizeTest
300 * @tc.type: FUNC
301 */
302 HWTEST_F(ImageProviderTestNg, SourceSizeTest001, TestSize.Level1)
303 {
304 auto src = ImageSourceInfo(SRC_JPG);
305 auto ctx = AceType::MakeRefPtr<ImageLoadingContext>(src, LoadNotifier(nullptr, nullptr, nullptr), true);
306 EXPECT_EQ(ctx->stateManager_->GetCurrentState(), ImageLoadingState::UNLOADED);
307
308 ctx->sourceSizePtr_.reset(new SizeF(1, 1));
309 auto size = ctx->GetSourceSize();
310 EXPECT_EQ(size.value(), *ctx->sourceSizePtr_.get());
311
312 ctx->sourceSizePtr_.reset(new SizeF(-1, 1));
313 size = ctx->GetSourceSize();
314 EXPECT_EQ(size, std::nullopt);
315
316 ctx->sourceSizePtr_.reset(new SizeF(1, -1));
317 size = ctx->GetSourceSize();
318 EXPECT_EQ(size, std::nullopt);
319
320 ctx->sourceSizePtr_.reset(new SizeF(-1, -1));
321 size = ctx->GetSourceSize();
322 EXPECT_EQ(size, std::nullopt);
323
324 ctx->sourceSizePtr_ = nullptr;
325 ctx->SetSourceSize(std::nullopt);
326 EXPECT_EQ(ctx->sourceSizePtr_, nullptr);
327
328 ctx->SetSourceSize(SizeF(1, 1));
329 EXPECT_EQ(*ctx->sourceSizePtr_.get(), SizeF(1, 1));
330 }
331
332 /**
333 * @tc.name: GetImageSize001
334 * @tc.desc: Test GetImageSize
335 * @tc.type: FUNC
336 */
337 HWTEST_F(ImageProviderTestNg, GetImageSize001, TestSize.Level1)
338 {
339 auto src = ImageSourceInfo(SRC_JPG);
340 auto ctx = AceType::MakeRefPtr<ImageLoadingContext>(src, LoadNotifier(nullptr, nullptr, nullptr), true);
341 EXPECT_EQ(ctx->stateManager_->GetCurrentState(), ImageLoadingState::UNLOADED);
342 auto size = ctx->GetImageSize();
343 EXPECT_EQ(size, SizeF(-1, -1));
344
345 ctx->imageObj_ =
346 AceType::MakeRefPtr<NG::StaticImageObject>(ImageSourceInfo(SRC_JPG), SizeF(LENGTH_128, LENGTH_128), nullptr);
347 size = ctx->GetImageSize();
348 EXPECT_EQ(size, SizeF(LENGTH_128, LENGTH_128));
349 }
350
351 /**
352 * @tc.name: GetImageSize003
353 * @tc.desc: Test GetImageSize
354 * @tc.type: FUNC
355 */
356 HWTEST_F(ImageProviderTestNg, GetImageSize003, TestSize.Level1)
357 {
358 auto src = ImageSourceInfo(SRC_JPG);
359 auto ctx = AceType::MakeRefPtr<ImageLoadingContext>(src, LoadNotifier(nullptr, nullptr, nullptr), true);
360 EXPECT_EQ(ctx->stateManager_->GetCurrentState(), ImageLoadingState::UNLOADED);
361 auto size = ctx->GetImageSize();
362 EXPECT_EQ(size, SizeF(-1, -1));
363
364 ctx->imageObj_ =
365 AceType::MakeRefPtr<NG::StaticImageObject>(ImageSourceInfo(SRC_JPG), SizeF(LENGTH_63, LENGTH_128), nullptr);
366 ctx->GetImageObject()->SetOrientation(ImageRotateOrientation::RIGHT_MIRRORED);
367 size = ctx->GetImageSize();
368 EXPECT_EQ(size, SizeF(LENGTH_128, LENGTH_63));
369 }
370
371 /**
372 * @tc.name: GetImageSize004
373 * @tc.desc: Test GetImageSize
374 * @tc.type: FUNC
375 */
376 HWTEST_F(ImageProviderTestNg, GetImageSize004, TestSize.Level1)
377 {
378 auto src = ImageSourceInfo(SRC_JPG);
379 auto ctx = AceType::MakeRefPtr<ImageLoadingContext>(src, LoadNotifier(nullptr, nullptr, nullptr), true);
380 EXPECT_EQ(ctx->stateManager_->GetCurrentState(), ImageLoadingState::UNLOADED);
381 auto size = ctx->GetImageSize();
382 EXPECT_EQ(size, SizeF(-1, -1));
383
384 ctx->imageObj_ =
385 AceType::MakeRefPtr<NG::StaticImageObject>(ImageSourceInfo(SRC_JPG), SizeF(LENGTH_63, LENGTH_128), nullptr);
386 ctx->GetImageObject()->SetOrientation(ImageRotateOrientation::LEFT_MIRRORED);
387 size = ctx->GetImageSize();
388 EXPECT_EQ(size, SizeF(LENGTH_128, LENGTH_63));
389 }
390
391 /**
392 * @tc.name: GetImageSize006
393 * @tc.desc: Test GetImageSize
394 * @tc.type: FUNC
395 */
396 HWTEST_F(ImageProviderTestNg, GetImageSize006, TestSize.Level1)
397 {
398 auto src = ImageSourceInfo(SRC_JPG);
399 auto ctx = AceType::MakeRefPtr<ImageLoadingContext>(src, LoadNotifier(nullptr, nullptr, nullptr), true);
400 EXPECT_EQ(ctx->stateManager_->GetCurrentState(), ImageLoadingState::UNLOADED);
401 auto size = ctx->GetImageSize();
402 EXPECT_EQ(size, SizeF(-1, -1));
403
404 ctx->imageObj_ =
405 AceType::MakeRefPtr<NG::StaticImageObject>(ImageSourceInfo(SRC_JPG), SizeF(LENGTH_63, LENGTH_128), nullptr);
406 ctx->GetImageObject()->SetOrientation(ImageRotateOrientation::UP_MIRRORED);
407 size = ctx->GetImageSize();
408 EXPECT_EQ(size, SizeF(LENGTH_63, LENGTH_128));
409 }
410
411 /**
412 * @tc.name: GetImageSize007
413 * @tc.desc: Test GetImageSize
414 * @tc.type: FUNC
415 */
416 HWTEST_F(ImageProviderTestNg, GetImageSize007, TestSize.Level1)
417 {
418 auto src = ImageSourceInfo(SRC_JPG);
419 auto ctx = AceType::MakeRefPtr<ImageLoadingContext>(src, LoadNotifier(nullptr, nullptr, nullptr), true);
420 EXPECT_EQ(ctx->stateManager_->GetCurrentState(), ImageLoadingState::UNLOADED);
421 auto size = ctx->GetImageSize();
422 EXPECT_EQ(size, SizeF(-1, -1));
423
424 ctx->imageObj_ =
425 AceType::MakeRefPtr<NG::StaticImageObject>(ImageSourceInfo(SRC_JPG), SizeF(LENGTH_63, LENGTH_128), nullptr);
426 ctx->GetImageObject()->SetOrientation(ImageRotateOrientation::DOWN_MIRRORED);
427 size = ctx->GetImageSize();
428 EXPECT_EQ(size, SizeF(LENGTH_63, LENGTH_128));
429 }
430
431 /**
432 * @tc.name: MakeCanvasImageIfNeed001
433 * @tc.desc: Test MakeCanvasImageIfNeed
434 * @tc.type: FUNC
435 */
436 HWTEST_F(ImageProviderTestNg, MakeCanvasImageIfNeed001, TestSize.Level1)
437 {
438 auto src = ImageSourceInfo(SRC_JPG);
439 auto ctx = AceType::MakeRefPtr<ImageLoadingContext>(src, LoadNotifier(nullptr, nullptr, nullptr), true);
440 EXPECT_EQ(ctx->stateManager_->GetCurrentState(), ImageLoadingState::UNLOADED);
441
442 std::vector<ImageFit> imageFitCases = { ImageFit::COVER, ImageFit::FILL };
443 std::vector<std::optional<SizeF>> sourceSizeCases = { std::make_optional(SizeF(1, 1)),
444 std::make_optional(SizeF(2, 2)) };
445 ctx->SetSourceSize(SizeF(1, 1));
446
447 for (int i = 0; i < 2; ++i) {
448 for (int j = 0; j < 2; ++j) {
449 for (int k = 0; k < 2; ++k) {
450 if (i == 0 && j == 0 && k == 0) {
451 ctx->dstSize_ = SizeF(1, 1);
452 auto ret = ctx->MakeCanvasImageIfNeed(SizeF(1, 1), i, imageFitCases[j], sourceSizeCases[k]);
453 EXPECT_TRUE(ret);
454 } else {
455 ctx->dstSize_ = SizeF();
456 auto ret = ctx->MakeCanvasImageIfNeed(SizeF(4, 4), i, imageFitCases[j], sourceSizeCases[k]);
457 EXPECT_TRUE(ret);
458 }
459 }
460 }
461 }
462 }
463
464 /**
465 * @tc.name: ImageProviderTestNg002
466 * @tc.desc: Test ImageProvider merging repeated tasks
467 * @tc.type: FUNC
468 */
469 HWTEST_F(ImageProviderTestNg, ImageProviderTestNg002, TestSize.Level1)
470 {
471 EXPECT_CALL(*g_loader, LoadImageData).Times(1);
472 auto src = ImageSourceInfo(SRC_JPG);
473 // create 20 repeated tasks
474 std::vector<RefPtr<ImageLoadingContext>> contexts(20);
475 for (auto& ctx : contexts) {
476 ctx = AceType::MakeRefPtr<ImageLoadingContext>(src, LoadNotifier(nullptr, nullptr, nullptr), false);
477 ctx->LoadImageData();
478 }
479 // check task map
480 {
481 if (!ImageProvider::taskMtx_.try_lock_for(std::chrono::milliseconds(MAX_WAITING_TIME_FOR_TASKS))) {
482 return;
483 }
484 // Adopt the already acquired lock
485 std::scoped_lock lock(std::adopt_lock, ImageProvider::taskMtx_);
486 EXPECT_EQ(ImageProvider::tasks_.size(), (size_t)1);
487 EXPECT_EQ(ImageProvider::tasks_[src.GetKey()].ctxs_.size(), (size_t)20);
488 }
489 // wait for load task to finish
490 WaitForAsyncTasks();
491 if (!ImageProvider::taskMtx_.try_lock_for(std::chrono::milliseconds(MAX_WAITING_TIME_FOR_TASKS))) {
492 return;
493 }
494 // Adopt the already acquired lock
495 std::scoped_lock lock(std::adopt_lock, ImageProvider::taskMtx_);
496 EXPECT_EQ(ImageProvider::tasks_.size(), (size_t)0);
497 }
498
499 /**
500 * @tc.name: ImageProviderTestNg003
501 * @tc.desc: Test ImageProvider load thumbnail
502 * @tc.type: FUNC
503 */
504 HWTEST_F(ImageProviderTestNg, ImageProviderTestNg003, TestSize.Level1)
505 {
506 auto src = ImageSourceInfo(SRC_THUMBNAIL);
507
508 EXPECT_CALL(*g_loader, LoadDecodedImageData).Times(1);
509 auto ctx = AceType::MakeRefPtr<ImageLoadingContext>(src, LoadNotifier(nullptr, nullptr, nullptr), true);
510 ctx->LoadImageData();
511 }
512
513 /**
514 * @tc.name: ImageProviderTestNg004
515 * @tc.desc: Test ImageProvider load success
516 * @tc.type: FUNC
517 */
518 HWTEST_F(ImageProviderTestNg, ImageProviderTestNg004, TestSize.Level1)
519 {
520 auto src = ImageSourceInfo(SRC_THUMBNAIL);
521
522 EXPECT_CALL(*g_loader, LoadDecodedImageData).Times(1);
523 auto ctx = AceType::MakeRefPtr<ImageLoadingContext>(src, LoadNotifier(nullptr, nullptr, nullptr));
524 ctx->LoadImageData();
525 EXPECT_EQ(ctx->stateManager_->state_, ImageLoadingState::DATA_LOADING);
526
527 WaitForAsyncTasks();
528
529 // mock data loading succeeded
530 ctx->stateManager_->state_ = ImageLoadingState::DATA_LOADING;
531 auto pixmap = AceType::MakeRefPtr<MockPixelMap>();
532 SizeF size(LENGTH_100, LENGTH_100);
533 ctx->DataReadyCallback(AceType::MakeRefPtr<PixelMapImageObject>(pixmap, src, size));
534 EXPECT_EQ(ctx->stateManager_->state_, ImageLoadingState::DATA_READY);
535 EXPECT_TRUE(ctx->NeedAlt());
536 EXPECT_EQ(ctx->GetImageSize(), size);
537 }
538
539 /**
540 * @tc.name: ImageProviderTestNg005
541 * @tc.desc: Test ImageProvider resize condition
542 * @tc.type: FUNC
543 */
544 HWTEST_F(ImageProviderTestNg, ImageProviderTestNg005, TestSize.Level1)
545 {
546 auto ctx =
547 AceType::MakeRefPtr<ImageLoadingContext>(ImageSourceInfo(), LoadNotifier(nullptr, nullptr, nullptr), true);
548 ctx->stateManager_->state_ = ImageLoadingState::DATA_READY;
549 ctx->imageObj_ =
550 AceType::MakeRefPtr<NG::StaticImageObject>(ImageSourceInfo(SRC_JPG), SizeF(LENGTH_128, LENGTH_128), nullptr);
551 SizeF dstSize(LENGTH_100, LENGTH_100);
__anon80a153220602() 552 std::function<void()> func = []() {};
553 ctx->pendingMakeCanvasImageTask_ = func;
554 auto res = ctx->MakeCanvasImageIfNeed(dstSize, true, ImageFit::COVER);
555 EXPECT_TRUE(res);
556 EXPECT_EQ(ctx->dstSize_, SizeF(LENGTH_100, LENGTH_100));
557 EXPECT_EQ(ctx->stateManager_->state_, ImageLoadingState::LOAD_SUCCESS);
558
559 // call MakeCanvasSize with dstSize in the same level
560 res = ctx->MakeCanvasImageIfNeed(SizeF(LENGTH_65, LENGTH_65), true, ImageFit::COVER);
561 EXPECT_FALSE(res);
562 EXPECT_EQ(ctx->sizeLevel_, LENGTH_128);
563
564 res = ctx->MakeCanvasImageIfNeed(SizeF(LENGTH_128, LENGTH_128), true, ImageFit::COVER);
565 EXPECT_FALSE(res);
566
567 res = ctx->MakeCanvasImageIfNeed(SizeF(LENGTH_64, LENGTH_64), true, ImageFit::COVER);
568 EXPECT_TRUE(res);
569 EXPECT_EQ(ctx->sizeLevel_, LENGTH_64);
570
571 res = ctx->MakeCanvasImageIfNeed(SizeF(LENGTH_63, LENGTH_63), true, ImageFit::COVER);
572 EXPECT_FALSE(res);
573 EXPECT_EQ(ctx->sizeLevel_, LENGTH_64);
574 }
575
576 /**
577 * @tc.name: ImageProviderTestNg006
578 * @tc.desc: Test BuildImageObject and frame count check
579 * @tc.type: FUNC
580 */
581 HWTEST_F(ImageProviderTestNg, ImageProviderTestNg006, TestSize.Level1)
582 {
583 auto src = ImageSourceInfo(SRC_JPG);
584 ImageErrorInfo errorInfo;
585 EXPECT_FALSE(ImageProvider::BuildImageObject(src, errorInfo, nullptr));
586
587 auto data = AceType::MakeRefPtr<DrawingImageData>(nullptr, 0);
588 auto imageObject = ImageProvider::BuildImageObject(src, errorInfo, data);
589 EXPECT_TRUE(AceType::DynamicCast<StaticImageObject>(imageObject));
590
591 data = AceType::MakeRefPtr<DrawingImageData>(nullptr, 2);
592 imageObject = ImageProvider::BuildImageObject(src, errorInfo, data);
593 EXPECT_TRUE(AceType::DynamicCast<AnimatedImageObject>(imageObject));
594
595 // thumbnail src with mismatched data
596 src = ImageSourceInfo(SRC_THUMBNAIL);
597 EXPECT_FALSE(ImageProvider::BuildImageObject(src, errorInfo, data));
598 }
599
600 /**
601 * @tc.name: ImageProviderTestNg007
602 * @tc.desc: Test Cancel task
603 * @tc.type: FUNC
604 */
605 HWTEST_F(ImageProviderTestNg, ImageProviderTestNg007, TestSize.Level1)
606 {
607 EXPECT_CALL(*g_loader, LoadImageData).Times(1);
608 auto src = ImageSourceInfo(SRC_JPG);
609 // create 2 repeated tasks
610 std::vector<RefPtr<ImageLoadingContext>> contexts(2);
611 for (auto& ctx : contexts) {
612 ctx = AceType::MakeRefPtr<ImageLoadingContext>(src, LoadNotifier(nullptr, nullptr, nullptr));
613 ctx->LoadImageData();
614 }
615 {
616 if (!ImageProvider::taskMtx_.try_lock_for(std::chrono::milliseconds(MAX_WAITING_TIME_FOR_TASKS))) {
617 return;
618 }
619 // Adopt the already acquired lock
620 std::scoped_lock lock(std::adopt_lock, ImageProvider::taskMtx_);
621 EXPECT_EQ(ImageProvider::tasks_.size(), (size_t)1);
622 auto it = ImageProvider::tasks_.find(src.GetKey());
623 EXPECT_NE(it, ImageProvider::tasks_.end());
624 // set impl_ to false to force successful cancellation
625 it->second.bgTask_.impl_ = nullptr;
626 }
627
628 for (auto& ctx : contexts) {
629 // nullify ctx to trigger task cancel
630 ctx = nullptr;
631 }
632 // check task is successfully canceled
633 {
634 if (!ImageProvider::taskMtx_.try_lock_for(std::chrono::milliseconds(MAX_WAITING_TIME_FOR_TASKS))) {
635 return;
636 }
637 // Adopt the already acquired lock
638 std::scoped_lock lock(std::adopt_lock, ImageProvider::taskMtx_);
639 EXPECT_EQ(ImageProvider::tasks_.size(), (size_t)0);
640 }
641 WaitForAsyncTasks();
642 {
643 if (!ImageProvider::taskMtx_.try_lock_for(std::chrono::milliseconds(MAX_WAITING_TIME_FOR_TASKS))) {
644 return;
645 }
646 // Adopt the already acquired lock
647 std::scoped_lock lock(std::adopt_lock, ImageProvider::taskMtx_);
648 EXPECT_EQ(ImageProvider::tasks_.size(), (size_t)0);
649 }
650 }
651
652 /**
653 * @tc.name: GetImageSize005
654 * @tc.desc: Test GetImageSize
655 * @tc.type: FUNC
656 */
657 HWTEST_F(ImageProviderTestNg, GetImageSize005, TestSize.Level1)
658 {
659 auto src = ImageSourceInfo(SRC_JPG);
660 auto ctx = AceType::MakeRefPtr<ImageLoadingContext>(src, LoadNotifier(nullptr, nullptr, nullptr), true);
661 EXPECT_EQ(ctx->stateManager_->GetCurrentState(), ImageLoadingState::UNLOADED);
662 auto size = ctx->GetImageSize();
663 EXPECT_EQ(size, SizeF(-1, -1));
664
665 ctx->imageObj_ =
666 AceType::MakeRefPtr<NG::StaticImageObject>(ImageSourceInfo(SRC_JPG), SizeF(LENGTH_63, LENGTH_128), nullptr);
667 ctx->GetImageObject()->SetOrientation(ImageRotateOrientation::LEFT);
668 size = ctx->GetImageSize();
669 EXPECT_EQ(size, SizeF(LENGTH_128, LENGTH_63));
670 }
671
672 /**
673 * @tc.name: RoundUp001
674 * @tc.desc: Test RoundUp with invalid input (infinite loop)
675 * @tc.type: FUNC
676 */
677 HWTEST_F(ImageProviderTestNg, RoundUp001, TestSize.Level1)
678 {
679 auto ctx =
680 AceType::MakeRefPtr<ImageLoadingContext>(ImageSourceInfo(), LoadNotifier(nullptr, nullptr, nullptr), true);
681 ctx->imageObj_ = AceType::MakeRefPtr<NG::StaticImageObject>(ImageSourceInfo(SRC_JPG), SizeF(-1, -1), nullptr);
682 EXPECT_EQ(ctx->RoundUp(-1), -1);
683
684 ctx->imageObj_ = AceType::MakeRefPtr<NG::StaticImageObject>(ImageSourceInfo(SRC_JPG), SizeF(0, 0), nullptr);
685 EXPECT_EQ(ctx->RoundUp(0), -1);
686
687 ctx->imageObj_ = AceType::MakeRefPtr<NG::StaticImageObject>(ImageSourceInfo(SRC_JPG), SizeF(-1, -1), nullptr);
688 EXPECT_EQ(ctx->RoundUp(0), -1);
689
690 ctx->imageObj_ = AceType::MakeRefPtr<NG::StaticImageObject>(ImageSourceInfo(SRC_JPG), SizeF(0, 0), nullptr);
691 EXPECT_EQ(ctx->RoundUp(-1), -1);
692
693 ctx->imageObj_ =
694 AceType::MakeRefPtr<NG::StaticImageObject>(ImageSourceInfo(SRC_JPG), SizeF(LENGTH_128, LENGTH_128), nullptr);
695 EXPECT_EQ(ctx->RoundUp(0), -1);
696
697 ctx->imageObj_ = AceType::MakeRefPtr<NG::StaticImageObject>(ImageSourceInfo(SRC_JPG), SizeF(0, 0), nullptr);
698 EXPECT_EQ(ctx->RoundUp(LENGTH_128), -1);
699 }
700
701 /**
702 * @tc.name: TargetSize001
703 * @tc.desc: Test calculating targetSize
704 * @tc.type: FUNC
705 */
706 HWTEST_F(ImageProviderTestNg, TargetSize001, TestSize.Level1)
707 {
708 auto ctx =
709 AceType::MakeRefPtr<ImageLoadingContext>(ImageSourceInfo(), LoadNotifier(nullptr, nullptr, nullptr), true);
710 ctx->dstSize_ = SizeF(200, 200);
711 ctx->imageObj_ = AceType::MakeRefPtr<NG::StaticImageObject>(ImageSourceInfo(SRC_JPG), SizeF(1000, 1000), nullptr);
712 ctx->imageFit_ = ImageFit::NONE;
713 ctx->sourceSizePtr_ = std::make_unique<SizeF>(50, 50);
714 ctx->OnMakeCanvasImage();
715 // canvasKey contains targetSize info
716 EXPECT_EQ(ctx->dstRect_.GetSize(), SizeF(50, 50));
717
718 ctx->imageFit_ = ImageFit::SCALE_DOWN;
719 ctx->OnMakeCanvasImage();
720 EXPECT_EQ(ctx->dstRect_.GetSize(), SizeF(50, 50));
721 }
722
723 /**
724 * @tc.name: NotifiersTest002
725 * @tc.desc: Test NotifiersTest.
726 * @tc.type: FUNC
727 */
728 HWTEST_F(ImageProviderTestNg, NotifiersTest002, TestSize.Level1)
729 {
730 /**
731 * @tc.steps: step1. Construction parameters
732 * @tc.expected: ImageSourceInfo.
733 */
734 auto src = ImageSourceInfo(SRC_JPG);
735 auto ctx = AceType::MakeRefPtr<ImageLoadingContext>(src, LoadNotifier(nullptr, nullptr, nullptr), true);
736 EXPECT_NE(ctx, nullptr);
737
738 callbackFlag = 0;
__anon80a153220702(const ImageSourceInfo& src) 739 auto callback1 = [](const ImageSourceInfo& src) {
740 callbackFlag = 1;
741 return;
742 };
__anon80a153220802(const ImageSourceInfo& src) 743 auto callback2 = [](const ImageSourceInfo& src) {
744 callbackFlag = 2;
745 return;
746 };
__anon80a153220902(const ImageSourceInfo& src, const std::string& errorMsg, const ImageErrorInfo& errorInfo) 747 auto callback3 = [](const ImageSourceInfo& src, const std::string& errorMsg, const ImageErrorInfo& errorInfo) {
748 callbackFlag = 3;
749 return;
750 };
751 /**
752 * @tc.steps: step2. Manage notification tasks for loading data
753 * @tc.expected: LoadNotifier.
754 */
755 ctx->notifiers_ = LoadNotifier(std::move(callback1), std::move(callback2), std::move(callback3));
__anon80a153220a02() 756 std::function<void()> func = []() {};
757 ctx->pendingMakeCanvasImageTask_ = func;
758 /**
759 * @tc.steps: step3. Cleaning or resetting with image loading.
760 * @tc.expected: OnUnloaded.
761 */
762 ctx->OnUnloaded();
763 ctx->OnLoadFail();
764 EXPECT_EQ(callbackFlag, 3);
765 ctx->OnDataReady();
766 EXPECT_EQ(callbackFlag, 1);
767 ctx->OnLoadSuccess();
768 EXPECT_EQ(callbackFlag, 2);
769 }
770
771 /**
772 * @tc.name: MakeCanvasImage
773 * @tc.desc: Test MakeCanvasImage
774 * @tc.type: FUNC
775 */
776 HWTEST_F(ImageProviderTestNg, MakeCanvasImage, TestSize.Level1)
777 {
778 auto src = ImageSourceInfo(SRC_THUMBNAIL);
779 auto ctx = AceType::MakeRefPtr<ImageLoadingContext>(src, LoadNotifier(nullptr, nullptr, nullptr), true);
780 SizeF size(LENGTH_100, LENGTH_100);
781 auto pixmap = AceType::MakeRefPtr<MockPixelMap>();
782 auto pixmapObj = AceType::MakeRefPtr<PixelMapImageObject>(pixmap, src, size);
783 pixmapObj->MakeCanvasImage(ctx, size, true, true);
784 EXPECT_NE(ctx->canvasImage_, nullptr);
785
786 pixmap = nullptr;
787 pixmapObj = AceType::MakeRefPtr<PixelMapImageObject>(pixmap, src, size);
788 pixmapObj->MakeCanvasImage(ctx, size, true, true);
789 EXPECT_NE(ctx->canvasImage_, nullptr);
790 }
791
792 /**
793 * @tc.name: CreatePixmap
794 * @tc.desc: Test CreatePixmap
795 * @tc.type: FUNC
796 */
797 HWTEST_F(ImageProviderTestNg, CreatePixmap, TestSize.Level1)
798 {
799 auto src = ImageSourceInfo(SRC_JPG);
800 auto pixmap = AceType::MakeRefPtr<MockPixelMap>();
801 auto data = AceType::MakeRefPtr<PixmapData>(pixmap);
802 EXPECT_NE(PixelMapImageObject::Create(src, data), nullptr);
803 }
804
805 /**
806 * @tc.name: TargetSize002
807 * @tc.desc: Test calculating targetSize
808 * @tc.type: FUNC
809 */
810 HWTEST_F(ImageProviderTestNg, TargetSize002, TestSize.Level1)
811 {
812 /**
813 * @tc.steps1: Construction parameters
814 */
815 RefPtr<NG::CanvasImage> canvasImage;
816 NG::ImagePainter imagePainter(canvasImage);
817 NG::RectF srcRect_;
818 NG::RectF dstRect_;
819 NG::SizeF rawpicsize { 1, 1 };
820 NG::SizeF dstsize { 1, 1 };
821 auto ctx =
822 AceType::MakeRefPtr<ImageLoadingContext>(ImageSourceInfo(), LoadNotifier(nullptr, nullptr, nullptr), true);
823 ctx->dstSize_ = SizeF(200, 200);
824 ctx->imageObj_ = AceType::MakeRefPtr<NG::StaticImageObject>(ImageSourceInfo(SRC_JPG), SizeF(-1.0, -1.0), nullptr);
825 ctx->imageFit_ = ImageFit::NONE;
826
827 /**
828 * @tc.steps2: If userDefinedSize is true.SizeF(1, 1).
829 * @tc.expected:EXPECT_EQ(size.value(), *ctx->sourceSizePtr_.get()).
830 */
831 ctx->sourceSizePtr_.reset(new SizeF(1, 1));
832 auto size = ctx->GetSourceSize();
833 EXPECT_EQ(size.value(), *ctx->sourceSizePtr_.get());
834
835 /**
836 * @tc.steps3: callback ApplyImageFit when ImageFit::NONE.
837 */
838 imagePainter.ApplyImageFit(ImageFit::NONE, rawpicsize, dstsize, srcRect_, dstRect_);
839 NG::SizeF srcSize(std::min(dstsize.Width(), rawpicsize.Width()), std::min(dstsize.Height(), rawpicsize.Height()));
840 auto testSize = Alignment::GetAlignPosition(dstsize, srcSize, Alignment::CENTER);
841 EXPECT_EQ(testSize.GetX(), 0);
842 EXPECT_EQ(testSize.GetY(), 0);
843 auto imageSize = ctx->GetImageSize();
844 EXPECT_EQ(imageSize, SizeF(-1.0, -1.0));
845 bool autoResize = true;
846 bool isPixelMapResource = (SrcType::DATA_ABILITY_DECODED == ctx->GetSourceInfo().GetSrcType());
847 ctx->ResizableCalcDstSize();
848
849 /**
850 * @tc.steps4: callback ApplyImageFit when ImageFit::COVER.
851 */
852 ctx->imageFit_ = ImageFit::COVER;
853 imagePainter.ApplyImageFit(ImageFit::COVER, rawpicsize, dstsize, srcRect_, dstRect_);
854 auto testSize1 = Alignment::GetAlignPosition(rawpicsize, srcRect_.GetSize(), Alignment::CENTER);
855 EXPECT_EQ(testSize1.GetX(), 0);
856 EXPECT_EQ(testSize1.GetY(), 0);
857 ctx->ResizableCalcDstSize();
858 EXPECT_EQ(imageSize, SizeF(-1.0, -1.0));
859 EXPECT_TRUE(autoResize);
860 EXPECT_FALSE(isPixelMapResource);
861 }
862
863 /**
864 * @tc.name: ImageProviderTestNg008
865 * @tc.desc: Test ImageProvider
866 * @tc.type: FUNC
867 */
868 HWTEST_F(ImageProviderTestNg, ImageProviderTestNg008, TestSize.Level1)
869 {
870 /**
871 * @tc.steps: step1. Construction parameters
872 * @tc.expected: ImageSourceInfo.
873 */
874 auto src = ImageSourceInfo(SRC_JPG);
875 auto ctx = AceType::MakeRefPtr<ImageLoadingContext>(src, LoadNotifier(nullptr, nullptr, nullptr), true);
876 EXPECT_EQ(ctx->stateManager_->GetCurrentState(), ImageLoadingState::UNLOADED);
877
878 /**
879 * @tc.steps: step2. Information related to building and managing image loading
880 */
881 ctx->GetDstRect();
882 ctx->GetSrcRect();
883 ctx->MoveCanvasImage();
884 ctx->GetFrameCount();
885
886 EXPECT_EQ(ctx->syncLoad_, true);
887 EXPECT_EQ(ctx->imageObj_, nullptr);
888
889 auto src1 = ImageSourceInfo(SRC_JPG);
890 src1.srcType_ = SrcType::PIXMAP;
891 auto ctx1 = AceType::MakeRefPtr<ImageLoadingContext>(src1, LoadNotifier(nullptr, nullptr, nullptr), true);
892 EXPECT_NE(ctx1, nullptr);
893 }
894
895 /**
896 * @tc.name: TargetSize003
897 * @tc.desc: Test calculating targetSize
898 * @tc.type: FUNC
899 */
900 HWTEST_F(ImageProviderTestNg, TargetSize003, TestSize.Level1)
901 {
902 /**
903 * @tc.steps1: Construction parameters
904 */
905 RefPtr<NG::CanvasImage> canvasImage;
906 NG::ImagePainter imagePainter(canvasImage);
907 NG::RectF srcRect_;
908 NG::RectF dstRect_;
909 NG::SizeF rawpicsize { 1, 1 };
910 NG::SizeF dstsize { 1, 1 };
911 auto ctx =
912 AceType::MakeRefPtr<ImageLoadingContext>(ImageSourceInfo(), LoadNotifier(nullptr, nullptr, nullptr), true);
913 ctx->dstSize_ = SizeF(200, 200);
914 ctx->imageObj_ = AceType::MakeRefPtr<NG::StaticImageObject>(ImageSourceInfo(SRC_JPG), SizeF(-1.0, -1.0), nullptr);
915 ctx->imageFit_ = ImageFit::NONE;
916
917 /**
918 * @tc.steps2: If userDefinedSize is false.Width() <= 0.0.Height() <= 0.0.
919 * @tc.expected: std::nullopt.
920 */
921 ctx->sourceSizePtr_.reset(new SizeF(-1, 1));
922 auto size = ctx->GetSourceSize();
923 EXPECT_EQ(size, std::nullopt);
924
925 /**
926 * @tc.steps3: callback ApplyImageFit when ImageFit::NONE.
927 */
928 imagePainter.ApplyImageFit(ImageFit::NONE, rawpicsize, dstsize, srcRect_, dstRect_);
929 NG::SizeF srcSize(std::min(dstsize.Width(), rawpicsize.Width()), std::min(dstsize.Height(), rawpicsize.Height()));
930 auto testSize = Alignment::GetAlignPosition(dstsize, srcSize, Alignment::CENTER);
931 EXPECT_EQ(testSize.GetX(), 0);
932 EXPECT_EQ(testSize.GetY(), 0);
933 auto imageSize = ctx->GetImageSize();
934 EXPECT_EQ(imageSize, SizeF(-1.0, -1.0));
935 bool autoResize = true;
936 bool isPixelMapResource = (SrcType::DATA_ABILITY_DECODED == ctx->GetSourceInfo().GetSrcType());
937 ctx->ResizableCalcDstSize();
938
939 /**
940 * @tc.steps4: callback ApplyImageFit when ImageFit::COVER.
941 */
942 ctx->imageFit_ = ImageFit::COVER;
943 imagePainter.ApplyImageFit(ImageFit::COVER, rawpicsize, dstsize, srcRect_, dstRect_);
944 auto testSize1 = Alignment::GetAlignPosition(rawpicsize, srcRect_.GetSize(), Alignment::CENTER);
945 EXPECT_EQ(testSize1.GetX(), 0);
946 EXPECT_EQ(testSize1.GetY(), 0);
947 ctx->ResizableCalcDstSize();
948 EXPECT_EQ(imageSize, SizeF(-1.0, -1.0));
949 EXPECT_TRUE(autoResize);
950 EXPECT_FALSE(isPixelMapResource);
951 }
952
953 /**
954 * @tc.name: HandleCommand002
955 * @tc.desc: Test HandleCommand.
956 * @tc.type: FUNC
957 */
958 HWTEST_F(ImageProviderTestNg, HandleCommand002, TestSize.Level1)
959 {
960 auto src = ImageSourceInfo(SRC_JPG);
961 auto ctx = AceType::MakeRefPtr<ImageLoadingContext>(src, LoadNotifier(nullptr, nullptr, nullptr), true);
962 ctx->syncLoad_ = true;
963 auto stateManager = AceType::MakeRefPtr<ImageStateManager>(AceType::WeakClaim(AceType::RawPtr(ctx)));
964 stateManager->HandleCommandByUnloadedState(ImageLoadingCommand::LOAD_DATA);
965 EXPECT_EQ(stateManager->state_, ImageLoadingState::DATA_LOADING);
966
967 stateManager->HandleCommandByUnloadedState(ImageLoadingCommand::RESET_STATE);
968 EXPECT_EQ(stateManager->state_, ImageLoadingState::UNLOADED);
969
970 stateManager->HandleCommandByUnloadedState(ImageLoadingCommand::LOAD_DATA_SUCCESS);
971 EXPECT_EQ(stateManager->state_, ImageLoadingState::UNLOADED);
972 }
973
974 /**
975 * @tc.name: HandleCommand003
976 * @tc.desc: Test HandleCommand.
977 * @tc.type: FUNC
978 */
979 HWTEST_F(ImageProviderTestNg, HandleCommand003, TestSize.Level1)
980 {
981 auto src = ImageSourceInfo(SRC_JPG);
982 auto ctx = AceType::MakeRefPtr<ImageLoadingContext>(src, LoadNotifier(nullptr, nullptr, nullptr), true);
983 ctx->syncLoad_ = true;
984 auto stateManager = AceType::MakeRefPtr<ImageStateManager>(ctx);
985 stateManager->HandleCommandByDataLoadingState(ImageLoadingCommand::LOAD_DATA_SUCCESS);
986 EXPECT_EQ(stateManager->state_, ImageLoadingState::DATA_READY);
987
988 stateManager->HandleCommandByDataLoadingState(ImageLoadingCommand::LOAD_FAIL);
989 EXPECT_EQ(stateManager->state_, ImageLoadingState::LOAD_FAIL);
990
991 stateManager->HandleCommandByDataLoadingState(ImageLoadingCommand::RESET_STATE);
992 EXPECT_EQ(stateManager->state_, ImageLoadingState::UNLOADED);
993
994 stateManager->HandleCommandByDataLoadingState(ImageLoadingCommand::RETRY_LOADING);
995 EXPECT_EQ(stateManager->state_, ImageLoadingState::UNLOADED);
996 }
997
998 /**
999 * @tc.name: HandleCommand004
1000 * @tc.desc: Test HandleCommand.
1001 * @tc.type: FUNC
1002 */
1003 HWTEST_F(ImageProviderTestNg, HandleCommand004, TestSize.Level1)
1004 {
1005 auto src = ImageSourceInfo(SRC_JPG);
1006 auto ctx = AceType::MakeRefPtr<ImageLoadingContext>(src, LoadNotifier(nullptr, nullptr, nullptr), true);
1007 ctx->syncLoad_ = true;
1008 auto stateManager = AceType::MakeRefPtr<ImageStateManager>(ctx);
1009 stateManager->HandleCommandByDataReadyState(ImageLoadingCommand::MAKE_CANVAS_IMAGE);
1010 EXPECT_EQ(stateManager->state_, ImageLoadingState::MAKE_CANVAS_IMAGE);
1011
1012 stateManager->HandleCommandByDataReadyState(ImageLoadingCommand::RESET_STATE);
1013 EXPECT_EQ(stateManager->state_, ImageLoadingState::UNLOADED);
1014
1015 stateManager->HandleCommandByDataReadyState(ImageLoadingCommand::LOAD_DATA_SUCCESS);
1016 EXPECT_EQ(stateManager->state_, ImageLoadingState::UNLOADED);
1017 }
1018
1019 /**
1020 * @tc.name: HandleCommand005
1021 * @tc.desc: Test HandleCommand.
1022 * @tc.type: FUNC
1023 */
1024 HWTEST_F(ImageProviderTestNg, HandleCommand005, TestSize.Level1)
1025 {
1026 auto src = ImageSourceInfo(SRC_JPG);
1027 auto ctx = AceType::MakeRefPtr<ImageLoadingContext>(src, LoadNotifier(nullptr, nullptr, nullptr), true);
1028 ctx->syncLoad_ = true;
1029 auto stateManager = AceType::MakeRefPtr<ImageStateManager>(ctx);
1030
1031 stateManager->HandleCommandByMakeCanvasImageState(ImageLoadingCommand::LOAD_FAIL);
1032 EXPECT_EQ(stateManager->state_, ImageLoadingState::LOAD_FAIL);
1033
1034 stateManager->HandleCommandByMakeCanvasImageState(ImageLoadingCommand::RESET_STATE);
1035 EXPECT_EQ(stateManager->state_, ImageLoadingState::UNLOADED);
1036
1037 stateManager->HandleCommandByMakeCanvasImageState(ImageLoadingCommand::LOAD_DATA_SUCCESS);
1038 EXPECT_EQ(stateManager->state_, ImageLoadingState::UNLOADED);
1039 }
1040
1041 /**
1042 * @tc.name: HandleCommand006
1043 * @tc.desc: Test HandleCommand.
1044 * @tc.type: FUNC
1045 */
1046 HWTEST_F(ImageProviderTestNg, HandleCommand006, TestSize.Level1)
1047 {
1048 auto src = ImageSourceInfo(SRC_JPG);
1049 auto ctx = AceType::MakeRefPtr<ImageLoadingContext>(src, LoadNotifier(nullptr, nullptr, nullptr), true);
1050 ctx->syncLoad_ = true;
1051 auto stateManager = AceType::MakeRefPtr<ImageStateManager>(ctx);
1052 stateManager->HandleCommandByLoadSuccessState(ImageLoadingCommand::MAKE_CANVAS_IMAGE);
1053 EXPECT_EQ(stateManager->state_, ImageLoadingState::MAKE_CANVAS_IMAGE);
1054
1055 stateManager->HandleCommandByLoadSuccessState(ImageLoadingCommand::RESET_STATE);
1056 EXPECT_EQ(stateManager->state_, ImageLoadingState::UNLOADED);
1057
1058 stateManager->HandleCommandByLoadSuccessState(ImageLoadingCommand::LOAD_DATA_SUCCESS);
1059 EXPECT_EQ(stateManager->state_, ImageLoadingState::UNLOADED);
1060 }
1061
1062 /**
1063 * @tc.name: HandleCommand007
1064 * @tc.desc: Test HandleCommand.
1065 * @tc.type: FUNC
1066 */
1067 HWTEST_F(ImageProviderTestNg, HandleCommand007, TestSize.Level1)
1068 {
1069 auto src = ImageSourceInfo(SRC_JPG);
1070 auto ctx = AceType::MakeRefPtr<ImageLoadingContext>(src, LoadNotifier(nullptr, nullptr, nullptr), true);
1071 ctx->syncLoad_ = true;
1072 auto stateManager = AceType::MakeRefPtr<ImageStateManager>(ctx);
1073
1074 stateManager->HandleCommandByLoadFailState(ImageLoadingCommand::RESET_STATE);
1075 EXPECT_EQ(stateManager->state_, ImageLoadingState::UNLOADED);
1076
1077 stateManager->HandleCommandByLoadFailState(ImageLoadingCommand::LOAD_DATA_SUCCESS);
1078 EXPECT_EQ(stateManager->state_, ImageLoadingState::UNLOADED);
1079 }
1080
1081 /**
1082 * @tc.name: GetCurrentLoadingState001
1083 * @tc.desc: Test GetCurrentLoadingState
1084 * @tc.type: FUNC
1085 */
1086 HWTEST_F(ImageProviderTestNg, GetCurrentLoadingState001, TestSize.Level1)
1087 {
1088 auto src = ImageSourceInfo(SRC_JPG);
1089 auto ctx = AceType::MakeRefPtr<ImageLoadingContext>(src, LoadNotifier(nullptr, nullptr, nullptr), true);
1090 EXPECT_EQ(ctx->stateManager_->GetCurrentState(), ImageLoadingState::UNLOADED);
1091 ctx->GetCurrentLoadingState();
1092
1093 ctx->stateManager_ = AceType::MakeRefPtr<ImageStateManager>(ctx);
1094 ctx->stateManager_->state_ = ImageLoadingState::MAKE_CANVAS_IMAGE;
1095 EXPECT_EQ(ctx->stateManager_->GetCurrentState(), ImageLoadingState::MAKE_CANVAS_IMAGE);
1096
1097 ctx->stateManager_->state_ = ImageLoadingState::LOAD_FAIL;
1098 ctx->stateManager_->HandleCommand(ImageLoadingCommand::LOAD_FAIL);
1099 EXPECT_EQ(ctx->stateManager_->GetCurrentState(), ImageLoadingState::LOAD_FAIL);
1100 }
1101
1102 /**
1103 * @tc.name: GetCurrentLoadingState002
1104 * @tc.desc: Test GetCurrentLoadingState
1105 * @tc.type: FUNC
1106 */
1107 HWTEST_F(ImageProviderTestNg, GetCurrentLoadingState002, TestSize.Level1)
1108 {
1109 auto src = ImageSourceInfo(SRC_JPG);
1110 auto ctx = AceType::MakeRefPtr<ImageLoadingContext>(src, LoadNotifier(nullptr, nullptr, nullptr), true);
1111 EXPECT_EQ(ctx->stateManager_->GetCurrentState(), ImageLoadingState::UNLOADED);
1112
1113 ctx->stateManager_ = AceType::MakeRefPtr<ImageStateManager>(ctx);
1114 ctx->stateManager_->state_ = ImageLoadingState::DATA_LOADING;
1115 ctx->GetCurrentLoadingState();
1116 EXPECT_EQ(ctx->stateManager_->GetCurrentState(), ImageLoadingState::DATA_LOADING);
1117 }
1118
1119 /**
1120 * @tc.name: GetCurrentLoadingState003
1121 * @tc.desc: Test GetCurrentLoadingState
1122 * @tc.type: FUNC
1123 */
1124 HWTEST_F(ImageProviderTestNg, GetCurrentLoadingState003, TestSize.Level1)
1125 {
1126 auto src = ImageSourceInfo(SRC_JPG);
1127 auto ctx = AceType::MakeRefPtr<ImageLoadingContext>(src, LoadNotifier(nullptr, nullptr, nullptr), true);
1128 EXPECT_EQ(ctx->stateManager_->GetCurrentState(), ImageLoadingState::UNLOADED);
1129
1130 ctx->stateManager_ = AceType::MakeRefPtr<ImageStateManager>(ctx);
1131 ctx->stateManager_->state_ = ImageLoadingState::DATA_READY;
1132 ctx->GetCurrentLoadingState();
1133 EXPECT_EQ(ctx->stateManager_->GetCurrentState(), ImageLoadingState::DATA_READY);
1134 }
1135
1136 /**
1137 * @tc.name: GetCurrentLoadingState004
1138 * @tc.desc: Test GetCurrentLoadingState
1139 * @tc.type: FUNC
1140 */
1141 HWTEST_F(ImageProviderTestNg, GetCurrentLoadingState004, TestSize.Level1)
1142 {
1143 auto src = ImageSourceInfo(SRC_JPG);
1144 auto ctx = AceType::MakeRefPtr<ImageLoadingContext>(src, LoadNotifier(nullptr, nullptr, nullptr), true);
1145 EXPECT_EQ(ctx->stateManager_->GetCurrentState(), ImageLoadingState::UNLOADED);
1146
1147 ctx->stateManager_ = AceType::MakeRefPtr<ImageStateManager>(ctx);
1148 ctx->stateManager_->state_ = ImageLoadingState::MAKE_CANVAS_IMAGE;
1149 ctx->GetCurrentLoadingState();
1150 EXPECT_EQ(ctx->stateManager_->GetCurrentState(), ImageLoadingState::MAKE_CANVAS_IMAGE);
1151 }
1152
1153 /**
1154 * @tc.name: GetCurrentLoadingState005
1155 * @tc.desc: Test GetCurrentLoadingState
1156 * @tc.type: FUNC
1157 */
1158 HWTEST_F(ImageProviderTestNg, GetCurrentLoadingState005, TestSize.Level1)
1159 {
1160 auto src = ImageSourceInfo(SRC_JPG);
1161 auto ctx = AceType::MakeRefPtr<ImageLoadingContext>(src, LoadNotifier(nullptr, nullptr, nullptr), true);
1162 EXPECT_EQ(ctx->stateManager_->GetCurrentState(), ImageLoadingState::UNLOADED);
1163
1164 ctx->stateManager_ = AceType::MakeRefPtr<ImageStateManager>(ctx);
1165 ctx->stateManager_->state_ = ImageLoadingState::LOAD_SUCCESS;
1166 ctx->GetCurrentLoadingState();
1167 EXPECT_EQ(ctx->stateManager_->GetCurrentState(), ImageLoadingState::LOAD_SUCCESS);
1168 }
1169
1170 /**
1171 * @tc.name: GetCurrentLoadingState006
1172 * @tc.desc: Test GetCurrentLoadingState
1173 * @tc.type: FUNC
1174 */
1175 HWTEST_F(ImageProviderTestNg, GetCurrentLoadingState006, TestSize.Level1)
1176 {
1177 auto src = ImageSourceInfo(SRC_JPG);
1178 auto ctx = AceType::MakeRefPtr<ImageLoadingContext>(src, LoadNotifier(nullptr, nullptr, nullptr), true);
1179 EXPECT_EQ(ctx->stateManager_->GetCurrentState(), ImageLoadingState::UNLOADED);
1180
1181 ctx->stateManager_ = AceType::MakeRefPtr<ImageStateManager>(ctx);
1182 ctx->stateManager_->state_ = ImageLoadingState::LOAD_FAIL;
1183 ctx->GetCurrentLoadingState();
1184 EXPECT_EQ(ctx->stateManager_->GetCurrentState(), ImageLoadingState::LOAD_FAIL);
1185 }
1186
1187 /**
1188 * @tc.name: GetFrameCount001
1189 * @tc.desc: Test GetFrameCount
1190 * @tc.type: FUNC
1191 */
1192 HWTEST_F(ImageProviderTestNg, GetFrameCount001, TestSize.Level1)
1193 {
1194 auto src = ImageSourceInfo(SRC_JPG);
1195 auto ctx = AceType::MakeRefPtr<ImageLoadingContext>(src, LoadNotifier(nullptr, nullptr, nullptr), true);
1196
1197 ctx->GetFrameCount();
1198 EXPECT_EQ(ctx->imageObj_, nullptr);
1199
1200 ctx->imageObj_ = AceType::MakeRefPtr<NG::StaticImageObject>(ImageSourceInfo(SRC_JPG), SizeF(1000, 1000), nullptr);
1201 ctx->GetFrameCount();
1202 EXPECT_NE(ctx->imageObj_, nullptr);
1203 }
1204
1205 /**
1206 * @tc.name: CallbackAfterMeasureIfNeed001
1207 * @tc.desc: Test CallbackAfterMeasureIfNeed
1208 * @tc.type: FUNC
1209 */
1210 HWTEST_F(ImageProviderTestNg, CallbackAfterMeasureIfNeed001, TestSize.Level1)
1211 {
1212 auto src = ImageSourceInfo(SRC_JPG);
1213 auto ctx = AceType::MakeRefPtr<ImageLoadingContext>(src, LoadNotifier(nullptr, nullptr, nullptr), true);
1214
1215 ctx->needErrorCallBack_ = false;
1216 ctx->CallbackAfterMeasureIfNeed();
1217
1218 ctx->needErrorCallBack_ = true;
1219 ctx->CallbackAfterMeasureIfNeed();
1220 EXPECT_EQ(ctx->needErrorCallBack_, false);
1221 }
1222
1223 /**
1224 * @tc.name: CallbackAfterMeasureIfNeed002
1225 * @tc.desc: Test CallbackAfterMeasureIfNeed
1226 * @tc.type: FUNC
1227 */
1228 HWTEST_F(ImageProviderTestNg, CallbackAfterMeasureIfNeed002, TestSize.Level1)
1229 {
1230 auto src = ImageSourceInfo(SRC_JPG);
1231 auto ctx = AceType::MakeRefPtr<ImageLoadingContext>(src, LoadNotifier(nullptr, nullptr, nullptr), true);
1232
1233 ctx->needErrorCallBack_ = false;
1234 ctx->needDataReadyCallBack_ = false;
1235 ctx->CallbackAfterMeasureIfNeed();
1236
1237 ctx->needDataReadyCallBack_ = true;
1238 ctx->CallbackAfterMeasureIfNeed();
1239 EXPECT_EQ(ctx->needDataReadyCallBack_, false);
1240 }
1241
1242 /**
1243 * @tc.name: FailCallback001
1244 * @tc.desc: Test FailCallback
1245 * @tc.type: FUNC
1246 */
1247 HWTEST_F(ImageProviderTestNg, FailCallback001, TestSize.Level1)
1248 {
1249 auto src = ImageSourceInfo(SRC_JPG);
1250 src.srcType_ = SrcType::NETWORK;
1251 auto ctx = AceType::MakeRefPtr<ImageLoadingContext>(src, LoadNotifier(nullptr, nullptr, nullptr), true);
1252
1253 ctx->measureFinish_ = true;
1254 ctx->FailCallback("test error");
1255 EXPECT_EQ(ctx->needErrorCallBack_, false);
1256 }
1257
1258 /**
1259 * @tc.name: FailCallback002
1260 * @tc.desc: Test FailCallback
1261 * @tc.type: FUNC
1262 */
1263 HWTEST_F(ImageProviderTestNg, FailCallback002, TestSize.Level1)
1264 {
1265 auto src = ImageSourceInfo(SRC_JPG);
1266 src.srcType_ = SrcType::MEMORY;
1267 auto ctx = AceType::MakeRefPtr<ImageLoadingContext>(src, LoadNotifier(nullptr, nullptr, nullptr), true);
1268
1269 ctx->measureFinish_ = false;
1270 ctx->FailCallback("test error");
1271 EXPECT_EQ(ctx->Downloadable(), false);
1272 }
1273
1274 /**
1275 * @tc.name: DataReadyCallback001
1276 * @tc.desc: Test DataReadyCallback
1277 * @tc.type: FUNC
1278 */
1279 HWTEST_F(ImageProviderTestNg, DataReadyCallback001, TestSize.Level1)
1280 {
1281 auto src = ImageSourceInfo(SRC_JPG);
1282 src.srcType_ = SrcType::NETWORK;
1283 auto ctx = AceType::MakeRefPtr<ImageLoadingContext>(src, LoadNotifier(nullptr, nullptr, nullptr), true);
1284
1285 auto pixmap = AceType::MakeRefPtr<MockPixelMap>();
1286 SizeF size(LENGTH_100, LENGTH_100);
1287 ctx->measureFinish_ = true;
1288
1289 ctx->DataReadyCallback(AceType::MakeRefPtr<PixelMapImageObject>(pixmap, src, size));
1290 EXPECT_EQ(ctx->GetImageSize(), size);
1291 }
1292
1293 /**
1294 * @tc.name: ResizableCalcDstSize001
1295 * @tc.desc: Test ResizableCalcDstSize
1296 * @tc.type: FUNC
1297 */
1298 HWTEST_F(ImageProviderTestNg, ResizableCalcDstSize001, TestSize.Level1)
1299 {
1300 auto src = ImageSourceInfo(SRC_JPG);
1301 auto ctx = AceType::MakeRefPtr<ImageLoadingContext>(src, LoadNotifier(nullptr, nullptr, nullptr), true);
1302
1303 ctx->autoResize_ = true;
1304 bool isPixelMapResource = (SrcType::DATA_ABILITY_DECODED == ctx->GetSourceInfo().GetSrcType());
1305 ctx->ResizableCalcDstSize();
1306 EXPECT_FALSE(isPixelMapResource);
1307 }
1308
1309 /**
1310 * @tc.name: ResizableCalcDstSize002
1311 * @tc.desc: Test ResizableCalcDstSize
1312 * @tc.type: FUNC
1313 */
1314 HWTEST_F(ImageProviderTestNg, ResizableCalcDstSize002, TestSize.Level1)
1315 {
1316 auto src = ImageSourceInfo(SRC_JPG);
1317 src.srcType_ = SrcType::DATA_ABILITY_DECODED;
1318 auto ctx = AceType::MakeRefPtr<ImageLoadingContext>(src, LoadNotifier(nullptr, nullptr, nullptr), true);
1319
1320 ctx->autoResize_ = false;
1321 bool isPixelMapResource = (SrcType::DATA_ABILITY_DECODED == ctx->GetSourceInfo().GetSrcType());
1322 ctx->ResizableCalcDstSize();
1323 EXPECT_TRUE(isPixelMapResource);
1324 }
1325
1326 /**
1327 * @tc.name: DownloadOnProgress001
1328 * @tc.desc: Test DownloadOnProgress
1329 * @tc.type: FUNC
1330 */
1331 HWTEST_F(ImageProviderTestNg, DownloadOnProgress001, TestSize.Level1)
1332 {
1333 uint32_t dlNow = 0;
1334 uint32_t dlTotal = 0;
1335 auto src = ImageSourceInfo(SRC_JPG);
1336 src.srcType_ = SrcType::DATA_ABILITY_DECODED;
1337 auto ctx = AceType::MakeRefPtr<ImageLoadingContext>(src, LoadNotifier(nullptr, nullptr, nullptr), true);
1338
__anon80a153220b02(const uint32_t& dlNow, const uint32_t& dlTotal) 1339 ctx->onProgressCallback_ = [](const uint32_t& dlNow, const uint32_t& dlTotal) {};
1340 ctx->DownloadOnProgress(dlNow, dlTotal);
1341
1342 ctx->onProgressCallback_ = nullptr;
1343 bool isPixelMapResource = (SrcType::DATA_ABILITY == ctx->GetSourceInfo().GetSrcType());
1344 ctx->DownloadOnProgress(dlNow, dlTotal);
1345 EXPECT_FALSE(isPixelMapResource);
1346 }
1347
1348 /**
1349 * @tc.name: MakeCanvasImageIfNeed002
1350 * @tc.desc: Test MakeCanvasImageIfNeed
1351 * @tc.type: FUNC
1352 */
1353 HWTEST_F(ImageProviderTestNg, MakeCanvasImageIfNeed002, TestSize.Level1)
1354 {
1355 auto src = ImageSourceInfo(SRC_JPG);
1356 auto ctx = AceType::MakeRefPtr<ImageLoadingContext>(src, LoadNotifier(nullptr, nullptr, nullptr), true);
1357 ctx->stateManager_->state_ = ImageLoadingState::MAKE_CANVAS_IMAGE;
1358 SizeF dstSize(LENGTH_100, LENGTH_100);
__anon80a153220c02() 1359 std::function<void()> func = []() {};
1360 ctx->pendingMakeCanvasImageTask_ = func;
1361 auto res = ctx->MakeCanvasImageIfNeed(dstSize, true, ImageFit::COVER);
1362 EXPECT_TRUE(res);
1363 }
1364
1365 /**
1366 * @tc.name: MakeCanvasImage001
1367 * @tc.desc: Test MakeCanvasImage
1368 * @tc.type: FUNC
1369 */
1370 HWTEST_F(ImageProviderTestNg, MakeCanvasImage001, TestSize.Level1)
1371 {
1372 auto src = ImageSourceInfo(SRC_THUMBNAIL);
1373 auto ctx = AceType::MakeRefPtr<ImageLoadingContext>(src, LoadNotifier(nullptr, nullptr, nullptr), true);
1374 EXPECT_NE(ctx, nullptr);
1375
1376 SizeF size(LENGTH_100, LENGTH_100);
1377 auto pixmap = AceType::MakeRefPtr<MockPixelMap>();
1378 auto pixmapObj = AceType::MakeRefPtr<PixelMapImageObject>(pixmap, src, size);
1379 EXPECT_NE(pixmapObj, nullptr);
1380
1381 int32_t backupApiVersion = AceApplicationInfo::GetInstance().GetApiTargetVersion();
1382 AceApplicationInfo::GetInstance().SetApiTargetVersion(static_cast<int32_t>(PlatformVersion::VERSION_THIRTEEN));
1383
1384 pixmapObj->MakeCanvasImage(ctx, size, true, true);
1385 EXPECT_NE(ctx->canvasImage_, nullptr);
1386
1387 pixmapObj = AceType::MakeRefPtr<PixelMapImageObject>(pixmap, src, size);
1388 EXPECT_NE(pixmapObj, nullptr);
1389
1390 pixmapObj->MakeCanvasImage(ctx, size, true, false);
1391 EXPECT_NE(ctx->canvasImage_, nullptr);
1392
1393 AceApplicationInfo::GetInstance().SetApiTargetVersion(backupApiVersion);
1394
1395 pixmapObj->MakeCanvasImage(ctx, size, true, false);
1396 EXPECT_NE(ctx->canvasImage_, nullptr);
1397 }
1398
1399 /**
1400 * @tc.name: CreatePixmap001
1401 * @tc.desc: Test PixelMapImageObject Create
1402 * @tc.type: FUNC
1403 */
1404 HWTEST_F(ImageProviderTestNg, CreatePixmap001, TestSize.Level1)
1405 {
1406 auto src = ImageSourceInfo(SRC_THUMBNAIL);
1407
1408 SizeF size(LENGTH_100, LENGTH_100);
1409 auto pixmap = AceType::MakeRefPtr<MockPixelMap>();
1410 auto pixmapObj = AceType::MakeRefPtr<PixelMapImageObject>(pixmap, src, size);
1411 EXPECT_NE(pixmapObj, nullptr);
1412
1413 pixmap = nullptr;
1414 auto data = AceType::MakeRefPtr<PixmapData>(pixmap);
1415 EXPECT_NE(data, nullptr);
1416
1417 auto pixelMapImageObject = pixmapObj->Create(src, data);
1418 EXPECT_EQ(pixelMapImageObject, nullptr);
1419 }
1420
1421 /**
1422 * @tc.name: ImageLoadingContext001
1423 * @tc.desc: Test ImageLoadingContext.
1424 * @tc.type: FUNC
1425 */
1426 HWTEST_F(ImageProviderTestNg, ImageLoadingContext001, TestSize.Level1)
1427 {
1428 auto src = ImageSourceInfo(SRC_JPG);
1429 src.srcType_ = SrcType::NETWORK;
1430
1431 int32_t backupApiVersion = AceApplicationInfo::GetInstance().GetApiTargetVersion();
1432 AceApplicationInfo::GetInstance().SetApiTargetVersion(static_cast<int32_t>(PlatformVersion::VERSION_THIRTEEN));
1433
1434 auto ctx = AceType::MakeRefPtr<ImageLoadingContext>(src, LoadNotifier(nullptr, nullptr, nullptr), true);
1435 EXPECT_NE(ctx, nullptr);
1436
1437 auto src1 = ImageSourceInfo(SRC_JPG);
1438 src1.srcType_ = SrcType::PIXMAP;
1439
1440 auto ctx1 = AceType::MakeRefPtr<ImageLoadingContext>(src1, LoadNotifier(nullptr, nullptr, nullptr), true);
1441 EXPECT_NE(ctx1, nullptr);
1442
1443 AceApplicationInfo::GetInstance().SetApiTargetVersion(backupApiVersion);
1444
1445 EXPECT_TRUE(ctx1->syncLoad_);
1446 }
1447
1448 /**
1449 * @tc.name: OnMakeCanvasImage001
1450 * @tc.desc: Test OnMakeCanvasImage
1451 * @tc.type: FUNC
1452 */
1453 HWTEST_F(ImageProviderTestNg, OnMakeCanvasImage001, TestSize.Level1)
1454 {
1455 auto src = ImageSourceInfo(SRC_JPG);
1456 src.srcType_ = SrcType::PIXMAP;
1457
1458 auto ctx = AceType::MakeRefPtr<ImageLoadingContext>(src, LoadNotifier(nullptr, nullptr, nullptr), true);
1459 EXPECT_NE(ctx, nullptr);
1460
1461 ctx->imageObj_ = AceType::MakeRefPtr<NG::StaticImageObject>(ImageSourceInfo(SRC_JPG), SizeF(1000, 1000), nullptr);
1462 EXPECT_NE(ctx->imageObj_, nullptr);
1463
1464 ctx->imageFit_ = ImageFit::NONE;
1465 ctx->sourceSizePtr_ = nullptr;
1466 ctx->dstSize_ = SizeF(200, 200);
1467 ctx->autoResize_ = false;
1468
1469 ctx->OnMakeCanvasImage();
1470 EXPECT_FALSE(ctx->GetSourceSize());
1471 EXPECT_EQ(ctx->dstRect_.Height(), 200);
1472 }
1473
1474 /**
1475 * @tc.name: OnMakeCanvasImage002
1476 * @tc.desc: Test OnMakeCanvasImage
1477 * @tc.type: FUNC
1478 */
1479 HWTEST_F(ImageProviderTestNg, OnMakeCanvasImage002, TestSize.Level1)
1480 {
1481 auto src = ImageSourceInfo(SRC_JPG);
1482 src.srcType_ = SrcType::DATA_ABILITY_DECODED;
1483
1484 auto ctx = AceType::MakeRefPtr<ImageLoadingContext>(src, LoadNotifier(nullptr, nullptr, nullptr), true);
1485 EXPECT_NE(ctx, nullptr);
1486
1487 ctx->imageObj_ = AceType::MakeRefPtr<NG::StaticImageObject>(ImageSourceInfo(SRC_JPG), SizeF(1000, 1000), nullptr);
1488 EXPECT_NE(ctx->imageObj_, nullptr);
1489
1490 ctx->sourceSizePtr_ = nullptr;
1491 ctx->dstSize_ = SizeF(200, 200);
1492 ctx->autoResize_ = false;
1493
1494 ctx->OnMakeCanvasImage();
1495 EXPECT_FALSE(ctx->GetSourceSize());
1496 EXPECT_EQ(ctx->dstRect_.Height(), 200);
1497
1498 ctx->autoResize_ = true;
1499 ctx->OnMakeCanvasImage();
1500 EXPECT_FALSE(ctx->GetSourceSize());
1501 EXPECT_EQ(ctx->dstRect_.Height(), 200);
1502 }
1503
1504 /**
1505 * @tc.name: ResizableCalcDstSize003
1506 * @tc.desc: Test ResizableCalcDstSize
1507 * @tc.type: FUNC
1508 */
1509 HWTEST_F(ImageProviderTestNg, ResizableCalcDstSize003, TestSize.Level1)
1510 {
1511 auto src = ImageSourceInfo(SRC_JPG);
1512 src.srcType_ = SrcType::DATA_ABILITY_DECODED;
1513
1514 auto ctx = AceType::MakeRefPtr<ImageLoadingContext>(src, LoadNotifier(nullptr, nullptr, nullptr), true);
1515 EXPECT_NE(ctx, nullptr);
1516
1517 ctx->sourceSizePtr_ = nullptr;
1518 ctx->dstSize_ = SizeF(200, 200);
1519
1520 ctx->ResizableCalcDstSize();
1521 EXPECT_EQ(ctx->GetSourceInfo().GetSrcType(), SrcType::DATA_ABILITY_DECODED);
1522 }
1523
1524 /**
1525 * @tc.name: ResizableCalcDstSize004
1526 * @tc.desc: Test ResizableCalcDstSize
1527 * @tc.type: FUNC
1528 */
1529 HWTEST_F(ImageProviderTestNg, ResizableCalcDstSize004, TestSize.Level1)
1530 {
1531 auto src = ImageSourceInfo(SRC_JPG);
1532 src.srcType_ = SrcType::PIXMAP;
1533
1534 auto ctx = AceType::MakeRefPtr<ImageLoadingContext>(src, LoadNotifier(nullptr, nullptr, nullptr), true);
1535 EXPECT_NE(ctx, nullptr);
1536
1537 ctx->sourceSizePtr_ = nullptr;
1538 ctx->dstSize_ = SizeF(200, 200);
1539 ctx->autoResize_ = false;
1540
1541 ctx->ResizableCalcDstSize();
1542 EXPECT_EQ(ctx->GetSourceInfo().GetSrcType(), SrcType::PIXMAP);
1543 }
1544
1545 /**
1546 * @tc.name: MakeCanvasImageIfNeed003
1547 * @tc.desc: Test MakeCanvasImageIfNeed
1548 * @tc.type: FUNC
1549 */
1550 HWTEST_F(ImageProviderTestNg, MakeCanvasImageIfNeed003, TestSize.Level1)
1551 {
1552 auto ctx =
1553 AceType::MakeRefPtr<ImageLoadingContext>(ImageSourceInfo(), LoadNotifier(nullptr, nullptr, nullptr), true);
1554 EXPECT_NE(ctx, nullptr);
1555
1556 ctx->imageObj_ =
1557 AceType::MakeRefPtr<NG::StaticImageObject>(ImageSourceInfo(SRC_JPG), SizeF(LENGTH_128, LENGTH_128), nullptr);
1558 EXPECT_NE(ctx->imageObj_, nullptr);
1559
1560 SizeF dstSize(LENGTH_100, LENGTH_100);
__anon80a153220d02() 1561 std::function<void()> func = []() {};
1562 ctx->pendingMakeCanvasImageTask_ = func;
1563 ctx->stateManager_->state_ = ImageLoadingState::DATA_READY;
1564
1565 auto res = ctx->MakeCanvasImageIfNeed(dstSize, true, ImageFit::COVER);
1566 EXPECT_TRUE(res);
1567 EXPECT_EQ(ctx->dstSize_, SizeF(LENGTH_100, LENGTH_100));
1568 EXPECT_EQ(ctx->stateManager_->state_, ImageLoadingState::LOAD_SUCCESS);
1569
1570 res = ctx->MakeCanvasImageIfNeed(SizeF(LENGTH_65, LENGTH_65), true, ImageFit::COVER, std::nullopt, true);
1571 EXPECT_FALSE(res);
1572 EXPECT_EQ(ctx->sizeLevel_, LENGTH_128);
1573 }
1574
1575 /**
1576 * @tc.name: MakeCanvasImageIfNeed004
1577 * @tc.desc: Test MakeCanvasImageIfNeed when firstLoadImage_ is false
1578 * @tc.type: FUNC
1579 */
1580 HWTEST_F(ImageProviderTestNg, MakeCanvasImageIfNeed004, TestSize.Level1)
1581 {
1582 auto ctx =
1583 AceType::MakeRefPtr<ImageLoadingContext>(ImageSourceInfo(), LoadNotifier(nullptr, nullptr, nullptr), true);
1584 EXPECT_NE(ctx, nullptr);
1585
1586 ctx->imageObj_ =
1587 AceType::MakeRefPtr<NG::StaticImageObject>(ImageSourceInfo(SRC_JPG), SizeF(LENGTH_128, LENGTH_128), nullptr);
1588 EXPECT_NE(ctx->imageObj_, nullptr);
1589
1590 SizeF dstSize(LENGTH_100, LENGTH_100);
__anon80a153220e02() 1591 std::function<void()> func = []() {};
1592 ctx->pendingMakeCanvasImageTask_ = func;
1593 ctx->firstLoadImage_ = false;
1594 ctx->stateManager_->state_ = ImageLoadingState::DATA_READY;
1595
1596 auto res = ctx->MakeCanvasImageIfNeed(dstSize, true, ImageFit::COVER);
1597 EXPECT_TRUE(res);
1598 EXPECT_EQ(ctx->dstSize_, SizeF(LENGTH_100, LENGTH_100));
1599 EXPECT_EQ(ctx->stateManager_->state_, ImageLoadingState::LOAD_SUCCESS);
1600 }
1601
1602 /**
1603 * @tc.name: GetImageSize002
1604 * @tc.desc: Test GetImageSize
1605 * @tc.type: FUNC
1606 */
1607 HWTEST_F(ImageProviderTestNg, GetImageSize002, TestSize.Level1)
1608 {
1609 auto ctx =
1610 AceType::MakeRefPtr<ImageLoadingContext>(ImageSourceInfo(), LoadNotifier(nullptr, nullptr, nullptr), true);
1611 EXPECT_NE(ctx, nullptr);
1612
1613 ctx->imageObj_ =
1614 AceType::MakeRefPtr<NG::StaticImageObject>(ImageSourceInfo(SRC_JPG), SizeF(LENGTH_128, LENGTH_128), nullptr);
1615 EXPECT_NE(ctx->imageObj_, nullptr);
1616
1617 ctx->imageObj_->SetOrientation(ImageRotateOrientation::LEFT);
1618 auto imageSize = ctx->GetImageSize();
1619 EXPECT_EQ(imageSize, SizeF(LENGTH_128, LENGTH_128));
1620
1621 ctx->imageObj_->SetOrientation(ImageRotateOrientation::RIGHT);
1622 imageSize = ctx->GetImageSize();
1623 EXPECT_EQ(imageSize, SizeF(LENGTH_128, LENGTH_128));
1624 }
1625
1626 /**
1627 * @tc.name: PrepareImageData001
1628 * @tc.desc: Test PrepareImageData
1629 * @tc.type: FUNC
1630 */
1631 HWTEST_F(ImageProviderTestNg, PrepareImageData001, TestSize.Level1)
1632 {
1633 auto imageProvider = AceType::MakeRefPtr<ImageProvider>();
1634 EXPECT_NE(imageProvider, nullptr);
1635
1636 auto src = ImageSourceInfo(SRC_JPG);
1637 ImageErrorInfo errorInfo;
1638 EXPECT_FALSE(ImageProvider::BuildImageObject(src, errorInfo, nullptr));
1639 auto data = AceType::MakeRefPtr<DrawingImageData>(nullptr, 0);
1640 auto imageObject = ImageProvider::BuildImageObject(src, errorInfo, data);
1641
1642 auto lock = imageObject->GetPrepareImageDataLock();
1643 lock.__owns_ = false;
1644
1645 EXPECT_FALSE(imageProvider->PrepareImageData(imageObject));
1646 }
1647
1648 /**
1649 * @tc.name: PrepareImageData002
1650 * @tc.desc: Test PrepareImageData
1651 * @tc.type: FUNC
1652 */
1653 HWTEST_F(ImageProviderTestNg, PrepareImageData002, TestSize.Level1)
1654 {
1655 auto imageProvider = AceType::MakeRefPtr<ImageProvider>();
1656 EXPECT_NE(imageProvider, nullptr);
1657
1658 auto src = ImageSourceInfo(SRC_JPG);
1659 ImageErrorInfo errorInfo;
1660 EXPECT_FALSE(ImageProvider::BuildImageObject(src, errorInfo, nullptr));
1661 auto data = AceType::MakeRefPtr<DrawingImageData>(nullptr, 0);
1662 auto imageObject = ImageProvider::BuildImageObject(src, errorInfo, data);
1663 imageObject->data_ = nullptr;
1664
1665 MockContainer::SetUp();
1666 auto container = MockContainer::Current();
1667
1668 EXPECT_FALSE(imageProvider->PrepareImageData(imageObject));
1669 }
1670
1671 /**
1672 * @tc.name: PrepareImageData003
1673 * @tc.desc: Test PrepareImageData
1674 * @tc.type: FUNC
1675 */
1676 HWTEST_F(ImageProviderTestNg, PrepareImageData003, TestSize.Level1)
1677 {
1678 auto imageProvider = AceType::MakeRefPtr<ImageProvider>();
1679 EXPECT_NE(imageProvider, nullptr);
1680
1681 auto src = ImageSourceInfo(SRC_JPG);
1682 ImageErrorInfo errorInfo;
1683 EXPECT_FALSE(ImageProvider::BuildImageObject(src, errorInfo, nullptr));
1684 auto data = AceType::MakeRefPtr<DrawingImageData>(nullptr, 0);
1685 auto imageObject = ImageProvider::BuildImageObject(src, errorInfo, data);
1686 imageObject->data_ = nullptr;
1687
1688 MockContainer::SetUp();
1689 auto container = MockContainer::Current();
1690 g_loader = nullptr;
1691 container->pipelineContext_ = PipelineBase::GetCurrentContext();
1692
1693 EXPECT_FALSE(imageProvider->PrepareImageData(imageObject));
1694 }
1695
1696 /**
1697 * @tc.name: CreateImageObjHelper001
1698 * @tc.desc: Test CreateImageObjHelper
1699 * @tc.type: FUNC
1700 */
1701 HWTEST_F(ImageProviderTestNg, CreateImageObjHelper001, TestSize.Level1)
1702 {
1703 auto imageProvider = AceType::MakeRefPtr<ImageProvider>();
1704 EXPECT_NE(imageProvider, nullptr);
1705
1706 auto src = ImageSourceInfo(SRC_THUMBNAIL);
1707 auto ctx = AceType::MakeRefPtr<ImageLoadingContext>(src, LoadNotifier(nullptr, nullptr, nullptr));
1708 ctx->LoadImageData();
1709 EXPECT_EQ(ctx->stateManager_->state_, ImageLoadingState::DATA_LOADING);
1710 g_loader = nullptr;
1711
1712 WaitForAsyncTasks();
1713
1714 EXPECT_EQ(ctx->errorMsg_, "Failed to create image loader.");
1715 }
1716
1717 /**
1718 * @tc.name: CreateImageObjHelper002
1719 * @tc.desc: Test CreateImageObjHelper
1720 * @tc.type: FUNC
1721 */
1722 HWTEST_F(ImageProviderTestNg, CreateImageObjHelper002, TestSize.Level1)
1723 {
1724 auto imageProvider = AceType::MakeRefPtr<ImageProvider>();
1725 EXPECT_NE(imageProvider, nullptr);
1726
1727 auto src = ImageSourceInfo(SRC_THUMBNAIL);
1728 auto ctx = AceType::MakeRefPtr<ImageLoadingContext>(src, LoadNotifier(nullptr, nullptr, nullptr));
1729 ctx->LoadImageData();
1730 EXPECT_EQ(ctx->stateManager_->state_, ImageLoadingState::DATA_LOADING);
1731
1732 MockContainer::SetUp();
1733 auto container = MockContainer::Current();
1734 auto data = AceType::MakeRefPtr<MockImageData>();
1735 EXPECT_CALL(*g_loader, LoadDecodedImageData(testing::_, testing::_, testing::_)).WillOnce(testing::Return(data));
1736 auto pixmap = AceType::MakeRefPtr<MockPixelMap>();
1737 src.pixmap_ = pixmap;
1738
1739 WaitForAsyncTasks();
1740
1741 EXPECT_EQ(ctx->errorMsg_, "Failed to build image object");
1742 }
1743
1744 /**
1745 * @tc.name: CreateImageObjHelper003
1746 * @tc.desc: Test CreateImageObjHelper
1747 * @tc.type: FUNC
1748 */
1749 HWTEST_F(ImageProviderTestNg, CreateImageObjHelper003, TestSize.Level1)
1750 {
1751 auto imageProvider = AceType::MakeRefPtr<ImageProvider>();
1752 EXPECT_NE(imageProvider, nullptr);
1753
1754 auto src = ImageSourceInfo(SRC_THUMBNAIL);
1755 auto ctx = AceType::MakeRefPtr<ImageLoadingContext>(src, LoadNotifier(nullptr, nullptr, nullptr));
1756 ctx->LoadImageData();
1757 EXPECT_EQ(ctx->stateManager_->state_, ImageLoadingState::DATA_LOADING);
1758
1759 MockContainer::SetUp();
1760 auto container = MockContainer::Current();
1761
1762 auto pixmap = AceType::MakeRefPtr<MockPixelMap>();
1763 src.pixmap_ = pixmap;
1764 auto data = AceType::MakeRefPtr<PixmapData>(pixmap);
1765 EXPECT_CALL(*g_loader, LoadDecodedImageData(testing::_, testing::_, testing::_)).WillOnce(testing::Return(data));
1766
1767 ImageErrorInfo errorInfo;
1768 auto imageObject = ImageProvider::BuildImageObject(src, errorInfo, data);
1769
1770 EXPECT_CALL(*pixmap, GetWidth()).Times(1);
1771 EXPECT_CALL(*pixmap, GetHeight()).Times(1);
1772
1773 WaitForAsyncTasks();
1774
1775 EXPECT_EQ(ctx->errorMsg_, "");
1776 }
1777
1778 /**
1779 * @tc.name: ImageProviderFailCallback001
1780 * @tc.desc: Test ImageProvider FailCallback
1781 * @tc.type: FUNC
1782 */
1783 HWTEST_F(ImageProviderTestNg, ImageProviderFailCallback001, TestSize.Level1)
1784 {
1785 auto src = ImageSourceInfo();
1786 // Create multiple ImageLoadingContext instances associated with the same ImageSourceInfo.
1787 // The LoadNotifier parameters are set to nullptr, meaning no callback is registered.
1788 auto ctx1 = AceType::MakeRefPtr<ImageLoadingContext>(src, LoadNotifier(nullptr, nullptr, nullptr), true);
1789 EXPECT_NE(ctx1, nullptr);
1790
1791 auto ctx2 = AceType::MakeRefPtr<ImageLoadingContext>(src, LoadNotifier(nullptr, nullptr, nullptr), true);
1792 EXPECT_NE(ctx2, nullptr);
1793
1794 auto ctx3 = AceType::MakeRefPtr<ImageLoadingContext>(src, LoadNotifier(nullptr, nullptr, nullptr), true);
1795 EXPECT_NE(ctx3, nullptr);
1796
1797 // Register weak references of these ImageLoadingContext instances in ImageProvider's task management.
1798 ImageProvider::RegisterTask(src.GetKey(), WeakPtr(ctx1));
1799 ImageProvider::RegisterTask(src.GetKey(), WeakPtr(ctx2));
1800 ImageProvider::RegisterTask(src.GetKey(), WeakPtr(ctx3));
1801
1802 ctx2 = nullptr;
1803
1804 // Define the error message.
1805 auto errorMsg = "error";
1806 // Define the error information.
1807 ImageErrorInfo errorInfo;
1808
1809 // Invoke FailCallback to trigger the failure callback.
1810 // Expected behavior: ctx1 and ctx3 should update their error messages.
1811 ImageProvider::FailCallback(src.GetKey(), errorMsg, errorInfo, true);
1812
1813 // Verify that ctx1 and ctx3 have correctly received the error message.
1814 EXPECT_EQ(ctx1->errorMsg_, errorMsg);
1815 EXPECT_EQ(ctx2, nullptr);
1816 EXPECT_EQ(ctx3->errorMsg_, errorMsg);
1817 }
1818
1819 /**
1820 * @tc.name: ImageProviderFailCallback002
1821 * @tc.desc: Test ImageProvider FailCallback
1822 * @tc.type: FUNC
1823 */
1824 HWTEST_F(ImageProviderTestNg, ImageProviderFailCallback002, TestSize.Level1)
1825 {
1826 auto src = ImageSourceInfo();
1827 // Create multiple ImageLoadingContext instances associated with the same ImageSourceInfo.
1828 // The LoadNotifier parameters are set to nullptr, meaning no callback is registered.
1829 auto ctx1 = AceType::MakeRefPtr<ImageLoadingContext>(src, LoadNotifier(nullptr, nullptr, nullptr), true);
1830 EXPECT_NE(ctx1, nullptr);
1831
1832 auto ctx2 = AceType::MakeRefPtr<ImageLoadingContext>(src, LoadNotifier(nullptr, nullptr, nullptr), true);
1833 EXPECT_NE(ctx2, nullptr);
1834
1835 auto ctx3 = AceType::MakeRefPtr<ImageLoadingContext>(src, LoadNotifier(nullptr, nullptr, nullptr), true);
1836 EXPECT_NE(ctx3, nullptr);
1837
1838 auto ctx4 = AceType::MakeRefPtr<ImageLoadingContext>(src, LoadNotifier(nullptr, nullptr, nullptr), true);
1839 EXPECT_NE(ctx3, nullptr);
1840
1841 // Register weak references of these ImageLoadingContext instances in ImageProvider's task management.
1842 ImageProvider::RegisterTask(src.GetKey(), WeakPtr(ctx1));
1843 ImageProvider::RegisterTask(src.GetKey(), WeakPtr(ctx2));
1844 ImageProvider::RegisterTask(src.GetKey(), WeakPtr(ctx3));
1845 ImageProvider::RegisterTask(src.GetKey(), WeakPtr(ctx4));
1846
1847 ctx2 = nullptr;
1848 ctx3 = nullptr;
1849
1850 // Define the error message.
1851 auto errorMsg = "error";
1852 // Define the error information.
1853 ImageErrorInfo errorInfo;
1854
1855 // Invoke FailCallback to trigger the failure callback.
1856 // Expected behavior: ctx1 and ctx3 should update their error messages.
1857 ImageProvider::FailCallback(src.GetKey(), errorMsg, errorInfo, true);
1858
1859 // Verify that ctx1 and ctx4 have correctly received the error message.
1860 EXPECT_EQ(ctx1->errorMsg_, errorMsg);
1861 EXPECT_EQ(ctx2, nullptr);
1862 EXPECT_EQ(ctx3, nullptr);
1863 EXPECT_EQ(ctx4->errorMsg_, errorMsg);
1864 }
1865
1866 /**
1867 * @tc.name: ImageProviderFailCallback003
1868 * @tc.desc: Test ImageProvider FailCallback
1869 * @tc.type: FUNC
1870 */
1871 HWTEST_F(ImageProviderTestNg, ImageProviderFailCallback003, TestSize.Level1)
1872 {
1873 auto src = ImageSourceInfo();
1874 // Create multiple ImageLoadingContext instances associated with the same ImageSourceInfo.
1875 // The LoadNotifier parameters are set to nullptr, meaning no callback is registered.
1876 auto ctx1 = AceType::MakeRefPtr<ImageLoadingContext>(src, LoadNotifier(nullptr, nullptr, nullptr), true);
1877 EXPECT_NE(ctx1, nullptr);
1878
1879 auto ctx2 = AceType::MakeRefPtr<ImageLoadingContext>(src, LoadNotifier(nullptr, nullptr, nullptr), true);
1880 EXPECT_NE(ctx2, nullptr);
1881
1882 auto ctx3 = AceType::MakeRefPtr<ImageLoadingContext>(src, LoadNotifier(nullptr, nullptr, nullptr), true);
1883 EXPECT_NE(ctx3, nullptr);
1884
1885 auto ctx4 = AceType::MakeRefPtr<ImageLoadingContext>(src, LoadNotifier(nullptr, nullptr, nullptr), true);
1886 EXPECT_NE(ctx3, nullptr);
1887
1888 // Register weak references of these ImageLoadingContext instances in ImageProvider's task management.
1889 ImageProvider::RegisterTask(src.GetKey(), WeakPtr(ctx1));
1890 ImageProvider::RegisterTask(src.GetKey(), WeakPtr(ctx2));
1891 ImageProvider::RegisterTask(src.GetKey(), WeakPtr(ctx3));
1892 ImageProvider::RegisterTask(src.GetKey(), WeakPtr(ctx4));
1893
1894 // Define the error message.
1895 auto errorMsg = "error";
1896 ImageErrorInfo errorInfo;
1897
1898 // Invoke FailCallback to trigger the failure callback.
1899 // Expected behavior: all ctx should update their error messages.
1900 ImageProvider::FailCallback(src.GetKey(), errorMsg, errorInfo, true);
1901
1902 // Verify that all ctx have correctly received the error message.
1903 EXPECT_EQ(ctx1->errorMsg_, errorMsg);
1904 EXPECT_EQ(ctx2->errorMsg_, errorMsg);
1905 EXPECT_EQ(ctx3->errorMsg_, errorMsg);
1906 EXPECT_EQ(ctx4->errorMsg_, errorMsg);
1907 }
1908
1909 /**
1910 * @tc.name: ImageProviderCancelTask001
1911 * @tc.desc: Test ImageProvider::CancelTask with multiple contexts; only one is removed
1912 * @tc.type: FUNC
1913 */
1914 HWTEST_F(ImageProviderTestNg, ImageProviderCancelTask001, TestSize.Level1)
1915 {
1916 ImageProvider::tasks_.clear();
1917 auto src = ImageSourceInfo();
1918
1919 // Create multiple ImageLoadingContext instances and register them under the same key
1920 auto ctx1 = AceType::MakeRefPtr<ImageLoadingContext>(src, LoadNotifier(nullptr, nullptr, nullptr), true);
1921 EXPECT_NE(ctx1, nullptr);
1922 auto ctx2 = AceType::MakeRefPtr<ImageLoadingContext>(src, LoadNotifier(nullptr, nullptr, nullptr), true);
1923 EXPECT_NE(ctx2, nullptr);
1924
1925 ImageProvider::RegisterTask(src.GetKey(), WeakPtr(ctx1));
1926 ImageProvider::RegisterTask(src.GetKey(), WeakPtr(ctx2));
1927
1928 // CancelTask for ctx1 should return false since ctx2 is still waiting
1929 bool result1 = ImageProvider::CancelTask(src.GetKey(), WeakPtr(ctx1));
1930 EXPECT_FALSE(result1);
1931
1932 // CancelTask for ctx2 should return true as it's the last context
1933 bool result2 = ImageProvider::CancelTask(src.GetKey(), WeakPtr(ctx2));
1934 EXPECT_TRUE(result2);
1935 }
1936
1937 /**
1938 * @tc.name: StaticImageDecoder001
1939 * @tc.desc: Test MakeCanvasImage
1940 * @tc.type: FUNC
1941 */
1942 HWTEST_F(ImageProviderTestNg, StaticImageDecoder001, TestSize.Level1)
1943 {
1944 auto src = ImageSourceInfo(SRC_THUMBNAIL);
1945 auto ctx = AceType::MakeRefPtr<ImageLoadingContext>(src, LoadNotifier(nullptr, nullptr, nullptr), true);
1946 EXPECT_NE(ctx, nullptr);
1947
1948 SizeF size(LENGTH_100, LENGTH_100);
1949 auto pixmap = AceType::MakeRefPtr<MockPixelMap>();
1950 auto pixmapObj = AceType::MakeRefPtr<PixelMapImageObject>(pixmap, src, size);
1951 EXPECT_NE(pixmapObj, nullptr);
1952
1953 pixmapObj->MakeCanvasImage(ctx, size, true, true);
1954 EXPECT_NE(ctx->canvasImage_, nullptr);
1955
1956 pixmapObj = AceType::MakeRefPtr<PixelMapImageObject>(pixmap, src, size);
1957 EXPECT_NE(pixmapObj, nullptr);
1958
1959 pixmapObj->MakeCanvasImage(ctx, size, true, false);
1960 EXPECT_NE(ctx->canvasImage_, nullptr);
1961
1962 pixmapObj->MakeCanvasImage(ctx, size, true, false);
1963 EXPECT_NE(ctx->canvasImage_, nullptr);
1964 }
1965
1966 /**
1967 * @tc.name: ImageProviderCancelTask002
1968 * @tc.desc: Test ImageProvider::CancelTask when context is not registered
1969 * @tc.type: FUNC
1970 */
1971 HWTEST_F(ImageProviderTestNg, ImageProviderCancelTask002, TestSize.Level1)
1972 {
1973 ImageProvider::tasks_.clear();
1974 auto src = ImageSourceInfo();
1975
1976 // Register one context
1977 auto ctx1 = AceType::MakeRefPtr<ImageLoadingContext>(src, LoadNotifier(nullptr, nullptr, nullptr), true);
1978 EXPECT_NE(ctx1, nullptr);
1979 ImageProvider::RegisterTask(src.GetKey(), WeakPtr(ctx1));
1980
1981 // Create a context that is not registered
1982 auto ctxNotRegistered =
1983 AceType::MakeRefPtr<ImageLoadingContext>(src, LoadNotifier(nullptr, nullptr, nullptr), true);
1984 EXPECT_NE(ctxNotRegistered, nullptr);
1985
1986 // Attempting to cancel an unregistered context should return false
1987 bool result = ImageProvider::CancelTask(src.GetKey(), WeakPtr(ctxNotRegistered));
1988 EXPECT_FALSE(result);
1989 }
1990
1991 /**
1992 * @tc.name: ImageProviderCancelTask003
1993 * @tc.desc: Test ImageProvider::CancelTask when key does not exist
1994 * @tc.type: FUNC
1995 */
1996 HWTEST_F(ImageProviderTestNg, ImageProviderCancelTask003, TestSize.Level1)
1997 {
1998 ImageProvider::tasks_.clear();
1999 auto src = ImageSourceInfo();
2000
2001 // Create a context but do not register it
2002 auto ctx = AceType::MakeRefPtr<ImageLoadingContext>(src, LoadNotifier(nullptr, nullptr, nullptr), true);
2003 EXPECT_NE(ctx, nullptr);
2004
2005 // Attempting to cancel with a non-existent key should return false
2006 bool result = ImageProvider::CancelTask("non_exist_key", WeakPtr(ctx));
2007 EXPECT_FALSE(result);
2008 }
2009
2010 /**
2011 * @tc.name: ImageProviderCancelTask004
2012 * @tc.desc: Test ImageProvider::CancelTask when only one context is registered
2013 * @tc.type: FUNC
2014 */
2015 HWTEST_F(ImageProviderTestNg, ImageProviderCancelTask004, TestSize.Level1)
2016 {
2017 ImageProvider::tasks_.clear();
2018 auto src = ImageSourceInfo();
2019
2020 // Register a single context
2021 auto ctx = AceType::MakeRefPtr<ImageLoadingContext>(src, LoadNotifier(nullptr, nullptr, nullptr), true);
2022 EXPECT_NE(ctx, nullptr);
2023 ImageProvider::RegisterTask(src.GetKey(), WeakPtr(ctx));
2024
2025 // CancelTask should return true and remove the entire task
2026 bool result = ImageProvider::CancelTask(src.GetKey(), WeakPtr(ctx));
2027 EXPECT_TRUE(result);
2028 }
2029
2030 /**
2031 * @tc.name: ImageProviderTestNg_EndTaskKeyCorrectness
2032 * @tc.desc: Verify that ImageProvider uses GetTaskKey() for registering and ending tasks.
2033 * @tc.type: FUNC
2034 */
2035 HWTEST_F(ImageProviderTestNg, ImageProviderTestNg_EndTaskKeyCorrectness, TestSize.Level1)
2036 {
2037 // Expect LoadImageData to be called only once, since repeated tasks should be merged.
2038 EXPECT_CALL(*g_loader, LoadImageData).Times(1);
2039
2040 auto src = ImageSourceInfo(SRC_JPG);
2041
2042 // Step 1: Create multiple ImageLoadingContext instances with the same image source.
2043 std::vector<RefPtr<ImageLoadingContext>> contexts(10);
2044 for (auto& ctx : contexts) {
2045 ctx = AceType::MakeRefPtr<ImageLoadingContext>(src, LoadNotifier(nullptr, nullptr, nullptr), false);
2046 ctx->LoadImageData(); // Triggers CreateImageObject and registers task.
2047 }
2048
2049 // Step 2: Verify that task was registered using the correct key and merged properly.
2050 {
2051 if (!ImageProvider::taskMtx_.try_lock_for(std::chrono::milliseconds(MAX_WAITING_TIME_FOR_TASKS))) {
2052 EXPECT_TRUE(false) << "Failed to acquire mutex.";
2053 return;
2054 }
2055 std::scoped_lock lock(std::adopt_lock, ImageProvider::taskMtx_);
2056
2057 // Use GetTaskKey() instead of GetKey() to check the task map.
2058 auto taskKey = src.GetTaskKey();
2059 auto it = ImageProvider::tasks_.find(taskKey);
2060 EXPECT_NE(it, ImageProvider::tasks_.end()); // Task should exist.
2061 EXPECT_EQ(it->second.ctxs_.size(), (size_t)10); // All contexts should be merged under the same task.
2062 auto errorKey = "non_exist_key";
2063 auto tmpIt = ImageProvider::tasks_.find(errorKey);
2064 EXPECT_EQ(tmpIt, ImageProvider::tasks_.end()); // errorTask shouldn't exist.
2065 }
2066
2067 // Step 3: Wait for the background loading task to finish, which will trigger EndTask().
2068 WaitForAsyncTasks();
2069
2070 // Step 4: Check that the task has been properly removed from the map after completion.
2071 {
2072 if (!ImageProvider::taskMtx_.try_lock_for(std::chrono::milliseconds(MAX_WAITING_TIME_FOR_TASKS))) {
2073 EXPECT_TRUE(false) << "Failed to acquire mutex after WaitForAsyncTasks.";
2074 return;
2075 }
2076 std::scoped_lock lock(std::adopt_lock, ImageProvider::taskMtx_);
2077 EXPECT_EQ(ImageProvider::tasks_.size(), (size_t)0); // The task map should be empty after cleanup.
2078 }
2079 }
2080
2081 /**
2082 * @tc.name: StaticImageMakeCanvasImage001
2083 * @tc.desc: Test MakeCanvasImage
2084 * @tc.type: FUNC
2085 */
2086 HWTEST_F(ImageProviderTestNg, StaticImageMakeCanvasImage001, TestSize.Level1)
2087 {
2088 auto src = ImageSourceInfo(SRC_THUMBNAIL);
2089 auto ctx = AceType::MakeRefPtr<ImageLoadingContext>(src, LoadNotifier(nullptr, nullptr, nullptr), true);
2090 EXPECT_NE(ctx, nullptr);
2091
2092 SizeF size(LENGTH_100, LENGTH_100);
2093 auto pixmap = AceType::MakeRefPtr<MockPixelMap>();
2094 auto pixmapObj = AceType::MakeRefPtr<PixelMapImageObject>(pixmap, src, size);
2095 EXPECT_NE(pixmapObj, nullptr);
2096
2097 pixmapObj->MakeCanvasImage(ctx, size, true, true);
2098 EXPECT_NE(ctx->canvasImage_, nullptr);
2099
2100 pixmapObj = AceType::MakeRefPtr<PixelMapImageObject>(pixmap, src, size);
2101 EXPECT_NE(pixmapObj, nullptr);
2102
2103 pixmapObj->MakeCanvasImage(ctx, size, true, false);
2104 EXPECT_NE(ctx->canvasImage_, nullptr);
2105
2106 pixmapObj->MakeCanvasImage(ctx, size, true, false);
2107 EXPECT_NE(ctx->canvasImage_, nullptr);
2108 }
2109
2110 /**
2111 * @tc.name: ImageFileSizeTest001
2112 * @tc.desc: Test ImageFileSize
2113 * @tc.type: FUNC
2114 */
2115 HWTEST_F(ImageProviderTestNg, ImageFileSizeTest001, TestSize.Level1)
2116 {
2117 auto src = ImageSourceInfo(SRC_JPG);
2118 auto ctx = AceType::MakeRefPtr<ImageLoadingContext>(src, LoadNotifier(nullptr, nullptr, nullptr), true);
2119 EXPECT_EQ(ctx->stateManager_->GetCurrentState(), ImageLoadingState::UNLOADED);
2120 auto size = ctx->GetImageSize();
2121 EXPECT_EQ(size, SizeF(-1, -1));
2122
2123 ctx->imageObj_ =
2124 AceType::MakeRefPtr<NG::StaticImageObject>(ImageSourceInfo(SRC_JPG), SizeF(LENGTH_128, LENGTH_128), nullptr);
2125 size = ctx->GetImageSize();
2126 EXPECT_EQ(size, SizeF(LENGTH_128, LENGTH_128));
2127 auto imageObj = ctx->imageObj_;
2128 EXPECT_NE(imageObj, nullptr);
2129 imageObj->SetImageFileSize(100);
2130 EXPECT_EQ(imageObj->GetImageFileSize(), 100);
2131 EXPECT_EQ(imageObj->GetImageDataSize(), 0);
2132 }
2133 } // namespace OHOS::Ace::NG
2134