1 /*
2  * Copyright (c) 2023 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 <cinttypes>
16 #include <ctime>
17 #include <sys/time.h>
18 
19 #include "bootevent.h"
20 #include "init_param.h"
21 #include "init_utils.h"
22 #include "list.h"
23 #include "param_stub.h"
24 #include "securec.h"
25 #include "sys_event.h"
26 #include "init_cmdexecutor.h"
27 
28 using namespace std;
29 using namespace testing::ext;
30 extern "C" {
31 extern void ReportBootEventComplete(ListNode *events);
32 }
33 
AddBootEvent(ListNode * events,const char * name,int32_t type)34 static void AddBootEvent(ListNode *events, const char *name, int32_t type)
35 {
36     BOOT_EVENT_PARAM_ITEM *item = (BOOT_EVENT_PARAM_ITEM *)calloc(1, sizeof(BOOT_EVENT_PARAM_ITEM));
37     if (item == nullptr) {
38         return;
39     }
40     OH_ListInit(&item->node);
41     item->paramName = strdup(name);
42     if (item->paramName == nullptr) {
43         free(item);
44         return;
45     }
46     (void)clock_gettime(CLOCK_MONOTONIC, &(item->timestamp[BOOTEVENT_FORK]));
47     (void)clock_gettime(CLOCK_MONOTONIC, &(item->timestamp[BOOTEVENT_READY]));
48     item->flags = type;
49     OH_ListAddTail(events, (ListNode *)&item->node);
50 }
51 
BootEventDestroyProc(ListNode * node)52 static void BootEventDestroyProc(ListNode *node)
53 {
54     if (node == nullptr) {
55         return;
56     }
57     BOOT_EVENT_PARAM_ITEM *item = (BOOT_EVENT_PARAM_ITEM *)node;
58     OH_ListRemove(node);
59     OH_ListInit(node);
60     free(item->paramName);
61     free(item);
62 }
63 
64 namespace init_ut {
65 class SysEventUnitTest : public testing::Test {
66 public:
SetUpTestCase(void)67     static void SetUpTestCase(void) {};
TearDownTestCase(void)68     static void TearDownTestCase(void) {};
SetUp()69     void SetUp() {};
TearDown()70     void TearDown() {};
71 };
72 
73 HWTEST_F(SysEventUnitTest, SysEventTest_001, TestSize.Level1)
74 {
75     ReportBootEventComplete(nullptr);
76 }
77 
78 HWTEST_F(SysEventUnitTest, SysEventTest_002, TestSize.Level1)
79 {
80     ListNode events = { &events, &events };
81     // empty event
82     ReportBootEventComplete(&events);
83 }
84 
85 HWTEST_F(SysEventUnitTest, SysEventTest_003, TestSize.Level1)
86 {
87     ListNode events = { &events, &events };
88     // create event and report
89     AddBootEvent(&events, "bootevent.11111.xxxx", BOOTEVENT_TYPE_JOB);
90     AddBootEvent(&events, "bootevent.22222222.xxxx", BOOTEVENT_TYPE_SERVICE);
91     AddBootEvent(&events, "bootevent.33333333333.xxxx", BOOTEVENT_TYPE_SERVICE);
92     AddBootEvent(&events, "bootevent.44444444444444", BOOTEVENT_TYPE_SERVICE);
93     AddBootEvent(&events, "bootevent.44444444444444.6666666666.777777", BOOTEVENT_TYPE_SERVICE);
94     SystemWriteParam("ohos.boot.bootreason", "-1");
95     ReportBootEventComplete(&events);
96     OH_ListRemoveAll(&events, BootEventDestroyProc);
97 }
98 
99 HWTEST_F(SysEventUnitTest, SysEventTest_004, TestSize.Level1)
100 {
101     struct timespec curr = {0};
102     if (clock_gettime(CLOCK_MONOTONIC, &curr) != 0) {
103         return;
104     }
105     StartupTimeEvent startupTime = {};
106     startupTime.event.type = STARTUP_TIME;
107     startupTime.totalTime = curr.tv_sec;
108     startupTime.totalTime = startupTime.totalTime * MSECTONSEC;
109     startupTime.totalTime += curr.tv_nsec / USTONSEC;
110     startupTime.detailTime = const_cast<char *>("buffer");
111     startupTime.reason = const_cast<char *>("");
112     startupTime.firstStart = 1;
113     ReportSysEvent(&startupTime.event);
114 }
115 
116 HWTEST_F(SysEventUnitTest, SysEventTest_005, TestSize.Level1)
117 {
118     struct timespec curr = {0};
119     if (clock_gettime(CLOCK_MONOTONIC, &curr) != 0) {
120         return;
121     }
122     StartupTimeEvent startupTime = {};
123     startupTime.event.type = STARTUP_EVENT_MAX;
124     startupTime.totalTime = curr.tv_sec;
125     startupTime.totalTime = startupTime.totalTime * MSECTONSEC;
126     startupTime.totalTime += curr.tv_nsec / USTONSEC;
127     startupTime.detailTime = const_cast<char *>("buffer");
128     startupTime.reason = const_cast<char *>("");
129     startupTime.firstStart = 1;
130     ReportSysEvent(&startupTime.event);
131 }
132 
133 HWTEST_F(SysEventUnitTest, SysEventTest_006, TestSize.Level1)
134 {
135     ReportSysEvent(nullptr);
136 }
137 
138 HWTEST_F(SysEventUnitTest, SysEventTest_007, TestSize.Level1)
139 {
140     const char *appfwkReady[] = {"bootevent.appfwk.ready"};
141     int ret = PluginExecCmd("unset_bootevent", 1, appfwkReady);
142     printf("SysEventTest_007:%d\n", ret);
143 }
144 } // namespace init_ut
145