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, ¤tId, "client send msg %d", DEVICE_CLIENT_SEND);
801 HiTraceChainTracepointExWithArgsWrapper(
802 HITRACE_CM_PROCESS, HITRACE_TP_CS, ¤tId, "client send msg %d", PROCESS_CLIENT_SEND);
803 HiTraceChainTracepointExWithArgsWrapper(
804 HITRACE_CM_THREAD, HITRACE_TP_CS, ¤tId, "client send msg %d", THREAD_CLIENT_SEND);
805 HiTraceChainTracepointExWithArgsWrapper(
806 HITRACE_CM_DEFAULT, HITRACE_TP_CS, ¤tId, "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(¤tId2));
812 EXPECT_EQ(HiTraceChainGetSpanId(&id), HiTraceChainGetParentSpanId(¤tId2));
813 EXPECT_EQ(HiTraceChainGetParentSpanId(&id), HiTraceChainGetParentSpanId(¤tId2));
814 HiTraceChainTracepointExWithArgsWrapper(
815 HITRACE_CM_DEVICE, HITRACE_TP_CS, ¤tId, "client send msg %d", DEVICE_CLIENT_SEND);
816 HiTraceChainTracepointExWithArgsWrapper(
817 HITRACE_CM_PROCESS, HITRACE_TP_CS, ¤tId, "client send msg %d", PROCESS_CLIENT_SEND);
818 HiTraceChainTracepointExWithArgsWrapper(
819 HITRACE_CM_THREAD, HITRACE_TP_CS, ¤tId, "client send msg %d", THREAD_CLIENT_SEND);
820 HiTraceChainTracepointExWithArgsWrapper(
821 HITRACE_CM_DEFAULT, HITRACE_TP_CS, ¤tId, "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, ¤tId, "client send msg %d", DEVICE_CLIENT_SEND);
869 HiTraceChainTracepointExWithArgsWrapper(
870 HITRACE_CM_PROCESS, HITRACE_TP_CS, ¤tId, "client send msg %d", PROCESS_CLIENT_SEND);
871 HiTraceChainTracepointExWithArgsWrapper(
872 HITRACE_CM_THREAD, HITRACE_TP_CS, ¤tId, "client send msg %d", THREAD_CLIENT_SEND);
873 HiTraceChainTracepointExWithArgsWrapper(
874 HITRACE_CM_DEFAULT, HITRACE_TP_CS, ¤tId, "client send msg %d", DEFAULT_CLIENT_SEND);
875
876 // restore old id
877 HiTraceChainRestoreId(&oldId);
878 HiTraceIdStruct currentId2 = HiTraceChainGetId();
879 EXPECT_EQ(1, HiTraceChainIsFlagEnabled(¤tId2, HITRACE_FLAG_INCLUDE_ASYNC));
880 HiTraceChainTracepointExWithArgsWrapper(
881 HITRACE_CM_DEVICE, HITRACE_TP_CS, ¤tId, "client send msg %d", DEVICE_CLIENT_SEND);
882 HiTraceChainTracepointExWithArgsWrapper(
883 HITRACE_CM_PROCESS, HITRACE_TP_CS, ¤tId, "client send msg %d", PROCESS_CLIENT_SEND);
884 HiTraceChainTracepointExWithArgsWrapper(
885 HITRACE_CM_THREAD, HITRACE_TP_CS, ¤tId, "client send msg %d", THREAD_CLIENT_SEND);
886 HiTraceChainTracepointExWithArgsWrapper(
887 HITRACE_CM_DEFAULT, HITRACE_TP_CS, ¤tId, "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, ¤tId, "client send msg %d", DEVICE_CLIENT_SEND);
934 HiTraceChainTracepointExWithArgsWrapper(
935 HITRACE_CM_PROCESS, HITRACE_TP_CS, ¤tId, "client send msg %d", PROCESS_CLIENT_SEND);
936 HiTraceChainTracepointExWithArgsWrapper(
937 HITRACE_CM_THREAD, HITRACE_TP_CS, ¤tId, "client send msg %d", THREAD_CLIENT_SEND);
938 HiTraceChainTracepointExWithArgsWrapper(
939 HITRACE_CM_DEFAULT, HITRACE_TP_CS, ¤tId, "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, ¤tId, "client send msg %d", DEVICE_CLIENT_SEND);
947 HiTraceChainTracepointExWithArgsWrapper(
948 HITRACE_CM_PROCESS, HITRACE_TP_CS, ¤tId, "client send msg %d", PROCESS_CLIENT_SEND);
949 HiTraceChainTracepointExWithArgsWrapper(
950 HITRACE_CM_THREAD, HITRACE_TP_CS, ¤tId, "client send msg %d", THREAD_CLIENT_SEND);
951 HiTraceChainTracepointExWithArgsWrapper(
952 HITRACE_CM_DEFAULT, HITRACE_TP_CS, ¤tId, "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, ¤tId, "client send msg %d", DEVICE_CLIENT_SEND);
1000 HiTraceChainTracepointExWithArgsWrapper(
1001 HITRACE_CM_PROCESS, HITRACE_TP_CS, ¤tId, "client send msg %d", PROCESS_CLIENT_SEND);
1002 HiTraceChainTracepointExWithArgsWrapper(
1003 HITRACE_CM_THREAD, HITRACE_TP_CS, ¤tId, "client send msg %d", THREAD_CLIENT_SEND);
1004 HiTraceChainTracepointExWithArgsWrapper(
1005 HITRACE_CM_DEFAULT, HITRACE_TP_CS, ¤tId, "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(¤tId2));
1011 EXPECT_EQ(HiTraceChainGetSpanId(&id), HiTraceChainGetParentSpanId(¤tId2));
1012 EXPECT_EQ(HiTraceChainGetParentSpanId(&id), HiTraceChainGetParentSpanId(¤tId2));
1013 HiTraceChainTracepointExWithArgsWrapper(
1014 HITRACE_CM_DEVICE, HITRACE_TP_CS, ¤tId, "client send msg %d", DEVICE_CLIENT_SEND);
1015 HiTraceChainTracepointExWithArgsWrapper(
1016 HITRACE_CM_PROCESS, HITRACE_TP_CS, ¤tId, "client send msg %d", PROCESS_CLIENT_SEND);
1017 HiTraceChainTracepointExWithArgsWrapper(
1018 HITRACE_CM_THREAD, HITRACE_TP_CS, ¤tId, "client send msg %d", THREAD_CLIENT_SEND);
1019 HiTraceChainTracepointExWithArgsWrapper(
1020 HITRACE_CM_DEFAULT, HITRACE_TP_CS, ¤tId, "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, ¤tId, "client send msg %d", DEVICE_CLIENT_SEND);
1068 HiTraceChainTracepointExWithArgsWrapper(
1069 HITRACE_CM_PROCESS, HITRACE_TP_CS, ¤tId, "client send msg %d", PROCESS_CLIENT_SEND);
1070 HiTraceChainTracepointExWithArgsWrapper(
1071 HITRACE_CM_THREAD, HITRACE_TP_CS, ¤tId, "client send msg %d", THREAD_CLIENT_SEND);
1072 HiTraceChainTracepointExWithArgsWrapper(
1073 HITRACE_CM_DEFAULT, HITRACE_TP_CS, ¤tId, "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(¤tId2));
1079 EXPECT_EQ(HiTraceChainGetSpanId(&id), HiTraceChainGetParentSpanId(¤tId2));
1080 EXPECT_EQ(HiTraceChainGetParentSpanId(&id), HiTraceChainGetParentSpanId(¤tId2));
1081 HiTraceChainTracepointExWithArgsWrapper(
1082 HITRACE_CM_DEVICE, HITRACE_TP_CS, ¤tId, "client send msg %d", DEVICE_CLIENT_SEND);
1083 HiTraceChainTracepointExWithArgsWrapper(
1084 HITRACE_CM_PROCESS, HITRACE_TP_CS, ¤tId, "client send msg %d", PROCESS_CLIENT_SEND);
1085 HiTraceChainTracepointExWithArgsWrapper(
1086 HITRACE_CM_THREAD, HITRACE_TP_CS, ¤tId, "client send msg %d", THREAD_CLIENT_SEND);
1087 HiTraceChainTracepointExWithArgsWrapper(
1088 HITRACE_CM_DEFAULT, HITRACE_TP_CS, ¤tId, "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