1d9f0492fSopenharmony_ci/* 2d9f0492fSopenharmony_ci * Copyright (c) 2021 Huawei Device Co., Ltd. 3d9f0492fSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 4d9f0492fSopenharmony_ci * you may not use this file except in compliance with the License. 5d9f0492fSopenharmony_ci * You may obtain a copy of the License at 6d9f0492fSopenharmony_ci * 7d9f0492fSopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 8d9f0492fSopenharmony_ci * 9d9f0492fSopenharmony_ci * Unless required by applicable law or agreed to in writing, software 10d9f0492fSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 11d9f0492fSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12d9f0492fSopenharmony_ci * See the License for the specific language governing permissions and 13d9f0492fSopenharmony_ci * limitations under the License. 14d9f0492fSopenharmony_ci */ 15d9f0492fSopenharmony_ci#include <gtest/gtest.h> 16d9f0492fSopenharmony_ci 17d9f0492fSopenharmony_ci#include "init_param.h" 18d9f0492fSopenharmony_ci#include "param_message.h" 19d9f0492fSopenharmony_ci#include "param_stub.h" 20d9f0492fSopenharmony_ci#include "param_init.h" 21d9f0492fSopenharmony_ci#include "trigger_manager.h" 22d9f0492fSopenharmony_ci#include "le_timer.h" 23d9f0492fSopenharmony_ci 24d9f0492fSopenharmony_ciusing namespace testing::ext; 25d9f0492fSopenharmony_ciusing namespace std; 26d9f0492fSopenharmony_ci 27d9f0492fSopenharmony_cistatic int TestTriggerExecute(TriggerNode *trigger, const char *content, uint32_t size) 28d9f0492fSopenharmony_ci{ 29d9f0492fSopenharmony_ci return 0; 30d9f0492fSopenharmony_ci} 31d9f0492fSopenharmony_ci 32d9f0492fSopenharmony_cistatic int CheckServerParamValue(const char *name, const char *expectValue) 33d9f0492fSopenharmony_ci{ 34d9f0492fSopenharmony_ci char tmp[PARAM_BUFFER_SIZE] = {0}; 35d9f0492fSopenharmony_ci u_int32_t len = sizeof(tmp); 36d9f0492fSopenharmony_ci SystemReadParam(name, tmp, &len); 37d9f0492fSopenharmony_ci printf("CheckParamValue name %s value: \'%s\' expectValue:\'%s\' \n", name, tmp, expectValue); 38d9f0492fSopenharmony_ci EXPECT_NE((int)strlen(tmp), 0); 39d9f0492fSopenharmony_ci if (expectValue != nullptr) { 40d9f0492fSopenharmony_ci EXPECT_EQ(strcmp(tmp, expectValue), 0); 41d9f0492fSopenharmony_ci } 42d9f0492fSopenharmony_ci return 0; 43d9f0492fSopenharmony_ci} 44d9f0492fSopenharmony_ci 45d9f0492fSopenharmony_cinamespace init_ut { 46d9f0492fSopenharmony_cistatic ParamTaskPtr g_worker = nullptr; 47d9f0492fSopenharmony_ciclass ParamServiceUnitTest : public ::testing::Test { 48d9f0492fSopenharmony_cipublic: 49d9f0492fSopenharmony_ci ParamServiceUnitTest() {} 50d9f0492fSopenharmony_ci virtual ~ParamServiceUnitTest() {} 51d9f0492fSopenharmony_ci 52d9f0492fSopenharmony_ci static void SetUpTestCase(void) {} 53d9f0492fSopenharmony_ci 54d9f0492fSopenharmony_ci void SetUp() 55d9f0492fSopenharmony_ci { 56d9f0492fSopenharmony_ci if (GetParamSecurityLabel() != nullptr) { 57d9f0492fSopenharmony_ci GetParamSecurityLabel()->cred.uid = 1000; // 1000 test uid 58d9f0492fSopenharmony_ci GetParamSecurityLabel()->cred.gid = 1000; // 1000 test gid 59d9f0492fSopenharmony_ci } 60d9f0492fSopenharmony_ci } 61d9f0492fSopenharmony_ci void TearDown() {} 62d9f0492fSopenharmony_ci void TestBody() {} 63d9f0492fSopenharmony_ci 64d9f0492fSopenharmony_ci int TestSetParams(const char *params[][1 + 1], int num) 65d9f0492fSopenharmony_ci { 66d9f0492fSopenharmony_ci for (int i = 0; i < num; i++) { 67d9f0492fSopenharmony_ci SystemWriteParam(params[i][0], params[i][1]); 68d9f0492fSopenharmony_ci } 69d9f0492fSopenharmony_ci 70d9f0492fSopenharmony_ci // check 71d9f0492fSopenharmony_ci for (int i = 0; i < num; i++) { 72d9f0492fSopenharmony_ci CheckServerParamValue(params[i][0], params[i][1]); 73d9f0492fSopenharmony_ci } 74d9f0492fSopenharmony_ci 75d9f0492fSopenharmony_ci for (int i = num - 1; i >= 0; i--) { 76d9f0492fSopenharmony_ci CheckServerParamValue(params[i][0], params[i][1]); 77d9f0492fSopenharmony_ci } 78d9f0492fSopenharmony_ci return 0; 79d9f0492fSopenharmony_ci } 80d9f0492fSopenharmony_ci 81d9f0492fSopenharmony_ci int TestAddSecurityLabel1() 82d9f0492fSopenharmony_ci { 83d9f0492fSopenharmony_ci GetParamSecurityLabel()->cred.gid = 9999; // 9999 test gid 84d9f0492fSopenharmony_ci const char *name = "label1.test.aaa.bbb.ccc.dddd.eee"; 85d9f0492fSopenharmony_ci const char *value = "2001"; 86d9f0492fSopenharmony_ci uint32_t labelIndex = 0; 87d9f0492fSopenharmony_ci SystemWriteParam(name, value); 88d9f0492fSopenharmony_ci // 获取到跟属性 89d9f0492fSopenharmony_ci WorkSpace *workspace = GetWorkSpace(WORKSPACE_INDEX_DAC); 90d9f0492fSopenharmony_ci (void)FindTrieNode(workspace, name, strlen(name), &labelIndex); 91d9f0492fSopenharmony_ci ParamSecurityNode *node = (ParamSecurityNode *)GetTrieNode(workspace, labelIndex); 92d9f0492fSopenharmony_ci if (node == nullptr) { 93d9f0492fSopenharmony_ci EXPECT_EQ(1, 0); 94d9f0492fSopenharmony_ci return 0; 95d9f0492fSopenharmony_ci } 96d9f0492fSopenharmony_ci EXPECT_EQ(node->gid, 0); 97d9f0492fSopenharmony_ci return 0; 98d9f0492fSopenharmony_ci } 99d9f0492fSopenharmony_ci 100d9f0492fSopenharmony_ci // 添加一个label,最长匹配到这个节点 101d9f0492fSopenharmony_ci int TestAddSecurityLabel2() 102d9f0492fSopenharmony_ci { 103d9f0492fSopenharmony_ci GetParamSecurityLabel()->cred.gid = 9999; // 9999 test gid 104d9f0492fSopenharmony_ci const char *name = "label2.test.aaa.bbb.ccc.dddd.eee"; 105d9f0492fSopenharmony_ci const char *value = "2001"; 106d9f0492fSopenharmony_ci ParamAuditData auditData = {}; 107d9f0492fSopenharmony_ci auditData.name = "label2.test.aaa"; 108d9f0492fSopenharmony_ci auditData.dacData.gid = 202; // 202 test dac gid 109d9f0492fSopenharmony_ci auditData.dacData.uid = geteuid(); 110d9f0492fSopenharmony_ci auditData.dacData.mode = 0666; // 0666 test mode 111d9f0492fSopenharmony_ci SystemWriteParam(name, value); 112d9f0492fSopenharmony_ci uint32_t labelIndex = 0; 113d9f0492fSopenharmony_ci AddSecurityLabel(&auditData); 114d9f0492fSopenharmony_ci WorkSpace *workspace = GetWorkSpace(WORKSPACE_INDEX_DAC); 115d9f0492fSopenharmony_ci (void)FindTrieNode(workspace, name, strlen(name), &labelIndex); 116d9f0492fSopenharmony_ci ParamSecurityNode *node = (ParamSecurityNode *)GetTrieNode(workspace, labelIndex); 117d9f0492fSopenharmony_ci if (node == nullptr) { 118d9f0492fSopenharmony_ci EXPECT_EQ(1, 0); 119d9f0492fSopenharmony_ci return 0; 120d9f0492fSopenharmony_ci } 121d9f0492fSopenharmony_ci EXPECT_EQ(node->gid, auditData.dacData.gid); 122d9f0492fSopenharmony_ci return 0; 123d9f0492fSopenharmony_ci } 124d9f0492fSopenharmony_ci 125d9f0492fSopenharmony_ci // 添加一个label,最长匹配到最后一个相同节点 126d9f0492fSopenharmony_ci int TestAddSecurityLabel3() 127d9f0492fSopenharmony_ci { 128d9f0492fSopenharmony_ci GetParamSecurityLabel()->cred.gid = 9999; // 9999 test gid 129d9f0492fSopenharmony_ci const char *name = "label3.test.aaa.bbb.ccc.dddd.eee"; 130d9f0492fSopenharmony_ci const char *value = "2001"; 131d9f0492fSopenharmony_ci ParamAuditData auditData = {}; 132d9f0492fSopenharmony_ci auditData.name = "label3.test.aaa"; 133d9f0492fSopenharmony_ci auditData.dacData.gid = 203; // 203 test gid 134d9f0492fSopenharmony_ci auditData.dacData.uid = geteuid(); 135d9f0492fSopenharmony_ci auditData.dacData.mode = 0666; // 0666 test mode 136d9f0492fSopenharmony_ci SystemWriteParam(name, value); 137d9f0492fSopenharmony_ci AddSecurityLabel(&auditData); 138d9f0492fSopenharmony_ci 139d9f0492fSopenharmony_ci auditData.name = "label3.test.aaa.bbb.ccc.dddd.eee.dddd"; 140d9f0492fSopenharmony_ci auditData.dacData.gid = 202; // 202 test dac gid 141d9f0492fSopenharmony_ci auditData.dacData.uid = geteuid(); 142d9f0492fSopenharmony_ci auditData.dacData.mode = 0666; // 0666 test mode 143d9f0492fSopenharmony_ci SystemWriteParam(name, value); 144d9f0492fSopenharmony_ci AddSecurityLabel(&auditData); 145d9f0492fSopenharmony_ci 146d9f0492fSopenharmony_ci uint32_t labelIndex = 0; 147d9f0492fSopenharmony_ci WorkSpace *workspace = GetWorkSpace(WORKSPACE_INDEX_DAC); 148d9f0492fSopenharmony_ci ParamTrieNode *paramNode = FindTrieNode(workspace, name, strlen(name), &labelIndex); 149d9f0492fSopenharmony_ci ParamSecurityNode *node = (ParamSecurityNode *)GetTrieNode(workspace, labelIndex); 150d9f0492fSopenharmony_ci if (paramNode == nullptr || node == nullptr) { 151d9f0492fSopenharmony_ci EXPECT_EQ(1, 0); 152d9f0492fSopenharmony_ci return 0; 153d9f0492fSopenharmony_ci } 154d9f0492fSopenharmony_ci EXPECT_EQ((int)node->gid, 203); // 203 test gid 155d9f0492fSopenharmony_ci return 0; 156d9f0492fSopenharmony_ci } 157d9f0492fSopenharmony_ci 158d9f0492fSopenharmony_ci // 添加一个label,完全匹配 159d9f0492fSopenharmony_ci int TestAddSecurityLabel4() 160d9f0492fSopenharmony_ci { 161d9f0492fSopenharmony_ci GetParamSecurityLabel()->cred.gid = 9999; // 9999 test gid 162d9f0492fSopenharmony_ci const char *name = "label4.test.aaa.bbb.ccc.dddd.eee"; 163d9f0492fSopenharmony_ci const char *value = "2001"; 164d9f0492fSopenharmony_ci ParamAuditData auditData = {}; 165d9f0492fSopenharmony_ci auditData.name = "label4.test.aaa.bbb.ccc.dddd.eee"; 166d9f0492fSopenharmony_ci auditData.dacData.gid = 203; // 203 test gid 167d9f0492fSopenharmony_ci auditData.dacData.uid = geteuid(); 168d9f0492fSopenharmony_ci auditData.dacData.mode = 0666; // 0666 test mode 169d9f0492fSopenharmony_ci SystemWriteParam(name, value); 170d9f0492fSopenharmony_ci uint32_t labelIndex = 0; 171d9f0492fSopenharmony_ci AddSecurityLabel(&auditData); 172d9f0492fSopenharmony_ci WorkSpace *workspace = GetWorkSpace(WORKSPACE_INDEX_DAC); 173d9f0492fSopenharmony_ci ParamTrieNode *paramNode = FindTrieNode(workspace, name, strlen(name), &labelIndex); 174d9f0492fSopenharmony_ci ParamSecurityNode *node = (ParamSecurityNode *)GetTrieNode(workspace, labelIndex); 175d9f0492fSopenharmony_ci if (paramNode == nullptr || node == nullptr) { 176d9f0492fSopenharmony_ci EXPECT_EQ(1, 0); 177d9f0492fSopenharmony_ci return 0; 178d9f0492fSopenharmony_ci } 179d9f0492fSopenharmony_ci EXPECT_EQ(node->gid, auditData.dacData.gid); 180d9f0492fSopenharmony_ci return 0; 181d9f0492fSopenharmony_ci } 182d9f0492fSopenharmony_ci 183d9f0492fSopenharmony_ci void TestBufferValue(char *buffer, uint32_t len) 184d9f0492fSopenharmony_ci { 185d9f0492fSopenharmony_ci const int printBase = 10; 186d9f0492fSopenharmony_ci for (uint32_t index = 0; index <= len; index++) { 187d9f0492fSopenharmony_ci buffer[index] = '0' + index % printBase; 188d9f0492fSopenharmony_ci if (index != 0 && index % printBase == 0) { 189d9f0492fSopenharmony_ci buffer[index] = '.'; 190d9f0492fSopenharmony_ci } 191d9f0492fSopenharmony_ci } 192d9f0492fSopenharmony_ci buffer[len] = '\0'; 193d9f0492fSopenharmony_ci } 194d9f0492fSopenharmony_ci 195d9f0492fSopenharmony_ci int TestNameIsValid() 196d9f0492fSopenharmony_ci { 197d9f0492fSopenharmony_ci char buffer[PARAM_BUFFER_SIZE]; 198d9f0492fSopenharmony_ci // set name length = 127 199d9f0492fSopenharmony_ci TestBufferValue(buffer, PARAM_NAME_LEN_MAX - 1); 200d9f0492fSopenharmony_ci int ret = SystemWriteParam(buffer, "1111"); 201d9f0492fSopenharmony_ci EXPECT_EQ(ret, 0); 202d9f0492fSopenharmony_ci TestBufferValue(buffer, PARAM_NAME_LEN_MAX); 203d9f0492fSopenharmony_ci ret = SystemWriteParam(buffer, "1111"); 204d9f0492fSopenharmony_ci EXPECT_NE(ret, 0); 205d9f0492fSopenharmony_ci TestBufferValue(buffer, PARAM_NAME_LEN_MAX + 1); 206d9f0492fSopenharmony_ci ret = SystemWriteParam(buffer, "1111"); 207d9f0492fSopenharmony_ci EXPECT_NE(ret, 0); 208d9f0492fSopenharmony_ci 209d9f0492fSopenharmony_ci ret = SystemWriteParam(" ", "1111"); 210d9f0492fSopenharmony_ci EXPECT_NE(ret, 0); 211d9f0492fSopenharmony_ci ret = SystemWriteParam("__.__..", "1111"); 212d9f0492fSopenharmony_ci EXPECT_NE(ret, 0); 213d9f0492fSopenharmony_ci ret = SystemWriteParam(".__..", "1111"); 214d9f0492fSopenharmony_ci EXPECT_NE(ret, 0); 215d9f0492fSopenharmony_ci ret = SystemWriteParam("test.-@:_", "1111"); 216d9f0492fSopenharmony_ci EXPECT_EQ(ret, 0); 217d9f0492fSopenharmony_ci 218d9f0492fSopenharmony_ci // 保存一个只读的属性,大于最大值 219d9f0492fSopenharmony_ci TestBufferValue(buffer, PARAM_VALUE_LEN_MAX - 1); 220d9f0492fSopenharmony_ci ret = SystemWriteParam("const.test_readonly.dddddddddddddddddd.fffffffffffffffffff", buffer); 221d9f0492fSopenharmony_ci EXPECT_EQ(ret, 0); 222d9f0492fSopenharmony_ci 223d9f0492fSopenharmony_ci TestBufferValue(buffer, PARAM_VALUE_LEN_MAX + 1); 224d9f0492fSopenharmony_ci ret = SystemWriteParam("const.test_readonly.aaaaaaaaaaaaaaaaaa.fffffffffffffffffff", buffer); 225d9f0492fSopenharmony_ci EXPECT_EQ(ret, 0); 226d9f0492fSopenharmony_ci 227d9f0492fSopenharmony_ci // 更新只读项目 228d9f0492fSopenharmony_ci TestBufferValue(buffer, PARAM_VALUE_LEN_MAX - 1); 229d9f0492fSopenharmony_ci ret = SystemWriteParam("const.test_readonly.dddddddddddddddddd.fffffffffffffffffff", buffer); 230d9f0492fSopenharmony_ci EXPECT_NE(ret, 0); 231d9f0492fSopenharmony_ci 232d9f0492fSopenharmony_ci // 写普通属性 233d9f0492fSopenharmony_ci TestBufferValue(buffer, PARAM_VALUE_LEN_MAX - 1); 234d9f0492fSopenharmony_ci ret = SystemWriteParam("test.bigvalue.dddddddddddddddddd.fffffffffffffffffff", buffer); 235d9f0492fSopenharmony_ci EXPECT_EQ(ret, 0); 236d9f0492fSopenharmony_ci TestBufferValue(buffer, PARAM_VALUE_LEN_MAX + 1); 237d9f0492fSopenharmony_ci ret = SystemWriteParam("test.bigvalue.dddddddddddddddddd.fffffffffffffffffff", buffer); 238d9f0492fSopenharmony_ci EXPECT_NE(ret, 0); 239d9f0492fSopenharmony_ci 240d9f0492fSopenharmony_ci // invalid name 241d9f0492fSopenharmony_ci TestBufferValue(buffer, PARAM_VALUE_LEN_MAX - 1); 242d9f0492fSopenharmony_ci ret = SystemWriteParam("test.invalidname..fffffffffffffffffff", buffer); 243d9f0492fSopenharmony_ci EXPECT_NE(ret, 0); 244d9f0492fSopenharmony_ci ret = SystemWriteParam("test.invalidname.%fffffffffffffffffff", buffer); 245d9f0492fSopenharmony_ci EXPECT_NE(ret, 0); 246d9f0492fSopenharmony_ci ret = SystemWriteParam("test.invalidname.$fffffffffffffffffff", buffer); 247d9f0492fSopenharmony_ci EXPECT_NE(ret, 0); 248d9f0492fSopenharmony_ci return 0; 249d9f0492fSopenharmony_ci } 250d9f0492fSopenharmony_ci 251d9f0492fSopenharmony_ci int TestParamTraversal() 252d9f0492fSopenharmony_ci { 253d9f0492fSopenharmony_ci char value[PARAM_BUFFER_SIZE + PARAM_BUFFER_SIZE] = {0}; 254d9f0492fSopenharmony_ci SystemTraversalParameter( 255d9f0492fSopenharmony_ci "", 256d9f0492fSopenharmony_ci [](ParamHandle handle, void *cookie) { 257d9f0492fSopenharmony_ci SystemGetParameterName(handle, (char *)cookie, PARAM_BUFFER_SIZE); 258d9f0492fSopenharmony_ci u_int32_t len = PARAM_BUFFER_SIZE; 259d9f0492fSopenharmony_ci SystemGetParameterValue(handle, ((char *)cookie) + PARAM_BUFFER_SIZE, &len); 260d9f0492fSopenharmony_ci printf("$$$$$$$$Param %s=%s \n", (char *)cookie, ((char *)cookie) + PARAM_BUFFER_SIZE); 261d9f0492fSopenharmony_ci }, 262d9f0492fSopenharmony_ci (void *)value); 263d9f0492fSopenharmony_ci return 0; 264d9f0492fSopenharmony_ci } 265d9f0492fSopenharmony_ci 266d9f0492fSopenharmony_ci int TestUpdateParam(const char *name, const char *value) 267d9f0492fSopenharmony_ci { 268d9f0492fSopenharmony_ci SystemWriteParam(name, value); 269d9f0492fSopenharmony_ci SystemWriteParam(name, value); 270d9f0492fSopenharmony_ci SystemWriteParam(name, value); 271d9f0492fSopenharmony_ci SystemWriteParam(name, value); 272d9f0492fSopenharmony_ci CheckServerParamValue(name, value); 273d9f0492fSopenharmony_ci return 0; 274d9f0492fSopenharmony_ci } 275d9f0492fSopenharmony_ci 276d9f0492fSopenharmony_ci int TestPersistParam() 277d9f0492fSopenharmony_ci { 278d9f0492fSopenharmony_ci RegisterPersistParamOps(nullptr); 279d9f0492fSopenharmony_ci LoadPersistParams(); 280d9f0492fSopenharmony_ci SystemWriteParam("persist.111.ffff.bbbb.cccc.dddd.eeee", "1101"); 281d9f0492fSopenharmony_ci SystemWriteParam("persist.111.aaaa.bbbb.cccc.dddd.eeee", "1102"); 282d9f0492fSopenharmony_ci SystemWriteParam("persist.111.bbbb.cccc.dddd.eeee", "1103"); 283d9f0492fSopenharmony_ci CheckServerParamValue("persist.111.bbbb.cccc.dddd.eeee", "1103"); 284d9f0492fSopenharmony_ci SystemWriteParam("persist.111.cccc.bbbb.cccc.dddd.eeee", "1104"); 285d9f0492fSopenharmony_ci SystemWriteParam("persist.111.eeee.bbbb.cccc.dddd.eeee", "1105"); 286d9f0492fSopenharmony_ci CheckServerParamValue("persist.111.ffff.bbbb.cccc.dddd.eeee", "1101"); 287d9f0492fSopenharmony_ci SystemWriteParam("persist.111.ffff.bbbb.cccc.dddd.eeee", "1106"); 288d9f0492fSopenharmony_ci CheckServerParamValue("persist.111.ffff.bbbb.cccc.dddd.eeee", "1106"); 289d9f0492fSopenharmony_ci 290d9f0492fSopenharmony_ci SystemWriteParam("persist.111.bbbb.cccc.dddd.1107", "1107"); 291d9f0492fSopenharmony_ci SystemWriteParam("persist.111.bbbb.cccc.dddd.1108", "1108"); 292d9f0492fSopenharmony_ci SystemWriteParam("persist.111.bbbb.cccc.dddd.1109", "1108"); 293d9f0492fSopenharmony_ci 294d9f0492fSopenharmony_ci SystemWriteParam("persist.111.bbbb.cccc.dddd.1110", "1108"); 295d9f0492fSopenharmony_ci SystemWriteParam("persist.111.bbbb.cccc.dddd.1111", "1108"); 296d9f0492fSopenharmony_ci TimerCallbackForSave(nullptr, nullptr); 297d9f0492fSopenharmony_ci LoadPersistParams(); 298d9f0492fSopenharmony_ci return 0; 299d9f0492fSopenharmony_ci } 300d9f0492fSopenharmony_ci 301d9f0492fSopenharmony_ci ParamTaskPtr CreateAndGetStreamTask() 302d9f0492fSopenharmony_ci { 303d9f0492fSopenharmony_ci OnIncomingConnect(LE_GetDefaultLoop(), GetParamService()->serverTask); 304d9f0492fSopenharmony_ci EXPECT_NE(GetParamService()->watcherTask, nullptr); 305d9f0492fSopenharmony_ci return GetParamService()->watcherTask; 306d9f0492fSopenharmony_ci } 307d9f0492fSopenharmony_ci 308d9f0492fSopenharmony_ci int TestServiceProcessMessage(const char *name, const char *value, int userLabel) 309d9f0492fSopenharmony_ci { 310d9f0492fSopenharmony_ci if (g_worker == nullptr) { 311d9f0492fSopenharmony_ci g_worker = CreateAndGetStreamTask(); 312d9f0492fSopenharmony_ci } 313d9f0492fSopenharmony_ci if (g_worker == nullptr) { 314d9f0492fSopenharmony_ci return 0; 315d9f0492fSopenharmony_ci } 316d9f0492fSopenharmony_ci ParamSecurityOps *paramSecurityOps = GetParamSecurityOps(0); 317d9f0492fSopenharmony_ci if (userLabel && paramSecurityOps != nullptr) { 318d9f0492fSopenharmony_ci paramSecurityOps->securityFreeLabel = TestFreeLocalSecurityLabel; 319d9f0492fSopenharmony_ci paramSecurityOps->securityCheckParamPermission = TestCheckParamPermission; 320d9f0492fSopenharmony_ci } 321d9f0492fSopenharmony_ci uint32_t msgSize = sizeof(ParamMessage) + sizeof(ParamMsgContent) + PARAM_ALIGN(strlen(value) + 1); 322d9f0492fSopenharmony_ci ParamMessage *request = (ParamMessage *)CreateParamMessage(MSG_SET_PARAM, name, msgSize); 323d9f0492fSopenharmony_ci PARAM_CHECK(request != nullptr, return -1, "Failed to malloc for connect"); 324d9f0492fSopenharmony_ci do { 325d9f0492fSopenharmony_ci request->type = MSG_SET_PARAM; 326d9f0492fSopenharmony_ci uint32_t offset = 0; 327d9f0492fSopenharmony_ci int ret = FillParamMsgContent(request, &offset, PARAM_VALUE, value, strlen(value)); 328d9f0492fSopenharmony_ci PARAM_CHECK(ret == 0, break, "Failed to fill value"); 329d9f0492fSopenharmony_ci ProcessMessage((const ParamTaskPtr)g_worker, (const ParamMessage *)request); 330d9f0492fSopenharmony_ci } while (0); 331d9f0492fSopenharmony_ci free(request); 332d9f0492fSopenharmony_ci RegisterSecurityOps(1); 333d9f0492fSopenharmony_ci return 0; 334d9f0492fSopenharmony_ci } 335d9f0492fSopenharmony_ci 336d9f0492fSopenharmony_ci int AddWatch(int type, const char *name, const char *value) 337d9f0492fSopenharmony_ci { 338d9f0492fSopenharmony_ci if (g_worker == nullptr) { 339d9f0492fSopenharmony_ci g_worker = CreateAndGetStreamTask(); 340d9f0492fSopenharmony_ci } 341d9f0492fSopenharmony_ci if (g_worker == nullptr) { 342d9f0492fSopenharmony_ci return 0; 343d9f0492fSopenharmony_ci } 344d9f0492fSopenharmony_ci uint32_t msgSize = sizeof(ParamMessage) + sizeof(ParamMsgContent) + sizeof(ParamMsgContent) 345d9f0492fSopenharmony_ci + PARAM_ALIGN(strlen(value) + 1) + sizeof(uint32_t); 346d9f0492fSopenharmony_ci ParamMessage *request = (ParamMessage *)(ParamMessage *)CreateParamMessage(type, name, msgSize); 347d9f0492fSopenharmony_ci PARAM_CHECK(request != nullptr, return -1, "Failed to malloc for connect"); 348d9f0492fSopenharmony_ci do { 349d9f0492fSopenharmony_ci uint32_t offset = 0; 350d9f0492fSopenharmony_ci int ret = FillParamMsgContent(request, &offset, PARAM_VALUE, value, strlen(value)); 351d9f0492fSopenharmony_ci PARAM_CHECK(ret == 0, break, "Failed to fill value"); 352d9f0492fSopenharmony_ci 353d9f0492fSopenharmony_ci ParamMsgContent *content = (ParamMsgContent *)(request->data + offset); 354d9f0492fSopenharmony_ci content->type = PARAM_WAIT_TIMEOUT; 355d9f0492fSopenharmony_ci content->contentSize = sizeof(uint32_t); 356d9f0492fSopenharmony_ci *((uint32_t *)(content->content)) = 100; // 100 is test value 357d9f0492fSopenharmony_ci offset += sizeof(ParamMsgContent) + sizeof(uint32_t); 358d9f0492fSopenharmony_ci request->msgSize = offset + sizeof(ParamMessage); 359d9f0492fSopenharmony_ci 360d9f0492fSopenharmony_ci ProcessMessage((const ParamTaskPtr)g_worker, (const ParamMessage *)request); 361d9f0492fSopenharmony_ci } while (0); 362d9f0492fSopenharmony_ci free(request); 363d9f0492fSopenharmony_ci return 0; 364d9f0492fSopenharmony_ci } 365d9f0492fSopenharmony_ci 366d9f0492fSopenharmony_ci // 无匹配 367d9f0492fSopenharmony_ci int TestAddParamWait1() 368d9f0492fSopenharmony_ci { 369d9f0492fSopenharmony_ci const char *name = "wait.aaa.bbb.ccc.111"; 370d9f0492fSopenharmony_ci const char *value = "wait1"; 371d9f0492fSopenharmony_ci AddWatch(MSG_WAIT_PARAM, name, value); 372d9f0492fSopenharmony_ci SystemWriteParam(name, value); 373d9f0492fSopenharmony_ci // execute trigger 374d9f0492fSopenharmony_ci LE_DoAsyncEvent(LE_GetDefaultLoop(), GetTriggerWorkSpace()->eventHandle); 375d9f0492fSopenharmony_ci return 0; 376d9f0492fSopenharmony_ci } 377d9f0492fSopenharmony_ci 378d9f0492fSopenharmony_ci // 模糊匹配 379d9f0492fSopenharmony_ci int TestAddParamWait2() 380d9f0492fSopenharmony_ci { 381d9f0492fSopenharmony_ci const char *name = "wait.aaa.bbb.ccc.222"; 382d9f0492fSopenharmony_ci const char *value = "wait2"; 383d9f0492fSopenharmony_ci AddWatch(MSG_WAIT_PARAM, name, "*"); 384d9f0492fSopenharmony_ci SystemWriteParam(name, value); 385d9f0492fSopenharmony_ci // execute trigger 386d9f0492fSopenharmony_ci LE_DoAsyncEvent(LE_GetDefaultLoop(), GetTriggerWorkSpace()->eventHandle); 387d9f0492fSopenharmony_ci return 0; 388d9f0492fSopenharmony_ci } 389d9f0492fSopenharmony_ci 390d9f0492fSopenharmony_ci // 属性存在 391d9f0492fSopenharmony_ci int TestAddParamWait3() 392d9f0492fSopenharmony_ci { 393d9f0492fSopenharmony_ci const char *name = "wait.aaa.bbb.ccc.333"; 394d9f0492fSopenharmony_ci const char *value = "wait3"; 395d9f0492fSopenharmony_ci SystemWriteParam(name, value); 396d9f0492fSopenharmony_ci AddWatch(MSG_WAIT_PARAM, name, value); 397d9f0492fSopenharmony_ci // execute trigger 398d9f0492fSopenharmony_ci LE_DoAsyncEvent(LE_GetDefaultLoop(), GetTriggerWorkSpace()->eventHandle); 399d9f0492fSopenharmony_ci return 0; 400d9f0492fSopenharmony_ci } 401d9f0492fSopenharmony_ci 402d9f0492fSopenharmony_ci int TestAddParamWatch1() 403d9f0492fSopenharmony_ci { 404d9f0492fSopenharmony_ci const char *name = "watch.aaa.bbb.ccc.111"; 405d9f0492fSopenharmony_ci const char *value = "watch1"; 406d9f0492fSopenharmony_ci AddWatch(MSG_ADD_WATCHER, name, value); 407d9f0492fSopenharmony_ci std::string newName = name; 408d9f0492fSopenharmony_ci newName += ".test.test.test"; 409d9f0492fSopenharmony_ci SystemWriteParam(newName.c_str(), value); 410d9f0492fSopenharmony_ci // execute trigger 411d9f0492fSopenharmony_ci LE_DoAsyncEvent(LE_GetDefaultLoop(), GetTriggerWorkSpace()->eventHandle); 412d9f0492fSopenharmony_ci return 0; 413d9f0492fSopenharmony_ci } 414d9f0492fSopenharmony_ci 415d9f0492fSopenharmony_ci int TestAddParamWatch2() 416d9f0492fSopenharmony_ci { 417d9f0492fSopenharmony_ci const char *name = "watch.aaa.bbb.ccc.222"; 418d9f0492fSopenharmony_ci const char *value = "watch2"; 419d9f0492fSopenharmony_ci AddWatch(MSG_ADD_WATCHER, name, "*"); 420d9f0492fSopenharmony_ci SystemWriteParam(name, value); 421d9f0492fSopenharmony_ci // execute trigger 422d9f0492fSopenharmony_ci LE_DoAsyncEvent(LE_GetDefaultLoop(), GetTriggerWorkSpace()->eventHandle); 423d9f0492fSopenharmony_ci return 0; 424d9f0492fSopenharmony_ci } 425d9f0492fSopenharmony_ci 426d9f0492fSopenharmony_ci int TestAddParamWatch3() 427d9f0492fSopenharmony_ci { 428d9f0492fSopenharmony_ci const char *name = "watch.aaa.bbb.ccc.333"; 429d9f0492fSopenharmony_ci const char *value = "watch3"; 430d9f0492fSopenharmony_ci std::string newName = name; 431d9f0492fSopenharmony_ci newName += ".test.test.test"; 432d9f0492fSopenharmony_ci SystemWriteParam(newName.c_str(), value); 433d9f0492fSopenharmony_ci AddWatch(MSG_ADD_WATCHER, name, value); 434d9f0492fSopenharmony_ci char buffer[] = "testbuff"; 435d9f0492fSopenharmony_ci CheckTrigger(GetTriggerWorkSpace(), TRIGGER_PARAM_WATCH, buffer, strlen(buffer), TestTriggerExecute); 436d9f0492fSopenharmony_ci AddWatch(MSG_DEL_WATCHER, name, value); 437d9f0492fSopenharmony_ci return 0; 438d9f0492fSopenharmony_ci } 439d9f0492fSopenharmony_ci 440d9f0492fSopenharmony_ci int TestCloseTriggerWatch() 441d9f0492fSopenharmony_ci { 442d9f0492fSopenharmony_ci#ifdef PARAM_SUPPORT_TRIGGER 443d9f0492fSopenharmony_ci SystemDumpTriggers(1, nullptr); 444d9f0492fSopenharmony_ci#endif 445d9f0492fSopenharmony_ci ParamWatcher *watcher = (ParamWatcher *)ParamGetTaskUserData(g_worker); 446d9f0492fSopenharmony_ci ClearWatchTrigger(watcher, TRIGGER_PARAM_WAIT); 447d9f0492fSopenharmony_ci ParamTaskClose(g_worker); 448d9f0492fSopenharmony_ci g_worker = nullptr; 449d9f0492fSopenharmony_ci ParamTaskClose(g_worker); 450d9f0492fSopenharmony_ci SystemWriteParam("init.svc.param_watcher", "stopped"); 451d9f0492fSopenharmony_ci return 0; 452d9f0492fSopenharmony_ci } 453d9f0492fSopenharmony_ci 454d9f0492fSopenharmony_ci int TestServiceCtrl(const char *serviceName, uint16_t mode) 455d9f0492fSopenharmony_ci { 456d9f0492fSopenharmony_ci // service forbid 457d9f0492fSopenharmony_ci TestSetParamCheckResult("ohos.servicectrl.", mode, 1); 458d9f0492fSopenharmony_ci return SystemWriteParam("ohos.ctl.start", serviceName); 459d9f0492fSopenharmony_ci } 460d9f0492fSopenharmony_ci 461d9f0492fSopenharmony_ci int TestPowerCtrl(const char *reboot, uint16_t mode) 462d9f0492fSopenharmony_ci { 463d9f0492fSopenharmony_ci // service forbid 464d9f0492fSopenharmony_ci TestSetParamCheckResult("ohos.servicectrl.reboot", mode, 1); 465d9f0492fSopenharmony_ci return SystemWriteParam("ohos.startup.powerctrl", reboot); 466d9f0492fSopenharmony_ci } 467d9f0492fSopenharmony_ci}; 468d9f0492fSopenharmony_ci 469d9f0492fSopenharmony_ciHWTEST_F(ParamServiceUnitTest, Init_TestPersistParam_001, TestSize.Level0) 470d9f0492fSopenharmony_ci{ 471d9f0492fSopenharmony_ci ParamServiceUnitTest test; 472d9f0492fSopenharmony_ci test.TestPersistParam(); 473d9f0492fSopenharmony_ci} 474d9f0492fSopenharmony_ci 475d9f0492fSopenharmony_ciHWTEST_F(ParamServiceUnitTest, Init_TestReadCmdline_001, TestSize.Level0) 476d9f0492fSopenharmony_ci{ 477d9f0492fSopenharmony_ci const char *snData = "222222222222222222222"; 478d9f0492fSopenharmony_ci CreateTestFile(STARTUP_INIT_UT_PATH "/system/etc/sn", snData); 479d9f0492fSopenharmony_ci // for cmdline 480d9f0492fSopenharmony_ci std::string cmdLineForSn = "bootgroup=device.charge.group earlycon=uart8250,mmio32,0xfe660000 " 481d9f0492fSopenharmony_ci "root=PARTUUID=614e0000-0000 rw rootwait rootfstype=ext4 console=ttyFIQ0 hardware=rk3568" 482d9f0492fSopenharmony_ci " BOOT_IMAGE=/kernel init=/init"; 483d9f0492fSopenharmony_ci std::string snWithPath = cmdLineForSn + "ohos.boot.sn=" + STARTUP_INIT_UT_PATH "/system/etc/sn"; 484d9f0492fSopenharmony_ci CreateTestFile(BOOT_CMD_LINE, snWithPath.c_str()); 485d9f0492fSopenharmony_ci LoadParamFromCmdLine(); 486d9f0492fSopenharmony_ci std::string snWithSN = cmdLineForSn + "ohos.boot.sn=" + snData; 487d9f0492fSopenharmony_ci CreateTestFile(BOOT_CMD_LINE, snWithSN.c_str()); 488d9f0492fSopenharmony_ci LoadParamFromCmdLine(); 489d9f0492fSopenharmony_ci CreateTestFile(BOOT_CMD_LINE, cmdLineForSn.c_str()); 490d9f0492fSopenharmony_ci LoadParamFromCmdLine(); 491d9f0492fSopenharmony_ci} 492d9f0492fSopenharmony_ci 493d9f0492fSopenharmony_ciHWTEST_F(ParamServiceUnitTest, Init_TestServiceProcessMessage_001, TestSize.Level0) 494d9f0492fSopenharmony_ci{ 495d9f0492fSopenharmony_ci ParamServiceUnitTest test; 496d9f0492fSopenharmony_ci test.TestServiceProcessMessage("wertt.qqqq.wwww.rrrr", "wwww.eeeee", 1); 497d9f0492fSopenharmony_ci test.TestServiceProcessMessage("wertt.2222.wwww.3333", "wwww.eeeee", 0); 498d9f0492fSopenharmony_ci} 499d9f0492fSopenharmony_ci 500d9f0492fSopenharmony_ciHWTEST_F(ParamServiceUnitTest, Init_TestAddParamWait_001, TestSize.Level0) 501d9f0492fSopenharmony_ci{ 502d9f0492fSopenharmony_ci ParamServiceUnitTest test; 503d9f0492fSopenharmony_ci test.TestAddParamWait1(); 504d9f0492fSopenharmony_ci} 505d9f0492fSopenharmony_ci 506d9f0492fSopenharmony_ciHWTEST_F(ParamServiceUnitTest, Init_TestAddParamWait_002, TestSize.Level0) 507d9f0492fSopenharmony_ci{ 508d9f0492fSopenharmony_ci ParamServiceUnitTest test; 509d9f0492fSopenharmony_ci test.TestAddParamWait2(); 510d9f0492fSopenharmony_ci} 511d9f0492fSopenharmony_ci 512d9f0492fSopenharmony_ciHWTEST_F(ParamServiceUnitTest, Init_TestAddParamWait_003, TestSize.Level0) 513d9f0492fSopenharmony_ci{ 514d9f0492fSopenharmony_ci ParamServiceUnitTest test; 515d9f0492fSopenharmony_ci test.TestAddParamWait3(); 516d9f0492fSopenharmony_ci} 517d9f0492fSopenharmony_ci 518d9f0492fSopenharmony_ciHWTEST_F(ParamServiceUnitTest, Init_TestAddParamWatch_001, TestSize.Level0) 519d9f0492fSopenharmony_ci{ 520d9f0492fSopenharmony_ci ParamServiceUnitTest test; 521d9f0492fSopenharmony_ci test.TestAddParamWatch1(); 522d9f0492fSopenharmony_ci} 523d9f0492fSopenharmony_ci 524d9f0492fSopenharmony_ciHWTEST_F(ParamServiceUnitTest, Init_TestAddParamWatch_002, TestSize.Level0) 525d9f0492fSopenharmony_ci{ 526d9f0492fSopenharmony_ci ParamServiceUnitTest test; 527d9f0492fSopenharmony_ci test.TestAddParamWatch2(); 528d9f0492fSopenharmony_ci} 529d9f0492fSopenharmony_ci 530d9f0492fSopenharmony_ci#ifndef OHOS_LITE 531d9f0492fSopenharmony_ciHWTEST_F(ParamServiceUnitTest, Init_TestAddParamWatch_003, TestSize.Level0) 532d9f0492fSopenharmony_ci{ 533d9f0492fSopenharmony_ci ParamServiceUnitTest test; 534d9f0492fSopenharmony_ci test.TestAddParamWatch3(); 535d9f0492fSopenharmony_ci int hashCode = CheckWatchTriggerTimeout(); 536d9f0492fSopenharmony_ci EXPECT_EQ(hashCode, 0); 537d9f0492fSopenharmony_ci} 538d9f0492fSopenharmony_ci 539d9f0492fSopenharmony_ciHWTEST_F(ParamServiceUnitTest, Init_TestCloseTriggerWatch_001, TestSize.Level0) 540d9f0492fSopenharmony_ci{ 541d9f0492fSopenharmony_ci ParamServiceUnitTest test; 542d9f0492fSopenharmony_ci test.TestCloseTriggerWatch(); 543d9f0492fSopenharmony_ci} 544d9f0492fSopenharmony_ci 545d9f0492fSopenharmony_ciHWTEST_F(ParamServiceUnitTest, Init_TestServiceCtrl_001, TestSize.Level0) 546d9f0492fSopenharmony_ci{ 547d9f0492fSopenharmony_ci ParamServiceUnitTest test; 548d9f0492fSopenharmony_ci int ret = test.TestServiceCtrl("server1", 0770); 549d9f0492fSopenharmony_ci EXPECT_NE(ret, 0); 550d9f0492fSopenharmony_ci#ifdef PARAM_SUPPORT_SELINUX 551d9f0492fSopenharmony_ci // selinux forbid 552d9f0492fSopenharmony_ci ret = test.TestServiceCtrl("server2", 0772); 553d9f0492fSopenharmony_ci EXPECT_NE(ret, 0); 554d9f0492fSopenharmony_ci#endif 555d9f0492fSopenharmony_ci ret = 0; 556d9f0492fSopenharmony_ci} 557d9f0492fSopenharmony_ci 558d9f0492fSopenharmony_ciHWTEST_F(ParamServiceUnitTest, Init_TestPowerCtrl_001, TestSize.Level0) 559d9f0492fSopenharmony_ci{ 560d9f0492fSopenharmony_ci ParamServiceUnitTest test; 561d9f0492fSopenharmony_ci int ret = test.TestPowerCtrl("reboot,shutdown", 0770); 562d9f0492fSopenharmony_ci EXPECT_NE(ret, 0); 563d9f0492fSopenharmony_ci ret = test.TestPowerCtrl("reboot,shutdown", 0772); 564d9f0492fSopenharmony_ci#ifdef PARAM_SUPPORT_SELINUX 565d9f0492fSopenharmony_ci // selinux forbid 566d9f0492fSopenharmony_ci EXPECT_NE(ret, 0); 567d9f0492fSopenharmony_ci#endif 568d9f0492fSopenharmony_ci ret = test.TestPowerCtrl("reboot,updater", 0770); 569d9f0492fSopenharmony_ci EXPECT_NE(ret, 0); 570d9f0492fSopenharmony_ci ret = test.TestPowerCtrl("reboot,updater", 0772); 571d9f0492fSopenharmony_ci#ifdef PARAM_SUPPORT_SELINUX 572d9f0492fSopenharmony_ci // selinux forbid 573d9f0492fSopenharmony_ci EXPECT_NE(ret, 0); 574d9f0492fSopenharmony_ci#endif 575d9f0492fSopenharmony_ci ret = test.TestPowerCtrl("reboot,flashd", 0770); 576d9f0492fSopenharmony_ci EXPECT_NE(ret, 0); 577d9f0492fSopenharmony_ci ret = test.TestPowerCtrl("reboot,flashd", 0772); 578d9f0492fSopenharmony_ci#ifdef PARAM_SUPPORT_SELINUX 579d9f0492fSopenharmony_ci // selinux forbid 580d9f0492fSopenharmony_ci EXPECT_NE(ret, 0); 581d9f0492fSopenharmony_ci#endif 582d9f0492fSopenharmony_ci 583d9f0492fSopenharmony_ci ret = test.TestPowerCtrl("reboot", 0770); 584d9f0492fSopenharmony_ci EXPECT_NE(ret, 0); 585d9f0492fSopenharmony_ci ret = test.TestPowerCtrl("reboot", 0772); 586d9f0492fSopenharmony_ci#ifdef PARAM_SUPPORT_SELINUX 587d9f0492fSopenharmony_ci // selinux forbid 588d9f0492fSopenharmony_ci EXPECT_NE(ret, 0); 589d9f0492fSopenharmony_ci#endif 590d9f0492fSopenharmony_ci 591d9f0492fSopenharmony_ci ParamServiceStop(); 592d9f0492fSopenharmony_ci} 593d9f0492fSopenharmony_ci#endif 594d9f0492fSopenharmony_ci} // namespace init_ut 595