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