1 /*
2 * Copyright (c) 2024-2024 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16 #include <gtest/gtest.h>
17
18 #include <cstring>
19 #include <sys/stat.h>
20 #include <sys/types.h>
21 #include <unistd.h>
22
23 #include "appspawn.h"
24 #include "appspawn_hook.h"
25 #include "appspawn_manager.h"
26 #include "appspawn_modulemgr.h"
27 #include "appspawn_permission.h"
28 #include "appspawn_sandbox.h"
29 #include "appspawn_utils.h"
30 #include "securec.h"
31
32 #include "app_spawn_stub.h"
33 #include "app_spawn_test_helper.h"
34
35 using namespace testing;
36 using namespace testing::ext;
37
38 namespace OHOS {
39 class AppSpawnSandboxMgrTest : public testing::Test {
40 public:
SetUpTestCase()41 static void SetUpTestCase() {}
TearDownTestCase()42 static void TearDownTestCase() {}
SetUp()43 void SetUp() {}
TearDown()44 void TearDown() {}
45 };
46
47 /**
48 * @brief AppSpawnSandboxCfg
49 *
50 */
51 HWTEST_F(AppSpawnSandboxMgrTest, App_Spawn_AppSpawnSandboxCfg_001, TestSize.Level0)
52 {
53 AppSpawnMgr *mgr = CreateAppSpawnMgr(MODE_FOR_NWEB_SPAWN);
54 EXPECT_EQ(mgr != nullptr, 1);
55
56 AppSpawnSandboxCfg *sandbox = GetAppSpawnSandbox(mgr);
57 EXPECT_EQ(sandbox == nullptr, 1);
58
59 sandbox = CreateAppSpawnSandbox();
60 EXPECT_EQ(sandbox != nullptr, 1);
61 OH_ListAddTail(&sandbox->extData.node, &mgr->extData);
62
63 sandbox = GetAppSpawnSandbox(mgr);
64 EXPECT_EQ(sandbox != nullptr, 1);
65
66 // dump
67 DumpAppSpawnSandboxCfg(sandbox);
68
69 // delete
70 DeleteAppSpawnSandbox(sandbox);
71 // get none
72 sandbox = GetAppSpawnSandbox(mgr);
73 EXPECT_EQ(sandbox == nullptr, 1);
74 DumpAppSpawnSandboxCfg(sandbox);
75
76 DeleteAppSpawnMgr(mgr);
77 sandbox = GetAppSpawnSandbox(nullptr);
78 EXPECT_EQ(sandbox == nullptr, 1);
79 }
80
81 HWTEST_F(AppSpawnSandboxMgrTest, App_Spawn_AppSpawnSandboxCfg_002, TestSize.Level0)
82 {
83 AppSpawnMgr *mgr = CreateAppSpawnMgr(MODE_FOR_NWEB_SPAWN);
84 EXPECT_EQ(mgr != nullptr, 1);
85
86 AppSpawnSandboxCfg *sandbox = CreateAppSpawnSandbox();
87 EXPECT_EQ(sandbox != nullptr, 1);
88 OH_ListAddTail(&sandbox->extData.node, &mgr->extData);
89
90 // for appspawn
91 int ret = LoadAppSandboxConfig(sandbox, MODE_FOR_APP_SPAWN);
92 EXPECT_EQ(ret, 0);
93 ret = LoadAppSandboxConfig(sandbox, MODE_FOR_APP_SPAWN); // 重复load
94 EXPECT_EQ(ret, 0);
95
96 DeleteAppSpawnSandbox(sandbox);
97 DeleteAppSpawnMgr(mgr);
98
99 ret = LoadAppSandboxConfig(nullptr, MODE_FOR_APP_SPAWN);
100 EXPECT_NE(ret, 0);
101 }
102
103 HWTEST_F(AppSpawnSandboxMgrTest, App_Spawn_AppSpawnSandboxCfg_003, TestSize.Level0)
104 {
105 AppSpawnMgr *mgr = CreateAppSpawnMgr(MODE_FOR_NWEB_SPAWN);
106 EXPECT_EQ(mgr != nullptr, 1);
107
108 AppSpawnSandboxCfg *sandbox = CreateAppSpawnSandbox();
109 EXPECT_EQ(sandbox != nullptr, 1);
110 OH_ListAddTail(&sandbox->extData.node, &mgr->extData);
111 int ret = 0;
112 #ifdef APPSPAWN_SANDBOX_NEW
113 // for nwebspawn
114 ret = LoadAppSandboxConfig(sandbox, MODE_FOR_NWEB_SPAWN);
115 EXPECT_EQ(ret, 0);
116 ret = LoadAppSandboxConfig(sandbox, MODE_FOR_NWEB_SPAWN); // 重复load
117 EXPECT_EQ(ret, 0);
118 ret = LoadAppSandboxConfig(sandbox, MODE_FOR_NWEB_SPAWN); // 重复load
119 EXPECT_EQ(ret, 0);
120 #else
121 // for nwebspawn
122 ret = LoadAppSandboxConfig(sandbox, MODE_FOR_NWEB_SPAWN);
123 EXPECT_EQ(ret, 0);
124 ret = LoadAppSandboxConfig(sandbox, MODE_FOR_NWEB_SPAWN); // 重复load
125 EXPECT_EQ(ret, 0);
126 #endif
127 DeleteAppSpawnSandbox(sandbox);
128 DeleteAppSpawnMgr(mgr);
129
130 ret = LoadAppSandboxConfig(nullptr, MODE_FOR_NWEB_SPAWN);
131 EXPECT_NE(ret, 0);
132 }
133
134 HWTEST_F(AppSpawnSandboxMgrTest, App_Spawn_SandboxSection_001, TestSize.Level0)
135 {
136 AppSpawnMgr *mgr = CreateAppSpawnMgr(MODE_FOR_NWEB_SPAWN);
137 EXPECT_EQ(mgr != nullptr, 1);
138
139 AppSpawnSandboxCfg *sandbox = CreateAppSpawnSandbox();
140 EXPECT_EQ(sandbox != nullptr, 1);
141 OH_ListAddTail(&sandbox->extData.node, &mgr->extData);
142
143 const uint32_t nameCount = 3;
144 const uint32_t lenCount = 7;
145 const char *inputName[nameCount] = {"test-001", nullptr, ""};
146 const uint32_t inputDataLen[lenCount] = {
147 0,
148 sizeof(SandboxSection),
149 sizeof(SandboxPackageNameNode),
150 sizeof(SandboxFlagsNode),
151 sizeof(SandboxNameGroupNode),
152 sizeof(SandboxPermissionNode),
153 sizeof(SandboxNameGroupNode) + 100
154 };
155 int result[lenCount] = {0};
156 result[1] = 1;
157 result[2] = 1;
158 result[3] = 1;
159 result[4] = 1;
160 result[5] = 1;
__anona643db180102(const char *name, uint32_t len, size_t nameIndex, size_t lenIndex) 161 auto testFunc = [result](const char *name, uint32_t len, size_t nameIndex, size_t lenIndex) {
162 for (size_t type = SANDBOX_TAG_PERMISSION; type <= SANDBOX_TAG_REQUIRED; type++) {
163 SandboxSection *section = CreateSandboxSection(name, len, type);
164 EXPECT_EQ(section != nullptr, nameIndex == 0 && result[lenIndex]);
165 if (section) {
166 EXPECT_EQ(GetSectionType(section), type);
167 free(section->name);
168 free(section);
169 }
170 }
171 };
172 for (size_t i = 0; i < nameCount; i++) {
173 for (size_t j = 0; j < lenCount; j++) {
174 testFunc(inputName[i], inputDataLen[j], i, j);
175 }
176 }
177 DeleteAppSpawnSandbox(sandbox);
178 DeleteAppSpawnMgr(mgr);
179 }
180
181 HWTEST_F(AppSpawnSandboxMgrTest, App_Spawn_SandboxSection_002, TestSize.Level0)
182 {
183 AppSpawnMgr *mgr = CreateAppSpawnMgr(MODE_FOR_NWEB_SPAWN);
184 EXPECT_EQ(mgr != nullptr, 1);
185
186 AppSpawnSandboxCfg *sandbox = CreateAppSpawnSandbox();
187 EXPECT_EQ(sandbox != nullptr, 1);
188 OH_ListAddTail(&sandbox->extData.node, &mgr->extData);
189
190 const uint32_t nameCount = 3;
191 const uint32_t lenCount = 7;
192 const char *inputName[nameCount] = {"test-001", nullptr, ""};
193 const uint32_t inputDataLen[lenCount] = {
194 0,
195 sizeof(SandboxSection),
196 sizeof(SandboxPackageNameNode),
197 sizeof(SandboxFlagsNode),
198 sizeof(SandboxNameGroupNode),
199 sizeof(SandboxPermissionNode),
200 sizeof(SandboxNameGroupNode) + 100
201 };
202 for (size_t i = 0; i < nameCount; i++) {
203 for (size_t j = 0; j < lenCount; j++) {
204 SandboxSection *section = CreateSandboxSection(inputName[i], inputDataLen[j], 0);
205 EXPECT_EQ(section == nullptr, 1);
206 section = CreateSandboxSection(inputName[i], inputDataLen[j], 1);
207 EXPECT_EQ(section == nullptr, 1);
208 section = CreateSandboxSection(inputName[i], inputDataLen[j], SANDBOX_TAG_INVALID);
209 EXPECT_EQ(section == nullptr, 1);
210 section = CreateSandboxSection(inputName[i], inputDataLen[j], SANDBOX_TAG_INVALID + 1);
211 EXPECT_EQ(section == nullptr, 1);
212 }
213 }
214 DeleteAppSpawnSandbox(sandbox);
215 DeleteAppSpawnMgr(mgr);
216 }
217
218 HWTEST_F(AppSpawnSandboxMgrTest, App_Spawn_SandboxSection_003, TestSize.Level0)
219 {
220 AppSpawnMgr *mgr = CreateAppSpawnMgr(MODE_FOR_NWEB_SPAWN);
221 EXPECT_EQ(mgr != nullptr, 1);
222
223 AppSpawnSandboxCfg *sandbox = CreateAppSpawnSandbox();
224 EXPECT_EQ(sandbox != nullptr, 1);
225 OH_ListAddTail(&sandbox->extData.node, &mgr->extData);
226
227 SandboxSection *section = CreateSandboxSection("system-const", sizeof(SandboxSection), SANDBOX_TAG_SYSTEM_CONST);
228 EXPECT_EQ(section != nullptr, 1);
229 AddSandboxSection(section, &sandbox->requiredQueue);
230 // GetSandboxSection
231 section = GetSandboxSection(&sandbox->requiredQueue, "system-const");
232 EXPECT_EQ(section != nullptr, 1);
233 // DeleteSandboxSection
234 DeleteSandboxSection(section);
235
236 // GetSandboxSection has deleted
237 section = GetSandboxSection(&sandbox->requiredQueue, "system-const");
238 EXPECT_EQ(section != nullptr, 0);
239
240 DeleteAppSpawnSandbox(sandbox);
241 DeleteAppSpawnMgr(mgr);
242 }
243
244 HWTEST_F(AppSpawnSandboxMgrTest, App_Spawn_SandboxSection_004, TestSize.Level0)
245 {
246 AppSpawnMgr *mgr = CreateAppSpawnMgr(MODE_FOR_NWEB_SPAWN);
247 EXPECT_EQ(mgr != nullptr, 1);
248
249 AppSpawnSandboxCfg *sandbox = CreateAppSpawnSandbox();
250 EXPECT_EQ(sandbox != nullptr, 1);
251 OH_ListAddTail(&sandbox->extData.node, &mgr->extData);
252
253 AddSandboxSection(nullptr, &sandbox->requiredQueue);
254 AddSandboxSection(nullptr, nullptr);
255
256 // GetSandboxSection
257 SandboxSection *section = GetSandboxSection(nullptr, "system-const");
258 EXPECT_EQ(section == nullptr, 1);
259 section = GetSandboxSection(nullptr, "");
260 EXPECT_EQ(section == nullptr, 1);
261 section = GetSandboxSection(nullptr, nullptr);
262 EXPECT_EQ(section == nullptr, 1);
263 section = GetSandboxSection(&sandbox->requiredQueue, "");
264 EXPECT_EQ(section == nullptr, 1);
265 section = GetSandboxSection(&sandbox->requiredQueue, nullptr);
266 EXPECT_EQ(section == nullptr, 1);
267
268 // DeleteSandboxSection
269 DeleteSandboxSection(section);
270 DeleteSandboxSection(nullptr);
271
272 // GetSandboxSection has deleted
273 section = GetSandboxSection(&sandbox->requiredQueue, "system-const");
274 EXPECT_EQ(section == nullptr, 1);
275
276 EXPECT_EQ(GetSectionType(nullptr), SANDBOX_TAG_INVALID);
277
278 DeleteAppSpawnSandbox(sandbox);
279 DeleteAppSpawnMgr(mgr);
280 }
281
282 /**
283 * @brief SandboxMountNode
284 *
285 */
286 HWTEST_F(AppSpawnSandboxMgrTest, App_Spawn_SandboxMountNode_001, TestSize.Level0)
287 {
288 AppSpawnMgr *mgr = CreateAppSpawnMgr(MODE_FOR_NWEB_SPAWN);
289 EXPECT_EQ(mgr != nullptr, 1);
290
291 AppSpawnSandboxCfg *sandbox = CreateAppSpawnSandbox();
292 EXPECT_EQ(sandbox != nullptr, 1);
293 OH_ListAddTail(&sandbox->extData.node, &mgr->extData);
294
295 SandboxSection *section = CreateSandboxSection("system-const", sizeof(SandboxSection), SANDBOX_TAG_SYSTEM_CONST);
296 EXPECT_EQ(section != nullptr, 1);
297 AddSandboxSection(section, &sandbox->requiredQueue);
298
299 const uint32_t lenCount = 4;
300 const uint32_t inputDataLen[lenCount] = {
301 0,
302 sizeof(PathMountNode),
303 sizeof(SymbolLinkNode),
304 sizeof(SymbolLinkNode) + 100
305 };
306 int result[lenCount] = {0, 1, 1, 0};
307 for (size_t i = 0; i < lenCount; i++) {
308 for (size_t j = 0; j < SANDBOX_TAG_INVALID; j++) {
309 SandboxMountNode *path = CreateSandboxMountNode(inputDataLen[i], j);
310 EXPECT_EQ(path != nullptr, result[i]);
311 if (path) {
312 free(path);
313 }
314 }
315 }
316
317 DeleteAppSpawnSandbox(sandbox);
318 DeleteAppSpawnMgr(mgr);
319 }
320
321 HWTEST_F(AppSpawnSandboxMgrTest, App_Spawn_SandboxMountNode_002, TestSize.Level0)
322 {
323 AppSpawnMgr *mgr = CreateAppSpawnMgr(MODE_FOR_NWEB_SPAWN);
324 EXPECT_EQ(mgr != nullptr, 1);
325
326 AppSpawnSandboxCfg *sandbox = CreateAppSpawnSandbox();
327 EXPECT_EQ(sandbox != nullptr, 1);
328 OH_ListAddTail(&sandbox->extData.node, &mgr->extData);
329
330 SandboxSection *section = CreateSandboxSection("system-const", sizeof(SandboxSection), SANDBOX_TAG_SYSTEM_CONST);
331 EXPECT_EQ(section != nullptr, 1);
332 AddSandboxSection(section, &sandbox->requiredQueue);
333
334 SandboxMountNode *path = CreateSandboxMountNode(sizeof(PathMountNode), SANDBOX_TAG_MOUNT_PATH);
335 EXPECT_EQ(path != nullptr, 1);
336 AddSandboxMountNode(path, section);
337
338 path = GetFirstSandboxMountNode(section);
339 EXPECT_EQ(path != nullptr, 1);
340 DeleteSandboxMountNode(path);
341 path = GetFirstSandboxMountNode(section);
342 EXPECT_EQ(path == nullptr, 1);
343
344 path = GetFirstSandboxMountNode(nullptr);
345 EXPECT_EQ(path == nullptr, 1);
346 DeleteSandboxMountNode(nullptr);
347
348 DeleteAppSpawnSandbox(sandbox);
349 DeleteAppSpawnMgr(mgr);
350 }
351
352 HWTEST_F(AppSpawnSandboxMgrTest, App_Spawn_SandboxMountNode_003, TestSize.Level0)
353 {
354 AppSpawnMgr *mgr = CreateAppSpawnMgr(MODE_FOR_NWEB_SPAWN);
355 EXPECT_EQ(mgr != nullptr, 1);
356
357 AppSpawnSandboxCfg *sandbox = CreateAppSpawnSandbox();
358 EXPECT_EQ(sandbox != nullptr, 1);
359 OH_ListAddTail(&sandbox->extData.node, &mgr->extData);
360
361 SandboxSection *section = CreateSandboxSection("system-const", sizeof(SandboxSection), SANDBOX_TAG_SYSTEM_CONST);
362 EXPECT_EQ(section != nullptr, 1);
363 AddSandboxSection(section, &sandbox->requiredQueue);
364
365 SandboxMountNode *path = CreateSandboxMountNode(sizeof(PathMountNode), SANDBOX_TAG_MOUNT_PATH);
366 EXPECT_EQ(path != nullptr, 1);
367 PathMountNode *pathNode = reinterpret_cast<PathMountNode *>(path);
368 const char *testPath = "xxx/xxx/xxx";
369 pathNode->source = strdup(testPath);
370 pathNode->target = strdup(testPath);
371 AddSandboxMountNode(path, section);
372
373 pathNode = GetPathMountNode(section, SANDBOX_TAG_MOUNT_PATH, testPath, testPath);
374 EXPECT_EQ(pathNode != nullptr, 1);
375
376 // 异常
377 for (size_t j = 0; j < SANDBOX_TAG_INVALID; j++) {
378 pathNode = GetPathMountNode(section, j, testPath, testPath);
379 EXPECT_EQ(pathNode != nullptr, j == SANDBOX_TAG_MOUNT_PATH);
380 pathNode = GetPathMountNode(section, j, nullptr, testPath);
381 EXPECT_EQ(pathNode != nullptr, 0);
382 pathNode = GetPathMountNode(section, j, nullptr, nullptr);
383 EXPECT_EQ(pathNode != nullptr, 0);
384 pathNode = GetPathMountNode(section, j, testPath, nullptr);
385 EXPECT_EQ(pathNode != nullptr, 0);
386
387 EXPECT_EQ(pathNode != nullptr, 0);
388 pathNode = GetPathMountNode(nullptr, j, nullptr, testPath);
389 EXPECT_EQ(pathNode != nullptr, 0);
390 pathNode = GetPathMountNode(nullptr, j, nullptr, nullptr);
391 EXPECT_EQ(pathNode != nullptr, 0);
392 pathNode = GetPathMountNode(nullptr, j, testPath, nullptr);
393 EXPECT_EQ(pathNode != nullptr, 0);
394 }
395
396 DeleteAppSpawnSandbox(sandbox);
397 DeleteAppSpawnMgr(mgr);
398 }
399
400 HWTEST_F(AppSpawnSandboxMgrTest, App_Spawn_SandboxMountNode_004, TestSize.Level0)
401 {
402 AppSpawnMgr *mgr = CreateAppSpawnMgr(MODE_FOR_NWEB_SPAWN);
403 EXPECT_EQ(mgr != nullptr, 1);
404
405 AppSpawnSandboxCfg *sandbox = CreateAppSpawnSandbox();
406 EXPECT_EQ(sandbox != nullptr, 1);
407 OH_ListAddTail(&sandbox->extData.node, &mgr->extData);
408
409 SandboxSection *section = CreateSandboxSection("system-const", sizeof(SandboxSection), SANDBOX_TAG_SYSTEM_CONST);
410 EXPECT_EQ(section != nullptr, 1);
411 AddSandboxSection(section, &sandbox->requiredQueue);
412
413 SandboxMountNode *path = CreateSandboxMountNode(sizeof(SymbolLinkNode), SANDBOX_TAG_SYMLINK);
414 EXPECT_EQ(path != nullptr, 1);
415 SymbolLinkNode *pathNode = reinterpret_cast<SymbolLinkNode *>(path);
416 const char *testPath = "xxx/xxx/xxx";
417 pathNode->linkName = strdup(testPath);
418 pathNode->target = strdup(testPath);
419 AddSandboxMountNode(path, section);
420
421 pathNode = GetSymbolLinkNode(section, testPath, testPath);
422 EXPECT_EQ(pathNode != nullptr, 1);
423
424 // 异常
425 pathNode = GetSymbolLinkNode(section, testPath, testPath);
426 EXPECT_EQ(pathNode != nullptr, 1);
427 pathNode = GetSymbolLinkNode(section, nullptr, testPath);
428 EXPECT_EQ(pathNode != nullptr, 0);
429 pathNode = GetSymbolLinkNode(section, nullptr, nullptr);
430 EXPECT_EQ(pathNode != nullptr, 0);
431 pathNode = GetSymbolLinkNode(section, testPath, nullptr);
432 EXPECT_EQ(pathNode != nullptr, 0);
433
434 EXPECT_EQ(pathNode != nullptr, 0);
435 pathNode = GetSymbolLinkNode(nullptr, nullptr, testPath);
436 EXPECT_EQ(pathNode != nullptr, 0);
437 pathNode = GetSymbolLinkNode(nullptr, nullptr, nullptr);
438 EXPECT_EQ(pathNode != nullptr, 0);
439 pathNode = GetSymbolLinkNode(nullptr, testPath, nullptr);
440 EXPECT_EQ(pathNode != nullptr, 0);
441
442 DeleteAppSpawnSandbox(sandbox);
443 DeleteAppSpawnMgr(mgr);
444 }
445
446 /**
447 * @brief mount
448 *
449 */
TestCreateAppSpawningCtx()450 static AppSpawningCtx *TestCreateAppSpawningCtx()
451 {
452 // get from buffer
453 AppSpawnTestHelper testHelper;
454 std::vector<uint8_t> buffer(1024 * 2); // 1024 * 2 max buffer
455 uint32_t msgLen = 0;
456 int ret = testHelper.CreateSendMsg(buffer, MSG_APP_SPAWN, msgLen, {AppSpawnTestHelper::AddBaseTlv});
457 EXPECT_EQ(0, ret);
458
459 AppSpawnMsgNode *outMsg = nullptr;
460 uint32_t msgRecvLen = 0;
461 uint32_t reminder = 0;
462 ret = GetAppSpawnMsgFromBuffer(buffer.data(), msgLen, &outMsg, &msgRecvLen, &reminder);
463 EXPECT_EQ(0, ret);
464 EXPECT_EQ(msgLen, msgRecvLen);
465 EXPECT_EQ(memcmp(buffer.data() + sizeof(AppSpawnMsg), outMsg->buffer, msgLen - sizeof(AppSpawnMsg)), 0);
466 EXPECT_EQ(0, reminder);
467 ret = DecodeAppSpawnMsg(outMsg);
468 EXPECT_EQ(0, ret);
469 AppSpawningCtx *appCtx = CreateAppSpawningCtx();
470 EXPECT_EQ(appCtx != nullptr, 1);
471 appCtx->message = outMsg;
472 return appCtx;
473 }
474
475 HWTEST_F(AppSpawnSandboxMgrTest, App_Spawn_Mount_001, TestSize.Level0)
476 {
477 AppSpawnMgr *mgr = CreateAppSpawnMgr(MODE_FOR_NWEB_SPAWN);
478 EXPECT_EQ(mgr != nullptr, 1);
479
480 AppSpawnSandboxCfg *sandbox = CreateAppSpawnSandbox();
481 EXPECT_EQ(sandbox != nullptr, 1);
482 OH_ListAddTail(&sandbox->extData.node, &mgr->extData);
483
484 AppSpawningCtx *property = TestCreateAppSpawningCtx();
485 EXPECT_EQ(property != nullptr, 1);
486
487 // 只做异常测试,正常流程需要基于业务流进行测试
488 const AppSpawningCtx *inputAppSpawningCtx[2] = {property, nullptr};
489 const AppSpawnSandboxCfg *inputAppSpawnSandboxCfg[2] = {sandbox, nullptr};
490 uint32_t inputSpawn[3] = {0, 1, 2};
491 int ret = 0;
492 for (uint32_t i = 0; i < 2; i++) { // 2
493 for (uint32_t j = 0; j < 2; j++) { // 2
494 for (uint32_t k = 0; k < 2; k++) { // 2
495 ret = MountSandboxConfigs(inputAppSpawnSandboxCfg[i], inputAppSpawningCtx[j], inputSpawn[k]);
496 EXPECT_EQ(ret == 0, i == 0 && j == 0);
497 }
498 }
499 }
500
501 for (uint32_t i = 0; i < 2; i++) { // 2
502 for (uint32_t j = 0; j < 2; j++) { // 2
503 for (uint32_t k = 0; k < 2; k++) { // 2
504 ret = StagedMountSystemConst(inputAppSpawnSandboxCfg[i], inputAppSpawningCtx[j], inputSpawn[k]);
505 EXPECT_EQ(ret == 0, i == 0 && j == 0);
506 }
507 }
508 }
509
510 DeleteAppSpawningCtx(property);
511 DeleteAppSpawnSandbox(sandbox);
512 DeleteAppSpawnMgr(mgr);
513 }
514
515 HWTEST_F(AppSpawnSandboxMgrTest, App_Spawn_Mount_002, TestSize.Level0)
516 {
517 AppSpawnMgr *mgr = CreateAppSpawnMgr(MODE_FOR_NWEB_SPAWN);
518 EXPECT_EQ(mgr != nullptr, 1);
519
520 AppSpawnSandboxCfg *sandbox = CreateAppSpawnSandbox();
521 EXPECT_EQ(sandbox != nullptr, 1);
522 OH_ListAddTail(&sandbox->extData.node, &mgr->extData);
523
524 SandboxContext context = {};
525 // 只做异常测试,正常流程需要基于业务流进行测试
526 const SandboxContext *inputContext[2] = {&context, nullptr};
527 const AppSpawnSandboxCfg *inputAppSpawnSandboxCfg[2] = {sandbox, nullptr};
528
529 int ret = 0;
530 for (uint32_t i = 0; i < 2; i++) { // 2
531 for (uint32_t j = 0; j < 2; j++) { // 2
532 ret = StagedMountPreUnShare(inputContext[i], inputAppSpawnSandboxCfg[j]);
533 EXPECT_EQ(ret == 0, i == 0 && j == 0);
534 }
535 }
536
537 for (uint32_t i = 0; i < 2; i++) { // 2
538 for (uint32_t j = 0; j < 2; j++) { // 2
539 ret = StagedMountPostUnshare(inputContext[i], inputAppSpawnSandboxCfg[j]);
540 EXPECT_EQ(ret == 0, i == 0 && j == 0);
541 }
542 }
543
544 DeleteAppSpawnSandbox(sandbox);
545 DeleteAppSpawnMgr(mgr);
546 }
547
548 HWTEST_F(AppSpawnSandboxMgrTest, App_Spawn_Mount_003, TestSize.Level0)
549 {
550 AppSpawnMgr *mgr = CreateAppSpawnMgr(MODE_FOR_NWEB_SPAWN);
551 EXPECT_EQ(mgr != nullptr, 1);
552
553 AppSpawnSandboxCfg *sandbox = CreateAppSpawnSandbox();
554 EXPECT_EQ(sandbox != nullptr, 1);
555 sandbox->rootPath = strdup("/data/appspawn_ut/sandbox/");
556 OH_ListAddTail(&sandbox->extData.node, &mgr->extData);
557
558 // 只做异常测试,正常流程需要基于业务流进行测试
559 const AppSpawnSandboxCfg *inputAppSpawnSandboxCfg[2] = {sandbox, nullptr};
560 const char *inputName[2] = {"test", nullptr};
561
562 for (uint32_t k = 0; k < 2; k++) { // 2
563 int ret = UnmountDepPaths(inputAppSpawnSandboxCfg[k], 0);
564 EXPECT_EQ(ret == 0, k == 0);
565 }
566 for (uint32_t i = 0; i < 2; i++) { // 2
567 for (uint32_t k = 0; k < 2; k++) { // 2
568 int ret = UnmountSandboxConfigs(inputAppSpawnSandboxCfg[k], 0, inputName[i]);
569 EXPECT_EQ(ret == 0, k == 0 && i == 0);
570 }
571 }
572 DeleteAppSpawnSandbox(sandbox);
573 DeleteAppSpawnMgr(mgr);
574 }
575
576 /**
577 * @brief SandboxMountPath
578 *
579 */
580 HWTEST_F(AppSpawnSandboxMgrTest, App_Spawn_Add_App_SandboxMountPath_001, TestSize.Level0)
581 {
582 MountArg arg = {};
583 arg.originPath = "/data/";
584 arg.destinationPath = "/data/appspawn/test";
585 arg.mountSharedFlag = 1;
586
587 int ret = SandboxMountPath(&arg);
588 EXPECT_EQ(ret, 0);
589 ret = SandboxMountPath(&arg);
590 EXPECT_EQ(ret, 0);
591 ret = SandboxMountPath(nullptr);
592 EXPECT_NE(ret, 0);
593 arg.mountSharedFlag = -1;
594 ret = SandboxMountPath(&arg);
595 EXPECT_EQ(ret, 0);
596 }
597
598 /**
599 * @brief AddVariableReplaceHandler
600 *
601 */
TestReplaceVarHandler(const SandboxContext * context,const char * buffer,uint32_t bufferLen,uint32_t * realLen,const VarExtraData * extraData)602 static int TestReplaceVarHandler(const SandboxContext *context,
603 const char *buffer, uint32_t bufferLen, uint32_t *realLen, const VarExtraData *extraData)
604 {
605 return 0;
606 }
607
608 HWTEST_F(AppSpawnSandboxMgrTest, App_Spawn_AddVariableReplaceHandler_001, TestSize.Level0)
609 {
610 int ret = AddVariableReplaceHandler(nullptr, nullptr);
611 EXPECT_EQ(ret, APPSPAWN_ARG_INVALID);
612 ret = AddVariableReplaceHandler("xxx", nullptr);
613 EXPECT_EQ(ret, APPSPAWN_ARG_INVALID);
614 ret = AddVariableReplaceHandler(nullptr, TestReplaceVarHandler);
615 EXPECT_EQ(ret, APPSPAWN_ARG_INVALID);
616
617 ret = AddVariableReplaceHandler("global", TestReplaceVarHandler);
618 EXPECT_EQ(ret, 0);
619 ret = AddVariableReplaceHandler("global", TestReplaceVarHandler);
620 EXPECT_EQ(ret, APPSPAWN_NODE_EXIST);
621
622 ret = AddVariableReplaceHandler("<Test-Var-005>", TestReplaceVarHandler);
623 EXPECT_EQ(ret, 0);
624 }
625
626 /**
627 * @brief RegisterExpandSandboxCfgHandler
628 *
629 */
TestProcessExpandSandboxCfg(const SandboxContext * context,const AppSpawnSandboxCfg * appSandBox,const char * name)630 static int TestProcessExpandSandboxCfg(const SandboxContext *context,
631 const AppSpawnSandboxCfg *appSandBox, const char *name)
632 {
633 return 0;
634 }
635
636 HWTEST_F(AppSpawnSandboxMgrTest, App_Spawn_RegisterExpandSandboxCfgHandler_001, TestSize.Level0)
637 {
638 int ret = RegisterExpandSandboxCfgHandler(nullptr, 0, nullptr);
639 EXPECT_EQ(ret, APPSPAWN_ARG_INVALID);
640 ret = RegisterExpandSandboxCfgHandler("test", 0, nullptr);
641 EXPECT_EQ(ret, APPSPAWN_ARG_INVALID);
642 ret = RegisterExpandSandboxCfgHandler(nullptr, 0, TestProcessExpandSandboxCfg);
643 EXPECT_EQ(ret, APPSPAWN_ARG_INVALID);
644
645 ret = RegisterExpandSandboxCfgHandler("test-001", 0, TestProcessExpandSandboxCfg);
646 EXPECT_EQ(ret, 0);
647 ret = RegisterExpandSandboxCfgHandler("test-001", 0, TestProcessExpandSandboxCfg);
648 EXPECT_EQ(ret, APPSPAWN_NODE_EXIST);
649 ret = RegisterExpandSandboxCfgHandler("test-001", -1, TestProcessExpandSandboxCfg);
650 EXPECT_EQ(ret, APPSPAWN_NODE_EXIST);
651 }
652
653 /**
654 * @brief permission test
655 *
656 */
657 HWTEST_F(AppSpawnSandboxMgrTest, App_Spawn_Permission_001, TestSize.Level0)
658 {
659 int ret = LoadPermission(CLIENT_FOR_APPSPAWN);
660 EXPECT_EQ(ret, 0);
661 ret = LoadPermission(CLIENT_FOR_NWEBSPAWN);
662 EXPECT_EQ(ret, 0);
663 ret = LoadPermission(CLIENT_MAX);
664 EXPECT_EQ(ret, APPSPAWN_ARG_INVALID);
665
666 int32_t max = GetPermissionMaxCount();
667 EXPECT_EQ(max >= 0, 1);
668
669 DeletePermission(CLIENT_FOR_APPSPAWN);
670 DeletePermission(CLIENT_FOR_NWEBSPAWN);
671 DeletePermission(CLIENT_MAX);
672 }
673
674 HWTEST_F(AppSpawnSandboxMgrTest, App_Spawn_Permission_002, TestSize.Level0)
675 {
676 int ret = LoadPermission(CLIENT_FOR_APPSPAWN);
677 EXPECT_EQ(ret, 0);
678 ret = LoadPermission(CLIENT_FOR_NWEBSPAWN);
679 EXPECT_EQ(ret, 0);
680
681 int32_t max = GetPermissionMaxCount();
682 EXPECT_EQ(max >= 0, 1);
683
684 AppSpawnClientHandle clientHandle;
685 ret = AppSpawnClientInit(APPSPAWN_SERVER_NAME, &clientHandle);
686 EXPECT_EQ(ret, 0);
687
688 max = GetMaxPermissionIndex(clientHandle);
689 int32_t index = GetPermissionIndex(clientHandle, "ohos.permission.ACCESS_BUNDLE_DIR");
690 EXPECT_EQ(index >= 0, 1);
691 EXPECT_EQ(index < max, 1);
692
693 const char *permission = GetPermissionByIndex(clientHandle, index);
694 EXPECT_EQ(permission != nullptr, 1);
695 EXPECT_EQ(strcmp(permission, "ohos.permission.ACCESS_BUNDLE_DIR") == 0, 1);
696 AppSpawnClientDestroy(clientHandle);
697 }
698
699 HWTEST_F(AppSpawnSandboxMgrTest, App_Spawn_Permission_003, TestSize.Level0)
700 {
701 int ret = LoadPermission(CLIENT_FOR_APPSPAWN);
702 EXPECT_EQ(ret, 0);
703 ret = LoadPermission(CLIENT_FOR_NWEBSPAWN);
704 EXPECT_EQ(ret, 0);
705 ret = LoadPermission(CLIENT_MAX);
706 EXPECT_EQ(ret, APPSPAWN_ARG_INVALID);
707
708 int32_t max = GetPermissionMaxCount();
709 EXPECT_EQ(max >= 0, 1);
710
711 AppSpawnClientHandle clientHandle;
712 ret = AppSpawnClientInit(NWEBSPAWN_SERVER_NAME, &clientHandle);
713 EXPECT_EQ(ret, 0);
714
715 #ifndef APPSPAWN_SANDBOX_NEW
716 max = GetMaxPermissionIndex(clientHandle);
717 int32_t index = GetPermissionIndex(clientHandle, "ohos.permission.ACCESS_BUNDLE_DIR");
718 EXPECT_EQ(index >= 0, 1);
719 EXPECT_EQ(max >= index, 1);
720
721 const char *permission = GetPermissionByIndex(clientHandle, index);
722 EXPECT_EQ(permission != nullptr, 1);
723 EXPECT_EQ(strcmp(permission, "ohos.permission.ACCESS_BUNDLE_DIR") == 0, 1);
724 #else
725 // nweb no permission, so max = 0
726 max = GetMaxPermissionIndex(clientHandle);
727 EXPECT_EQ(max, 0);
728 #endif
729 AppSpawnClientDestroy(clientHandle);
730 }
731
732 HWTEST_F(AppSpawnSandboxMgrTest, App_Spawn_Permission_004, TestSize.Level0)
733 {
734 int ret = LoadPermission(CLIENT_FOR_APPSPAWN);
735 EXPECT_EQ(ret, 0);
736 ret = LoadPermission(CLIENT_FOR_NWEBSPAWN);
737 EXPECT_EQ(ret, 0);
738 ret = LoadPermission(CLIENT_MAX);
739 EXPECT_EQ(ret, APPSPAWN_ARG_INVALID);
740
741 int32_t max = GetPermissionMaxCount();
742 EXPECT_EQ(max >= 0, 1);
743
744 AppSpawnClientHandle clientHandle;
745 ret = AppSpawnClientInit(NWEBSPAWN_SERVER_NAME, &clientHandle);
746 EXPECT_EQ(ret, 0);
747
748 max = GetMaxPermissionIndex(nullptr);
749 EXPECT_EQ(max >= 0, 1);
750
751 int32_t index = GetPermissionIndex(clientHandle, nullptr);
752 EXPECT_EQ(index, INVALID_PERMISSION_INDEX);
753 index = GetPermissionIndex(nullptr, "ohos.permission.ACCESS_BUNDLE_DIR");
754 EXPECT_EQ(max >= index, 1);
755 const char *permission = GetPermissionByIndex(clientHandle, INVALID_PERMISSION_INDEX);
756 EXPECT_EQ(permission == nullptr, 1);
757
758 AppSpawnClientDestroy(clientHandle);
759 }
760 } // namespace OHOS
761