• 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 #include <sys/time.h>
21 
22 #include "gtest/gtest-message.h"
23 #include "gtest/gtest-test-part.h"
24 #include "gtest/gtest_pred_impl.h"
25 #include "gtest/hwext/gtest-tag.h"
26 #include "hitrace/hitracechainc.h"
27 #include "hitrace/hitraceid.h"
28 #include "hitrace_meter.h"
29 #include "hitrace_meter_c.h"
30 
31 #define ARRAY_FIRST_INDEX 0
32 #define ARRAY_SECOND_INDEX 1
33 #define ARRAY_THIRD_INDEX 2
34 #define HASH_DATA_LENGTH 3
35 
36 #define DEVICE_CLIENT_SEND 12
37 #define PROCESS_CLIENT_SEND 22
38 #define THREAD_CLIENT_SEND 32
39 #define DEFAULT_CLIENT_SEND 42
40 
HashFunc(const void * pData,uint32_t dataLen)41 static uint64_t HashFunc(const void* pData, uint32_t dataLen)
42 {
43     const uint64_t seed = 131;
44     if ((!pData) || dataLen == 0) {
45         return 0;
46     }
47     uint64_t hash = 0;
48     uint64_t len = dataLen;
49     const char* p = static_cast<const char*>(pData);
50     for (; len > 0; --len) {
51         hash = (hash * seed) + (*p++);
52     }
53     return hash;
54 }
55 
GenerateChainId()56 static uint64_t GenerateChainId()
57 {
58     const uint64_t randomNum = 269;
59     uint64_t hashData[HASH_DATA_LENGTH];
60     struct timeval tv;
61     gettimeofday(&tv, nullptr);
62     srand(tv.tv_sec);
63     hashData[ARRAY_FIRST_INDEX] = tv.tv_sec;
64     hashData[ARRAY_SECOND_INDEX] = tv.tv_usec;
65     hashData[ARRAY_THIRD_INDEX] = randomNum;
66     uint64_t hash = HashFunc(hashData, HASH_DATA_LENGTH * sizeof(uint64_t));
67     return hash;
68 }
69 
70 
GenerateSpanId()71 static uint64_t GenerateSpanId()
72 {
73     const uint64_t randomNum = 269;
74     uint64_t hashData[HASH_DATA_LENGTH];
75     struct timeval tv;
76     gettimeofday(&tv, nullptr);
77     srand(tv.tv_sec);
78     hashData[ARRAY_FIRST_INDEX] = randomNum;
79     hashData[ARRAY_SECOND_INDEX] = tv.tv_sec;
80     hashData[ARRAY_THIRD_INDEX] = tv.tv_usec;
81     uint64_t hash = HashFunc(hashData, HASH_DATA_LENGTH * sizeof(uint64_t));
82     return hash;
83 }
84 
GenerateParentSpanId()85 static uint64_t GenerateParentSpanId()
86 {
87     const uint64_t randomNum = 269;
88     uint64_t hashData[HASH_DATA_LENGTH];
89     struct timeval tv;
90     gettimeofday(&tv, nullptr);
91     srand(tv.tv_sec);
92     hashData[ARRAY_FIRST_INDEX] = tv.tv_usec;
93     hashData[ARRAY_SECOND_INDEX] = randomNum;
94     hashData[ARRAY_THIRD_INDEX] = tv.tv_sec;
95     uint64_t hash = HashFunc(hashData, HASH_DATA_LENGTH * sizeof(uint64_t));
96     return hash;
97 }
98 
99 namespace OHOS {
100 namespace HiviewDFX {
101 using namespace testing::ext;
102 
103 class HiTraceChainCppTest : public testing::Test {
104 public:
105     static void SetUpTestCase();
106     static void TearDownTestCase();
107     void SetUp();
108     void TearDown();
109 };
110 
SetUpTestCase()111 void HiTraceChainCppTest::SetUpTestCase()
112 {}
113 
TearDownTestCase()114 void HiTraceChainCppTest::TearDownTestCase()
115 {}
116 
SetUp()117 void HiTraceChainCppTest::SetUp()
118 {
119     HiTraceChain::ClearId();
120 }
121 
TearDown()122 void HiTraceChainCppTest::TearDown()
123 {}
124 
125 /**
126  * @tc.name: Dfx_HiTraceChainCppTest_IdTest_001
127  * @tc.desc: Get, set and clear trace id
128  * @tc.type: FUNC
129  * @tc.require: AR000CQV9U
130  */
131 HWTEST_F(HiTraceChainCppTest, IdTest_001, TestSize.Level1)
132 {
133     /**
134      * @tc.steps: step1. get and validate trace id.
135      * @tc.expected: step1. trace id is invalid.
136      * @tc.steps: step2. construct trace id with chain id, span id, parent span id
137      *     and flags and set it into context, then get and validate it.
138      * @tc.expected: step2. trace id is valid with same chain id, span id, parent
139      *     span id and flags.
140      * @tc.steps: step3. construct invalid trace id and set into context, then get
141      *     and validate it.
142      * @tc.expected: step3. trace id is the same with step2.
143      * @tc.steps: step4. clear trace id, then get and validate it.
144      * @tc.expected: step4. trace id is invalid.
145      */
146     HiTraceId initId = HiTraceChain::GetId();
147     EXPECT_EQ(0, initId.IsValid());
148     /* set thread id */
149     constexpr uint64_t CHAIN_ID = 0xABCDEF;
150     constexpr uint64_t SPAN_ID = 0x12345;
151     constexpr uint64_t PARENT_SPAN_ID = 0x67890;
152 
153     initId.SetChainId(CHAIN_ID);
154     initId.EnableFlag(HITRACE_FLAG_INCLUDE_ASYNC);
155     initId.EnableFlag(HITRACE_FLAG_DONOT_CREATE_SPAN);
156     initId.SetSpanId(SPAN_ID);
157     initId.SetParentSpanId(PARENT_SPAN_ID);
158 
159     EXPECT_EQ(1, initId.IsValid());
160     EXPECT_EQ(CHAIN_ID, initId.GetChainId());
161     EXPECT_EQ(HITRACE_FLAG_INCLUDE_ASYNC | HITRACE_FLAG_DONOT_CREATE_SPAN, initId.GetFlags());
162     EXPECT_EQ(SPAN_ID, initId.GetSpanId());
163     EXPECT_EQ(PARENT_SPAN_ID, initId.GetParentSpanId());
164 
165     HiTraceChain::SetId(initId);
166 
167     HiTraceId getId = HiTraceChain::GetId();
168     EXPECT_EQ(1, getId.IsValid());
169     EXPECT_EQ(CHAIN_ID, getId.GetChainId());
170     EXPECT_EQ(HITRACE_FLAG_INCLUDE_ASYNC | HITRACE_FLAG_DONOT_CREATE_SPAN, getId.GetFlags());
171     EXPECT_EQ(SPAN_ID, getId.GetSpanId());
172     EXPECT_EQ(PARENT_SPAN_ID, getId.GetParentSpanId());
173 
174     HiTraceId invalidId;
175     HiTraceChain::SetId(invalidId);
176 
177     getId = HiTraceChain::GetId();
178     EXPECT_EQ(1, getId.IsValid());
179     EXPECT_EQ(CHAIN_ID, getId.GetChainId());
180     EXPECT_EQ(HITRACE_FLAG_INCLUDE_ASYNC | HITRACE_FLAG_DONOT_CREATE_SPAN, getId.GetFlags());
181     EXPECT_EQ(SPAN_ID, getId.GetSpanId());
182     EXPECT_EQ(PARENT_SPAN_ID, getId.GetParentSpanId());
183 
184     HiTraceChain::ClearId();
185     HiTraceId clearId = HiTraceChain::GetId();
186     EXPECT_EQ(0, clearId.IsValid());
187 }
188 
189 /**
190  * @tc.name: Dfx_HiTraceChainCppTest_IdTest_002
191  * @tc.desc: Get, set and clear trace id by trace id pointer
192  * @tc.type: FUNC
193  * @tc.require: AR000CQV9U
194  */
195 HWTEST_F(HiTraceChainCppTest, IdTest_002, TestSize.Level1)
196 {
197     /**
198      * @tc.steps: step1. get and validate trace id.
199      * @tc.expected: step1. trace id is invalid.
200      * @tc.steps: step2. construct trace id with chain id, span id, parent span id
201      *     and flags and set it into context, then get and validate it.
202      * @tc.expected: step2. trace id is valid with same chain id, span id, parent
203      *     span id and flags.
204      * @tc.steps: step3. construct invalid trace id and set into context, then get
205      *     and validate it.
206      * @tc.expected: step3. trace id is the same with step2.
207      * @tc.steps: step4. clear trace id, then get and validate it.
208      * @tc.expected: step4. trace id is invalid.
209      */
210     HiTraceId* pTraceId = HiTraceChain::GetIdAddress();
211     EXPECT_EQ(0, pTraceId->IsValid());
212     /* set thread id */
213     constexpr uint64_t CHAIN_ID = 0xABCDEF;
214     constexpr uint64_t SPAN_ID = 0x12345;
215     constexpr uint64_t PARENT_SPAN_ID = 0x67890;
216 
217     HiTraceId initId = HiTraceChain::GetId();
218     initId.SetChainId(CHAIN_ID);
219     initId.EnableFlag(HITRACE_FLAG_INCLUDE_ASYNC);
220     initId.EnableFlag(HITRACE_FLAG_DONOT_CREATE_SPAN);
221     initId.SetSpanId(SPAN_ID);
222     initId.SetParentSpanId(PARENT_SPAN_ID);
223 
224     HiTraceChain::SetId(initId);
225 
226     EXPECT_EQ(1, pTraceId->IsValid());
227     EXPECT_EQ(CHAIN_ID, pTraceId->GetChainId());
228     EXPECT_EQ(HITRACE_FLAG_INCLUDE_ASYNC | HITRACE_FLAG_DONOT_CREATE_SPAN, pTraceId->GetFlags());
229     EXPECT_EQ(SPAN_ID, pTraceId->GetSpanId());
230     EXPECT_EQ(PARENT_SPAN_ID, pTraceId->GetParentSpanId());
231 
232     HiTraceId invalidId;
233     HiTraceChain::SetId(invalidId);
234 
235     EXPECT_EQ(1, pTraceId->IsValid());
236     EXPECT_EQ(CHAIN_ID, pTraceId->GetChainId());
237     EXPECT_EQ(HITRACE_FLAG_INCLUDE_ASYNC | HITRACE_FLAG_DONOT_CREATE_SPAN, pTraceId->GetFlags());
238     EXPECT_EQ(SPAN_ID, pTraceId->GetSpanId());
239     EXPECT_EQ(PARENT_SPAN_ID, pTraceId->GetParentSpanId());
240 
241     HiTraceChain::ClearId();
242     EXPECT_EQ(0, pTraceId->IsValid());
243 }
244 
245 /**
246  * @tc.name: Dfx_HiTraceChainCppTest_IntfTest_001
247  * @tc.desc: Interconversion between trace id and bytes array.
248  * @tc.type: FUNC
249  * @tc.require: AR000CQV9U
250  */
251 HWTEST_F(HiTraceChainCppTest, IntfTest_001, TestSize.Level1)
252 {
253     /**
254      * @tc.steps: step1. get trace id and validate it.
255      * @tc.expected: step1. trace id is invalid.
256      * @tc.steps: step2. construct trace id and validate it.
257      * @tc.expected: step2. trace id is valid.
258      * @tc.steps: step3. convert trace id to bytes array.
259      * @tc.expected: step3. convert success when array size >= id length.
260      * @tc.steps: step4. convert bytes array to trace id.
261      * @tc.expected: step4. convert success only when array size == id length.
262      * @tc.steps: step5. convert invalid id to bytes array.
263      * @tc.expected: step5. convert fail.
264      * @tc.steps: step6. convert invalid bytes array to id.
265      * @tc.expected: step6. convert fail.
266      */
267     HiTraceId initId = HiTraceChain::GetId();
268     EXPECT_EQ(0, initId.IsValid());
269     constexpr uint64_t CHAIN_ID = 0xABCDEF;
270     constexpr uint64_t SPAN_ID = 0x12345;
271     constexpr uint64_t PARENT_SPAN_ID = 0x67890;
272     constexpr int FLAGS = HITRACE_FLAG_INCLUDE_ASYNC | HITRACE_FLAG_DONOT_CREATE_SPAN;
273 
274     initId.SetChainId(CHAIN_ID);
275     initId.SetFlags(FLAGS);
276     initId.SetSpanId(SPAN_ID);
277     initId.SetParentSpanId(PARENT_SPAN_ID);
278     EXPECT_EQ(1, initId.IsValid());
279     constexpr int ID_LEN = sizeof(HiTraceIdStruct);
280 
281     uint8_t bytes[ID_LEN + 1];
282     int len = initId.ToBytes(bytes, ID_LEN - 1);
283     EXPECT_EQ(0, len);
284     len = initId.ToBytes(bytes, ID_LEN + 1);
285     EXPECT_EQ(ID_LEN, len);
286     len = initId.ToBytes(bytes, ID_LEN);
287     EXPECT_EQ(ID_LEN, len);
288 
289     /* bytes to id */
290     HiTraceId bytesToId = HiTraceId(bytes, ID_LEN - 1);
291     EXPECT_EQ(0, bytesToId.IsValid());
292     bytesToId = HiTraceId(bytes, ID_LEN + 1);
293     EXPECT_EQ(0, bytesToId.IsValid());
294     bytesToId = HiTraceId(bytes, ID_LEN);
295     EXPECT_EQ(1, bytesToId.IsValid());
296     EXPECT_EQ(CHAIN_ID, bytesToId.GetChainId());
297     EXPECT_EQ(HITRACE_FLAG_INCLUDE_ASYNC | HITRACE_FLAG_DONOT_CREATE_SPAN, bytesToId.GetFlags());
298     EXPECT_EQ(SPAN_ID, bytesToId.GetSpanId());
299     EXPECT_EQ(PARENT_SPAN_ID, bytesToId.GetParentSpanId());
300 
301     /* set invalid id */
302     HiTraceId invalidId;
303     EXPECT_EQ(0, invalidId.ToBytes(bytes, ID_LEN));
304     invalidId = HiTraceId(nullptr, ID_LEN);
305     EXPECT_EQ(0, invalidId.IsValid());
306 }
307 
308 /**
309  * @tc.name: Dfx_HiTraceChainCppTest_IntfTest_002
310  * @tc.desc: Start and stop trace.
311  * @tc.type: FUNC
312  * @tc.require: AR000CQV9U
313  */
314 HWTEST_F(HiTraceChainCppTest, IntfTest_002, TestSize.Level1)
315 {
316     /**
317      * @tc.steps: step1. start trace with flags, get trace id and validit it.
318      * @tc.expected: step1. trace id and flags is valid.
319      * @tc.steps: step2. stop trace, get trace id and validit it.
320      * @tc.expected: step2. trace id is invalid.
321      */
322     HiTraceId beginId = HiTraceChain::Begin("test", HITRACE_FLAG_INCLUDE_ASYNC | HITRACE_FLAG_NO_BE_INFO);
323     EXPECT_EQ(1, beginId.IsValid());
324     EXPECT_EQ(1, beginId.IsFlagEnabled(HITRACE_FLAG_INCLUDE_ASYNC));
325     EXPECT_EQ(1, beginId.IsFlagEnabled(HITRACE_FLAG_NO_BE_INFO));
326 
327     HiTraceChain::End(beginId);
328 
329     HiTraceId endId = HiTraceChain::GetId();
330     EXPECT_EQ(0, endId.IsValid());
331 }
332 
333 /**
334  * @tc.name: Dfx_HiTraceChainCppTest_IntfTest_003
335  * @tc.desc: Start and stop trace with reentered.
336  * @tc.type: FUNC
337  * @tc.require: AR000CQV9U
338  */
339 HWTEST_F(HiTraceChainCppTest, IntfTest_003, TestSize.Level1)
340 {
341     /**
342      * @tc.steps: step1. start trace twice and get 2nd trace id.
343      * @tc.expected: step1. 2nd trace is invalid.
344      * @tc.steps: step2. get trace id and check.
345      * @tc.expected: step2. trace id is valid and same with 1st id.
346      * @tc.steps: step3. set chain id with wrong id and get trace id.
347      * @tc.expected: step3. trace id is valid and same with 1st id.
348      * @tc.steps: step4. stop trace twice and get trace id.
349      * @tc.expected: step4. trace id is invalid.
350      */
351     /* begin */
352     HiTraceId beginId = HiTraceChain::Begin("begin", HITRACE_FLAG_INCLUDE_ASYNC);
353     /* reenter begin */
354     HiTraceId reBeginId = HiTraceChain::Begin("reenter begin", HITRACE_FLAG_TP_INFO);
355     EXPECT_EQ(0, reBeginId.IsValid());
356     EXPECT_NE(reBeginId.GetChainId(), beginId.GetChainId());
357     EXPECT_EQ(0, reBeginId.IsFlagEnabled(HITRACE_FLAG_INCLUDE_ASYNC));
358     EXPECT_EQ(0, reBeginId.IsFlagEnabled(HITRACE_FLAG_TP_INFO));
359 
360     /* reenter end */
361     HiTraceChain::End(reBeginId);
362 
363     HiTraceId endId = HiTraceChain::GetId();
364     EXPECT_EQ(1, endId.IsValid());
365     EXPECT_EQ(endId.GetChainId(), beginId.GetChainId());
366     EXPECT_EQ(1, endId.IsFlagEnabled(HITRACE_FLAG_INCLUDE_ASYNC));
367     EXPECT_EQ(0, endId.IsFlagEnabled(HITRACE_FLAG_TP_INFO));
368 
369     /* end with wrong chainId */
370     HiTraceId wrongBeginId = beginId;
371     wrongBeginId.SetChainId(beginId.GetChainId() + 1);
372     HiTraceChain::End(wrongBeginId);
373 
374     HiTraceId wrongEndId = HiTraceChain::GetId();
375     EXPECT_EQ(1, wrongEndId.IsValid());
376     EXPECT_EQ(wrongEndId.GetChainId(), beginId.GetChainId());
377     EXPECT_EQ(1, wrongEndId.IsFlagEnabled(HITRACE_FLAG_INCLUDE_ASYNC));
378 
379     /* end */
380     HiTraceChain::End(beginId);
381 
382     HiTraceId reEndId = HiTraceChain::GetId();
383     EXPECT_EQ(0, reEndId.IsValid());
384 
385     /* end with invalid thread id */
386     HiTraceChain::End(beginId);
387 
388     HiTraceId endInvalidId = HiTraceChain::GetId();
389     EXPECT_EQ(0, endInvalidId.IsValid());
390 }
391 
392 /**
393  * @tc.name: Dfx_HiTraceChainCppTest_SpanTest_001
394  * @tc.desc: Create child and grand child span.
395  * @tc.type: FUNC
396  * @tc.require: AR000CQV9U
397  */
398 HWTEST_F(HiTraceChainCppTest, SpanTest_001, TestSize.Level1)
399 {
400     /**
401      * @tc.steps: step1. start trace without HITRACE_FLAG_DONOT_CREATE_SPAN,
402      *     get and check flags.
403      * @tc.expected: step1. flags is same with set and span id is 0.
404      * @tc.steps: step2. create child id.
405      * @tc.expected: step2. child id has same span id with parent.
406      * @tc.steps: step3. set child id into context.
407      * @tc.steps: step4. create grand child id.
408      * @tc.expected: step4. grand child id has same span id with parent and child.
409      */
410     /* begin with span flag */
411     HiTraceId id = HiTraceChain::Begin("test", 0);
412     EXPECT_EQ(0, id.GetFlags());
413     EXPECT_EQ(0UL, id.GetSpanId());
414     EXPECT_EQ(0UL, id.GetParentSpanId());
415 
416     /* create child span */
417     HiTraceId childId = HiTraceChain::CreateSpan();
418     EXPECT_EQ(1, childId.IsValid());
419     EXPECT_EQ(childId.GetFlags(), id.GetFlags());
420     EXPECT_EQ(childId.GetChainId(), id.GetChainId());
421     EXPECT_EQ(childId.GetParentSpanId(), id.GetSpanId());
422 
423     /* set child id to thread id */
424     HiTraceChain::SetId(childId);
425 
426     /* continue to create child span */
427     HiTraceId grandChildId = HiTraceChain::CreateSpan();
428     EXPECT_EQ(1, grandChildId.IsValid());
429     EXPECT_EQ(grandChildId.GetFlags(), id.GetFlags());
430     EXPECT_EQ(grandChildId.GetChainId(), id.GetChainId());
431     EXPECT_EQ(grandChildId.GetParentSpanId(), childId.GetSpanId());
432 
433     /* end */
434     HiTraceChain::End(id);
435 }
436 
437 /**
438  * @tc.name: Dfx_HiTraceChainCppTest_SpanTest_002
439  * @tc.desc: Start and stop trace with reentered.
440  * @tc.type: FUNC
441  * @tc.require: AR000CQV9U
442  */
443 HWTEST_F(HiTraceChainCppTest, SpanTest_002, TestSize.Level1)
444 {
445     /**
446      * @tc.steps: step1. start trace with HITRACE_FLAG_DONOT_CREATE_SPAN,
447      *     get and check flags.
448      * @tc.expected: step1. HITRACE_FLAG_DONOT_CREATE_SPAN is enabled.
449      * @tc.steps: step2. create child id.
450      * @tc.expected: step2. child id is same with parent id.
451      */
452     /* begin with "donot create span" flag */
453     HiTraceId id = HiTraceChain::Begin("test", HITRACE_FLAG_DONOT_CREATE_SPAN);
454     EXPECT_EQ(1, id.IsFlagEnabled(HITRACE_FLAG_DONOT_CREATE_SPAN));
455 
456     /* create child span */
457     HiTraceId childId = HiTraceChain::CreateSpan();
458     EXPECT_EQ(1, childId.IsValid());
459     EXPECT_EQ(childId.GetFlags(), id.GetFlags());
460     EXPECT_EQ(childId.GetChainId(), id.GetChainId());
461     EXPECT_EQ(childId.GetSpanId(), id.GetSpanId());
462     EXPECT_EQ(childId.GetParentSpanId(), id.GetParentSpanId());
463 
464     /* end */
465     HiTraceChain::End(id);
466 }
467 
468 /**
469  * @tc.name: Dfx_HiTraceChainCppTest_TracepointTest_001
470  * @tc.desc: Start trace with HITRACE_FLAG_TP_INFO flag.
471  * @tc.type: FUNC
472  * @tc.require: AR000CQVA3
473  */
474 HWTEST_F(HiTraceChainCppTest, TracepointTest_001, TestSize.Level1)
475 {
476     /**
477      * @tc.steps: step1. start trace with HITRACE_FLAG_TP_INFO,
478      *     get and check flags.
479      * @tc.expected: step1. HITRACE_FLAG_TP_INFO is enabled.
480      * @tc.steps: step2. add trace point info with id and check logs.
481      * @tc.expected: step2. trace point can be found in logs.
482      * @tc.steps: step3. add trace point info with null and check logs.
483      * @tc.expected: step3. trace point cannot be found in logs.
484      */
485     /* begin with tp flag */
486     HiTraceId invalidId;
487     HiTraceId id = HiTraceChain::Begin("test tp flag", HITRACE_FLAG_TP_INFO);
488     EXPECT_EQ(1, id.IsFlagEnabled(HITRACE_FLAG_TP_INFO));
489     HiTraceChain::Tracepoint(HITRACE_TP_CS, id, "client send msg content %d", 12);
490     HiTraceChain::Tracepoint(HITRACE_TP_CS, invalidId, "client send msg content %d", 12);
491     HiTraceChain::End(id);
492 }
493 
494 /**
495  * @tc.name: Dfx_HiTraceChainCppTest_TracepointTest_002
496  * @tc.desc: Start trace without HITRACE_FLAG_TP_INFO flag.
497  * @tc.type: FUNC
498  * @tc.require: AR000CQVA3
499  */
500 HWTEST_F(HiTraceChainCppTest, TracepointTest_002, TestSize.Level1)
501 {
502     /**
503      * @tc.steps: step1. start trace without HITRACE_FLAG_TP_INFO flag.
504      *     get and check flags.
505      * @tc.expected: step1. HITRACE_FLAG_TP_INFO is not enabled.
506      * @tc.steps: step2. add trace point info with id and check logs.
507      * @tc.expected: step2. trace point cannot be found in logs.
508      */
509     /* begin with tp flag */
510     HiTraceId id = HiTraceChain::Begin("test no tp flag", HITRACE_FLAG_INCLUDE_ASYNC);
511     EXPECT_EQ(0, id.IsFlagEnabled(HITRACE_FLAG_TP_INFO));
512     HiTraceChain::Tracepoint(HITRACE_TP_CS, id, "client send msg content %d", 12);
513 
514     HiTraceChain::End(id);
515 }
516 
517 /**
518  * @tc.name: Dfx_HiTraceChainCppTest_TracepointTest_003
519  * @tc.desc: Start trace with HITRACE_FLAG_D2D_TP_INFO flag.
520  * @tc.type: FUNC
521  * @tc.require: AR000CQVA3
522  */
523 HWTEST_F(HiTraceChainCppTest, TracepointTest_003, TestSize.Level1)
524 {
525     /**
526      * @tc.steps: step1. start trace with HITRACE_FLAG_D2D_TP_INFO,
527      *     get and check flags.
528      * @tc.expected: step1. HITRACE_FLAG_D2D_TP_INFO is enabled.
529      * @tc.steps: step2. add D2D trace point info with id and check logs.
530      * @tc.expected: step2. trace point can be found in logs.
531      * @tc.steps: step2. add D2D trace point info with null and check logs.
532      * @tc.expected: step2. trace point cannot be found in logs.
533      * @tc.steps: step3. add trace point info with id and check logs.
534      * @tc.expected: step3. trace point cannot be found in logs.
535      */
536     HiTraceId id = HiTraceChain::Begin("test D2D tp flag", HITRACE_FLAG_D2D_TP_INFO);
537     EXPECT_EQ(1, id.IsFlagEnabled(HITRACE_FLAG_D2D_TP_INFO));
538     HiTraceChain::Tracepoint(HITRACE_CM_DEVICE, HITRACE_TP_CS, id, "client send msg content %d", 12);
539     HiTraceChain::Tracepoint(HITRACE_CM_PROCESS, HITRACE_TP_CS, id, "cannot be found %d", 22);
540     HiTraceChain::Tracepoint(HITRACE_CM_THREAD, HITRACE_TP_CS, id, "cannot be found %d", 32);
541     HiTraceChain::Tracepoint(HITRACE_CM_DEFAULT, HITRACE_TP_CS, id, "cannot be found %d", 42);
542 
543     HiTraceId invalidId;
544     HiTraceChain::Tracepoint(HITRACE_CM_DEVICE, HITRACE_TP_CS, invalidId, "cannot be found %d", 13);
545 
546     HiTraceChain::Tracepoint(HITRACE_TP_CS, id, "cannot be found %d", 14);
547 
548     HiTraceChain::End(id);
549 }
550 
551 /**
552  * @tc.name: Dfx_HiTraceChainCppTest_TracepointTest_004
553  * @tc.desc: Start trace without HITRACE_FLAG_D2D_TP_INFO flag.
554  * @tc.type: FUNC
555  * @tc.require: AR000CQVA3
556  */
557 HWTEST_F(HiTraceChainCppTest, TracepointTest_004, TestSize.Level1)
558 {
559     /**
560      * @tc.steps: step1. start trace without HITRACE_FLAG_D2D_TP_INFO flag.
561      *     get and check flags.
562      * @tc.expected: step1. HITRACE_FLAG_D2D_TP_INFO is not enabled.
563      * @tc.steps: step2. add D2D trace point info with id and check logs.
564      * @tc.expected: step2. trace point cannot be found in logs.
565      */
566     HiTraceId id = HiTraceChain::Begin("test no D2D tp flag", HITRACE_FLAG_INCLUDE_ASYNC);
567     EXPECT_EQ(0, id.IsFlagEnabled(HITRACE_FLAG_D2D_TP_INFO));
568     HiTraceChain::Tracepoint(HITRACE_CM_DEVICE, HITRACE_TP_CS, id, "cannot be found %d", 12);
569     HiTraceChain::Tracepoint(HITRACE_CM_PROCESS, HITRACE_TP_CS, id, "cannot be found %d", 22);
570     HiTraceChain::Tracepoint(HITRACE_CM_THREAD, HITRACE_TP_CS, id, "cannot be found %d", 32);
571     HiTraceChain::Tracepoint(HITRACE_CM_DEFAULT, HITRACE_TP_CS, id, "cannot be found %d", 42);
572 
573     HiTraceChain::End(id);
574 }
575 
576 /**
577  * @tc.name: Dfx_HiTraceChainCppTest_TracepointTest_005
578  * @tc.desc: Start trace with HITRACE_FLAG_D2D_TP_INFO and HITRACE_FLAG_TP_INFO flag.
579  * @tc.type: FUNC
580  * @tc.require: AR000CQVA3
581  */
582 HWTEST_F(HiTraceChainCppTest, TracepointTest_005, TestSize.Level1)
583 {
584     /**
585      * @tc.steps: step1. start trace with HITRACE_FLAG_D2D_TP_INFO | HITRACE_FLAG_TP_INFO,
586      *     get and check flags.
587      * @tc.expected: step1. HITRACE_FLAG_D2D_TP_INFO is enabled.
588      * @tc.expected: step1. HITRACE_FLAG_TP_INFO is enabled.
589      * @tc.steps: step2. add D2D trace point info with id and check logs.
590      * @tc.expected: step2. trace point can be found in logs.
591      * @tc.steps: step3. add trace point info with id and check logs.
592      * @tc.expected: step3. trace point can be found in logs.
593      */
594     HiTraceId id = HiTraceChain::Begin("test D2D | TP tp flag", HITRACE_FLAG_D2D_TP_INFO | HITRACE_FLAG_TP_INFO);
595     EXPECT_EQ(1, id.IsFlagEnabled(HITRACE_FLAG_D2D_TP_INFO));
596     EXPECT_EQ(1, id.IsFlagEnabled(HITRACE_FLAG_TP_INFO));
597     HiTraceChain::Tracepoint(HITRACE_CM_DEVICE, HITRACE_TP_CS, id, "client send msg content %d", 12);
598     HiTraceChain::Tracepoint(HITRACE_CM_PROCESS, HITRACE_TP_CS, id, "client send msg content %d", 22);
599     HiTraceChain::Tracepoint(HITRACE_CM_THREAD, HITRACE_TP_CS, id, "client send msg content %d", 32);
600     HiTraceChain::Tracepoint(HITRACE_CM_DEFAULT, HITRACE_TP_CS, id, "client send msg content %d", 42);
601 
602     HiTraceChain::Tracepoint(HITRACE_TP_CS, id, "client send msg content %d", 13);
603 
604     HiTraceChain::End(id);
605 }
606 
607 /**
608  * @tc.name: Dfx_HiTraceChainCppTest_TracepointTest_006
609  * @tc.desc: Start trace without HITRACE_FLAG_D2D_TP_INFO, but with HITRACE_FLAG_TP_INFO flag.
610  * @tc.type: FUNC
611  * @tc.require: AR000CQVA3
612  */
613 HWTEST_F(HiTraceChainCppTest, TracepointTest_006, TestSize.Level1)
614 {
615     /**
616      * @tc.steps: step1. start trace with HITRACE_FLAG_TP_INFO flag.
617      *     get and check flags.
618      * @tc.expected: step1. HITRACE_FLAG_D2D_TP_INFO is not enabled.
619      * * @tc.expected: step1. HITRACE_FLAG_TP_INFO is enabled.
620      * @tc.steps: step2. add D2D trace point info with id and check logs.
621      * @tc.expected: step2. trace point can be found in logs.
622      * @tc.steps: step2. add trace point info with id and check logs.
623      * @tc.expected: step2. trace point can be found in logs.
624      */
625     HiTraceId id = HiTraceChain::Begin("test no D2D, but tp flag", HITRACE_FLAG_TP_INFO);
626     EXPECT_EQ(0, id.IsFlagEnabled(HITRACE_FLAG_D2D_TP_INFO));
627     EXPECT_EQ(1, id.IsFlagEnabled(HITRACE_FLAG_TP_INFO));
628     HiTraceChain::Tracepoint(HITRACE_CM_DEVICE, HITRACE_TP_CS, id, "client send msg content %d", 12);
629     HiTraceChain::Tracepoint(HITRACE_CM_PROCESS, HITRACE_TP_CS, id, "client send msg content %d", 22);
630     HiTraceChain::Tracepoint(HITRACE_CM_THREAD, HITRACE_TP_CS, id, "client send msg content %d", 32);
631     HiTraceChain::Tracepoint(HITRACE_CM_DEFAULT, HITRACE_TP_CS, id, "client send msg content %d", 42);
632 
633     HiTraceChain::Tracepoint(HITRACE_TP_CS, id, "client send msg content %d", 13);
634 
635     HiTraceChain::End(id);
636 }
637 
638 /**
639  * @tc.name: Dfx_HiTraceChainCppTest_TracepointTest_007
640  * @tc.desc: Start trace without HITRACE_FLAG_D2D_TP_INFO, but with HITRACE_FLAG_TP_INFO flag.
641  * @tc.type: FUNC
642  * @tc.require: AR000CQVA3
643  */
644 HWTEST_F(HiTraceChainCppTest, TracepointTest_007, TestSize.Level1)
645 {
646     /**
647      * @tc.steps: step1. start trace with HITRACE_FLAG_TP_INFO flag.
648      *     get and check flags.
649      * @tc.expected: step1. HITRACE_FLAG_D2D_TP_INFO is not enabled.
650      * * @tc.expected: step1. HITRACE_FLAG_TP_INFO is enabled.
651      * @tc.steps: step2. add D2D trace point info with id and check logs.
652      * @tc.expected: step2. trace point can be found in logs.
653      * @tc.steps: step2. add trace point info with id and check logs.
654      * @tc.expected: step2. trace point can be found in logs.
655      */
656     HiTraceId id = HiTraceChain::Begin("test no D2D, but tp flag", HITRACE_FLAG_TP_INFO);
657     EXPECT_EQ(0, id.IsFlagEnabled(HITRACE_FLAG_D2D_TP_INFO));
658     EXPECT_EQ(1, id.IsFlagEnabled(HITRACE_FLAG_TP_INFO));
659     HiTraceChain::Tracepoint(HITRACE_TP_CS, id, "client send msg content %d", 12);
660     HiTraceChain::Tracepoint(HITRACE_TP_CS, id, "client send msg content %d", 22);
661     HiTraceChain::Tracepoint(HITRACE_TP_CS, id, "client send msg content %d", 32);
662     HiTraceChain::Tracepoint(HITRACE_TP_CS, id, "client send msg content %d", 42);
663 
664     HiTraceChain::Tracepoint(HITRACE_TP_CS, id, "client send msg content %d", 13);
665 
666     HiTraceChain::End(id);
667 }
668 
669 /**
670  * @tc.name: Dfx_HiTraceChainCppTest_SyncAsyncTest_001
671  * @tc.desc: Start trace with SYNC or ASYNC.
672  * @tc.type: FUNC
673  * @tc.require: AR000CQ0G7
674  */
675 HWTEST_F(HiTraceChainCppTest, SyncAsyncTest_001, TestSize.Level1)
676 {
677     /**
678      * @tc.steps: step1. start trace without HITRACE_FLAG_INCLUDE_ASYNC flag.
679      *    get and check flags.
680      * @tc.expected: step1. HITRACE_FLAG_INCLUDE_ASYNC is not enabled.
681      * @tc.steps: step2. start trace with HITRACE_FLAG_INCLUDE_ASYNC flag.
682      *    get and check flags.
683      * @tc.expected: step2. HITRACE_FLAG_INCLUDE_ASYNC is enabled.
684      */
685     /* begin with sync flag */
686     HiTraceId syncId = HiTraceChain::Begin("test sync only", HITRACE_FLAG_TP_INFO);
687     EXPECT_EQ(0, syncId.IsFlagEnabled(HITRACE_FLAG_INCLUDE_ASYNC));
688     HiTraceChain::Tracepoint(HITRACE_TP_CS, syncId, "client send msg: %s", "sync");
689         HiTraceChain::End(syncId);
690     /* begin with async flag */
691     HiTraceId asyncId = HiTraceChain::Begin("test sync+async", HITRACE_FLAG_INCLUDE_ASYNC | HITRACE_FLAG_TP_INFO);
692     EXPECT_EQ(1, asyncId.IsFlagEnabled(HITRACE_FLAG_INCLUDE_ASYNC));
693     HiTraceChain::Tracepoint(HITRACE_TP_CS, asyncId, "client send msg: %s", "async");
694 
695     HiTraceChain::End(asyncId);
696 }
697 
698 /**
699  * @tc.name: Dfx_HiTraceChainCppTest_InvalidParamTest_001
700  * @tc.desc: Start trace with SYNC or ASYNC.
701  * @tc.type: FUNC
702  * @tc.require: AR000CQV9U
703  */
704 HWTEST_F(HiTraceChainCppTest, InvalidParamTest_001, TestSize.Level1)
705 {
706     /**
707      * @tc.steps: step1. start trace with invalid flag and validate trace id.
708      * @tc.expected: step1. trace id is invalid.
709      * @tc.steps: step2. start trace with invalid name and validate trace id.
710      * @tc.expected: step2. trace id is valid.
711      */
712     /* begin with invalid flag */
713     HiTraceId invalidFlagId = HiTraceChain::Begin("invalid param", HITRACE_FLAG_MAX+1);
714     EXPECT_EQ(0, invalidFlagId.IsValid());
715     invalidFlagId = HiTraceChain::Begin("invalid param", -1);
716     EXPECT_EQ(0, invalidFlagId.IsValid());
717     HiTraceChain::End(invalidFlagId);
718 
719     /* begin with invalid name */
720     HiTraceId invalidNameId = HiTraceChain::Begin("", HITRACE_FLAG_TP_INFO);
721     EXPECT_EQ(1, invalidNameId.IsValid());
722     HiTraceChain::End(invalidNameId);
723 }
724 
725 /**
726  * @tc.name: Dfx_HiTraceChainCppTest_HiTraceTest_001
727  * @tc.desc: Start trace with SYNC or ASYNC.
728  * @tc.type: FUNC
729  */
730 HWTEST_F(HiTraceChainCppTest, HiTraceTest_001, TestSize.Level1)
731 {
732     /**
733      * @tc.steps: step1. start trace with invalid flag and validate trace id.
734      * @tc.expected: step1. trace id is invalid.
735      * @tc.steps: step2. start trace with invalid name and validate trace id.
736      * @tc.expected: step2. trace id is valid.
737      */
738     /* begin with invalid flag */
739     HiTraceId invalidFlagId = HiTraceChain::Begin("invalid param", HITRACE_FLAG_MAX+1);
740     EXPECT_EQ(0, invalidFlagId.IsValid());
741     invalidFlagId = HiTraceChain::Begin("invalid param", -1);
742     EXPECT_EQ(0, invalidFlagId.IsValid());
743     HiTraceChain::End(invalidFlagId);
744 
745     /* begin with invalid name */
746     HiTraceId invalidNameId = HiTraceChain::Begin("", HITRACE_FLAG_TP_INFO);
747     EXPECT_EQ(1, invalidNameId.IsValid());
748     HiTraceChain::End(invalidNameId);
749 
750     /* Function interface overlay */
751     int taskId = 123;
752     int count = 1;
753     HiTraceStartTrace(HITRACE_TAG_OHOS, "HiTraceTest001");
754     HiTraceFinishTrace(HITRACE_TAG_OHOS);
755     HiTraceStartAsyncTrace(HITRACE_TAG_OHOS, "HiTraceTest001", taskId);
756     HiTraceFinishAsyncTrace(HITRACE_TAG_OHOS, "HiTraceTest001", taskId);
757     HiTraceCountTrace(HITRACE_TAG_OHOS, "HiTraceTest001", count);
758 }
759 
760 /**
761  * @tc.name: Dfx_HiTraceChainCppTest_HiTraceTest_002
762  * @tc.desc: Create child and grand child span.
763  * @tc.type: FUNC
764  */
765 HWTEST_F(HiTraceChainCppTest, HiTraceTest_002, TestSize.Level1)
766 {
767     /* begin with span flag */
768     HiTraceId id = HiTraceChain::Begin("test", 0);
769     EXPECT_EQ(0, id.GetFlags());
770     EXPECT_EQ(0UL, id.GetSpanId());
771     EXPECT_EQ(0UL, id.GetParentSpanId());
772 
773     /* create child span */
774     HiTraceId childId = HiTraceChain::CreateSpan();
775     EXPECT_EQ(1, childId.IsValid());
776     EXPECT_EQ(childId.GetFlags(), id.GetFlags());
777     EXPECT_EQ(childId.GetChainId(), id.GetChainId());
778     EXPECT_EQ(childId.GetParentSpanId(), id.GetSpanId());
779 
780     /* set child id to thread id */
781     HiTraceChain::SetId(childId);
782 
783     /* Restore child*/
784     HiTraceChain::Restore(childId);
785 
786     /* save child and set child id to thread id */
787     HiTraceChain::SaveAndSet(childId);
788 
789     /* continue to create child span */
790     HiTraceId grandChildId = HiTraceChain::CreateSpan();
791     EXPECT_EQ(1, grandChildId.IsValid());
792     EXPECT_EQ(grandChildId.GetFlags(), id.GetFlags());
793     EXPECT_EQ(grandChildId.GetChainId(), id.GetChainId());
794     EXPECT_EQ(grandChildId.GetParentSpanId(), childId.GetSpanId());
795 
796     /* end */
797     HiTraceChain::End(id);
798 }
799 
800 /**
801  * @tc.name: Dfx_HiTraceChainCppTest_RestoreTest_001
802  * @tc.desc: Start normal trace.
803  * @tc.type: FUNC
804  */
805 HWTEST_F(HiTraceChainCppTest, RestoreTest_001, TestSize.Level1)
806 {
807     /**
808      * @tc.steps: step1. start trace without any flag.
809      * @tc.expected: step1. no flag is enabled.
810      * @tc.steps: step2. generate a temporary trace id.
811      * @tc.expected: step2. a trace id is generated.
812      * @tc.steps: step3. set new trace id and save old trace id.
813      * @tc.expected: step3. new trace id get into TLS.
814      * @tc.steps: step4. store old trace id.
815      * @tc.expected: step4. old trace id get into TLS.
816      * @tc.steps: step5. end trace.
817      * @tc.expected: step5. trace terminate.
818      */
819 
820     // begin trace
821     HiTraceId id = HiTraceChain::Begin("RestoreTest_001", HITRACE_FLAG_TP_INFO);
822 
823     // generate new trace id
824     HiTraceIdStruct tempId{0};
825     HiTraceChainInitId(&tempId);
826     tempId.valid=HITRACE_ID_VALID;
827     HiTraceId newId(tempId);
828     uint64_t chainId = GenerateChainId();
829     uint64_t spanId = GenerateSpanId();
830     uint64_t parentSpanId = GenerateParentSpanId();
831     newId.SetChainId(chainId);
832     newId.SetSpanId(spanId);
833     newId.SetParentSpanId(parentSpanId);
834 
835     // set new id and save old id
836     HiTraceId oldId = HiTraceChain::SaveAndSet(newId);
837     HiTraceId currentId = HiTraceChain::GetId();
838     HiTraceChain::Tracepoint(
839             HITRACE_CM_DEVICE, HITRACE_TP_CS, currentId, "client send msg %d", DEVICE_CLIENT_SEND);
840     HiTraceChain::Tracepoint(
841             HITRACE_CM_PROCESS, HITRACE_TP_CS, currentId, "client send msg %d", PROCESS_CLIENT_SEND);
842     HiTraceChain::Tracepoint(
843             HITRACE_CM_THREAD, HITRACE_TP_CS, currentId, "client send msg %d", THREAD_CLIENT_SEND);
844     HiTraceChain::Tracepoint(
845             HITRACE_CM_DEFAULT, HITRACE_TP_CS, currentId, "client send msg %d", DEFAULT_CLIENT_SEND);
846 
847     // restore old id
848     HiTraceChain::Restore(oldId);
849     HiTraceId currentId2 = HiTraceChain::GetId();
850     EXPECT_EQ(id.GetChainId(), currentId2.GetChainId());
851     EXPECT_EQ(id.GetSpanId(), currentId2.GetSpanId());
852     EXPECT_EQ(id.GetParentSpanId(), currentId2.GetParentSpanId());
853     HiTraceChain::Tracepoint(
854             HITRACE_CM_DEVICE, HITRACE_TP_CS, currentId2, "client send msg %d", DEVICE_CLIENT_SEND);
855     HiTraceChain::Tracepoint(
856             HITRACE_CM_PROCESS, HITRACE_TP_CS, currentId2, "client send msg %d", PROCESS_CLIENT_SEND);
857     HiTraceChain::Tracepoint(
858             HITRACE_CM_THREAD, HITRACE_TP_CS, currentId2, "client send msg %d", THREAD_CLIENT_SEND);
859     HiTraceChain::Tracepoint(
860             HITRACE_CM_DEFAULT, HITRACE_TP_CS, currentId2, "client send msg %d", DEFAULT_CLIENT_SEND);
861 
862     // end trace
863     HiTraceChain::End(id);
864 }
865 
866 /**
867  * @tc.name: Dfx_HiTraceChainCppTest_RestoreTest_002
868  * @tc.desc: Start normal with HITRACE_FLAG_INCLUDE_ASYNC flag.
869  * @tc.type: FUNC
870  */
871 HWTEST_F(HiTraceChainCppTest, RestoreTest_002, TestSize.Level1)
872 {
873     /**
874      * @tc.steps: step1. start trace with flag HITRACE_FLAG_INCLUDE_ASYNC.
875      * @tc.expected: step1. HITRACE_FLAG_INCLUDE_ASYNC flag is enabled.
876      * @tc.steps: step2. generate a temporary trace id.
877      * @tc.expected: step2. a trace id is generated.
878      * @tc.steps: step3. set new trace id and save old trace id.
879      * @tc.expected: step3. new trace id get into TLS.
880      * @tc.steps: step4. store old trace id.
881      * @tc.expected: step4. old trace id get into TLS.
882      * @tc.steps: step5. end trace.
883      * @tc.expected: step5. trace terminate.
884      */
885 
886     // begin trace
887     HiTraceId id = HiTraceChain::Begin("RestoreTest_002", HITRACE_FLAG_TP_INFO | HITRACE_FLAG_INCLUDE_ASYNC);
888 
889     // generate new trace id
890     HiTraceIdStruct tempId{0};
891     HiTraceChainInitId(&tempId);
892     tempId.valid=HITRACE_ID_VALID;
893     HiTraceId newId(tempId);
894     uint64_t chainId = GenerateChainId();
895     uint64_t spanId = GenerateSpanId();
896     uint64_t parentSpanId = GenerateParentSpanId();
897     newId.SetChainId(chainId);
898     newId.SetSpanId(spanId);
899     newId.SetParentSpanId(parentSpanId);
900 
901     // set new id and save old id
902     HiTraceId oldId = HiTraceChain::SaveAndSet(newId);
903     HiTraceId currentId = HiTraceChain::GetId();
904     HiTraceChain::Tracepoint(
905             HITRACE_CM_DEVICE, HITRACE_TP_CS, currentId, "client send msg %d", DEVICE_CLIENT_SEND);
906     HiTraceChain::Tracepoint(
907             HITRACE_CM_PROCESS, HITRACE_TP_CS, currentId, "client send msg %d", PROCESS_CLIENT_SEND);
908     HiTraceChain::Tracepoint(
909             HITRACE_CM_THREAD, HITRACE_TP_CS, currentId, "client send msg %d", THREAD_CLIENT_SEND);
910     HiTraceChain::Tracepoint(
911             HITRACE_CM_DEFAULT, HITRACE_TP_CS, currentId, "client send msg %d", DEFAULT_CLIENT_SEND);
912 
913     // restore old id
914     HiTraceChain::Restore(oldId);
915     HiTraceId currentId2 = HiTraceChain::GetId();
916     ASSERT_TRUE(currentId2.IsFlagEnabled(HITRACE_FLAG_INCLUDE_ASYNC));
917     HiTraceChain::Tracepoint(
918             HITRACE_CM_DEVICE, HITRACE_TP_CS, currentId2, "client send msg %d", DEVICE_CLIENT_SEND);
919     HiTraceChain::Tracepoint(
920             HITRACE_CM_PROCESS, HITRACE_TP_CS, currentId2, "client send msg %d", PROCESS_CLIENT_SEND);
921     HiTraceChain::Tracepoint(
922             HITRACE_CM_THREAD, HITRACE_TP_CS, currentId2, "client send msg %d", THREAD_CLIENT_SEND);
923     HiTraceChain::Tracepoint(
924             HITRACE_CM_DEFAULT, HITRACE_TP_CS, currentId2, "client send msg %d", DEFAULT_CLIENT_SEND);
925 
926     // end trace
927     HiTraceChain::End(id);
928 }
929 
930 /**
931  * @tc.name: Dfx_HiTraceChainCppTest_RestoreTest_003
932  * @tc.desc: Start normal trace and create span.
933  * @tc.type: FUNC
934  */
935 HWTEST_F(HiTraceChainCppTest, RestoreTest_003, TestSize.Level1)
936 {
937     /**
938      * @tc.steps: step1. start trace without any flag, then create span.
939      * @tc.expected: step1. no flag is enabled.
940      * @tc.steps: step2. generate a temporary trace id.
941      * @tc.expected: step2. a trace id is generated.
942      * @tc.steps: step3. set new trace id and save old trace id.
943      * @tc.expected: step3. new trace id get into TLS.
944      * @tc.steps: step4. store old trace id.
945      * @tc.expected: step4. old trace id get into TLS.
946      * @tc.steps: step5. end trace.
947      * @tc.expected: step5. trace terminate.
948      */
949 
950     // begin trace
951     HiTraceId id = HiTraceChain::Begin("RestoreTest_003", HITRACE_FLAG_TP_INFO);
952     HiTraceChain::CreateSpan();
953 
954     // generate new trace id
955     HiTraceIdStruct tempId{0};
956     HiTraceChainInitId(&tempId);
957     tempId.valid=HITRACE_ID_VALID;
958     HiTraceId newId(tempId);
959     uint64_t chainId = GenerateChainId();
960     uint64_t spanId = GenerateSpanId();
961     uint64_t parentSpanId = GenerateParentSpanId();
962     newId.SetChainId(chainId);
963     newId.SetSpanId(spanId);
964     newId.SetParentSpanId(parentSpanId);
965 
966     // set new id and save old id
967     HiTraceId oldId = HiTraceChain::SaveAndSet(newId);
968     HiTraceChain::CreateSpan();
969     HiTraceId currentId = HiTraceChain::GetId();
970     HiTraceChain::Tracepoint(
971             HITRACE_CM_DEVICE, HITRACE_TP_CS, currentId, "client send msg %d", DEVICE_CLIENT_SEND);
972     HiTraceChain::Tracepoint(
973             HITRACE_CM_PROCESS, HITRACE_TP_CS, currentId, "client send msg %d", PROCESS_CLIENT_SEND);
974     HiTraceChain::Tracepoint(
975             HITRACE_CM_THREAD, HITRACE_TP_CS, currentId, "client send msg %d", THREAD_CLIENT_SEND);
976     HiTraceChain::Tracepoint(
977             HITRACE_CM_DEFAULT, HITRACE_TP_CS, currentId, "client send msg %d", DEFAULT_CLIENT_SEND);
978 
979     // restore old id
980     HiTraceChain::Restore(oldId);
981     HiTraceId currentId2 = HiTraceChain::GetId();
982     EXPECT_EQ(id.GetChainId(), currentId2.GetChainId());
983     EXPECT_EQ(id.GetSpanId(), currentId2.GetSpanId());
984     EXPECT_EQ(id.GetParentSpanId(), currentId2.GetParentSpanId());
985     HiTraceChain::Tracepoint(
986             HITRACE_CM_DEVICE, HITRACE_TP_CS, currentId2, "client send msg %d", DEVICE_CLIENT_SEND);
987     HiTraceChain::Tracepoint(
988             HITRACE_CM_PROCESS, HITRACE_TP_CS, currentId2, "client send msg %d", PROCESS_CLIENT_SEND);
989     HiTraceChain::Tracepoint(
990             HITRACE_CM_THREAD, HITRACE_TP_CS, currentId2, "client send msg %d", THREAD_CLIENT_SEND);
991     HiTraceChain::Tracepoint(
992             HITRACE_CM_DEFAULT, HITRACE_TP_CS, currentId2, "client send msg %d", DEFAULT_CLIENT_SEND);
993 
994     // end trace
995     HiTraceChain::End(id);
996 }
997 
998 /**
999  * @tc.name: Dfx_HiTraceChainCppTest_RestoreTest_004
1000  * @tc.desc: Start normal trace.
1001  * @tc.type: FUNC
1002  */
1003 HWTEST_F(HiTraceChainCppTest, RestoreTest_004, TestSize.Level1)
1004 {
1005     /**
1006      * @tc.steps: step1. start trace without any flag.
1007      * @tc.expected: step1. no flag is enabled.
1008      * @tc.steps: step2. generate a temporary trace id with HITRACE_ID_INVALID flag.
1009      * @tc.expected: step2. a trace id is generated.
1010      * @tc.steps: step3. set new trace id and save old trace id.
1011      * @tc.expected: step3. new trace id get into TLS.
1012      * @tc.steps: step4. store old trace id.
1013      * @tc.expected: step4. old trace id get into TLS.
1014      * @tc.steps: step5. end trace.
1015      * @tc.expected: step5. trace terminate.
1016      */
1017 
1018     // begin trace
1019     HiTraceId id = HiTraceChain::Begin("RestoreTest_004", HITRACE_FLAG_TP_INFO);
1020 
1021     // generate new trace id
1022     HiTraceIdStruct tempId{0};
1023     HiTraceChainInitId(&tempId);
1024     tempId.valid=HITRACE_ID_INVALID;
1025     HiTraceId newId(tempId);
1026     uint64_t chainId = GenerateChainId();
1027     uint64_t spanId = GenerateSpanId();
1028     uint64_t parentSpanId = GenerateParentSpanId();
1029     newId.SetChainId(chainId);
1030     newId.SetSpanId(spanId);
1031     newId.SetParentSpanId(parentSpanId);
1032 
1033     // set new id and save old id
1034     HiTraceId oldId = HiTraceChain::SaveAndSet(newId);
1035     HiTraceId currentId = HiTraceChain::GetId();
1036     HiTraceChain::Tracepoint(
1037             HITRACE_CM_DEVICE, HITRACE_TP_CS, currentId, "client send msg %d", DEVICE_CLIENT_SEND);
1038     HiTraceChain::Tracepoint(
1039             HITRACE_CM_PROCESS, HITRACE_TP_CS, currentId, "client send msg %d", PROCESS_CLIENT_SEND);
1040     HiTraceChain::Tracepoint(
1041             HITRACE_CM_THREAD, HITRACE_TP_CS, currentId, "client send msg %d", THREAD_CLIENT_SEND);
1042     HiTraceChain::Tracepoint(
1043             HITRACE_CM_DEFAULT, HITRACE_TP_CS, currentId, "client send msg %d", DEFAULT_CLIENT_SEND);
1044 
1045     // restore old id
1046     HiTraceChain::Restore(oldId);
1047     HiTraceId currentId2 = HiTraceChain::GetId();
1048     EXPECT_EQ(id.GetChainId(), currentId2.GetChainId());
1049     EXPECT_EQ(id.GetSpanId(), currentId2.GetSpanId());
1050     EXPECT_EQ(id.GetParentSpanId(), currentId2.GetParentSpanId());
1051     HiTraceChain::Tracepoint(
1052             HITRACE_CM_DEVICE, HITRACE_TP_CS, currentId2, "client send msg %d", DEVICE_CLIENT_SEND);
1053     HiTraceChain::Tracepoint(
1054             HITRACE_CM_PROCESS, HITRACE_TP_CS, currentId2, "client send msg %d", PROCESS_CLIENT_SEND);
1055     HiTraceChain::Tracepoint(
1056             HITRACE_CM_THREAD, HITRACE_TP_CS, currentId2, "client send msg %d", THREAD_CLIENT_SEND);
1057     HiTraceChain::Tracepoint(
1058             HITRACE_CM_DEFAULT, HITRACE_TP_CS, currentId2, "client send msg %d", DEFAULT_CLIENT_SEND);
1059 
1060     // end trace
1061     HiTraceChain::End(id);
1062 }
1063 
1064 /**
1065  * @tc.name: Dfx_HiTraceChainCppTest_DomainTest_001
1066  * @tc.desc: Start normal trace with domain 0.
1067  * @tc.type: FUNC
1068  */
1069 HWTEST_F(HiTraceChainCppTest, DomainTest_001, TestSize.Level1)
1070 {
1071     unsigned int domain = 0x0;
1072     HiTraceId id = HiTraceChain::Begin("DomainTest_001", HITRACE_FLAG_TP_INFO, domain);
1073     EXPECT_TRUE(id.IsValid());
1074     HiTraceChain::End(id, domain);
1075     id = HiTraceChain::GetId();
1076     EXPECT_FALSE(id.IsValid());
1077 }
1078 
1079 /**
1080  * @tc.name: Dfx_HiTraceChainCppTest_DomainTest_002
1081  * @tc.desc: Start normal trace with domain 0x6666.
1082  * @tc.type: FUNC
1083  */
1084 HWTEST_F(HiTraceChainCppTest, DomainTest_002, TestSize.Level1)
1085 {
1086     unsigned int domain = 0x6666;
1087     HiTraceId id = HiTraceChain::Begin("DomainTest_002", HITRACE_FLAG_TP_INFO, domain);
1088     EXPECT_TRUE(id.IsValid());
1089     HiTraceChain::End(id, domain);
1090     id = HiTraceChain::GetId();
1091     EXPECT_FALSE(id.IsValid());
1092 }
1093 
1094 /**
1095  * @tc.name: Dfx_HiTraceChainCppTest_DomainTest_003
1096  * @tc.desc: Test Tracepoint with domain 0.
1097  * @tc.type: FUNC
1098  */
1099 HWTEST_F(HiTraceChainCppTest, DomainTest_003, TestSize.Level1)
1100 {
1101     unsigned int domain = 0x0;
1102     HiTraceId id = HiTraceChain::Begin("DomainTest_003", HITRACE_FLAG_TP_INFO, domain);
1103     EXPECT_TRUE(id.IsValid());
1104     HiTraceChain::Tracepoint(HITRACE_CM_DEFAULT, HITRACE_TP_CS, id, domain, "client send msg %d", 3);
1105     HiTraceChain::End(id, domain);
1106     id = HiTraceChain::GetId();
1107     EXPECT_FALSE(id.IsValid());
1108 }
1109 
1110 /**
1111  * @tc.name: Dfx_HiTraceChainCppTest_DomainTest_004
1112  * @tc.desc: Test Tracepoint with domain 0x6666.
1113  * @tc.type: FUNC
1114  */
1115 HWTEST_F(HiTraceChainCppTest, DomainTest_004, TestSize.Level1)
1116 {
1117     unsigned int domain = 0x6666;
1118     HiTraceId id = HiTraceChain::Begin("DomainTest_004", HITRACE_FLAG_TP_INFO, domain);
1119     EXPECT_TRUE(id.IsValid());
1120     HiTraceChain::Tracepoint(HITRACE_CM_DEFAULT, HITRACE_TP_CS, id, domain, "client send msg %d", 4);
1121     HiTraceChain::End(id, domain);
1122     id = HiTraceChain::GetId();
1123     EXPECT_FALSE(id.IsValid());
1124 }
1125 
1126 /**
1127  * @tc.name: Dfx_HiTraceChainCppTest_TracepointParamsTest_001
1128  * @tc.desc: Test Tracepoint invalid mode.
1129  * @tc.type: FUNC
1130  */
1131 HWTEST_F(HiTraceChainCppTest, TracepointParamsTest_001, TestSize.Level1)
1132 {
1133     unsigned int domain = 0x6666;
1134     HiTraceId id = HiTraceChain::Begin("TracepointParamsTest_001", HITRACE_FLAG_TP_INFO, domain);
1135     EXPECT_TRUE(id.IsValid());
1136 
1137     // HITRACE_CM_MIN = 0
1138     HiTraceCommunicationMode mode = static_cast<HiTraceCommunicationMode>(-1);
1139     HiTraceTracepointType type = HITRACE_TP_CS;
1140     HiTraceChain::Tracepoint(mode, type, id, domain, "client send %d", 1);
1141     // HITRACE_CM_MAX = 3
1142     mode = static_cast<HiTraceCommunicationMode>(4);
1143     HiTraceChain::Tracepoint(mode, type, id, domain, "client send %d", 1);
1144 
1145     HiTraceChain::End(id, domain);
1146     id = HiTraceChain::GetId();
1147     EXPECT_FALSE(id.IsValid());
1148 }
1149 
1150 /**
1151  * @tc.name: Dfx_HiTraceChainCppTest_TracepointParamsTest_002
1152  * @tc.desc: Test Tracepoint invalid type.
1153  * @tc.type: FUNC
1154  */
1155 HWTEST_F(HiTraceChainCppTest, TracepointParamsTest_002, TestSize.Level1)
1156 {
1157     unsigned int domain = 0x6666;
1158     HiTraceId id = HiTraceChain::Begin("TracepointParamsTest_002", HITRACE_FLAG_TP_INFO, domain);
1159     EXPECT_TRUE(id.IsValid());
1160 
1161     HiTraceCommunicationMode mode = HITRACE_CM_DEFAULT;
1162     // HITRACE_TP_MIN = 0
1163     HiTraceTracepointType type = static_cast<HiTraceTracepointType>(-1);
1164     HiTraceChain::Tracepoint(mode, type, id, domain, "DEFAULT send %d", 2);
1165     // HITRACE_TP_MAX = 4
1166     type = static_cast<HiTraceTracepointType>(5);
1167     HiTraceChain::Tracepoint(mode, type, id, domain, "DEFAULT send %d", 2);
1168 
1169     HiTraceChain::End(id, domain);
1170     id = HiTraceChain::GetId();
1171     EXPECT_FALSE(id.IsValid());
1172 }
1173 
1174 /**
1175  * @tc.name: Dfx_HiTraceChainCppTest_TracepointParamsTest_003
1176  * @tc.desc: Test Tracepoint invalid HiTraceIdStruct.
1177  * @tc.type: FUNC
1178  */
1179 HWTEST_F(HiTraceChainCppTest, TracepointParamsTest_003, TestSize.Level1)
1180 {
1181     unsigned int domain = 0x6666;
1182     HiTraceId id = HiTraceChain::Begin("TracepointParamsTest_003", HITRACE_FLAG_TP_INFO, domain);
1183     EXPECT_TRUE(id.IsValid());
1184 
1185     HiTraceId invalidId = HiTraceChain::Begin("TracepointParamsTest_003", HITRACE_FLAG_TP_INFO, domain);
1186     EXPECT_FALSE(invalidId.IsValid());
1187 
1188     HiTraceCommunicationMode mode = HITRACE_CM_DEFAULT;
1189     HiTraceTracepointType type = HITRACE_TP_CS;
1190     HiTraceChain::Tracepoint(mode, type, invalidId, domain, "client send %d", 3);
1191 
1192     HiTraceChain::End(id, domain);
1193     id = HiTraceChain::GetId();
1194     EXPECT_FALSE(id.IsValid());
1195 }
1196 }  // namespace HiviewDFX
1197 }  // namespace OHOS
1198