1 /*
2 * Copyright (C) 2022-2025 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 <vector>
18 #include <string>
19 #include <sys/stat.h>
20
21 #include "common_define.h"
22 #include "common_utils.h"
23 #include "hitrace_meter.h"
24 #include "hitrace_meter_test_utils.h"
25 #include "hitrace/tracechain.h"
26 #include "hitracechain_ffi.h"
27 #include "hitracemeter_ffi.h"
28
29 using namespace testing::ext;
30 using namespace OHOS::HiviewDFX::Hitrace;
31
32 namespace OHOS {
33 namespace HiviewDFX {
34 namespace HitraceTest {
35 #ifdef LOG_DOMAIN
36 #undef LOG_DOMAIN
37 #define LOG_DOMAIN 0xD002D33
38 #endif
39 #ifdef LOG_TAG
40 #undef LOG_TAG
41 #define LOG_TAG "HitraceTest"
42 #endif
43
44 constexpr uint64_t TAG = HITRACE_TAG_APP;
45 static char g_pid[6];
46
47 class HitraceMeterFfiTest : public testing::Test {
48 public:
49 static void SetUpTestCase(void);
50 static void TearDownTestCase(void);
51 void SetUp(void);
52 void TearDown(void);
53 };
54
SetUpTestCase(void)55 void HitraceMeterFfiTest::SetUpTestCase(void)
56 {
57 std::string pidStr = std::to_string(getprocpid());
58 int ret = strcpy_s(g_pid, sizeof(g_pid), pidStr.c_str());
59 if (ret != 0) {
60 GTEST_LOG_(ERROR) << "pid[" << pidStr << "] strcpy_s fail ret: " << std::to_string(ret);
61 FAIL();
62 return;
63 }
64 ASSERT_TRUE(Init(g_pid));
65 ASSERT_TRUE(CleanFtrace());
66 }
67
TearDownTestCase(void)68 void HitraceMeterFfiTest::TearDownTestCase(void)
69 {
70 SetPropertyInner(TRACE_TAG_ENABLE_FLAGS, "0");
71 SetFtrace(TRACING_ON_NODE, false);
72 CleanTrace();
73 }
74
SetUp(void)75 void HitraceMeterFfiTest::SetUp(void)
76 {
77 ASSERT_TRUE(CleanTrace());
78 ASSERT_TRUE(SetFtrace(TRACING_ON_NODE, true)) << "SetUp: Setting tracing_on failed.";
79 std::string value = std::to_string(TAG);
80 ASSERT_TRUE(SetPropertyInner(TRACE_TAG_ENABLE_FLAGS, value)) << "SetUp: Setting enableflags failed.";
81 GTEST_LOG_(INFO) << "current tag is " << GetPropertyInner(TRACE_TAG_ENABLE_FLAGS, "0");
82 ASSERT_TRUE(GetPropertyInner(TRACE_TAG_ENABLE_FLAGS, "-123") == value);
83 UpdateTraceLabel();
84 }
85
TearDown(void)86 void HitraceMeterFfiTest::TearDown(void)
87 {
88 ASSERT_TRUE(SetPropertyInner(TRACE_TAG_ENABLE_FLAGS, "0")) << "TearDown: Setting enableflags failed.";
89 ASSERT_TRUE(SetFtrace(TRACING_ON_NODE, false)) << "TearDown: Setting tracing_on failed.";
90 ASSERT_TRUE(CleanTrace()) << "TearDown: Cleaning trace failed.";
91 }
92
93
94 /**
95 * @tc.name: HitraceFfiTest01
96 * @tc.desc: Testing FfiOHOSHiTraceStartAsyncTrace and FfiOHOSHiTraceFinishAsyncTrace
97 * @tc.type: FUNC
98 */
99 HWTEST_F(HitraceMeterFfiTest, HitraceFfiTest01, TestSize.Level1)
100 {
101 GTEST_LOG_(INFO) << "HitraceFfiTest01: start.";
102
103 const char* name = "HitraceFfiTest01";
104 int32_t taskId = 3;
105
106 FfiOHOSHiTraceStartAsyncTrace(name, taskId);
107 FfiOHOSHiTraceFinishAsyncTrace(name, taskId);
108
109 std::vector<std::string> list = ReadTrace();
110
111 char record[RECORD_SIZE_MAX + 1] = {0};
112 TraceInfo traceInfo = {'S', HITRACE_LEVEL_INFO, TAG, taskId, name, "", ""};
113 bool isStartSuc = GetTraceResult(traceInfo, list, record);
114 ASSERT_TRUE(isStartSuc) << "Hitrace can't find \"" << record << "\" from trace.";
115 traceInfo.type = 'F';
116 bool isFinishSuc = GetTraceResult(traceInfo, list, record);
117 ASSERT_TRUE(isFinishSuc) << "Hitrace can't find \"" << record << "\" from trace.";
118
119 GTEST_LOG_(INFO) << "HitraceFfiTest01: end.";
120 }
121
122
123 /**
124 * @tc.name: HitraceFfiTest02
125 * @tc.desc: Testing FfiOHOSHiTraceStartAsyncTrace and FfiOHOSHiTraceFinishAsyncTrace name is nullptr
126 * @tc.type: FUNC
127 */
128 HWTEST_F(HitraceMeterFfiTest, HitraceFfiTest02, TestSize.Level1)
129 {
130 GTEST_LOG_(INFO) << "HitraceFfiTest02: start.";
131
132 const char* name = nullptr;
133 int32_t taskId = 3;
134
135 FfiOHOSHiTraceStartAsyncTrace(name, taskId);
136 FfiOHOSHiTraceFinishAsyncTrace(name, taskId);
137
138 std::vector<std::string> list = ReadTrace();
139 char record[RECORD_SIZE_MAX + 1] = {0};
140 TraceInfo traceInfo = {'S', HITRACE_LEVEL_INFO, TAG, taskId, name, "", ""};
141 bool isStartSuc = GetTraceResult(traceInfo, list, record);
142 ASSERT_TRUE(isStartSuc) << "Hitrace can't find \"" << record << "\" from trace.";
143 traceInfo.type = 'F';
144 bool isFinishSuc = GetTraceResult(traceInfo, list, record);
145 ASSERT_TRUE(isFinishSuc) << "Hitrace can't find \"" << record << "\" from trace.";
146
147 GTEST_LOG_(INFO) << "HitraceFfiTest02: end.";
148 }
149
150 /**
151 * @tc.name: HitraceFfiTest03
152 * @tc.desc: Testing MiddleTraceDebug interface FfiOHOSHiTraceCountTrace
153 * @tc.type: FUNC
154 */
155 HWTEST_F(HitraceMeterFfiTest, HitraceFfiTest03, TestSize.Level1)
156 {
157 GTEST_LOG_(INFO) << "HitraceFfiTest03: start.";
158
159 const char* name = nullptr;
160 int64_t count = 5;
161
162 FfiOHOSHiTraceCountTrace(name, count);
163
164 std::vector<std::string> list = ReadTrace();
165 char record[RECORD_SIZE_MAX + 1] = {0};
166 TraceInfo traceInfo = {'C', HITRACE_LEVEL_INFO, TAG, count, name, "", ""};
167 bool isSuccess = GetTraceResult(traceInfo, list, record);
168 ASSERT_TRUE(isSuccess) << "Hitrace can't find \"" << record << "\" from trace.";
169
170 GTEST_LOG_(INFO) << "HitraceFfiTest03: end.";
171 }
172
173 /**
174 * @tc.name: HitraceFfiTest04
175 * @tc.desc: Testing MiddleTraceDebug interface FfiOHOSHiTraceChainBegin
176 * @tc.type: FUNC
177 */
178 HWTEST_F(HitraceMeterFfiTest, HitraceFfiTest04, TestSize.Level1)
179 {
180 GTEST_LOG_(INFO) << "HitraceFfiTest04: start.";
181
182 const char* name = nullptr;
183
184 CHiTraceId hiTraceId = FfiOHOSHiTraceChainBegin(name, HiTraceFlag::HITRACE_FLAG_DEFAULT);
185
186 OHOS::HiviewDFX::HiTraceId id = Parse(hiTraceId);
187
188 CHiTraceId traceId = Parse(id);
189
190 ASSERT_EQ(hiTraceId.chainId, traceId.chainId);
191 ASSERT_EQ(hiTraceId.spanId, traceId.spanId);
192 ASSERT_EQ(hiTraceId.parentSpanId, traceId.parentSpanId);
193 FfiOHOSHiTraceChainEnd(hiTraceId);
194
195
196 GTEST_LOG_(INFO) << "HitraceFfiTest04: end.";
197 }
198
199 /**
200 * @tc.name: HitraceFfiTest05
201 * @tc.desc: Testing FfiOHOSHiTraceStartAsyncTrace and FfiOHOSHiTraceFinishAsyncTrace TraceInfo LEVEL COMMERCIAL
202 * @tc.type: FUNC
203 */
204 HWTEST_F(HitraceMeterFfiTest, HitraceFfiTest05, TestSize.Level1)
205 {
206 GTEST_LOG_(INFO) << "HitraceFfiTest05: start.";
207
208 const char* name = "HitraceFfiTest05";
209 int32_t taskId = 3;
210
211 FfiOHOSHiTraceStartAsyncTrace(name, taskId);
212 FfiOHOSHiTraceFinishAsyncTrace(name, taskId);
213
214 std::vector<std::string> list = ReadTrace();
215
216 char record[RECORD_SIZE_MAX + 1] = {0};
217 TraceInfo traceInfo = {'S', HITRACE_LEVEL_COMMERCIAL, TAG, taskId, name, "", ""};
218 bool isCommercialStartSuc = GetTraceResult(traceInfo, list, record);
219 ASSERT_FALSE(isCommercialStartSuc) << "Hitrace unexpectedly found \"" << record << "\" from trace.";
220 traceInfo.type = 'F';
221 bool isCommercialFinishSuc = GetTraceResult(traceInfo, list, record);
222 ASSERT_FALSE(isCommercialFinishSuc) << "Hitrace can't find \"" << record << "\" from trace.";
223
224 ASSERT_TRUE(CleanTrace());
225 }
226
227 /**
228 * @tc.name: HitraceFfiTest06
229 * @tc.desc: Testing FfiOHOSHiTraceStartAsyncTrace and FfiOHOSHiTraceFinishAsyncTrace TraceInfo LEVEL INFO
230 * @tc.type: FUNC
231 */
232 HWTEST_F(HitraceMeterFfiTest, HitraceFfiTest06, TestSize.Level1)
233 {
234 GTEST_LOG_(INFO) << "HitraceFfiTest06: start.";
235
236 const char* name = "HitraceFfiTest06";
237 int32_t taskId = 3;
238
239 CHiTraceId hiTraceId = FfiOHOSHiTraceChainBegin(name, HiTraceFlag::HITRACE_FLAG_DEFAULT);
240 FfiOHOSHiTraceStartAsyncTrace(name, taskId);
241 FfiOHOSHiTraceFinishAsyncTrace(name, taskId);
242 OHOS::HiviewDFX::HiTraceId id = Parse(hiTraceId);
243 FfiOHOSHiTraceChainEnd(hiTraceId);
244
245 std::vector<std::string> list = ReadTrace();
246 char record[RECORD_SIZE_MAX + 1] = {0};
247 TraceInfo traceInfo = {'S', HITRACE_LEVEL_INFO, TAG, taskId, name, "", ""};
248 traceInfo.hiTraceId = &id;
249 bool isInfoStartSuc = GetTraceResult(traceInfo, list, record);
250 ASSERT_TRUE(isInfoStartSuc) << "Hitrace can't find \"" << record << "\" from trace.";
251 traceInfo.type = 'F';
252 bool isInfoFinishSuc = GetTraceResult(traceInfo, list, record);
253 ASSERT_TRUE(isInfoFinishSuc) << "Hitrace can't find \"" << record << "\" from trace.";
254
255 GTEST_LOG_(INFO) << "HitraceFfiTest06: end.";
256 }
257 }
258 }
259 }
260