• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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