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