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