1 /*
2 * Copyright (c) 2022-2025 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 #include "nweb_config_helper.h"
26 #include "extractor.h"
27 #include "system_properties_adapter_impl.h"
28 #undef private
29 #include "parameters.h"
30 #include "zip_file_reader.h"
31
32 using namespace testing;
33 using namespace testing::ext;
34 using namespace OHOS::AbilityBase;
35 using namespace OHOS::AbilityRuntime;
36
37 namespace OHOS {
38 namespace {
39 constexpr uint32_t MODULE_NAME_SIZE = 32;
40 const std::string NWEB_HAP_PATH = "/system/app/ArkWebCore/ArkWebCore.hap";
41 const std::string NWEB_HAP_PATH_1 = "/system/app/NWeb/NWeb.hap";
42 const std::string NWEB_HAP_PATH_MODULE_UPDATE = "/module_update/ArkWebCore/app/com.ohos.nweb/NWeb.hap";
43
44 std::shared_ptr<AbilityRuntime::ApplicationContext> g_applicationContext = nullptr;
45 }
46
47 namespace AbilityRuntime {
GetApplicationContext()48 std::shared_ptr<ApplicationContext> Context::GetApplicationContext()
49 {
50 return g_applicationContext;
51 }
52 } // namespace AbilityRuntime
53
54 namespace NWeb {
55 class OhosResourceAdapterTest : public testing::Test {
56 public:
57 static void SetUpTestCase(void);
58 static void TearDownTestCase(void);
59 void SetUp();
60 void TearDown();
61 };
62
SetUpTestCase(void)63 void OhosResourceAdapterTest::SetUpTestCase(void)
64 {}
65
TearDownTestCase(void)66 void OhosResourceAdapterTest::TearDownTestCase(void)
67 {}
68
SetUp(void)69 void OhosResourceAdapterTest::SetUp(void)
70 {}
71
TearDown(void)72 void OhosResourceAdapterTest::TearDown(void)
73 {}
74
75 class ApplicationContextMock : public ApplicationContext {
76 public:
77 MOCK_CONST_METHOD0(GetResourceManager, std::shared_ptr<Global::Resource::ResourceManager>());
78 MOCK_METHOD2(CreateModuleContext, std::shared_ptr<Context>(const std::string &, const std::string &));
79 };
80
81 class ExtractorMock : public Extractor{
82 public:
ExtractorMock()83 explicit ExtractorMock() : Extractor("web_test") {}
84 ~ExtractorMock() override = default;
SetInit(bool init)85 void SetInit(bool init)
86 {
87 initial_ = init;
88 }
89
SetStageMode(bool isStageModel)90 void SetStageMode(bool isStageModel)
91 {
92 isStageModel_ = isStageModel;
93 }
94 };
95
96 /**
97 * @tc.name: OhosResourceAdapterTest_Init_001
98 * @tc.desc: Init.
99 * @tc.type: FUNC
100 * @tc.require:
101 */
102 HWTEST_F(OhosResourceAdapterTest, OhosResourceAdapterTest_Init_001, TestSize.Level1)
103 {
104 std::string hapPath = "/system/app/com.ohos.nweb/NWeb.hap";
105 auto adapterImpl = std::make_shared<OhosResourceAdapterImpl>(hapPath);
106 EXPECT_NE(adapterImpl, nullptr);
107 hapPath.clear();
108 adapterImpl->Init(hapPath);
109 }
110
111 /**
112 * @tc.name: OhosResourceAdapterTest_GetRawFileData_002
113 * @tc.desc: GetRawFileData.
114 * @tc.type: FUNC
115 * @tc.require:
116 */
117 HWTEST_F(OhosResourceAdapterTest, OhosResourceAdapterTest_GetRawFileData_002, TestSize.Level1)
118 {
119 std::string hapPath = "/system/app/com.ohos.nweb/NWeb.hap";
120 OhosResourceAdapterImpl adapterImpl(hapPath);
121 std::unique_ptr<uint8_t[]> dest;
122 std::string rawFile = "test_web";
123 size_t len = rawFile.size();
124 uint8_t* data;
125 bool result = adapterImpl.GetRawFileData(rawFile, len, &data, true);
126 EXPECT_FALSE(result);
127 std::shared_ptr<Extractor> extractor = std::make_shared<Extractor>(rawFile);
128 result = adapterImpl.GetRawFileData(extractor, rawFile, len, dest);
129 EXPECT_FALSE(result);
130 result = adapterImpl.GetRawFileData(nullptr, rawFile, len, dest);
131 EXPECT_FALSE(result);
132 auto mock = std::make_shared<ExtractorMock>();
133 mock->SetStageMode(false);
134 adapterImpl.GetRawFileData(mock, rawFile, len, dest);
135 std::shared_ptr<OhosFileMapper> fileMapper = adapterImpl.GetRawFileMapper(rawFile, true);
136 EXPECT_EQ(fileMapper, nullptr);
137 result = adapterImpl.IsRawFileExist(rawFile, true);
138 EXPECT_FALSE(result);
139 uint16_t date;
140 uint16_t time;
141 result = adapterImpl.GetRawFileLastModTime(rawFile, date, time, true);
142 EXPECT_FALSE(result);
143 result = adapterImpl.GetRawFileLastModTime(rawFile, date, time, false);
144 EXPECT_FALSE(result);
145 time_t times;
146 result = adapterImpl.GetRawFileLastModTime(rawFile, times, true);
147 EXPECT_FALSE(result);
148 result = adapterImpl.GetRawFileLastModTime(rawFile, times, false);
149 EXPECT_FALSE(result);
150 result = adapterImpl.HasEntry(extractor, rawFile);
151 EXPECT_FALSE(result);
152 result = adapterImpl.HasEntry(nullptr, rawFile);
153 EXPECT_FALSE(result);
154 std::shared_ptr<OhosFileMapper> mapper = adapterImpl.GetRawFileMapper(nullptr, rawFile);
155 EXPECT_EQ(mapper, nullptr);
156 mapper = adapterImpl.GetRawFileMapper(extractor, rawFile);
157 EXPECT_EQ(mapper, nullptr);
158 adapterImpl.sysExtractor_.reset();
159 result = adapterImpl.GetRawFileLastModTime(rawFile, date, time, true);
160 EXPECT_FALSE(result);
161 result = adapterImpl.GetRawFileLastModTime(rawFile, times, true);
162 EXPECT_FALSE(result);
163 }
164
165 /**
166 * @tc.name: OhosResourceAdapterTest_OhosFileMapperImpl_003
167 * @tc.desc: OhosFileMapperImpl.
168 * @tc.type: FUNC
169 * @tc.require:
170 */
171 HWTEST_F(OhosResourceAdapterTest, OhosResourceAdapterTest_OhosFileMapperImpl_003, TestSize.Level1)
172 {
173 std::string hapPath = "";
174 if (access(NWEB_HAP_PATH.c_str(), F_OK) == 0) {
175 hapPath = NWEB_HAP_PATH;
176 }
177 if (access(NWEB_HAP_PATH_1.c_str(), F_OK) == 0) {
178 hapPath = NWEB_HAP_PATH_1;
179 }
180
181 if (access(NWEB_HAP_PATH_MODULE_UPDATE.c_str(), F_OK) == 0) {
182 hapPath = NWEB_HAP_PATH_MODULE_UPDATE;
183 }
184
185 std::shared_ptr<Extractor> extractor = std::make_shared<Extractor>(hapPath);
186 EXPECT_NE(extractor, nullptr);
187 std::shared_ptr<OHOS::AbilityBase::ZipFileReader> fileReader =
188 OHOS::AbilityBase::ZipFileReader::CreateZipFileReader(hapPath);
189 EXPECT_EQ(fileReader, nullptr);
190 std::unique_ptr<OHOS::AbilityBase::FileMapper> fileMap = std::make_unique<OHOS::AbilityBase::FileMapper>();
191 EXPECT_NE(fileMap, nullptr);
192 fileMap->CreateFileMapper(fileReader, hapPath, 0, hapPath.size(), true);
193 OhosFileMapperImpl apperImpl(std::move(fileMap), extractor);
194 int32_t result = apperImpl.GetFd();
195 EXPECT_EQ(result, -1);
196 result = apperImpl.GetOffset();
197 EXPECT_NE(result, -1);
198 std::string fileNmae = apperImpl.GetFileName();
199 EXPECT_EQ(fileNmae, "");
200 bool isCompressed = apperImpl.IsCompressed();
201 EXPECT_FALSE(isCompressed);
202 void* data = apperImpl.GetDataPtr();
203 EXPECT_EQ(data, nullptr);
204 size_t dataLen = apperImpl.GetDataLen();
205 EXPECT_EQ(dataLen, 0);
206 uint8_t* dest;
207 isCompressed = apperImpl.UnzipData(&dest, dataLen);
208 EXPECT_FALSE(isCompressed);
209 apperImpl.extractor_.reset();
210 isCompressed = apperImpl.UnzipData(&dest, dataLen);
211 EXPECT_FALSE(isCompressed);
212 }
213
214 /**
215 * @tc.name: OhosResourceAdapterTest_OhosFileMapperImpl_004
216 * @tc.desc: OhosFileMapperImpl.
217 * @tc.type: FUNC
218 * @tc.require:
219 */
220 HWTEST_F(OhosResourceAdapterTest, OhosResourceAdapterTest_OhosFileMapperImpl_004, TestSize.Level1)
221 {
222 std::string hapPath = "/system/app/com.ohos.nweb/NWeb.hap";
223 OhosResourceAdapterImpl adapterImpl(hapPath);
224 SystemPropertiesAdapterImpl& propImpl = SystemPropertiesAdapterImpl::GetInstance();
225 bool optimode = propImpl.GetWebOptimizationValue();
226 if (optimode) {
227 OHOS::system::SetParameter("web.optimization", "false");
228 }
229 std::string rawFile = "test_web";
230 std::shared_ptr<Extractor> extractor = std::make_shared<Extractor>(rawFile);
231 std::shared_ptr<OhosFileMapper> mapper = adapterImpl.GetRawFileMapper(extractor, rawFile);
232 EXPECT_EQ(mapper, nullptr);
233 if (optimode) {
234 OHOS::system::SetParameter("web.optimization", "true");
235 }
236 }
237
238 /**
239 * @tc.name: OhosResourceAdapterTest_ParseModuleName_004
240 * @tc.desc: Init.
241 * @tc.type: FUNC
242 * @tc.require:
243 */
244 HWTEST_F(OhosResourceAdapterTest, OhosResourceAdapterTest_ParseModuleName_004, TestSize.Level1)
245 {
246 std::string hapPath = "";
247 if (access(NWEB_HAP_PATH.c_str(), F_OK) == 0) {
248 hapPath = NWEB_HAP_PATH;
249 }
250 if (access(NWEB_HAP_PATH_1.c_str(), F_OK) == 0) {
251 hapPath = NWEB_HAP_PATH_1;
252 }
253 if (access(NWEB_HAP_PATH_MODULE_UPDATE.c_str(), F_OK) == 0) {
254 hapPath = NWEB_HAP_PATH_MODULE_UPDATE;
255 }
256 OhosResourceAdapterImpl adapterImpl(hapPath);
257 bool newCreate = false;
258 std::shared_ptr<Extractor> extractor = ExtractorUtil::GetExtractor(hapPath, newCreate);
259 EXPECT_EQ(extractor, nullptr);
260 std::string result = adapterImpl.GetModuleName(nullptr, 0);
261 EXPECT_EQ(result, "");
262 char *configStr = static_cast<char*>(malloc(MODULE_NAME_SIZE));
263 EXPECT_NE(configStr, nullptr);
264 (void)memset_s(configStr, MODULE_NAME_SIZE, 0, MODULE_NAME_SIZE);
265 result = adapterImpl.GetModuleName(configStr, MODULE_NAME_SIZE);
266 EXPECT_EQ(result, "");
267 if (memcpy_s(configStr, MODULE_NAME_SIZE, "\"moduleName\"", sizeof("\"moduleName\"")) != EOK) {
268 EXPECT_FALSE(true);
269 };
270 result = adapterImpl.GetModuleName(configStr, MODULE_NAME_SIZE);
271 EXPECT_EQ(result, "");
272 uint32_t len = strlen(configStr);
273 if (memcpy_s(configStr + len, MODULE_NAME_SIZE - len, "\"", sizeof("\"")) != EOK) {
274 EXPECT_FALSE(true);
275 };
276 result = adapterImpl.GetModuleName(configStr, MODULE_NAME_SIZE);
277 EXPECT_EQ(result, "");
278 (void)memset_s(configStr, MODULE_NAME_SIZE, 0, MODULE_NAME_SIZE);
279 if (memcpy_s(configStr, MODULE_NAME_SIZE, "\"moduleName\"\"test\"", sizeof("\"moduleName\"\"test\"")) != EOK) {
280 EXPECT_FALSE(true);
281 };
282 result = adapterImpl.GetModuleName(configStr, MODULE_NAME_SIZE);
283 EXPECT_NE(result, "");
284 result = adapterImpl.ParseModuleName(extractor);
285 EXPECT_EQ(result, "");
286 result = adapterImpl.ParseModuleName(nullptr);
287 EXPECT_EQ(result, "");
288 free(configStr);
289 configStr = nullptr;
290 }
291
292 /**
293 * @tc.name: OhosResourceAdapterTest_GetResourceMgr_005
294 * @tc.desc: GetResourceMgr.
295 * @tc.type: FUNC
296 * @tc.require:
297 */
298 HWTEST_F(OhosResourceAdapterTest, OhosResourceAdapterTest_GetResourceMgr_005, TestSize.Level1)
299 {
300 std::string hapPath = "";
301 if (access(NWEB_HAP_PATH.c_str(), F_OK) == 0) {
302 hapPath = NWEB_HAP_PATH;
303 }
304 if (access(NWEB_HAP_PATH_1.c_str(), F_OK) == 0) {
305 hapPath = NWEB_HAP_PATH_1;
306 }
307 if (access(NWEB_HAP_PATH_MODULE_UPDATE.c_str(), F_OK) == 0) {
308 hapPath = NWEB_HAP_PATH_MODULE_UPDATE;
309 }
310 OhosResourceAdapterImpl adapterImpl(hapPath);
311 uint8_t* dest;
312 std::string rawFile = "test";
313 size_t len = rawFile.size();
314 bool result = adapterImpl.GetRawFileData(rawFile, len, &dest, false);
315 EXPECT_FALSE(result);
316 rawFile = "resources/rawfile/";
317 len = rawFile.size();
318 result = adapterImpl.GetRawFileData(rawFile, len, &dest, false);
319 EXPECT_FALSE(result);
320 rawFile = "resources/rawfile/bundleName";
321 len = rawFile.size();
322 result = adapterImpl.GetRawFileData(rawFile, len, &dest, false);
323 EXPECT_FALSE(result);
324 rawFile = "resources/rawfile/bundleName:";
325 len = rawFile.size();
326 result = adapterImpl.GetRawFileData(rawFile, len, &dest, false);
327 EXPECT_FALSE(result);
328 rawFile = "resources/rawfile/bundleName:test/";
329 len = rawFile.size();
330 result = adapterImpl.GetRawFileData(rawFile, len, &dest, false);
331 EXPECT_FALSE(result);
332 rawFile = "resources/rawfile/bundleName:test/moduleName:";
333 len = rawFile.size();
334 result = adapterImpl.GetRawFileData(rawFile, len, &dest, false);
335 EXPECT_FALSE(result);
336 rawFile = "resources/rawfile/bundleName:test/moduleName:web/";
337 len = rawFile.size();
338 result = adapterImpl.GetRawFileData(rawFile, len, &dest, false);
339 EXPECT_FALSE(result);
340 rawFile = "resources/rawfile/bundleName:test/moduleName:web/webtest";
341 len = rawFile.size();
342 result = adapterImpl.GetRawFileData(rawFile, len, &dest, false);
343 EXPECT_FALSE(result);
344 g_applicationContext = std::make_shared<ApplicationContextMock>();
345 result = adapterImpl.GetRawFileData(rawFile, len, &dest, false);
346 EXPECT_FALSE(result);
347 }
348
349 /**
350 * @tc.name: OhosResourceAdapterTest_GetResourceString_006
351 * @tc.desc: GetResourceString.
352 * @tc.type: FUNC
353 * @tc.require:
354 */
355 HWTEST_F(OhosResourceAdapterTest, OhosResourceAdapterTest_GetResourceString_006, TestSize.Level1)
356 {
357 std::string hapPath = "";
358 if (access(NWEB_HAP_PATH.c_str(), F_OK) == 0) {
359 hapPath = NWEB_HAP_PATH;
360 }
361 if (access(NWEB_HAP_PATH_1.c_str(), F_OK) == 0) {
362 hapPath = NWEB_HAP_PATH_1;
363 }
364 if (access(NWEB_HAP_PATH_MODULE_UPDATE.c_str(), F_OK) == 0) {
365 hapPath = NWEB_HAP_PATH_MODULE_UPDATE;
366 }
367
368 OhosResourceAdapterImpl adapterImpl(hapPath);
369 std::string res;
370
371 bool result = adapterImpl.GetResourceString("", "", 1, res);
372 EXPECT_FALSE(result);
373
374 result = adapterImpl.GetResourceString("test", "web", 1, res);
375 EXPECT_FALSE(result);
376
377 result = adapterImpl.GetResourceString("test", "web/webtest", 1, res);
378 EXPECT_FALSE(result);
379 }
380
381 /**
382 * @tc.name: OhosResourceAdapterTest_GetSystemLanguage_007
383 * @tc.desc: GetSystemLanguage.
384 * @tc.type: FUNC
385 * @tc.require:
386 */
387 HWTEST_F(OhosResourceAdapterTest, OhosResourceAdapterTest_GetSystemLanguage_007, TestSize.Level1)
388 {
389 std::string hapPath = "";
390 if (access(NWEB_HAP_PATH.c_str(), F_OK) == 0) {
391 hapPath = NWEB_HAP_PATH;
392 }
393 if (access(NWEB_HAP_PATH_1.c_str(), F_OK) == 0) {
394 hapPath = NWEB_HAP_PATH_1;
395 }
396 if (access(NWEB_HAP_PATH_MODULE_UPDATE.c_str(), F_OK) == 0) {
397 hapPath = NWEB_HAP_PATH_MODULE_UPDATE;
398 }
399
400 OhosResourceAdapterImpl adapterImpl(hapPath);
401 std::string res = adapterImpl.GetSystemLanguage();
402 EXPECT_FALSE(res.empty());
403 }
404
405 HWTEST_F(OhosResourceAdapterTest, OhosResourceAdapterTest_ConvertToSandboxPath_008, TestSize.Level1)
406 {
407 std::string hapPath = "";
408 if (access(NWEB_HAP_PATH.c_str(), F_OK) == 0) {
409 hapPath = NWEB_HAP_PATH;
410 }
411 if (access(NWEB_HAP_PATH_1.c_str(), F_OK) == 0) {
412 hapPath = NWEB_HAP_PATH_1;
413 }
414 if (access(NWEB_HAP_PATH_MODULE_UPDATE.c_str(), F_OK) == 0) {
415 hapPath = NWEB_HAP_PATH_MODULE_UPDATE;
416 }
417
418 OhosResourceAdapterImpl adapterImpl(hapPath);
419 std::string inputStr = "";
420 std::string prefixPath = "";
421 std::string res = adapterImpl.ConvertToSandboxPath(inputStr, prefixPath);
422 EXPECT_EQ(res, "");
423 inputStr = NWEB_HAP_PATH;
424 prefixPath = "/data/app/el1/bundle/public/";
425 res = adapterImpl.ConvertToSandboxPath(inputStr, prefixPath);
426 EXPECT_FALSE(res.empty());
427 inputStr = "/data/app/el1/bundle/public/system/app/com.ohos.nweb/NWeb.hap";
428 res = adapterImpl.ConvertToSandboxPath(inputStr, prefixPath);
429 EXPECT_FALSE(res.empty());
430 }
431
432 HWTEST_F(OhosResourceAdapterTest, OhosResourceAdapterTest_SetArkWebCoreHapPathOverride_009, TestSize.Level1)
433 {
434 std::string hapPath = "";
435 if (access(NWEB_HAP_PATH.c_str(), F_OK) == 0) {
436 hapPath = NWEB_HAP_PATH;
437 }
438 if (access(NWEB_HAP_PATH_1.c_str(), F_OK) == 0) {
439 hapPath = NWEB_HAP_PATH_1;
440 }
441 if (access(NWEB_HAP_PATH_MODULE_UPDATE.c_str(), F_OK) == 0) {
442 hapPath = NWEB_HAP_PATH_MODULE_UPDATE;
443 }
444
445 OhosResourceAdapterImpl adapterImpl(hapPath);
446 adapterImpl.arkWebCoreHapPathOverride_ = "";
447 std::string inputStr = "";
448 adapterImpl.SetArkWebCoreHapPathOverride("");
449 EXPECT_EQ(adapterImpl.arkWebCoreHapPathOverride_, "");
450 inputStr = NWEB_HAP_PATH;
451 adapterImpl.SetArkWebCoreHapPathOverride(inputStr);
452 EXPECT_EQ(adapterImpl.arkWebCoreHapPathOverride_, NWEB_HAP_PATH);
453 adapterImpl.arkWebCoreHapPathOverride_ = "";
454 }
455 }
456 } // namespace NWeb
457