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
16#include "bootstage.h"
17#include "init_utils.h"
18#include "init_cmds.h"
19#include "init_cmdexecutor.h"
20#include "param_stub.h"
21#include "securec.h"
22
23using namespace std;
24using namespace testing::ext;
25
26namespace init_ut {
27static const char *g_content =
28    "\"KERNEL\" : ["
29    "{"
30        "\"name\" : \"disk\","
31        "\"description\" : \"Disk I/O\","
32        "\"tag\" : 0,"
33        "\"type\" : \"KERNEL\","
34        "\"sys-files\" : ["
35            "\"events/f2fs/f2fs_sync_file_enter/enable\","
36            "\"events/f2fs/f2fs_sync_file_exit/enable\","
37            "\"events/f2fs/f2fs_write_begin/enable\","
38            "\"events/f2fs/f2fs_write_end/enable\","
39            "\"events/ext4/ext4_da_write_begin/enable\","
40            "\"events/ext4/ext4_da_write_end/enable\","
41            "\"events/ext4/ext4_sync_file_enter/enable\","
42            "\"events/ext4/ext4_sync_file_exit/enable\","
43            "\"events/block/block_rq_issue/enable\","
44            "\"events/block/block_rq_complete/enable\""
45        "]"
46    "},"
47    "{"
48        "\"name\" : \"mmc\","
49        "\"description\" : \"eMMC commands\","
50        "\"tag\" : 0,"
51        "\"type\" : \"KERNEL\","
52        "\"sys-files\" : ["
53            "\"events/mmc/enable\""
54        "]"
55    "},"
56    "{"
57        "\"name\" : \"test\","
58        "\"description\" : \"test\","
59        "\"tag\" : 0,"
60        "\"type\" : \"KERNEL\","
61        "\"sys-files\" : ["
62        "]"
63    "}"
64    "],"
65    "\"USER\" : ["
66        "{"
67            "\"name\" : \"ohos\","
68            "\"description\" : \"OpenHarmony\","
69            "\"tag\" : 30,"
70            "\"type\" : \"USER\","
71            "\"sys-files\" : ["
72            "]"
73        "},"
74        "{"
75            "\"name\" : \"ability\","
76            "\"description\" : \"Ability Manager\","
77            "\"tag\" : 31,"
78            "\"type\" : \"USER\","
79            "\"sys-files\" : ["
80            "]"
81        "},"
82        "{"
83            "\"name\" : \"usb\","
84            "\"description\" : \"usb subsystem\","
85            "\"tag\" : 19,"
86            "\"type\" : \"USER\","
87            "\"sys-files\" : ["
88            "]"
89        "}"
90    "]"
91"}";
92void CreateInitTraceConfig(int compress)
93{
94    std::string config = "{ \"compress\" : ";
95    if (!compress) {
96        config += "false,";
97    } else {
98        config += "true, ";
99    }
100    config += g_content;
101    // create trace cfg
102    CreateTestFile(STARTUP_INIT_UT_PATH"/system/etc/init_trace.cfg", config.c_str());
103}
104
105class TraceUnitTest : public testing::Test {
106public:
107    static void SetUpTestCase(void) {};
108    static void TearDownTestCase(void) {};
109    void SetUp() {};
110    void TearDown() {};
111};
112
113HWTEST_F(TraceUnitTest, TraceTest_001, TestSize.Level1)
114{
115    // open switch for trace
116    uint32_t dataIndex = 0;
117    WriteParam("persist.init.bootevent.enable", "true", &dataIndex, 0);
118    HookMgrExecute(GetBootStageHookMgr(), INIT_POST_PERSIST_PARAM_LOAD, nullptr, nullptr);
119    // close switch for trace
120    WriteParam("persist.init.bootevent.enable", "false", &dataIndex, 0);
121    HookMgrExecute(GetBootStageHookMgr(), INIT_POST_PERSIST_PARAM_LOAD, nullptr, nullptr);
122}
123
124HWTEST_F(TraceUnitTest, TraceTest_002, TestSize.Level1)
125{
126    CreateInitTraceConfig(1);
127    // start trace
128    PluginExecCmdByName("init_trace", "start");
129    // for run 1 s
130    sleep(1);
131    // stop trace
132    PluginExecCmdByName("init_trace", "stop");
133}
134
135HWTEST_F(TraceUnitTest, TraceTest_003, TestSize.Level1)
136{
137    CreateInitTraceConfig(0);
138    // start trace
139    PluginExecCmdByName("init_trace", "start");
140    // for run 1 s
141    sleep(1);
142    // stop trace
143    PluginExecCmdByName("init_trace", "stop");
144}
145
146HWTEST_F(TraceUnitTest, TraceTest_004, TestSize.Level1)
147{
148    std::string cmdArgs = "/system/etc/init_trace.cfg  ";
149    cmdArgs += STARTUP_INIT_UT_PATH"/system/etc/init_trace.cfg";
150    int cmdIndex = 0;
151    (void)GetMatchCmd("copy ", &cmdIndex);
152    DoCmdByIndex(cmdIndex, cmdArgs.c_str(), nullptr);
153
154    // start trace
155    PluginExecCmdByName("init_trace", "start");
156    // for run 1 s
157    sleep(1);
158    // stop trace
159    PluginExecCmdByName("init_trace", "stop");
160}
161
162HWTEST_F(TraceUnitTest, TraceTest_005, TestSize.Level1)
163{
164    // start trace
165    PluginExecCmdByName("init_trace", "start");
166    // for run 1 s
167    sleep(1);
168    // interrupt trace
169    PluginExecCmdByName("init_trace", "1");
170}
171
172HWTEST_F(TraceUnitTest, TraceTest_006, TestSize.Level1)
173{
174    std::string cmdArgs = "/bin/test    ";
175    cmdArgs += STARTUP_INIT_UT_PATH"/bin/test";
176    int cmdIndex = 0;
177    (void)GetMatchCmd("copy ", &cmdIndex);
178    DoCmdByIndex(cmdIndex, cmdArgs.c_str(), nullptr);
179
180    // start trace
181    PluginExecCmdByName("init_trace", "start");
182    // for run 1 s
183    sleep(1);
184    // stop trace
185    PluginExecCmdByName("init_trace", "stop");
186}
187
188HWTEST_F(TraceUnitTest, TraceTest_007, TestSize.Level1)
189{
190    CreateInitTraceConfig(0);
191    // other case
192    PluginExecCmdByName("init_trace", "other");
193}
194} // namespace init_ut
195