1 /*
2  * Copyright (c) 2020-2022 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 "imgdecode/image_load.h"
17 
18 #include "gfx_utils/file.h"
19 #include "gfx_utils/mem_api.h"
20 #include "test_resource_config.h"
21 
22 #include <climits>
23 #include <gtest/gtest.h>
24 
25 using namespace testing::ext;
26 
27 namespace {
28 constexpr uint8_t MAX_FILE_NUM = 2;
29 }
30 
31 namespace OHOS {
32 class ImageTest : public testing::Test {
33 public:
34     static void SetUpTestCase();
35     static void TearDownTestCase();
36 
37     static void ResetFds();
38     static void InitImageInfo(ImageInfo& info);
39 
40     static int32_t imgResFds_[MAX_FILE_NUM];
41     static ImageInfo imgInfos_[MAX_FILE_NUM];
42     static uint32_t sizes_[MAX_FILE_NUM];
43 };
44 
45 int32_t ImageTest::imgResFds_[MAX_FILE_NUM];
46 ImageInfo ImageTest::imgInfos_[MAX_FILE_NUM];
47 uint32_t ImageTest::sizes_[MAX_FILE_NUM];
48 
SetUpTestCase()49 void ImageTest::SetUpTestCase()
50 {
51     const char* paths[] = {
52         IMAGE_DIR "A001_001.bin",
53         IMAGE_DIR "A001_002.bin"
54     };
55     for (int i = 0; i < MAX_FILE_NUM; i++) {
56         imgResFds_[i] = open(paths[i], O_RDONLY);
57         struct stat fileStat;
58         fstat(imgResFds_[i], &fileStat);
59         sizes_[i] = fileStat.st_size - sizeof(ImageHeader);
60         read(imgResFds_[i], &imgInfos_[i].header, sizeof(ImageHeader));
61     }
62 }
63 
TearDownTestCase()64 void ImageTest::TearDownTestCase()
65 {
66     for (int i = 0; i < MAX_FILE_NUM; i++) {
67         close(imgResFds_[i]);
68     }
69 }
70 
ResetFds()71 void ImageTest::ResetFds()
72 {
73     for (int i = 0; i < MAX_FILE_NUM; i++) {
74         lseek(imgResFds_[i], sizeof(ImageHeader), SEEK_SET);
75     }
76 }
77 
78 /**
79  * @tc.name: Graphic_Image_Test_GetImageInfo_001
80  * @tc.desc: Verify ImageLoad::GetImageInfo function, invalid param.
81  * @tc.type: FUNC
82  * @tc.require: AR000F74ST
83  */
84 HWTEST_F(ImageTest, Graphic_Image_Test_GetImageInfo_001, TestSize.Level0)
85 {
86     /* test invalid fd */
87     bool ret = ImageLoad::GetImageInfo(-1, sizes_[0], imgInfos_[0]);
88     EXPECT_EQ(ret, false);
89 
90     /* test invalid size */
91     ret = ImageLoad::GetImageInfo(imgResFds_[0], 0, imgInfos_[0]);
92     EXPECT_EQ(ret, false);
93 }
94 
95 /**
96  * @tc.name: Graphic_Image_Test_GetImageInfo_002
97  * @tc.desc: Verify ImageLoad::GetImageInfo function, invalid compress mode.
98  * @tc.type: FUNC
99  * @tc.require: SR000ERCR7
100  */
101 HWTEST_F(ImageTest, Graphic_Image_Test_GetImageInfo_002, TestSize.Level0)
102 {
103     ResetFds();
104 
105     auto info = imgInfos_[0];
106     info.header.compressMode = COMPRESS_MODE_BLOCK_ALG;
107     bool ret = ImageLoad::GetImageInfo(imgResFds_[0], sizes_[0], info);
108     EXPECT_EQ(ret, false);
109 }
110 
111 /**
112  * @tc.name: Graphic_Image_Test_GetImageInfo_003
113  * @tc.desc: Verify ImageLoad::GetImageInfo function, multi-images.
114  * @tc.type: FUNC
115  * @tc.require: AR000F74ST
116  */
117 HWTEST_F(ImageTest, Graphic_Image_Test_GetImageInfo_003, TestSize.Level0)
118 {
119     ResetFds();
120 
121     for (int32_t i = 0; i < MAX_FILE_NUM; i++) {
122         bool success = ImageLoad::GetImageInfo(imgResFds_[i], sizes_[i], imgInfos_[i]);
123         if (success) {
124             ImageCacheFree(imgInfos_[i]);
125         } else {
126             EXPECT_EQ(success, false);
127         }
128     }
129 }
130 } // namespace OHOS
131