1 /*
2 * Copyright (c) 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 #include <cerrno>
16 #include <cstdlib>
17 #include <cstring>
18 #include <memory>
19 #include <string>
20 #include <thread>
21 #include <unistd.h>
22
23 #include <gtest/gtest.h>
24 #include <sys/stat.h>
25 #include <sys/types.h>
26
27 #include "appspawn_adapter.h"
28 #include "appspawn_manager.h"
29 #include "appspawn_modulemgr.h"
30 #include "appspawn_server.h"
31 #include "json_utils.h"
32 #include "parameter.h"
33 #include "securec.h"
34 #include "cJSON.h"
35
36 #include "app_spawn_stub.h"
37 #include "app_spawn_test_helper.h"
38
39 using namespace testing;
40 using namespace testing::ext;
41 using namespace OHOS;
42
43 namespace OHOS {
44 class AppSpawnServiceTest : public testing::Test {
45 public:
SetUpTestCase()46 static void SetUpTestCase() {}
TearDownTestCase()47 static void TearDownTestCase() {}
SetUp()48 void SetUp()
49 {
50 testServer = std::make_unique<OHOS::AppSpawnTestServer>("appspawn -mode appspawn");
51 if (testServer != nullptr) {
52 testServer->Start(nullptr);
53 }
54 }
TearDown()55 void TearDown()
56 {
57 if (testServer != nullptr) {
58 testServer->Stop();
59 }
60 }
61 public:
62 std::unique_ptr<OHOS::AppSpawnTestServer> testServer = nullptr;
63 };
64
65 /**
66 * @brief 向appspawn发送MSG_APP_SPAWN类型的消息
67 * @note 预期结果:appspawn接收到请求消息,孵化应用进程
68 *
69 */
70 HWTEST_F(AppSpawnServiceTest, App_Spawn_MSG_APP_SPAWN_001, TestSize.Level0)
71 {
72 int ret = 0;
73 AppSpawnClientHandle clientHandle = nullptr;
74 do {
75 ret = AppSpawnClientInit(APPSPAWN_SERVER_NAME, &clientHandle);
76 APPSPAWN_CHECK(ret == 0, break, "Failed to create client %{public}s", APPSPAWN_SERVER_NAME);
77 AppSpawnReqMsgHandle reqHandle = testServer->CreateMsg(clientHandle, MSG_APP_SPAWN, 0);
78
79 AppSpawnResult result = {};
80 ret = AppSpawnClientSendMsg(clientHandle, reqHandle, &result);
81 APPSPAWN_CHECK(ret == 0 && result.pid > 0, ret = -1;
82 break, "Failed to send MSG_APP_SPAWN, ret %{public}d pid %{public}d", ret, result.pid);
83
84 DumpSpawnStack(result.pid);
85 ret = kill(result.pid, SIGKILL);
86 APPSPAWN_CHECK(ret == 0, break, "unable to kill pid %{public}d, err %{public}d", result.pid, errno);
87 } while (0);
88
89 AppSpawnClientDestroy(clientHandle);
90 ASSERT_EQ(ret, 0);
91 }
92
93 /**
94 * @brief 通过多线程模拟多个客户端向appspawn发送MSG_APP_SPAWN类型的消息
95 * @note 预期结果:appspawn接收到请求消息,逐个孵化应用进程
96 *
97 */
98 HWTEST_F(AppSpawnServiceTest, App_Spawn_MSG_APP_SPAWN_002, TestSize.Level0)
99 {
100 int ret = 0;
101 AppSpawnClientHandle clientHandle = nullptr;
102 do {
103 ret = AppSpawnClientInit(APPSPAWN_SERVER_NAME, &clientHandle);
104 APPSPAWN_CHECK(ret == 0, break, "Failed to create client %{public}s", APPSPAWN_SERVER_NAME);
105
__anondcc1ec5e0102(AppSpawnClientHandle clientHandle) 106 auto sendMsg = [this, &ret](AppSpawnClientHandle clientHandle) {
107 AppSpawnReqMsgHandle reqHandle = testServer->CreateMsg(clientHandle, MSG_APP_SPAWN, 0);
108
109 AppSpawnResult result = {};
110 ret = AppSpawnClientSendMsg(clientHandle, reqHandle, &result);
111 APPSPAWN_CHECK(ret == 0 && result.pid > 0, ret = -1;
112 return, "Failed to send MSG_APP_SPAWN, ret %{public}d pid %{public}d", ret, result.pid);
113
114 ret = kill(result.pid, SIGKILL);
115 APPSPAWN_CHECK(ret == 0, return, "unable to kill pid %{public}d, err %{public}d", result.pid, errno);
116 };
117 std::thread thread1(sendMsg, clientHandle);
118 std::thread thread2(sendMsg, clientHandle);
119 std::thread thread3(sendMsg, clientHandle);
120 std::thread thread4(sendMsg, clientHandle);
121 std::thread thread5(sendMsg, clientHandle);
122 thread1.join();
123 thread2.join();
124 thread3.join();
125 thread4.join();
126 thread5.join();
127 } while (0);
128
129 AppSpawnClientDestroy(clientHandle);
130 ASSERT_EQ(ret, 0);
131 }
132
133 /**
134 * @brief appspawn孵化的应用进程退出后,向appspawn发送MSG_GET_RENDER_TERMINATION_STATUS类型的消息
135 * @note 预期结果:appspawn不支持处理该类型消息,不会根据消息中传入的pid去查询进程的退出状态
136 *
137 */
138 HWTEST_F(AppSpawnServiceTest, App_Spawn_MSG_GET_RENDER_TERMINATION_STATUS_001, TestSize.Level0)
139 {
140 int ret = 0;
141 AppSpawnClientHandle clientHandle = nullptr;
142 do {
143 ret = AppSpawnClientInit(APPSPAWN_SERVER_NAME, &clientHandle);
144 APPSPAWN_CHECK(ret == 0, break, "Failed to create client %{public}s", APPSPAWN_SERVER_NAME);
145 AppSpawnReqMsgHandle reqHandle = testServer->CreateMsg(clientHandle, MSG_APP_SPAWN, 0);
146
147 AppSpawnResult result = {};
148 ret = AppSpawnClientSendMsg(clientHandle, reqHandle, &result);
149 APPSPAWN_CHECK(ret == 0 && result.pid > 0, ret = -1;
150 break, "Failed to send MSG_APP_SPAWN, ret %{public}d pid %{public}d", ret, result.pid);
151
152 ret = kill(result.pid, SIGKILL);
153 APPSPAWN_CHECK(ret == 0, break, "unable to kill pid %{public}d, err %{public}d", result.pid, errno);
154
155 ret = AppSpawnTerminateMsgCreate(result.pid, &reqHandle); // MSG_GET_RENDER_TERMINATION_STATUS
156 APPSPAWN_CHECK(ret == 0, break, "Failed to create termination msg %{public}s", APPSPAWN_SERVER_NAME);
157
158 ret = AppSpawnClientSendMsg(clientHandle, reqHandle, &result);
159 APPSPAWN_CHECK(ret == 0 && result.result == APPSPAWN_MSG_INVALID, ret = -1;
160 break, "Failed to send MSG_GET_RENDER_TERMINATION_STATUS, ret %{public}d", ret);
161 } while (0);
162
163 AppSpawnClientDestroy(clientHandle);
164 ASSERT_EQ(ret, 0);
165 }
166
167 /**
168 * @brief 向appspawn发送MSG_SPAWN_NATIVE_PROCESS类型的消息
169 * @note 预期结果:appspawn接收到请求消息,孵化native进程
170 *
171 */
172 HWTEST_F(AppSpawnServiceTest, App_Spawn_MSG_SPAWN_NATIVE_PROCESS_001, TestSize.Level0)
173 {
174 int ret = 0;
175 AppSpawnClientHandle clientHandle = nullptr;
176 do {
177 ret = AppSpawnClientInit(APPSPAWN_SERVER_NAME, &clientHandle);
178 APPSPAWN_CHECK(ret == 0, break, "Failed to create client %{public}s", APPSPAWN_SERVER_NAME);
179 AppSpawnReqMsgHandle reqHandle = testServer->CreateMsg(clientHandle, MSG_SPAWN_NATIVE_PROCESS, 0);
180
181 AppSpawnResult result = {};
182 ret = AppSpawnClientSendMsg(clientHandle, reqHandle, &result);
183 APPSPAWN_CHECK(ret == 0 && result.pid > 0, ret = -1;
184 break, "Failed to send MSG_SPAWN_NATIVE_PROCESS, ret %{public}d pid %{public}d", ret, result.pid);
185
186 ret = kill(result.pid, SIGKILL);
187 APPSPAWN_CHECK(ret == 0, break, "unable to kill pid %{public}d, err %{public}d", result.pid, errno);
188 } while (0);
189
190 AppSpawnClientDestroy(clientHandle);
191 ASSERT_EQ(ret, 0);
192 }
193
194 /**
195 * @brief appspawn孵化应用进程后,向appspawn发送MSG_DUMP类型的消息
196 * @note 预期结果:appspawn接收到请求消息,dump打印出appQueue等信息
197 *
198 */
199 HWTEST_F(AppSpawnServiceTest, App_Spawn_MSG_DUMP_001, TestSize.Level0)
200 {
201 int ret = 0;
202 AppSpawnClientHandle clientHandle = nullptr;
203 do {
204 ret = AppSpawnClientInit(APPSPAWN_SERVER_NAME, &clientHandle);
205 APPSPAWN_CHECK(ret == 0, break, "Failed to create client %{public}s", APPSPAWN_SERVER_NAME);
206 AppSpawnReqMsgHandle reqHandle = testServer->CreateMsg(clientHandle, MSG_APP_SPAWN, 0);
207
208 AppSpawnResult result = {};
209 ret = AppSpawnClientSendMsg(clientHandle, reqHandle, &result);
210 APPSPAWN_CHECK(ret == 0 && result.pid > 0, ret = -1;
211 break, "Failed to send MSG_APP_SPAWN, ret %{public}d pid %{public}d", ret, result.pid);
212
213 reqHandle = testServer->CreateMsg(clientHandle, MSG_DUMP, 0);
214 ret = AppSpawnClientSendMsg(clientHandle, reqHandle, &result);
215 APPSPAWN_CHECK(ret == 0, break, "Failed to send MSG_DUMP, ret %{public}d", ret);
216 } while (0);
217
218 AppSpawnClientDestroy(clientHandle);
219 ASSERT_EQ(ret, 0);
220 }
221
222 /**
223 * @brief 非开发者模式下,向appspawn发送MSG_BEGET_CMD类型的消息
224 * @note 预期结果:非开发者模式下,appspawn不支持处理该类型消息,不会根据消息中传入的pid进入应用沙箱
225 *
226 */
227 HWTEST_F(AppSpawnServiceTest, App_Spawn_MSG_BEGET_CMD_001, TestSize.Level0)
228 {
229 int ret = 0;
230 AppSpawnClientHandle clientHandle = nullptr;
231 SetDeveloperMode(false);
232 do {
233 ret = AppSpawnClientInit(APPSPAWN_SERVER_NAME, &clientHandle);
234 APPSPAWN_CHECK(ret == 0, break, "Failed to create client %{public}s", APPSPAWN_SERVER_NAME);
235 AppSpawnReqMsgHandle reqHandle = testServer->CreateMsg(clientHandle, MSG_APP_SPAWN, 0);
236
237 AppSpawnResult result = {};
238 ret = AppSpawnClientSendMsg(clientHandle, reqHandle, &result);
239 APPSPAWN_CHECK(ret == 0 && result.pid > 0, ret = -1;
240 break, "Failed to send MSG_APP_SPAWN, ret %{public}d pid %{public}d", ret, result.pid);
241
242 reqHandle = testServer->CreateMsg(clientHandle, MSG_BEGET_CMD, 0);
243 ret = AppSpawnReqMsgSetAppFlag(reqHandle, APP_FLAGS_BEGETCTL_BOOT);
244 APPSPAWN_CHECK(ret == 0, break, "Failed to set msg flag 0x%{public}x", APP_FLAGS_BEGETCTL_BOOT);
245 ret = AppSpawnReqMsgAddStringInfo(reqHandle, MSG_EXT_NAME_BEGET_PID, std::to_string(result.pid).c_str());
246 APPSPAWN_CHECK(ret == 0, break, "Failed to add MSG_EXT_NAME_BEGET_PID %{public}d", result.pid);
247 ret = AppSpawnReqMsgAddStringInfo(reqHandle, MSG_EXT_NAME_BEGET_PTY_NAME, "/dev/pts/1");
248 APPSPAWN_CHECK(ret == 0, break, "Failed to add MSG_EXT_NAME_BEGET_PTY_NAME %{public}s", "/dev/pts/1");
249
250 ret = AppSpawnClientSendMsg(clientHandle, reqHandle, &result);
251 APPSPAWN_CHECK(ret == 0 && result.result == APPSPAWN_DEBUG_MODE_NOT_SUPPORT, ret = -1;
252 break, "Failed to send MSG_BEGET_CMD, ret %{public}d result %{public}d", ret, result.result);
253 } while (0);
254
255 SetDeveloperMode(true);
256 AppSpawnClientDestroy(clientHandle);
257 ASSERT_EQ(ret, 0);
258 }
259
260 /**
261 * @brief 向appspawn发送MSG_BEGET_SPAWNTIME类型的消息
262 * @note 预期结果:appspawn接收到请求消息,获取appspawn启动时各hook执行的最小时间(result.result)和最大时间(result.pid)
263 *
264 */
265 HWTEST_F(AppSpawnServiceTest, App_Spawn_MSG_BEGET_SPAWNTIME_001, TestSize.Level0)
266 {
267 int ret = 0;
268 AppSpawnClientHandle clientHandle = nullptr;
269 int minAppspawnTime = 0;
270 int maxAppspawnTime = APPSPAWN_MAX_TIME;
271 do {
272 ret = AppSpawnClientInit(APPSPAWN_SERVER_NAME, &clientHandle);
273 APPSPAWN_CHECK(ret == 0, break, "Failed to create client %{public}s", APPSPAWN_SERVER_NAME);
274 AppSpawnReqMsgHandle reqHandle = testServer->CreateMsg(clientHandle, MSG_BEGET_SPAWNTIME, 0);
275
276 AppSpawnResult result = {};
277 ret = AppSpawnClientSendMsg(clientHandle, reqHandle, &result);
278 minAppspawnTime = result.result;
279 maxAppspawnTime = result.pid;
280 APPSPAWN_CHECK(ret == 0, break, "Failed to send MSG_BEGET_SPAWNTIME, ret %{public}d", ret);
281 } while (0);
282
283 AppSpawnClientDestroy(clientHandle);
284 EXPECT_GT(minAppspawnTime, 0);
285 EXPECT_LT(maxAppspawnTime, APPSPAWN_MAX_TIME);
286 ASSERT_EQ(ret, 0);
287 }
288
289 /**
290 * @brief 向appspawn发送MSG_UPDATE_MOUNT_POINTS类型的消息
291 * @note 预期结果:appspawn接收到请求消息,遍历沙箱包名更新挂载点
292 *
293 */
294 HWTEST_F(AppSpawnServiceTest, App_Spawn_MSG_UPDATE_MOUNT_POINTS_001, TestSize.Level0)
295 {
296 int ret = 0;
297 AppSpawnClientHandle clientHandle = nullptr;
298 do {
299 ret = AppSpawnClientInit(APPSPAWN_SERVER_NAME, &clientHandle);
300 APPSPAWN_CHECK(ret == 0, break, "Failed to create client %{public}s", APPSPAWN_SERVER_NAME);
301 AppSpawnReqMsgHandle reqHandle = testServer->CreateMsg(clientHandle, MSG_UPDATE_MOUNT_POINTS, 0);
302
303 AppSpawnResult result = {};
304 ret = AppSpawnClientSendMsg(clientHandle, reqHandle, &result);
305 APPSPAWN_CHECK(ret == 0 && result.result == 0, ret = -1;
306 break, "Failed to send MSG_UPDATE_MOUNT_POINTS, ret %{public}d result %{public}d", ret, result.result);
307 } while (0);
308
309 AppSpawnClientDestroy(clientHandle);
310 ASSERT_EQ(ret, 0);
311 }
312
313 /**
314 * @brief 向appspawn发送MSG_RESTART_SPAWNER类型的消息
315 * @note 预期结果:appspawn不支持处理该类型消息,返回APPSPAWN_MSG_INVALID
316 *
317 */
318 HWTEST_F(AppSpawnServiceTest, App_Spawn_MSG_RESTART_SPAWNER_001, TestSize.Level0)
319 {
320 int ret = 0;
321 AppSpawnClientHandle clientHandle = nullptr;
322 do {
323 ret = AppSpawnClientInit(APPSPAWN_SERVER_NAME, &clientHandle);
324 APPSPAWN_CHECK(ret == 0, break, "Failed to create client %{public}s", APPSPAWN_SERVER_NAME);
325 AppSpawnReqMsgHandle reqHandle = testServer->CreateMsg(clientHandle, MSG_RESTART_SPAWNER, 0);
326
327 AppSpawnResult result = {};
328 ret = AppSpawnClientSendMsg(clientHandle, reqHandle, &result);
329 APPSPAWN_CHECK(ret == 0 && result.result == APPSPAWN_MSG_INVALID, ret = -1;
330 break, "Failed to send MSG_RESTART_SPAWNER, ret %{public}d result %{public}d", ret, result.result);
331 } while (0);
332
333 AppSpawnClientDestroy(clientHandle);
334 ASSERT_EQ(ret, 0);
335 }
336
337 /**
338 * @brief appspawn孵化debuggable应用后,向appspawn发送MSG_DEVICE_DEBUG类型的消息
339 * @note 预期结果:appspawn接收到请求消息,根据消息中传入的debuggable应用pid和signal杀死先前孵化的应用
340 *
341 */
342 HWTEST_F(AppSpawnServiceTest, App_Spawn_MSG_DEVICE_DEBUG_001, TestSize.Level0)
343 {
344 int ret = 0;
345 AppSpawnClientHandle clientHandle = nullptr;
346 do {
347 ret = AppSpawnClientInit(APPSPAWN_SERVER_NAME, &clientHandle);
348 APPSPAWN_CHECK(ret == 0, break, "Failed to create client %{public}s", APPSPAWN_SERVER_NAME);
349 AppSpawnReqMsgHandle reqHandle = testServer->CreateMsg(clientHandle, MSG_APP_SPAWN, 0);
350 ret = AppSpawnReqMsgSetAppFlag(reqHandle, APP_FLAGS_DEBUGGABLE);
351 APPSPAWN_CHECK(ret == 0, break, "Failed to set msg flag 0x%{public}x", APP_FLAGS_DEBUGGABLE);
352
353 AppSpawnResult result = {};
354 ret = AppSpawnClientSendMsg(clientHandle, reqHandle, &result);
355 APPSPAWN_CHECK(ret == 0 && result.pid > 0, ret = -1;
356 break, "Failed to send MSG_APP_SPAWN, ret %{public}d pid %{public}d", ret, result.pid);
357
358 reqHandle = testServer->CreateMsg(clientHandle, MSG_DEVICE_DEBUG, 0);
359 char buffer[256] = {0};
360 ret = snprintf_s(buffer, sizeof(buffer), sizeof(buffer) - 1,
361 "{ \"app\": %d, \"op\": \"kill\", \"args\": { \"signal\": 9 } }", result.pid);
362 APPSPAWN_CHECK(ret > 0, ret = -1;
363 break, "Failed to snprintf_s devicedebug extra info, err %{public}d", errno);
364 ret = AppSpawnReqMsgAddStringInfo(reqHandle, "devicedebug", buffer);
365 APPSPAWN_CHECK(ret == 0, break, "Failed to add devicedebug extra info %{public}s", buffer);
366
367 ret = AppSpawnClientSendMsg(clientHandle, reqHandle, &result);
368 APPSPAWN_CHECK(ret == 0 && result.result == 0, ret = -1;
369 break, "Failed to send MSG_DEVICE_DEBUG, ret %{public}d result %{public}d", ret, result.result);
370 } while (0);
371
372 AppSpawnClientDestroy(clientHandle);
373 ASSERT_EQ(ret, 0);
374 }
375
376 /**
377 * @brief appspawn孵化非debuggable应用后,向appspawn发送MSG_DEVICE_DEBUG类型的消息
378 * @note 预期结果:appspawn接收到请求消息,但不支持向非debuggable应用发送signal
379 *
380 */
381 HWTEST_F(AppSpawnServiceTest, App_Spawn_MSG_DEVICE_DEBUG_002, TestSize.Level0)
382 {
383 int ret = 0;
384 AppSpawnClientHandle clientHandle = nullptr;
385 do {
386 ret = AppSpawnClientInit(APPSPAWN_SERVER_NAME, &clientHandle);
387 APPSPAWN_CHECK(ret == 0, break, "Failed to create client %{public}s", APPSPAWN_SERVER_NAME);
388 AppSpawnReqMsgHandle reqHandle = testServer->CreateMsg(clientHandle, MSG_APP_SPAWN, 0);
389
390 AppSpawnResult result = {};
391 ret = AppSpawnClientSendMsg(clientHandle, reqHandle, &result);
392 APPSPAWN_CHECK(ret == 0 && result.pid > 0, ret = -1;
393 break, "Failed to send MSG_APP_SPAWN, ret %{public}d pid %{public}d", ret, result.pid);
394
395 reqHandle = testServer->CreateMsg(clientHandle, MSG_DEVICE_DEBUG, 0);
396 char buffer[256] = {0};
397 ret = snprintf_s(buffer, sizeof(buffer), sizeof(buffer) - 1,
398 "{ \"app\": %d, \"op\": \"kill\", \"args\": { \"signal\": 9 } }", result.pid);
399 APPSPAWN_CHECK(ret > 0, ret = -1;
400 break, "Failed to snprintf_s devicedebug extra info, err %{public}d", errno);
401 ret = AppSpawnReqMsgAddStringInfo(reqHandle, "devicedebug", buffer);
402 APPSPAWN_CHECK(ret == 0, break, "Failed to add devicedebug extra info %{public}s", buffer);
403
404 ret = AppSpawnClientSendMsg(clientHandle, reqHandle, &result);
405 APPSPAWN_CHECK(ret == 0 && result.result == APPSPAWN_DEVICEDEBUG_ERROR_APP_NOT_DEBUGGABLE, ret = -1;
406 break, "Failed to send MSG_DEVICE_DEBUG, ret %{public}d result %{public}d", ret, result.result);
407 } while (0);
408
409 AppSpawnClientDestroy(clientHandle);
410 ASSERT_EQ(ret, 0);
411 }
412
413 /**
414 * @brief appspawn孵化带debug沙箱的应用后,向appspawn发送MSG_UNINSTALL_DEBUG_HAP类型的消息
415 * @note 预期结果:appspawn接收到请求消息,卸载掉指定用户下的所有debug沙箱
416 *
417 */
418 HWTEST_F(AppSpawnServiceTest, App_Spawn_MSG_UNINSTALL_DEBUG_HAP_001, TestSize.Level0)
419 {
420 int ret = 0;
421 AppSpawnClientHandle clientHandle = nullptr;
422 do {
423 ret = AppSpawnClientInit(APPSPAWN_SERVER_NAME, &clientHandle);
424 APPSPAWN_CHECK(ret == 0, break, "Failed to create client %{public}s", APPSPAWN_SERVER_NAME);
425 AppSpawnReqMsgHandle reqHandle = testServer->CreateMsg(clientHandle, MSG_APP_SPAWN, 0);
426 ret = AppSpawnReqMsgAddStringInfo(reqHandle, MSG_EXT_NAME_PROVISION_TYPE, "debug");
427 APPSPAWN_CHECK(ret == 0, break, "Failed to add MSG_EXT_NAME_PROVISION_TYPE %{public}s", "debug");
428
429 AppSpawnResult result = {};
430 ret = AppSpawnClientSendMsg(clientHandle, reqHandle, &result);
431 APPSPAWN_CHECK(ret == 0 && result.pid > 0, ret = -1;
432 break, "Failed to send MSG_APP_SPAWN, ret %{public}d pid %{public}d", ret, result.pid);
433
434 reqHandle = testServer->CreateMsg(clientHandle, MSG_UNINSTALL_DEBUG_HAP, 0);
435 ret = AppSpawnReqMsgAddStringInfo(reqHandle, MSG_EXT_NAME_USERID, "100");
436 APPSPAWN_CHECK(ret == 0, break, "Failed to add MSG_EXT_NAME_USERID %{public}s", "100");
437
438 ret = AppSpawnClientSendMsg(clientHandle, reqHandle, &result);
439 APPSPAWN_CHECK(ret == 0 && result.result == 0, ret = -1;
440 break, "Failed to send MSG_UNINSTALL_DEBUG_HAP, ret %{public}d result %{public}d", ret, result.result);
441 } while (0);
442
443 AppSpawnClientDestroy(clientHandle);
444 ASSERT_EQ(ret, 0);
445 }
446
447 /**
448 * @brief 向appspawn发送MSG_LOCK_STATUS类型的消息
449 * @note 预期结果:appspawn接收到请求消息,根据消息中的传入的解锁状态对lockstatus参数进行设值
450 *
451 */
452 HWTEST_F(AppSpawnServiceTest, App_Spawn_MSG_LOCK_STATUS_001, TestSize.Level0)
453 {
454 int ret = 0;
455 AppSpawnClientHandle clientHandle = nullptr;
456 do {
457 ret = AppSpawnClientInit(APPSPAWN_SERVER_NAME, &clientHandle);
458 APPSPAWN_CHECK(ret == 0, break, "Failed to create client %{public}s", APPSPAWN_SERVER_NAME);
459 AppSpawnReqMsgHandle reqHandle = testServer->CreateMsg(clientHandle, MSG_LOCK_STATUS, 0);
460
461 char lockstatus[8] = {0};
462 ret = snprintf_s(lockstatus, sizeof(lockstatus), sizeof(lockstatus) - 1, "%u:%d", 100, 0);
463 APPSPAWN_CHECK(ret > 0, ret = -1;
464 break, "Failed to snprintf_s lockstatus extra info, err %{public}d", errno);
465 ret = AppSpawnReqMsgAddStringInfo(reqHandle, "lockstatus", lockstatus);
466 APPSPAWN_CHECK(ret == 0, break, "Failed to add lockstatus extra info %{public}s", lockstatus);
467
468 AppSpawnResult result = {};
469 ret = AppSpawnClientSendMsg(clientHandle, reqHandle, &result);
470 APPSPAWN_CHECK(ret == 0 && result.result == 0, ret = -1;
471 break, "Failed to send MSG_LOCK_STATUS, ret %{public}d result %{public}d", ret, result.result);
472 } while (0);
473
474 AppSpawnClientDestroy(clientHandle);
475 ASSERT_EQ(ret, 0);
476 }
477
478 /**
479 * @brief 向appspawn发送MAX_TYPE_INVALID类型的消息
480 * @note 预期结果:不支持创建该类型消息,发送失败,appspawn接收不到该消息请求
481 *
482 */
483 HWTEST_F(AppSpawnServiceTest, App_Spawn_MAX_TYPE_INVALID_001, TestSize.Level0)
484 {
485 int ret = 0;
486 AppSpawnClientHandle clientHandle = nullptr;
487 do {
488 ret = AppSpawnClientInit(APPSPAWN_SERVER_NAME, &clientHandle);
489 APPSPAWN_CHECK(ret == 0, break, "Failed to create client %{public}s", APPSPAWN_SERVER_NAME);
490 AppSpawnReqMsgHandle reqHandle = testServer->CreateMsg(clientHandle, MAX_TYPE_INVALID, 0);
491
492 AppSpawnResult result = {};
493 ret = AppSpawnClientSendMsg(clientHandle, reqHandle, &result);
494 APPSPAWN_CHECK(ret == APPSPAWN_ARG_INVALID, break, "Failed to send MAX_TYPE_INVALID, ret %{public}d", ret);
495 } while (0);
496
497 AppSpawnClientDestroy(clientHandle);
498 ASSERT_EQ(ret, APPSPAWN_ARG_INVALID);
499 }
500
501 HWTEST_F(AppSpawnServiceTest, App_Spawn_Msg_001, TestSize.Level0)
502 {
503 int ret = -1;
504 int socketId = -1;
505 // 没有tlv的消息,返回错误
506 do {
507 socketId = testServer->CreateSocket();
508 APPSPAWN_CHECK(socketId >= 0, break, "Failed to create socket %{public}s", APPSPAWN_SERVER_NAME);
509
510 std::vector<uint8_t> buffer(sizeof(AppSpawnResponseMsg));
511 uint32_t msgLen = 0;
512 ret = testServer->CreateSendMsg(buffer, MSG_APP_SPAWN, msgLen, {});
513 APPSPAWN_CHECK(ret == 0, break, "Failed to create msg %{public}s", testServer->GetDefaultTestAppBundleName());
514
515 int len = write(socketId, buffer.data(), msgLen);
516 APPSPAWN_CHECK(len > 0, break, "Failed to send msg %{public}s", testServer->GetDefaultTestAppBundleName());
517 // recv
518 APPSPAWN_LOGV("Start recv ... ");
519 len = read(socketId, buffer.data(), buffer.size());
520 APPSPAWN_CHECK(len >= static_cast<int>(sizeof(AppSpawnResponseMsg)), ret = -1;
521 break, "Failed to recv msg errno: %{public}d", errno);
522 AppSpawnResponseMsg *respMsg = reinterpret_cast<AppSpawnResponseMsg *>(buffer.data());
523 APPSPAWN_LOGV("Recv msg %{public}s result: %{public}d", respMsg->msgHdr.processName, respMsg->result.result);
524 ret = respMsg->result.result;
525 } while (0);
526 if (socketId >= 0) {
527 CloseClientSocket(socketId);
528 }
529 ASSERT_NE(ret, 0);
530 }
531
RecvMsg(int socketId,uint8_t * buffer,uint32_t buffSize)532 static int RecvMsg(int socketId, uint8_t *buffer, uint32_t buffSize)
533 {
534 ssize_t rLen = TEMP_FAILURE_RETRY(read(socketId, buffer, buffSize));
535 return static_cast<int>(rLen);
536 }
537
538 /**
539 * @brief 消息不完整,断开连接
540 *
541 */
542 HWTEST_F(AppSpawnServiceTest, App_Spawn_Msg_002, TestSize.Level0)
543 {
544 int ret = 0;
545 int socketId = -1;
546 do {
547 socketId = testServer->CreateSocket();
548 APPSPAWN_CHECK(socketId >= 0, break, "Failed to create socket %{public}s", APPSPAWN_SERVER_NAME);
549
550 std::vector<uint8_t> buffer(sizeof(AppSpawnResponseMsg));
551 uint32_t msgLen = 0;
552 ret = testServer->CreateSendMsg(buffer, MSG_APP_SPAWN, msgLen, {});
553 APPSPAWN_CHECK(ret == 0, break, "Failed to create msg %{public}s", testServer->GetDefaultTestAppBundleName());
554
555 ret = -1;
556 int len = write(socketId, buffer.data(), msgLen - 10); // 10
557 APPSPAWN_CHECK(len > 0, break, "Failed to send msg %{public}s", testServer->GetDefaultTestAppBundleName());
558 // recv timeout
559 len = RecvMsg(socketId, buffer.data(), buffer.size());
560 APPSPAWN_CHECK(len <= 0, break, "Failed to recv msg len: %{public}d", len);
561 ret = 0;
562 } while (0);
563 if (socketId >= 0) {
564 CloseClientSocket(socketId);
565 }
566 ASSERT_EQ(ret, 0);
567 }
568
569 /**
570 * @brief 测试异常tlv
571 *
572 */
573 HWTEST_F(AppSpawnServiceTest, App_Spawn_Msg_003, TestSize.Level0)
574 {
575 int ret = -1;
576 int socketId = -1;
577 do {
578 socketId = testServer->CreateSocket();
579 APPSPAWN_CHECK(socketId >= 0, break, "Failed to create socket %{public}s", APPSPAWN_SERVER_NAME);
580
581 std::vector<uint8_t> buffer(sizeof(AppSpawnResponseMsg));
582 uint32_t msgLen = 0;
583 ret = testServer->CreateSendMsg(buffer, MSG_APP_SPAWN, msgLen, {});
584 APPSPAWN_CHECK(ret == 0, break, "Failed to create msg %{public}s", testServer->GetDefaultTestAppBundleName());
585
586 int len = write(socketId, buffer.data(), msgLen);
587 APPSPAWN_CHECK(len > 0, break, "Failed to send msg %{public}s", testServer->GetDefaultTestAppBundleName());
588 // recv
589 len = RecvMsg(socketId, buffer.data(), buffer.size());
590 APPSPAWN_CHECK(len >= static_cast<int>(sizeof(AppSpawnResponseMsg)), ret = -1;
591 break, "Failed to recv msg %{public}s", APPSPAWN_SERVER_NAME);
592 AppSpawnResponseMsg *respMsg = reinterpret_cast<AppSpawnResponseMsg *>(buffer.data());
593 APPSPAWN_LOGV("Recv msg %{public}s result: %{public}d", respMsg->msgHdr.processName, respMsg->result.result);
594 ret = respMsg->result.result == APPSPAWN_MSG_INVALID ? 0 : -1;
595 } while (0);
596 if (socketId >= 0) {
597 CloseClientSocket(socketId);
598 }
599 ASSERT_EQ(ret, 0);
600 }
601
602 /**
603 * @brief 测试小包发送,随机获取发送大小,发送数据。消息20时,按33发送
604 *
605 */
606 HWTEST_F(AppSpawnServiceTest, App_Spawn_Msg_004, TestSize.Level0)
607 {
608 int ret = -1;
609 int socketId = -1;
610 do {
611 socketId = testServer->CreateSocket();
612 APPSPAWN_CHECK(socketId >= 0, break, "Failed to create socket %{public}s", APPSPAWN_SERVER_NAME);
613
614 std::vector<uint8_t> buffer(1024, 0); // 1024 1k
615 uint32_t msgLen = 0;
616 ret = testServer->CreateSendMsg(buffer, MSG_APP_SPAWN, msgLen, {AppSpawnTestHelper::AddBaseTlv});
617 APPSPAWN_CHECK(ret == 0, break, "Failed to create msg %{public}s", testServer->GetDefaultTestAppBundleName());
618
619 // 分片发送
620 uint32_t sendStep = OHOS::AppSpawnTestHelper::GenRandom() % 70; // 70 一次发送的字节数
621 sendStep = (sendStep < 20) ? 33 : sendStep; // 20 33 一次发送的字节数
622 APPSPAWN_LOGV("App_Spawn_Msg_004 msgLen %{public}u sendStep: %{public}u", msgLen, sendStep);
623 uint32_t currIndex = 0;
624 int len = 0;
625 do {
626 if ((currIndex + sendStep) > msgLen) {
627 break;
628 }
629 len = write(socketId, buffer.data() + currIndex, sendStep);
630 APPSPAWN_CHECK(len > 0, break, "Failed to send %{public}s", testServer->GetDefaultTestAppBundleName());
631 usleep(2000); // wait recv
632 currIndex += sendStep;
633 } while (1);
634 APPSPAWN_CHECK(len > 0, break, "Failed to send %{public}s", testServer->GetDefaultTestAppBundleName());
635 if (msgLen > currIndex) {
636 len = write(socketId, buffer.data() + currIndex, msgLen - currIndex);
637 APPSPAWN_CHECK(len > 0, break, "Failed to send %{public}s", testServer->GetDefaultTestAppBundleName());
638 }
639
640 // recv
641 len = RecvMsg(socketId, buffer.data(), buffer.size());
642 APPSPAWN_CHECK(len >= static_cast<int>(sizeof(AppSpawnResponseMsg)), ret = -1;
643 break, "Failed to recv msg %{public}s", APPSPAWN_SERVER_NAME);
644 AppSpawnResponseMsg *respMsg = reinterpret_cast<AppSpawnResponseMsg *>(buffer.data());
645 APPSPAWN_LOGV("App_Spawn_Msg_004 recv msg %{public}s result: %{public}d",
646 respMsg->msgHdr.processName, respMsg->result.result);
647 ret = respMsg->result.result;
648 } while (0);
649 if (socketId >= 0) {
650 CloseClientSocket(socketId);
651 }
652 ASSERT_EQ(ret, 0);
653 }
654
655 /**
656 * @brief 测试2个消息一起发送
657 *
658 */
659 HWTEST_F(AppSpawnServiceTest, App_Spawn_Msg_005, TestSize.Level0)
660 {
661 int ret = -1;
662 int socketId = -1;
663 do {
664 socketId = testServer->CreateSocket();
665 APPSPAWN_CHECK(socketId >= 0, break, "Failed to create socket %{public}s", APPSPAWN_SERVER_NAME);
666
667 std::vector<uint8_t> buffer1(1024); // 1024
668 std::vector<uint8_t> buffer2(1024); // 1024
669 uint32_t msgLen1 = 0;
670 uint32_t msgLen2 = 0;
671 ret = testServer->CreateSendMsg(buffer1, MSG_APP_SPAWN, msgLen1, {AppSpawnTestHelper::AddBaseTlv});
672 APPSPAWN_CHECK(ret == 0, break, "Failed to create msg %{public}s", testServer->GetDefaultTestAppBundleName());
673 ret = testServer->CreateSendMsg(buffer2, MSG_APP_SPAWN, msgLen2, {AppSpawnTestHelper::AddBaseTlv});
674 APPSPAWN_CHECK(ret == 0, break, "Failed to create msg %{public}s", testServer->GetDefaultTestAppBundleName());
675
676 buffer1.insert(buffer1.begin() + msgLen1, buffer2.begin(), buffer2.end());
677 int len = write(socketId, buffer1.data(), msgLen1 + msgLen2);
678 APPSPAWN_CHECK(len > 0, break, "Failed to send msg %{public}s", testServer->GetDefaultTestAppBundleName());
679 // recv
680 sleep(2);
681 len = RecvMsg(socketId, buffer2.data(), buffer2.size());
682 APPSPAWN_CHECK(len >= static_cast<int>(sizeof(AppSpawnResponseMsg)), ret = -1;
683 break, "Failed to recv msg %{public}s", APPSPAWN_SERVER_NAME);
684 AppSpawnResponseMsg *respMsg = reinterpret_cast<AppSpawnResponseMsg *>(buffer2.data());
685 APPSPAWN_LOGV("App_Spawn_Msg_005 Recv msg %{public}s result: %{public}d",
686 respMsg->msgHdr.processName, respMsg->result.result);
687 ret = respMsg->result.result;
688 (void)RecvMsg(socketId, buffer2.data(), buffer2.size());
689 } while (0);
690 ret = 0; // test for case
691 if (socketId >= 0) {
692 CloseClientSocket(socketId);
693 }
694 ASSERT_EQ(ret, 0);
695 }
696
697 /**
698 * @brief 测试连续2个消息,spawn和dump 消息
699 *
700 */
701 HWTEST_F(AppSpawnServiceTest, App_Spawn_Msg_006, TestSize.Level0)
702 {
703 int ret = -1;
704 int socketId = -1;
705 do {
706 socketId = testServer->CreateSocket();
707 APPSPAWN_CHECK(socketId >= 0, break, "Failed to create socket %{public}s", APPSPAWN_SERVER_NAME);
708
709 std::vector<uint8_t> buffer1(2 * 1024); // 2 * 1024
710 std::vector<uint8_t> buffer2(1024); // 1024
711 uint32_t msgLen1 = 0;
712 uint32_t msgLen2 = 0;
713 ret = testServer->CreateSendMsg(buffer1, MSG_APP_SPAWN, msgLen1, {AppSpawnTestHelper::AddBaseTlv});
714 APPSPAWN_CHECK(ret == 0, break, "Failed to create msg %{public}s", testServer->GetDefaultTestAppBundleName());
715 ret = testServer->CreateSendMsg(buffer2, MSG_DUMP, msgLen2, {});
716 APPSPAWN_CHECK(ret == 0, break, "Failed to create msg %{public}s", testServer->GetDefaultTestAppBundleName());
717
718 buffer1.insert(buffer1.begin() + msgLen1, buffer2.begin(), buffer2.end());
719 int len = write(socketId, buffer1.data(), msgLen1 + msgLen2);
720 APPSPAWN_CHECK(len > 0, break, "Failed to send msg %{public}s", testServer->GetDefaultTestAppBundleName());
721 // recv
722 len = RecvMsg(socketId, buffer2.data(), buffer2.size());
723 APPSPAWN_CHECK(len >= static_cast<int>(sizeof(AppSpawnResponseMsg)), ret = -1;
724 break, "Failed to recv msg %{public}s", APPSPAWN_SERVER_NAME);
725 AppSpawnResponseMsg *respMsg = reinterpret_cast<AppSpawnResponseMsg *>(buffer2.data());
726 APPSPAWN_LOGV("App_Spawn_Msg_006 recv msg %{public}s result: %{public}d",
727 respMsg->msgHdr.processName, respMsg->result.result);
728 ret = respMsg->result.result;
729 (void)RecvMsg(socketId, buffer2.data(), buffer2.size());
730 } while (0);
731 if (socketId >= 0) {
732 CloseClientSocket(socketId);
733 }
734 ASSERT_EQ(ret, 0);
735 }
736
737 /**
738 * @brief 测试连接中断
739 *
740 */
741 HWTEST_F(AppSpawnServiceTest, App_Spawn_Msg_007, TestSize.Level0)
742 {
743 int ret = -1;
744 int socketId = -1;
745 do {
746 socketId = testServer->CreateSocket();
747 APPSPAWN_CHECK(socketId >= 0, break, "Failed to create socket %{public}s", APPSPAWN_SERVER_NAME);
748 std::vector<uint8_t> buffer(1024, 0); // 1024 1k
749 uint32_t msgLen = 0;
750 ret = testServer->CreateSendMsg(buffer, MSG_APP_SPAWN, msgLen, {AppSpawnTestHelper::AddBaseTlv});
751 APPSPAWN_CHECK(ret == 0, break, "Failed to create msg %{public}s", testServer->GetDefaultTestAppBundleName());
752
753 int len = write(socketId, buffer.data(), msgLen);
754 APPSPAWN_CHECK(len > 0, break, "Failed to send msg %{public}s", testServer->GetDefaultTestAppBundleName());
755 // close socket
756 APPSPAWN_LOGV("CloseClientSocket");
757 CloseClientSocket(socketId);
758 socketId = -1;
759 } while (0);
760 if (socketId >= 0) {
761 CloseClientSocket(socketId);
762 }
763 ASSERT_EQ(ret, 0);
764 }
765
766 /**
767 * @brief 发送不完整报文,等待超时
768 *
769 */
770 HWTEST_F(AppSpawnServiceTest, App_Spawn_Msg_008, TestSize.Level0)
771 {
772 int ret = 0;
773 int socketId = -1;
774 do {
775 socketId = testServer->CreateSocket();
776 APPSPAWN_CHECK(socketId >= 0, break, "Failed to create socket %{public}s", APPSPAWN_SERVER_NAME);
777 std::vector<uint8_t> buffer(1024, 0); // 1024 1k
778 uint32_t msgLen = 0;
779 ret = testServer->CreateSendMsg(buffer, MSG_APP_SPAWN, msgLen, {AppSpawnTestHelper::AddBaseTlv});
780 APPSPAWN_CHECK(ret == 0, break, "Failed to create msg %{public}s", testServer->GetDefaultTestAppBundleName());
781 int len = write(socketId, buffer.data(), msgLen - 20); // 20 test
782 APPSPAWN_CHECK(len > 0, break, "Failed to send msg %{public}s", testServer->GetDefaultTestAppBundleName());
783 // recv
784 len = read(socketId, buffer.data(), buffer.size()); // timeout EAGAIN
785 APPSPAWN_CHECK(len <= 0, ret = -1; break, "Can not receive timeout %{public}d", errno);
786 } while (0);
787 if (socketId >= 0) {
788 CloseClientSocket(socketId);
789 }
790 ASSERT_EQ(ret, 0);
791 }
792
793 HWTEST_F(AppSpawnServiceTest, App_Spawn_Msg_009, TestSize.Level0)
794 {
795 int ret = 0;
796 AppSpawnClientHandle clientHandle = nullptr;
797 AppSpawnResult result = {};
798 do {
799 ret = AppSpawnClientInit(APPSPAWN_SERVER_NAME, &clientHandle);
800 APPSPAWN_CHECK(ret == 0, break, "Failed to create client %{public}s", APPSPAWN_SERVER_NAME);
801 AppSpawnReqMsgHandle reqHandle = testServer->CreateMsg(clientHandle, MSG_SPAWN_NATIVE_PROCESS, 0);
802
803 AppSpawnReqMsgSetAppFlag(reqHandle, APP_FLAGS_NATIVEDEBUG);
804 AppSpawnReqMsgSetAppFlag(reqHandle, APP_FLAGS_BUNDLE_RESOURCES);
805 AppSpawnReqMsgSetAppFlag(reqHandle, APP_FLAGS_ACCESS_BUNDLE_DIR);
806
807 ret = AppSpawnClientSendMsg(clientHandle, reqHandle, &result);
808 APPSPAWN_CHECK(ret == 0, break, "Failed to send msg %{public}d", ret);
809
810 AppSpawnedProcess *app = GetSpawnedProcessByName(testServer->GetDefaultTestAppBundleName());
811 ASSERT_NE(app, nullptr);
812
813 AppSpawnReqMsgHandle reqHandle2;
814 ret = AppSpawnReqMsgCreate(MSG_DEVICE_DEBUG, "devicedebug", &reqHandle2);
815 cJSON *args = cJSON_CreateObject();
816 ASSERT_NE(args, nullptr);
817 cJSON_AddNumberToObject(args, "signal", 9);
818 cJSON *root = cJSON_CreateObject();
819 ASSERT_NE(root, nullptr);
820 cJSON_AddNumberToObject(root, "app", app->pid);
821 cJSON_AddStringToObject(root, "op", "kill");
822 cJSON_AddItemToObject(root, "args", args);
823 char *jsonString = cJSON_Print(root);
824 cJSON_Delete(root);
825 ret = AppSpawnReqMsgAddExtInfo(reqHandle2, "devicedebug", (uint8_t *)jsonString, strlen(jsonString) + 1);
826 ASSERT_EQ(ret, 0);
827 ret = AppSpawnClientSendMsg(clientHandle, reqHandle2, &result);
828 AppSpawnClientDestroy(clientHandle);
829 free(jsonString);
830 APPSPAWN_CHECK(ret == 0 && result.result == 0, break, "Failed to send msg ret:%{public}d, result:%{public}d",
831 ret, result.result);
832 ASSERT_EQ(kill(app->pid, SIGKILL), 0);
833 } while (0);
834
835 ASSERT_EQ(ret, 0);
836 ASSERT_EQ(result.result, APPSPAWN_DEVICEDEBUG_ERROR_APP_NOT_DEBUGGABLE);
837 }
838
839 HWTEST_F(AppSpawnServiceTest, App_Spawn_Msg_010, TestSize.Level0)
840 {
841 int ret = 0;
842 AppSpawnClientHandle clientHandle = nullptr;
843 AppSpawnResult result = {};
844 do {
845 ret = AppSpawnClientInit(APPSPAWN_SERVER_NAME, &clientHandle);
846 APPSPAWN_CHECK(ret == 0, break, "Failed to create client %{public}s", APPSPAWN_SERVER_NAME);
847 AppSpawnReqMsgHandle reqHandle = testServer->CreateMsg(clientHandle, MSG_SPAWN_NATIVE_PROCESS, 0);
848
849 AppSpawnReqMsgSetAppFlag(reqHandle, APP_FLAGS_DEBUGGABLE);
850 AppSpawnReqMsgSetAppFlag(reqHandle, APP_FLAGS_NATIVEDEBUG);
851 AppSpawnReqMsgSetAppFlag(reqHandle, APP_FLAGS_BUNDLE_RESOURCES);
852 AppSpawnReqMsgSetAppFlag(reqHandle, APP_FLAGS_ACCESS_BUNDLE_DIR);
853
854 ret = AppSpawnClientSendMsg(clientHandle, reqHandle, &result);
855 APPSPAWN_CHECK(ret == 0, break, "Failed to send msg %{public}d", ret);
856
857 AppSpawnedProcess *app = GetSpawnedProcessByName(testServer->GetDefaultTestAppBundleName());
858 ASSERT_NE(app, nullptr);
859
860 AppSpawnReqMsgHandle reqHandle2;
861 ret = AppSpawnReqMsgCreate(MSG_DEVICE_DEBUG, "devicedebug", &reqHandle2);
862 cJSON *args = cJSON_CreateObject();
863 ASSERT_NE(args, nullptr);
864 cJSON_AddNumberToObject(args, "signal", 9);
865 cJSON *root = cJSON_CreateObject();
866 ASSERT_NE(root, nullptr);
867 cJSON_AddNumberToObject(root, "app", app->pid);
868 cJSON_AddStringToObject(root, "op", "kill");
869 cJSON_AddItemToObject(root, "args", args);
870 char *jsonString = cJSON_Print(root);
871 cJSON_Delete(root);
872 ret = AppSpawnReqMsgAddExtInfo(reqHandle2, "devicedebug", (uint8_t *)jsonString, strlen(jsonString) + 1);
873 ASSERT_EQ(ret, 0);
874 ret = AppSpawnClientSendMsg(clientHandle, reqHandle2, &result);
875 AppSpawnClientDestroy(clientHandle);
876 free(jsonString);
877 APPSPAWN_CHECK(ret == 0 && result.result == 0, break, "Failed to send msg ret:%{public}d, result:%{public}d",
878 ret, result.result);
879 } while (0);
880
881 ASSERT_EQ(ret, 0);
882 ASSERT_EQ(result.result, 0);
883 }
884
885 HWTEST_F(AppSpawnServiceTest, App_Spawn_Msg_011, TestSize.Level0)
886 {
887 int ret = 0;
888 AppSpawnClientHandle clientHandle = nullptr;
889 AppSpawnResult result = {};
890 do {
891 int pipefd[2]; // 2 pipe fd
892 char buffer[1024]; //1024 1k
893 APPSPAWN_CHECK(pipe(pipefd) == 0, break, "Failed to pipe fd errno:%{public}d", errno);
894 ret = SpawnListenFdSet(pipefd[0]);
895
896 ret = AppSpawnClientInit(APPSPAWN_SERVER_NAME, &clientHandle);
897 APPSPAWN_CHECK(ret == 0, break, "Failed to create client %{public}s", APPSPAWN_SERVER_NAME);
898 AppSpawnReqMsgHandle reqHandle = testServer->CreateMsg(clientHandle, MSG_APP_SPAWN, 0);
899
900 AppSpawnReqMsgSetAppFlag(reqHandle, APP_FLAGS_DEBUGGABLE);
901 AppSpawnReqMsgSetAppFlag(reqHandle, APP_FLAGS_NATIVEDEBUG);
902 AppSpawnReqMsgSetAppFlag(reqHandle, APP_FLAGS_BUNDLE_RESOURCES);
903 AppSpawnReqMsgSetAppFlag(reqHandle, APP_FLAGS_ACCESS_BUNDLE_DIR);
904
905 ret = AppSpawnClientSendMsg(clientHandle, reqHandle, &result);
906 APPSPAWN_CHECK(ret == 0, break, "Failed to send msg %{public}d", ret);
907 AppSpawnClientDestroy(clientHandle);
908 sleep(1); // wait child process stand up
909
910 AppSpawnedProcess *app = GetSpawnedProcessByName(testServer->GetDefaultTestAppBundleName());
911 ASSERT_NE(app, nullptr);
912 char commamd[16]; // command len 16
913 APPSPAWN_CHECK(sprintf_s(commamd, 16, "kill -9 %d", app->pid) > 0, break, "sprintf command unsuccess");
914 system(commamd);
915
916 bool isFind = false;
917 int count = 0;
918 while (count < 10) {
919 if (read(pipefd[1], buffer, sizeof(buffer)) <= 0) {
920 count++;
921 continue;
922 }
923 if (strstr(buffer, std::to_string(app->pid).c_str()) != NULL) {
924 isFind = true;
925 break;
926 }
927 count++;
928 }
929 close(pipefd[0]);
930 close(pipefd[1]);
931 ASSERT_EQ(isFind, false);
932 SpawnListenCloseSet();
933 } while (0);
934 }
935
936 HWTEST_F(AppSpawnServiceTest, App_Spawn_Msg_012, TestSize.Level0)
937 {
938 int ret = 0;
939 AppSpawnClientHandle clientHandle = nullptr;
940 AppSpawnResult result = {};
941 do {
942 int pipefd[2]; // 2 pipe fd
943 char buffer[1024]; //1024 1k
944 APPSPAWN_CHECK(pipe(pipefd) == 0, break, "Failed to pipe fd errno:%{public}d", errno);
945 ret = SpawnListenFdSet(pipefd[1]);
946
947 ret = AppSpawnClientInit(APPSPAWN_SERVER_NAME, &clientHandle);
948 APPSPAWN_CHECK(ret == 0, break, "Failed to create client %{public}s", APPSPAWN_SERVER_NAME);
949 AppSpawnReqMsgHandle reqHandle = testServer->CreateMsg(clientHandle, MSG_APP_SPAWN, 0);
950
951 AppSpawnReqMsgSetAppFlag(reqHandle, APP_FLAGS_DEBUGGABLE);
952 AppSpawnReqMsgSetAppFlag(reqHandle, APP_FLAGS_NATIVEDEBUG);
953 AppSpawnReqMsgSetAppFlag(reqHandle, APP_FLAGS_BUNDLE_RESOURCES);
954 AppSpawnReqMsgSetAppFlag(reqHandle, APP_FLAGS_ACCESS_BUNDLE_DIR);
955
956 ret = AppSpawnClientSendMsg(clientHandle, reqHandle, &result);
957 APPSPAWN_CHECK(ret == 0, break, "Failed to send msg %{public}d", ret);
958 AppSpawnClientDestroy(clientHandle);
959 sleep(1); // wait child process stand up
960
961 AppSpawnedProcess *app = GetSpawnedProcessByName(testServer->GetDefaultTestAppBundleName());
962 ASSERT_NE(app, nullptr);
963 char commamd[16]; // command len 16
964 APPSPAWN_CHECK(sprintf_s(commamd, 16, "kill -9 %d", app->pid) > 0, break, "sprintf command unsuccess");
965 system(commamd);
966
967 bool isFind = false;
968 int count = 0;
969 while (count < 10) {
970 if (read(pipefd[0], buffer, sizeof(buffer)) <= 0) {
971 count++;
972 continue;
973 }
974 if (strstr(buffer, std::to_string(app->pid).c_str()) != NULL) {
975 isFind = true;
976 break;
977 }
978 count++;
979 }
980 close(pipefd[0]);
981 close(pipefd[1]);
982 ASSERT_EQ(isFind, true);
983 SpawnListenCloseSet();
984 } while (0);
985 }
986
987 /**
988 * @brief 测试子进程退出时,nativespawn通过fd中发送子进程退出状态,发送失败
989 *
990 */
991 HWTEST_F(AppSpawnServiceTest, App_Spawn_Msg_013, TestSize.Level0)
992 {
993 int ret = 0;
994 AppSpawnClientHandle clientHandle = nullptr;
995 AppSpawnResult result = {};
996 do {
997 int pipefd[2]; // 2 pipe fd
998 char buffer[1024]; // 1024 1k
999 APPSPAWN_CHECK(pipe(pipefd) == 0, break, "Failed to pipe fd errno:%{public}d", errno);
1000 ret = NativeSpawnListenFdSet(pipefd[0]);
1001
1002 ret = AppSpawnClientInit(NATIVESPAWN_SERVER_NAME, &clientHandle);
1003 APPSPAWN_CHECK(ret == 0, break, "Failed to create client %{public}s", NATIVESPAWN_SERVER_NAME);
1004 AppSpawnReqMsgHandle reqHandle = testServer->CreateMsg(clientHandle, MSG_APP_SPAWN, 0);
1005
1006 ret = AppSpawnClientSendMsg(clientHandle, reqHandle, &result);
1007 APPSPAWN_CHECK(ret == 0, break, "Failed to send msg %{public}d", ret);
1008 AppSpawnClientDestroy(clientHandle);
1009 sleep(1); // wait child process stand up
1010
1011 AppSpawnedProcess *app = GetSpawnedProcessByName(testServer->GetDefaultTestAppBundleName());
1012 ASSERT_NE(app, nullptr);
1013 char commamd[16]; // command len 16
1014 APPSPAWN_CHECK(sprintf_s(commamd, 16, "kill -9 %d", app->pid) > 0, break, "sprintf command unsuccess");
1015 system(commamd);
1016
1017 bool isFind = false;
1018 int count = 0;
1019 while (count < 10) {
1020 if (read(pipefd[1], buffer, sizeof(buffer)) <= 0) {
1021 count++;
1022 continue;
1023 }
1024 if (strstr(buffer, std::to_string(app->pid).c_str()) != NULL) {
1025 isFind = true;
1026 break;
1027 }
1028 count++;
1029 }
1030 close(pipefd[0]);
1031 close(pipefd[1]);
1032 ASSERT_EQ(isFind, false);
1033 NativeSpawnListenCloseSet();
1034 } while (0);
1035 }
1036
1037 /**
1038 * @brief 测试子进程退出时,nativespawn通过fd中发送子进程退出状态,发送成功
1039 *
1040 */
1041 HWTEST_F(AppSpawnServiceTest, App_Spawn_Msg_014, TestSize.Level0)
1042 {
1043 int ret = 0;
1044 AppSpawnClientHandle clientHandle = nullptr;
1045 AppSpawnResult result = {};
1046 do {
1047 int pipefd[2]; // 2 pipe fd
1048 char buffer[1024]; // 1024 1k
1049 APPSPAWN_CHECK(pipe(pipefd) == 0, break, "Failed to pipe fd errno:%{public}d", errno);
1050 ret = NativeSpawnListenFdSet(pipefd[1]);
1051
1052 ret = AppSpawnClientInit(NATIVESPAWN_SERVER_NAME, &clientHandle);
1053 APPSPAWN_CHECK(ret == 0, break, "Failed to create client %{public}s", NATIVESPAWN_SERVER_NAME);
1054 AppSpawnReqMsgHandle reqHandle = testServer->CreateMsg(clientHandle, MSG_APP_SPAWN, 0);
1055
1056 ret = AppSpawnClientSendMsg(clientHandle, reqHandle, &result);
1057 APPSPAWN_CHECK(ret == 0, break, "Failed to send msg %{public}d", ret);
1058 AppSpawnClientDestroy(clientHandle);
1059 sleep(1); // wait child process stand up
1060
1061 AppSpawnedProcess *app = GetSpawnedProcessByName(testServer->GetDefaultTestAppBundleName());
1062 ASSERT_NE(app, nullptr);
1063 char commamd[16]; // command len 16
1064 APPSPAWN_CHECK(sprintf_s(commamd, 16, "kill -9 %d", app->pid) > 0, break, "sprintf command unsuccess");
1065 system(commamd);
1066
1067 bool isFind = false;
1068 int count = 0;
1069 while (count < 10) {
1070 if (read(pipefd[0], buffer, sizeof(buffer)) <= 0) {
1071 count++;
1072 continue;
1073 }
1074 if (strstr(buffer, std::to_string(app->pid).c_str()) != NULL) {
1075 isFind = true;
1076 break;
1077 }
1078 count++;
1079 }
1080 close(pipefd[0]);
1081 close(pipefd[1]);
1082 ASSERT_EQ(isFind, true);
1083 NativeSpawnListenCloseSet();
1084 } while (0);
1085 }
1086
1087 /**
1088 * @brief 必须最后一个,kill nwebspawn,appspawn的线程结束
1089 *
1090 */
1091 HWTEST_F(AppSpawnServiceTest, App_Spawn_NWebSpawn_001, TestSize.Level0)
1092 {
1093 int ret = 0;
1094 AppSpawnClientHandle clientHandle = nullptr;
1095 do {
1096 ret = AppSpawnClientInit(APPSPAWN_SERVER_NAME, &clientHandle);
1097 APPSPAWN_CHECK(ret == 0, break, "Failed to create client %{public}s", APPSPAWN_SERVER_NAME);
1098 AppSpawnReqMsgHandle reqHandle = testServer->CreateMsg(clientHandle, MSG_APP_SPAWN, 0);
1099 AppSpawnResult result = {};
1100 ret = AppSpawnClientSendMsg(clientHandle, reqHandle, &result);
1101 APPSPAWN_CHECK(ret == 0, break, "Failed to send msg %{public}d", ret);
1102 // kill nwebspawn
1103 APPSPAWN_LOGV("App_Spawn_NWebSpawn_001 Kill nwebspawn");
1104 testServer->KillNWebSpawnServer();
1105 } while (0);
1106 AppSpawnClientDestroy(clientHandle);
1107 ASSERT_EQ(ret, 0);
1108 }
1109
1110 /**
1111 * @brief 测试环境变量设置是否正确
1112 *
1113 */
1114 HWTEST_F(AppSpawnServiceTest, App_Spawn_InitCommonEnv_001, TestSize.Level0)
1115 {
1116 char *env;
1117
1118 InitCommonEnv();
1119
1120 if (IsDeveloperModeOpen() == true) {
1121 env = getenv("HNP_PRIVATE_HOME");
1122 EXPECT_NE(env, nullptr);
1123 if (env != nullptr) {
1124 EXPECT_EQ(strcmp(env, "/data/app"), 0);
1125 }
1126 env = getenv("HNP_PUBLIC_HOME");
1127 EXPECT_NE(env, nullptr);
1128 if (env != nullptr) {
1129 EXPECT_EQ(strcmp(env, "/data/service/hnp"), 0);
1130 }
1131 env = getenv("PATH");
1132 EXPECT_NE(env, nullptr);
1133 if (env != nullptr) {
1134 EXPECT_NE(strstr(env, "/data/app/bin:/data/service/hnp/bin"), nullptr);
1135 }
1136 }
1137 env = getenv("HOME");
1138 EXPECT_NE(env, nullptr);
1139 if (env != nullptr) {
1140 EXPECT_EQ(strcmp(env, "/storage/Users/currentUser"), 0);
1141 }
1142 env = getenv("TMPDIR");
1143 EXPECT_NE(env, nullptr);
1144 if (env != nullptr) {
1145 EXPECT_EQ(strcmp(env, "/data/storage/el2/base/cache"), 0);
1146 }
1147 env = getenv("SHELL");
1148 EXPECT_NE(env, nullptr);
1149 if (env != nullptr) {
1150 EXPECT_EQ(strcmp(env, "/bin/sh"), 0);
1151 }
1152 env = getenv("PWD");
1153 EXPECT_NE(env, nullptr);
1154 if (env != nullptr) {
1155 EXPECT_EQ(strcmp(env, "/storage/Users/currentUser"), 0);
1156 }
1157 }
1158
1159 /**
1160 * @brief 测试环境变量转换功能是否正常
1161 *
1162 */
1163 HWTEST_F(AppSpawnServiceTest, App_Spawn_ConvertEnvValue_001, TestSize.Level0)
1164 {
1165 char outEnv[MAX_ENV_VALUE_LEN];
1166
1167 outEnv[0] = 0;
1168 EXPECT_EQ(ConvertEnvValue("/path/to/lib", outEnv, MAX_ENV_VALUE_LEN), 0);
1169 EXPECT_EQ(strcmp(outEnv, "/path/to/lib"), 0);
1170
1171 EXPECT_EQ(ConvertEnvValue("/path/to/lib/$ENV_TEST_VALUE", outEnv, MAX_ENV_VALUE_LEN), 0);
1172 EXPECT_EQ(strcmp(outEnv, "/path/to/lib/$ENV_TEST_VALUE"), 0);
1173
1174 EXPECT_EQ(ConvertEnvValue("/path/to/lib/${ENV_TEST_VALUE", outEnv, MAX_ENV_VALUE_LEN), 0);
1175 EXPECT_EQ(strcmp(outEnv, "/path/to/lib/${ENV_TEST_VALUE"), 0);
1176
1177 EXPECT_EQ(ConvertEnvValue("/path/to/lib/${", outEnv, MAX_ENV_VALUE_LEN), 0);
1178 EXPECT_EQ(strcmp(outEnv, "/path/to/lib/${"), 0);
1179
1180 EXPECT_EQ(ConvertEnvValue("/path/to/lib/${ENV_TEST_VALUE}", outEnv, MAX_ENV_VALUE_LEN), 0);
1181 EXPECT_EQ(strcmp(outEnv, "/path/to/lib/"), 0);
1182
1183 EXPECT_EQ(setenv("ENV_TEST_VALUE", "envtest", 1), 0);
1184 EXPECT_EQ(ConvertEnvValue("/path/to/lib/${ENV_TEST_VALUE}", outEnv, MAX_ENV_VALUE_LEN), 0);
1185 EXPECT_EQ(strcmp(outEnv, "/path/to/lib/envtest"), 0);
1186 EXPECT_EQ(unsetenv("ENV_TEST_VALUE"), 0);
1187 }
1188 } // namespace OHOS
1189