• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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