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