1 /*
2 * Copyright (c) 2021-2022 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16 #include <sys/types.h>
17
18 #include <cerrno>
19 #include <cstdio>
20 #include <cstdlib>
21 #include <cstring>
22 #include <ctime>
23 #include <vector>
24
25 #include "gtest/gtest.h"
26 #include "appspawn_message.h"
27 #include "appspawn_msg.h"
28 #include "appspawn_service.h"
29
30 using namespace testing::ext;
31
32 namespace OHOS {
33 const unsigned int MALLOC_TEST_LENGTH = 10;
34 const long NANOSECONDS_PER_SECOND = 1000000000;
35 const int TEST_UID = 999;
36 const int TEST_GID = 888;
37 std::vector<std::string> g_badStrings;
38 std::vector<std::string> g_goodStrings;
39
40 class AppSpawnLiteTest : public testing::Test {
41 public:
SetUpTestCase()42 static void SetUpTestCase()
43 {
44 // empty
45 g_badStrings.push_back(std::string(""));
46 // not json
47 g_badStrings.push_back(std::string("abcdefghijklmnopqrstuvwxyz"));
48 g_badStrings.push_back(std::string("0123456789876543210"));
49 g_badStrings.push_back(std::string("xxxx"));
50 g_badStrings.push_back(std::string("xxxxssssssssssssssssssss"));
51 g_badStrings.push_back(std::string("\"\"\"\"\"\"\"\"\"\"\"\"\"\"\""));
52 g_badStrings.push_back(std::string("............................................."));
53 g_badStrings.push_back(std::string("....%%%....^..***@##.../*--++......$$&&....."));
54 StructuralFormatErrJson();
55 StructuralFieldMisJson();
56 StructuralFieldInvalidJson();
57 printf("[----------] AppSpawnLiteTest, message func test setup.\n");
58 }
59
TearDownTestCase()60 static void TearDownTestCase()
61 {
62 g_badStrings.clear();
63 g_goodStrings.clear();
64 printf("[----------] AppSpawnLiteTest, message func test teardown.\n");
65 }
SetUp()66 void SetUp() {}
TearDown()67 void TearDown() {}
68
StructuralFormatErrJson(void)69 static void StructuralFormatErrJson(void)
70 {
71 // looks like json but format error
72 g_badStrings.push_back(std::string(
73 "{bundleName\":\"nameV\",\"identityID\":\"1\",\"uID\":10,\"gID\":10,\"capability\":[0]}"));
74 g_badStrings.push_back(std::string(
75 "{\"bundleName:\"nameV\",\"identityID\":\"1\",\"uID\":10,\"gID\":10,\"capability\":[0]}"));
76 g_badStrings.push_back(std::string(
77 "{\"bundleName\":\"nameV\",\"identityID:\"1\",\"uID\":10,\"gID\":10,\"capability\":[0]}"));
78 g_badStrings.push_back(std::string(
79 "{\"bundleName\":\"nameV\",\"identityID\":1\",\"uID\":10,\"gID\":10,\"capability\":[0]}"));
80 g_badStrings.push_back(std::string(
81 "{\"bundleName\":\"nameV\",\"identityID\":\"1,\"uID\":10,\"gID\":10,\"capability\":[0]}"));
82 g_badStrings.push_back(std::string(
83 "{\"bundleName\":\"nameV\",\"identityID\":\"1\",uID\":10,\"gID\":10,\"capability\":[0]}"));
84 g_badStrings.push_back(std::string(
85 "{\"bundleName\":\"nameV\",\"identityID\":\"1\",\"uID:10,\"gID\":10,\"capability\":[0]}"));
86 g_badStrings.push_back(std::string(
87 "{\"bundleName\":\"nameV\",\"identityID\":\"1\",\"uID\":10,\"gID\":10,\"capability:[0]}"));
88 g_badStrings.push_back(std::string(
89 "{\"bundleName\":\"nameV\",\"identityID\":\"1\",\"uID\":10,\"gID\":10,\"capability\":[0]}"));
90 g_badStrings.push_back(std::string(
91 "{\"bundleName\":\"nameV\",\"identityID\":\"1\",\"uID\":10,\"gID\":10,\"capability\":0]}"));
92 g_badStrings.push_back(std::string(
93 "{\"bundleName\":\"nameV\",\"identityID\":\"1\",\"uID\":10,\"gID\":10,\"capability\":[0}"));
94 g_badStrings.push_back(std::string(
95 "{\"bundleName\":\"nameV\",\"identityID\":\"1\",\"uID\":10,\"gID\":10,\"capability\":[0]"));
96 g_badStrings.push_back(std::string(
97 "\"bundleName\":\"nameV\",\"identityID\":\"1\",\"uID\":10,\"gID\":10,\"capability\":[0]}"));
98 g_badStrings.push_back(std::string(
99 "{\"bundleName\"\"nameV\",\"identityID\":\"1\",\"uID\":10,\"gID\":10,\"capability\":[0]}"));
100 g_badStrings.push_back(std::string(
101 "{\"bundleName\":\"nameV\"\"identityID\":\"1\",\"uID\":10,\"gID\":10,\"capability\":[0]}"));
102 g_badStrings.push_back(std::string(
103 "{\"bundleName\":\"nameV\",\"identityID\"\"1\",\"uID\":10,\"gID\":10,\"capability\":[0]}"));
104 g_badStrings.push_back(std::string(
105 "{\"bundleName\":\"nameV\",\"identityID\":\"1\",\"uID\":10,\"gID\"10,\"capability\":[0]}"));
106 g_badStrings.push_back(std::string(
107 "{\"bundleName\":\"nameV\",\"identityID\":\"1\",\"uID\":10,\"gID\":10\"capability\":[0]}"));
108 g_badStrings.push_back(std::string(
109 "{\"bundleName\":\"nameV\",\"identityID\":\"1\",\"uID\":10,\"gID\":10,\"capability\"[0]}"));
110 g_badStrings.push_back(std::string(
111 "{\"bundleName\":\"nameV\",\"identityID\":\"1\",\"uID\":10,\"gID\":10,\"capability\":[0]},"));
112 g_badStrings.push_back(std::string(
113 "{\"bundleName\":\"nameV\",\"identityID\":\"1\",\"uID\":10,\"gID\":10,\"capability\":[0],}"));
114 g_badStrings.push_back(std::string(
115 "{\"bundleName\":\"nameV\",\"identityID\":\"1\",\"uID\":10,\"gID\":10,\"capability\":[0,]}"));
116 }
117
StructuralFieldMisJson(void)118 static void StructuralFieldMisJson(void)
119 {
120 // json format correct but fields missing
121 g_badStrings.push_back(std::string(
122 "{\"bundleName\":\"nameV\",\"identityID\":\"1234\",\"uID\":1000,\"gID\":1000,\"capability\":[0]}"));
123 g_badStrings.push_back(std::string(
124 "{\"\":\"nameV\",\"identityID\":\"1234\",\"uID\":1000,\"gID\":1000,\"capability\":[0]}"));
125 g_badStrings.push_back(std::string(
126 "{\"identityID\":\"1234\",\"uID\":1000,\"gID\":1000,\"capability\":[0]}"));
127 g_badStrings.push_back(std::string(
128 "{\"bundleName\":\"nameV\",\"\":\"1234\",\"uID\":1000,\"gID\":1000,\"capability\":[0]}"));
129 g_badStrings.push_back(std::string(
130 "{\"bundleName\":\"nameV\",\"uID\":1000,\"gID\":1000,\"capability\":[0]}"));
131 g_badStrings.push_back(std::string(
132 "{\"bundleName\":\"nameV\",\"identityID\":\"1234\",\"\":1000,\"gID\":1000,\"capability\":[0]}"));
133 g_badStrings.push_back(std::string(
134 "{\"bundleName\":\"nameV\",\"identityID\":\"1234\",\"gID\":1000,\"capability\":[0]}"));
135 g_badStrings.push_back(std::string(
136 "{\"bundleName\":\"nameV\",\"identityID\":\"1234\",\"uID\":1000,\"\":1000,\"capability\":[0]}"));
137 g_badStrings.push_back(std::string(
138 "{\"bundleName\":\"nameV\",\"identityID\":\"1234\",\"uID\":1000,\"capability\":[0]}"));
139 g_badStrings.push_back(std::string(
140 "{\"bundleName\":\"nameV\",\"identityID\":\"1234\",\"uID\":1000,\"gID\":1000,\"\":[0]}"));
141 g_badStrings.push_back(std::string(
142 "{\"bundleName\":\"nameV\",\"identityID\":\"1234\",\"uID\":1000,\"gID\":1000}"));
143 }
144
StructuralFieldInvalidJson(void)145 static void StructuralFieldInvalidJson(void)
146 {
147 // field value invalid
148 g_badStrings.push_back(std::string(
149 "{\"bundleName\":\"\",\"identityID\":\"1234\",\"uID\":1000,\"gID\":1000,\"capability\":[0]}"));
150 g_badStrings.push_back(std::string(
151 "{\"bundleName\":\"nameV\",\"identityID\":\"\",\"uID\":1000,\"gID\":1000,\"capability\":[0]}"));
152 g_badStrings.push_back(std::string(
153 "{\"bundleName\":\"nameV\",\"identityID\":\"1234\",\"uID\":-1000,\"gID\":1000,\"capability\":[0]}"));
154 g_badStrings.push_back(std::string(
155 "{\"bundleName\":\"nameV\",\"identityID\":\"1234\",\"uID\":1000,\"gID\":-1000,\"capability\":[-7]}"));
156 g_badStrings.push_back(std::string(
157 "{\"bundleName\":\"nameV\",\"identityID\":\"1234\",\"uID\":1000,\"gID\":1000,\"capability\":1}"));
158 g_badStrings.push_back(std::string(
159 "{\"bundleName\":\"nameV\",\"identityID\":\"1234\",\"uID\":1000,\"gID\":1000,\"capability\":[0, 3, -9]}"));
160 g_badStrings.push_back(std::string(
161 "{\"bundleName\":\"nameV\",\"identityID\":\"1234\",\"uID\":1000,\"gID\":1000,\"capability\":[99999999]}"));
162 g_badStrings.push_back(std::string(
163 "{\"bundleName\":\"nameV\",\"identityID\":1234,\"uID\":1000,\"gID\":1000,\"capability\":[0]}"));
164 g_badStrings.push_back(std::string(
165 "{\"bundleName\":\"nameV\",\"identityID\":\"1234\",\"uID\":\"1000\",\"gID\":1000,\"capability\":[0]}"));
166 g_badStrings.push_back(std::string(
167 "{\"bundleName\":\"nameV\",\"identityID\":\"1234\",\"uID\":1000,\"gID\":\"1000\",\"capability\":[0]}"));
168 g_badStrings.push_back(std::string(
169 "{\"bundleName\":\"nameV\",\"identityID\":\"1234\",\"uID\":1000,\"gID\":1000,\"capability\":\"0\"}"));
170 g_badStrings.push_back(std::string(
171 "{\"bundleName\": 250,\"identityID\":\"1234\",\"uID\":1000,\"gID\":1000,\"capability\":[0]}"));
172 g_goodStrings.push_back(std::string(
173 "{\"bundleName\":\"testvalid1\",\"identityID\":\"1234\",\"uID\":1000,\"gID\":1000,\"capability\":[0]}"));
174 g_goodStrings.push_back(std::string(
175 "{\"bundleName\":\"testvalid2\",\"identityID\":\"5678\",\"uID\":1001,\"gID\":1001,\"capability\":[3,5]}"));
176 g_goodStrings.push_back(std::string(
177 "{\"bundleName\":\"testvalid3\",\"identityID\":\"91011\",\"uID\":1002,\"gID\":1002,\"capability\":[8,9]}"));
178 g_goodStrings.push_back(std::string(
179 "{\"bundleName\":\"testvalid3\",\"identityID\":\"999\",\"uID\":1002,\"gID\":1002,\"capability\":[]}"));
180 g_goodStrings.push_back(std::string(
181 "{\"bundleName\":\"testvalid3\",\"identityID\":\"3\",\"uID\":1002,\"gID\":1002,\"capability\":[1,2]}"));
182 }
183 };
184
185 /*
186 ** @tc.name: msgFuncFreeTest_001
187 ** @tc.desc: free message struct function, nullptr test
188 ** @tc.type: FUNC
189 ** @tc.require: AR000F733K
190 ** @tc.author: ZAL
191 **/
192 HWTEST_F(AppSpawnLiteTest, msgFuncFreeTest_001, TestSize.Level1)
193 {
194 // do not crash here
195 FreeMessageSt(nullptr);
196
197 MessageSt msgSt = {0};
198 FreeMessageSt(&msgSt);
199
200 EXPECT_EQ(msgSt.bundleName, nullptr);
201 EXPECT_EQ(msgSt.identityID, nullptr);
202 EXPECT_EQ(msgSt.caps, nullptr);
203 EXPECT_EQ(msgSt.uID, -1);
204 EXPECT_EQ(msgSt.gID, -1);
205 EXPECT_EQ(msgSt.capsCnt, 0);
206 }
207
208 /*
209 ** @tc.name: msgFuncFreeTest_002
210 ** @tc.desc: free message struct function, function test
211 ** @tc.type: FUNC
212 ** @tc.require: AR000F733K
213 ** @tc.author: ZAL
214 **/
215 HWTEST_F(AppSpawnLiteTest, msgFuncFreeTest_002, TestSize.Level1)
216 {
217 MessageSt msgSt = {0};
218
219 msgSt.capsCnt = MALLOC_TEST_LENGTH;
220 FreeMessageSt(&msgSt);
221 EXPECT_EQ(msgSt.capsCnt, 0);
222
223 msgSt.uID = TEST_UID;
224 FreeMessageSt(&msgSt);
225 EXPECT_EQ(msgSt.uID, -1);
226
227 msgSt.gID = TEST_GID;
228 FreeMessageSt(&msgSt);
229 EXPECT_EQ(msgSt.gID, -1);
230
231 msgSt.bundleName = (char*)malloc(MALLOC_TEST_LENGTH);
232 EXPECT_TRUE(msgSt.bundleName != nullptr);
233 FreeMessageSt(&msgSt);
234 EXPECT_EQ(msgSt.bundleName, nullptr);
235
236 msgSt.identityID = (char*)malloc(MALLOC_TEST_LENGTH);
237 EXPECT_TRUE(msgSt.identityID != nullptr);
238 FreeMessageSt(&msgSt);
239 EXPECT_EQ(msgSt.identityID, nullptr);
240
241 msgSt.caps = (unsigned int*)malloc(MALLOC_TEST_LENGTH * sizeof(unsigned int));
242 EXPECT_TRUE(msgSt.caps != nullptr);
243 FreeMessageSt(&msgSt);
244 EXPECT_EQ(msgSt.caps, nullptr);
245
246 // full test
247 msgSt.bundleName = (char*)malloc(MALLOC_TEST_LENGTH);
248 msgSt.identityID = (char*)malloc(MALLOC_TEST_LENGTH);
249 msgSt.caps = (unsigned int*)malloc(MALLOC_TEST_LENGTH * sizeof(unsigned int));
250 EXPECT_TRUE(msgSt.bundleName != nullptr);
251 EXPECT_TRUE(msgSt.identityID != nullptr);
252 EXPECT_TRUE(msgSt.caps != nullptr);
253
254 msgSt.capsCnt = MALLOC_TEST_LENGTH;
255 msgSt.uID = TEST_UID;
256 msgSt.gID = TEST_GID;
257
258 FreeMessageSt(&msgSt);
259 EXPECT_EQ(msgSt.bundleName, nullptr);
260 EXPECT_EQ(msgSt.identityID, nullptr);
261 EXPECT_EQ(msgSt.caps, nullptr);
262 EXPECT_EQ(msgSt.capsCnt, 0);
263 EXPECT_EQ(msgSt.uID, -1);
264 EXPECT_EQ(msgSt.gID, -1);
265 }
266
GetCurrentTime(struct timespec * tmCur)267 static void GetCurrentTime(struct timespec* tmCur)
268 {
269 if (tmCur == nullptr) {
270 return;
271 }
272 if (clock_gettime(CLOCK_REALTIME, tmCur) != 0) {
273 printf("[----------] AppSpawnLiteTest, get time failed! err %d.\n", errno);
274 }
275 }
276
277 /*
278 ** @tc.name: msgFuncSplitTest_001
279 ** @tc.desc: split message function, bad strings test
280 ** @tc.type: FUNC
281 ** @tc.require: AR000F733K
282 ** @tc.author: ZAL
283 **/
284 HWTEST_F(AppSpawnLiteTest, msgFuncSplitTest_001, TestSize.Level1)
285 {
286 MessageSt msgSt = {0};
287 EXPECT_NE(SplitMessage(nullptr, 0, nullptr), 0);
288 EXPECT_NE(SplitMessage(nullptr, 0, &msgSt), 0);
289
290 std::string testMsg = "xxxxxxxx";
291 EXPECT_NE(SplitMessage(testMsg.c_str(), testMsg.length(), nullptr), 0);
292
293 struct timespec tmStart = {0};
294 GetCurrentTime(&tmStart);
295
296 for (size_t i = 0; i < g_badStrings.size(); ++i) {
297 int ret = SplitMessage(g_badStrings[i].c_str(), g_badStrings[i].length(), &msgSt);
298 EXPECT_NE(ret, 0);
299 if (ret == 0) {
300 printf("[----------] AppSpawnLiteTest, msgFuncSplitTest_001 i = %u.\n", i);
301 FreeMessageSt(&msgSt);
302 }
303 }
304
305 struct timespec tmEnd = {0};
306 GetCurrentTime(&tmEnd);
307 long timeUsed = (tmEnd.tv_sec - tmStart.tv_sec) * NANOSECONDS_PER_SECOND + (tmEnd.tv_nsec - tmStart.tv_nsec);
308 printf("[----------] AppSpawnLiteTest, msgFuncSplitTest_001, total time %ld ns, strCnt %u.\n", \
309 timeUsed, g_badStrings.size());
310 }
311
312 /*
313 ** @tc.name: msgFuncSplitTest_002
314 ** @tc.desc: split message function, good strings test
315 ** @tc.type: FUNC
316 ** @tc.require: AR000F733K
317 ** @tc.author: ZAL
318 **/
319 HWTEST_F(AppSpawnLiteTest, msgFuncSplitTest_002, TestSize.Level1)
320 {
321 MessageSt msgSt = {0};
322
323 struct timespec tmStart = {0};
324 GetCurrentTime(&tmStart);
325
326 for (size_t i = 0; i < g_goodStrings.size(); ++i) {
327 int ret = SplitMessage(g_goodStrings[i].c_str(), g_goodStrings[i].length(), &msgSt);
328 EXPECT_EQ(ret, 0);
329 if (ret != 0) {
330 printf("[----------] AppSpawnLiteTest, msgFuncSplitTest_002 i = %u.\n", i);
331 } else {
332 FreeMessageSt(&msgSt);
333 }
334 }
335
336 struct timespec tmEnd = {0};
337 GetCurrentTime(&tmEnd);
338
339 long timeUsed = (tmEnd.tv_sec - tmStart.tv_sec) * NANOSECONDS_PER_SECOND + (tmEnd.tv_nsec - tmStart.tv_nsec);
340 printf("[----------] AppSpawnLiteTest, msgFuncSplitTest_002, total time %ld ns, strCnt %u.\n", \
341 timeUsed, g_goodStrings.size());
342
343 // parse one good string and check all results
344 std::string validStr =
345 "{\"bundleName\":\"validName\",\"identityID\":\"135\",\"uID\":999,\"gID\":888,\"capability\":[0, 1, 5]}";
346 int ret = SplitMessage(validStr.c_str(), validStr.length(), &msgSt);
347 EXPECT_EQ(ret, 0);
348
349 std::vector<unsigned int> caps;
350 caps.push_back(0); // 0, test capability
351 caps.push_back(1); // 1, test capability
352 caps.push_back(5); // 5, test capability
353
354 EXPECT_NE(msgSt.bundleName, nullptr);
355 EXPECT_NE(msgSt.identityID, nullptr);
356 EXPECT_EQ(strcmp("validName", msgSt.bundleName), 0);
357 EXPECT_EQ(strcmp("135", msgSt.identityID), 0);
358 EXPECT_EQ(TEST_UID, msgSt.uID);
359 EXPECT_EQ(TEST_GID, msgSt.gID);
360 EXPECT_EQ(caps.size(), msgSt.capsCnt);
361 EXPECT_NE(msgSt.caps, nullptr);
362 for (size_t i = 0; i < caps.size(); ++i) {
363 EXPECT_EQ(caps[i], msgSt.caps[i]);
364 }
365 FreeMessageSt(&msgSt);
366 }
367
368 HWTEST_F(AppSpawnLiteTest, SetContentFunctionTest_001, TestSize.Level0)
369 {
370 GTEST_LOG_(INFO) << "SetContentFunctionTest_001 start";
371 AppSpawnContent *content = AppSpawnCreateContent("AppSpawn", NULL, 0, 0);
372 SetContentFunction(content);
373
374 string longProcName = "SetContentFunctionTest_001";
375 int64_t longProcNameLen = longProcName.length();
376
377 AppSpawnClientLite *liteClient = (AppSpawnClientLite *)malloc(sizeof(AppSpawnClientLite));
378 EXPECT_TRUE(liteClient);
379 liteClient->client.id = 1;
380 liteClient->client.flags = 0;
381
382 std::string validStr =
383 "{\"bundleName\":\"validName\",\"identityID\":\"135\",\"uID\":999,\"gID\":888,\"capability\":[0, 1, 5]}";
384 int ret = SplitMessage(validStr.c_str(), validStr.length(), &liteClient->message);
385 EXPECT_EQ(ret, 0);
386
387 EXPECT_EQ(content->setProcessName(content, &liteClient->client, (char*)longProcName.c_str(),
388 longProcNameLen), 0);
389 EXPECT_EQ(content->setKeepCapabilities(content, &liteClient->client), 0);
390 EXPECT_EQ(content->setUidGid(content, &liteClient->client), 0);
391 EXPECT_EQ(content->setCapabilities(content, &liteClient->client), 0);
392 content->runChildProcessor(content, &liteClient->client);
393 free(liteClient);
394 GTEST_LOG_(INFO) << "SetContentFunctionTest_001 end";
395 }
396 } // namespace OHOS
397