• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2020 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 <errno.h>
17 #include <stdio.h>
18 #include <stdlib.h>
19 #include <time.h>
20 
21 #include <sys/types.h>
22 
23 #include <string>
24 #include <vector>
25 
26 #include "gtest/gtest.h"
27 #include "appspawn_message.h"
28 
29 using namespace testing::ext;
30 
31 namespace OHOS {
32 const unsigned int MALLOC_TEST_LENGTH = 10;
33 const long NANOSECONDS_PER_SECOND = 1000000000;
34 const int TEST_UID = 999;
35 const int TEST_GID = 888;
36 std::vector<std::string> g_badStrings;
37 std::vector<std::string> g_goodStrings;
38 
39 class StartupAppspawnUTest : public testing::Test {
40 public:
SetUpTestCase()41     static void SetUpTestCase()
42     {
43         // empty
44         g_badStrings.push_back(std::string(""));
45         // not json
46         g_badStrings.push_back(std::string("abcdefghijklmnopqrstuvwxyz"));
47         g_badStrings.push_back(std::string("0123456789876543210"));
48         g_badStrings.push_back(std::string("xxxx"));
49         g_badStrings.push_back(std::string("xxxxssssssssssssssssssss"));
50         g_badStrings.push_back(std::string("\"\"\"\"\"\"\"\"\"\"\"\"\"\"\""));
51         g_badStrings.push_back(std::string("............................................."));
52         g_badStrings.push_back(std::string("....%%%....^..***@##.../*--++......$$&&....."));
53         // looks like json but format error
54         g_badStrings.push_back(std::string("{bundleName\":\"nameV\",\"identityID\":\"1\",\"uID\":10,\"gID\":10,\"capability\":[0]}"));
55         g_badStrings.push_back(std::string("{\"bundleName:\"nameV\",\"identityID\":\"1\",\"uID\":10,\"gID\":10,\"capability\":[0]}"));
56         g_badStrings.push_back(std::string("{\"bundleName\":nameV\",\"identityID\":\"1\",\"uID\":10,\"gID\":10,\"capability\":[0]}"));
57         g_badStrings.push_back(std::string("{\"bundleName\":\"nameV,\"identityID\":\"1\",\"uID\":10,\"gID\":10,\"capability\":[0]}"));
58         g_badStrings.push_back(std::string("{\"bundleName\":\"nameV\",identityID\":\"1\",\"uID\":10,\"gID\":10,\"capability\":[0]}"));
59         g_badStrings.push_back(std::string("{\"bundleName\":\"nameV\",\"identityID:\"1\",\"uID\":10,\"gID\":10,\"capability\":[0]}"));
60         g_badStrings.push_back(std::string("{\"bundleName\":\"nameV\",\"identityID\":1\",\"uID\":10,\"gID\":10,\"capability\":[0]}"));
61         g_badStrings.push_back(std::string("{\"bundleName\":\"nameV\",\"identityID\":\"1,\"uID\":10,\"gID\":10,\"capability\":[0]}"));
62         g_badStrings.push_back(std::string("{\"bundleName\":\"nameV\",\"identityID\":\"1\",uID\":10,\"gID\":10,\"capability\":[0]}"));
63         g_badStrings.push_back(std::string("{\"bundleName\":\"nameV\",\"identityID\":\"1\",\"uID:10,\"gID\":10,\"capability\":[0]}"));
64         g_badStrings.push_back(std::string("{\"bundleName\":\"nameV\",\"identityID\":\"1\",\"uID\":10,gID\":10,\"capability\":[0]}"));
65         g_badStrings.push_back(std::string("{\"bundleName\":\"nameV\",\"identityID\":\"1\",\"uID\":10,\"gID:10,\"capability\":[0]}"));
66         g_badStrings.push_back(std::string("{\"bundleName\":\"nameV\",\"identityID\":\"1\",\"uID\":10,\"gID\":10,capability\":[0]}"));
67         g_badStrings.push_back(std::string("{\"bundleName\":\"nameV\",\"identityID\":\"1\",\"uID\":10,\"gID\":10,\"capability:[0]}"));
68         g_badStrings.push_back(std::string("{\"bundleName\":\"nameV\",\"identityID\":\"1\",\"uID\":10,\"gID\":10,\"capability\":[0]}"));
69         g_badStrings.push_back(std::string("{\"bundleName\":\"nameV\",\"identityID\":\"1\",\"uID\":10,\"gID\":10,\"capability\":0]}"));
70         g_badStrings.push_back(std::string("{\"bundleName\":\"nameV\",\"identityID\":\"1\",\"uID\":10,\"gID\":10,\"capability\":[0}"));
71         g_badStrings.push_back(std::string("{\"bundleName\":\"nameV\",\"identityID\":\"1\",\"uID\":10,\"gID\":10,\"capability\":[0]"));
72         g_badStrings.push_back(std::string("\"bundleName\":\"nameV\",\"identityID\":\"1\",\"uID\":10,\"gID\":10,\"capability\":[0]}"));
73         g_badStrings.push_back(std::string("{\"bundleName\"\"nameV\",\"identityID\":\"1\",\"uID\":10,\"gID\":10,\"capability\":[0]}"));
74         g_badStrings.push_back(std::string("{\"bundleName\":\"nameV\"\"identityID\":\"1\",\"uID\":10,\"gID\":10,\"capability\":[0]}"));
75         g_badStrings.push_back(std::string("{\"bundleName\":\"nameV\",\"identityID\"\"1\",\"uID\":10,\"gID\":10,\"capability\":[0]}"));
76         g_badStrings.push_back(std::string("{\"bundleName\":\"nameV\",\"identityID\":\"1\"\"uID\":10,\"gID\":10,\"capability\":[0]}"));
77         g_badStrings.push_back(std::string("{\"bundleName\":\"nameV\",\"identityID\":\"1\",\"uID\"10,\"gID\":10,\"capability\":[0]}"));
78         g_badStrings.push_back(std::string("{\"bundleName\":\"nameV\",\"identityID\":\"1\",\"uID\":10\"gID\":10,\"capability\":[0]}"));
79         g_badStrings.push_back(std::string("{\"bundleName\":\"nameV\",\"identityID\":\"1\",\"uID\":10,\"gID\"10,\"capability\":[0]}"));
80         g_badStrings.push_back(std::string("{\"bundleName\":\"nameV\",\"identityID\":\"1\",\"uID\":10,\"gID\":10\"capability\":[0]}"));
81         g_badStrings.push_back(std::string("{\"bundleName\":\"nameV\",\"identityID\":\"1\",\"uID\":10,\"gID\":10,\"capability\"[0]}"));
82         g_badStrings.push_back(std::string("{\"bundleName\":\"nameV\",\"identityID\":\"1\",\"uID\":10,\"gID\":10,\"capability\":[0]},"));
83         g_badStrings.push_back(std::string("{\"bundleName\":\"nameV\",\"identityID\":\"1\",\"uID\":10,\"gID\":10,\"capability\":[0],}"));
84         g_badStrings.push_back(std::string("{\"bundleName\":\"nameV\",\"identityID\":\"1\",\"uID\":10,\"gID\":10,\"capability\":[0,]}"));
85         // json format correct but fields missing
86         g_badStrings.push_back(std::string("{\"bundleName\":\"nameV\",\"identityID\":\"1234\",\"uID\":1000,\"gID\":1000,\"capability\":[0]}"));
87         g_badStrings.push_back(std::string("{\"\":\"nameV\",\"identityID\":\"1234\",\"uID\":1000,\"gID\":1000,\"capability\":[0]}"));
88         g_badStrings.push_back(std::string("{\"identityID\":\"1234\",\"uID\":1000,\"gID\":1000,\"capability\":[0]}"));
89         g_badStrings.push_back(std::string("{\"bundleName\":\"nameV\",\"\":\"1234\",\"uID\":1000,\"gID\":1000,\"capability\":[0]}"));
90         g_badStrings.push_back(std::string("{\"bundleName\":\"nameV\",\"uID\":1000,\"gID\":1000,\"capability\":[0]}"));
91         g_badStrings.push_back(std::string("{\"bundleName\":\"nameV\",\"identityID\":\"1234\",\"\":1000,\"gID\":1000,\"capability\":[0]}"));
92         g_badStrings.push_back(std::string("{\"bundleName\":\"nameV\",\"identityID\":\"1234\",\"gID\":1000,\"capability\":[0]}"));
93         g_badStrings.push_back(std::string("{\"bundleName\":\"nameV\",\"identityID\":\"1234\",\"uID\":1000,\"\":1000,\"capability\":[0]}"));
94         g_badStrings.push_back(std::string("{\"bundleName\":\"nameV\",\"identityID\":\"1234\",\"uID\":1000,\"capability\":[0]}"));
95         g_badStrings.push_back(std::string("{\"bundleName\":\"nameV\",\"identityID\":\"1234\",\"uID\":1000,\"gID\":1000,\"\":[0]}"));
96         g_badStrings.push_back(std::string("{\"bundleName\":\"nameV\",\"identityID\":\"1234\",\"uID\":1000,\"gID\":1000}"));
97         // field value invalid
98         g_badStrings.push_back(std::string("{\"bundleName\":\"\",\"identityID\":\"1234\",\"uID\":1000,\"gID\":1000,\"capability\":[0]}"));
99         g_badStrings.push_back(std::string("{\"bundleName\":\"test1test1test1test1test1test1test1test1test1test1test1test1test1test1test1test1test1test1test1test1test1test1test1test1test1test1test1test1test1test1test1test1\",\"identityID\":\"1234\",\"uID\":1000,\"gID\":1000,\"capability\":[0]}"));
100         g_badStrings.push_back(std::string("{\"bundleName\":\"nameV\",\"identityID\":\"\",\"uID\":1000,\"gID\":1000,\"capability\":[0]}"));
101         g_badStrings.push_back(std::string("{\"bundleName\":\"nameV\",\"identityID\":\"012345978901234597890123459789\",\"uID\":1000,\"gID\":1000,\"capability\":[0]}"));
102         g_badStrings.push_back(std::string("{\"bundleName\":\"nameV\",\"identityID\":\"1234\",\"uID\":-1000,\"gID\":1000,\"capability\":[0]}"));
103         g_badStrings.push_back(std::string("{\"bundleName\":\"nameV\",\"identityID\":\"1234\",\"uID\":1000,\"gID\":-1000,\"capability\":[-7]}"));
104         g_badStrings.push_back(std::string("{\"bundleName\":\"nameV\",\"identityID\":\"1234\",\"uID\":1000,\"gID\":1000,\"capability\":1}"));
105         g_badStrings.push_back(std::string("{\"bundleName\":\"nameV\",\"identityID\":\"1234\",\"uID\":1000,\"gID\":1000,\"capability\":[0, 3, -9]}"));
106         g_badStrings.push_back(std::string("{\"bundleName\":\"nameV\",\"identityID\":\"1234\",\"uID\":1000,\"gID\":1000,\"capability\":[99999999]}"));
107         g_badStrings.push_back(std::string("{\"bundleName\":\"nameV\",\"identityID\":1234,\"uID\":1000,\"gID\":1000,\"capability\":[0]}"));
108         g_badStrings.push_back(std::string("{\"bundleName\":\"nameV\",\"identityID\":\"1234\",\"uID\":\"1000\",\"gID\":1000,\"capability\":[0]}"));
109         g_badStrings.push_back(std::string("{\"bundleName\":\"nameV\",\"identityID\":\"1234\",\"uID\":1000,\"gID\":\"1000\",\"capability\":[0]}"));
110         g_badStrings.push_back(std::string("{\"bundleName\":\"nameV\",\"identityID\":\"1234\",\"uID\":1000,\"gID\":1000,\"capability\":\"0\"}"));
111         g_badStrings.push_back(std::string("{\"bundleName\": 250,\"identityID\":\"1234\",\"uID\":1000,\"gID\":1000,\"capability\":[0]}"));
112 
113         g_goodStrings.push_back(std::string("{\"bundleName\":\"testvalid1\",\"identityID\":\"1234\",\"uID\":1000,\"gID\":1000,\"capability\":[0]}"));
114         g_goodStrings.push_back(std::string("{\"bundleName\":\"testvalid2\",\"identityID\":\"5678\",\"uID\":1001,\"gID\":1001,\"capability\":[3,5]}"));
115         g_goodStrings.push_back(std::string("{\"bundleName\":\"testvalid3\",\"identityID\":\"91011\",\"uID\":1002,\"gID\":1002,\"capability\":[8,9]}"));
116         g_goodStrings.push_back(std::string("{\"bundleName\":\"testvalid3\",\"identityID\":\"999\",\"uID\":1002,\"gID\":1002,\"capability\":[]}"));
117         g_goodStrings.push_back(std::string("{\"bundleName\":\"testvalid3\",\"identityID\":\"3\",\"uID\":1002,\"gID\":1002,\"capability\":[1,2]}"));
118         printf("[----------] StartupAppspawnUTest, message func test setup.\n");
119     }
120 
TearDownTestCase()121     static void TearDownTestCase()
122     {
123         g_badStrings.clear();
124         g_goodStrings.clear();
125         printf("[----------] StartupAppspawnUTest, message func test teardown.\n");
126     }
SetUp()127     void SetUp() {}
TearDown()128     void TearDown() {}
129 };
130 
131 /*
132  ** @tc.name: msgFuncFreeTest_001
133  ** @tc.desc: free message struct function, nullptr test
134  ** @tc.type: FUNC
135  ** @tc.require: AR000F733K
136  ** @tc.author: ZAL
137  **/
138 HWTEST_F(StartupAppspawnUTest, msgFuncFreeTest_001, TestSize.Level1)
139 {
140     // do not crash here
141     FreeMessageSt(nullptr);
142 
143     MessageSt msgSt = {0};
144     FreeMessageSt(&msgSt);
145 
146     EXPECT_EQ(msgSt.bundleName, nullptr);
147     EXPECT_EQ(msgSt.identityID, nullptr);
148     EXPECT_EQ(msgSt.caps, nullptr);
149     EXPECT_EQ(msgSt.uID, -1);
150     EXPECT_EQ(msgSt.gID, -1);
151     EXPECT_EQ(msgSt.capsCnt, 0);
152 }
153 
154 /*
155  ** @tc.name: msgFuncFreeTest_002
156  ** @tc.desc: free message struct function, function test
157  ** @tc.type: FUNC
158  ** @tc.require: AR000F733K
159  ** @tc.author: ZAL
160  **/
161 HWTEST_F(StartupAppspawnUTest, msgFuncFreeTest_002, TestSize.Level1)
162 {
163     MessageSt msgSt = {0};
164 
165     msgSt.capsCnt = MALLOC_TEST_LENGTH;
166     FreeMessageSt(&msgSt);
167     EXPECT_EQ(msgSt.capsCnt, 0);
168 
169     msgSt.uID = TEST_UID;
170     FreeMessageSt(&msgSt);
171     EXPECT_EQ(msgSt.uID, -1);
172 
173     msgSt.gID = TEST_GID;
174     FreeMessageSt(&msgSt);
175     EXPECT_EQ(msgSt.gID, -1);
176 
177     msgSt.bundleName = (char*)malloc(MALLOC_TEST_LENGTH);
178     EXPECT_TRUE(msgSt.bundleName != nullptr);
179     FreeMessageSt(&msgSt);
180     EXPECT_EQ(msgSt.bundleName, nullptr);
181 
182     msgSt.identityID = (char*)malloc(MALLOC_TEST_LENGTH);
183     EXPECT_TRUE(msgSt.identityID != nullptr);
184     FreeMessageSt(&msgSt);
185     EXPECT_EQ(msgSt.identityID, nullptr);
186 
187     msgSt.caps = (unsigned int*)malloc(MALLOC_TEST_LENGTH * sizeof(unsigned int));
188     EXPECT_TRUE(msgSt.caps != nullptr);
189     FreeMessageSt(&msgSt);
190     EXPECT_EQ(msgSt.caps, nullptr);
191 
192     // full test
193     msgSt.bundleName = (char*)malloc(MALLOC_TEST_LENGTH);
194     msgSt.identityID = (char*)malloc(MALLOC_TEST_LENGTH);
195     msgSt.caps = (unsigned int*)malloc(MALLOC_TEST_LENGTH * sizeof(unsigned int));
196     EXPECT_TRUE(msgSt.bundleName != nullptr);
197     EXPECT_TRUE(msgSt.identityID != nullptr);
198     EXPECT_TRUE(msgSt.caps != nullptr);
199 
200     msgSt.capsCnt = MALLOC_TEST_LENGTH;
201     msgSt.uID = TEST_UID;
202     msgSt.gID = TEST_GID;
203 
204     FreeMessageSt(&msgSt);
205     EXPECT_EQ(msgSt.bundleName, nullptr);
206     EXPECT_EQ(msgSt.identityID, nullptr);
207     EXPECT_EQ(msgSt.caps, nullptr);
208     EXPECT_EQ(msgSt.capsCnt, 0);
209     EXPECT_EQ(msgSt.uID, -1);
210     EXPECT_EQ(msgSt.gID, -1);
211 };
212 
GetCurrentTime(struct timespec * tmCur)213 static void GetCurrentTime(struct timespec* tmCur)
214 {
215     if (tmCur == nullptr) {
216         return;
217     }
218     if (clock_gettime(CLOCK_REALTIME, tmCur) != 0) {
219         printf("[----------] StartupAppspawnUTest, get time failed! err %d.\n", errno);
220     }
221 }
222 
223 /*
224  ** @tc.name: msgFuncSplitTest_001
225  ** @tc.desc: split message function, bad strings test
226  ** @tc.type: FUNC
227  ** @tc.require: AR000F733K
228  ** @tc.author: ZAL
229  **/
230 HWTEST_F(StartupAppspawnUTest, msgFuncSplitTest_001, TestSize.Level1)
231 {
232     MessageSt msgSt = {0};
233     EXPECT_NE(SplitMessage(nullptr, 0, nullptr), 0);
234     EXPECT_NE(SplitMessage(nullptr, 0, &msgSt), 0);
235 
236     std::string testMsg = "xxxxxxxx";
237     EXPECT_NE(SplitMessage(testMsg.c_str(), testMsg.length(), nullptr), 0);
238 
239     struct timespec tmStart = {0};
240     GetCurrentTime(&tmStart);
241 
242     for (size_t i = 0; i < g_badStrings.size(); ++i) {
243         int ret = SplitMessage(g_badStrings[i].c_str(), g_badStrings[i].length(), &msgSt);
244         EXPECT_NE(ret, 0);
245         if (ret == 0) {
246             printf("[----------] StartupAppspawnUTest, msgFuncSplitTest_001 i = %u.\n", i);
247             FreeMessageSt(&msgSt);
248         }
249     }
250 
251     struct timespec tmEnd = {0};
252     GetCurrentTime(&tmEnd);
253     long timeUsed = (tmEnd.tv_sec - tmStart.tv_sec) * NANOSECONDS_PER_SECOND + (tmEnd.tv_nsec - tmStart.tv_nsec);
254     printf("[----------] StartupAppspawnUTest, msgFuncSplitTest_001, total time %ld ns, strCnt %u.\n", \
255         timeUsed, g_badStrings.size());
256 }
257 
258 /*
259  ** @tc.name: msgFuncSplitTest_002
260  ** @tc.desc: split message function, good strings test
261  ** @tc.type: FUNC
262  ** @tc.require: AR000F733K
263  ** @tc.author: ZAL
264  **/
265 HWTEST_F(StartupAppspawnUTest, msgFuncSplitTest_002, TestSize.Level1)
266 {
267     MessageSt msgSt = {0};
268 
269     struct timespec tmStart = {0};
270     GetCurrentTime(&tmStart);
271 
272     for (size_t i = 0; i < g_goodStrings.size(); ++i) {
273         int ret = SplitMessage(g_goodStrings[i].c_str(), g_goodStrings[i].length(), &msgSt);
274         EXPECT_EQ(ret, 0);
275         if (ret != 0) {
276             printf("[----------] StartupAppspawnUTest, msgFuncSplitTest_002 i = %u.\n", i);
277         } else {
278             FreeMessageSt(&msgSt);
279         }
280     }
281 
282     struct timespec tmEnd = {0};
283     GetCurrentTime(&tmEnd);
284 
285     long timeUsed = (tmEnd.tv_sec - tmStart.tv_sec) * NANOSECONDS_PER_SECOND + (tmEnd.tv_nsec - tmStart.tv_nsec);
286     printf("[----------] StartupAppspawnUTest, msgFuncSplitTest_002, total time %ld ns, strCnt %u.\n", \
287         timeUsed, g_goodStrings.size());
288 
289     // parse one good string and check all results
290     std::string validStr =
291         "{\"bundleName\":\"validName\",\"identityID\":\"135\",\"uID\":999,\"gID\":888,\"capability\":[0, 1, 5]}";
292     int ret = SplitMessage(validStr.c_str(), validStr.length(), &msgSt);
293     EXPECT_EQ(ret, 0);
294 
295     std::vector<unsigned int> caps;
296     caps.push_back(0);    // 0, test capability
297     caps.push_back(1);    // 1, test capability
298     caps.push_back(5);    // 5, test capability
299 
300     EXPECT_NE(msgSt.bundleName, nullptr);
301     EXPECT_NE(msgSt.identityID, nullptr);
302     EXPECT_EQ(strcmp("validName", msgSt.bundleName), 0);
303     EXPECT_EQ(strcmp("135", msgSt.identityID), 0);
304     EXPECT_EQ(TEST_UID, msgSt.uID);
305     EXPECT_EQ(TEST_GID, msgSt.gID);
306     EXPECT_EQ(caps.size(), msgSt.capsCnt);
307     EXPECT_NE(msgSt.caps, nullptr);
308     for (size_t i = 0; i < caps.size(); ++i) {
309         EXPECT_EQ(caps[i], msgSt.caps[i]);
310     }
311     FreeMessageSt(&msgSt);
312 }
313 }  // namespace OHOS
314