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