1 /*
2 * Copyright (c) 2024 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 <gtest/gtest.h>
17 #include <iostream>
18 #include <string>
19 #include <unistd.h>
20 #include <vector>
21
22 #include "common_define.h"
23 #include "common_utils.h"
24 #include "hitrace_event_listener.h"
25 #include "hisysevent_manager.h"
26
27 using namespace OHOS::HiviewDFX;
28 using namespace testing::ext;
29 using namespace std;
30
31 namespace OHOS {
32 namespace HiviewDFX {
33 static std::string g_traceRootPath;
34 const int TRACING_ON_CLOSED = 2003;
35
36 class HitraceEventTest : public testing::Test {
37 public:
38 static void SetUpTestCase(void);
TearDownTestCase(void)39 static void TearDownTestCase(void) {}
SetUp()40 void SetUp() {}
TearDown()41 void TearDown() {}
42 };
43
SetUpTestCase()44 void HitraceEventTest::SetUpTestCase()
45 {
46 if (access((DEBUGFS_TRACING_DIR + TRACE_MARKER_NODE).c_str(), F_OK) != -1) {
47 g_traceRootPath = DEBUGFS_TRACING_DIR;
48 } else if (access((TRACEFS_DIR + TRACE_MARKER_NODE).c_str(), F_OK) != -1) {
49 g_traceRootPath = TRACEFS_DIR;
50 } else {
51 GTEST_LOG_(INFO) << "Error: Finding trace folder failed";
52 }
53 }
54
RunCmd(const string & cmdstr)55 bool RunCmd(const string& cmdstr)
56 {
57 if (cmdstr.empty()) {
58 return false;
59 }
60 FILE *fp = popen(cmdstr.c_str(), "r");
61 if (fp == nullptr) {
62 return false;
63 }
64 char res[4096] = { '\0' };
65 while (fgets(res, sizeof(res), fp) != nullptr) {
66 std::cout << res;
67 }
68 pclose(fp);
69 return true;
70 }
71
72 /**
73 * @tc.name: HitraceEventTest001
74 * @tc.desc: test Report DumpTextTrace HitraceEvent in HandleRecordingLongFinish with tracing_on closed
75 * @tc.type: FUNC
76 */
77 HWTEST_F(HitraceEventTest, HitraceEventTest001, TestSize.Level2)
78 {
79 ASSERT_TRUE(RunCmd("hitrace --stop_bgsrv >> /data/local/tmp/test.txt"));
80 TraceSysEventParams traceEventParams;
81 traceEventParams.caller = "CMD";
82 traceEventParams.opt = "DumpTextTrace";
83 traceEventParams.errorCode = TRACING_ON_CLOSED;
84 traceEventParams.errorMessage = "Warning: tracing on is closed, no trace can be read.";
85 std::shared_ptr<HitraceEventListener> traceListener = std::make_shared<HitraceEventListener>();
86 ListenerRule tagRule("PROFILER", "HITRACE_USAGE", RuleType::WHOLE_WORD);
87 std::vector<ListenerRule> sysRules;
88 sysRules.push_back(tagRule);
89 HiSysEventManager::AddListener(traceListener, sysRules);
90 traceListener->SetEvent(traceEventParams);
91 ASSERT_TRUE(RunCmd("hitrace --trace_finish -o /data/local/tmp/test.ftrace"));
92 ASSERT_TRUE(traceListener->CheckKeywordInReasons());
93 HiSysEventManager::RemoveListener(traceListener);
94 ASSERT_TRUE(RunCmd("hitrace --start_bgsrv >> /data/local/tmp/test.txt"));
95 }
96
97 /**
98 * @tc.name: HitraceEventTest002
99 * @tc.desc: test Report DumpTextTrace HitraceEvent in HandleRecordingLongFinish with tracing_on opened
100 * @tc.type: FUNC
101 */
102 HWTEST_F(HitraceEventTest, HitraceEventTest002, TestSize.Level2)
103 {
104 ASSERT_TRUE(RunCmd("hitrace --trace_begin app >> /data/local/tmp/test.txt"));
105 TraceSysEventParams traceEventParams;
106 traceEventParams.caller = "CMD";
107 traceEventParams.opt = "DumpTextTrace";
108 std::shared_ptr<HitraceEventListener> traceListener = std::make_shared<HitraceEventListener>();
109 ListenerRule tagRule("PROFILER", "HITRACE_USAGE", RuleType::WHOLE_WORD);
110 std::vector<ListenerRule> sysRules;
111 sysRules.push_back(tagRule);
112 HiSysEventManager::AddListener(traceListener, sysRules);
113 traceListener->SetEvent(traceEventParams);
114 ASSERT_TRUE(RunCmd("hitrace --trace_finish -o /data/local/tmp/test.ftrace"));
115 ASSERT_TRUE(traceListener->CheckKeywordInReasons());
116 HiSysEventManager::RemoveListener(traceListener);
117 }
118
119 /**
120 * @tc.name: HitraceEventTest003
121 * @tc.desc: test Report DumpTextTrace HitraceEvent in HandleRecordingShortText
122 * @tc.type: FUNC
123 */
124 HWTEST_F(HitraceEventTest, HitraceEventTest003, TestSize.Level2)
125 {
126 TraceSysEventParams traceEventParams;
127 traceEventParams.caller = "CMD";
128 traceEventParams.opt = "DumpTextTrace";
129 std::shared_ptr<HitraceEventListener> traceListener = std::make_shared<HitraceEventListener>();
130 ListenerRule tagRule("PROFILER", "HITRACE_USAGE", RuleType::WHOLE_WORD);
131 std::vector<ListenerRule> sysRules;
132 sysRules.push_back(tagRule);
133 HiSysEventManager::AddListener(traceListener, sysRules);
134 traceListener->SetEvent(traceEventParams);
135 ASSERT_TRUE(RunCmd("hitrace -t 5 app -o /data/local/tmp/test.ftrace"));
136 ASSERT_TRUE(traceListener->CheckKeywordInReasons());
137 HiSysEventManager::RemoveListener(traceListener);
138 }
139
140 /**
141 * @tc.name: HitraceEventTest004
142 * @tc.desc: test Report ShowListCategory HitraceEvent
143 * @tc.type: FUNC
144 */
145 HWTEST_F(HitraceEventTest, HitraceEventTest004, TestSize.Level2)
146 {
147 TraceSysEventParams traceEventParams;
148 traceEventParams.caller = "CMD";
149 traceEventParams.opt = "ShowListCategory";
150 std::shared_ptr<HitraceEventListener> traceListener = std::make_shared<HitraceEventListener>();
151 ListenerRule tagRule("PROFILER", "HITRACE_USAGE", RuleType::WHOLE_WORD);
152 std::vector<ListenerRule> sysRules;
153 sysRules.push_back(tagRule);
154 HiSysEventManager::AddListener(traceListener, sysRules);
155 traceListener->SetEvent(traceEventParams);
156 ASSERT_TRUE(RunCmd("hitrace -l >> /data/local/tmp/showlist.txt"));
157 ASSERT_TRUE(traceListener->CheckKeywordInReasons());
158 HiSysEventManager::RemoveListener(traceListener);
159 }
160
161 /**
162 * @tc.name: HitraceEventTest005
163 * @tc.desc: test Report ShowHelp HitraceEvent
164 * @tc.type: FUNC
165 */
166 HWTEST_F(HitraceEventTest, HitraceEventTest005, TestSize.Level2)
167 {
168 TraceSysEventParams traceEventParams;
169 traceEventParams.caller = "CMD";
170 traceEventParams.opt = "ShowHelp";
171 std::shared_ptr<HitraceEventListener> traceListener = std::make_shared<HitraceEventListener>();
172 ListenerRule tagRule("PROFILER", "HITRACE_USAGE", RuleType::WHOLE_WORD);
173 std::vector<ListenerRule> sysRules;
174 sysRules.push_back(tagRule);
175 HiSysEventManager::AddListener(traceListener, sysRules);
176 traceListener->SetEvent(traceEventParams);
177 ASSERT_TRUE(RunCmd("hitrace --help >> /data/local/tmp/showhelp.txt"));
178 ASSERT_TRUE(traceListener->CheckKeywordInReasons());
179 HiSysEventManager::RemoveListener(traceListener);
180 }
181 } // namespace HiviewDFX
182 } // namespace OHOS
183