1 /*
2 * Copyright (c) 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 <cstring>
17 #include <cstdint>
18 #include <securec.h>
19 #include <gmock/gmock.h>
20 #include <gtest/gtest.h>
21
22 #define private public
23 #include "ohos_resource_adapter_impl.h"
24 #include "application_context.h"
25 #undef private
26
27 #include "extractor.h"
28 #include "zip_file_reader.h"
29
30 using namespace testing;
31 using namespace testing::ext;
32 using namespace OHOS::AbilityBase;
33 using namespace OHOS::AbilityRuntime;
34
35 namespace OHOS {
36 namespace {
37 constexpr uint32_t MODULE_NAME_SIZE = 32;
38 const std::string NWEB_HAP_PATH = "/system/app/com.ohos.arkwebcore/ArkWebCore.hap";
39 const std::string NWEB_HAP_PATH_1 = "/system/app/NWeb/NWeb.hap";
40 const std::string NWEB_HAP_PATH_MODULE_UPDATE = "/module_update/ArkWebCore/app/com.ohos.nweb/NWeb.hap";
41
42 std::shared_ptr<AbilityRuntime::ApplicationContext> g_applicationContext = nullptr;
43 }
44
45 namespace AbilityRuntime {
GetApplicationContext()46 std::shared_ptr<ApplicationContext> Context::GetApplicationContext()
47 {
48 return g_applicationContext;
49 }
50 } // namespace AbilityRuntime
51
52 namespace NWeb {
53 class OhosResourceAdapterTest : public testing::Test {
54 public:
55 static void SetUpTestCase(void);
56 static void TearDownTestCase(void);
57 void SetUp();
58 void TearDown();
59 };
60
SetUpTestCase(void)61 void OhosResourceAdapterTest::SetUpTestCase(void)
62 {}
63
TearDownTestCase(void)64 void OhosResourceAdapterTest::TearDownTestCase(void)
65 {}
66
SetUp(void)67 void OhosResourceAdapterTest::SetUp(void)
68 {}
69
TearDown(void)70 void OhosResourceAdapterTest::TearDown(void)
71 {}
72
73 class ApplicationContextMock : public ApplicationContext {
74 public:
75 MOCK_CONST_METHOD0(GetResourceManager, std::shared_ptr<Global::Resource::ResourceManager>());
76 MOCK_METHOD2(CreateModuleContext, std::shared_ptr<Context>(const std::string &, const std::string &));
77 };
78
79 class ExtractorMock : public Extractor {
80 public:
ExtractorMock()81 explicit ExtractorMock() : Extractor("web_test") {}
82 ~ExtractorMock() override = default;
83 MOCK_METHOD0(Init, bool());
84 MOCK_METHOD0(IsStageModel, bool());
85 MOCK_METHOD3(ExtractToBufByName, bool(const std::string &, std::unique_ptr<uint8_t[]> &, size_t &));
86 };
87
88 /**
89 * @tc.name: OhosResourceAdapterTest_Init_001
90 * @tc.desc: Init.
91 * @tc.type: FUNC
92 * @tc.require:
93 */
94 HWTEST_F(OhosResourceAdapterTest, OhosResourceAdapterTest_Init_001, TestSize.Level1)
95 {
96 std::string hapPath = "/system/app/com.ohos.nweb/NWeb.hap";
97 auto adapterImpl = std::make_shared<OhosResourceAdapterImpl>(hapPath);
98 EXPECT_NE(adapterImpl, nullptr);
99 hapPath.clear();
100 adapterImpl->Init(hapPath);
101 }
102
103 /**
104 * @tc.name: OhosResourceAdapterTest_GetRawFileData_002
105 * @tc.desc: GetRawFileData.
106 * @tc.type: FUNC
107 * @tc.require:
108 */
109 HWTEST_F(OhosResourceAdapterTest, OhosResourceAdapterTest_GetRawFileData_002, TestSize.Level1)
110 {
111 std::string hapPath = "/system/app/com.ohos.nweb/NWeb.hap";
112 OhosResourceAdapterImpl adapterImpl(hapPath);
113 std::unique_ptr<uint8_t[]> dest;
114 std::string rawFile = "test_web";
115 size_t len = rawFile.size();
116 uint8_t* data;
117 bool result = adapterImpl.GetRawFileData(rawFile, len, &data, true);
118 EXPECT_FALSE(result);
119 std::shared_ptr<Extractor> extractor = std::make_shared<Extractor>(rawFile);
120 result = adapterImpl.GetRawFileData(extractor, rawFile, len, dest);
121 EXPECT_FALSE(result);
122 result = adapterImpl.GetRawFileData(nullptr, rawFile, len, dest);
123 EXPECT_FALSE(result);
124 auto mock = std::make_shared<ExtractorMock>();
125 EXPECT_CALL(*mock, IsStageModel())
126 .WillRepeatedly(::testing::Return(false));
127 adapterImpl.GetRawFileData(mock, rawFile, len, dest);
128 std::shared_ptr<OhosFileMapper> fileMapper = adapterImpl.GetRawFileMapper(rawFile, true);
129 EXPECT_EQ(fileMapper, nullptr);
130 result = adapterImpl.IsRawFileExist(rawFile, true);
131 EXPECT_FALSE(result);
132 uint16_t date;
133 uint16_t time;
134 result = adapterImpl.GetRawFileLastModTime(rawFile, date, time, true);
135 EXPECT_FALSE(result);
136 result = adapterImpl.GetRawFileLastModTime(rawFile, date, time, false);
137 EXPECT_FALSE(result);
138 time_t times;
139 result = adapterImpl.GetRawFileLastModTime(rawFile, times, true);
140 EXPECT_FALSE(result);
141 result = adapterImpl.GetRawFileLastModTime(rawFile, times, false);
142 EXPECT_FALSE(result);
143 result = adapterImpl.HasEntry(extractor, rawFile);
144 EXPECT_FALSE(result);
145 result = adapterImpl.HasEntry(nullptr, rawFile);
146 EXPECT_FALSE(result);
147 std::shared_ptr<OhosFileMapper> mapper = adapterImpl.GetRawFileMapper(nullptr, rawFile);
148 EXPECT_EQ(mapper, nullptr);
149 mapper = adapterImpl.GetRawFileMapper(extractor, rawFile);
150 EXPECT_EQ(mapper, nullptr);
151 adapterImpl.sysExtractor_.reset();
152 result = adapterImpl.GetRawFileLastModTime(rawFile, date, time, true);
153 EXPECT_FALSE(result);
154 result = adapterImpl.GetRawFileLastModTime(rawFile, times, true);
155 EXPECT_FALSE(result);
156 }
157
158 /**
159 * @tc.name: OhosResourceAdapterTest_OhosFileMapperImpl_003
160 * @tc.desc: OhosFileMapperImpl.
161 * @tc.type: FUNC
162 * @tc.require:
163 */
164 HWTEST_F(OhosResourceAdapterTest, OhosResourceAdapterTest_OhosFileMapperImpl_003, TestSize.Level1)
165 {
166 std::string hapPath = "";
167 if (access(NWEB_HAP_PATH.c_str(), F_OK) == 0) {
168 hapPath = NWEB_HAP_PATH;
169 }
170 if (access(NWEB_HAP_PATH_1.c_str(), F_OK) == 0) {
171 hapPath = NWEB_HAP_PATH_1;
172 }
173
174 if (access(NWEB_HAP_PATH_MODULE_UPDATE.c_str(), F_OK) == 0) {
175 hapPath = NWEB_HAP_PATH_MODULE_UPDATE;
176 }
177
178 std::shared_ptr<Extractor> extractor = std::make_shared<Extractor>(hapPath);
179 EXPECT_NE(extractor, nullptr);
180 std::shared_ptr<OHOS::AbilityBase::ZipFileReader> fileReader =
181 OHOS::AbilityBase::ZipFileReader::CreateZipFileReader(hapPath);
182 EXPECT_NE(fileReader, nullptr);
183 std::unique_ptr<OHOS::AbilityBase::FileMapper> fileMap = std::make_unique<OHOS::AbilityBase::FileMapper>();
184 EXPECT_NE(fileMap, nullptr);
185 fileMap->CreateFileMapper(fileReader, hapPath, 0, hapPath.size(), true);
186 OhosFileMapperImpl apperImpl(std::move(fileMap), extractor);
187 int32_t result = apperImpl.GetFd();
188 EXPECT_EQ(result, -1);
189 result = apperImpl.GetOffset();
190 EXPECT_NE(result, -1);
191 std::string fileNmae = apperImpl.GetFileName();
192 EXPECT_NE(fileNmae, "");
193 bool isCompressed = apperImpl.IsCompressed();
194 EXPECT_TRUE(isCompressed);
195 void* data = apperImpl.GetDataPtr();
196 EXPECT_NE(data, nullptr);
197 size_t dataLen = apperImpl.GetDataLen();
198 EXPECT_NE(dataLen, 0);
199 uint8_t* dest;
200 isCompressed = apperImpl.UnzipData(&dest, dataLen);
201 EXPECT_FALSE(isCompressed);
202 apperImpl.extractor_.reset();
203 isCompressed = apperImpl.UnzipData(&dest, dataLen);
204 EXPECT_FALSE(isCompressed);
205 }
206
207 /**
208 * @tc.name: OhosResourceAdapterTest_ParseModuleName_004
209 * @tc.desc: Init.
210 * @tc.type: FUNC
211 * @tc.require:
212 */
213 HWTEST_F(OhosResourceAdapterTest, OhosResourceAdapterTest_ParseModuleName_004, TestSize.Level1)
214 {
215 std::string hapPath = "";
216 if (access(NWEB_HAP_PATH.c_str(), F_OK) == 0) {
217 hapPath = NWEB_HAP_PATH;
218 }
219 if (access(NWEB_HAP_PATH_1.c_str(), F_OK) == 0) {
220 hapPath = NWEB_HAP_PATH_1;
221 }
222 if (access(NWEB_HAP_PATH_MODULE_UPDATE.c_str(), F_OK) == 0) {
223 hapPath = NWEB_HAP_PATH_MODULE_UPDATE;
224 }
225 OhosResourceAdapterImpl adapterImpl(hapPath);
226 bool newCreate = false;
227 std::shared_ptr<Extractor> extractor = ExtractorUtil::GetExtractor(hapPath, newCreate);
228 EXPECT_NE(extractor, nullptr);
229 std::string result = adapterImpl.GetModuleName(nullptr, 0);
230 EXPECT_EQ(result, "");
231 char *configStr = static_cast<char*>(malloc(MODULE_NAME_SIZE));
232 EXPECT_NE(configStr, nullptr);
233 (void)memset_s(configStr, MODULE_NAME_SIZE, 0, MODULE_NAME_SIZE);
234 result = adapterImpl.GetModuleName(configStr, MODULE_NAME_SIZE);
235 EXPECT_EQ(result, "");
236 if (memcpy_s(configStr, MODULE_NAME_SIZE, "\"moduleName\"", sizeof("\"moduleName\"")) != EOK) {
237 EXPECT_FALSE(true);
238 };
239 result = adapterImpl.GetModuleName(configStr, MODULE_NAME_SIZE);
240 EXPECT_EQ(result, "");
241 uint32_t len = strlen(configStr);
242 if (memcpy_s(configStr + len, MODULE_NAME_SIZE - len, "\"", sizeof("\"")) != EOK) {
243 EXPECT_FALSE(true);
244 };
245 result = adapterImpl.GetModuleName(configStr, MODULE_NAME_SIZE);
246 EXPECT_EQ(result, "");
247 (void)memset_s(configStr, MODULE_NAME_SIZE, 0, MODULE_NAME_SIZE);
248 if (memcpy_s(configStr, MODULE_NAME_SIZE, "\"moduleName\"\"test\"", sizeof("\"moduleName\"\"test\"")) != EOK) {
249 EXPECT_FALSE(true);
250 };
251 result = adapterImpl.GetModuleName(configStr, MODULE_NAME_SIZE);
252 EXPECT_NE(result, "");
253 result = adapterImpl.ParseModuleName(extractor);
254 EXPECT_EQ(result, "");
255 result = adapterImpl.ParseModuleName(nullptr);
256 EXPECT_EQ(result, "");
257 free(configStr);
258 configStr = nullptr;
259 auto mock = std::make_shared<ExtractorMock>();
260 EXPECT_CALL(*mock, ExtractToBufByName(::testing::_, ::testing::_, ::testing::_))
261 .WillRepeatedly(::testing::Return(true));
262 adapterImpl.ParseModuleName(mock);
263 }
264
265 /**
266 * @tc.name: OhosResourceAdapterTest_GetResourceMgr_005
267 * @tc.desc: GetResourceMgr.
268 * @tc.type: FUNC
269 * @tc.require:
270 */
271 HWTEST_F(OhosResourceAdapterTest, OhosResourceAdapterTest_GetResourceMgr_005, TestSize.Level1)
272 {
273 std::string hapPath = "";
274 if (access(NWEB_HAP_PATH.c_str(), F_OK) == 0) {
275 hapPath = NWEB_HAP_PATH;
276 }
277 if (access(NWEB_HAP_PATH_1.c_str(), F_OK) == 0) {
278 hapPath = NWEB_HAP_PATH_1;
279 }
280 if (access(NWEB_HAP_PATH_MODULE_UPDATE.c_str(), F_OK) == 0) {
281 hapPath = NWEB_HAP_PATH_MODULE_UPDATE;
282 }
283 OhosResourceAdapterImpl adapterImpl(hapPath);
284 uint8_t* dest;
285 std::string rawFile = "test";
286 size_t len = rawFile.size();
287 bool result = adapterImpl.GetRawFileData(rawFile, len, &dest, false);
288 EXPECT_FALSE(result);
289 rawFile = "resources/rawfile/";
290 len = rawFile.size();
291 result = adapterImpl.GetRawFileData(rawFile, len, &dest, false);
292 EXPECT_FALSE(result);
293 rawFile = "resources/rawfile/bundleName";
294 len = rawFile.size();
295 result = adapterImpl.GetRawFileData(rawFile, len, &dest, false);
296 EXPECT_FALSE(result);
297 rawFile = "resources/rawfile/bundleName:";
298 len = rawFile.size();
299 result = adapterImpl.GetRawFileData(rawFile, len, &dest, false);
300 EXPECT_FALSE(result);
301 rawFile = "resources/rawfile/bundleName:test/";
302 len = rawFile.size();
303 result = adapterImpl.GetRawFileData(rawFile, len, &dest, false);
304 EXPECT_FALSE(result);
305 rawFile = "resources/rawfile/bundleName:test/moduleName:";
306 len = rawFile.size();
307 result = adapterImpl.GetRawFileData(rawFile, len, &dest, false);
308 EXPECT_FALSE(result);
309 rawFile = "resources/rawfile/bundleName:test/moduleName:web/";
310 len = rawFile.size();
311 result = adapterImpl.GetRawFileData(rawFile, len, &dest, false);
312 EXPECT_FALSE(result);
313 rawFile = "resources/rawfile/bundleName:test/moduleName:web/webtest";
314 len = rawFile.size();
315 result = adapterImpl.GetRawFileData(rawFile, len, &dest, false);
316 EXPECT_FALSE(result);
317 g_applicationContext = std::make_shared<ApplicationContextMock>();
318 result = adapterImpl.GetRawFileData(rawFile, len, &dest, false);
319 EXPECT_FALSE(result);
320 }
321
322 /**
323 * @tc.name: OhosResourceAdapterTest_GetResourceString_006
324 * @tc.desc: GetResourceString.
325 * @tc.type: FUNC
326 * @tc.require:
327 */
328 HWTEST_F(OhosResourceAdapterTest, OhosResourceAdapterTest_GetResourceString_006, TestSize.Level1)
329 {
330 std::string hapPath = "";
331 if (access(NWEB_HAP_PATH.c_str(), F_OK) == 0) {
332 hapPath = NWEB_HAP_PATH;
333 }
334 if (access(NWEB_HAP_PATH_1.c_str(), F_OK) == 0) {
335 hapPath = NWEB_HAP_PATH_1;
336 }
337 if (access(NWEB_HAP_PATH_MODULE_UPDATE.c_str(), F_OK) == 0) {
338 hapPath = NWEB_HAP_PATH_MODULE_UPDATE;
339 }
340
341 OhosResourceAdapterImpl adapterImpl(hapPath);
342 std::string res;
343
344 bool result = adapterImpl.GetResourceString("", "", 1, res);
345 EXPECT_FALSE(result);
346
347 result = adapterImpl.GetResourceString("test", "web", 1, res);
348 EXPECT_FALSE(result);
349
350 result = adapterImpl.GetResourceString("test", "web/webtest", 1, res);
351 EXPECT_FALSE(result);
352 }
353 }
354 } // namespace NWeb
355