1 /*
2 * Copyright (c) 2021 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 <gtest/gtest.h>
16
17 #include "init_param.h"
18 #include "param_message.h"
19 #include "param_stub.h"
20 #include "trigger_manager.h"
21 #include "param_utils.h"
22 #include "param_osadp.h"
23 #include "param_manager.h"
24
25 using namespace testing::ext;
26 using namespace std;
27
28 extern "C" {
29 int WorkSpaceNodeCompare(const HashNode *node1, const HashNode *node2);
30 }
31
OnClose(ParamTaskPtr client)32 static void OnClose(ParamTaskPtr client)
33 {
34 UNUSED(client);
35 }
36
CheckServerParamValue(const char * name,const char * expectValue)37 static int CheckServerParamValue(const char *name, const char *expectValue)
38 {
39 char tmp[PARAM_BUFFER_SIZE] = {0};
40 u_int32_t len = sizeof(tmp);
41 SystemReadParam(name, tmp, &len);
42 printf("CheckParamValue name %s value: \'%s\' expectValue:\'%s\' \n", name, tmp, expectValue);
43 EXPECT_NE((int)strlen(tmp), 0);
44 if (expectValue != nullptr) {
45 EXPECT_EQ(strcmp(tmp, expectValue), 0);
46 }
47 return 0;
48 }
49
50 namespace init_ut {
51 class ParamUnitTest : public ::testing::Test {
52 public:
ParamUnitTest()53 ParamUnitTest() {}
~ParamUnitTest()54 virtual ~ParamUnitTest() {}
55
SetUpTestCase(void)56 static void SetUpTestCase(void)
57 {
58 PrepareInitUnitTestEnv();
59 };
SetUp()60 void SetUp() {}
TearDown()61 void TearDown() {}
TestBody()62 void TestBody() {}
63
TestSetParams(const char * params[][1+1],int num)64 int TestSetParams(const char *params[][1 + 1], int num)
65 {
66 for (int i = 0; i < num; i++) {
67 SystemWriteParam(params[i][0], params[i][1]);
68 }
69
70 // check
71 for (int i = 0; i < num; i++) {
72 CheckServerParamValue(params[i][0], params[i][1]);
73 }
74
75 for (int i = num - 1; i >= 0; i--) {
76 CheckServerParamValue(params[i][0], params[i][1]);
77 }
78 return 0;
79 }
80
TestAddSecurityLabel1()81 int TestAddSecurityLabel1()
82 {
83 GetParamSecurityLabel()->cred.gid = 9999; // 9999 test gid
84 const char *name = "label1.test.aaa.bbb.ccc.dddd.eee";
85 const char *value = "2001";
86 uint32_t labelIndex = 0;
87 SystemWriteParam(name, value);
88 // get root
89 WorkSpace *workspace = GetWorkSpace(WORKSPACE_NAME_DAC);
90 (void)FindTrieNode(workspace, name, strlen(name), &labelIndex);
91 ParamSecurityNode *node = (ParamSecurityNode *)GetTrieNode(workspace, labelIndex);
92 if (node == nullptr) {
93 EXPECT_EQ(1, 0);
94 return 0;
95 }
96 EXPECT_EQ(node->gid, DAC_DEFAULT_GROUP);
97 return 0;
98 }
99
100 // 添加一个label,最长匹配到这个节点
TestAddSecurityLabel2()101 int TestAddSecurityLabel2()
102 {
103 GetParamSecurityLabel()->cred.gid = 9999; // 9999 test gid
104 const char *name = "label2.test.aaa.bbb.ccc.dddd.eee";
105 const char *value = "2001";
106 ParamAuditData auditData = {};
107 auditData.name = "label2.test.aaa";
108 auditData.dacData.gid = 202; // 202 test dac gid
109 auditData.dacData.uid = geteuid();
110 auditData.dacData.mode = 0666; // 0666 test mode
111 SystemWriteParam(name, value);
112 uint32_t labelIndex = 0;
113 AddSecurityLabel(&auditData);
114 WorkSpace *workspace = GetWorkSpace(WORKSPACE_NAME_DAC);
115 (void)FindTrieNode(workspace, name, strlen(name), &labelIndex);
116 ParamSecurityNode *node = (ParamSecurityNode *)GetTrieNode(workspace, labelIndex);
117 if (node == nullptr) {
118 EXPECT_EQ(1, 0);
119 return 0;
120 }
121 EXPECT_EQ(node->gid, auditData.dacData.gid);
122 return 0;
123 }
124
125 // 添加一个label,最长匹配到最后一个相同节点
TestAddSecurityLabel3()126 int TestAddSecurityLabel3()
127 {
128 GetParamSecurityLabel()->cred.gid = 9999; // 9999 test gid
129 const char *name = "label3.test.aaa.bbb.ccc.dddd.eee";
130 const char *value = "2001";
131 ParamAuditData auditData = {};
132 auditData.name = "label3.test.aaa";
133 auditData.dacData.gid = 203; // 203 test gid
134 auditData.dacData.uid = geteuid();
135 auditData.dacData.mode = 0666; // 0666 test mode
136 SystemWriteParam(name, value);
137 AddSecurityLabel(&auditData);
138
139 auditData.name = "label3.test.aaa.bbb.ccc.dddd.eee.dddd";
140 auditData.dacData.gid = 202; // 202 test dac gid
141 auditData.dacData.uid = geteuid();
142 auditData.dacData.mode = 0666; // 0666 test mode
143 SystemWriteParam(name, value);
144 AddSecurityLabel(&auditData);
145
146 uint32_t labelIndex = 0;
147 WorkSpace *workspace = GetWorkSpace(WORKSPACE_NAME_DAC);
148 ParamTrieNode *paramNode = FindTrieNode(workspace, name, strlen(name), &labelIndex);
149 ParamSecurityNode *node = (ParamSecurityNode *)GetTrieNode(workspace, labelIndex);
150 if (paramNode == nullptr || node == nullptr) {
151 EXPECT_EQ(1, 0);
152 return 0;
153 }
154 EXPECT_EQ((int)node->gid, 203); // 203 test gid
155 return 0;
156 }
157
158 // 添加一个label,完全匹配
TestAddSecurityLabel4()159 int TestAddSecurityLabel4()
160 {
161 GetParamSecurityLabel()->cred.gid = 9999; // 9999 test gid
162 const char *name = "label4.test.aaa.bbb.ccc.dddd.eee";
163 const char *value = "2001";
164 ParamAuditData auditData = {};
165 auditData.name = "label4.test.aaa.bbb.ccc.dddd.eee";
166 auditData.dacData.gid = 203; // 203 test gid
167 auditData.dacData.uid = geteuid();
168 auditData.dacData.mode = 0666; // 0666 test mode
169 SystemWriteParam(name, value);
170 uint32_t labelIndex = 0;
171 AddSecurityLabel(&auditData);
172 WorkSpace *workspace = GetWorkSpace(WORKSPACE_NAME_DAC);
173 ParamTrieNode *paramNode = FindTrieNode(workspace, name, strlen(name), &labelIndex);
174 ParamSecurityNode *node = (ParamSecurityNode *)GetTrieNode(workspace, labelIndex);
175 if (paramNode == nullptr || node == nullptr) {
176 EXPECT_EQ(1, 0);
177 return 0;
178 }
179 EXPECT_EQ(node->gid, auditData.dacData.gid);
180 return 0;
181 }
182
TestBufferValue(char * buffer,uint32_t len)183 void TestBufferValue(char *buffer, uint32_t len)
184 {
185 const int printBase = 10;
186 for (uint32_t index = 0; index <= len; index++) {
187 buffer[index] = '0' + index % printBase;
188 if (index != 0 && index % printBase == 0) {
189 buffer[index] = '.';
190 }
191 }
192 buffer[len] = '\0';
193 }
194
TestNameIsValid()195 int TestNameIsValid()
196 {
197 char buffer[PARAM_BUFFER_SIZE];
198 // set name length = 127
199 TestBufferValue(buffer, PARAM_NAME_LEN_MAX - 1);
200 int ret = SystemWriteParam(buffer, "1111");
201 EXPECT_EQ(ret, 0);
202 TestBufferValue(buffer, PARAM_NAME_LEN_MAX);
203 ret = SystemWriteParam(buffer, "1111");
204 EXPECT_NE(ret, 0);
205 TestBufferValue(buffer, PARAM_NAME_LEN_MAX + 1);
206 ret = SystemWriteParam(buffer, "1111");
207 EXPECT_NE(ret, 0);
208
209 // 保存一个只读的属性,大于最大值
210 TestBufferValue(buffer, PARAM_VALUE_LEN_MAX - 1);
211 ret = SystemWriteParam("const.test_readonly.dddddddddddddddddd.fffffffffffffffffff", buffer);
212 EXPECT_EQ(ret, 0);
213
214 TestBufferValue(buffer, PARAM_VALUE_LEN_MAX + 1);
215 ret = SystemWriteParam("const.test_readonly.aaaaaaaaaaaaaaaaaa.fffffffffffffffffff", buffer);
216 EXPECT_EQ(ret, 0);
217
218 // 更新只读项目
219 TestBufferValue(buffer, PARAM_VALUE_LEN_MAX - 1);
220 ret = SystemWriteParam("const.test_readonly.dddddddddddddddddd.fffffffffffffffffff", buffer);
221 EXPECT_NE(ret, 0);
222
223 // 写普通属性
224 TestBufferValue(buffer, PARAM_VALUE_LEN_MAX - 1);
225 ret = SystemWriteParam("test.bigvalue.dddddddddddddddddd.fffffffffffffffffff", buffer);
226 EXPECT_EQ(ret, 0);
227 TestBufferValue(buffer, PARAM_VALUE_LEN_MAX + 1);
228 ret = SystemWriteParam("test.bigvalue.dddddddddddddddddd.fffffffffffffffffff", buffer);
229 EXPECT_NE(ret, 0);
230
231 // invalid name
232 TestBufferValue(buffer, PARAM_VALUE_LEN_MAX - 1);
233 ret = SystemWriteParam("test.invalidname..fffffffffffffffffff", buffer);
234 EXPECT_NE(ret, 0);
235 ret = SystemWriteParam("test.invalidname.%fffffffffffffffffff", buffer);
236 EXPECT_NE(ret, 0);
237 ret = SystemWriteParam("test.invalidname.$fffffffffffffffffff", buffer);
238 EXPECT_NE(ret, 0);
239 return 0;
240 }
241
TestParamTraversal()242 int TestParamTraversal()
243 {
244 char value[PARAM_BUFFER_SIZE + PARAM_BUFFER_SIZE] = {0};
245 SystemTraversalParameter(
246 "",
247 [](ParamHandle handle, void *cookie) {
248 SystemGetParameterName(handle, (char *)cookie, PARAM_BUFFER_SIZE);
249 u_int32_t len = PARAM_BUFFER_SIZE;
250 SystemGetParameterValue(handle, ((char *)cookie) + PARAM_BUFFER_SIZE, &len);
251 printf("$$$$$$$$Param %s=%s \n", (char *)cookie, ((char *)cookie) + PARAM_BUFFER_SIZE);
252 },
253 (void *)value);
254 return 0;
255 }
256
TestUpdateParam(const char * name,const char * value)257 int TestUpdateParam(const char *name, const char *value)
258 {
259 SystemWriteParam(name, value);
260 SystemWriteParam(name, value);
261 SystemWriteParam(name, value);
262 SystemWriteParam(name, value);
263 CheckServerParamValue(name, value);
264 return 0;
265 }
266
TestPersistParam()267 int TestPersistParam()
268 {
269 ParamAuditData auditData = {};
270 auditData.name = "persist.";
271 auditData.dacData.gid = 0;
272 auditData.dacData.uid = 0;
273 auditData.dacData.mode = 0777; // 0777 test mode
274 AddSecurityLabel(&auditData);
275
276 LoadPersistParams();
277 SystemWriteParam("persist.111.ffff.bbbb.cccc.dddd.eeee", "1101");
278 SystemWriteParam("persist.111.aaaa.bbbb.cccc.dddd.eeee", "1102");
279 SystemWriteParam("persist.111.bbbb.cccc.dddd.eeee", "1103");
280 CheckServerParamValue("persist.111.bbbb.cccc.dddd.eeee", "1103");
281
282 SystemWriteParam("persist.111.cccc.bbbb.cccc.dddd.eeee", "1104");
283 SystemWriteParam("persist.111.eeee.bbbb.cccc.dddd.eeee", "1105");
284 CheckServerParamValue("persist.111.ffff.bbbb.cccc.dddd.eeee", "1101");
285 SystemWriteParam("persist.111.ffff.bbbb.cccc.dddd.eeee", "1106");
286 CheckServerParamValue("persist.111.ffff.bbbb.cccc.dddd.eeee", "1106");
287 sleep(1);
288 SystemWriteParam("persist.111.bbbb.cccc.dddd.1107", "1107");
289 SystemWriteParam("persist.111.bbbb.cccc.dddd.1108", "1108");
290 SystemWriteParam("persist.111.bbbb.cccc.dddd.1109", "1108");
291 sleep(1);
292 SystemWriteParam("persist.111.bbbb.cccc.dddd.1110", "1108");
293 SystemWriteParam("persist.111.bbbb.cccc.dddd.1111", "1108");
294 TimerCallbackForSave(nullptr, nullptr);
295 LoadPersistParams();
296 return 0;
297 }
298
TestDumpParamMemory()299 int TestDumpParamMemory()
300 {
301 SystemDumpParameters(1, NULL);
302 return 0;
303 }
304 };
305
306 HWTEST_F(ParamUnitTest, TestPersistParam, TestSize.Level0)
307 {
308 ParamUnitTest test;
309 test.TestPersistParam();
310 }
311
312 HWTEST_F(ParamUnitTest, TestSetParam_1, TestSize.Level0)
313 {
314 ParamUnitTest test;
315 const char *params[][2] = {{"111.2222", "1"},
316 {"111.2222.3333", "2"},
317 {"111.2222.3333.4444", "3"},
318 {"111.2222.3333.4444.666", "4"},
319 {"111.2222.3333.4444.666.777", "5"}};
320 test.TestSetParams(params, 5);
321 }
322
323 HWTEST_F(ParamUnitTest, TestSetParam_2, TestSize.Level0)
324 {
325 ParamUnitTest test;
326 const char *params[][2] = {{"111.2222.xxxx.xxx.xxx", "1_1"},
327 {"111.2222.3333.xxx", "1_2"},
328 {"111.2222.xxxx.3333.4444", "1_3"},
329 {"111.2222.3333.xxxx.4444.666", "1_4"},
330 {"111.2222.3333.4444.666.xxxxx.777", "1_5"}};
331 test.TestSetParams(params, 5);
332
333 const char *ctrlParams[][2] = {{"ctl.start.111.2222.xxxx.xxx.xxx", "2_1"},
334 {"ctl.start.111.2222.3333.xxx", "2_2"},
335 {"ctl.start.111.2222.xxxx.3333.4444", "2_3"},
336 {"ctl.start.111.2222.3333.xxxx.4444.666", "2_4"},
337 {"ctl.start.111.2222.3333.4444.666.xxxxx.777", "2_5"}};
338 test.TestSetParams(ctrlParams, 5);
339
340 const char *sysParams[][2] = {{"ohos.startup.powerctrl.111.2222.xxxx.xxx.xxx", "3_1"},
341 {"ohos.startup.powerctrl.111.2222.3333.xxx", "3_2"},
342 {"ohos.startup.powerctrl.111.2222.xxxx.3333.4444", "3_3"},
343 {"ohos.startup.powerctrl.111.2222.3333.xxxx.4444.666", "3_4"},
344 {"ohos.startup.powerctrl.111.2222.3333.4444.666.xxxxx.777", "3_5"}};
345 test.TestSetParams(sysParams, 5);
346 }
347
348 HWTEST_F(ParamUnitTest, TestNameIsValid, TestSize.Level0)
349 {
350 ParamUnitTest test;
351 test.TestNameIsValid();
352 }
353
354 HWTEST_F(ParamUnitTest, TestAddSecurityLabel1, TestSize.Level0)
355 {
356 ParamUnitTest test;
357 test.TestAddSecurityLabel1();
358 }
359
360 HWTEST_F(ParamUnitTest, TestAddSecurityLabel2, TestSize.Level0)
361 {
362 ParamUnitTest test;
363 test.TestAddSecurityLabel2();
364 }
365
366 HWTEST_F(ParamUnitTest, TestAddSecurityLabel3, TestSize.Level0)
367 {
368 ParamUnitTest test;
369 test.TestAddSecurityLabel3();
370 }
371
372 HWTEST_F(ParamUnitTest, TestAddSecurityLabel4, TestSize.Level0)
373 {
374 ParamUnitTest test;
375 test.TestAddSecurityLabel4();
376 }
377
378 HWTEST_F(ParamUnitTest, TestUpdateParam, TestSize.Level0)
379 {
380 ParamUnitTest test;
381 test.TestUpdateParam("test.aaa.bbb.ccc.ddd", "100");
382 test.TestUpdateParam("test.aaa.bbb.ccc.ddd", "101");
383 test.TestUpdateParam("test.aaa.bbb.ccc.ddd", "102");
384 test.TestUpdateParam("test.aaa.bbb.ccc.ddd", "103");
385 test.TestUpdateParam("net.tcp.default_init_rwnd", "60");
386 }
387
388 HWTEST_F(ParamUnitTest, TestParamTraversal, TestSize.Level0)
389 {
390 ParamUnitTest test;
391 test.TestParamTraversal();
392 }
393
394 HWTEST_F(ParamUnitTest, TestDumpParamMemory, TestSize.Level0)
395 {
396 ParamUnitTest test;
397 test.TestDumpParamMemory();
398 }
399 HWTEST_F(ParamUnitTest, TestLinuxRWLock, TestSize.Level0)
400 {
401 ParamRWMutexCreate(nullptr);
402 ParamRWMutexWRLock(nullptr);
403 ParamRWMutexRDLock(nullptr);
404 ParamRWMutexUnlock(nullptr);
405 ParamRWMutexDelete(nullptr);
406 ParamMutexDelete(nullptr);
407 WorkSpace *workspace1 = (WorkSpace *)malloc(sizeof(WorkSpace) + strlen("testfilename1"));
408 ASSERT_NE(nullptr, workspace1);
409 WorkSpace *workspace2 = (WorkSpace *)malloc(sizeof(WorkSpace) + strlen("testfilename1"));
410 ASSERT_NE(nullptr, workspace2);
411 if (strcpy_s(workspace1->fileName, strlen("testfilename1"), "testfilename") != EOK) {
412 EXPECT_EQ(0, 1);
413 }
414 if (strcpy_s(workspace2->fileName, strlen("testfilename1"), "testfilename") != EOK) {
415 EXPECT_EQ(0, 1);
416 }
417 EXPECT_EQ(WorkSpaceNodeCompare(&(workspace1->hashNode), &(workspace2->hashNode)), 0);
418 free(workspace1);
419 free(workspace2);
420 }
421
422 HWTEST_F(ParamUnitTest, TestGetServiceCtlName, TestSize.Level0)
423 {
424 ServiceCtrlInfo *serviceInfo = NULL;
425 GetServiceCtrlInfo("ohos.startup.powerctrl", "reboot,updater", &serviceInfo);
426 if (serviceInfo != NULL) {
427 EXPECT_STREQ(serviceInfo->realKey, "ohos.servicectrl.reboot.updater.reboot,updater");
428 free(serviceInfo);
429 }
430 GetServiceCtrlInfo("ohos.ctl.stop", "test", &serviceInfo);
431 if (serviceInfo != NULL) {
432 EXPECT_STREQ(serviceInfo->realKey, "ohos.servicectrl.stop.test");
433 free(serviceInfo);
434 }
435 GetServiceCtrlInfo("ohos.servicectrl.stop", "test", &serviceInfo);
436 if (serviceInfo != NULL) {
437 EXPECT_STREQ(serviceInfo->realKey, "ohos.servicectrl.stop.test");
438 free(serviceInfo);
439 }
440 }
441
442 HWTEST_F(ParamUnitTest, TestParamCache, TestSize.Level0)
443 {
444 const char *name = "test.write.1111111.222222";
445 CachedHandle cacheHandle = CachedParameterCreate(name, "true");
446 EXPECT_NE(cacheHandle, nullptr);
447 const char *value = CachedParameterGet(cacheHandle);
448 EXPECT_EQ(strcmp(value, "true"), 0);
449 uint32_t dataIndex = 0;
450 int ret = WriteParam(name, "false", &dataIndex, 0);
451 EXPECT_EQ(ret, 0);
452 value = CachedParameterGet(cacheHandle);
453 EXPECT_EQ(strcmp(value, "false"), 0);
454 CachedParameterDestroy(cacheHandle);
455
456 // cache 2, for parameter exist
457 CachedHandle cacheHandle3 = CachedParameterCreate(name, "true");
458 EXPECT_NE(cacheHandle3, nullptr);
459 value = CachedParameterGet(cacheHandle3);
460 EXPECT_EQ(strcmp(value, "false"), 0);
461 ret = WriteParam(name, "2222222", &dataIndex, 0);
462 EXPECT_EQ(ret, 0);
463 value = CachedParameterGet(cacheHandle3);
464 EXPECT_EQ(strcmp(value, "2222222"), 0);
465 CachedParameterDestroy(cacheHandle3);
466 }
467 }