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