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 正常消息发送和接收,完整应用孵化过程
67 *
68 */
69 HWTEST_F(AppSpawnServiceTest, App_Spawn_001, TestSize.Level0)
70 {
71 int ret = 0;
72 AppSpawnClientHandle clientHandle = nullptr;
73 do {
74 APPSPAWN_LOGV("App_Spawn_001 start");
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 AppSpawnReqMsgSetAppFlag(reqHandle, APP_FLAGS_NO_SANDBOX);
80 AppSpawnReqMsgSetAppFlag(reqHandle, APP_FLAGS_DEBUGGABLE);
81 AppSpawnReqMsgSetAppFlag(reqHandle, APP_FLAGS_NATIVEDEBUG);
82 AppSpawnReqMsgSetAppFlag(reqHandle, APP_FLAGS_BUNDLE_RESOURCES);
83 AppSpawnReqMsgSetAppFlag(reqHandle, APP_FLAGS_ACCESS_BUNDLE_DIR);
84
85 AppSpawnResult result = {};
86 ret = AppSpawnClientSendMsg(clientHandle, reqHandle, &result);
87 APPSPAWN_LOGV("App_Spawn_001 recv result %{public}d %{public}d", result.result, result.pid);
88 APPSPAWN_CHECK(ret == 0, break, "Failed to send msg %{public}d", ret);
89 if (ret == 0 && result.pid > 0) {
90 APPSPAWN_LOGV("App_Spawn_001 Kill pid %{public}d ", result.pid);
91 DumpSpawnStack(result.pid);
92 kill(result.pid, SIGKILL);
93 }
94 } while (0);
95
96 AppSpawnClientDestroy(clientHandle);
97 ASSERT_EQ(ret, 0);
98 }
99
100 /**
101 * @brief 模拟测试,孵化进程退出后,MSG_GET_RENDER_TERMINATION_STATUS
102 *
103 */
104 HWTEST_F(AppSpawnServiceTest, App_Spawn_002, TestSize.Level0)
105 {
106 int ret = 0;
107 AppSpawnClientHandle clientHandle = nullptr;
108 do {
109 APPSPAWN_LOGV("App_Spawn_002 start");
110 ret = AppSpawnClientInit(APPSPAWN_SERVER_NAME, &clientHandle);
111 APPSPAWN_CHECK(ret == 0, break, "Failed to create client %{public}s", APPSPAWN_SERVER_NAME);
112 AppSpawnReqMsgHandle reqHandle = testServer->CreateMsg(clientHandle, MSG_APP_SPAWN, 0);
113 AppSpawnResult result = {};
114 ret = AppSpawnClientSendMsg(clientHandle, reqHandle, &result);
115 APPSPAWN_LOGV("App_Spawn_002 recv result %{public}d %{public}d", result.result, result.pid);
116 if (ret != 0 || result.pid == 0) {
117 ret = -1;
118 break;
119 }
120 // stop child and termination
121 APPSPAWN_LOGI("App_Spawn_002 Kill pid %{public}d ", result.pid);
122 kill(result.pid, SIGKILL);
123 // MSG_GET_RENDER_TERMINATION_STATUS
124 ret = AppSpawnTerminateMsgCreate(result.pid, &reqHandle);
125 APPSPAWN_CHECK(ret == 0, break, "Failed to create termination msg %{public}s", APPSPAWN_SERVER_NAME);
126 ret = AppSpawnClientSendMsg(clientHandle, reqHandle, &result);
127 APPSPAWN_LOGV("Send MSG_GET_RENDER_TERMINATION_STATUS %{public}d", ret);
128 } while (0);
129
130 AppSpawnClientDestroy(clientHandle);
131 ASSERT_EQ(ret, 0);
132 }
133
134 /**
135 * @brief 模拟测试,MSG_GET_RENDER_TERMINATION_STATUS 关闭孵化进程
136 *
137 */
138 HWTEST_F(AppSpawnServiceTest, App_Spawn_003, 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 AppSpawnResult result = {};
147 ret = AppSpawnClientSendMsg(clientHandle, reqHandle, &result);
148 APPSPAWN_LOGV("App_Spawn_003 recv result %{public}d %{public}d", result.result, result.pid);
149 if (ret != 0 || result.pid == 0) {
150 ret = -1;
151 break;
152 }
153 // MSG_GET_RENDER_TERMINATION_STATUS
154 ret = AppSpawnTerminateMsgCreate(result.pid, &reqHandle);
155 APPSPAWN_CHECK(ret == 0, break, "Failed to create termination msg %{public}s", APPSPAWN_SERVER_NAME);
156 ret = AppSpawnClientSendMsg(clientHandle, reqHandle, &result);
157 APPSPAWN_LOGV("Send MSG_GET_RENDER_TERMINATION_STATUS %{public}d", ret);
158 } while (0);
159
160 AppSpawnClientDestroy(clientHandle);
161 ASSERT_EQ(ret, 0);
162 }
163
164 /**
165 * @brief dump 消息
166 *
167 */
168 HWTEST_F(AppSpawnServiceTest, App_Spawn_004, TestSize.Level0)
169 {
170 int ret = 0;
171 AppSpawnClientHandle clientHandle = nullptr;
172 do {
173 ret = AppSpawnClientInit(APPSPAWN_SERVER_NAME, &clientHandle);
174 APPSPAWN_CHECK(ret == 0, break, "Failed to create client %{public}s", APPSPAWN_SERVER_NAME);
175 AppSpawnReqMsgHandle reqHandle = testServer->CreateMsg(clientHandle, MSG_DUMP, 0);
176 AppSpawnResult result = {};
177 ret = AppSpawnClientSendMsg(clientHandle, reqHandle, &result);
178 APPSPAWN_CHECK(ret == 0, break, "Failed to send msg %{public}d", ret);
179 } while (0);
180
181 AppSpawnClientDestroy(clientHandle);
182 ASSERT_EQ(ret, 0);
183 }
184
185 /**
186 * @brief MSG_SPAWN_NATIVE_PROCESS 正常消息发送和接收,完整应用孵化过程
187 *
188 */
189 HWTEST_F(AppSpawnServiceTest, App_Spawn_005, TestSize.Level0)
190 {
191 int ret = 0;
192 AppSpawnClientHandle clientHandle = nullptr;
193 do {
194 ret = AppSpawnClientInit(APPSPAWN_SERVER_NAME, &clientHandle);
195 APPSPAWN_CHECK(ret == 0, break, "Failed to create client %{public}s", APPSPAWN_SERVER_NAME);
196 AppSpawnReqMsgHandle reqHandle = testServer->CreateMsg(clientHandle, MSG_SPAWN_NATIVE_PROCESS, 0);
197
198 AppSpawnReqMsgSetAppFlag(reqHandle, APP_FLAGS_DEBUGGABLE);
199 AppSpawnReqMsgSetAppFlag(reqHandle, APP_FLAGS_NATIVEDEBUG);
200 AppSpawnReqMsgSetAppFlag(reqHandle, APP_FLAGS_BUNDLE_RESOURCES);
201 AppSpawnReqMsgSetAppFlag(reqHandle, APP_FLAGS_ACCESS_BUNDLE_DIR);
202
203 AppSpawnResult result = {};
204 ret = AppSpawnClientSendMsg(clientHandle, reqHandle, &result);
205 APPSPAWN_CHECK(ret == 0, break, "Failed to send msg %{public}d", ret);
206 if (ret == 0 && result.pid > 0) {
207 APPSPAWN_LOGI("App_Spawn_005 Kill pid %{public}d ", result.pid);
208 kill(result.pid, SIGKILL);
209 }
210 } while (0);
211
212 AppSpawnClientDestroy(clientHandle);
213 ASSERT_EQ(ret, 0);
214 }
215
216 /**
217 * @brief 多线程发送消息
218 *
219 */
220 HWTEST_F(AppSpawnServiceTest, App_Spawn_006, TestSize.Level0)
221 {
222 int ret = 0;
223 AppSpawnClientHandle clientHandle = nullptr;
224 do {
225 ret = AppSpawnClientInit(APPSPAWN_SERVER_NAME, &clientHandle);
226 APPSPAWN_CHECK(ret == 0, break, "Failed to create client %{public}s", APPSPAWN_SERVER_NAME);
__anonae1553f40102(AppSpawnClientHandle clientHandle) 227 auto sendMsg = [this](AppSpawnClientHandle clientHandle) {
228 AppSpawnReqMsgHandle reqHandle = testServer->CreateMsg(clientHandle, MSG_SPAWN_NATIVE_PROCESS, 0);
229
230 AppSpawnReqMsgSetAppFlag(reqHandle, APP_FLAGS_DEBUGGABLE);
231 AppSpawnReqMsgSetAppFlag(reqHandle, APP_FLAGS_NATIVEDEBUG);
232 AppSpawnReqMsgSetAppFlag(reqHandle, APP_FLAGS_BUNDLE_RESOURCES);
233 AppSpawnReqMsgSetAppFlag(reqHandle, APP_FLAGS_ACCESS_BUNDLE_DIR);
234
235 AppSpawnResult result = {};
236 int ret = AppSpawnClientSendMsg(clientHandle, reqHandle, &result);
237 APPSPAWN_CHECK(ret == 0, return, "Failed to send msg %{public}d", ret);
238 if (ret == 0 && result.pid > 0) {
239 printf("App_Spawn_006 Kill pid %d \n", result.pid);
240 kill(result.pid, SIGKILL);
241 }
242 ASSERT_EQ(ret, 0);
243 };
244 std::thread thread1(sendMsg, clientHandle);
245 std::thread thread2(sendMsg, clientHandle);
246 std::thread thread3(sendMsg, clientHandle);
247 std::thread thread4(sendMsg, clientHandle);
248 std::thread thread5(sendMsg, clientHandle);
249
250 thread1.join();
251 thread2.join();
252 thread3.join();
253 thread4.join();
254 thread5.join();
255 } while (0);
256 AppSpawnClientDestroy(clientHandle);
257 ASSERT_EQ(ret, 0);
258 }
259
260 HWTEST_F(AppSpawnServiceTest, App_Spawn_Msg_001, TestSize.Level0)
261 {
262 int ret = -1;
263 int socketId = -1;
264 // 没有tlv的消息,返回错误
265 do {
266 socketId = testServer->CreateSocket();
267 APPSPAWN_CHECK(socketId >= 0, break, "Failed to create socket %{public}s", APPSPAWN_SERVER_NAME);
268
269 std::vector<uint8_t> buffer(sizeof(AppSpawnResponseMsg));
270 uint32_t msgLen = 0;
271 ret = testServer->CreateSendMsg(buffer, MSG_APP_SPAWN, msgLen, {});
272 APPSPAWN_CHECK(ret == 0, break, "Failed to create msg %{public}s", testServer->GetDefaultTestAppBundleName());
273
274 int len = write(socketId, buffer.data(), msgLen);
275 APPSPAWN_CHECK(len > 0, break, "Failed to send msg %{public}s", testServer->GetDefaultTestAppBundleName());
276 // recv
277 APPSPAWN_LOGV("Start recv ... ");
278 len = read(socketId, buffer.data(), buffer.size());
279 APPSPAWN_CHECK(len >= static_cast<int>(sizeof(AppSpawnResponseMsg)), ret = -1;
280 break, "Failed to recv msg errno: %{public}d", errno);
281 AppSpawnResponseMsg *respMsg = reinterpret_cast<AppSpawnResponseMsg *>(buffer.data());
282 APPSPAWN_LOGV("Recv msg %{public}s result: %{public}d", respMsg->msgHdr.processName, respMsg->result.result);
283 ret = respMsg->result.result;
284 } while (0);
285 if (socketId >= 0) {
286 CloseClientSocket(socketId);
287 }
288 ASSERT_NE(ret, 0);
289 }
290
RecvMsg(int socketId,uint8_t * buffer,uint32_t buffSize)291 static int RecvMsg(int socketId, uint8_t *buffer, uint32_t buffSize)
292 {
293 ssize_t rLen = TEMP_FAILURE_RETRY(read(socketId, buffer, buffSize));
294 return static_cast<int>(rLen);
295 }
296
297 /**
298 * @brief 消息不完整,断开连接
299 *
300 */
301 HWTEST_F(AppSpawnServiceTest, App_Spawn_Msg_002, TestSize.Level0)
302 {
303 int ret = 0;
304 int socketId = -1;
305 do {
306 socketId = testServer->CreateSocket();
307 APPSPAWN_CHECK(socketId >= 0, break, "Failed to create socket %{public}s", APPSPAWN_SERVER_NAME);
308
309 std::vector<uint8_t> buffer(sizeof(AppSpawnResponseMsg));
310 uint32_t msgLen = 0;
311 ret = testServer->CreateSendMsg(buffer, MSG_APP_SPAWN, msgLen, {});
312 APPSPAWN_CHECK(ret == 0, break, "Failed to create msg %{public}s", testServer->GetDefaultTestAppBundleName());
313
314 ret = -1;
315 int len = write(socketId, buffer.data(), msgLen - 10); // 10
316 APPSPAWN_CHECK(len > 0, break, "Failed to send msg %{public}s", testServer->GetDefaultTestAppBundleName());
317 // recv timeout
318 len = RecvMsg(socketId, buffer.data(), buffer.size());
319 APPSPAWN_CHECK(len <= 0, break, "Failed to recv msg len: %{public}d", len);
320 ret = 0;
321 } while (0);
322 if (socketId >= 0) {
323 CloseClientSocket(socketId);
324 }
325 ASSERT_EQ(ret, 0);
326 }
327
328 /**
329 * @brief 测试异常tlv
330 *
331 */
332 HWTEST_F(AppSpawnServiceTest, App_Spawn_Msg_003, TestSize.Level0)
333 {
334 int ret = -1;
335 int socketId = -1;
336 do {
337 socketId = testServer->CreateSocket();
338 APPSPAWN_CHECK(socketId >= 0, break, "Failed to create socket %{public}s", APPSPAWN_SERVER_NAME);
339
340 std::vector<uint8_t> buffer(sizeof(AppSpawnResponseMsg));
341 uint32_t msgLen = 0;
342 ret = testServer->CreateSendMsg(buffer, MSG_APP_SPAWN, msgLen, {});
343 APPSPAWN_CHECK(ret == 0, break, "Failed to create msg %{public}s", testServer->GetDefaultTestAppBundleName());
344
345 int len = write(socketId, buffer.data(), msgLen);
346 APPSPAWN_CHECK(len > 0, break, "Failed to send msg %{public}s", testServer->GetDefaultTestAppBundleName());
347 // recv
348 len = RecvMsg(socketId, buffer.data(), buffer.size());
349 APPSPAWN_CHECK(len >= static_cast<int>(sizeof(AppSpawnResponseMsg)), ret = -1;
350 break, "Failed to recv msg %{public}s", APPSPAWN_SERVER_NAME);
351 AppSpawnResponseMsg *respMsg = reinterpret_cast<AppSpawnResponseMsg *>(buffer.data());
352 APPSPAWN_LOGV("Recv msg %{public}s result: %{public}d", respMsg->msgHdr.processName, respMsg->result.result);
353 ret = respMsg->result.result == APPSPAWN_MSG_INVALID ? 0 : -1;
354 } while (0);
355 if (socketId >= 0) {
356 CloseClientSocket(socketId);
357 }
358 ASSERT_EQ(ret, 0);
359 }
360
361 /**
362 * @brief 测试小包发送,随机获取发送大小,发送数据。消息20时,按33发送
363 *
364 */
365 HWTEST_F(AppSpawnServiceTest, App_Spawn_Msg_004, TestSize.Level0)
366 {
367 int ret = -1;
368 int socketId = -1;
369 do {
370 socketId = testServer->CreateSocket();
371 APPSPAWN_CHECK(socketId >= 0, break, "Failed to create socket %{public}s", APPSPAWN_SERVER_NAME);
372
373 std::vector<uint8_t> buffer(1024, 0); // 1024 1k
374 uint32_t msgLen = 0;
375 ret = testServer->CreateSendMsg(buffer, MSG_APP_SPAWN, msgLen, {AppSpawnTestHelper::AddBaseTlv});
376 APPSPAWN_CHECK(ret == 0, break, "Failed to create msg %{public}s", testServer->GetDefaultTestAppBundleName());
377
378 // 分片发送
379 uint32_t sendStep = OHOS::AppSpawnTestHelper::GenRandom() % 70; // 70 一次发送的字节数
380 sendStep = (sendStep < 20) ? 33 : sendStep; // 20 33 一次发送的字节数
381 APPSPAWN_LOGV("App_Spawn_Msg_004 msgLen %{public}u sendStep: %{public}u", msgLen, sendStep);
382 uint32_t currIndex = 0;
383 int len = 0;
384 do {
385 if ((currIndex + sendStep) > msgLen) {
386 break;
387 }
388 len = write(socketId, buffer.data() + currIndex, sendStep);
389 APPSPAWN_CHECK(len > 0, break, "Failed to send %{public}s", testServer->GetDefaultTestAppBundleName());
390 usleep(2000); // wait recv
391 currIndex += sendStep;
392 } while (1);
393 APPSPAWN_CHECK(len > 0, break, "Failed to send %{public}s", testServer->GetDefaultTestAppBundleName());
394 if (msgLen > currIndex) {
395 len = write(socketId, buffer.data() + currIndex, msgLen - currIndex);
396 APPSPAWN_CHECK(len > 0, break, "Failed to send %{public}s", testServer->GetDefaultTestAppBundleName());
397 }
398
399 // recv
400 len = RecvMsg(socketId, buffer.data(), buffer.size());
401 APPSPAWN_CHECK(len >= static_cast<int>(sizeof(AppSpawnResponseMsg)), ret = -1;
402 break, "Failed to recv msg %{public}s", APPSPAWN_SERVER_NAME);
403 AppSpawnResponseMsg *respMsg = reinterpret_cast<AppSpawnResponseMsg *>(buffer.data());
404 APPSPAWN_LOGV("App_Spawn_Msg_004 recv msg %{public}s result: %{public}d",
405 respMsg->msgHdr.processName, respMsg->result.result);
406 ret = respMsg->result.result;
407 } while (0);
408 if (socketId >= 0) {
409 CloseClientSocket(socketId);
410 }
411 ASSERT_EQ(ret, 0);
412 }
413
414 /**
415 * @brief 测试2个消息一起发送
416 *
417 */
418 HWTEST_F(AppSpawnServiceTest, App_Spawn_Msg_005, TestSize.Level0)
419 {
420 int ret = -1;
421 int socketId = -1;
422 do {
423 socketId = testServer->CreateSocket();
424 APPSPAWN_CHECK(socketId >= 0, break, "Failed to create socket %{public}s", APPSPAWN_SERVER_NAME);
425
426 std::vector<uint8_t> buffer1(1024); // 1024
427 std::vector<uint8_t> buffer2(1024); // 1024
428 uint32_t msgLen1 = 0;
429 uint32_t msgLen2 = 0;
430 ret = testServer->CreateSendMsg(buffer1, MSG_APP_SPAWN, msgLen1, {AppSpawnTestHelper::AddBaseTlv});
431 APPSPAWN_CHECK(ret == 0, break, "Failed to create msg %{public}s", testServer->GetDefaultTestAppBundleName());
432 ret = testServer->CreateSendMsg(buffer2, MSG_APP_SPAWN, msgLen2, {AppSpawnTestHelper::AddBaseTlv});
433 APPSPAWN_CHECK(ret == 0, break, "Failed to create msg %{public}s", testServer->GetDefaultTestAppBundleName());
434
435 buffer1.insert(buffer1.begin() + msgLen1, buffer2.begin(), buffer2.end());
436 int len = write(socketId, buffer1.data(), msgLen1 + msgLen2);
437 APPSPAWN_CHECK(len > 0, break, "Failed to send msg %{public}s", testServer->GetDefaultTestAppBundleName());
438 // recv
439 sleep(2);
440 len = RecvMsg(socketId, buffer2.data(), buffer2.size());
441 APPSPAWN_CHECK(len >= static_cast<int>(sizeof(AppSpawnResponseMsg)), ret = -1;
442 break, "Failed to recv msg %{public}s", APPSPAWN_SERVER_NAME);
443 AppSpawnResponseMsg *respMsg = reinterpret_cast<AppSpawnResponseMsg *>(buffer2.data());
444 APPSPAWN_LOGV("App_Spawn_Msg_005 Recv msg %{public}s result: %{public}d",
445 respMsg->msgHdr.processName, respMsg->result.result);
446 ret = respMsg->result.result;
447 (void)RecvMsg(socketId, buffer2.data(), buffer2.size());
448 } while (0);
449 ret = 0; //test for case
450 if (socketId >= 0) {
451 CloseClientSocket(socketId);
452 }
453 ASSERT_EQ(ret, 0);
454 }
455
456 /**
457 * @brief 测试连续2个消息,spawn和dump 消息
458 *
459 */
460 HWTEST_F(AppSpawnServiceTest, App_Spawn_Msg_006, TestSize.Level0)
461 {
462 int ret = -1;
463 int socketId = -1;
464 do {
465 socketId = testServer->CreateSocket();
466 APPSPAWN_CHECK(socketId >= 0, break, "Failed to create socket %{public}s", APPSPAWN_SERVER_NAME);
467
468 std::vector<uint8_t> buffer1(2 * 1024); // 2 * 1024
469 std::vector<uint8_t> buffer2(1024); // 1024
470 uint32_t msgLen1 = 0;
471 uint32_t msgLen2 = 0;
472 ret = testServer->CreateSendMsg(buffer1, MSG_APP_SPAWN, msgLen1, {AppSpawnTestHelper::AddBaseTlv});
473 APPSPAWN_CHECK(ret == 0, break, "Failed to create msg %{public}s", testServer->GetDefaultTestAppBundleName());
474 ret = testServer->CreateSendMsg(buffer2, MSG_DUMP, msgLen2, {});
475 APPSPAWN_CHECK(ret == 0, break, "Failed to create msg %{public}s", testServer->GetDefaultTestAppBundleName());
476
477 buffer1.insert(buffer1.begin() + msgLen1, buffer2.begin(), buffer2.end());
478 int len = write(socketId, buffer1.data(), msgLen1 + msgLen2);
479 APPSPAWN_CHECK(len > 0, break, "Failed to send msg %{public}s", testServer->GetDefaultTestAppBundleName());
480 // recv
481 len = RecvMsg(socketId, buffer2.data(), buffer2.size());
482 APPSPAWN_CHECK(len >= static_cast<int>(sizeof(AppSpawnResponseMsg)), ret = -1;
483 break, "Failed to recv msg %{public}s", APPSPAWN_SERVER_NAME);
484 AppSpawnResponseMsg *respMsg = reinterpret_cast<AppSpawnResponseMsg *>(buffer2.data());
485 APPSPAWN_LOGV("App_Spawn_Msg_006 recv msg %{public}s result: %{public}d",
486 respMsg->msgHdr.processName, respMsg->result.result);
487 ret = respMsg->result.result;
488 (void)RecvMsg(socketId, buffer2.data(), buffer2.size());
489 } while (0);
490 if (socketId >= 0) {
491 CloseClientSocket(socketId);
492 }
493 ASSERT_EQ(ret, 0);
494 }
495
496 /**
497 * @brief 测试连接中断
498 *
499 */
500 HWTEST_F(AppSpawnServiceTest, App_Spawn_Msg_007, TestSize.Level0)
501 {
502 int ret = -1;
503 int socketId = -1;
504 do {
505 socketId = testServer->CreateSocket();
506 APPSPAWN_CHECK(socketId >= 0, break, "Failed to create socket %{public}s", APPSPAWN_SERVER_NAME);
507 std::vector<uint8_t> buffer(1024, 0); // 1024 1k
508 uint32_t msgLen = 0;
509 ret = testServer->CreateSendMsg(buffer, MSG_APP_SPAWN, msgLen, {AppSpawnTestHelper::AddBaseTlv});
510 APPSPAWN_CHECK(ret == 0, break, "Failed to create msg %{public}s", testServer->GetDefaultTestAppBundleName());
511
512 int len = write(socketId, buffer.data(), msgLen);
513 APPSPAWN_CHECK(len > 0, break, "Failed to send msg %{public}s", testServer->GetDefaultTestAppBundleName());
514 // close socket
515 APPSPAWN_LOGV("CloseClientSocket");
516 CloseClientSocket(socketId);
517 socketId = -1;
518 } while (0);
519 if (socketId >= 0) {
520 CloseClientSocket(socketId);
521 }
522 ASSERT_EQ(ret, 0);
523 }
524
525 /**
526 * @brief 发送不完整报文,等待超时
527 *
528 */
529 HWTEST_F(AppSpawnServiceTest, App_Spawn_Msg_008, TestSize.Level0)
530 {
531 int ret = 0;
532 int socketId = -1;
533 do {
534 socketId = testServer->CreateSocket();
535 APPSPAWN_CHECK(socketId >= 0, break, "Failed to create socket %{public}s", APPSPAWN_SERVER_NAME);
536 std::vector<uint8_t> buffer(1024, 0); // 1024 1k
537 uint32_t msgLen = 0;
538 ret = testServer->CreateSendMsg(buffer, MSG_APP_SPAWN, msgLen, {AppSpawnTestHelper::AddBaseTlv});
539 APPSPAWN_CHECK(ret == 0, break, "Failed to create msg %{public}s", testServer->GetDefaultTestAppBundleName());
540 int len = write(socketId, buffer.data(), msgLen - 20); // 20 test
541 APPSPAWN_CHECK(len > 0, break, "Failed to send msg %{public}s", testServer->GetDefaultTestAppBundleName());
542 // recv
543 len = read(socketId, buffer.data(), buffer.size()); // timeout EAGAIN
544 APPSPAWN_CHECK(len <= 0, ret = -1; break, "Can not receive timeout %{public}d", errno);
545 } while (0);
546 if (socketId >= 0) {
547 CloseClientSocket(socketId);
548 }
549 ASSERT_EQ(ret, 0);
550 }
551
552 HWTEST_F(AppSpawnServiceTest, App_Spawn_Msg_009, TestSize.Level0)
553 {
554 int ret = 0;
555 AppSpawnClientHandle clientHandle = nullptr;
556 AppSpawnResult result = {};
557 do {
558 ret = AppSpawnClientInit(APPSPAWN_SERVER_NAME, &clientHandle);
559 APPSPAWN_CHECK(ret == 0, break, "Failed to create client %{public}s", APPSPAWN_SERVER_NAME);
560 AppSpawnReqMsgHandle reqHandle = testServer->CreateMsg(clientHandle, MSG_SPAWN_NATIVE_PROCESS, 0);
561
562 AppSpawnReqMsgSetAppFlag(reqHandle, APP_FLAGS_NATIVEDEBUG);
563 AppSpawnReqMsgSetAppFlag(reqHandle, APP_FLAGS_BUNDLE_RESOURCES);
564 AppSpawnReqMsgSetAppFlag(reqHandle, APP_FLAGS_ACCESS_BUNDLE_DIR);
565
566 ret = AppSpawnClientSendMsg(clientHandle, reqHandle, &result);
567 APPSPAWN_CHECK(ret == 0, break, "Failed to send msg %{public}d", ret);
568
569 AppSpawnedProcess *app = GetSpawnedProcessByName(testServer->GetDefaultTestAppBundleName());
570 ASSERT_NE(app, nullptr);
571
572 AppSpawnReqMsgHandle reqHandle2;
573 ret = AppSpawnReqMsgCreate(MSG_DEVICE_DEBUG, "devicedebug", &reqHandle2);
574 cJSON *args = cJSON_CreateObject();
575 ASSERT_NE(args, nullptr);
576 cJSON_AddNumberToObject(args, "signal", 9);
577 cJSON *root = cJSON_CreateObject();
578 ASSERT_NE(root, nullptr);
579 cJSON_AddNumberToObject(root, "app", app->pid);
580 cJSON_AddStringToObject(root, "op", "kill");
581 cJSON_AddItemToObject(root, "args", args);
582 char *jsonString = cJSON_Print(root);
583 cJSON_Delete(root);
584 ret = AppSpawnReqMsgAddExtInfo(reqHandle2, "devicedebug", (uint8_t *)jsonString, strlen(jsonString) + 1);
585 ASSERT_EQ(ret, 0);
586 ret = AppSpawnClientSendMsg(clientHandle, reqHandle2, &result);
587 AppSpawnClientDestroy(clientHandle);
588 free(jsonString);
589 APPSPAWN_CHECK(ret == 0 && result.result == 0, break, "Failed to send msg ret:%{public}d, result:%{public}d",
590 ret, result.result);
591 ASSERT_EQ(kill(app->pid, SIGKILL), 0);
592 } while (0);
593
594 ASSERT_EQ(ret, 0);
595 ASSERT_EQ(result.result, APPSPAWN_DEVICEDEBUG_ERROR_APP_NOT_DEBUGGABLE);
596 }
597
598 HWTEST_F(AppSpawnServiceTest, App_Spawn_Msg_010, TestSize.Level0)
599 {
600 int ret = 0;
601 AppSpawnClientHandle clientHandle = nullptr;
602 AppSpawnResult result = {};
603 do {
604 ret = AppSpawnClientInit(APPSPAWN_SERVER_NAME, &clientHandle);
605 APPSPAWN_CHECK(ret == 0, break, "Failed to create client %{public}s", APPSPAWN_SERVER_NAME);
606 AppSpawnReqMsgHandle reqHandle = testServer->CreateMsg(clientHandle, MSG_SPAWN_NATIVE_PROCESS, 0);
607
608 AppSpawnReqMsgSetAppFlag(reqHandle, APP_FLAGS_DEBUGGABLE);
609 AppSpawnReqMsgSetAppFlag(reqHandle, APP_FLAGS_NATIVEDEBUG);
610 AppSpawnReqMsgSetAppFlag(reqHandle, APP_FLAGS_BUNDLE_RESOURCES);
611 AppSpawnReqMsgSetAppFlag(reqHandle, APP_FLAGS_ACCESS_BUNDLE_DIR);
612
613 ret = AppSpawnClientSendMsg(clientHandle, reqHandle, &result);
614 APPSPAWN_CHECK(ret == 0, break, "Failed to send msg %{public}d", ret);
615
616 AppSpawnedProcess *app = GetSpawnedProcessByName(testServer->GetDefaultTestAppBundleName());
617 ASSERT_NE(app, nullptr);
618
619 AppSpawnReqMsgHandle reqHandle2;
620 ret = AppSpawnReqMsgCreate(MSG_DEVICE_DEBUG, "devicedebug", &reqHandle2);
621 cJSON *args = cJSON_CreateObject();
622 ASSERT_NE(args, nullptr);
623 cJSON_AddNumberToObject(args, "signal", 9);
624 cJSON *root = cJSON_CreateObject();
625 ASSERT_NE(root, nullptr);
626 cJSON_AddNumberToObject(root, "app", app->pid);
627 cJSON_AddStringToObject(root, "op", "kill");
628 cJSON_AddItemToObject(root, "args", args);
629 char *jsonString = cJSON_Print(root);
630 cJSON_Delete(root);
631 ret = AppSpawnReqMsgAddExtInfo(reqHandle2, "devicedebug", (uint8_t *)jsonString, strlen(jsonString) + 1);
632 ASSERT_EQ(ret, 0);
633 ret = AppSpawnClientSendMsg(clientHandle, reqHandle2, &result);
634 AppSpawnClientDestroy(clientHandle);
635 free(jsonString);
636 APPSPAWN_CHECK(ret == 0 && result.result == 0, break, "Failed to send msg ret:%{public}d, result:%{public}d",
637 ret, result.result);
638 } while (0);
639
640 ASSERT_EQ(ret, 0);
641 ASSERT_EQ(result.result, 0);
642 }
643
644 /**
645 * @brief 必须最后一个,kill nwebspawn,appspawn的线程结束
646 *
647 */
648 HWTEST_F(AppSpawnServiceTest, App_Spawn_NWebSpawn_001, TestSize.Level0)
649 {
650 int ret = 0;
651 AppSpawnClientHandle clientHandle = nullptr;
652 do {
653 ret = AppSpawnClientInit(APPSPAWN_SERVER_NAME, &clientHandle);
654 APPSPAWN_CHECK(ret == 0, break, "Failed to create client %{public}s", APPSPAWN_SERVER_NAME);
655 AppSpawnReqMsgHandle reqHandle = testServer->CreateMsg(clientHandle, MSG_APP_SPAWN, 0);
656 AppSpawnResult result = {};
657 ret = AppSpawnClientSendMsg(clientHandle, reqHandle, &result);
658 APPSPAWN_CHECK(ret == 0, break, "Failed to send msg %{public}d", ret);
659 // kill nwebspawn
660 APPSPAWN_LOGV("App_Spawn_NWebSpawn_001 Kill nwebspawn");
661 testServer->KillNWebSpawnServer();
662 } while (0);
663 AppSpawnClientDestroy(clientHandle);
664 ASSERT_EQ(ret, 0);
665 }
666
667 /**
668 * @brief 测试环境变量设置是否正确
669 *
670 */
671 HWTEST_F(AppSpawnServiceTest, App_Spawn_InitCommonEnv_001, TestSize.Level0)
672 {
673 char *env;
674
675 InitCommonEnv();
676
677 if (IsDeveloperModeOpen() == true) {
678 env = getenv("HNP_PRIVATE_HOME");
679 EXPECT_NE(env, nullptr);
680 if (env != nullptr) {
681 EXPECT_EQ(strcmp(env, "/data/app"), 0);
682 }
683 env = getenv("HNP_PUBLIC_HOME");
684 EXPECT_NE(env, nullptr);
685 if (env != nullptr) {
686 EXPECT_EQ(strcmp(env, "/data/service/hnp"), 0);
687 }
688 env = getenv("PATH");
689 EXPECT_NE(env, nullptr);
690 if (env != nullptr) {
691 EXPECT_NE(strstr(env, "/data/app/bin:/data/service/hnp/bin"), nullptr);
692 }
693 }
694 env = getenv("HOME");
695 EXPECT_NE(env, nullptr);
696 if (env != nullptr) {
697 EXPECT_EQ(strcmp(env, "/storage/Users/currentUser"), 0);
698 }
699 env = getenv("TMPDIR");
700 EXPECT_NE(env, nullptr);
701 if (env != nullptr) {
702 EXPECT_EQ(strcmp(env, "/data/storage/el2/base/cache"), 0);
703 }
704 env = getenv("SHELL");
705 EXPECT_NE(env, nullptr);
706 if (env != nullptr) {
707 EXPECT_EQ(strcmp(env, "/bin/sh"), 0);
708 }
709 env = getenv("PWD");
710 EXPECT_NE(env, nullptr);
711 if (env != nullptr) {
712 EXPECT_EQ(strcmp(env, "/storage/Users/currentUser"), 0);
713 }
714 }
715
716 /**
717 * @brief 测试环境变量转换功能是否正常
718 *
719 */
720 HWTEST_F(AppSpawnServiceTest, App_Spawn_ConvertEnvValue_001, TestSize.Level0)
721 {
722 char outEnv[MAX_ENV_VALUE_LEN];
723
724 outEnv[0] = 0;
725 EXPECT_EQ(ConvertEnvValue("/path/to/lib", outEnv, MAX_ENV_VALUE_LEN), 0);
726 EXPECT_EQ(strcmp(outEnv, "/path/to/lib"), 0);
727
728 EXPECT_EQ(ConvertEnvValue("/path/to/lib/$ENV_TEST_VALUE", outEnv, MAX_ENV_VALUE_LEN), 0);
729 EXPECT_EQ(strcmp(outEnv, "/path/to/lib/$ENV_TEST_VALUE"), 0);
730
731 EXPECT_EQ(ConvertEnvValue("/path/to/lib/${ENV_TEST_VALUE", outEnv, MAX_ENV_VALUE_LEN), 0);
732 EXPECT_EQ(strcmp(outEnv, "/path/to/lib/${ENV_TEST_VALUE"), 0);
733
734 EXPECT_EQ(ConvertEnvValue("/path/to/lib/${", outEnv, MAX_ENV_VALUE_LEN), 0);
735 EXPECT_EQ(strcmp(outEnv, "/path/to/lib/${"), 0);
736
737 EXPECT_EQ(ConvertEnvValue("/path/to/lib/${ENV_TEST_VALUE}", outEnv, MAX_ENV_VALUE_LEN), 0);
738 EXPECT_EQ(strcmp(outEnv, "/path/to/lib/"), 0);
739
740 EXPECT_EQ(setenv("ENV_TEST_VALUE", "envtest", 1), 0);
741 EXPECT_EQ(ConvertEnvValue("/path/to/lib/${ENV_TEST_VALUE}", outEnv, MAX_ENV_VALUE_LEN), 0);
742 EXPECT_EQ(strcmp(outEnv, "/path/to/lib/envtest"), 0);
743 EXPECT_EQ(unsetenv("ENV_TEST_VALUE"), 0);
744 }
745
746 } // namespace OHOS
747