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/hitracechainc.h"
17 
18 #include <cstdint>
19 #include <cstdio>
20 #include <gtest/gtest.h>
21 #include <sys/time.h>
22 
23 #include "gtest/gtest-message.h"
24 #include "gtest/gtest-test-part.h"
25 #include "gtest/gtest_pred_impl.h"
26 #include "gtest/hwext/gtest-tag.h"
27 
28 #define ARRAY_FIRST_INDEX 0
29 #define ARRAY_SECOND_INDEX 1
30 #define ARRAY_THIRD_INDEX 2
31 #define HASH_DATA_LENGTH 3
32 
33 #define DEVICE_CLIENT_SEND 12
34 #define PROCESS_CLIENT_SEND 22
35 #define THREAD_CLIENT_SEND 32
36 #define DEFAULT_CLIENT_SEND 42
37 
38 namespace OHOS {
39 namespace HiviewDFX {
40 using namespace testing::ext;
41 
42 #define HITRACE_DEBUG
43 #ifndef HITRACE_DEBUG
44 #define PRINT_ID(p)
45 #else
46 #define PRINT_ID(p)                                                                                                \
47     printf(#p " valid:%d, ver:%d, chain:0x%llx, flags:%x, span:0x%x, pspan:0x%x.\n", static_cast<int>((p)->valid), \
48            static_cast<int>((p)->ver), static_cast<long long>((p)->chainId), static_cast<int>((p)->flags),         \
49            static_cast<int>((p)->spanId), static_cast<int>((p)->parentSpanId))
50 #endif
51 
HiTraceChainTracepointExWithArgsWrapper(HiTraceCommunicationMode mode,HiTraceTracepointType type,const HiTraceIdStruct * pId,const char * fmt,...)52 static void HiTraceChainTracepointExWithArgsWrapper(HiTraceCommunicationMode mode, HiTraceTracepointType type,
53     const HiTraceIdStruct* pId, const char* fmt, ...)
54 {
55     va_list vaList;
56     va_start(vaList, fmt);
57     HiTraceChainTracepointExWithArgs(mode, type, pId, fmt, vaList);
58     va_end(vaList);
59 }
60 
HiTraceChainTracepointWithArgsWrapper(HiTraceTracepointType type,const HiTraceIdStruct * pId,const char * fmt,...)61 static void HiTraceChainTracepointWithArgsWrapper(HiTraceTracepointType type, const HiTraceIdStruct* pId,
62     const char* fmt, ...)
63 {
64     va_list vaList;
65     va_start(vaList, fmt);
66     HiTraceChainTracepointWithArgs(type, pId, fmt, vaList);
67     va_end(vaList);
68 }
69 
HashFunc(const void * pData,uint32_t dataLen)70 static uint64_t HashFunc(const void* pData, uint32_t dataLen)
71 {
72     const uint64_t seed = 131;
73     if ((!pData) || dataLen == 0) {
74         return 0;
75     }
76     uint64_t hash = 0;
77     uint64_t len = dataLen;
78     const char* p = static_cast<const char*>(pData);
79     for (; len > 0; --len) {
80         hash = (hash * seed) + (*p++);
81     }
82     return hash;
83 }
84 
GenerateChainId()85 static uint64_t GenerateChainId()
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_sec;
93     hashData[ARRAY_SECOND_INDEX] = tv.tv_usec;
94     hashData[ARRAY_THIRD_INDEX] = randomNum;
95     uint64_t hash = HashFunc(hashData, HASH_DATA_LENGTH * sizeof(uint64_t));
96     return hash;
97 }
98 
GenerateSpanId()99 static uint64_t GenerateSpanId()
100 {
101     const uint64_t randomNum = 269;
102     uint64_t hashData[HASH_DATA_LENGTH];
103     struct timeval tv;
104     gettimeofday(&tv, nullptr);
105     srand(tv.tv_sec);
106     hashData[ARRAY_FIRST_INDEX] = randomNum;
107     hashData[ARRAY_SECOND_INDEX] = tv.tv_sec;
108     hashData[ARRAY_THIRD_INDEX] = tv.tv_usec;
109     uint64_t hash = HashFunc(hashData, HASH_DATA_LENGTH * sizeof(uint64_t));
110     return hash;
111 }
112 
GenerateParentSpanId()113 static uint64_t GenerateParentSpanId()
114 {
115     const uint64_t randomNum = 269;
116     uint64_t hashData[HASH_DATA_LENGTH];
117     struct timeval tv;
118     gettimeofday(&tv, nullptr);
119     srand(tv.tv_sec);
120     hashData[ARRAY_FIRST_INDEX] = tv.tv_usec;
121     hashData[ARRAY_SECOND_INDEX] = randomNum;
122     hashData[ARRAY_THIRD_INDEX] = tv.tv_sec;
123     uint64_t hash = HashFunc(hashData, HASH_DATA_LENGTH * sizeof(uint64_t));
124     return hash;
125 }
126 
127 class HiTraceChainCTest : public testing::Test {
128 public:
129     static void SetUpTestCase();
130     static void TearDownTestCase();
131     void SetUp();
132     void TearDown();
133 };
134 
SetUpTestCase()135 void HiTraceChainCTest::SetUpTestCase()
136 {}
137 
TearDownTestCase()138 void HiTraceChainCTest::TearDownTestCase()
139 {}
140 
SetUp()141 void HiTraceChainCTest::SetUp()
142 {
143     HiTraceChainClearId();
144 }
145 
TearDown()146 void HiTraceChainCTest::TearDown()
147 {}
148 
149 /**
150  * @tc.name: Dfx_HiTraceChainCTest_IdTest_001
151  * @tc.desc: Get, set and clear trace id
152  * @tc.type: FUNC
153  * @tc.require: AR000CQVA0
154  */
155 HWTEST_F(HiTraceChainCTest, IdTest_001, TestSize.Level1)
156 {
157     /**
158      * @tc.steps: step1. get and validate trace id.
159      * @tc.expected: step1. trace id is invalid.
160      * @tc.steps: step2. construct trace id with chain id, span id, parent span id
161      *     and flags and set it into context, then get and validate it.
162      * @tc.expected: step2. trace id is valid with same chain id, span id, parent
163      *     span id and flags.
164      * @tc.steps: step3. construct invalid trace id and set into context, then get
165      *     and validate it.
166      * @tc.expected: step3. trace id is the same with step2.
167      * @tc.steps: step4. clear trace id, then get and validate it.
168      * @tc.expected: step4. trace id is invalid.
169      */
170     HiTraceIdStruct initId = HiTraceChainGetId();
171     EXPECT_EQ(0, HiTraceChainIsValid(&initId));
172     PRINT_ID(&initId);
173 
174     // set thread id
175     constexpr uint64_t chainId = 0xABCDEF;
176     constexpr uint64_t spanId = 0x12345;
177     constexpr uint64_t parentSpanId = 0x67890;
178     constexpr int flags = HITRACE_FLAG_INCLUDE_ASYNC | HITRACE_FLAG_DONOT_CREATE_SPAN;
179     HiTraceIdStruct setId;
180     HiTraceChainInitId(&setId);
181     HiTraceChainSetChainId(&setId, chainId);
182     HiTraceChainSetFlags(&setId, flags);
183     HiTraceChainSetSpanId(&setId, spanId);
184     HiTraceChainSetParentSpanId(&setId, parentSpanId);
185     PRINT_ID(&setId);
186 
187     HiTraceChainSetId(&setId);
188 
189     HiTraceIdStruct getId = HiTraceChainGetId();
190     EXPECT_EQ(1, HiTraceChainIsValid(&getId));
191     EXPECT_EQ(chainId, HiTraceChainGetChainId(&getId));
192     EXPECT_EQ(HITRACE_FLAG_INCLUDE_ASYNC | HITRACE_FLAG_DONOT_CREATE_SPAN, HiTraceChainGetFlags(&getId));
193     EXPECT_EQ(spanId, HiTraceChainGetSpanId(&getId));
194     EXPECT_EQ(parentSpanId, HiTraceChainGetParentSpanId(&getId));
195     PRINT_ID(&getId);
196 
197     // set invalid id
198     HiTraceIdStruct invalidId;
199     HiTraceChainInitId(&invalidId);
200 
201     HiTraceChainSetId(&invalidId);
202 
203     getId = HiTraceChainGetId();
204     EXPECT_EQ(1, HiTraceChainIsValid(&getId));
205     EXPECT_EQ(chainId, HiTraceChainGetChainId(&getId));
206     EXPECT_EQ(HITRACE_FLAG_INCLUDE_ASYNC | HITRACE_FLAG_DONOT_CREATE_SPAN, HiTraceChainGetFlags(&getId));
207     EXPECT_EQ(spanId, HiTraceChainGetSpanId(&getId));
208     EXPECT_EQ(parentSpanId, HiTraceChainGetParentSpanId(&getId));
209     PRINT_ID(&getId);
210 
211     // clear thread id
212     HiTraceChainClearId();
213 
214     HiTraceIdStruct clearId = HiTraceChainGetId();
215     EXPECT_EQ(0, HiTraceChainIsValid(&clearId));
216     PRINT_ID(&clearId);
217 }
218 
219 /**
220  * @tc.name: Dfx_HiTraceChainCTest_IntfTest_001
221  * @tc.desc: Interconversion between trace id and bytes array.
222  * @tc.type: FUNC
223  * @tc.require: AR000CQV9T
224  */
225 HWTEST_F(HiTraceChainCTest, IntfTest_001, TestSize.Level1)
226 {
227     /**
228      * @tc.steps: step1. construct trace id and validate it.
229      * @tc.expected: step1. trace id is valid.
230      * @tc.steps: step2. convert trace id to bytes array.
231      * @tc.expected: step2. convert success when array size >= id length.
232      * @tc.steps: step3. convert bytes array to trace id.
233      * @tc.expected: step3. convert success only when array size == id length.
234      * @tc.steps: step4. convert invalid id to bytes array.
235      * @tc.expected: step4. convert fail.
236      * @tc.steps: step5. convert invalid bytes array to id.
237      * @tc.expected: step5. convert fail.
238      */
239     // id to bytes
240     constexpr uint64_t chainId = 0xABCDEF;
241     constexpr uint64_t spanId = 0x12345;
242     constexpr uint64_t parentSpanId = 0x67890;
243     constexpr int flags = HITRACE_FLAG_INCLUDE_ASYNC | HITRACE_FLAG_DONOT_CREATE_SPAN;
244     HiTraceIdStruct id = {HITRACE_ID_VALID, HITRACE_VER_1, chainId, flags, spanId, parentSpanId};
245     EXPECT_EQ(1, HiTraceChainIsValid(&id));
246     PRINT_ID(&id);
247 
248     constexpr int idLen = sizeof(HiTraceIdStruct);
249     uint8_t bytes[idLen + 1];
250     int len = HiTraceChainIdToBytes(&id, bytes, idLen - 1);
251     EXPECT_EQ(0, len);
252     len = HiTraceChainIdToBytes(&id, bytes, idLen + 1);
253     EXPECT_EQ(idLen, len);
254     len = HiTraceChainIdToBytes(&id, bytes, idLen);
255     EXPECT_EQ(idLen, len);
256     PRINT_ID(reinterpret_cast<HiTraceIdStruct*>(bytes));
257 
258     // bytes to id
259     HiTraceIdStruct bytesToId = HiTraceChainBytesToId(bytes, idLen - 1);
260     EXPECT_EQ(0, HiTraceChainIsValid(&bytesToId));
261     bytesToId = HiTraceChainBytesToId(bytes, idLen + 1);
262     EXPECT_EQ(0, HiTraceChainIsValid(&bytesToId));
263     bytesToId = HiTraceChainBytesToId(bytes, idLen);
264     EXPECT_EQ(1, HiTraceChainIsValid(&bytesToId));
265     EXPECT_EQ(chainId, HiTraceChainGetChainId(&bytesToId));
266     EXPECT_EQ(HITRACE_FLAG_INCLUDE_ASYNC | HITRACE_FLAG_DONOT_CREATE_SPAN, HiTraceChainGetFlags(&bytesToId));
267     EXPECT_EQ(spanId, HiTraceChainGetSpanId(&bytesToId));
268     EXPECT_EQ(parentSpanId, HiTraceChainGetParentSpanId(&bytesToId));
269     PRINT_ID(&bytesToId);
270 
271     // set invalid id
272     HiTraceIdStruct invalidId;
273     HiTraceChainInitId(&invalidId);
274     EXPECT_EQ(0, HiTraceChainIdToBytes(&invalidId, bytes, idLen));
275     invalidId = HiTraceChainBytesToId(nullptr, idLen);
276     EXPECT_EQ(0, HiTraceChainIsValid(&invalidId));
277 }
278 
279 /**
280  * @tc.name: Dfx_HiTraceChainCTest_IntfTest_002
281  * @tc.desc: Start and stop trace.
282  * @tc.type: FUNC
283  * @tc.require: AR000CQV9T
284  */
285 HWTEST_F(HiTraceChainCTest, IntfTest_002, TestSize.Level1)
286 {
287     /**
288      * @tc.steps: step1. start trace with flags, get trace id and validit it.
289      * @tc.expected: step1. trace id and flags is valid.
290      * @tc.steps: step2. stop trace, get trace id and validit it.
291      * @tc.expected: step2. trace id is invalid.
292      */
293     // begin
294     HiTraceIdStruct beginId = HiTraceChainBegin("test", HITRACE_FLAG_INCLUDE_ASYNC | HITRACE_FLAG_NO_BE_INFO);
295     EXPECT_EQ(1, HiTraceChainIsValid(&beginId));
296     EXPECT_EQ(1, HiTraceChainIsFlagEnabled(&beginId, HITRACE_FLAG_INCLUDE_ASYNC));
297     EXPECT_EQ(1, HiTraceChainIsFlagEnabled(&beginId, HITRACE_FLAG_NO_BE_INFO));
298     PRINT_ID(&beginId);
299 
300     // end
301     HiTraceChainEnd(&beginId);
302 
303     HiTraceIdStruct endId = HiTraceChainGetId();
304     EXPECT_EQ(0, HiTraceChainIsValid(&endId));
305     PRINT_ID(&endId);
306 }
307 
308 /**
309  * @tc.name: Dfx_HiTraceChainCTest_IntfTest_003
310  * @tc.desc: Start and stop trace with reentered.
311  * @tc.type: FUNC
312  * @tc.require: AR000CQV9T
313  */
314 HWTEST_F(HiTraceChainCTest, IntfTest_003, TestSize.Level1)
315 {
316     /**
317      * @tc.steps: step1. start trace twice and get 2nd trace id.
318      * @tc.expected: step1. 2nd trace is invalid.
319      * @tc.steps: step2. get trace id and check.
320      * @tc.expected: step2. trace id is valid and same with 1st id.
321      * @tc.steps: step3. set chain id with wrong id and get trace id.
322      * @tc.expected: step3. trace id is valid and same with 1st id.
323      * @tc.steps: step4. stop trace twice and get trace id.
324      * @tc.expected: step4. trace id is invalid.
325      */
326     HiTraceIdStruct beginId = HiTraceChainBegin("begin", HITRACE_FLAG_INCLUDE_ASYNC);
327     PRINT_ID(&beginId);
328 
329     // reenter begin
330     HiTraceIdStruct reBeginId = HiTraceChainBegin("reenter begin", HITRACE_FLAG_TP_INFO);
331     EXPECT_EQ(0, HiTraceChainIsValid(&reBeginId));
332     EXPECT_NE(HiTraceChainGetChainId(&reBeginId), HiTraceChainGetChainId(&beginId));
333     EXPECT_EQ(0, HiTraceChainIsFlagEnabled(&reBeginId, HITRACE_FLAG_INCLUDE_ASYNC));
334     EXPECT_EQ(0, HiTraceChainIsFlagEnabled(&reBeginId, HITRACE_FLAG_TP_INFO));
335     PRINT_ID(&reBeginId);
336 
337     // reenter end
338     HiTraceChainEnd(&reBeginId);
339 
340     HiTraceIdStruct endId = HiTraceChainGetId();
341     EXPECT_EQ(1, HiTraceChainIsValid(&endId));
342     EXPECT_EQ(HiTraceChainGetChainId(&endId), HiTraceChainGetChainId(&beginId));
343     EXPECT_EQ(1, HiTraceChainIsFlagEnabled(&endId, HITRACE_FLAG_INCLUDE_ASYNC));
344     EXPECT_EQ(0, HiTraceChainIsFlagEnabled(&endId, HITRACE_FLAG_TP_INFO));
345     PRINT_ID(&endId);
346 
347     // end with wrong chainId
348     HiTraceIdStruct wrongBeginId = beginId;
349     HiTraceChainSetChainId(&wrongBeginId, HiTraceChainGetChainId(&beginId) + 1);
350     HiTraceChainEnd(&wrongBeginId);
351 
352     HiTraceIdStruct wrongEndId = HiTraceChainGetId();
353     EXPECT_EQ(1, HiTraceChainIsValid(&wrongEndId));
354     EXPECT_EQ(HiTraceChainGetChainId(&wrongEndId), HiTraceChainGetChainId(&beginId));
355     EXPECT_EQ(1, HiTraceChainIsFlagEnabled(&wrongEndId, HITRACE_FLAG_INCLUDE_ASYNC));
356     PRINT_ID(&wrongEndId);
357 
358     // end
359     HiTraceChainEnd(&beginId);
360 
361     HiTraceIdStruct reEndId = HiTraceChainGetId();
362     EXPECT_EQ(0, HiTraceChainIsValid(&reEndId));
363     PRINT_ID(&reEndId);
364 
365     // end with invalid thread id
366     HiTraceChainEnd(&beginId);
367 
368     HiTraceIdStruct endInvalidId = HiTraceChainGetId();
369     EXPECT_EQ(0, HiTraceChainIsValid(&endInvalidId));
370     PRINT_ID(&endInvalidId);
371 }
372 
373 /**
374  * @tc.name: Dfx_HiTraceChainCTest_SpanTest_001
375  * @tc.desc: Create child and grand child span.
376  * @tc.type: FUNC
377  * @tc.require: AR000CQVA2
378  */
379 HWTEST_F(HiTraceChainCTest, SpanTest_001, TestSize.Level1)
380 {
381     /**
382      * @tc.steps: step1. start trace without HITRACE_FLAG_DONOT_CREATE_SPAN,
383      *     get and check flags.
384      * @tc.expected: step1. flags is same with set and span id is 0.
385      * @tc.steps: step2. create child id.
386      * @tc.expected: step2. child id has same span id with parent.
387      * @tc.steps: step3. set child id into context.
388      * @tc.steps: step4. create grand child id.
389      * @tc.expected: step4. grand child id has same span id with parent and child.
390      */
391     HiTraceIdStruct id = HiTraceChainBegin("test", 0);
392     EXPECT_EQ(0, HiTraceChainGetFlags(&id));
393     EXPECT_EQ(0UL, HiTraceChainGetSpanId(&id));
394     EXPECT_EQ(0UL, HiTraceChainGetParentSpanId(&id));
395     PRINT_ID(&id);
396 
397     // create child span
398     HiTraceIdStruct childId = HiTraceChainCreateSpan();
399     EXPECT_EQ(1, HiTraceChainIsValid(&childId));
400     EXPECT_EQ(HiTraceChainGetFlags(&childId), HiTraceChainGetFlags(&id));
401     EXPECT_EQ(HiTraceChainGetChainId(&childId), HiTraceChainGetChainId(&id));
402     EXPECT_EQ(HiTraceChainGetParentSpanId(&childId), HiTraceChainGetSpanId(&id));
403     PRINT_ID(&childId);
404 
405     // set child id to thread id
406     HiTraceChainSetId(&childId);
407 
408     // continue to create child span
409     HiTraceIdStruct grandChildId = HiTraceChainCreateSpan();
410     EXPECT_EQ(1, HiTraceChainIsValid(&grandChildId));
411     EXPECT_EQ(HiTraceChainGetFlags(&grandChildId), HiTraceChainGetFlags(&id));
412     EXPECT_EQ(HiTraceChainGetChainId(&grandChildId), HiTraceChainGetChainId(&id));
413     EXPECT_EQ(HiTraceChainGetParentSpanId(&grandChildId), HiTraceChainGetSpanId(&childId));
414     PRINT_ID(&grandChildId);
415 
416     // end
417     HiTraceChainEnd(&id);
418 }
419 
420 /**
421  * @tc.name: Dfx_HiTraceChainCTest_SpanTest_002
422  * @tc.desc: Start and stop trace with reentered.
423  * @tc.type: FUNC
424  * @tc.require: AR000CQVA2
425  */
426 HWTEST_F(HiTraceChainCTest, SpanTest_002, TestSize.Level1)
427 {
428     /**
429      * @tc.steps: step1. start trace with HITRACE_FLAG_DONOT_CREATE_SPAN,
430      *     get and check flags.
431      * @tc.expected: step1. HITRACE_FLAG_DONOT_CREATE_SPAN is enabled.
432      * @tc.steps: step2. create child id.
433      * @tc.expected: step2. child id is same with parent id.
434      */
435     // begin with "donot create span" flag
436     HiTraceIdStruct id = HiTraceChainBegin("test", HITRACE_FLAG_DONOT_CREATE_SPAN);
437     EXPECT_EQ(1, HiTraceChainIsFlagEnabled(&id, HITRACE_FLAG_DONOT_CREATE_SPAN));
438     PRINT_ID(&id);
439 
440     // create child span
441     HiTraceIdStruct childId = HiTraceChainCreateSpan();
442     EXPECT_EQ(1, HiTraceChainIsValid(&childId));
443     EXPECT_EQ(HiTraceChainGetFlags(&childId), HiTraceChainGetFlags(&id));
444     EXPECT_EQ(HiTraceChainGetChainId(&childId), HiTraceChainGetChainId(&id));
445     EXPECT_EQ(HiTraceChainGetSpanId(&childId), HiTraceChainGetSpanId(&id));
446     EXPECT_EQ(HiTraceChainGetParentSpanId(&childId), HiTraceChainGetParentSpanId(&id));
447     PRINT_ID(&childId);
448 
449     // end
450     HiTraceChainEnd(&id);
451 }
452 
453 /**
454  * @tc.name: Dfx_HiTraceChainCTest_TracepointTest_001
455  * @tc.desc: Start trace with HITRACE_FLAG_TP_INFO flag.
456  * @tc.type: FUNC
457  * @tc.require: AR000CQVA3
458  */
459 HWTEST_F(HiTraceChainCTest, TracepointTest_001, TestSize.Level1)
460 {
461     /**
462      * @tc.steps: step1. start trace with HITRACE_FLAG_TP_INFO,
463      *     get and check flags.
464      * @tc.expected: step1. HITRACE_FLAG_TP_INFO is enabled.
465      * @tc.steps: step2. add trace point info with id and check logs.
466      * @tc.expected: step2. trace point can be found in logs.
467      * @tc.steps: step2. add trace point info with null and check logs.
468      * @tc.expected: step2. trace point cannot be found in logs.
469      */
470     HiTraceIdStruct id = HiTraceChainBegin("test tp flag", HITRACE_FLAG_TP_INFO);
471     EXPECT_EQ(1, HiTraceChainIsFlagEnabled(&id, HITRACE_FLAG_TP_INFO));
472     HiTraceChainTracepoint(HITRACE_TP_CS, &id, "client send msg content %d", 12);
473 
474     HiTraceChainTracepoint(HITRACE_TP_CS, nullptr, "client send msg content %d", 12);
475 
476     HiTraceChainEnd(&id);
477 }
478 
479 /**
480  * @tc.name: Dfx_HiTraceChainCTest_TracepointTest_002
481  * @tc.desc: Start trace without HITRACE_FLAG_TP_INFO flag.
482  * @tc.type: FUNC
483  * @tc.require: AR000CQVA3
484  */
485 HWTEST_F(HiTraceChainCTest, TracepointTest_002, TestSize.Level1)
486 {
487     /**
488      * @tc.steps: step1. start trace without HITRACE_FLAG_TP_INFO flag.
489      *     get and check flags.
490      * @tc.expected: step1. HITRACE_FLAG_TP_INFO is not enabled.
491      * @tc.steps: step2. add trace point info with id and check logs.
492      * @tc.expected: step2. trace point cannot be found in logs.
493      */
494     // begin with tp flag
495     HiTraceIdStruct id = HiTraceChainBegin("test no tp flag", HITRACE_FLAG_INCLUDE_ASYNC);
496     EXPECT_EQ(0, HiTraceChainIsFlagEnabled(&id, HITRACE_FLAG_TP_INFO));
497     HiTraceChainTracepoint(HITRACE_TP_CS, &id, "client send msg content %d", 12);
498 
499     HiTraceChainEnd(&id);
500 }
501 
502 /**
503  * @tc.name: Dfx_HiTraceChainCTest_TracepointTest_003
504  * @tc.desc: Start trace with HITRACE_FLAG_D2D_TP_INFO flag.
505  * @tc.type: FUNC
506  * @tc.require: AR000CQVA3
507  */
508 HWTEST_F(HiTraceChainCTest, TracepointTest_003, TestSize.Level1)
509 {
510     /**
511      * @tc.steps: step1. start trace with HITRACE_FLAG_D2D_TP_INFO,
512      *     get and check flags.
513      * @tc.expected: step1. HITRACE_FLAG_D2D_TP_INFO is enabled.
514      * @tc.steps: step2. add D2D trace point info with id and check logs.
515      * @tc.expected: step2. trace point can be found in logs.
516      * @tc.steps: step2. add D2D trace point info with null and check logs.
517      * @tc.expected: step2. trace point cannot be found in logs.
518      * @tc.steps: step3. add trace point info with id and check logs.
519      * @tc.expected: step3. trace point cannot be found in logs.
520      */
521     HiTraceIdStruct id = HiTraceChainBegin("test D2D tp flag", HITRACE_FLAG_D2D_TP_INFO);
522     EXPECT_EQ(1, HiTraceChainIsFlagEnabled(&id, HITRACE_FLAG_D2D_TP_INFO));
523     HiTraceChainTracepointEx(HITRACE_CM_DEVICE, HITRACE_TP_CS, &id, "client send msg content %d", 12);
524     HiTraceChainTracepointEx(HITRACE_CM_PROCESS, HITRACE_TP_CS, &id, "cannot be found %d", 22);
525     HiTraceChainTracepointEx(HITRACE_CM_THREAD, HITRACE_TP_CS, &id, "cannot be found %d", 32);
526     HiTraceChainTracepointEx(HITRACE_CM_DEFAULT, HITRACE_TP_CS, &id, "cannot be found %d", 42);
527 
528     HiTraceChainTracepointEx(HITRACE_CM_DEVICE, HITRACE_TP_CS, nullptr, "cannot be found %d", 13);
529 
530     HiTraceChainTracepoint(HITRACE_TP_CS, &id, "cannot be found %d", 14);
531 
532     HiTraceChainEnd(&id);
533 }
534 
535 /**
536  * @tc.name: Dfx_HiTraceChainCTest_TracepointTest_004
537  * @tc.desc: Start trace without HITRACE_FLAG_D2D_TP_INFO flag.
538  * @tc.type: FUNC
539  * @tc.require: AR000CQVA3
540  */
541 HWTEST_F(HiTraceChainCTest, TracepointTest_004, TestSize.Level1)
542 {
543     /**
544      * @tc.steps: step1. start trace without HITRACE_FLAG_D2D_TP_INFO flag.
545      *     get and check flags.
546      * @tc.expected: step1. HITRACE_FLAG_D2D_TP_INFO is not enabled.
547      * @tc.steps: step2. add D2D trace point info with id and check logs.
548      * @tc.expected: step2. trace point cannot be found in logs.
549      */
550     HiTraceIdStruct id = HiTraceChainBegin("test no D2D tp flag", HITRACE_FLAG_INCLUDE_ASYNC);
551     EXPECT_EQ(0, HiTraceChainIsFlagEnabled(&id, HITRACE_FLAG_D2D_TP_INFO));
552     HiTraceChainTracepointEx(HITRACE_CM_DEVICE, HITRACE_TP_CS, &id, "cannot be found %d", 12);
553     HiTraceChainTracepointEx(HITRACE_CM_PROCESS, HITRACE_TP_CS, &id, "cannot be found %d", 22);
554     HiTraceChainTracepointEx(HITRACE_CM_THREAD, HITRACE_TP_CS, &id, "cannot be found %d", 32);
555     HiTraceChainTracepointEx(HITRACE_CM_DEFAULT, HITRACE_TP_CS, &id, "cannot be found %d", 42);
556 
557     HiTraceChainEnd(&id);
558 }
559 
560 /**
561  * @tc.name: Dfx_HiTraceChainCTest_TracepointTest_005
562  * @tc.desc: Start trace with HITRACE_FLAG_D2D_TP_INFO and HITRACE_FLAG_TP_INFO flag.
563  * @tc.type: FUNC
564  * @tc.require: AR000CQVA3
565  */
566 HWTEST_F(HiTraceChainCTest, TracepointTest_005, TestSize.Level1)
567 {
568     /**
569      * @tc.steps: step1. start trace with HITRACE_FLAG_D2D_TP_INFO | HITRACE_FLAG_TP_INFO,
570      *     get and check flags.
571      * @tc.expected: step1. HITRACE_FLAG_D2D_TP_INFO is enabled.
572      * @tc.expected: step1. HITRACE_FLAG_TP_INFO is enabled.
573      * @tc.steps: step2. add D2D trace point info with id and check logs.
574      * @tc.expected: step2. trace point can be found in logs.
575      * @tc.steps: step3. add trace point info with id and check logs.
576      * @tc.expected: step3. trace point can be found in logs.
577      */
578     HiTraceIdStruct id = HiTraceChainBegin("test D2D | TP tp flag", HITRACE_FLAG_D2D_TP_INFO | HITRACE_FLAG_TP_INFO);
579     EXPECT_EQ(1, HiTraceChainIsFlagEnabled(&id, HITRACE_FLAG_D2D_TP_INFO));
580     EXPECT_EQ(1, HiTraceChainIsFlagEnabled(&id, HITRACE_FLAG_TP_INFO));
581     HiTraceChainTracepointEx(HITRACE_CM_DEVICE, HITRACE_TP_CS, &id, "client send msg content %d", 12);
582     HiTraceChainTracepointEx(HITRACE_CM_PROCESS, HITRACE_TP_CS, &id, "client send msg content %d", 22);
583     HiTraceChainTracepointEx(HITRACE_CM_THREAD, HITRACE_TP_CS, &id, "client send msg content %d", 32);
584     HiTraceChainTracepointEx(HITRACE_CM_DEFAULT, HITRACE_TP_CS, &id, "client send msg content %d", 42);
585 
586     HiTraceChainTracepoint(HITRACE_TP_CS, &id, "client send msg content %d", 13);
587 
588     HiTraceChainEnd(&id);
589 }
590 
591 /**
592  * @tc.name: Dfx_HiTraceChainCTest_TracepointTest_006
593  * @tc.desc: Start trace without HITRACE_FLAG_D2D_TP_INFO, but with HITRACE_FLAG_TP_INFO flag.
594  * @tc.type: FUNC
595  * @tc.require: AR000CQVA3
596  */
597 HWTEST_F(HiTraceChainCTest, TracepointTest_006, TestSize.Level1)
598 {
599     /**
600      * @tc.steps: step1. start trace with HITRACE_FLAG_TP_INFO flag.
601      *     get and check flags.
602      * @tc.expected: step1. HITRACE_FLAG_D2D_TP_INFO is not enabled.
603      * * @tc.expected: step1. HITRACE_FLAG_TP_INFO is enabled.
604      * @tc.steps: step2. add D2D trace point info with id and check logs.
605      * @tc.expected: step2. trace point can be found in logs.
606      * @tc.steps: step2. add trace point info with id and check logs.
607      * @tc.expected: step2. trace point can be found in logs.
608      */
609     HiTraceIdStruct id = HiTraceChainBegin("test no D2D, but tp flag", HITRACE_FLAG_TP_INFO);
610     EXPECT_EQ(0, HiTraceChainIsFlagEnabled(&id, HITRACE_FLAG_D2D_TP_INFO));
611     EXPECT_EQ(1, HiTraceChainIsFlagEnabled(&id, HITRACE_FLAG_TP_INFO));
612     HiTraceChainTracepointEx(HITRACE_CM_DEVICE, HITRACE_TP_CS, &id, "client send msg content %d", 12);
613     HiTraceChainTracepointEx(HITRACE_CM_PROCESS, HITRACE_TP_CS, &id, "client send msg content %d", 22);
614     HiTraceChainTracepointEx(HITRACE_CM_THREAD, HITRACE_TP_CS, &id, "client send msg content %d", 32);
615     HiTraceChainTracepointEx(HITRACE_CM_DEFAULT, HITRACE_TP_CS, &id, "client send msg content %d", 42);
616 
617     HiTraceChainTracepoint(HITRACE_TP_CS, &id, "client send msg content %d", 13);
618 
619     HiTraceChainEnd(&id);
620 }
621 
622 /**
623  * @tc.name: Dfx_HiTraceChainCTest_TracepointTest_007
624  * @tc.desc: Start trace without HITRACE_FLAG_D2D_TP_INFO, but with HITRACE_FLAG_TP_INFO flag.
625  * @tc.type: FUNC
626  * @tc.require: AR000CQVA3
627  */
628 HWTEST_F(HiTraceChainCTest, TracepointTest_007, TestSize.Level1)
629 {
630     /**
631      * @tc.steps: step1. start trace with HITRACE_FLAG_TP_INFO flag.
632      *     get and check flags.
633      * @tc.expected: step1. HITRACE_FLAG_D2D_TP_INFO is not enabled.
634      * * @tc.expected: step1. HITRACE_FLAG_TP_INFO is enabled.
635      * @tc.steps: step2. add D2D trace point info with id and check logs.
636      * @tc.expected: step2. trace point can be found in logs.
637      * @tc.steps: step2. add trace point info with id and check logs.
638      * @tc.expected: step2. trace point can be found in logs.
639      */
640     HiTraceIdStruct id = HiTraceChainBegin("test no D2D, but tp flag", HITRACE_FLAG_TP_INFO);
641     EXPECT_EQ(0, HiTraceChainIsFlagEnabled(&id, HITRACE_FLAG_D2D_TP_INFO));
642     EXPECT_EQ(1, HiTraceChainIsFlagEnabled(&id, HITRACE_FLAG_TP_INFO));
643     HiTraceChainTracepointExWithArgsWrapper(HITRACE_CM_DEVICE, HITRACE_TP_CS, &id, "client send msg content %d", 12);
644     HiTraceChainTracepointExWithArgsWrapper(HITRACE_CM_PROCESS, HITRACE_TP_CS, &id, "client send msg content %d", 22);
645     HiTraceChainTracepointExWithArgsWrapper(HITRACE_CM_THREAD, HITRACE_TP_CS, &id, "client send msg content %d", 32);
646     HiTraceChainTracepointExWithArgsWrapper(HITRACE_CM_DEFAULT, HITRACE_TP_CS, &id, "client send msg content %d", 42);
647 
648     HiTraceChainTracepointWithArgsWrapper(HITRACE_TP_CS, &id, "client send msg content %d", 13);
649 
650     HiTraceChainEnd(&id);
651 }
652 
653 /**
654  * @tc.name: Dfx_HiTraceChainCTest_SyncAsyncTest_001
655  * @tc.desc: Start trace with SYNC or ASYNC.
656  * @tc.type: FUNC
657  * @tc.require: AR000CQ0G7
658  */
659 HWTEST_F(HiTraceChainCTest, SyncAsyncTest_001, TestSize.Level1)
660 {
661     /**
662      * @tc.steps: step1. start trace without HITRACE_FLAG_INCLUDE_ASYNC flag.
663      *    get and check flags.
664      * @tc.expected: step1. HITRACE_FLAG_INCLUDE_ASYNC is not enabled.
665      * @tc.steps: step2. start trace with HITRACE_FLAG_INCLUDE_ASYNC flag.
666      *    get and check flags.
667      * @tc.expected: step2. HITRACE_FLAG_INCLUDE_ASYNC is enabled.
668      */
669     // begin with sync flag
670     HiTraceIdStruct syncId = HiTraceChainBegin("test sync only", HITRACE_FLAG_TP_INFO);
671     EXPECT_EQ(0, HiTraceChainIsFlagEnabled(&syncId, HITRACE_FLAG_INCLUDE_ASYNC));
672     HiTraceChainTracepoint(HITRACE_TP_CS, &syncId, "client send msg: %s", "sync");
673 
674     HiTraceChainEnd(&syncId);
675 
676     // begin with async flag
677     HiTraceIdStruct asyncId = HiTraceChainBegin("test sync+async", HITRACE_FLAG_INCLUDE_ASYNC | HITRACE_FLAG_TP_INFO);
678     EXPECT_EQ(1, HiTraceChainIsFlagEnabled(&asyncId, HITRACE_FLAG_INCLUDE_ASYNC));
679     HiTraceChainTracepoint(HITRACE_TP_CS, &asyncId, "client send msg: %s", "async");
680 
681     HiTraceChainEnd(&asyncId);
682 }
683 
684 /**
685  * @tc.name: Dfx_HiTraceChainCTest_RestoreTest_001
686  * @tc.desc: Start normal trace.
687  * @tc.type: FUNC
688  */
689 HWTEST_F(HiTraceChainCTest, RestoreTest_001, TestSize.Level1)
690 {
691     /**
692      * @tc.steps: step1. start trace without any flag.
693      * @tc.expected: step1. no flag is enabled.
694      * @tc.steps: step2. generate a temporary trace id.
695      * @tc.expected: step2. a trace id is generated.
696      * @tc.steps: step3. set new trace id and save old trace id.
697      * @tc.expected: step3. new trace id get into TLS.
698      * @tc.steps: step4. store old trace id.
699      * @tc.expected: step4. old trace id get into TLS.
700      * @tc.steps: step5. end trace.
701      * @tc.expected: step5. trace terminate.
702      */
703 
704     // begin trace
705     HiTraceIdStruct id = HiTraceChainBegin("RestoreTest_001", HITRACE_FLAG_TP_INFO);
706     PRINT_ID(&id);
707 
708     //generate new trace id
709     HiTraceIdStruct newId{0};
710     HiTraceChainInitId(&newId);
711     newId.valid=HITRACE_ID_VALID;
712     uint64_t chainId = GenerateChainId();
713     uint64_t spanId = GenerateSpanId();
714     uint64_t parentSpanId = GenerateParentSpanId();
715     HiTraceChainSetChainId(&newId, chainId);
716     HiTraceChainSetSpanId(&newId, spanId);
717     HiTraceChainSetParentSpanId(&newId, parentSpanId);
718     PRINT_ID(&newId);
719 
720     // set new id and save old id
721     HiTraceIdStruct oldId = HiTraceChainSaveAndSetId(&newId);
722     PRINT_ID(&oldId);
723     HiTraceIdStruct currentId = HiTraceChainGetId();
724     HiTraceChainTracepointExWithArgsWrapper(
725             HITRACE_CM_DEVICE, HITRACE_TP_CS, &currentId, "client send msg %d", DEVICE_CLIENT_SEND);
726     HiTraceChainTracepointExWithArgsWrapper(
727             HITRACE_CM_PROCESS, HITRACE_TP_CS, &currentId, "client send msg %d", PROCESS_CLIENT_SEND);
728     HiTraceChainTracepointExWithArgsWrapper(
729             HITRACE_CM_THREAD, HITRACE_TP_CS, &currentId, "client send msg %d", THREAD_CLIENT_SEND);
730     HiTraceChainTracepointExWithArgsWrapper(
731             HITRACE_CM_DEFAULT, HITRACE_TP_CS, &currentId, "client send msg %d", DEFAULT_CLIENT_SEND);
732 
733     // restore old id
734     HiTraceChainRestoreId(&oldId);
735     HiTraceIdStruct currentId2 = HiTraceChainGetId();
736     EXPECT_EQ(HiTraceChainGetChainId(&id), HiTraceChainGetChainId(&currentId2));
737     EXPECT_EQ(HiTraceChainGetSpanId(&id), HiTraceChainGetParentSpanId(&currentId2));
738     EXPECT_EQ(HiTraceChainGetParentSpanId(&id), HiTraceChainGetParentSpanId(&currentId2));
739     HiTraceChainTracepointExWithArgsWrapper(
740             HITRACE_CM_DEVICE, HITRACE_TP_CS, &currentId, "client send msg %d", DEVICE_CLIENT_SEND);
741     HiTraceChainTracepointExWithArgsWrapper(
742             HITRACE_CM_PROCESS, HITRACE_TP_CS, &currentId, "client send msg %d", PROCESS_CLIENT_SEND);
743     HiTraceChainTracepointExWithArgsWrapper(
744             HITRACE_CM_THREAD, HITRACE_TP_CS, &currentId, "client send msg %d", THREAD_CLIENT_SEND);
745     HiTraceChainTracepointExWithArgsWrapper(
746             HITRACE_CM_DEFAULT, HITRACE_TP_CS, &currentId, "client send msg %d", DEFAULT_CLIENT_SEND);
747 
748     // end trace
749     HiTraceChainEnd(&id);
750 }
751 
752 /**
753  * @tc.name: Dfx_HiTraceChainCTest_RestoreTest_002
754  * @tc.desc: Start trace with HITRACE_FLAG_INCLUDE_ASYNC.
755  * @tc.type: FUNC
756  */
757 HWTEST_F(HiTraceChainCTest, RestoreTest_002, TestSize.Level1)
758 {
759     /**
760      * @tc.steps: step1. start trace with flag HITRACE_FLAG_INCLUDE_ASYNC.
761      * @tc.expected: step1. flag HITRACE_FLAG_INCLUDE_ASYNC is enabled.
762      * @tc.steps: step2. generate a temporary trace id.
763      * @tc.expected: step2. a trace id is generated.
764      * @tc.steps: step3. set new trace id and save old trace id.
765      * @tc.expected: step3. new trace id get into TLS.
766      * @tc.steps: step4. store old trace id.
767      * @tc.expected: step4. old trace id get into TLS.
768      * @tc.steps: step5. end trace.
769      * @tc.expected: step5. trace terminate.
770      */
771 
772     // begin trace
773     HiTraceIdStruct id = HiTraceChainBegin("RestoreTest_002", HITRACE_FLAG_TP_INFO | HITRACE_FLAG_INCLUDE_ASYNC);
774     PRINT_ID(&id);
775 
776     //generate new trace id
777     HiTraceIdStruct newId{0};
778     HiTraceChainInitId(&newId);
779     newId.valid=HITRACE_ID_VALID;
780     uint64_t chainId = GenerateChainId();
781     uint64_t spanId = GenerateSpanId();
782     uint64_t parentSpanId = GenerateParentSpanId();
783     HiTraceChainSetChainId(&newId, chainId);
784     HiTraceChainSetSpanId(&newId, spanId);
785     HiTraceChainSetParentSpanId(&newId, parentSpanId);
786     PRINT_ID(&newId);
787 
788     // set new id and save old id
789     HiTraceIdStruct oldId = HiTraceChainSaveAndSetId(&newId);
790     PRINT_ID(&oldId);
791     HiTraceIdStruct currentId = HiTraceChainGetId();
792     HiTraceChainTracepointExWithArgsWrapper(
793             HITRACE_CM_DEVICE, HITRACE_TP_CS, &currentId, "client send msg %d", DEVICE_CLIENT_SEND);
794     HiTraceChainTracepointExWithArgsWrapper(
795             HITRACE_CM_PROCESS, HITRACE_TP_CS, &currentId, "client send msg %d", PROCESS_CLIENT_SEND);
796     HiTraceChainTracepointExWithArgsWrapper(
797             HITRACE_CM_THREAD, HITRACE_TP_CS, &currentId, "client send msg %d", THREAD_CLIENT_SEND);
798     HiTraceChainTracepointExWithArgsWrapper(
799             HITRACE_CM_DEFAULT, HITRACE_TP_CS, &currentId, "client send msg %d", DEFAULT_CLIENT_SEND);
800 
801     // restore old id
802     HiTraceChainRestoreId(&oldId);
803     HiTraceIdStruct currentId2 = HiTraceChainGetId();
804     EXPECT_EQ(1, HiTraceChainIsFlagEnabled(&currentId2, HITRACE_FLAG_INCLUDE_ASYNC));
805     HiTraceChainTracepointExWithArgsWrapper(
806             HITRACE_CM_DEVICE, HITRACE_TP_CS, &currentId, "client send msg %d", DEVICE_CLIENT_SEND);
807     HiTraceChainTracepointExWithArgsWrapper(
808             HITRACE_CM_PROCESS, HITRACE_TP_CS, &currentId, "client send msg %d", PROCESS_CLIENT_SEND);
809     HiTraceChainTracepointExWithArgsWrapper(
810             HITRACE_CM_THREAD, HITRACE_TP_CS, &currentId, "client send msg %d", THREAD_CLIENT_SEND);
811     HiTraceChainTracepointExWithArgsWrapper(
812             HITRACE_CM_DEFAULT, HITRACE_TP_CS, &currentId, "client send msg %d", DEFAULT_CLIENT_SEND);
813 
814     // end trace
815     HiTraceChainEnd(&id);
816 }
817 
818 /**
819  * @tc.name: Dfx_HiTraceChainCTest_RestoreTest_003
820  * @tc.desc: Start normal trace.
821  * @tc.type: FUNC
822  */
823 HWTEST_F(HiTraceChainCTest, RestoreTest_003, TestSize.Level1)
824 {
825     /**
826      * @tc.steps: step1. start trace with version HITRACE_VER_1.
827      * @tc.expected: step1. flag HITRACE_VER_1 is enabled.
828      * @tc.steps: step2. generate a temporary trace id.
829      * @tc.expected: step2. a trace id is generated.
830      * @tc.steps: step3. set new trace id and save old trace id.
831      * @tc.expected: step3. new trace id get into TLS.
832      * @tc.steps: step4. store old trace id.
833      * @tc.expected: step4. old trace id get into TLS.
834      * @tc.steps: step5. end trace.
835      * @tc.expected: step5. trace terminate.
836      */
837     // begin trace
838     HiTraceIdStruct id = HiTraceChainBegin("RestoreTest_003", HITRACE_FLAG_TP_INFO);
839     PRINT_ID(&id);
840 
841     //generate new trace id
842     HiTraceIdStruct newId{0};
843     HiTraceChainInitId(&newId);
844     newId.valid=HITRACE_ID_VALID;
845     uint64_t chainId = GenerateChainId();
846     uint64_t spanId = GenerateSpanId();
847     uint64_t parentSpanId = GenerateParentSpanId();
848     HiTraceChainSetChainId(&newId, chainId);
849     HiTraceChainSetSpanId(&newId, spanId);
850     HiTraceChainSetParentSpanId(&newId, parentSpanId);
851     PRINT_ID(&newId);
852 
853     // set new id and save old id
854     HiTraceIdStruct oldId = HiTraceChainSaveAndSetId(&newId);
855     PRINT_ID(&oldId);
856     HiTraceIdStruct currentId = HiTraceChainGetId();
857     HiTraceChainTracepointExWithArgsWrapper(
858             HITRACE_CM_DEVICE, HITRACE_TP_CS, &currentId, "client send msg %d", DEVICE_CLIENT_SEND);
859     HiTraceChainTracepointExWithArgsWrapper(
860             HITRACE_CM_PROCESS, HITRACE_TP_CS, &currentId, "client send msg %d", PROCESS_CLIENT_SEND);
861     HiTraceChainTracepointExWithArgsWrapper(
862             HITRACE_CM_THREAD, HITRACE_TP_CS, &currentId, "client send msg %d", THREAD_CLIENT_SEND);
863     HiTraceChainTracepointExWithArgsWrapper(
864             HITRACE_CM_DEFAULT, HITRACE_TP_CS, &currentId, "client send msg %d", DEFAULT_CLIENT_SEND);
865 
866     // restore old id
867     HiTraceChainRestoreId(&oldId);
868     HiTraceIdStruct currentId2 = HiTraceChainGetId();
869     EXPECT_EQ(HITRACE_VER_1, currentId2.ver);
870     HiTraceChainTracepointExWithArgsWrapper(
871             HITRACE_CM_DEVICE, HITRACE_TP_CS, &currentId, "client send msg %d", DEVICE_CLIENT_SEND);
872     HiTraceChainTracepointExWithArgsWrapper(
873             HITRACE_CM_PROCESS, HITRACE_TP_CS, &currentId, "client send msg %d", PROCESS_CLIENT_SEND);
874     HiTraceChainTracepointExWithArgsWrapper(
875             HITRACE_CM_THREAD, HITRACE_TP_CS, &currentId, "client send msg %d", THREAD_CLIENT_SEND);
876     HiTraceChainTracepointExWithArgsWrapper(
877             HITRACE_CM_DEFAULT, HITRACE_TP_CS, &currentId, "client send msg %d", DEFAULT_CLIENT_SEND);
878 
879     // end trace
880     HiTraceChainEnd(&id);
881 }
882 /**
883  * @tc.name: Dfx_HiTraceChainCTest_RestoreTest_004
884  * @tc.desc: Start normal trace and create span.
885  * @tc.type: FUNC
886  */
887 HWTEST_F(HiTraceChainCTest, RestoreTest_004, TestSize.Level1)
888 {
889     /**
890      * @tc.steps: step1. start trace without any flag, then create span.
891      * @tc.expected: step1. no flag is enabled.
892      * @tc.steps: step2. generate a temporary trace id.
893      * @tc.expected: step2. a trace id is generated.
894      * @tc.steps: step3. set new trace id and save old trace id.
895      * @tc.expected: step3. new trace id get into TLS.
896      * @tc.steps: step4. store old trace id.
897      * @tc.expected: step4. old trace id get into TLS.
898      * @tc.steps: step5. end trace.
899      * @tc.expected: step5. trace terminate.
900      */
901     // begin trace
902     HiTraceIdStruct id = HiTraceChainBegin("RestoreTest_004", HITRACE_FLAG_TP_INFO);
903     HiTraceChainCreateSpan();
904     PRINT_ID(&id);
905 
906     //generate new trace id
907     HiTraceIdStruct newId{0};
908     HiTraceChainInitId(&newId);
909     newId.valid=HITRACE_ID_VALID;
910     uint64_t chainId = GenerateChainId();
911     uint64_t spanId = GenerateSpanId();
912     uint64_t parentSpanId = GenerateParentSpanId();
913     HiTraceChainSetChainId(&newId, chainId);
914     HiTraceChainSetSpanId(&newId, spanId);
915     HiTraceChainSetParentSpanId(&newId, parentSpanId);
916     PRINT_ID(&newId);
917 
918     // set new id and save old id
919     HiTraceIdStruct oldId = HiTraceChainSaveAndSetId(&newId);
920     HiTraceChainCreateSpan();
921     PRINT_ID(&oldId);
922     HiTraceIdStruct currentId = HiTraceChainGetId();
923     HiTraceChainTracepointExWithArgsWrapper(
924             HITRACE_CM_DEVICE, HITRACE_TP_CS, &currentId, "client send msg %d", DEVICE_CLIENT_SEND);
925     HiTraceChainTracepointExWithArgsWrapper(
926             HITRACE_CM_PROCESS, HITRACE_TP_CS, &currentId, "client send msg %d", PROCESS_CLIENT_SEND);
927     HiTraceChainTracepointExWithArgsWrapper(
928             HITRACE_CM_THREAD, HITRACE_TP_CS, &currentId, "client send msg %d", THREAD_CLIENT_SEND);
929     HiTraceChainTracepointExWithArgsWrapper(
930             HITRACE_CM_DEFAULT, HITRACE_TP_CS, &currentId, "client send msg %d", DEFAULT_CLIENT_SEND);
931 
932     // restore old id
933     HiTraceChainRestoreId(&oldId);
934     HiTraceIdStruct currentId2 = HiTraceChainGetId();
935     EXPECT_EQ(HiTraceChainGetChainId(&id), HiTraceChainGetChainId(&currentId2));
936     EXPECT_EQ(HiTraceChainGetSpanId(&id), HiTraceChainGetParentSpanId(&currentId2));
937     EXPECT_EQ(HiTraceChainGetParentSpanId(&id), HiTraceChainGetParentSpanId(&currentId2));
938     HiTraceChainTracepointExWithArgsWrapper(
939             HITRACE_CM_DEVICE, HITRACE_TP_CS, &currentId, "client send msg %d", DEVICE_CLIENT_SEND);
940     HiTraceChainTracepointExWithArgsWrapper(
941             HITRACE_CM_PROCESS, HITRACE_TP_CS, &currentId, "client send msg %d", PROCESS_CLIENT_SEND);
942     HiTraceChainTracepointExWithArgsWrapper(
943             HITRACE_CM_THREAD, HITRACE_TP_CS, &currentId, "client send msg %d", THREAD_CLIENT_SEND);
944     HiTraceChainTracepointExWithArgsWrapper(
945             HITRACE_CM_DEFAULT, HITRACE_TP_CS, &currentId, "client send msg %d", DEFAULT_CLIENT_SEND);
946 
947     // end trace
948     HiTraceChainEnd(&id);
949 }
950 
951 /**
952  * @tc.name: Dfx_HiTraceChainCTest_RestoreTest_005
953  * @tc.desc: Start normal trace.
954  * @tc.type: FUNC
955  */
956 HWTEST_F(HiTraceChainCTest, RestoreTest_005, TestSize.Level1)
957 {
958     /**
959      * @tc.steps: step1. start trace without any flag.
960      * @tc.expected: step1. no flag is enabled.
961      * @tc.steps: step2. generate a temporary trace id with HITRACE_ID_INVALID flag.
962      * @tc.expected: step2. a trace id is generated.
963      * @tc.steps: step3. set new trace id and save old trace id.
964      * @tc.expected: step3. new trace is invalid.
965      * @tc.steps: step4. store old trace id.
966      * @tc.expected: step4. old trace id get into TLS.
967      * @tc.steps: step5. end trace.
968      * @tc.expected: step5. trace terminate.
969      */
970 
971     // begin trace
972     HiTraceIdStruct id = HiTraceChainBegin("RestoreTest_005", HITRACE_FLAG_TP_INFO);
973     PRINT_ID(&id);
974 
975     //generate new trace id
976     HiTraceIdStruct newId{0};
977     HiTraceChainInitId(&newId);
978     newId.valid=HITRACE_ID_INVALID;
979     uint64_t chainId = GenerateChainId();
980     uint64_t spanId = GenerateSpanId();
981     uint64_t parentSpanId = GenerateParentSpanId();
982     HiTraceChainSetChainId(&newId, chainId);
983     HiTraceChainSetSpanId(&newId, spanId);
984     HiTraceChainSetParentSpanId(&newId, parentSpanId);
985     PRINT_ID(&newId);
986 
987     // set new id and save old id
988     HiTraceIdStruct oldId = HiTraceChainSaveAndSetId(&newId);
989     PRINT_ID(&oldId);
990     HiTraceIdStruct currentId = HiTraceChainGetId();
991     HiTraceChainTracepointExWithArgsWrapper(
992             HITRACE_CM_DEVICE, HITRACE_TP_CS, &currentId, "client send msg %d", DEVICE_CLIENT_SEND);
993     HiTraceChainTracepointExWithArgsWrapper(
994             HITRACE_CM_PROCESS, HITRACE_TP_CS, &currentId, "client send msg %d", PROCESS_CLIENT_SEND);
995     HiTraceChainTracepointExWithArgsWrapper(
996             HITRACE_CM_THREAD, HITRACE_TP_CS, &currentId, "client send msg %d", THREAD_CLIENT_SEND);
997     HiTraceChainTracepointExWithArgsWrapper(
998             HITRACE_CM_DEFAULT, HITRACE_TP_CS, &currentId, "client send msg %d", DEFAULT_CLIENT_SEND);
999 
1000     // restore old id
1001     HiTraceChainRestoreId(&oldId);
1002     HiTraceIdStruct currentId2 = HiTraceChainGetId();
1003     EXPECT_EQ(HiTraceChainGetChainId(&id), HiTraceChainGetChainId(&currentId2));
1004     EXPECT_EQ(HiTraceChainGetSpanId(&id), HiTraceChainGetParentSpanId(&currentId2));
1005     EXPECT_EQ(HiTraceChainGetParentSpanId(&id), HiTraceChainGetParentSpanId(&currentId2));
1006     HiTraceChainTracepointExWithArgsWrapper(
1007             HITRACE_CM_DEVICE, HITRACE_TP_CS, &currentId, "client send msg %d", DEVICE_CLIENT_SEND);
1008     HiTraceChainTracepointExWithArgsWrapper(
1009             HITRACE_CM_PROCESS, HITRACE_TP_CS, &currentId, "client send msg %d", PROCESS_CLIENT_SEND);
1010     HiTraceChainTracepointExWithArgsWrapper(
1011             HITRACE_CM_THREAD, HITRACE_TP_CS, &currentId, "client send msg %d", THREAD_CLIENT_SEND);
1012     HiTraceChainTracepointExWithArgsWrapper(
1013             HITRACE_CM_DEFAULT, HITRACE_TP_CS, &currentId, "client send msg %d", DEFAULT_CLIENT_SEND);
1014 
1015     // end trace
1016     HiTraceChainEnd(&id);
1017 }
1018 }  // namespace HiviewDFX
1019 }  // namespace OHOS
1020