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