1 /*
2 * Copyright (c) 2021 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 "hitrace/hitracechain.h"
17
18 #include <cstdint>
19 #include <gtest/gtest.h>
20
21 #include "gtest/gtest-message.h"
22 #include "gtest/gtest-test-part.h"
23 #include "gtest/gtest_pred_impl.h"
24 #include "gtest/hwext/gtest-tag.h"
25 #include "hitrace/hitracechainc.h"
26 #include "hitrace/hitraceid.h"
27
28 namespace OHOS {
29 namespace HiviewDFX {
30 using namespace testing::ext;
31
32 class HiTraceChainCppTest : public testing::Test {
33 public:
34 static void SetUpTestCase();
35 static void TearDownTestCase();
36 void SetUp();
37 void TearDown();
38 };
39
SetUpTestCase()40 void HiTraceChainCppTest::SetUpTestCase()
41 {}
42
TearDownTestCase()43 void HiTraceChainCppTest::TearDownTestCase()
44 {}
45
SetUp()46 void HiTraceChainCppTest::SetUp()
47 {
48 HiTraceChain::ClearId();
49 }
50
TearDown()51 void HiTraceChainCppTest::TearDown()
52 {}
53
54 /**
55 * @tc.name: Dfx_HiTraceChainCppTest_IdTest_001
56 * @tc.desc: Get, set and clear trace id
57 * @tc.type: FUNC
58 * @tc.require: AR000CQV9U
59 */
60 HWTEST_F(HiTraceChainCppTest, IdTest_001, TestSize.Level1)
61 {
62 /**
63 * @tc.steps: step1. get and validate trace id.
64 * @tc.expected: step1. trace id is invalid.
65 * @tc.steps: step2. construct trace id with chain id, span id, parent span id
66 * and flags and set it into context, then get and validate it.
67 * @tc.expected: step2. trace id is valid with same chain id, span id, parent
68 * span id and flags.
69 * @tc.steps: step3. construct invalid trace id and set into context, then get
70 * and validate it.
71 * @tc.expected: step3. trace id is the same with step2.
72 * @tc.steps: step4. clear trace id, then get and validate it.
73 * @tc.expected: step4. trace id is invalid.
74 */
75 HiTraceId initId = HiTraceChain::GetId();
76 EXPECT_EQ(0, initId.IsValid());
77 /* set thread id */
78 constexpr uint64_t CHAIN_ID = 0xABCDEF;
79 constexpr uint64_t SPAN_ID = 0x12345;
80 constexpr uint64_t PARENT_SPAN_ID = 0x67890;
81
82 initId.SetChainId(CHAIN_ID);
83 initId.EnableFlag(HITRACE_FLAG_INCLUDE_ASYNC);
84 initId.EnableFlag(HITRACE_FLAG_DONOT_CREATE_SPAN);
85 initId.SetSpanId(SPAN_ID);
86 initId.SetParentSpanId(PARENT_SPAN_ID);
87
88 EXPECT_EQ(1, initId.IsValid());
89 EXPECT_EQ(CHAIN_ID, initId.GetChainId());
90 EXPECT_EQ(HITRACE_FLAG_INCLUDE_ASYNC | HITRACE_FLAG_DONOT_CREATE_SPAN, initId.GetFlags());
91 EXPECT_EQ(SPAN_ID, initId.GetSpanId());
92 EXPECT_EQ(PARENT_SPAN_ID, initId.GetParentSpanId());
93
94 HiTraceChain::SetId(initId);
95
96 HiTraceId getId = HiTraceChain::GetId();
97 EXPECT_EQ(1, getId.IsValid());
98 EXPECT_EQ(CHAIN_ID, getId.GetChainId());
99 EXPECT_EQ(HITRACE_FLAG_INCLUDE_ASYNC | HITRACE_FLAG_DONOT_CREATE_SPAN, getId.GetFlags());
100 EXPECT_EQ(SPAN_ID, getId.GetSpanId());
101 EXPECT_EQ(PARENT_SPAN_ID, getId.GetParentSpanId());
102
103 HiTraceId invalidId;
104 HiTraceChain::SetId(invalidId);
105
106 getId = HiTraceChain::GetId();
107 EXPECT_EQ(1, getId.IsValid());
108 EXPECT_EQ(CHAIN_ID, getId.GetChainId());
109 EXPECT_EQ(HITRACE_FLAG_INCLUDE_ASYNC | HITRACE_FLAG_DONOT_CREATE_SPAN, getId.GetFlags());
110 EXPECT_EQ(SPAN_ID, getId.GetSpanId());
111 EXPECT_EQ(PARENT_SPAN_ID, getId.GetParentSpanId());
112
113 HiTraceChain::ClearId();
114 HiTraceId clearId = HiTraceChain::GetId();
115 EXPECT_EQ(0, clearId.IsValid());
116 }
117
118 /**
119 * @tc.name: Dfx_HiTraceChainCppTest_IntfTest_001
120 * @tc.desc: Interconversion between trace id and bytes array.
121 * @tc.type: FUNC
122 * @tc.require: AR000CQV9U
123 */
124 HWTEST_F(HiTraceChainCppTest, IntfTest_001, TestSize.Level1)
125 {
126 /**
127 * @tc.steps: step1. get trace id and validate it.
128 * @tc.expected: step1. trace id is invalid.
129 * @tc.steps: step2. construct trace id and validate it.
130 * @tc.expected: step2. trace id is valid.
131 * @tc.steps: step3. convert trace id to bytes array.
132 * @tc.expected: step3. convert success when array size >= id length.
133 * @tc.steps: step4. convert bytes array to trace id.
134 * @tc.expected: step4. convert success only when array size == id length.
135 * @tc.steps: step5. convert invalid id to bytes array.
136 * @tc.expected: step5. convert fail.
137 * @tc.steps: step6. convert invalid bytes array to id.
138 * @tc.expected: step6. convert fail.
139 */
140 HiTraceId initId = HiTraceChain::GetId();
141 EXPECT_EQ(0, initId.IsValid());
142 constexpr uint64_t CHAIN_ID = 0xABCDEF;
143 constexpr uint64_t SPAN_ID = 0x12345;
144 constexpr uint64_t PARENT_SPAN_ID = 0x67890;
145 constexpr int FLAGS = HITRACE_FLAG_INCLUDE_ASYNC | HITRACE_FLAG_DONOT_CREATE_SPAN;
146
147 initId.SetChainId(CHAIN_ID);
148 initId.SetFlags(FLAGS);
149 initId.SetSpanId(SPAN_ID);
150 initId.SetParentSpanId(PARENT_SPAN_ID);
151 EXPECT_EQ(1, initId.IsValid());
152 constexpr int ID_LEN = sizeof(HiTraceIdStruct);
153
154 uint8_t bytes[ID_LEN + 1];
155 int len = initId.ToBytes(bytes, ID_LEN - 1);
156 EXPECT_EQ(0, len);
157 len = initId.ToBytes(bytes, ID_LEN + 1);
158 EXPECT_EQ(ID_LEN, len);
159 len = initId.ToBytes(bytes, ID_LEN);
160 EXPECT_EQ(ID_LEN, len);
161
162 /* bytes to id */
163 HiTraceId bytesToId = HiTraceId(bytes, ID_LEN - 1);
164 EXPECT_EQ(0, bytesToId.IsValid());
165 bytesToId = HiTraceId(bytes, ID_LEN + 1);
166 EXPECT_EQ(0, bytesToId.IsValid());
167 bytesToId = HiTraceId(bytes, ID_LEN);
168 EXPECT_EQ(1, bytesToId.IsValid());
169 EXPECT_EQ(CHAIN_ID, bytesToId.GetChainId());
170 EXPECT_EQ(HITRACE_FLAG_INCLUDE_ASYNC | HITRACE_FLAG_DONOT_CREATE_SPAN, bytesToId.GetFlags());
171 EXPECT_EQ(SPAN_ID, bytesToId.GetSpanId());
172 EXPECT_EQ(PARENT_SPAN_ID, bytesToId.GetParentSpanId());
173
174 /* set invalid id */
175 HiTraceId invalidId;
176 EXPECT_EQ(0, invalidId.ToBytes(bytes, ID_LEN));
177 invalidId = HiTraceId(nullptr, ID_LEN);
178 EXPECT_EQ(0, invalidId.IsValid());
179 }
180
181 /**
182 * @tc.name: Dfx_HiTraceChainCppTest_IntfTest_002
183 * @tc.desc: Start and stop trace.
184 * @tc.type: FUNC
185 * @tc.require: AR000CQV9U
186 */
187 HWTEST_F(HiTraceChainCppTest, IntfTest_002, TestSize.Level1)
188 {
189 /**
190 * @tc.steps: step1. start trace with flags, get trace id and validit it.
191 * @tc.expected: step1. trace id and flags is valid.
192 * @tc.steps: step2. stop trace, get trace id and validit it.
193 * @tc.expected: step2. trace id is invalid.
194 */
195 HiTraceId beginId = HiTraceChain::Begin("test", HITRACE_FLAG_INCLUDE_ASYNC | HITRACE_FLAG_NO_BE_INFO);
196 EXPECT_EQ(1, beginId.IsValid());
197 EXPECT_EQ(1, beginId.IsFlagEnabled(HITRACE_FLAG_INCLUDE_ASYNC));
198 EXPECT_EQ(1, beginId.IsFlagEnabled(HITRACE_FLAG_NO_BE_INFO));
199
200 HiTraceChain::End(beginId);
201
202 HiTraceId endId = HiTraceChain::GetId();
203 EXPECT_EQ(0, endId.IsValid());
204 }
205
206 /**
207 * @tc.name: Dfx_HiTraceChainCppTest_IntfTest_003
208 * @tc.desc: Start and stop trace with reentered.
209 * @tc.type: FUNC
210 * @tc.require: AR000CQV9U
211 */
212 HWTEST_F(HiTraceChainCppTest, IntfTest_003, TestSize.Level1)
213 {
214 /**
215 * @tc.steps: step1. start trace twice and get 2nd trace id.
216 * @tc.expected: step1. 2nd trace is invalid.
217 * @tc.steps: step2. get trace id and check.
218 * @tc.expected: step2. trace id is valid and same with 1st id.
219 * @tc.steps: step3. set chain id with wrong id and get trace id.
220 * @tc.expected: step3. trace id is valid and same with 1st id.
221 * @tc.steps: step4. stop trace twice and get trace id.
222 * @tc.expected: step4. trace id is invalid.
223 */
224 /* begin */
225 HiTraceId beginId = HiTraceChain::Begin("begin", HITRACE_FLAG_INCLUDE_ASYNC);
226 /* reenter begin */
227 HiTraceId reBeginId = HiTraceChain::Begin("reenter begin", HITRACE_FLAG_TP_INFO);
228 EXPECT_EQ(0, reBeginId.IsValid());
229 EXPECT_NE(reBeginId.GetChainId(), beginId.GetChainId());
230 EXPECT_EQ(0, reBeginId.IsFlagEnabled(HITRACE_FLAG_INCLUDE_ASYNC));
231 EXPECT_EQ(0, reBeginId.IsFlagEnabled(HITRACE_FLAG_TP_INFO));
232
233 /* reenter end */
234 HiTraceChain::End(reBeginId);
235
236 HiTraceId endId = HiTraceChain::GetId();
237 EXPECT_EQ(1, endId.IsValid());
238 EXPECT_EQ(endId.GetChainId(), beginId.GetChainId());
239 EXPECT_EQ(1, endId.IsFlagEnabled(HITRACE_FLAG_INCLUDE_ASYNC));
240 EXPECT_EQ(0, endId.IsFlagEnabled(HITRACE_FLAG_TP_INFO));
241
242 /* end with wrong chainId */
243 HiTraceId wrongBeginId = beginId;
244 wrongBeginId.SetChainId(beginId.GetChainId() + 1);
245 HiTraceChain::End(wrongBeginId);
246
247 HiTraceId wrongEndId = HiTraceChain::GetId();
248 EXPECT_EQ(1, wrongEndId.IsValid());
249 EXPECT_EQ(wrongEndId.GetChainId(), beginId.GetChainId());
250 EXPECT_EQ(1, wrongEndId.IsFlagEnabled(HITRACE_FLAG_INCLUDE_ASYNC));
251
252 /* end */
253 HiTraceChain::End(beginId);
254
255 HiTraceId reEndId = HiTraceChain::GetId();
256 EXPECT_EQ(0, reEndId.IsValid());
257
258 /* end with invalid thread id */
259 HiTraceChain::End(beginId);
260
261 HiTraceId endInvalidId = HiTraceChain::GetId();
262 EXPECT_EQ(0, endInvalidId.IsValid());
263 }
264
265 /**
266 * @tc.name: Dfx_HiTraceChainCppTest_SpanTest_001
267 * @tc.desc: Create child and grand child span.
268 * @tc.type: FUNC
269 * @tc.require: AR000CQV9U
270 */
271 HWTEST_F(HiTraceChainCppTest, SpanTest_001, TestSize.Level1)
272 {
273 /**
274 * @tc.steps: step1. start trace without HITRACE_FLAG_DONOT_CREATE_SPAN,
275 * get and check flags.
276 * @tc.expected: step1. flags is same with set and span id is 0.
277 * @tc.steps: step2. create child id.
278 * @tc.expected: step2. child id has same span id with parent.
279 * @tc.steps: step3. set child id into context.
280 * @tc.steps: step4. create grand child id.
281 * @tc.expected: step4. grand child id has same span id with parent and child.
282 */
283 /* begin with span flag */
284 HiTraceId id = HiTraceChain::Begin("test", 0);
285 EXPECT_EQ(0, id.GetFlags());
286 EXPECT_EQ(0UL, id.GetSpanId());
287 EXPECT_EQ(0UL, id.GetParentSpanId());
288
289 /* create child span */
290 HiTraceId childId = HiTraceChain::CreateSpan();
291 EXPECT_EQ(1, childId.IsValid());
292 EXPECT_EQ(childId.GetFlags(), id.GetFlags());
293 EXPECT_EQ(childId.GetChainId(), id.GetChainId());
294 EXPECT_EQ(childId.GetParentSpanId(), id.GetSpanId());
295
296 /* set child id to thread id */
297 HiTraceChain::SetId(childId);
298
299 /* continue to create child span */
300 HiTraceId grandChildId = HiTraceChain::CreateSpan();
301 EXPECT_EQ(1, grandChildId.IsValid());
302 EXPECT_EQ(grandChildId.GetFlags(), id.GetFlags());
303 EXPECT_EQ(grandChildId.GetChainId(), id.GetChainId());
304 EXPECT_EQ(grandChildId.GetParentSpanId(), childId.GetSpanId());
305
306 /* end */
307 HiTraceChain::End(id);
308 }
309
310 /**
311 * @tc.name: Dfx_HiTraceChainCppTest_SpanTest_002
312 * @tc.desc: Start and stop trace with reentered.
313 * @tc.type: FUNC
314 * @tc.require: AR000CQV9U
315 */
316 HWTEST_F(HiTraceChainCppTest, SpanTest_002, TestSize.Level1)
317 {
318 /**
319 * @tc.steps: step1. start trace with HITRACE_FLAG_DONOT_CREATE_SPAN,
320 * get and check flags.
321 * @tc.expected: step1. HITRACE_FLAG_DONOT_CREATE_SPAN is enabled.
322 * @tc.steps: step2. create child id.
323 * @tc.expected: step2. child id is same with parent id.
324 */
325 /* begin with "donot create span" flag */
326 HiTraceId id = HiTraceChain::Begin("test", HITRACE_FLAG_DONOT_CREATE_SPAN);
327 EXPECT_EQ(1, id.IsFlagEnabled(HITRACE_FLAG_DONOT_CREATE_SPAN));
328
329 /* create child span */
330 HiTraceId childId = HiTraceChain::CreateSpan();
331 EXPECT_EQ(1, childId.IsValid());
332 EXPECT_EQ(childId.GetFlags(), id.GetFlags());
333 EXPECT_EQ(childId.GetChainId(), id.GetChainId());
334 EXPECT_EQ(childId.GetSpanId(), id.GetSpanId());
335 EXPECT_EQ(childId.GetParentSpanId(), id.GetParentSpanId());
336
337 /* end */
338 HiTraceChain::End(id);
339 }
340
341 /**
342 * @tc.name: Dfx_HiTraceChainCppTest_TracepointTest_001
343 * @tc.desc: Start trace with HITRACE_FLAG_TP_INFO flag.
344 * @tc.type: FUNC
345 * @tc.require: AR000CQVA3
346 */
347 HWTEST_F(HiTraceChainCppTest, TracepointTest_001, TestSize.Level1)
348 {
349 /**
350 * @tc.steps: step1. start trace with HITRACE_FLAG_TP_INFO,
351 * get and check flags.
352 * @tc.expected: step1. HITRACE_FLAG_TP_INFO is enabled.
353 * @tc.steps: step2. add trace point info with id and check logs.
354 * @tc.expected: step2. trace point can be found in logs.
355 * @tc.steps: step3. add trace point info with null and check logs.
356 * @tc.expected: step3. trace point cannot be found in logs.
357 */
358 /* begin with tp flag */
359 HiTraceId invalidId;
360 HiTraceId id = HiTraceChain::Begin("test tp flag", HITRACE_FLAG_TP_INFO);
361 EXPECT_EQ(1, id.IsFlagEnabled(HITRACE_FLAG_TP_INFO));
362 HiTraceChain::Tracepoint(HITRACE_TP_CS, id, "client send msg content %d", 12);
363 HiTraceChain::Tracepoint(HITRACE_TP_CS, invalidId, "client send msg content %d", 12);
364 HiTraceChain::End(id);
365 }
366
367 /**
368 * @tc.name: Dfx_HiTraceChainCppTest_TracepointTest_002
369 * @tc.desc: Start trace without HITRACE_FLAG_TP_INFO flag.
370 * @tc.type: FUNC
371 * @tc.require: AR000CQVA3
372 */
373 HWTEST_F(HiTraceChainCppTest, TracepointTest_002, TestSize.Level1)
374 {
375 /**
376 * @tc.steps: step1. start trace without HITRACE_FLAG_TP_INFO flag.
377 * get and check flags.
378 * @tc.expected: step1. HITRACE_FLAG_TP_INFO is not enabled.
379 * @tc.steps: step2. add trace point info with id and check logs.
380 * @tc.expected: step2. trace point cannot be found in logs.
381 */
382 /* begin with tp flag */
383 HiTraceId id = HiTraceChain::Begin("test no tp flag", HITRACE_FLAG_INCLUDE_ASYNC);
384 EXPECT_EQ(0, id.IsFlagEnabled(HITRACE_FLAG_TP_INFO));
385 HiTraceChain::Tracepoint(HITRACE_TP_CS, id, "client send msg content %d", 12);
386
387 HiTraceChain::End(id);
388 }
389
390 /**
391 * @tc.name: Dfx_HiTraceChainCppTest_TracepointTest_003
392 * @tc.desc: Start trace with HITRACE_FLAG_D2D_TP_INFO flag.
393 * @tc.type: FUNC
394 * @tc.require: AR000CQVA3
395 */
396 HWTEST_F(HiTraceChainCppTest, TracepointTest_003, TestSize.Level1)
397 {
398 /**
399 * @tc.steps: step1. start trace with HITRACE_FLAG_D2D_TP_INFO,
400 * get and check flags.
401 * @tc.expected: step1. HITRACE_FLAG_D2D_TP_INFO is enabled.
402 * @tc.steps: step2. add D2D trace point info with id and check logs.
403 * @tc.expected: step2. trace point can be found in logs.
404 * @tc.steps: step2. add D2D trace point info with null and check logs.
405 * @tc.expected: step2. trace point cannot be found in logs.
406 * @tc.steps: step3. add trace point info with id and check logs.
407 * @tc.expected: step3. trace point cannot be found in logs.
408 */
409 HiTraceId id = HiTraceChain::Begin("test D2D tp flag", HITRACE_FLAG_D2D_TP_INFO);
410 EXPECT_EQ(1, id.IsFlagEnabled(HITRACE_FLAG_D2D_TP_INFO));
411 HiTraceChain::Tracepoint(HITRACE_CM_DEVICE, HITRACE_TP_CS, id, "client send msg content %d", 12);
412 HiTraceChain::Tracepoint(HITRACE_CM_PROCESS, HITRACE_TP_CS, id, "cannot be found %d", 22);
413 HiTraceChain::Tracepoint(HITRACE_CM_THREAD, HITRACE_TP_CS, id, "cannot be found %d", 32);
414 HiTraceChain::Tracepoint(HITRACE_CM_DEFAULT, HITRACE_TP_CS, id, "cannot be found %d", 42);
415
416 HiTraceId invalidId;
417 HiTraceChain::Tracepoint(HITRACE_CM_DEVICE, HITRACE_TP_CS, invalidId, "cannot be found %d", 13);
418
419 HiTraceChain::Tracepoint(HITRACE_TP_CS, id, "cannot be found %d", 14);
420
421 HiTraceChain::End(id);
422 }
423
424 /**
425 * @tc.name: Dfx_HiTraceChainCppTest_TracepointTest_004
426 * @tc.desc: Start trace without HITRACE_FLAG_D2D_TP_INFO flag.
427 * @tc.type: FUNC
428 * @tc.require: AR000CQVA3
429 */
430 HWTEST_F(HiTraceChainCppTest, TracepointTest_004, TestSize.Level1)
431 {
432 /**
433 * @tc.steps: step1. start trace without HITRACE_FLAG_D2D_TP_INFO flag.
434 * get and check flags.
435 * @tc.expected: step1. HITRACE_FLAG_D2D_TP_INFO is not enabled.
436 * @tc.steps: step2. add D2D trace point info with id and check logs.
437 * @tc.expected: step2. trace point cannot be found in logs.
438 */
439 HiTraceId id = HiTraceChain::Begin("test no D2D tp flag", HITRACE_FLAG_INCLUDE_ASYNC);
440 EXPECT_EQ(0, id.IsFlagEnabled(HITRACE_FLAG_D2D_TP_INFO));
441 HiTraceChain::Tracepoint(HITRACE_CM_DEVICE, HITRACE_TP_CS, id, "cannot be found %d", 12);
442 HiTraceChain::Tracepoint(HITRACE_CM_PROCESS, HITRACE_TP_CS, id, "cannot be found %d", 22);
443 HiTraceChain::Tracepoint(HITRACE_CM_THREAD, HITRACE_TP_CS, id, "cannot be found %d", 32);
444 HiTraceChain::Tracepoint(HITRACE_CM_DEFAULT, HITRACE_TP_CS, id, "cannot be found %d", 42);
445
446 HiTraceChain::End(id);
447 }
448
449 /**
450 * @tc.name: Dfx_HiTraceChainCppTest_TracepointTest_005
451 * @tc.desc: Start trace with HITRACE_FLAG_D2D_TP_INFO and HITRACE_FLAG_TP_INFO flag.
452 * @tc.type: FUNC
453 * @tc.require: AR000CQVA3
454 */
455 HWTEST_F(HiTraceChainCppTest, TracepointTest_005, TestSize.Level1)
456 {
457 /**
458 * @tc.steps: step1. start trace with HITRACE_FLAG_D2D_TP_INFO | HITRACE_FLAG_TP_INFO,
459 * get and check flags.
460 * @tc.expected: step1. HITRACE_FLAG_D2D_TP_INFO is enabled.
461 * @tc.expected: step1. HITRACE_FLAG_TP_INFO is enabled.
462 * @tc.steps: step2. add D2D trace point info with id and check logs.
463 * @tc.expected: step2. trace point can be found in logs.
464 * @tc.steps: step3. add trace point info with id and check logs.
465 * @tc.expected: step3. trace point can be found in logs.
466 */
467 HiTraceId id = HiTraceChain::Begin("test D2D | TP tp flag", HITRACE_FLAG_D2D_TP_INFO | HITRACE_FLAG_TP_INFO);
468 EXPECT_EQ(1, id.IsFlagEnabled(HITRACE_FLAG_D2D_TP_INFO));
469 EXPECT_EQ(1, id.IsFlagEnabled(HITRACE_FLAG_TP_INFO));
470 HiTraceChain::Tracepoint(HITRACE_CM_DEVICE, HITRACE_TP_CS, id, "client send msg content %d", 12);
471 HiTraceChain::Tracepoint(HITRACE_CM_PROCESS, HITRACE_TP_CS, id, "client send msg content %d", 22);
472 HiTraceChain::Tracepoint(HITRACE_CM_THREAD, HITRACE_TP_CS, id, "client send msg content %d", 32);
473 HiTraceChain::Tracepoint(HITRACE_CM_DEFAULT, HITRACE_TP_CS, id, "client send msg content %d", 42);
474
475 HiTraceChain::Tracepoint(HITRACE_TP_CS, id, "client send msg content %d", 13);
476
477 HiTraceChain::End(id);
478 }
479
480 /**
481 * @tc.name: Dfx_HiTraceChainCppTest_TracepointTest_006
482 * @tc.desc: Start trace without HITRACE_FLAG_D2D_TP_INFO, but with HITRACE_FLAG_TP_INFO flag.
483 * @tc.type: FUNC
484 * @tc.require: AR000CQVA3
485 */
486 HWTEST_F(HiTraceChainCppTest, TracepointTest_006, TestSize.Level1)
487 {
488 /**
489 * @tc.steps: step1. start trace with HITRACE_FLAG_TP_INFO flag.
490 * get and check flags.
491 * @tc.expected: step1. HITRACE_FLAG_D2D_TP_INFO is not enabled.
492 * * @tc.expected: step1. HITRACE_FLAG_TP_INFO is enabled.
493 * @tc.steps: step2. add D2D trace point info with id and check logs.
494 * @tc.expected: step2. trace point can be found in logs.
495 * @tc.steps: step2. add trace point info with id and check logs.
496 * @tc.expected: step2. trace point can be found in logs.
497 */
498 HiTraceId id = HiTraceChain::Begin("test no D2D, but tp flag", HITRACE_FLAG_TP_INFO);
499 EXPECT_EQ(0, id.IsFlagEnabled(HITRACE_FLAG_D2D_TP_INFO));
500 EXPECT_EQ(1, id.IsFlagEnabled(HITRACE_FLAG_TP_INFO));
501 HiTraceChain::Tracepoint(HITRACE_CM_DEVICE, HITRACE_TP_CS, id, "client send msg content %d", 12);
502 HiTraceChain::Tracepoint(HITRACE_CM_PROCESS, HITRACE_TP_CS, id, "client send msg content %d", 22);
503 HiTraceChain::Tracepoint(HITRACE_CM_THREAD, HITRACE_TP_CS, id, "client send msg content %d", 32);
504 HiTraceChain::Tracepoint(HITRACE_CM_DEFAULT, HITRACE_TP_CS, id, "client send msg content %d", 42);
505
506 HiTraceChain::Tracepoint(HITRACE_TP_CS, id, "client send msg content %d", 13);
507
508 HiTraceChain::End(id);
509 }
510
511 /**
512 * @tc.name: Dfx_HiTraceChainCppTest_TracepointTest_007
513 * @tc.desc: Start trace without HITRACE_FLAG_D2D_TP_INFO, but with HITRACE_FLAG_TP_INFO flag.
514 * @tc.type: FUNC
515 * @tc.require: AR000CQVA3
516 */
517 HWTEST_F(HiTraceChainCppTest, TracepointTest_007, TestSize.Level1)
518 {
519 /**
520 * @tc.steps: step1. start trace with HITRACE_FLAG_TP_INFO flag.
521 * get and check flags.
522 * @tc.expected: step1. HITRACE_FLAG_D2D_TP_INFO is not enabled.
523 * * @tc.expected: step1. HITRACE_FLAG_TP_INFO is enabled.
524 * @tc.steps: step2. add D2D trace point info with id and check logs.
525 * @tc.expected: step2. trace point can be found in logs.
526 * @tc.steps: step2. add trace point info with id and check logs.
527 * @tc.expected: step2. trace point can be found in logs.
528 */
529 HiTraceId id = HiTraceChain::Begin("test no D2D, but tp flag", HITRACE_FLAG_TP_INFO);
530 EXPECT_EQ(0, id.IsFlagEnabled(HITRACE_FLAG_D2D_TP_INFO));
531 EXPECT_EQ(1, id.IsFlagEnabled(HITRACE_FLAG_TP_INFO));
532 HiTraceChain::Tracepoint(HITRACE_TP_CS, id, "client send msg content %d", 12);
533 HiTraceChain::Tracepoint(HITRACE_TP_CS, id, "client send msg content %d", 22);
534 HiTraceChain::Tracepoint(HITRACE_TP_CS, id, "client send msg content %d", 32);
535 HiTraceChain::Tracepoint(HITRACE_TP_CS, id, "client send msg content %d", 42);
536
537 HiTraceChain::Tracepoint(HITRACE_TP_CS, id, "client send msg content %d", 13);
538
539 HiTraceChain::End(id);
540 }
541
542 /**
543 * @tc.name: Dfx_HiTraceChainCppTest_SyncAsyncTest_001
544 * @tc.desc: Start trace with SYNC or ASYNC.
545 * @tc.type: FUNC
546 * @tc.require: AR000CQ0G7
547 */
548 HWTEST_F(HiTraceChainCppTest, SyncAsyncTest_001, TestSize.Level1)
549 {
550 /**
551 * @tc.steps: step1. start trace without HITRACE_FLAG_INCLUDE_ASYNC flag.
552 * get and check flags.
553 * @tc.expected: step1. HITRACE_FLAG_INCLUDE_ASYNC is not enabled.
554 * @tc.steps: step2. start trace with HITRACE_FLAG_INCLUDE_ASYNC flag.
555 * get and check flags.
556 * @tc.expected: step2. HITRACE_FLAG_INCLUDE_ASYNC is enabled.
557 */
558 /* begin with sync flag */
559 HiTraceId syncId = HiTraceChain::Begin("test sync only", HITRACE_FLAG_TP_INFO);
560 EXPECT_EQ(0, syncId.IsFlagEnabled(HITRACE_FLAG_INCLUDE_ASYNC));
561 HiTraceChain::Tracepoint(HITRACE_TP_CS, syncId, "client send msg: %s", "sync");
562 HiTraceChain::End(syncId);
563 /* begin with async flag */
564 HiTraceId asyncId = HiTraceChain::Begin("test sync+async", HITRACE_FLAG_INCLUDE_ASYNC | HITRACE_FLAG_TP_INFO);
565 EXPECT_EQ(1, asyncId.IsFlagEnabled(HITRACE_FLAG_INCLUDE_ASYNC));
566 HiTraceChain::Tracepoint(HITRACE_TP_CS, asyncId, "client send msg: %s", "async");
567
568 HiTraceChain::End(asyncId);
569 }
570
571 /**
572 * @tc.name: Dfx_HiTraceChainCppTest_InvalidParamTest_001
573 * @tc.desc: Start trace with SYNC or ASYNC.
574 * @tc.type: FUNC
575 * @tc.require: AR000CQV9U
576 */
577 HWTEST_F(HiTraceChainCppTest, InvalidParamTest_001, TestSize.Level1)
578 {
579 /**
580 * @tc.steps: step1. start trace with invalid flag and validate trace id.
581 * @tc.expected: step1. trace id is invalid.
582 * @tc.steps: step2. start trace with invalid name and validate trace id.
583 * @tc.expected: step2. trace id is valid.
584 */
585 /* begin with invalid flag */
586 HiTraceId invalidFlagId = HiTraceChain::Begin("invalid param", HITRACE_FLAG_MAX+1);
587 EXPECT_EQ(0, invalidFlagId.IsValid());
588 invalidFlagId = HiTraceChain::Begin("invalid param", -1);
589 EXPECT_EQ(0, invalidFlagId.IsValid());
590 HiTraceChain::End(invalidFlagId);
591
592 /* begin with invalid name */
593 HiTraceId invalidNameId = HiTraceChain::Begin("", HITRACE_FLAG_TP_INFO);
594 EXPECT_EQ(1, invalidNameId.IsValid());
595 HiTraceChain::End(invalidNameId);
596 }
597 } // namespace HiviewDFX
598 } // namespace OHOS
599