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 "bootstage.h" 18d9f0492fSopenharmony_ci#include "init_jobs_internal.h" 19d9f0492fSopenharmony_ci#include "init_log.h" 20d9f0492fSopenharmony_ci#include "init_param.h" 21d9f0492fSopenharmony_ci#include "init_utils.h" 22d9f0492fSopenharmony_ci#include "init_hashmap.h" 23d9f0492fSopenharmony_ci#include "loop_event.h" 24d9f0492fSopenharmony_ci#include "param_manager.h" 25d9f0492fSopenharmony_ci#include "param_stub.h" 26d9f0492fSopenharmony_ci#include "param_utils.h" 27d9f0492fSopenharmony_ci#include "securec.h" 28d9f0492fSopenharmony_ci#include "trigger_checker.h" 29d9f0492fSopenharmony_ci#include "trigger_manager.h" 30d9f0492fSopenharmony_ci 31d9f0492fSopenharmony_ciusing namespace testing::ext; 32d9f0492fSopenharmony_ciusing namespace std; 33d9f0492fSopenharmony_ci 34d9f0492fSopenharmony_cistatic const int triggerBuffer = 512; 35d9f0492fSopenharmony_cistatic uint32_t g_execCmdId = 0; 36d9f0492fSopenharmony_cistatic int g_matchTrigger = 0; 37d9f0492fSopenharmony_cistatic char g_matchTriggerName[triggerBuffer] = { 0 }; 38d9f0492fSopenharmony_cistatic void BootStateChange(int start, const char *content) 39d9f0492fSopenharmony_ci{ 40d9f0492fSopenharmony_ci UNUSED(content); 41d9f0492fSopenharmony_ci return; 42d9f0492fSopenharmony_ci} 43d9f0492fSopenharmony_ci 44d9f0492fSopenharmony_cistatic int TestCmdExec(const TriggerNode *trigger, const char *content, uint32_t size) 45d9f0492fSopenharmony_ci{ 46d9f0492fSopenharmony_ci PARAM_CHECK(trigger != nullptr, return -1, "Invalid trigger"); 47d9f0492fSopenharmony_ci PARAM_LOGI("DoTriggerExecute_ trigger type: %d %s", trigger->type, GetTriggerName(trigger)); 48d9f0492fSopenharmony_ci PARAM_CHECK(trigger->type <= TRIGGER_UNKNOW, return -1, "Invalid trigger type %d", trigger->type); 49d9f0492fSopenharmony_ci CommandNode *cmd = GetNextCmdNode(reinterpret_cast<const JobNode *>(trigger), nullptr); 50d9f0492fSopenharmony_ci while (cmd != nullptr) { 51d9f0492fSopenharmony_ci g_execCmdId = cmd->cmdKeyIndex; 52d9f0492fSopenharmony_ci cmd = GetNextCmdNode(reinterpret_cast<const JobNode *>(trigger), cmd); 53d9f0492fSopenharmony_ci } 54d9f0492fSopenharmony_ci return 0; 55d9f0492fSopenharmony_ci} 56d9f0492fSopenharmony_ci 57d9f0492fSopenharmony_cistatic int TestTriggerExecute(TriggerNode *trigger, const char *content, uint32_t size) 58d9f0492fSopenharmony_ci{ 59d9f0492fSopenharmony_ci JobNode *node = reinterpret_cast<JobNode *>(trigger); 60d9f0492fSopenharmony_ci int ret = memcpy_s(g_matchTriggerName, (int)sizeof(g_matchTriggerName) - 1, node->name, strlen(node->name)); 61d9f0492fSopenharmony_ci EXPECT_EQ(ret, 0); 62d9f0492fSopenharmony_ci g_matchTriggerName[strlen(node->name)] = '\0'; 63d9f0492fSopenharmony_ci g_matchTrigger++; 64d9f0492fSopenharmony_ci return 0; 65d9f0492fSopenharmony_ci} 66d9f0492fSopenharmony_ci 67d9f0492fSopenharmony_cistatic void Test_JobParseHook(JOB_PARSE_CTX *jobParseCtx) 68d9f0492fSopenharmony_ci{ 69d9f0492fSopenharmony_ci return; 70d9f0492fSopenharmony_ci} 71d9f0492fSopenharmony_ci 72d9f0492fSopenharmony_ciclass TriggerUnitTest : public ::testing::Test { 73d9f0492fSopenharmony_cipublic: 74d9f0492fSopenharmony_ci TriggerUnitTest() {} 75d9f0492fSopenharmony_ci virtual ~TriggerUnitTest() {} 76d9f0492fSopenharmony_ci 77d9f0492fSopenharmony_ci void SetUp() 78d9f0492fSopenharmony_ci { 79d9f0492fSopenharmony_ci SetTestPermissionResult(0); 80d9f0492fSopenharmony_ci } 81d9f0492fSopenharmony_ci void TearDown() {} 82d9f0492fSopenharmony_ci void TestBody() {} 83d9f0492fSopenharmony_ci 84d9f0492fSopenharmony_ci int ParseInitCfg(const char *configFile) 85d9f0492fSopenharmony_ci { 86d9f0492fSopenharmony_ci char *fileBuf = ReadFileToBuf(configFile); 87d9f0492fSopenharmony_ci INIT_ERROR_CHECK(fileBuf != nullptr, return -1, "Failed to read file content %s", configFile); 88d9f0492fSopenharmony_ci cJSON *fileRoot = cJSON_Parse(fileBuf); 89d9f0492fSopenharmony_ci INIT_ERROR_CHECK(fileRoot != nullptr, return -1, "Failed to parse json file %s", configFile); 90d9f0492fSopenharmony_ci ParseTriggerConfig(fileRoot, nullptr, nullptr); 91d9f0492fSopenharmony_ci cJSON_Delete(fileRoot); 92d9f0492fSopenharmony_ci free(fileBuf); 93d9f0492fSopenharmony_ci fileBuf = nullptr; 94d9f0492fSopenharmony_ci return 0; 95d9f0492fSopenharmony_ci } 96d9f0492fSopenharmony_ci 97d9f0492fSopenharmony_ci int TestLoadTrigger() 98d9f0492fSopenharmony_ci { 99d9f0492fSopenharmony_ci RegisterBootStateChange(BootStateChange); 100d9f0492fSopenharmony_ci InitAddJobParseHook(Test_JobParseHook); 101d9f0492fSopenharmony_ci 102d9f0492fSopenharmony_ci int cmdKeyIndex = 0; 103d9f0492fSopenharmony_ci const char *matchCmd = GetMatchCmd("setparam aaaa aaaa", &cmdKeyIndex); 104d9f0492fSopenharmony_ci printf("cmd %d \n", matchCmd != nullptr); 105d9f0492fSopenharmony_ci EXPECT_NE(matchCmd, nullptr); 106d9f0492fSopenharmony_ci 107d9f0492fSopenharmony_ci ReadConfig(); 108d9f0492fSopenharmony_ci ParseInitCfg(STARTUP_INIT_UT_PATH "/trigger_test.cfg"); 109d9f0492fSopenharmony_ci // trigger 110d9f0492fSopenharmony_ci PostTrigger(EVENT_TRIGGER_BOOT, "pre-init", strlen("pre-init")); 111d9f0492fSopenharmony_ci PostTrigger(EVENT_TRIGGER_BOOT, "init", strlen("init")); 112d9f0492fSopenharmony_ci PostTrigger(EVENT_TRIGGER_BOOT, "post-init", strlen("post-init")); 113d9f0492fSopenharmony_ci LE_DoAsyncEvent(LE_GetDefaultLoop(), GetTriggerWorkSpace()->eventHandle); 114d9f0492fSopenharmony_ci return 0; 115d9f0492fSopenharmony_ci } 116d9f0492fSopenharmony_ci 117d9f0492fSopenharmony_ci TriggerHeader *GetTriggerHeader(int type) 118d9f0492fSopenharmony_ci { 119d9f0492fSopenharmony_ci return &GetTriggerWorkSpace()->triggerHead[type]; 120d9f0492fSopenharmony_ci } 121d9f0492fSopenharmony_ci 122d9f0492fSopenharmony_ci JobNode *AddTrigger(int type, const char *name, const char *condition, uint32_t size) 123d9f0492fSopenharmony_ci { 124d9f0492fSopenharmony_ci return UpdateJobTrigger(GetTriggerWorkSpace(), type, condition, name); 125d9f0492fSopenharmony_ci } 126d9f0492fSopenharmony_ci 127d9f0492fSopenharmony_ci int TestAddTriggerForBoot() 128d9f0492fSopenharmony_ci { 129d9f0492fSopenharmony_ci JobNode *node = AddTrigger(TRIGGER_BOOT, "init-later", "", 0); 130d9f0492fSopenharmony_ci JobNode *trigger = GetTriggerByName(GetTriggerWorkSpace(), "init-later"); 131d9f0492fSopenharmony_ci EXPECT_EQ(node, trigger); 132d9f0492fSopenharmony_ci if (trigger == nullptr) { 133d9f0492fSopenharmony_ci return -1; 134d9f0492fSopenharmony_ci } 135d9f0492fSopenharmony_ci EXPECT_EQ(strcmp(trigger->name, "init-later"), 0); 136d9f0492fSopenharmony_ci 137d9f0492fSopenharmony_ci // add command 138d9f0492fSopenharmony_ci int cmdIndex = 0; 139d9f0492fSopenharmony_ci GetMatchCmd("reboot ", &cmdIndex); 140d9f0492fSopenharmony_ci int ret = AddCommand(trigger, cmdIndex, nullptr, nullptr); 141d9f0492fSopenharmony_ci EXPECT_EQ(ret, 0); 142d9f0492fSopenharmony_ci ret = AddCommand(trigger, cmdIndex, "update: aaaaaaa", nullptr); 143d9f0492fSopenharmony_ci EXPECT_EQ(ret, 0); 144d9f0492fSopenharmony_ci return 0; 145d9f0492fSopenharmony_ci } 146d9f0492fSopenharmony_ci 147d9f0492fSopenharmony_ci int TestAddTriggerForParm() 148d9f0492fSopenharmony_ci { 149d9f0492fSopenharmony_ci const char *triggerName = "param:test_param.000"; 150d9f0492fSopenharmony_ci int id = 0; 151d9f0492fSopenharmony_ci JobNode *node = AddTrigger(TRIGGER_PARAM, triggerName, "test_param.000=1", 0); 152d9f0492fSopenharmony_ci JobNode *trigger = GetTriggerByName(GetTriggerWorkSpace(), triggerName); 153d9f0492fSopenharmony_ci GetTriggerHeader(TRIGGER_PARAM)->compareData(reinterpret_cast<struct tagTriggerNode_ *>(trigger), &id); 154d9f0492fSopenharmony_ci EXPECT_EQ(trigger, node); 155d9f0492fSopenharmony_ci if (trigger == nullptr) { 156d9f0492fSopenharmony_ci return -1; 157d9f0492fSopenharmony_ci } 158d9f0492fSopenharmony_ci EXPECT_EQ(strcmp(trigger->name, triggerName), 0); 159d9f0492fSopenharmony_ci 160d9f0492fSopenharmony_ci // add command 161d9f0492fSopenharmony_ci int cmdIndex = 0; 162d9f0492fSopenharmony_ci GetMatchCmd("reboot ", &cmdIndex); 163d9f0492fSopenharmony_ci int ret = AddCommand(trigger, cmdIndex, nullptr, nullptr); 164d9f0492fSopenharmony_ci EXPECT_EQ(ret, 0); 165d9f0492fSopenharmony_ci ret = AddCommand(trigger, cmdIndex, "update: aaaaaaa", nullptr); 166d9f0492fSopenharmony_ci EXPECT_EQ(ret, 0); 167d9f0492fSopenharmony_ci return 0; 168d9f0492fSopenharmony_ci } 169d9f0492fSopenharmony_ci 170d9f0492fSopenharmony_ci int TestParamEvent() 171d9f0492fSopenharmony_ci { 172d9f0492fSopenharmony_ci PostParamTrigger(EVENT_TRIGGER_PARAM, "net.tcp.default_init_rwnd", "60"); 173d9f0492fSopenharmony_ci const char *sysctrl = "ohos.startup.powerctrl=reboot, shutdown"; 174d9f0492fSopenharmony_ci PostTrigger(EVENT_TRIGGER_PARAM, sysctrl, strlen(sysctrl)); 175d9f0492fSopenharmony_ci PostParamTrigger(EVENT_TRIGGER_PARAM, "ohos.startup.powerctrl", "reboot, shutdown"); 176d9f0492fSopenharmony_ci 177d9f0492fSopenharmony_ci const char *startCmd = "ohos.ctl.start=hdc -t"; 178d9f0492fSopenharmony_ci PostTrigger(EVENT_TRIGGER_PARAM, startCmd, strlen(startCmd)); 179d9f0492fSopenharmony_ci PostParamTrigger(EVENT_TRIGGER_PARAM, "ohos.ctl.start", "hdc -t"); 180d9f0492fSopenharmony_ci 181d9f0492fSopenharmony_ci const char *stopCmd = "ohos.ctl.stop=hdc -t"; 182d9f0492fSopenharmony_ci PostTrigger(EVENT_TRIGGER_PARAM, stopCmd, strlen(stopCmd)); 183d9f0492fSopenharmony_ci PostParamTrigger(EVENT_TRIGGER_PARAM, "ohos.ctl.stop", "hdc -t"); 184d9f0492fSopenharmony_ci return 0; 185d9f0492fSopenharmony_ci } 186d9f0492fSopenharmony_ci 187d9f0492fSopenharmony_ci int TestBootEvent(const char *boot) 188d9f0492fSopenharmony_ci { 189d9f0492fSopenharmony_ci PostTrigger(EVENT_TRIGGER_BOOT, boot, strlen(boot)); 190d9f0492fSopenharmony_ci return 0; 191d9f0492fSopenharmony_ci } 192d9f0492fSopenharmony_ci 193d9f0492fSopenharmony_ci int TestCheckParamTrigger1() 194d9f0492fSopenharmony_ci { 195d9f0492fSopenharmony_ci const char *triggerName = "param:test_param.111"; 196d9f0492fSopenharmony_ci const char *param = "test_param.aaa.111.2222"; 197d9f0492fSopenharmony_ci const char *value = "1"; 198d9f0492fSopenharmony_ci char buffer[triggerBuffer]; 199d9f0492fSopenharmony_ci int ret = sprintf_s(buffer, sizeof(buffer), "%s=%s", param, value); 200d9f0492fSopenharmony_ci EXPECT_GE(ret, 0); 201d9f0492fSopenharmony_ci JobNode *node = AddTrigger(TRIGGER_PARAM, triggerName, buffer, 0); 202d9f0492fSopenharmony_ci JobNode *trigger = GetTriggerByName(GetTriggerWorkSpace(), triggerName); 203d9f0492fSopenharmony_ci EXPECT_EQ(trigger, node); 204d9f0492fSopenharmony_ci 205d9f0492fSopenharmony_ci g_matchTrigger = 0; 206d9f0492fSopenharmony_ci ret = sprintf_s(buffer, sizeof(buffer), "%s=%s", param, "2"); 207d9f0492fSopenharmony_ci EXPECT_GE(ret, 0); 208d9f0492fSopenharmony_ci CheckTrigger(GetTriggerWorkSpace(), TRIGGER_PARAM, buffer, strlen(buffer), TestTriggerExecute); 209d9f0492fSopenharmony_ci EXPECT_EQ(0, g_matchTrigger); 210d9f0492fSopenharmony_ci 211d9f0492fSopenharmony_ci g_matchTrigger = 0; 212d9f0492fSopenharmony_ci ret = sprintf_s(buffer, sizeof(buffer), "%s=%s", param, value); 213d9f0492fSopenharmony_ci EXPECT_GE(ret, 0); 214d9f0492fSopenharmony_ci CheckTrigger(GetTriggerWorkSpace(), TRIGGER_PARAM, buffer, strlen(buffer), TestTriggerExecute); 215d9f0492fSopenharmony_ci EXPECT_EQ(1, g_matchTrigger); 216d9f0492fSopenharmony_ci EXPECT_EQ(0, strcmp(triggerName, g_matchTriggerName)); 217d9f0492fSopenharmony_ci 218d9f0492fSopenharmony_ci // check for bug 219d9f0492fSopenharmony_ci g_matchTrigger = 0; 220d9f0492fSopenharmony_ci ret = sprintf_s(buffer, sizeof(buffer), "%s=%s", "2222", value); 221d9f0492fSopenharmony_ci EXPECT_GE(ret, 0); 222d9f0492fSopenharmony_ci CheckTrigger(GetTriggerWorkSpace(), TRIGGER_PARAM, buffer, strlen(buffer), TestTriggerExecute); 223d9f0492fSopenharmony_ci EXPECT_EQ(0, g_matchTrigger); 224d9f0492fSopenharmony_ci 225d9f0492fSopenharmony_ci CheckTrigger(GetTriggerWorkSpace(), TRIGGER_PARAM_WATCH, buffer, strlen(buffer), TestTriggerExecute); 226d9f0492fSopenharmony_ci return 0; 227d9f0492fSopenharmony_ci } 228d9f0492fSopenharmony_ci 229d9f0492fSopenharmony_ci int TestCheckParamTrigger2() 230d9f0492fSopenharmony_ci { 231d9f0492fSopenharmony_ci const char *triggerName = "param:test_param.222"; 232d9f0492fSopenharmony_ci const char *param = "test_param.aaa.222.2222"; 233d9f0492fSopenharmony_ci char buffer[triggerBuffer]; 234d9f0492fSopenharmony_ci int ret = sprintf_s(buffer, sizeof(buffer), "%s=*", param); 235d9f0492fSopenharmony_ci EXPECT_GE(ret, 0); 236d9f0492fSopenharmony_ci JobNode *node = AddTrigger(TRIGGER_PARAM, triggerName, buffer, 0); 237d9f0492fSopenharmony_ci JobNode *trigger = GetTriggerByName(GetTriggerWorkSpace(), triggerName); 238d9f0492fSopenharmony_ci EXPECT_EQ(trigger, node); 239d9f0492fSopenharmony_ci 240d9f0492fSopenharmony_ci g_matchTrigger = 0; 241d9f0492fSopenharmony_ci ret = sprintf_s(buffer, sizeof(buffer), "%s=%s", param, "2"); 242d9f0492fSopenharmony_ci EXPECT_GE(ret, 0); 243d9f0492fSopenharmony_ci CheckTrigger(GetTriggerWorkSpace(), TRIGGER_PARAM, buffer, strlen(buffer), TestTriggerExecute); 244d9f0492fSopenharmony_ci EXPECT_EQ(1, g_matchTrigger); 245d9f0492fSopenharmony_ci EXPECT_EQ(0, strcmp(triggerName, g_matchTriggerName)); 246d9f0492fSopenharmony_ci 247d9f0492fSopenharmony_ci g_matchTrigger = 0; 248d9f0492fSopenharmony_ci CheckTrigger(GetTriggerWorkSpace(), TRIGGER_PARAM, param, strlen(param), TestTriggerExecute); 249d9f0492fSopenharmony_ci EXPECT_EQ(1, g_matchTrigger); 250d9f0492fSopenharmony_ci EXPECT_EQ(0, strcmp(triggerName, g_matchTriggerName)); 251d9f0492fSopenharmony_ci return 0; 252d9f0492fSopenharmony_ci } 253d9f0492fSopenharmony_ci 254d9f0492fSopenharmony_ci int TestCheckParamTrigger3() 255d9f0492fSopenharmony_ci { 256d9f0492fSopenharmony_ci const char *triggerName = "param:test_param.333"; 257d9f0492fSopenharmony_ci const char *param1 = "test_param.aaa.333.2222=1"; 258d9f0492fSopenharmony_ci const char *param2 = "test_param.aaa.333.3333=2"; 259d9f0492fSopenharmony_ci char buffer[triggerBuffer]; 260d9f0492fSopenharmony_ci int ret = sprintf_s(buffer, sizeof(buffer), "%s || %s", param1, param2); 261d9f0492fSopenharmony_ci EXPECT_GE(ret, 0); 262d9f0492fSopenharmony_ci JobNode *node = AddTrigger(TRIGGER_PARAM, triggerName, buffer, 0); 263d9f0492fSopenharmony_ci JobNode *trigger = GetTriggerByName(GetTriggerWorkSpace(), triggerName); 264d9f0492fSopenharmony_ci EXPECT_EQ(trigger, node); 265d9f0492fSopenharmony_ci 266d9f0492fSopenharmony_ci g_matchTrigger = 0; 267d9f0492fSopenharmony_ci CheckTrigger(GetTriggerWorkSpace(), TRIGGER_PARAM, param1, strlen(param1), TestTriggerExecute); 268d9f0492fSopenharmony_ci EXPECT_EQ(1, g_matchTrigger); 269d9f0492fSopenharmony_ci EXPECT_EQ(0, strcmp(triggerName, g_matchTriggerName)); 270d9f0492fSopenharmony_ci 271d9f0492fSopenharmony_ci g_matchTrigger = 0; 272d9f0492fSopenharmony_ci CheckTrigger(GetTriggerWorkSpace(), TRIGGER_PARAM, param2, strlen(param2), TestTriggerExecute); 273d9f0492fSopenharmony_ci EXPECT_EQ(1, g_matchTrigger); 274d9f0492fSopenharmony_ci EXPECT_EQ(0, strcmp(triggerName, g_matchTriggerName)); 275d9f0492fSopenharmony_ci return 0; 276d9f0492fSopenharmony_ci } 277d9f0492fSopenharmony_ci 278d9f0492fSopenharmony_ci int TestCheckParamTrigger4() 279d9f0492fSopenharmony_ci { 280d9f0492fSopenharmony_ci const char *triggerName = "param:test_param.444"; 281d9f0492fSopenharmony_ci const char *param1 = "test_param.aaa.444.2222"; 282d9f0492fSopenharmony_ci const char *param2 = "test_param.aaa.444.3333"; 283d9f0492fSopenharmony_ci char buffer[triggerBuffer]; 284d9f0492fSopenharmony_ci int ret = sprintf_s(buffer, sizeof(buffer), "%s=%s && %s=%s", param1, "1", param2, "2"); 285d9f0492fSopenharmony_ci EXPECT_GE(ret, 0); 286d9f0492fSopenharmony_ci JobNode *node = AddTrigger(TRIGGER_PARAM, triggerName, buffer, 0); 287d9f0492fSopenharmony_ci JobNode *trigger = GetTriggerByName(GetTriggerWorkSpace(), triggerName); 288d9f0492fSopenharmony_ci EXPECT_EQ(trigger, node); 289d9f0492fSopenharmony_ci DoJobNow(triggerName); 290d9f0492fSopenharmony_ci ClearTrigger(nullptr, 0); 291d9f0492fSopenharmony_ci g_matchTrigger = 0; 292d9f0492fSopenharmony_ci SystemWriteParam(param1, "1"); 293d9f0492fSopenharmony_ci ret = sprintf_s(buffer, sizeof(buffer), "%s=%s", param1, "1"); 294d9f0492fSopenharmony_ci EXPECT_GE(ret, 0); 295d9f0492fSopenharmony_ci CheckTrigger(GetTriggerWorkSpace(), TRIGGER_PARAM, buffer, strlen(buffer), TestTriggerExecute); 296d9f0492fSopenharmony_ci EXPECT_EQ(0, g_matchTrigger); 297d9f0492fSopenharmony_ci 298d9f0492fSopenharmony_ci SystemWriteParam(param2, "2"); 299d9f0492fSopenharmony_ci g_matchTrigger = 0; 300d9f0492fSopenharmony_ci ret = sprintf_s(buffer, sizeof(buffer), "%s=%s", param2, "2"); 301d9f0492fSopenharmony_ci EXPECT_GE(ret, 0); 302d9f0492fSopenharmony_ci CheckTrigger(GetTriggerWorkSpace(), TRIGGER_PARAM, buffer, strlen(buffer), TestTriggerExecute); 303d9f0492fSopenharmony_ci EXPECT_EQ(1, g_matchTrigger); 304d9f0492fSopenharmony_ci EXPECT_EQ(0, strcmp(triggerName, g_matchTriggerName)); 305d9f0492fSopenharmony_ci return 0; 306d9f0492fSopenharmony_ci } 307d9f0492fSopenharmony_ci 308d9f0492fSopenharmony_ci // test for trigger aaaa:test_param.aaa 被加入unknown执行 309d9f0492fSopenharmony_ci int TestCheckParamTrigger5() 310d9f0492fSopenharmony_ci { 311d9f0492fSopenharmony_ci const char *triggerName = "aaaa:test_param.aaa"; 312d9f0492fSopenharmony_ci const char *param1 = "test_param.aaa.aaa.2222"; 313d9f0492fSopenharmony_ci const char *param2 = "test_param.aaa.aaa.3333"; 314d9f0492fSopenharmony_ci char buffer[triggerBuffer]; 315d9f0492fSopenharmony_ci int ret = sprintf_s(buffer, sizeof(buffer), "aaaa && %s=%s && %s=%s", param1, "1", param2, "2"); 316d9f0492fSopenharmony_ci EXPECT_GE(ret, 0); 317d9f0492fSopenharmony_ci JobNode *node = AddTrigger(TRIGGER_UNKNOW, triggerName, buffer, 0); 318d9f0492fSopenharmony_ci JobNode *trigger = GetTriggerByName(GetTriggerWorkSpace(), triggerName); 319d9f0492fSopenharmony_ci EXPECT_EQ(trigger, node); 320d9f0492fSopenharmony_ci 321d9f0492fSopenharmony_ci g_matchTrigger = 0; 322d9f0492fSopenharmony_ci SystemWriteParam(param1, "1"); 323d9f0492fSopenharmony_ci ret = sprintf_s(buffer, sizeof(buffer), "%s=%s", param1, "1"); 324d9f0492fSopenharmony_ci EXPECT_GE(ret, 0); 325d9f0492fSopenharmony_ci CheckTrigger(GetTriggerWorkSpace(), TRIGGER_PARAM, buffer, strlen(buffer), TestTriggerExecute); 326d9f0492fSopenharmony_ci EXPECT_EQ(0, g_matchTrigger); 327d9f0492fSopenharmony_ci 328d9f0492fSopenharmony_ci SystemWriteParam(param2, "2"); 329d9f0492fSopenharmony_ci g_matchTrigger = 0; 330d9f0492fSopenharmony_ci CheckTrigger(GetTriggerWorkSpace(), TRIGGER_UNKNOW, "aaaa", strlen("aaaa"), TestTriggerExecute); 331d9f0492fSopenharmony_ci EXPECT_EQ(1, g_matchTrigger); 332d9f0492fSopenharmony_ci EXPECT_EQ(0, strcmp(triggerName, g_matchTriggerName)); 333d9f0492fSopenharmony_ci return 0; 334d9f0492fSopenharmony_ci } 335d9f0492fSopenharmony_ci 336d9f0492fSopenharmony_ci int TestComputeCondition(const char *condition) 337d9f0492fSopenharmony_ci { 338d9f0492fSopenharmony_ci u_int32_t size = strlen(condition) + CONDITION_EXTEND_LEN; 339d9f0492fSopenharmony_ci char *prefix = reinterpret_cast<char *>(malloc(size)); 340d9f0492fSopenharmony_ci if (prefix == nullptr) { 341d9f0492fSopenharmony_ci printf("prefix is null.\n"); 342d9f0492fSopenharmony_ci return -1; 343d9f0492fSopenharmony_ci } 344d9f0492fSopenharmony_ci ConvertInfixToPrefix(condition, prefix, size); 345d9f0492fSopenharmony_ci printf("prefix %s \n", prefix); 346d9f0492fSopenharmony_ci free(prefix); 347d9f0492fSopenharmony_ci return 0; 348d9f0492fSopenharmony_ci } 349d9f0492fSopenharmony_ci 350d9f0492fSopenharmony_ci // 普通的属性trigger 351d9f0492fSopenharmony_ci int TestExecuteParamTrigger1() 352d9f0492fSopenharmony_ci { 353d9f0492fSopenharmony_ci const char *triggerName = "aaaa:test_param.eee"; 354d9f0492fSopenharmony_ci const char *param = "test_param.eee.aaa.1111"; 355d9f0492fSopenharmony_ci const char *value = "eee"; 356d9f0492fSopenharmony_ci char buffer[triggerBuffer]; 357d9f0492fSopenharmony_ci int ret = sprintf_s(buffer, sizeof(buffer), "%s=%s", param, value); 358d9f0492fSopenharmony_ci EXPECT_GE(ret, 0); 359d9f0492fSopenharmony_ci JobNode *node = AddTrigger(TRIGGER_PARAM, triggerName, buffer, 0); 360d9f0492fSopenharmony_ci JobNode *trigger = GetTriggerByName(GetTriggerWorkSpace(), triggerName); 361d9f0492fSopenharmony_ci EXPECT_EQ(trigger, node); 362d9f0492fSopenharmony_ci 363d9f0492fSopenharmony_ci const uint32_t cmdIndex = 100; 364d9f0492fSopenharmony_ci ret = AddCommand(trigger, cmdIndex, value, nullptr); 365d9f0492fSopenharmony_ci EXPECT_EQ(ret, 0); 366d9f0492fSopenharmony_ci // 修改命令为测试执行 367d9f0492fSopenharmony_ci RegisterTriggerExec(TRIGGER_PARAM, TestCmdExec); 368d9f0492fSopenharmony_ci SystemWriteParam(param, value); 369d9f0492fSopenharmony_ci LE_DoAsyncEvent(LE_GetDefaultLoop(), GetTriggerWorkSpace()->eventHandle); 370d9f0492fSopenharmony_ci EXPECT_EQ(g_execCmdId, cmdIndex); 371d9f0492fSopenharmony_ci return 0; 372d9f0492fSopenharmony_ci } 373d9f0492fSopenharmony_ci 374d9f0492fSopenharmony_ci int TestExecuteParamTrigger2() 375d9f0492fSopenharmony_ci { 376d9f0492fSopenharmony_ci const char *triggerName = "param:test_param.dddd"; 377d9f0492fSopenharmony_ci const char *param = "test_param.dddd.aaa.2222"; 378d9f0492fSopenharmony_ci const char *value = "2222"; 379d9f0492fSopenharmony_ci char buffer[triggerBuffer]; 380d9f0492fSopenharmony_ci int ret = sprintf_s(buffer, sizeof(buffer), "%s=%s", param, value); 381d9f0492fSopenharmony_ci EXPECT_GE(ret, 0); 382d9f0492fSopenharmony_ci JobNode *node = AddTrigger(TRIGGER_PARAM, triggerName, buffer, 0); 383d9f0492fSopenharmony_ci JobNode *trigger = GetTriggerByName(GetTriggerWorkSpace(), triggerName); 384d9f0492fSopenharmony_ci EXPECT_EQ(trigger, node); 385d9f0492fSopenharmony_ci const uint32_t cmdIndex = 102; 386d9f0492fSopenharmony_ci ret = AddCommand(trigger, cmdIndex, value, nullptr); 387d9f0492fSopenharmony_ci EXPECT_EQ(ret, 0); 388d9f0492fSopenharmony_ci RegisterTriggerExec(TRIGGER_PARAM, TestCmdExec); 389d9f0492fSopenharmony_ci SystemWriteParam(param, value); 390d9f0492fSopenharmony_ci LE_DoAsyncEvent(LE_GetDefaultLoop(), GetTriggerWorkSpace()->eventHandle); 391d9f0492fSopenharmony_ci EXPECT_EQ(g_execCmdId, cmdIndex); 392d9f0492fSopenharmony_ci return 0; 393d9f0492fSopenharmony_ci } 394d9f0492fSopenharmony_ci 395d9f0492fSopenharmony_ci // 测试执行后立刻删除 396d9f0492fSopenharmony_ci int TestExecuteParamTrigger3() 397d9f0492fSopenharmony_ci { 398d9f0492fSopenharmony_ci const char *triggerName = "param:test_param.3333"; 399d9f0492fSopenharmony_ci const char *param = "test_param.dddd.aaa.3333"; 400d9f0492fSopenharmony_ci const char *value = "3333"; 401d9f0492fSopenharmony_ci char buffer[triggerBuffer]; 402d9f0492fSopenharmony_ci int ret = sprintf_s(buffer, sizeof(buffer), "%s=%s", param, value); 403d9f0492fSopenharmony_ci EXPECT_GE(ret, 0); 404d9f0492fSopenharmony_ci JobNode *node = AddTrigger(TRIGGER_PARAM, triggerName, buffer, 0); 405d9f0492fSopenharmony_ci JobNode *trigger = GetTriggerByName(GetTriggerWorkSpace(), triggerName); 406d9f0492fSopenharmony_ci EXPECT_EQ(trigger, node); 407d9f0492fSopenharmony_ci if (trigger == nullptr) { 408d9f0492fSopenharmony_ci return -1; 409d9f0492fSopenharmony_ci } 410d9f0492fSopenharmony_ci const uint32_t cmdIndex = 103; 411d9f0492fSopenharmony_ci ret = AddCommand(trigger, cmdIndex, value, nullptr); 412d9f0492fSopenharmony_ci EXPECT_EQ(ret, 0); 413d9f0492fSopenharmony_ci TRIGGER_SET_FLAG(trigger, TRIGGER_FLAGS_ONCE); 414d9f0492fSopenharmony_ci SystemWriteParam(param, value); 415d9f0492fSopenharmony_ci 416d9f0492fSopenharmony_ci RegisterTriggerExec(TRIGGER_PARAM, TestCmdExec); 417d9f0492fSopenharmony_ci LE_DoAsyncEvent(LE_GetDefaultLoop(), GetTriggerWorkSpace()->eventHandle); 418d9f0492fSopenharmony_ci EXPECT_EQ(g_execCmdId, cmdIndex); 419d9f0492fSopenharmony_ci trigger = GetTriggerByName(GetTriggerWorkSpace(), triggerName); 420d9f0492fSopenharmony_ci if (trigger != nullptr) { 421d9f0492fSopenharmony_ci EXPECT_EQ(1, 0); 422d9f0492fSopenharmony_ci } 423d9f0492fSopenharmony_ci return 0; 424d9f0492fSopenharmony_ci } 425d9f0492fSopenharmony_ci 426d9f0492fSopenharmony_ci // 测试删除队列中的trigger 427d9f0492fSopenharmony_ci int TestExecuteParamTrigger4() 428d9f0492fSopenharmony_ci { 429d9f0492fSopenharmony_ci const char *triggerName = "param:test_param.4444"; 430d9f0492fSopenharmony_ci const char *param = "test_param.dddd.aaa.4444"; 431d9f0492fSopenharmony_ci const char *value = "4444"; 432d9f0492fSopenharmony_ci char buffer[triggerBuffer]; 433d9f0492fSopenharmony_ci int ret = sprintf_s(buffer, sizeof(buffer), "%s=%s", param, value); 434d9f0492fSopenharmony_ci EXPECT_GE(ret, 0); 435d9f0492fSopenharmony_ci JobNode *node = AddTrigger(TRIGGER_PARAM, triggerName, buffer, 0); 436d9f0492fSopenharmony_ci JobNode *trigger = GetTriggerByName(GetTriggerWorkSpace(), triggerName); 437d9f0492fSopenharmony_ci EXPECT_EQ(trigger, node); 438d9f0492fSopenharmony_ci if (trigger == nullptr) { 439d9f0492fSopenharmony_ci return -1; 440d9f0492fSopenharmony_ci } 441d9f0492fSopenharmony_ci const uint32_t cmdIndex = 105; 442d9f0492fSopenharmony_ci ret = AddCommand(trigger, cmdIndex, value, nullptr); 443d9f0492fSopenharmony_ci EXPECT_EQ(ret, 0); 444d9f0492fSopenharmony_ci TRIGGER_SET_FLAG(trigger, TRIGGER_FLAGS_ONCE); 445d9f0492fSopenharmony_ci SystemWriteParam(param, value); 446d9f0492fSopenharmony_ci 447d9f0492fSopenharmony_ci RegisterTriggerExec(TRIGGER_PARAM, TestCmdExec); 448d9f0492fSopenharmony_ci FreeTrigger(GetTriggerWorkSpace(), reinterpret_cast<TriggerNode *>(trigger)); 449d9f0492fSopenharmony_ci LE_DoAsyncEvent(LE_GetDefaultLoop(), GetTriggerWorkSpace()->eventHandle); 450d9f0492fSopenharmony_ci EXPECT_NE(g_execCmdId, cmdIndex); 451d9f0492fSopenharmony_ci trigger = GetTriggerByName(GetTriggerWorkSpace(), triggerName); 452d9f0492fSopenharmony_ci if (trigger != nullptr) { 453d9f0492fSopenharmony_ci EXPECT_EQ(1, 0); 454d9f0492fSopenharmony_ci } 455d9f0492fSopenharmony_ci return 0; 456d9f0492fSopenharmony_ci } 457d9f0492fSopenharmony_ci 458d9f0492fSopenharmony_ci // 测试执行后检查子trigger执行 459d9f0492fSopenharmony_ci int TestExecuteParamTrigger5() 460d9f0492fSopenharmony_ci { 461d9f0492fSopenharmony_ci const char *boot = "boot2"; 462d9f0492fSopenharmony_ci const char *triggerName = "boot2:test_param.5555"; 463d9f0492fSopenharmony_ci const char *param = "test_param.dddd.aaa.5555"; 464d9f0492fSopenharmony_ci const char *value = "5555"; 465d9f0492fSopenharmony_ci JobNode *trigger = AddTrigger(TRIGGER_BOOT, boot, nullptr, 0); 466d9f0492fSopenharmony_ci const int testCmdIndex = 1105; 467d9f0492fSopenharmony_ci int ret = AddCommand(trigger, testCmdIndex, value, nullptr); 468d9f0492fSopenharmony_ci EXPECT_EQ(ret, 0); 469d9f0492fSopenharmony_ci if (trigger == nullptr) { 470d9f0492fSopenharmony_ci return -1; 471d9f0492fSopenharmony_ci } 472d9f0492fSopenharmony_ci TRIGGER_SET_FLAG(trigger, TRIGGER_FLAGS_SUBTRIGGER); 473d9f0492fSopenharmony_ci 474d9f0492fSopenharmony_ci char buffer[triggerBuffer]; 475d9f0492fSopenharmony_ci ret = sprintf_s(buffer, sizeof(buffer), "boot2 && %s=%s", param, value); 476d9f0492fSopenharmony_ci EXPECT_GE(ret, 0); 477d9f0492fSopenharmony_ci trigger = AddTrigger(TRIGGER_UNKNOW, triggerName, buffer, 0); 478d9f0492fSopenharmony_ci const int testCmdIndex2 = 105; 479d9f0492fSopenharmony_ci ret = AddCommand(trigger, testCmdIndex2, value, nullptr); 480d9f0492fSopenharmony_ci 481d9f0492fSopenharmony_ci RegisterTriggerExec(TRIGGER_UNKNOW, TestCmdExec); 482d9f0492fSopenharmony_ci SystemWriteParam(param, value); 483d9f0492fSopenharmony_ci 484d9f0492fSopenharmony_ci TestBootEvent(boot); 485d9f0492fSopenharmony_ci LE_DoAsyncEvent(LE_GetDefaultLoop(), GetTriggerWorkSpace()->eventHandle); 486d9f0492fSopenharmony_ci EXPECT_EQ(g_execCmdId, (uint32_t)testCmdIndex2); 487d9f0492fSopenharmony_ci return 0; 488d9f0492fSopenharmony_ci } 489d9f0492fSopenharmony_ci 490d9f0492fSopenharmony_ci int TestDumpTrigger() 491d9f0492fSopenharmony_ci { 492d9f0492fSopenharmony_ci (void)AddCompleteJob("param:ohos.servicectrl.display", "ohos.servicectrl.display=*", "display system"); 493d9f0492fSopenharmony_ci DoTriggerExec("param:ohos.servicectrl.display"); 494d9f0492fSopenharmony_ci return 0; 495d9f0492fSopenharmony_ci } 496d9f0492fSopenharmony_ci}; 497d9f0492fSopenharmony_ci 498d9f0492fSopenharmony_ciHWTEST_F(TriggerUnitTest, Init_TestLoadTrigger_001, TestSize.Level0) 499d9f0492fSopenharmony_ci{ 500d9f0492fSopenharmony_ci TriggerUnitTest test; 501d9f0492fSopenharmony_ci test.TestLoadTrigger(); 502d9f0492fSopenharmony_ci} 503d9f0492fSopenharmony_ci 504d9f0492fSopenharmony_ciHWTEST_F(TriggerUnitTest, Init_TestBootEvent_001, TestSize.Level0) 505d9f0492fSopenharmony_ci{ 506d9f0492fSopenharmony_ci TriggerUnitTest test; 507d9f0492fSopenharmony_ci test.TestBootEvent("pre-init"); 508d9f0492fSopenharmony_ci test.TestBootEvent("init"); 509d9f0492fSopenharmony_ci test.TestBootEvent("post-init"); 510d9f0492fSopenharmony_ci test.TestBootEvent("early-init"); 511d9f0492fSopenharmony_ci} 512d9f0492fSopenharmony_ci 513d9f0492fSopenharmony_ciHWTEST_F(TriggerUnitTest, Init_TestAddTriggerForBoot_001, TestSize.Level0) 514d9f0492fSopenharmony_ci{ 515d9f0492fSopenharmony_ci TriggerUnitTest test; 516d9f0492fSopenharmony_ci test.TestAddTriggerForBoot(); 517d9f0492fSopenharmony_ci} 518d9f0492fSopenharmony_ci 519d9f0492fSopenharmony_ciHWTEST_F(TriggerUnitTest, Init_TestAddTriggerForParm_001, TestSize.Level0) 520d9f0492fSopenharmony_ci{ 521d9f0492fSopenharmony_ci TriggerUnitTest test; 522d9f0492fSopenharmony_ci test.TestAddTriggerForParm(); 523d9f0492fSopenharmony_ci} 524d9f0492fSopenharmony_ci 525d9f0492fSopenharmony_ciHWTEST_F(TriggerUnitTest, Init_TestCheckParamTrigger_001, TestSize.Level0) 526d9f0492fSopenharmony_ci{ 527d9f0492fSopenharmony_ci TriggerUnitTest test; 528d9f0492fSopenharmony_ci test.TestCheckParamTrigger1(); 529d9f0492fSopenharmony_ci} 530d9f0492fSopenharmony_ci 531d9f0492fSopenharmony_ciHWTEST_F(TriggerUnitTest, Init_TestCheckParamTrigger_002, TestSize.Level0) 532d9f0492fSopenharmony_ci{ 533d9f0492fSopenharmony_ci TriggerUnitTest test; 534d9f0492fSopenharmony_ci test.TestCheckParamTrigger2(); 535d9f0492fSopenharmony_ci} 536d9f0492fSopenharmony_ci 537d9f0492fSopenharmony_ciHWTEST_F(TriggerUnitTest, Init_TestCheckParamTrigger_003, TestSize.Level0) 538d9f0492fSopenharmony_ci{ 539d9f0492fSopenharmony_ci TriggerUnitTest test; 540d9f0492fSopenharmony_ci test.TestCheckParamTrigger3(); 541d9f0492fSopenharmony_ci} 542d9f0492fSopenharmony_ci 543d9f0492fSopenharmony_ciHWTEST_F(TriggerUnitTest, Init_TestCheckParamTrigger_004, TestSize.Level0) 544d9f0492fSopenharmony_ci{ 545d9f0492fSopenharmony_ci TriggerUnitTest test; 546d9f0492fSopenharmony_ci test.TestCheckParamTrigger4(); 547d9f0492fSopenharmony_ci} 548d9f0492fSopenharmony_ci 549d9f0492fSopenharmony_ciHWTEST_F(TriggerUnitTest, Init_TestCheckParamTrigger_005, TestSize.Level0) 550d9f0492fSopenharmony_ci{ 551d9f0492fSopenharmony_ci TriggerUnitTest test; 552d9f0492fSopenharmony_ci test.TestCheckParamTrigger5(); 553d9f0492fSopenharmony_ci} 554d9f0492fSopenharmony_ci 555d9f0492fSopenharmony_ciHWTEST_F(TriggerUnitTest, Init_TestParamEvent_001, TestSize.Level0) 556d9f0492fSopenharmony_ci{ 557d9f0492fSopenharmony_ci TriggerUnitTest test; 558d9f0492fSopenharmony_ci test.TestParamEvent(); 559d9f0492fSopenharmony_ci} 560d9f0492fSopenharmony_ci 561d9f0492fSopenharmony_ciHWTEST_F(TriggerUnitTest, Init_TestComputerCondition_001, TestSize.Level0) 562d9f0492fSopenharmony_ci{ 563d9f0492fSopenharmony_ci TriggerUnitTest test; 564d9f0492fSopenharmony_ci test.TestComputeCondition("aaa=111||aaa=222||aaa=333"); 565d9f0492fSopenharmony_ci test.TestComputeCondition("aaa=111||aaa=222&&aaa=333"); 566d9f0492fSopenharmony_ci test.TestComputeCondition("(aaa=111||aaa=222)&&aaa=333"); 567d9f0492fSopenharmony_ci test.TestComputeCondition("aaa=111||(aaa=222&&aaa=333)"); 568d9f0492fSopenharmony_ci} 569d9f0492fSopenharmony_ci 570d9f0492fSopenharmony_ciHWTEST_F(TriggerUnitTest, Init_TestExecuteParamTrigger_001, TestSize.Level0) 571d9f0492fSopenharmony_ci{ 572d9f0492fSopenharmony_ci TriggerUnitTest test; 573d9f0492fSopenharmony_ci test.TestExecuteParamTrigger1(); 574d9f0492fSopenharmony_ci} 575d9f0492fSopenharmony_ci 576d9f0492fSopenharmony_ciHWTEST_F(TriggerUnitTest, Init_TestExecuteParamTrigger_002, TestSize.Level0) 577d9f0492fSopenharmony_ci{ 578d9f0492fSopenharmony_ci TriggerUnitTest test; 579d9f0492fSopenharmony_ci test.TestExecuteParamTrigger2(); 580d9f0492fSopenharmony_ci} 581d9f0492fSopenharmony_ci 582d9f0492fSopenharmony_ciHWTEST_F(TriggerUnitTest, Init_TestExecuteParamTrigger_003, TestSize.Level0) 583d9f0492fSopenharmony_ci{ 584d9f0492fSopenharmony_ci TriggerUnitTest test; 585d9f0492fSopenharmony_ci test.TestExecuteParamTrigger3(); 586d9f0492fSopenharmony_ci} 587d9f0492fSopenharmony_ci 588d9f0492fSopenharmony_ciHWTEST_F(TriggerUnitTest, Init_TestExecuteParamTrigger_004, TestSize.Level0) 589d9f0492fSopenharmony_ci{ 590d9f0492fSopenharmony_ci TriggerUnitTest test; 591d9f0492fSopenharmony_ci test.TestExecuteParamTrigger4(); 592d9f0492fSopenharmony_ci} 593d9f0492fSopenharmony_ci 594d9f0492fSopenharmony_ciHWTEST_F(TriggerUnitTest, Init_TestExecuteParamTrigger_005, TestSize.Level0) 595d9f0492fSopenharmony_ci{ 596d9f0492fSopenharmony_ci TriggerUnitTest test; 597d9f0492fSopenharmony_ci test.TestExecuteParamTrigger5(); 598d9f0492fSopenharmony_ci} 599d9f0492fSopenharmony_ci 600d9f0492fSopenharmony_ciHWTEST_F(TriggerUnitTest, Init_TestExecuteParamTrigger_006, TestSize.Level0) 601d9f0492fSopenharmony_ci{ 602d9f0492fSopenharmony_ci TriggerUnitTest test; 603d9f0492fSopenharmony_ci test.TestDumpTrigger(); 604d9f0492fSopenharmony_ci 605d9f0492fSopenharmony_ci} 606