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