1 /*
2 * Copyright (c) Huawei Technologies Co., Ltd. 2023. All rights reserved.
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 <fcntl.h>
17 #include <hwext/gtest-ext.h>
18 #include <hwext/gtest-tag.h>
19 #include <memory>
20
21 #include "export_test.h"
22 #include "file.h"
23 #include "native_hook_parser/pbreader_native_hook_parser.h"
24 #include "native_hook_result.pb.h"
25 #include "native_hook_result.pbreader.h"
26 #include "parser/ptreader_parser/ptreader_parser.h"
27 #include "parser/common_types.h"
28 #include "trace_streamer_selector.h"
29
30 using namespace testing::ext;
31 using namespace SysTuning::TraceStreamer;
32
33 namespace SysTuning {
34 namespace TraceStreamer {
35 namespace NativeMemoryUnitTest {
36 const uint32_t INDEX_SIZE_02 = 2;
37 const uint32_t INDEX_SIZE_03 = 3;
38 const uint32_t INDEX_SIZE_04 = 4;
39 const uint64_t SEC_01 = 1632675525;
40 const uint64_t SEC_02 = 1632675526;
41 const uint64_t SEC_03 = 1632675527;
42 const uint64_t SEC_04 = 1632675528;
43 const uint64_t NSEC_01 = 996560701;
44 const uint64_t NSEC_02 = 999560702;
45 const uint64_t NSEC_03 = 996560703;
46 const uint64_t NSEC_04 = 999560704;
47 const uint64_t TIMESTAMP_01 = NSEC_01 + SEC_01 * SEC_TO_NS;
48 const uint64_t TIMESTAMP_02 = NSEC_02 + SEC_02 * SEC_TO_NS;
49 const uint64_t TIMESTAMP_03 = NSEC_03 + SEC_03 * SEC_TO_NS;
50 const uint64_t TIMESTAMP_04 = NSEC_04 + SEC_04 * SEC_TO_NS;
51 const int32_t PID = 2716;
52 const int32_t TID_01 = 1532;
53 const int32_t TID_02 = 1532;
54 const uint64_t ADDR_01 = 10453088;
55 const uint64_t ADDR_02 = 10453089;
56 const uint64_t ADDR_03 = 10453090;
57 const int64_t SIZE_01 = 4096;
58 const int64_t SIZE_02 = 2048;
59 const uint64_t STACK_MAP_ALLOC_IP = 18446742974197923848ULL;
60 const uint64_t STACK_MAP_JS_IP_01 = 18446741874686296087ULL;
61 const uint64_t STACK_MAP_JS_IP_02 = 18446741874686296086ULL;
62 const uint64_t IP_01 = 4154215627;
63 const uint64_t IP_02 = 4154215630;
64 const uint64_t IP_03 = 5483396524;
65 const uint64_t SP_01 = 4146449696;
66 const uint64_t SP_02 = 4146449698;
67 const std::string SYMBOL_NAME_01 = "__aeabi_read_tp";
68 const std::string SYMBOL_NAME_02 = "ThreadMmap";
69 const std::string SYMBOL_NAME_03 = "napicallback_arkts";
70 const std::string SYMBOL_NAME_04 = "unknown 0xf79c4cce";
71 const std::string SYMBOL_NAME_05 = "alloc size(8bytes)0xffffff0000000008";
72 const std::string FILE_PATH_01 = "/system/lib/ld-musl-arm.so.1";
73 const std::string FILE_PATH_02 = "/system/bin/nativetest_c";
74 const std::string FILE_PATH_03 = "/entry/src/main/ets/pages/Index.ets:47:5";
75 const uint64_t OFFSET_01 = 359372;
76 const uint64_t OFFSET_02 = 17865;
77 const uint64_t OFFSET_03 = 89456;
78 const uint64_t SYMBOL_OFFSET_01 = 255;
79 const uint64_t SYMBOL_OFFSET_02 = 33;
80 const std::string ALLOCEVENT = "AllocEvent";
81 const std::string FREEEVENT = "FreeEvent";
82 const std::string MMAPEVENT = "MmapEvent";
83 const std::string MUNMAPEVENT = "MunmapEvent";
84 const std::string TYPE_01 = "mmapType1";
85 const std::string TYPE_02 = "mmapType2";
86
87 struct HookDataStruct {
88 int32_t tid;
89 uint64_t addr;
90 int64_t size;
91 std::string type;
92 uint64_t sec;
93 uint64_t nsec;
94 };
95
96 struct FrameStruct {
97 uint64_t ip;
98 uint64_t sp;
99 std::string name;
100 std::string path;
101 uint64_t offset;
102 uint64_t symbolOffset;
103 };
104
105 class NativeHookParserTest : public ::testing::Test {
106 public:
SetUp()107 void SetUp()
108 {
109 stream_.InitFilter();
110 }
111
TearDown()112 void TearDown() {}
113
SetFrameInfo(Frame * frame,FrameStruct frameStruct)114 void SetFrameInfo(Frame *frame, FrameStruct frameStruct)
115 {
116 frame->set_ip(frameStruct.ip);
117 frame->set_sp(frameStruct.sp);
118 frame->set_symbol_name(frameStruct.name);
119 frame->set_file_path(frameStruct.path);
120 frame->set_offset(frameStruct.offset);
121 frame->set_symbol_offset(frameStruct.symbolOffset);
122 }
123
SetOfflineFrameEvent(BatchNativeHookData & hookData)124 void SetOfflineFrameEvent(BatchNativeHookData &hookData)
125 {
126 // construct FrameEvent
127 auto frameMapData = hookData.add_events();
128 FrameMap *frameMap = new FrameMap();
129 frameMap->set_id(STACK_MAP_JS_IP_01 & (~JS_IP_MASK));
130 frameMap->set_pid(PID);
131 frameMapData->set_allocated_frame_map(frameMap);
132
133 // construct Frame
134 Frame *frame = new Frame();
135 frame->set_ip(IP_03);
136 frame->set_sp(0);
137 frame->set_symbol_name_id(1);
138 frame->set_file_path_id(1);
139 frame->set_offset(OFFSET_03);
140 frame->set_symbol_offset(0);
141 frameMap->set_allocated_frame(frame);
142
143 // construct SymbolMap
144 auto symbolMapData = hookData.add_events();
145 SymbolMap *symbolMap = new SymbolMap();
146 symbolMap->set_id(1);
147 symbolMap->set_name(SYMBOL_NAME_03);
148 symbolMap->set_pid(PID);
149 symbolMapData->set_allocated_symbol_name(symbolMap);
150
151 // construct FilePathMap
152 auto filePathMapData = hookData.add_events();
153 FilePathMap *filePathMap = new FilePathMap();
154 filePathMap->set_id(1);
155 filePathMap->set_name(FILE_PATH_03);
156 filePathMap->set_pid(PID);
157 filePathMapData->set_allocated_file_path(filePathMap);
158 }
159
SetOfflineAllocEvent(BatchNativeHookData & hookData,HookDataStruct dataStruct,bool isJsMixedStack=false,bool isJsStackAbnormal=false)160 void SetOfflineAllocEvent(BatchNativeHookData &hookData,
161 HookDataStruct dataStruct,
162 bool isJsMixedStack = false,
163 bool isJsStackAbnormal = false)
164 {
165 auto stackMapData = hookData.add_events();
166 // Construct JavaScript stack data
167 StackMap *stackMap = new StackMap();
168 stackMap->set_id(1);
169
170 if (isJsMixedStack) {
171 // add stackMap.ip: alloc
172 stackMap->add_ip(STACK_MAP_ALLOC_IP);
173 // add stackMap.ip: Offline symbolization failed
174 stackMap->add_ip(IP_02);
175 // add stackMap.ip :js
176 stackMap->add_ip(STACK_MAP_JS_IP_01);
177 SetOfflineFrameEvent(hookData);
178 }
179 if (isJsStackAbnormal) {
180 // add stackMap.ip :jsStackAbnormal
181 stackMap->add_ip(STACK_MAP_JS_IP_02);
182 }
183 stackMap->set_pid(PID);
184 stackMapData->set_allocated_stack_map(stackMap);
185
186 // construct AllocEvent
187 auto nativeHookData = hookData.add_events();
188 AllocEvent *allocEvent = new AllocEvent();
189 allocEvent->set_stack_id(1);
190 allocEvent->set_pid(PID);
191 allocEvent->set_tid(dataStruct.tid);
192 allocEvent->set_addr(dataStruct.addr);
193 allocEvent->set_size(dataStruct.size);
194
195 nativeHookData->set_tv_sec(dataStruct.sec);
196 nativeHookData->set_tv_nsec(dataStruct.nsec);
197 nativeHookData->set_allocated_alloc_event(allocEvent);
198 }
SetAllocEvent(BatchNativeHookData & hookData,HookDataStruct dataStruct,bool isRepeated=false,bool isAddFrame=true,bool isSecond=false)199 void SetAllocEvent(BatchNativeHookData &hookData,
200 HookDataStruct dataStruct,
201 bool isRepeated = false,
202 bool isAddFrame = true,
203 bool isSecond = false)
204 {
205 // construct AllocEvent
206 AllocEvent *allocEvent = new AllocEvent();
207 allocEvent->set_pid(PID);
208 allocEvent->set_tid(dataStruct.tid);
209 allocEvent->set_addr(dataStruct.addr);
210 allocEvent->set_size(dataStruct.size);
211 if (isAddFrame) {
212 // construct AllocEvent's Frame
213 auto frame = allocEvent->add_frame_info();
214 if (!isSecond) {
215 SetFrameInfo(frame, {IP_01, SP_01, SYMBOL_NAME_01, FILE_PATH_01, OFFSET_01, SYMBOL_OFFSET_01});
216 } else {
217 SetFrameInfo(frame, {IP_02, SP_02, SYMBOL_NAME_02, FILE_PATH_02, OFFSET_02, SYMBOL_OFFSET_02});
218 }
219 }
220 if (isRepeated) {
221 // construct first AllocEvent's second Frame
222 auto frame = allocEvent->add_frame_info();
223 SetFrameInfo(frame, {IP_02, SP_02, SYMBOL_NAME_02, FILE_PATH_02, OFFSET_02, SYMBOL_OFFSET_02});
224 }
225
226 // add NativeHookData
227 auto nativeHookData = hookData.add_events();
228 nativeHookData->set_tv_sec(dataStruct.sec);
229 nativeHookData->set_tv_nsec(dataStruct.nsec);
230 nativeHookData->set_allocated_alloc_event(allocEvent);
231 }
232
SetFreeEvent(BatchNativeHookData & hookData,HookDataStruct dataStruct,bool isRepeated=false,bool isSecond=false,bool isAddFrame=true)233 void SetFreeEvent(BatchNativeHookData &hookData,
234 HookDataStruct dataStruct,
235 bool isRepeated = false,
236 bool isSecond = false,
237 bool isAddFrame = true)
238 {
239 // construct FreeEvent
240 FreeEvent *freeEvent = new FreeEvent();
241 freeEvent->set_pid(PID);
242 freeEvent->set_tid(dataStruct.tid);
243 freeEvent->set_addr(dataStruct.addr);
244 if (isAddFrame) {
245 // construct first FreeEvent's first Frame
246 auto frame = freeEvent->add_frame_info();
247 if (!isSecond) {
248 SetFrameInfo(frame, {IP_01, SP_01, SYMBOL_NAME_01, FILE_PATH_01, OFFSET_01, SYMBOL_OFFSET_01});
249 } else {
250 SetFrameInfo(frame, {IP_02, SP_02, SYMBOL_NAME_02, FILE_PATH_02, OFFSET_02, SYMBOL_OFFSET_02});
251 }
252 }
253
254 if (isRepeated) {
255 // construct first FreeEvent's second Frame
256 auto frame = freeEvent->add_frame_info();
257 SetFrameInfo(frame, {IP_02, SP_02, SYMBOL_NAME_02, FILE_PATH_02, OFFSET_02, SYMBOL_OFFSET_02});
258 }
259
260 // add NativeHookData
261 auto nativeHookData = hookData.add_events();
262 nativeHookData->set_tv_sec(dataStruct.sec);
263 nativeHookData->set_tv_nsec(dataStruct.nsec);
264 nativeHookData->set_allocated_free_event(freeEvent);
265 }
266
SetMmapEvent(BatchNativeHookData & hookData,HookDataStruct dataStruct,bool isRepeated=false,bool isSecond=false,bool isAddFrame=true)267 void SetMmapEvent(BatchNativeHookData &hookData,
268 HookDataStruct dataStruct,
269 bool isRepeated = false,
270 bool isSecond = false,
271 bool isAddFrame = true)
272 {
273 // construct MmapEvent
274 MmapEvent *mmapEvent = new MmapEvent();
275 mmapEvent->set_pid(PID);
276 mmapEvent->set_tid(dataStruct.tid);
277 mmapEvent->set_addr(dataStruct.addr);
278 mmapEvent->set_size(dataStruct.size);
279 mmapEvent->set_type(dataStruct.type);
280 if (isAddFrame) {
281 // construct first MmapEvent's first Frame
282 auto frame = mmapEvent->add_frame_info();
283 if (!isSecond) {
284 SetFrameInfo(frame, {IP_01, SP_01, SYMBOL_NAME_01, FILE_PATH_01, OFFSET_01, SYMBOL_OFFSET_01});
285 } else {
286 SetFrameInfo(frame, {IP_02, SP_02, SYMBOL_NAME_02, FILE_PATH_02, OFFSET_02, SYMBOL_OFFSET_02});
287 }
288 }
289
290 if (isRepeated) {
291 auto frame = mmapEvent->add_frame_info();
292 SetFrameInfo(frame, {IP_02, SP_02, SYMBOL_NAME_02, FILE_PATH_02, OFFSET_02, SYMBOL_OFFSET_02});
293 }
294
295 // add NativeHookData
296 auto nativeHookData = hookData.add_events();
297 nativeHookData->set_tv_sec(dataStruct.sec);
298 nativeHookData->set_tv_nsec(dataStruct.nsec);
299 nativeHookData->set_allocated_mmap_event(mmapEvent);
300 }
301
SetMunmapEvent(BatchNativeHookData & hookData,HookDataStruct dataStruct,bool isSecond,bool isAddFrame)302 void SetMunmapEvent(BatchNativeHookData &hookData, HookDataStruct dataStruct, bool isSecond, bool isAddFrame)
303 {
304 // construct MunmapEvent
305 MunmapEvent *munmapEvent = new MunmapEvent();
306 munmapEvent->set_pid(PID);
307 munmapEvent->set_tid(dataStruct.tid);
308 munmapEvent->set_addr(dataStruct.addr);
309 munmapEvent->set_size(dataStruct.size);
310 if (isAddFrame) {
311 // construct MunmapEvent's Frame
312 auto frame = munmapEvent->add_frame_info();
313 if (!isSecond) {
314 SetFrameInfo(frame, {IP_01, SP_01, SYMBOL_NAME_01, FILE_PATH_01, OFFSET_01, SYMBOL_OFFSET_01});
315 } else {
316 SetFrameInfo(frame, {IP_02, SP_02, SYMBOL_NAME_02, FILE_PATH_02, OFFSET_02, SYMBOL_OFFSET_02});
317 }
318 }
319
320 // add NativeHookData
321 auto nativeHookData = hookData.add_events();
322 nativeHookData->set_tv_sec(dataStruct.sec);
323 nativeHookData->set_tv_nsec(dataStruct.nsec);
324 nativeHookData->set_allocated_munmap_event(munmapEvent);
325 }
326
CreateBatchNativeHookData(PbreaderDataSegment & dataSeg)327 BatchNativeHookData CreateBatchNativeHookData(PbreaderDataSegment &dataSeg)
328 {
329 std::string hookStrMsg = "";
330 BatchNativeHookData batchNativeHookData;
331 SetAllocEvent(batchNativeHookData, {TID_01, ADDR_01, SIZE_01, "", SEC_01, NSEC_01}, true);
332 SetAllocEvent(batchNativeHookData, {TID_02, ADDR_02, SIZE_02, "", SEC_02, NSEC_02}, true);
333 batchNativeHookData.SerializeToString(&hookStrMsg);
334 dataSeg.seg = std::make_shared<std::string>(hookStrMsg);
335 ProtoReader::BytesView hookBytesView(reinterpret_cast<const uint8_t *>(dataSeg.seg->data()),
336 dataSeg.seg->size());
337 dataSeg.protoData = hookBytesView;
338 return batchNativeHookData;
339 }
340
341 public:
342 SysTuning::TraceStreamer::TraceStreamerSelector stream_ = {};
343 };
344
345 template <typename T>
IsEqual(T src,T dest,std::string logStr)346 bool IsEqual(T src, T dest, std::string logStr)
347 {
348 if (src != dest) {
349 std::cout << logStr << ": src = " << src << ", dest = " << dest << std::endl;
350 return false;
351 }
352 return true;
353 }
354
355 class NativeHookCache {
356 public:
NativeHookCache(const uint64_t callChainId,const uint32_t ipid,const uint32_t itid,const std::string eventType,const uint64_t subType,const uint64_t startTimeStamp,const uint64_t endTimeStamp,const uint64_t duration,const uint64_t address,const int64_t memSize,const int64_t allMemSize,const uint64_t currentSizeDurations)357 NativeHookCache(const uint64_t callChainId,
358 const uint32_t ipid,
359 const uint32_t itid,
360 const std::string eventType,
361 const uint64_t subType,
362 const uint64_t startTimeStamp,
363 const uint64_t endTimeStamp,
364 const uint64_t duration,
365 const uint64_t address,
366 const int64_t memSize,
367 const int64_t allMemSize,
368 const uint64_t currentSizeDurations)
369 : callChainId_(callChainId),
370 ipid_(ipid),
371 itid_(itid),
372 eventType_(eventType),
373 subType_(subType),
374 startTimeStamp_(startTimeStamp),
375 endTimeStamp_(endTimeStamp),
376 duration_(duration),
377 address_(address),
378 memSize_(memSize),
379 allMemSize_(allMemSize),
380 currentSizeDurations_(currentSizeDurations)
381 {
382 }
383
NativeHookCache(const NativeHook & nativeHook,uint64_t index)384 NativeHookCache(const NativeHook &nativeHook, uint64_t index)
385 {
386 if (nativeHook.Size() <= index) {
387 TS_LOGE("index out of deque bounds! nativeHook.Size() = %lu, index = %lu", nativeHook.Size(), index);
388 return;
389 }
390 callChainId_ = nativeHook.CallChainIds()[index];
391 ipid_ = nativeHook.Ipids()[index];
392 itid_ = nativeHook.InternalTidsData()[index];
393 eventType_ = nativeHook.EventTypes()[index];
394 subType_ = nativeHook.SubTypes()[index];
395 startTimeStamp_ = nativeHook.TimeStampData()[index];
396 endTimeStamp_ = nativeHook.EndTimeStamps()[index];
397 duration_ = nativeHook.Durations()[index];
398 address_ = nativeHook.Addrs()[index];
399 memSize_ = nativeHook.MemSizes()[index];
400 allMemSize_ = nativeHook.AllMemSizes()[index];
401 currentSizeDurations_ = nativeHook.CurrentSizeDurs()[index];
402 }
403 ~NativeHookCache() = default;
404 NativeHookCache(const NativeHookCache &) = delete;
405 NativeHookCache &operator=(const NativeHookCache &) = delete;
operator ==(const NativeHookCache & nativeHookCache) const406 bool operator==(const NativeHookCache &nativeHookCache) const
407 {
408 bool ret = true;
409 ret &= IsEqual(nativeHookCache.GetCallChainId(), callChainId_, "CallChainId");
410 ret &= IsEqual(nativeHookCache.GetPid(), ipid_, "Pid");
411 ret &= IsEqual(nativeHookCache.GetTid(), itid_, "Tid");
412 ret &= IsEqual(nativeHookCache.GetEventType(), eventType_, "EventType");
413 ret &= IsEqual(nativeHookCache.GetSubType(), subType_, "SubType");
414 ret &= IsEqual(nativeHookCache.GetStartTimeStamp(), startTimeStamp_, "StartTimeStamp");
415 ret &= IsEqual(nativeHookCache.GetEndTimeStamp(), endTimeStamp_, "EndTimeStamp");
416 ret &= IsEqual(nativeHookCache.GetDuration(), duration_, "Duration");
417 ret &= IsEqual(nativeHookCache.GetAddress(), address_, "Address");
418 ret &= IsEqual(nativeHookCache.GetMemSize(), memSize_, "MemSize");
419 ret &= IsEqual(nativeHookCache.GetAllMemSize(), allMemSize_, "AllMemSize");
420 ret &= IsEqual(nativeHookCache.GetCurrentSizeDuration(), currentSizeDurations_, "CurrentSizeDurations");
421 return ret;
422 }
GetCallChainId() const423 inline uint64_t GetCallChainId() const
424 {
425 return callChainId_;
426 }
GetPid() const427 inline uint32_t GetPid() const
428 {
429 return ipid_;
430 }
GetTid() const431 inline uint32_t GetTid() const
432 {
433 return itid_;
434 }
GetEventType() const435 inline std::string GetEventType() const
436 {
437 return eventType_;
438 }
GetSubType() const439 inline uint64_t GetSubType() const
440 {
441 return subType_;
442 }
GetStartTimeStamp() const443 inline uint64_t GetStartTimeStamp() const
444 {
445 return startTimeStamp_;
446 }
GetEndTimeStamp() const447 inline uint64_t GetEndTimeStamp() const
448 {
449 return endTimeStamp_;
450 }
GetDuration() const451 inline uint64_t GetDuration() const
452 {
453 return duration_;
454 }
GetAddress() const455 inline uint64_t GetAddress() const
456 {
457 return address_;
458 }
GetMemSize() const459 inline int64_t GetMemSize() const
460 {
461 return memSize_;
462 }
GetAllMemSize() const463 inline int64_t GetAllMemSize() const
464 {
465 return allMemSize_;
466 }
GetCurrentSizeDuration() const467 inline uint64_t GetCurrentSizeDuration() const
468 {
469 return currentSizeDurations_;
470 }
471
472 private:
473 uint64_t callChainId_;
474 uint32_t ipid_;
475 uint32_t itid_;
476 std::string eventType_;
477 uint64_t subType_;
478 uint64_t startTimeStamp_;
479 uint64_t endTimeStamp_;
480 uint64_t duration_;
481 uint64_t address_;
482 int64_t memSize_;
483 int64_t allMemSize_;
484 uint64_t currentSizeDurations_;
485 };
486
487 class NativeHookFrameCache {
488 public:
NativeHookFrameCache(const uint64_t callChainId,const uint64_t depth,const uint64_t ip,const uint64_t symbolName,const uint64_t filePath,const uint64_t offset,const uint64_t symbolOffset)489 NativeHookFrameCache(const uint64_t callChainId,
490 const uint64_t depth,
491 const uint64_t ip,
492 const uint64_t symbolName,
493 const uint64_t filePath,
494 const uint64_t offset,
495 const uint64_t symbolOffset)
496 : callChainId_(callChainId),
497 depth_(depth),
498 ip_(ip),
499 symbolName_(symbolName),
500 filePath_(filePath),
501 offset_(offset),
502 symbolOffset_(symbolOffset)
503 {
504 }
505
NativeHookFrameCache(const NativeHookFrame & nativeHookFrame,const uint64_t index)506 NativeHookFrameCache(const NativeHookFrame &nativeHookFrame, const uint64_t index)
507 {
508 if (nativeHookFrame.Size() <= index) {
509 TS_LOGE("index out of deque bounds! nativeHookFrame.Size() = %lu, index = %lu", nativeHookFrame.Size(),
510 index);
511 return;
512 }
513 callChainId_ = nativeHookFrame.CallChainIds()[index];
514 depth_ = nativeHookFrame.Depths()[index];
515 ip_ = nativeHookFrame.Ips()[index];
516 symbolName_ = nativeHookFrame.SymbolNames()[index];
517 filePath_ = nativeHookFrame.FilePaths()[index];
518 offset_ = nativeHookFrame.Offsets()[index];
519 symbolOffset_ = nativeHookFrame.SymbolOffsets()[index];
520 }
521
522 ~NativeHookFrameCache() = default;
523 NativeHookFrameCache(const NativeHookFrameCache &) = delete;
524 NativeHookFrameCache &operator=(const NativeHookFrameCache &) = delete;
operator ==(const NativeHookFrameCache & frameCache) const525 bool operator==(const NativeHookFrameCache &frameCache) const
526 {
527 bool ret = true;
528 ret &= IsEqual(frameCache.GetCallChainId(), callChainId_, "CallChainId");
529 ret &= IsEqual(frameCache.GetDepth(), depth_, "Depth");
530 ret &= IsEqual(frameCache.GetIp(), ip_, "Ip");
531 ret &= IsEqual(frameCache.GetSymbolName(), symbolName_, "SymbolName");
532 ret &= IsEqual(frameCache.GetFilePath(), filePath_, "FilePath");
533 ret &= IsEqual(frameCache.GetOffset(), offset_, "Offset");
534 ret &= IsEqual(frameCache.GetSymbolOffset(), symbolOffset_, "SymbolOffset");
535 return ret;
536 }
GetCallChainId() const537 inline uint64_t GetCallChainId() const
538 {
539 return callChainId_;
540 }
GetDepth() const541 inline uint64_t GetDepth() const
542 {
543 return depth_;
544 }
GetIp() const545 inline uint64_t GetIp() const
546 {
547 return ip_;
548 }
GetSymbolName() const549 inline uint64_t GetSymbolName() const
550 {
551 return symbolName_;
552 }
GetFilePath() const553 inline uint64_t GetFilePath() const
554 {
555 return filePath_;
556 }
GetOffset() const557 inline uint64_t GetOffset() const
558 {
559 return offset_;
560 }
GetSymbolOffset() const561 inline uint64_t GetSymbolOffset() const
562 {
563 return symbolOffset_;
564 }
565
566 private:
567 uint64_t callChainId_;
568 uint64_t depth_;
569 uint64_t ip_;
570 uint64_t symbolName_;
571 uint64_t filePath_;
572 uint64_t offset_;
573 uint64_t symbolOffset_;
574 };
575
576 /**
577 * @tc.name: ParseBatchNativeHookWithOutNativeHookData
578 * @tc.desc: Parse a BatchNativeHookData that does not contain any NativeHookData
579 * @tc.type: FUNC
580 */
581 HWTEST_F(NativeHookParserTest, ParseBatchNativeHookWithOutNativeHookData, TestSize.Level1)
582 {
583 TS_LOGI("test24-1");
584 BatchNativeHookData batchNativeHookData;
585 PbreaderNativeHookParser htraceNativeHookParser(stream_.traceDataCache_.get(), stream_.streamFilters_.get());
586 std::string hookStrMsg = "";
587 batchNativeHookData.SerializeToString(&hookStrMsg);
588 PbreaderDataSegment dataSeg;
589 dataSeg.seg = std::make_shared<std::string>(hookStrMsg);
590 ProtoReader::BytesView hookBytesView(reinterpret_cast<const uint8_t *>(hookStrMsg.data()), hookStrMsg.size());
591 dataSeg.protoData = hookBytesView;
592 bool hasSplit = false;
593 htraceNativeHookParser.Parse(dataSeg, hasSplit);
594 auto size = stream_.traceDataCache_->GetConstHilogData().Size();
595 EXPECT_FALSE(size);
596 }
597
598 /**
599 * @tc.name: ParseBatchNativeHookWithOneMalloc
600 * @tc.desc: Parse a BatchNativeHookData with only one Malloc
601 * @tc.type: FUNC
602 */
603 HWTEST_F(NativeHookParserTest, ParseBatchNativeHookWithOneMalloc, TestSize.Level1)
604 {
605 TS_LOGI("test24-2");
606
607 // construct BatchNativeHookData
608 BatchNativeHookData batchNativeHookData;
609 SetAllocEvent(batchNativeHookData, {TID_01, ADDR_01, SIZE_01, "", SEC_01, NSEC_01});
610 std::string hookStrMsg = "";
611 batchNativeHookData.SerializeToString(&hookStrMsg);
612
613 PbreaderDataSegment dataSeg;
614 dataSeg.seg = std::make_shared<std::string>(hookStrMsg);
615 ProtoReader::BytesView hookBytesView(reinterpret_cast<const uint8_t *>(hookStrMsg.data()), hookStrMsg.size());
616 dataSeg.protoData = hookBytesView;
617
618 // start parse
619 PbreaderNativeHookParser htraceNativeHookParser(stream_.traceDataCache_.get(), stream_.streamFilters_.get());
620 bool hasSplit = false;
621 htraceNativeHookParser.Parse(dataSeg, hasSplit);
622 htraceNativeHookParser.FinishParseNativeHookData();
623
624 // Verification parse NativeHook results
625 auto expect_ipid = stream_.streamFilters_->processFilter_->GetInternalPid(PID);
626 auto expect_itid = stream_.streamFilters_->processFilter_->GetInternalTid(TID_01);
627 NativeHookCache expectNativeHookCache(1, expect_ipid, expect_itid, ALLOCEVENT.c_str(), INVALID_UINT64, TIMESTAMP_01,
628 0, 0, ADDR_01, SIZE_01, SIZE_01, 0);
629 const NativeHook &nativeHook = stream_.traceDataCache_->GetConstNativeHookData();
630 NativeHookCache resultNativeHookCache(nativeHook, 0);
631 EXPECT_TRUE(expectNativeHookCache == resultNativeHookCache);
632 EXPECT_EQ(1, nativeHook.Size());
633
634 // Verification parse NativeHook Frame results
635 const NativeHookFrame &nativeHookFrame = stream_.traceDataCache_->GetConstNativeHookFrameData();
636 auto expectSymbolData = stream_.traceDataCache_->dataDict_.GetStringIndex(SYMBOL_NAME_01);
637 auto expectFilePathData = stream_.traceDataCache_->dataDict_.GetStringIndex(FILE_PATH_01);
638 NativeHookFrameCache expectFrameCache(1, 0, IP_01, expectSymbolData, expectFilePathData, OFFSET_01,
639 SYMBOL_OFFSET_01);
640 NativeHookFrameCache resultFrameCache(nativeHookFrame, 0);
641 EXPECT_TRUE(expectFrameCache == resultFrameCache);
642 EXPECT_EQ(1, nativeHookFrame.Size());
643 auto eventCount =
644 stream_.traceDataCache_->GetConstStatAndInfo().GetValue(TRACE_NATIVE_HOOK_MALLOC, STAT_EVENT_RECEIVED);
645 EXPECT_TRUE(1 == eventCount);
646 }
647
648 /**
649 * @tc.name: ParseBatchNativeHookWithMultipleMalloc
650 * @tc.desc: Parse a NativeHook with multiple Malloc and Frame
651 * @tc.type: FUNC
652 */
653 HWTEST_F(NativeHookParserTest, ParseBatchNativeHookWithMultipleMalloc, TestSize.Level1)
654 {
655 TS_LOGI("test24-3");
656 PbreaderDataSegment dataSeg;
657 BatchNativeHookData batchNativeHookData = CreateBatchNativeHookData(dataSeg);
658 PbreaderNativeHookParser htraceNativeHookParser(stream_.traceDataCache_.get(), stream_.streamFilters_.get());
659 bool hasSplit = false;
660 htraceNativeHookParser.Parse(dataSeg, hasSplit);
661 htraceNativeHookParser.FinishParseNativeHookData();
662 const NativeHook &nativeHook = stream_.traceDataCache_->GetConstNativeHookData();
663 const NativeHookFrame &nativeHookFrame = stream_.traceDataCache_->GetConstNativeHookFrameData();
664 auto expect_ipid = stream_.streamFilters_->processFilter_->GetInternalPid(PID);
665 auto expect_itid = stream_.streamFilters_->processFilter_->GetInternalTid(TID_01);
666 EXPECT_TRUE(SIZE_01 == nativeHook.AllMemSizes()[0]);
667 EXPECT_TRUE(nativeHook.CurrentSizeDurs()[0] == TIMESTAMP_02 - TIMESTAMP_01);
668 NativeHookCache firstExpectNativeHookCache(1, expect_ipid, expect_itid, ALLOCEVENT.c_str(), INVALID_UINT64,
669 TIMESTAMP_01, 0, 0, ADDR_01, SIZE_01, SIZE_01,
670 TIMESTAMP_02 - TIMESTAMP_01);
671 NativeHookCache firstResultNativeHookCache(nativeHook, 0);
672 EXPECT_TRUE(firstExpectNativeHookCache == firstResultNativeHookCache);
673 auto firstExpectSymbol = stream_.traceDataCache_->dataDict_.GetStringIndex(SYMBOL_NAME_02);
674 auto firstExpectFilePath = stream_.traceDataCache_->dataDict_.GetStringIndex(FILE_PATH_02);
675 NativeHookFrameCache firstMallocExpectFirstFrame(1, 0, IP_02, firstExpectSymbol, firstExpectFilePath, OFFSET_02,
676 SYMBOL_OFFSET_02);
677 EXPECT_TRUE(firstMallocExpectFirstFrame == NativeHookFrameCache(nativeHookFrame, 0));
678 auto secondExpectSymbol = stream_.traceDataCache_->dataDict_.GetStringIndex(SYMBOL_NAME_01);
679 auto secondExpectFilePath = stream_.traceDataCache_->dataDict_.GetStringIndex(FILE_PATH_01);
680 NativeHookFrameCache firstMallocExpectSecondFrame(1, 1, IP_01, secondExpectSymbol, secondExpectFilePath, OFFSET_01,
681 SYMBOL_OFFSET_01);
682 NativeHookFrameCache firstMallocResultSecondFrame(nativeHookFrame, 1);
683 EXPECT_TRUE(firstMallocExpectSecondFrame == firstMallocResultSecondFrame);
684 expect_itid = stream_.streamFilters_->processFilter_->GetInternalTid(TID_02);
685 NativeHookCache secondExpectNativeHookCache(1, expect_ipid, expect_itid, ALLOCEVENT.c_str(), INVALID_UINT64,
686 TIMESTAMP_02, 0, 0, ADDR_02, SIZE_02, SIZE_01 + SIZE_02, 0);
687 NativeHookCache secondResultNativeHookCache(nativeHook, 1);
688 EXPECT_TRUE(secondExpectNativeHookCache == secondResultNativeHookCache);
689 NativeHookFrameCache secondMallocExpectFirstFrame(1, 0, IP_02, firstExpectSymbol, firstExpectFilePath, OFFSET_02,
690 SYMBOL_OFFSET_02);
691 EXPECT_EQ(nativeHookFrame.CallChainIds()[1], 1);
692 EXPECT_EQ(nativeHookFrame.Depths()[1], 1);
693 EXPECT_EQ(nativeHookFrame.Ips()[1], IP_01);
694 EXPECT_EQ(nativeHookFrame.SymbolNames()[1], secondExpectSymbol);
695 EXPECT_EQ(nativeHookFrame.FilePaths()[1], secondExpectFilePath);
696 EXPECT_EQ(nativeHookFrame.Offsets()[1], OFFSET_01);
697 EXPECT_EQ(nativeHookFrame.SymbolOffsets()[1], SYMBOL_OFFSET_01);
698 }
699
700 /**
701 * @tc.name: ParseBatchNativeHookWithOneFree
702 * @tc.desc: Parse a BatchNativeHookData with only one Free
703 * @tc.type: FUNC
704 */
705 HWTEST_F(NativeHookParserTest, ParseBatchNativeHookWithOneFree, TestSize.Level1)
706 {
707 TS_LOGI("test24-4");
708
709 // construct BatchNativeHookData
710 BatchNativeHookData batchNativeHookData;
711 SetFreeEvent(batchNativeHookData, {TID_01, ADDR_01, 0, "", SEC_01, NSEC_01}, false);
712
713 // start parse
714 PbreaderNativeHookParser htraceNativeHookParser(stream_.traceDataCache_.get(), stream_.streamFilters_.get());
715
716 std::string hookStrMsg = "";
717 batchNativeHookData.SerializeToString(&hookStrMsg);
718 PbreaderDataSegment dataSeg;
719 dataSeg.seg = std::make_shared<std::string>(hookStrMsg);
720 ProtoReader::BytesView hookBytesView(reinterpret_cast<const uint8_t *>(hookStrMsg.data()), hookStrMsg.size());
721 dataSeg.protoData = hookBytesView;
722 bool hasSplit = false;
723 htraceNativeHookParser.Parse(dataSeg, hasSplit);
724 htraceNativeHookParser.FinishParseNativeHookData();
725
726 auto size = stream_.traceDataCache_->GetConstNativeHookData().Size();
727 EXPECT_EQ(0, size);
728 size = stream_.traceDataCache_->GetConstNativeHookFrameData().Size();
729 EXPECT_EQ(0, size);
730 auto eventCount =
731 stream_.traceDataCache_->GetConstStatAndInfo().GetValue(TRACE_NATIVE_HOOK_FREE, STAT_EVENT_RECEIVED);
732 EXPECT_TRUE(1 == eventCount);
733 }
734
735 /**
736 * @tc.name: ParseBatchNativeHookWithMultipleFree
737 * @tc.desc: Parse a NativeHook with multiple Free and Frame
738 * @tc.type: FUNC
739 */
740 HWTEST_F(NativeHookParserTest, ParseBatchNativeHookWithMultipleFree, TestSize.Level1)
741 {
742 TS_LOGI("test24-5");
743
744 // construct BatchNativeHookData
745 BatchNativeHookData batchNativeHookData;
746 SetFreeEvent(batchNativeHookData, {TID_01, ADDR_01, 0, "", SEC_01, NSEC_01}, true);
747 SetFreeEvent(batchNativeHookData, {TID_02, ADDR_02, 0, "", SEC_02, NSEC_02}, true);
748
749 // start parse
750 PbreaderNativeHookParser htraceNativeHookParser(stream_.traceDataCache_.get(), stream_.streamFilters_.get());
751
752 std::string hookStrMsg = "";
753 batchNativeHookData.SerializeToString(&hookStrMsg);
754 PbreaderDataSegment dataSeg;
755 dataSeg.seg = std::make_shared<std::string>(hookStrMsg);
756 ProtoReader::BytesView hookBytesView(reinterpret_cast<const uint8_t *>(hookStrMsg.data()), hookStrMsg.size());
757 dataSeg.protoData = hookBytesView;
758 bool hasSplit = false;
759 htraceNativeHookParser.Parse(dataSeg, hasSplit);
760 htraceNativeHookParser.FinishParseNativeHookData();
761
762 // Verification parse NativeHook results
763 // Calculate partial expectations
764 const NativeHook &nativeHook = stream_.traceDataCache_->GetConstNativeHookData();
765 const NativeHookFrame &nativeHookFrame = stream_.traceDataCache_->GetConstNativeHookFrameData();
766 EXPECT_TRUE(0 == nativeHook.Size());
767 EXPECT_TRUE(0 == nativeHookFrame.Size());
768
769 auto eventCount =
770 stream_.traceDataCache_->GetConstStatAndInfo().GetValue(TRACE_NATIVE_HOOK_FREE, STAT_EVENT_RECEIVED);
771 EXPECT_TRUE(INDEX_SIZE_02 == eventCount);
772 }
773
774 /**
775 * @tc.name: ParseBatchNativeHookWithOnePairsMallocAndFree
776 * @tc.desc: Parse a BatchNativeHookData with a pair of matching Malloc and Free Event
777 * @tc.type: FUNC
778 */
779 HWTEST_F(NativeHookParserTest, ParseBatchNativeHookWithOnePairsMallocAndFree, TestSize.Level1)
780 {
781 TS_LOGI("test24-6");
782
783 // construct BatchNativeHookData
784 BatchNativeHookData batchNativeHookData;
785 SetAllocEvent(batchNativeHookData, {TID_01, ADDR_01, SIZE_01, "", SEC_01, NSEC_01});
786 SetFreeEvent(batchNativeHookData, {TID_02, ADDR_01, 0, "", SEC_02, NSEC_02}, false, true);
787
788 // start parse
789 PbreaderNativeHookParser htraceNativeHookParser(stream_.traceDataCache_.get(), stream_.streamFilters_.get());
790
791 std::string hookStrMsg = "";
792 batchNativeHookData.SerializeToString(&hookStrMsg);
793 PbreaderDataSegment dataSeg;
794 dataSeg.seg = std::make_shared<std::string>(hookStrMsg);
795 ProtoReader::BytesView hookBytesView(reinterpret_cast<const uint8_t *>(hookStrMsg.data()), hookStrMsg.size());
796 dataSeg.protoData = hookBytesView;
797 bool hasSplit = false;
798 htraceNativeHookParser.Parse(dataSeg, hasSplit);
799 htraceNativeHookParser.FinishParseNativeHookData();
800
801 // Verification parse Malloc event results
802 auto expect_ipid = stream_.streamFilters_->processFilter_->GetInternalPid(PID);
803 auto expect_itid = stream_.streamFilters_->processFilter_->GetInternalTid(TID_01);
804 NativeHookCache firstExpectNativeHookCache(1, expect_ipid, expect_itid, ALLOCEVENT.c_str(), INVALID_UINT64,
805 TIMESTAMP_01, TIMESTAMP_02, TIMESTAMP_02 - TIMESTAMP_01, ADDR_01,
806 SIZE_01, SIZE_01, TIMESTAMP_02 - TIMESTAMP_01);
807 const NativeHook &nativeHook = stream_.traceDataCache_->GetConstNativeHookData();
808 NativeHookCache firstResultNativeHookCache(nativeHook, 0);
809 EXPECT_TRUE(firstExpectNativeHookCache == firstResultNativeHookCache);
810
811 // Verification parse Malloc Frame results
812 const NativeHookFrame &nativeHookFrame = stream_.traceDataCache_->GetConstNativeHookFrameData();
813 auto expectSymbolData = stream_.traceDataCache_->dataDict_.GetStringIndex(SYMBOL_NAME_01);
814 auto expectFilePathData = stream_.traceDataCache_->dataDict_.GetStringIndex(FILE_PATH_01);
815 NativeHookFrameCache secondExpectFrameCache(1, 0, IP_01, expectSymbolData, expectFilePathData, OFFSET_01,
816 SYMBOL_OFFSET_01);
817 NativeHookFrameCache secondResultFrameCache(nativeHookFrame, 0);
818 EXPECT_TRUE(secondExpectFrameCache == secondResultFrameCache);
819
820 // Verification parse Free event results
821 expect_itid = stream_.streamFilters_->processFilter_->GetInternalTid(TID_02);
822 NativeHookCache expectNativeHookCache(INDEX_SIZE_02, expect_ipid, expect_itid, FREEEVENT.c_str(), INVALID_UINT64,
823 TIMESTAMP_02, 0, 0, ADDR_01, SIZE_01, 0, 0);
824 NativeHookCache resultNativeHookCache(nativeHook, 1);
825 EXPECT_TRUE(expectNativeHookCache == resultNativeHookCache);
826
827 // Verification parse Free Event Frame results
828 expectSymbolData = stream_.traceDataCache_->dataDict_.GetStringIndex(SYMBOL_NAME_02);
829 expectFilePathData = stream_.traceDataCache_->dataDict_.GetStringIndex(FILE_PATH_02);
830 NativeHookFrameCache expectFrameCache(INDEX_SIZE_02, 0, IP_02, expectSymbolData, expectFilePathData, OFFSET_02,
831 SYMBOL_OFFSET_02);
832 NativeHookFrameCache resultFrameCache(nativeHookFrame, 1);
833 EXPECT_TRUE(expectFrameCache == resultFrameCache);
834
835 auto size = nativeHookFrame.Size();
836 EXPECT_EQ(INDEX_SIZE_02, size);
837
838 auto &statAndInfo = stream_.traceDataCache_->GetConstStatAndInfo();
839 EXPECT_TRUE(1 == statAndInfo.GetValue(TRACE_NATIVE_HOOK_FREE, STAT_EVENT_RECEIVED));
840 EXPECT_TRUE(1 == statAndInfo.GetValue(TRACE_NATIVE_HOOK_MALLOC, STAT_EVENT_RECEIVED));
841 }
842
843 /**
844 * @tc.name: ParseBatchNativeHookWithNotMatchMallocAndFree
845 * @tc.desc: Parse a BatchNativeHookData with Not Match Malloc and Free Event
846 * @tc.type: FUNC
847 */
848 HWTEST_F(NativeHookParserTest, ParseBatchNativeHookWithNotMatchMallocAndFree, TestSize.Level1)
849 {
850 TS_LOGI("test24-7");
851
852 // construct BatchNativeHookData
853 BatchNativeHookData batchNativeHookData;
854 SetAllocEvent(batchNativeHookData, {TID_01, ADDR_01, SIZE_01, "", SEC_01, NSEC_01});
855 SetFreeEvent(batchNativeHookData, {TID_02, ADDR_02, 0, "", SEC_02, NSEC_02}, false, true);
856
857 // start parse
858 PbreaderNativeHookParser htraceNativeHookParser(stream_.traceDataCache_.get(), stream_.streamFilters_.get());
859
860 std::string hookStrMsg = "";
861 batchNativeHookData.SerializeToString(&hookStrMsg);
862 PbreaderDataSegment dataSeg;
863 dataSeg.seg = std::make_shared<std::string>(hookStrMsg);
864 ProtoReader::BytesView hookBytesView(reinterpret_cast<const uint8_t *>(hookStrMsg.data()), hookStrMsg.size());
865 dataSeg.protoData = hookBytesView;
866 bool hasSplit = false;
867 htraceNativeHookParser.Parse(dataSeg, hasSplit);
868 htraceNativeHookParser.FinishParseNativeHookData();
869
870 // Verification parse Malloc event results
871 auto expect_ipid = stream_.streamFilters_->processFilter_->GetInternalPid(PID);
872 auto expect_itid = stream_.streamFilters_->processFilter_->GetInternalTid(TID_01);
873 NativeHookCache firstExpectNativeHookCache(1, expect_ipid, expect_itid, ALLOCEVENT.c_str(), INVALID_UINT64,
874 TIMESTAMP_01, 0, 0, ADDR_01, SIZE_01, SIZE_01, 0);
875 const NativeHook &nativeHook = stream_.traceDataCache_->GetConstNativeHookData();
876 NativeHookCache firstResultNativeHookCache(nativeHook, 0);
877 EXPECT_TRUE(firstExpectNativeHookCache == firstResultNativeHookCache);
878
879 // Verification parse Malloc Frame results
880 const NativeHookFrame &nativeHookFrame = stream_.traceDataCache_->GetConstNativeHookFrameData();
881 auto expectSymbolData = stream_.traceDataCache_->dataDict_.GetStringIndex(SYMBOL_NAME_01);
882 auto expectFilePathData = stream_.traceDataCache_->dataDict_.GetStringIndex(FILE_PATH_01);
883 NativeHookFrameCache firstExpectFrameCache(1, 0, IP_01, expectSymbolData, expectFilePathData, OFFSET_01,
884 SYMBOL_OFFSET_01);
885 NativeHookFrameCache firstResultFrameCache(nativeHookFrame, 0);
886 EXPECT_TRUE(firstExpectFrameCache == firstResultFrameCache);
887
888 auto size = nativeHookFrame.Size();
889 EXPECT_EQ(1, size);
890
891 auto &statAndInfo = stream_.traceDataCache_->GetConstStatAndInfo();
892 EXPECT_TRUE(1 == statAndInfo.GetValue(TRACE_NATIVE_HOOK_FREE, STAT_EVENT_RECEIVED));
893 EXPECT_TRUE(1 == statAndInfo.GetValue(TRACE_NATIVE_HOOK_MALLOC, STAT_EVENT_RECEIVED));
894 }
895
896 /**
897 * @tc.name: ParseTwoMallocAndFreeEventMatched
898 * @tc.desc: Parse a BatchNativeHookData with two Malloc and two Free Event, that Malloc and Free was matched.
899 * @tc.type: FUNC
900 */
901 HWTEST_F(NativeHookParserTest, ParseTwoMallocAndFreeEventMatched, TestSize.Level1)
902 {
903 TS_LOGI("test24-8");
904
905 // construct BatchNativeHookData
906 BatchNativeHookData batchNativeHookData;
907 SetAllocEvent(batchNativeHookData, {TID_01, ADDR_01, SIZE_01, "", SEC_01, NSEC_01}, false, false);
908 SetFreeEvent(batchNativeHookData, {TID_01, ADDR_01, 0, "", SEC_02, NSEC_02}, false, false, false);
909 SetAllocEvent(batchNativeHookData, {TID_02, ADDR_02, SIZE_02, "", SEC_03, NSEC_03}, false, false);
910 SetFreeEvent(batchNativeHookData, {TID_02, ADDR_02, 0, "", SEC_04, NSEC_04}, false, false, false);
911
912 // start parse
913 PbreaderNativeHookParser htraceNativeHookParser(stream_.traceDataCache_.get(), stream_.streamFilters_.get());
914
915 std::string hookStrMsg = "";
916 batchNativeHookData.SerializeToString(&hookStrMsg);
917 PbreaderDataSegment dataSeg;
918 dataSeg.seg = std::make_shared<std::string>(hookStrMsg);
919 ProtoReader::BytesView hookBytesView(reinterpret_cast<const uint8_t *>(hookStrMsg.data()), hookStrMsg.size());
920 dataSeg.protoData = hookBytesView;
921 bool hasSplit = false;
922 htraceNativeHookParser.Parse(dataSeg, hasSplit);
923 htraceNativeHookParser.FinishParseNativeHookData();
924
925 // Verification parse first Malloc event results
926 const NativeHook &nativeHook = stream_.traceDataCache_->GetConstNativeHookData();
927 auto expect_ipid = stream_.streamFilters_->processFilter_->GetInternalPid(PID);
928 auto expect_itid = stream_.streamFilters_->processFilter_->GetInternalTid(TID_01);
929 NativeHookCache firstExpectMallocCache(INVALID_UINT32, expect_ipid, expect_itid, ALLOCEVENT.c_str(), INVALID_UINT64,
930 TIMESTAMP_01, TIMESTAMP_02, TIMESTAMP_02 - TIMESTAMP_01, ADDR_01, SIZE_01,
931 SIZE_01, TIMESTAMP_02 - TIMESTAMP_01);
932 NativeHookCache firstResultMallocCache(nativeHook, 0);
933 EXPECT_TRUE(firstExpectMallocCache == firstResultMallocCache);
934
935 // Verification parse first Free event results
936 NativeHookCache firstExpectFreeCache(INVALID_UINT32, expect_ipid, expect_itid, FREEEVENT.c_str(), INVALID_UINT64,
937 TIMESTAMP_02, 0, 0, ADDR_01, SIZE_01, 0, TIMESTAMP_03 - TIMESTAMP_02);
938 NativeHookCache firstResultFreeCache(nativeHook, 1);
939 EXPECT_TRUE(firstExpectFreeCache == firstResultFreeCache);
940
941 expect_itid = stream_.streamFilters_->processFilter_->GetInternalTid(TID_02);
942 NativeHookCache secondExpectMallocCache(INVALID_UINT32, expect_ipid, expect_itid, ALLOCEVENT.c_str(),
943 INVALID_UINT64, TIMESTAMP_03, TIMESTAMP_04, TIMESTAMP_04 - TIMESTAMP_03,
944 ADDR_02, SIZE_02, SIZE_02, TIMESTAMP_04 - TIMESTAMP_03);
945 NativeHookCache secondResultMallocCache(nativeHook, INDEX_SIZE_02);
946 EXPECT_TRUE(secondExpectMallocCache == secondResultMallocCache);
947
948 // Verification parse first Free event results
949 NativeHookCache secondExpectFreeCache(INVALID_UINT32, expect_ipid, expect_itid, FREEEVENT.c_str(), INVALID_UINT64,
950 TIMESTAMP_04, 0, 0, ADDR_02, SIZE_02, 0, 0);
951 NativeHookCache secondResultFreeCache(nativeHook, INDEX_SIZE_03);
952 EXPECT_TRUE(secondExpectFreeCache == secondResultFreeCache);
953
954 auto &statAndInfo = stream_.traceDataCache_->GetConstStatAndInfo();
955 EXPECT_TRUE(INDEX_SIZE_02 == statAndInfo.GetValue(TRACE_NATIVE_HOOK_FREE, STAT_EVENT_RECEIVED));
956 EXPECT_TRUE(INDEX_SIZE_02 == statAndInfo.GetValue(TRACE_NATIVE_HOOK_MALLOC, STAT_EVENT_RECEIVED));
957 }
958
959 /**
960 * @tc.name: ParseTwoMallocAndFreeEventPartialMatched
961 * @tc.desc: Parse a BatchNativeHookData with two Malloc and two Free Event, that Malloc and Free was partial
962 matched.
963 * @tc.type: FUNC
964 */
965 HWTEST_F(NativeHookParserTest, ParseTwoMallocAndFreeEventPartialMatched, TestSize.Level1)
966 {
967 TS_LOGI("test24-9");
968
969 // construct BatchNativeHookData
970 BatchNativeHookData batchNativeHookData;
971 SetAllocEvent(batchNativeHookData, {TID_01, ADDR_01, SIZE_01, "", SEC_01, NSEC_01}, false, false);
972 SetFreeEvent(batchNativeHookData, {TID_01, ADDR_01, 0, "", SEC_02, NSEC_02}, false, false, false);
973 SetAllocEvent(batchNativeHookData, {TID_02, ADDR_02, SIZE_02, "", SEC_03, NSEC_03}, false, false);
974 SetFreeEvent(batchNativeHookData, {TID_02, ADDR_03, 0, "", SEC_04, NSEC_04}, false, false, false);
975
976 // start parse
977 PbreaderNativeHookParser htraceNativeHookParser(stream_.traceDataCache_.get(), stream_.streamFilters_.get());
978 std::string hookStrMsg = "";
979 batchNativeHookData.SerializeToString(&hookStrMsg);
980 PbreaderDataSegment dataSeg;
981 dataSeg.seg = std::make_shared<std::string>(hookStrMsg);
982 ProtoReader::BytesView hookBytesView(reinterpret_cast<const uint8_t *>(hookStrMsg.data()), hookStrMsg.size());
983 dataSeg.protoData = hookBytesView;
984 bool hasSplit = false;
985 htraceNativeHookParser.Parse(dataSeg, hasSplit);
986 htraceNativeHookParser.FinishParseNativeHookData();
987
988 // Verification parse first Malloc event results
989 const NativeHook &nativeHook = stream_.traceDataCache_->GetConstNativeHookData();
990 auto expect_ipid = stream_.streamFilters_->processFilter_->GetInternalPid(PID);
991 auto expect_itid = stream_.streamFilters_->processFilter_->GetInternalTid(TID_01);
992 NativeHookCache firstExpectMallocCache(INVALID_UINT32, expect_ipid, expect_itid, ALLOCEVENT.c_str(), INVALID_UINT64,
993 TIMESTAMP_01, TIMESTAMP_02, TIMESTAMP_02 - TIMESTAMP_01, ADDR_01, SIZE_01,
994 SIZE_01, TIMESTAMP_02 - TIMESTAMP_01);
995 NativeHookCache firstResultMallocCache(nativeHook, 0);
996 EXPECT_TRUE(firstExpectMallocCache == firstResultMallocCache);
997
998 // Verification parse first Free event results
999 NativeHookCache firstExpectFreeCache(INVALID_UINT32, expect_ipid, expect_itid, FREEEVENT.c_str(), INVALID_UINT64,
1000 TIMESTAMP_02, 0, 0, ADDR_01, SIZE_01, 0, TIMESTAMP_03 - TIMESTAMP_02);
1001 NativeHookCache firstResultFreeCache(nativeHook, 1);
1002 EXPECT_TRUE(firstExpectFreeCache == firstResultFreeCache);
1003
1004 // Verification parse second Malloc event results
1005 expect_itid = stream_.streamFilters_->processFilter_->GetInternalTid(TID_02);
1006 NativeHookCache secondExpectMallocCache(INVALID_UINT32, expect_ipid, expect_itid, ALLOCEVENT.c_str(),
1007 INVALID_UINT64, TIMESTAMP_03, 0, 0, ADDR_02, SIZE_02, SIZE_02, 0);
1008 NativeHookCache secondResultMallocCache(nativeHook, INDEX_SIZE_02);
1009 EXPECT_TRUE(secondExpectMallocCache == secondResultMallocCache);
1010
1011 auto &statAndInfo = stream_.traceDataCache_->GetConstStatAndInfo();
1012 EXPECT_TRUE(INDEX_SIZE_02 == statAndInfo.GetValue(TRACE_NATIVE_HOOK_FREE, STAT_EVENT_RECEIVED));
1013 EXPECT_TRUE(INDEX_SIZE_02 == statAndInfo.GetValue(TRACE_NATIVE_HOOK_MALLOC, STAT_EVENT_RECEIVED));
1014 }
1015
1016 /**
1017 * @tc.name: ParseBatchNativeHookWithOneMmap
1018 * @tc.desc: Parse a BatchNativeHookData with only one MMAP
1019 * @tc.type: FUNC
1020 */
1021 HWTEST_F(NativeHookParserTest, ParseBatchNativeHookWithOneMmap, TestSize.Level1)
1022 {
1023 TS_LOGI("test24-10");
1024
1025 // construct BatchNativeHookData
1026 BatchNativeHookData batchNativeHookData;
1027 SetMmapEvent(batchNativeHookData, {TID_01, ADDR_01, SIZE_01, TYPE_01, SEC_01, NSEC_01});
1028
1029 // start parse
1030 PbreaderNativeHookParser htraceNativeHookParser(stream_.traceDataCache_.get(), stream_.streamFilters_.get());
1031 std::string hookStrMsg = "";
1032 batchNativeHookData.SerializeToString(&hookStrMsg);
1033 PbreaderDataSegment dataSeg;
1034 dataSeg.seg = std::make_shared<std::string>(hookStrMsg);
1035 ProtoReader::BytesView hookBytesView(reinterpret_cast<const uint8_t *>(hookStrMsg.data()), hookStrMsg.size());
1036 dataSeg.protoData = hookBytesView;
1037 bool hasSplit = false;
1038 htraceNativeHookParser.Parse(dataSeg, hasSplit);
1039 htraceNativeHookParser.FinishParseNativeHookData();
1040
1041 // Verification parse NativeHook results
1042 auto expect_ipid = stream_.streamFilters_->processFilter_->GetInternalPid(PID);
1043 auto expect_itid = stream_.streamFilters_->processFilter_->GetInternalTid(TID_01);
1044 auto mmapSubType = stream_.traceDataCache_->dataDict_.GetStringIndex(TYPE_01);
1045 NativeHookCache expectNativeHookCache(1, expect_ipid, expect_itid, MMAPEVENT.c_str(), mmapSubType, TIMESTAMP_01, 0,
1046 0, ADDR_01, SIZE_01, SIZE_01, 0);
1047 const NativeHook &nativeHook = stream_.traceDataCache_->GetConstNativeHookData();
1048 NativeHookCache resultNativeHookCache(nativeHook, 0);
1049 EXPECT_TRUE(expectNativeHookCache == resultNativeHookCache);
1050
1051 auto size = stream_.traceDataCache_->GetConstNativeHookData().Size();
1052 EXPECT_EQ(1, size);
1053
1054 // Verification parse NativeHook Frame results
1055 const NativeHookFrame &nativeHookFrame = stream_.traceDataCache_->GetConstNativeHookFrameData();
1056 auto expectSymbolData = stream_.traceDataCache_->dataDict_.GetStringIndex(SYMBOL_NAME_01);
1057 auto expectFilePathData = stream_.traceDataCache_->dataDict_.GetStringIndex(FILE_PATH_01);
1058 NativeHookFrameCache expectFrameCache(1, 0, IP_01, expectSymbolData, expectFilePathData, OFFSET_01,
1059 SYMBOL_OFFSET_01);
1060 NativeHookFrameCache resultFrameCache(nativeHookFrame, 0);
1061 EXPECT_TRUE(expectFrameCache == resultFrameCache);
1062
1063 size = nativeHookFrame.Size();
1064 EXPECT_EQ(1, size);
1065
1066 auto eventCount =
1067 stream_.traceDataCache_->GetConstStatAndInfo().GetValue(TRACE_NATIVE_HOOK_MMAP, STAT_EVENT_RECEIVED);
1068 EXPECT_TRUE(1 == eventCount);
1069 }
1070
1071 /**
1072 * @tc.name: ParseBatchNativeHookWithOneMunmap
1073 * @tc.desc: Parse a BatchNativeHookData with only one MMAP
1074 * @tc.type: FUNC
1075 */
1076 HWTEST_F(NativeHookParserTest, ParseBatchNativeHookWithOneMunmap, TestSize.Level1)
1077 {
1078 TS_LOGI("test24-11");
1079
1080 // construct BatchNativeHookData
1081 BatchNativeHookData batchNativeHookData;
1082 SetMunmapEvent(batchNativeHookData, {TID_01, ADDR_01, SIZE_01, "", SEC_01, NSEC_01}, false, true);
1083
1084 // start parse
1085 PbreaderNativeHookParser htraceNativeHookParser(stream_.traceDataCache_.get(), stream_.streamFilters_.get());
1086 std::string hookStrMsg = "";
1087 batchNativeHookData.SerializeToString(&hookStrMsg);
1088 PbreaderDataSegment dataSeg;
1089 dataSeg.seg = std::make_shared<std::string>(hookStrMsg);
1090 ProtoReader::BytesView hookBytesView(reinterpret_cast<const uint8_t *>(hookStrMsg.data()), hookStrMsg.size());
1091 dataSeg.protoData = hookBytesView;
1092 bool hasSplit = false;
1093 htraceNativeHookParser.Parse(dataSeg, hasSplit);
1094 htraceNativeHookParser.FinishParseNativeHookData();
1095
1096 auto size = stream_.traceDataCache_->GetConstNativeHookData().Size();
1097 EXPECT_EQ(0, size);
1098
1099 // Verification parse NativeHook Frame results
1100 const NativeHookFrame &nativeHookFrame = stream_.traceDataCache_->GetConstNativeHookFrameData();
1101
1102 size = nativeHookFrame.Size();
1103 EXPECT_EQ(0, size);
1104
1105 auto eventCount =
1106 stream_.traceDataCache_->GetConstStatAndInfo().GetValue(TRACE_NATIVE_HOOK_MUNMAP, STAT_EVENT_RECEIVED);
1107 EXPECT_TRUE(1 == eventCount);
1108 }
1109
1110 /**
1111 * @tc.name: ParseBatchNativeHookWithMultipleMmap
1112 * @tc.desc: Parse a BatchNativeHookData with multiple MMAP
1113 * @tc.type: FUNC
1114 */
1115 HWTEST_F(NativeHookParserTest, ParseBatchNativeHookWithMultipleMmap, TestSize.Level1)
1116 {
1117 TS_LOGI("test24-12");
1118 BatchNativeHookData batchNativeHookData;
1119 SetMmapEvent(batchNativeHookData, {TID_01, ADDR_01, SIZE_01, TYPE_01, SEC_01, NSEC_01});
1120 SetMmapEvent(batchNativeHookData, {TID_02, ADDR_02, SIZE_02, TYPE_02, SEC_02, NSEC_02}, false, true);
1121 PbreaderNativeHookParser htraceNativeHookParser(stream_.traceDataCache_.get(), stream_.streamFilters_.get());
1122 std::string hookStrMsg = "";
1123 batchNativeHookData.SerializeToString(&hookStrMsg);
1124 PbreaderDataSegment dataSeg;
1125 dataSeg.seg = std::make_shared<std::string>(hookStrMsg);
1126 ProtoReader::BytesView hookBytesView(reinterpret_cast<const uint8_t *>(hookStrMsg.data()), hookStrMsg.size());
1127 dataSeg.protoData = hookBytesView;
1128 bool hasSplit = false;
1129 htraceNativeHookParser.Parse(dataSeg, hasSplit);
1130 htraceNativeHookParser.FinishParseNativeHookData();
1131 const NativeHook &nativeHook = stream_.traceDataCache_->GetConstNativeHookData();
1132 auto expect_ipid = stream_.streamFilters_->processFilter_->GetInternalPid(PID);
1133 auto expect_itid = stream_.streamFilters_->processFilter_->GetInternalTid(TID_01);
1134 auto mmapSubType = stream_.traceDataCache_->dataDict_.GetStringIndex(TYPE_01);
1135
1136 NativeHookCache firstExpectNativeHookCache(1, expect_ipid, expect_itid, MMAPEVENT.c_str(), mmapSubType,
1137 TIMESTAMP_01, 0, 0, ADDR_01, SIZE_01, SIZE_01,
1138 TIMESTAMP_02 - TIMESTAMP_01);
1139 EXPECT_TRUE(firstExpectNativeHookCache == NativeHookCache(nativeHook, 0));
1140
1141 expect_itid = stream_.streamFilters_->processFilter_->GetInternalTid(TID_02);
1142 mmapSubType = stream_.traceDataCache_->dataDict_.GetStringIndex(TYPE_02);
1143 NativeHookCache secondExpectNativeHookCache(INDEX_SIZE_02, expect_ipid, expect_itid, MMAPEVENT.c_str(), mmapSubType,
1144 TIMESTAMP_02, 0, 0, ADDR_02, SIZE_02, SIZE_01 + SIZE_02, 0);
1145 EXPECT_TRUE(secondExpectNativeHookCache == NativeHookCache(nativeHook, 1));
1146 EXPECT_EQ(INDEX_SIZE_02, stream_.traceDataCache_->GetConstNativeHookData().Size());
1147 const NativeHookFrame &nativeHookFrame = stream_.traceDataCache_->GetConstNativeHookFrameData();
1148 auto expectSymbolData = stream_.traceDataCache_->dataDict_.GetStringIndex(SYMBOL_NAME_01);
1149 auto expectFilePathData = stream_.traceDataCache_->dataDict_.GetStringIndex(FILE_PATH_01);
1150 NativeHookFrameCache firstExpectFrameCache(1, 0, IP_01, expectSymbolData, expectFilePathData, OFFSET_01,
1151 SYMBOL_OFFSET_01);
1152 EXPECT_TRUE(firstExpectFrameCache == NativeHookFrameCache(nativeHookFrame, 0));
1153
1154 expectSymbolData = stream_.traceDataCache_->dataDict_.GetStringIndex(SYMBOL_NAME_02);
1155 expectFilePathData = stream_.traceDataCache_->dataDict_.GetStringIndex(FILE_PATH_02);
1156 NativeHookFrameCache expectFrameCache(INDEX_SIZE_02, 0, IP_02, expectSymbolData, expectFilePathData, OFFSET_02,
1157 SYMBOL_OFFSET_02);
1158 EXPECT_TRUE(expectFrameCache == NativeHookFrameCache(nativeHookFrame, 1));
1159 EXPECT_EQ(INDEX_SIZE_02, nativeHookFrame.Size());
1160 EXPECT_EQ(INDEX_SIZE_02,
1161 stream_.traceDataCache_->GetConstStatAndInfo().GetValue(TRACE_NATIVE_HOOK_MMAP, STAT_EVENT_RECEIVED));
1162 }
1163
1164 /**
1165 * @tc.name: ParseBatchNativeHookWithMultipleMunmap
1166 * @tc.desc: Parse a BatchNativeHookData with multiple munmap
1167 * @tc.type: FUNC
1168 */
1169 HWTEST_F(NativeHookParserTest, ParseBatchNativeHookWithMultipleMunmap, TestSize.Level1)
1170 {
1171 TS_LOGI("test24-13");
1172
1173 // construct BatchNativeHookData
1174 BatchNativeHookData batchNativeHookData;
1175 SetMunmapEvent(batchNativeHookData, {TID_01, ADDR_01, SIZE_01, "", SEC_01, NSEC_01}, false, true);
1176 SetMunmapEvent(batchNativeHookData, {TID_02, ADDR_02, SIZE_02, "", SEC_02, NSEC_02}, true, true);
1177
1178 // start parse
1179 PbreaderNativeHookParser htraceNativeHookParser(stream_.traceDataCache_.get(), stream_.streamFilters_.get());
1180 std::string hookStrMsg = "";
1181 batchNativeHookData.SerializeToString(&hookStrMsg);
1182 PbreaderDataSegment dataSeg;
1183 dataSeg.seg = std::make_shared<std::string>(hookStrMsg);
1184 ProtoReader::BytesView hookBytesView(reinterpret_cast<const uint8_t *>(hookStrMsg.data()), hookStrMsg.size());
1185 dataSeg.protoData = hookBytesView;
1186 bool hasSplit = false;
1187 htraceNativeHookParser.Parse(dataSeg, hasSplit);
1188 htraceNativeHookParser.FinishParseNativeHookData();
1189
1190 auto size = stream_.traceDataCache_->GetConstNativeHookData().Size();
1191 EXPECT_EQ(0, size);
1192
1193 // Verification parse NativeHook Frame results
1194 const NativeHookFrame &nativeHookFrame = stream_.traceDataCache_->GetConstNativeHookFrameData();
1195
1196 size = nativeHookFrame.Size();
1197 EXPECT_EQ(0, size);
1198
1199 auto eventCount =
1200 stream_.traceDataCache_->GetConstStatAndInfo().GetValue(TRACE_NATIVE_HOOK_MUNMAP, STAT_EVENT_RECEIVED);
1201 EXPECT_TRUE(INDEX_SIZE_02 == eventCount);
1202 }
1203
1204 /**
1205 * @tc.name: ParseOnePairsMmapAndMunmapEvent
1206 * @tc.desc: Parse a BatchNativeHookData with one pairs Mmap and MunmapEvent
1207 * @tc.type: FUNC
1208 */
1209 HWTEST_F(NativeHookParserTest, ParseOnePairsMmapAndMunmapEvent, TestSize.Level1)
1210 {
1211 TS_LOGI("test24-14");
1212
1213 // construct BatchNativeHookData
1214 BatchNativeHookData batchNativeHookData;
1215 SetMmapEvent(batchNativeHookData, {TID_01, ADDR_01, SIZE_01, TYPE_01, SEC_01, NSEC_01}, true);
1216 SetMunmapEvent(batchNativeHookData, {TID_01, ADDR_01, SIZE_01, "", SEC_02, NSEC_02}, false, false);
1217
1218 // start parse
1219 PbreaderNativeHookParser htraceNativeHookParser(stream_.traceDataCache_.get(), stream_.streamFilters_.get());
1220 std::string hookStrMsg = "";
1221 batchNativeHookData.SerializeToString(&hookStrMsg);
1222 PbreaderDataSegment dataSeg;
1223 dataSeg.seg = std::make_shared<std::string>(hookStrMsg);
1224 ProtoReader::BytesView hookBytesView(reinterpret_cast<const uint8_t *>(hookStrMsg.data()), hookStrMsg.size());
1225 dataSeg.protoData = hookBytesView;
1226 bool hasSplit = false;
1227 htraceNativeHookParser.Parse(dataSeg, hasSplit);
1228 htraceNativeHookParser.FinishParseNativeHookData();
1229
1230 // Verification parse NativeHook results
1231 const NativeHook &nativeHook = stream_.traceDataCache_->GetConstNativeHookData();
1232 auto expect_ipid = stream_.streamFilters_->processFilter_->GetInternalPid(PID);
1233 auto expect_itid = stream_.streamFilters_->processFilter_->GetInternalTid(TID_01);
1234 auto mmapSubType = stream_.traceDataCache_->dataDict_.GetStringIndex(TYPE_01);
1235 NativeHookCache firstExpectNativeHookCache(1, expect_ipid, expect_itid, MMAPEVENT.c_str(), mmapSubType,
1236 TIMESTAMP_01, TIMESTAMP_02, TIMESTAMP_02 - TIMESTAMP_01, ADDR_01,
1237 SIZE_01, SIZE_01, TIMESTAMP_02 - TIMESTAMP_01);
1238 NativeHookCache firstResultNativeHookCache(nativeHook, 0);
1239 EXPECT_TRUE(firstExpectNativeHookCache == firstResultNativeHookCache);
1240
1241 NativeHookCache secondExpectNativeHookCache(INVALID_UINT32, expect_ipid, expect_itid, MUNMAPEVENT.c_str(),
1242 mmapSubType, TIMESTAMP_02, 0, 0, ADDR_01, SIZE_01, 0, 0);
1243 NativeHookCache secondResultNativeHookCache(nativeHook, 1);
1244 EXPECT_TRUE(secondExpectNativeHookCache == secondResultNativeHookCache);
1245 EXPECT_EQ(INDEX_SIZE_02, stream_.traceDataCache_->GetConstNativeHookData().Size());
1246
1247 // Verification parse NativeHook Frame results
1248 const NativeHookFrame &nativeHookFrame = stream_.traceDataCache_->GetConstNativeHookFrameData();
1249 auto expectSymbolData = stream_.traceDataCache_->dataDict_.GetStringIndex(SYMBOL_NAME_02);
1250 auto expectFilePathData = stream_.traceDataCache_->dataDict_.GetStringIndex(FILE_PATH_02);
1251 NativeHookFrameCache firstExpectFrameCache(1, 0, IP_02, expectSymbolData, expectFilePathData, OFFSET_02,
1252 SYMBOL_OFFSET_02);
1253 NativeHookFrameCache firstResultFrameCache(nativeHookFrame, 0);
1254 EXPECT_TRUE(firstExpectFrameCache == firstResultFrameCache);
1255
1256 expectSymbolData = stream_.traceDataCache_->dataDict_.GetStringIndex(SYMBOL_NAME_01);
1257 expectFilePathData = stream_.traceDataCache_->dataDict_.GetStringIndex(FILE_PATH_01);
1258 NativeHookFrameCache secondExpectFrameCache(1, 1, IP_01, expectSymbolData, expectFilePathData, OFFSET_01,
1259 SYMBOL_OFFSET_01);
1260 NativeHookFrameCache secondResultFrameCache(nativeHookFrame, 1);
1261 EXPECT_TRUE(secondExpectFrameCache == secondResultFrameCache);
1262 EXPECT_EQ(INDEX_SIZE_02, nativeHookFrame.Size());
1263
1264 auto &statAndInfo = stream_.traceDataCache_->GetConstStatAndInfo();
1265 EXPECT_TRUE(1 == statAndInfo.GetValue(TRACE_NATIVE_HOOK_MMAP, STAT_EVENT_RECEIVED));
1266 EXPECT_TRUE(1 == statAndInfo.GetValue(TRACE_NATIVE_HOOK_MUNMAP, STAT_EVENT_RECEIVED));
1267 }
1268
1269 /**
1270 * @tc.name: ParseNotMatchMmapAndMunmapEvent
1271 * @tc.desc: Parse a BatchNativeHookData with not match Mmap and MunmapEvent
1272 * @tc.type: FUNC
1273 */
1274 HWTEST_F(NativeHookParserTest, ParseNotMatchMmapAndMunmapEvent, TestSize.Level1)
1275 {
1276 TS_LOGI("test24-15");
1277
1278 // construct BatchNativeHookData
1279 BatchNativeHookData batchNativeHookData;
1280 SetMmapEvent(batchNativeHookData, {TID_01, ADDR_01, SIZE_01, TYPE_01, SEC_01, NSEC_01}, true);
1281 SetMunmapEvent(batchNativeHookData, {TID_01, ADDR_02, SIZE_01, "", SEC_02, NSEC_02}, false, false);
1282
1283 // start parse
1284 PbreaderNativeHookParser htraceNativeHookParser(stream_.traceDataCache_.get(), stream_.streamFilters_.get());
1285 std::string hookStrMsg = "";
1286 batchNativeHookData.SerializeToString(&hookStrMsg);
1287 PbreaderDataSegment dataSeg;
1288 dataSeg.seg = std::make_shared<std::string>(hookStrMsg);
1289 ProtoReader::BytesView hookBytesView(reinterpret_cast<const uint8_t *>(hookStrMsg.data()), hookStrMsg.size());
1290 dataSeg.protoData = hookBytesView;
1291 bool hasSplit = false;
1292 htraceNativeHookParser.Parse(dataSeg, hasSplit);
1293 htraceNativeHookParser.FinishParseNativeHookData();
1294
1295 // Verification parse NativeHook results
1296 const NativeHook &nativeHook = stream_.traceDataCache_->GetConstNativeHookData();
1297 auto expect_ipid = stream_.streamFilters_->processFilter_->GetInternalPid(PID);
1298 auto expect_itid = stream_.streamFilters_->processFilter_->GetInternalTid(TID_01);
1299 auto mmapSubType = stream_.traceDataCache_->dataDict_.GetStringIndex(TYPE_01);
1300 NativeHookCache firstExpectNativeHookCache(1, expect_ipid, expect_itid, MMAPEVENT.c_str(), mmapSubType,
1301 TIMESTAMP_01, 0, 0, ADDR_01, SIZE_01, SIZE_01, 0);
1302 NativeHookCache firstResultNativeHookCache(nativeHook, 0);
1303 EXPECT_TRUE(firstExpectNativeHookCache == firstResultNativeHookCache);
1304
1305 auto size = stream_.traceDataCache_->GetConstNativeHookData().Size();
1306 EXPECT_EQ(1, size);
1307
1308 // Verification parse NativeHook Frame results
1309 const NativeHookFrame &nativeHookFrame = stream_.traceDataCache_->GetConstNativeHookFrameData();
1310 auto expectSymbolData = stream_.traceDataCache_->dataDict_.GetStringIndex(SYMBOL_NAME_02);
1311 auto expectFilePathData = stream_.traceDataCache_->dataDict_.GetStringIndex(FILE_PATH_02);
1312 NativeHookFrameCache firstExpectFrameCache(1, 0, IP_02, expectSymbolData, expectFilePathData, OFFSET_02,
1313 SYMBOL_OFFSET_02);
1314 NativeHookFrameCache firstResultFrameCache(nativeHookFrame, 0);
1315 EXPECT_TRUE(firstExpectFrameCache == firstResultFrameCache);
1316
1317 expectSymbolData = stream_.traceDataCache_->dataDict_.GetStringIndex(SYMBOL_NAME_01);
1318 expectFilePathData = stream_.traceDataCache_->dataDict_.GetStringIndex(FILE_PATH_01);
1319 NativeHookFrameCache secondExpectFrameCache(1, 1, IP_01, expectSymbolData, expectFilePathData, OFFSET_01,
1320 SYMBOL_OFFSET_01);
1321 NativeHookFrameCache secondResultFrameCache(nativeHookFrame, 1);
1322 EXPECT_TRUE(secondExpectFrameCache == secondResultFrameCache);
1323
1324 size = nativeHookFrame.Size();
1325 EXPECT_EQ(INDEX_SIZE_02, size);
1326
1327 auto &statAndInfo = stream_.traceDataCache_->GetConstStatAndInfo();
1328 EXPECT_TRUE(1 == statAndInfo.GetValue(TRACE_NATIVE_HOOK_MMAP, STAT_EVENT_RECEIVED));
1329 EXPECT_TRUE(1 == statAndInfo.GetValue(TRACE_NATIVE_HOOK_MUNMAP, STAT_EVENT_RECEIVED));
1330 }
1331
1332 /**
1333 * @tc.name: ParseTwoPairsMatchedMmapAndMunmapEvent
1334 * @tc.desc: Parse a BatchNativeHookData with two pairs matched Mmap and MunmapEvent
1335 * @tc.type: FUNC
1336 */
1337 HWTEST_F(NativeHookParserTest, ParseTwoPairsMatchedMmapAndMunmapEvent, TestSize.Level1)
1338 {
1339 TS_LOGI("test24-16");
1340
1341 // construct BatchNativeHookData
1342 BatchNativeHookData batchNativeHookData;
1343 SetMmapEvent(batchNativeHookData, {TID_01, ADDR_01, SIZE_01, TYPE_01, SEC_01, NSEC_01}, false, false, false);
1344 SetMunmapEvent(batchNativeHookData, {TID_01, ADDR_01, SIZE_01, "", SEC_02, NSEC_02}, false, false);
1345 SetMmapEvent(batchNativeHookData, {TID_01, ADDR_02, SIZE_02, TYPE_02, SEC_03, NSEC_03}, false, false, false);
1346 SetMunmapEvent(batchNativeHookData, {TID_01, ADDR_02, SIZE_02, "", SEC_04, NSEC_04}, false, false);
1347
1348 // start parse
1349 PbreaderNativeHookParser htraceNativeHookParser(stream_.traceDataCache_.get(), stream_.streamFilters_.get());
1350 std::string hookStrMsg = "";
1351 batchNativeHookData.SerializeToString(&hookStrMsg);
1352 PbreaderDataSegment dataSeg;
1353 dataSeg.seg = std::make_shared<std::string>(hookStrMsg);
1354 ProtoReader::BytesView hookBytesView(reinterpret_cast<const uint8_t *>(hookStrMsg.data()), hookStrMsg.size());
1355 dataSeg.protoData = hookBytesView;
1356 bool hasSplit = false;
1357 htraceNativeHookParser.Parse(dataSeg, hasSplit);
1358 htraceNativeHookParser.FinishParseNativeHookData();
1359
1360 // Verification parse NativeHook results
1361 const NativeHook &nativeHook = stream_.traceDataCache_->GetConstNativeHookData();
1362 auto expect_ipid = stream_.streamFilters_->processFilter_->GetInternalPid(PID);
1363 auto expect_itid = stream_.streamFilters_->processFilter_->GetInternalTid(TID_01);
1364 auto mmapSubType = stream_.traceDataCache_->dataDict_.GetStringIndex(TYPE_01);
1365 NativeHookCache firstExpectNativeHookCache(INVALID_UINT32, expect_ipid, expect_itid, MMAPEVENT.c_str(), mmapSubType,
1366 TIMESTAMP_01, TIMESTAMP_02, TIMESTAMP_02 - TIMESTAMP_01, ADDR_01,
1367 SIZE_01, SIZE_01, TIMESTAMP_02 - TIMESTAMP_01);
1368 NativeHookCache firstResultNativeHookCache(nativeHook, 0);
1369 EXPECT_TRUE(firstExpectNativeHookCache == firstResultNativeHookCache);
1370
1371 NativeHookCache secondExpectNativeHookCache(INVALID_UINT32, expect_ipid, expect_itid, MUNMAPEVENT.c_str(),
1372 mmapSubType, TIMESTAMP_02, 0, 0, ADDR_01, SIZE_01, 0,
1373 TIMESTAMP_03 - TIMESTAMP_02);
1374 NativeHookCache secondResultNativeHookCache(nativeHook, 1);
1375 EXPECT_TRUE(secondExpectNativeHookCache == secondResultNativeHookCache);
1376
1377 expect_itid = stream_.streamFilters_->processFilter_->GetInternalTid(TID_02);
1378 mmapSubType = stream_.traceDataCache_->dataDict_.GetStringIndex(TYPE_02);
1379 NativeHookCache thirdExpectNativeHookCache(INVALID_UINT32, expect_ipid, expect_itid, MMAPEVENT.c_str(), mmapSubType,
1380 TIMESTAMP_03, TIMESTAMP_04, TIMESTAMP_04 - TIMESTAMP_03, ADDR_02,
1381 SIZE_02, SIZE_02, TIMESTAMP_04 - TIMESTAMP_03);
1382 NativeHookCache thirdResultNativeHookCache(nativeHook, INDEX_SIZE_02);
1383 EXPECT_TRUE(thirdExpectNativeHookCache == thirdResultNativeHookCache);
1384
1385 NativeHookCache fourthExpectNativeHookCache(INVALID_UINT32, expect_ipid, expect_itid, MUNMAPEVENT.c_str(),
1386 mmapSubType, TIMESTAMP_04, 0, 0, ADDR_02, SIZE_02, 0, 0);
1387 NativeHookCache fourthResultNativeHookCache(nativeHook, INDEX_SIZE_03);
1388 EXPECT_TRUE(secondExpectNativeHookCache == secondResultNativeHookCache);
1389
1390 auto size = stream_.traceDataCache_->GetConstNativeHookData().Size();
1391 EXPECT_EQ(INDEX_SIZE_04, size);
1392
1393 auto &statAndInfo = stream_.traceDataCache_->GetConstStatAndInfo();
1394 EXPECT_TRUE(INDEX_SIZE_02 == statAndInfo.GetValue(TRACE_NATIVE_HOOK_MMAP, STAT_EVENT_RECEIVED));
1395 EXPECT_TRUE(INDEX_SIZE_02 == statAndInfo.GetValue(TRACE_NATIVE_HOOK_MUNMAP, STAT_EVENT_RECEIVED));
1396 }
1397
1398 /**
1399 * @tc.name: ParsePartialMatchedMmapAndMunmapEvent
1400 * @tc.desc: Parse a BatchNativeHookData with partial matched Mmap and MunmapEvent
1401 * @tc.type: FUNC
1402 */
1403 HWTEST_F(NativeHookParserTest, ParsePartialMatchedMmapAndMunmapEvent, TestSize.Level1)
1404 {
1405 TS_LOGI("test24-17");
1406
1407 // construct BatchNativeHookData
1408 BatchNativeHookData batchNativeHookData;
1409 SetMmapEvent(batchNativeHookData, {TID_01, ADDR_01, SIZE_01, TYPE_01, SEC_01, NSEC_01}, false, false, false);
1410 SetMunmapEvent(batchNativeHookData, {TID_01, ADDR_01, SIZE_01, "", SEC_02, NSEC_02}, false, false);
1411 SetMmapEvent(batchNativeHookData, {TID_01, ADDR_02, SIZE_02, TYPE_02, SEC_03, NSEC_03}, false, false, false);
1412 SetMunmapEvent(batchNativeHookData, {TID_01, ADDR_03, SIZE_02, "", SEC_04, NSEC_04}, false, false);
1413
1414 // start parse
1415 PbreaderNativeHookParser htraceNativeHookParser(stream_.traceDataCache_.get(), stream_.streamFilters_.get());
1416 std::string hookStrMsg = "";
1417 batchNativeHookData.SerializeToString(&hookStrMsg);
1418 PbreaderDataSegment dataSeg;
1419 dataSeg.seg = std::make_shared<std::string>(hookStrMsg);
1420 ProtoReader::BytesView hookBytesView(reinterpret_cast<const uint8_t *>(hookStrMsg.data()), hookStrMsg.size());
1421 dataSeg.protoData = hookBytesView;
1422 bool hasSplit = false;
1423 htraceNativeHookParser.Parse(dataSeg, hasSplit);
1424 htraceNativeHookParser.FinishParseNativeHookData();
1425
1426 // Verification parse NativeHook results
1427 const NativeHook &nativeHook = stream_.traceDataCache_->GetConstNativeHookData();
1428 auto expect_ipid = stream_.streamFilters_->processFilter_->GetInternalPid(PID);
1429 auto expect_itid = stream_.streamFilters_->processFilter_->GetInternalTid(TID_01);
1430 auto mmapSubType = stream_.traceDataCache_->dataDict_.GetStringIndex(TYPE_01);
1431 NativeHookCache firstExpectNativeHookCache(INVALID_UINT32, expect_ipid, expect_itid, MMAPEVENT.c_str(), mmapSubType,
1432 TIMESTAMP_01, TIMESTAMP_02, TIMESTAMP_02 - TIMESTAMP_01, ADDR_01,
1433 SIZE_01, SIZE_01, TIMESTAMP_02 - TIMESTAMP_01);
1434 NativeHookCache firstResultNativeHookCache(nativeHook, 0);
1435 EXPECT_TRUE(firstExpectNativeHookCache == firstResultNativeHookCache);
1436
1437 NativeHookCache secondExpectNativeHookCache(INVALID_UINT32, expect_ipid, expect_itid, MUNMAPEVENT.c_str(),
1438 mmapSubType, TIMESTAMP_02, 0, 0, ADDR_01, SIZE_01, 0,
1439 TIMESTAMP_03 - TIMESTAMP_02);
1440 NativeHookCache secondResultNativeHookCache(nativeHook, 1);
1441 EXPECT_TRUE(secondExpectNativeHookCache == secondResultNativeHookCache);
1442
1443 expect_itid = stream_.streamFilters_->processFilter_->GetInternalTid(TID_02);
1444 mmapSubType = stream_.traceDataCache_->dataDict_.GetStringIndex(TYPE_02);
1445 NativeHookCache thirdExpectNativeHookCache(INVALID_UINT32, expect_ipid, expect_itid, MMAPEVENT.c_str(), mmapSubType,
1446 TIMESTAMP_03, 0, 0, ADDR_02, SIZE_02, SIZE_02, 0);
1447 NativeHookCache thirdResultNativeHookCache(nativeHook, INDEX_SIZE_02);
1448 EXPECT_TRUE(thirdExpectNativeHookCache == thirdResultNativeHookCache);
1449
1450 NativeHookCache fourthExpectNativeHookCache(INVALID_UINT32, expect_ipid, expect_itid, MUNMAPEVENT.c_str(),
1451 mmapSubType, TIMESTAMP_04, 0, 0, ADDR_03, SIZE_02, SIZE_02, 0);
1452 NativeHookCache fourthResultNativeHookCache(nativeHook, INDEX_SIZE_03);
1453 EXPECT_TRUE(secondExpectNativeHookCache == secondResultNativeHookCache);
1454
1455 auto size = stream_.traceDataCache_->GetConstNativeHookData().Size();
1456 EXPECT_EQ(INDEX_SIZE_03, size);
1457
1458 auto &statAndInfo = stream_.traceDataCache_->GetConstStatAndInfo();
1459 EXPECT_TRUE(INDEX_SIZE_02 == statAndInfo.GetValue(TRACE_NATIVE_HOOK_MMAP, STAT_EVENT_RECEIVED));
1460 EXPECT_TRUE(INDEX_SIZE_02 == statAndInfo.GetValue(TRACE_NATIVE_HOOK_MUNMAP, STAT_EVENT_RECEIVED));
1461 }
1462
1463 /**
1464 * @tc.name: ParseBatchNativeHookWithAllTypesEvents
1465 * @tc.desc: Parse a BatchNativeHookData with one pairs Mmap and MunmapEvent and one pairs Malloc and Free
1466 * @tc.type: FUNC
1467 */
1468 HWTEST_F(NativeHookParserTest, ParseBatchNativeHookWithAllTypesEvents, TestSize.Level1)
1469 {
1470 TS_LOGI("test24-18");
1471
1472 // construct BatchNativeHookData
1473 BatchNativeHookData batchNativeHookData;
1474 SetMmapEvent(batchNativeHookData, {TID_01, ADDR_01, SIZE_01, TYPE_01, SEC_01, NSEC_01});
1475 SetMunmapEvent(batchNativeHookData, {TID_01, ADDR_01, SIZE_01, "", SEC_02, NSEC_02}, false, true);
1476 SetAllocEvent(batchNativeHookData, {TID_02, ADDR_02, SIZE_02, "", SEC_03, NSEC_03}, false, true, true);
1477 SetFreeEvent(batchNativeHookData, {TID_02, ADDR_02, 0, "", SEC_04, NSEC_04}, false, true);
1478
1479 // start parse
1480 PbreaderNativeHookParser htraceNativeHookParser(stream_.traceDataCache_.get(), stream_.streamFilters_.get());
1481 std::string hookStrMsg = "";
1482 batchNativeHookData.SerializeToString(&hookStrMsg);
1483 PbreaderDataSegment dataSeg;
1484 dataSeg.seg = std::make_shared<std::string>(hookStrMsg);
1485 ProtoReader::BytesView hookBytesView(reinterpret_cast<const uint8_t *>(hookStrMsg.data()), hookStrMsg.size());
1486 dataSeg.protoData = hookBytesView;
1487 bool hasSplit = false;
1488 htraceNativeHookParser.Parse(dataSeg, hasSplit);
1489 htraceNativeHookParser.FinishParseNativeHookData();
1490
1491 // Verification parse NativeHook results
1492 const NativeHook &nativeHook = stream_.traceDataCache_->GetConstNativeHookData();
1493 auto expect_ipid = stream_.streamFilters_->processFilter_->GetInternalPid(PID);
1494 auto expect_itid = stream_.streamFilters_->processFilter_->GetInternalTid(TID_01);
1495 auto mmapSubType = stream_.traceDataCache_->dataDict_.GetStringIndex(TYPE_01);
1496 NativeHookCache firstExpectNativeHookCache(1, expect_ipid, expect_itid, MMAPEVENT.c_str(), mmapSubType,
1497 TIMESTAMP_01, TIMESTAMP_02, TIMESTAMP_02 - TIMESTAMP_01, ADDR_01,
1498 SIZE_01, SIZE_01, TIMESTAMP_02 - TIMESTAMP_01);
1499 NativeHookCache firstResultNativeHookCache(nativeHook, 0);
1500 EXPECT_TRUE(firstExpectNativeHookCache == firstResultNativeHookCache);
1501
1502 NativeHookCache secondExpectNativeHookCache(1, expect_ipid, expect_itid, MUNMAPEVENT.c_str(), mmapSubType,
1503 TIMESTAMP_02, 0, 0, ADDR_01, SIZE_01, 0, 0);
1504 NativeHookCache secondResultNativeHookCache(nativeHook, 1);
1505 EXPECT_TRUE(secondExpectNativeHookCache == secondResultNativeHookCache);
1506
1507 expect_itid = stream_.streamFilters_->processFilter_->GetInternalTid(TID_02);
1508 NativeHookCache thirdExpectNativeHookCache(INDEX_SIZE_02, expect_ipid, expect_itid, ALLOCEVENT.c_str(),
1509 INVALID_UINT64, TIMESTAMP_03, TIMESTAMP_04, TIMESTAMP_04 - TIMESTAMP_03,
1510 ADDR_02, SIZE_02, SIZE_02, TIMESTAMP_04 - TIMESTAMP_03);
1511 NativeHookCache thirdResultNativeHookCache(nativeHook, INDEX_SIZE_02);
1512 EXPECT_TRUE(thirdExpectNativeHookCache == thirdResultNativeHookCache);
1513
1514 NativeHookCache fourthExpectNativeHookCache(INDEX_SIZE_02, expect_ipid, expect_itid, FREEEVENT.c_str(),
1515 INVALID_UINT64, TIMESTAMP_04, 0, 0, ADDR_02, SIZE_02, 0, 0);
1516 NativeHookCache fourthResultNativeHookCache(nativeHook, INDEX_SIZE_03);
1517 EXPECT_TRUE(fourthExpectNativeHookCache == fourthResultNativeHookCache);
1518
1519 auto size = stream_.traceDataCache_->GetConstNativeHookData().Size();
1520 EXPECT_EQ(INDEX_SIZE_04, size);
1521
1522 auto &statAndInfo = stream_.traceDataCache_->GetConstStatAndInfo();
1523 EXPECT_TRUE(1 == statAndInfo.GetValue(TRACE_NATIVE_HOOK_MMAP, STAT_EVENT_RECEIVED));
1524 EXPECT_TRUE(1 == statAndInfo.GetValue(TRACE_NATIVE_HOOK_MUNMAP, STAT_EVENT_RECEIVED));
1525 EXPECT_TRUE(1 == statAndInfo.GetValue(TRACE_NATIVE_HOOK_MALLOC, STAT_EVENT_RECEIVED));
1526 EXPECT_TRUE(1 == statAndInfo.GetValue(TRACE_NATIVE_HOOK_FREE, STAT_EVENT_RECEIVED));
1527 }
1528 /**
1529 * @tc.name: ParseOfflineSymAndStatisticalData
1530 * @tc.desc: Parse Offline Sym And Statistical Data
1531 * @tc.type: FUNC
1532 */
1533 HWTEST_F(NativeHookParserTest, ParseOfflineSymAndStatisticalData, TestSize.Level1)
1534 {
1535 std::string path("../../test/resource/offline_symbolization_statistical_data.htrace");
1536 TS_LOGI("test24-19");
1537 EXPECT_TRUE(ParseTraceFile(stream_, path));
1538 }
1539 /**
1540 * @tc.name: ParseCallStackCompressionData
1541 * @tc.desc: Parse CallStack Compression Data
1542 * @tc.type: FUNC
1543 */
1544 HWTEST_F(NativeHookParserTest, ParseCallStackCompressionData, TestSize.Level1)
1545 {
1546 std::string path("../../test/resource/callstack_compression.htrace");
1547 TS_LOGI("test24-20");
1548 EXPECT_TRUE(ParseTraceFile(stream_, path));
1549 }
1550 /**
1551 * @ts.name: ParseOfflineSymJsAbnormal
1552 * @ts.desc: Parse Abnormal Js Stack Data in Offline Sym
1553 * @tc.type: FUNC
1554 */
1555 HWTEST_F(NativeHookParserTest, ParseOfflineSymJsAbnormal, TestSize.Level1)
1556 {
1557 TS_LOGI("test24-21");
1558 BatchNativeHookData nativeHookJsAbnormalData;
1559 SetOfflineAllocEvent(nativeHookJsAbnormalData, {TID_01, ADDR_01, SIZE_01, "", SEC_01, NSEC_01}, false, true);
1560 // start parse
1561 PbreaderNativeHookParser htraceNativeHookParser(stream_.traceDataCache_.get(), stream_.streamFilters_.get());
1562 htraceNativeHookParser.UpdataOfflineSymbolizationMode(true);
1563 std::string hookJsAbnormalStrMsg = "";
1564 nativeHookJsAbnormalData.SerializeToString(&hookJsAbnormalStrMsg);
1565 PbreaderDataSegment dataSeg;
1566 dataSeg.seg = std::make_shared<std::string>(hookJsAbnormalStrMsg);
1567 ProtoReader::BytesView hookBytesView(reinterpret_cast<const uint8_t *>(hookJsAbnormalStrMsg.data()),
1568 hookJsAbnormalStrMsg.size());
1569 dataSeg.protoData = hookBytesView;
1570 bool hasJsAbnormalSplit = false;
1571 htraceNativeHookParser.Parse(dataSeg, hasJsAbnormalSplit);
1572 htraceNativeHookParser.FinishParseNativeHookData();
1573 // Verification parse Malloc event results
1574 auto expect_ipid = stream_.streamFilters_->processFilter_->GetInternalPid(PID);
1575 auto expect_itid = stream_.streamFilters_->processFilter_->GetInternalTid(TID_01);
1576 NativeHookCache expectNativeHookEventCache(1, expect_ipid, expect_itid, ALLOCEVENT.c_str(), INVALID_UINT64,
1577 TIMESTAMP_01, 0, 0, ADDR_01, SIZE_01, SIZE_01, 0);
1578 const NativeHook &nativeHook = stream_.traceDataCache_->GetConstNativeHookData();
1579 NativeHookCache resultNativeHookEventCache(nativeHook, 0);
1580 EXPECT_TRUE(expectNativeHookEventCache == resultNativeHookEventCache);
1581
1582 // Verification parse Malloc Frame results
1583 const NativeHookFrame &nativeHookFrame = stream_.traceDataCache_->GetConstNativeHookFrameData();
1584 auto size = nativeHookFrame.Size();
1585 EXPECT_EQ(0, size);
1586 auto &statAndInfo = stream_.traceDataCache_->GetConstStatAndInfo();
1587 EXPECT_TRUE(1 == statAndInfo.GetValue(TRACE_NATIVE_HOOK_MALLOC, STAT_EVENT_RECEIVED));
1588 }
1589 /**
1590 * @ts.name: ParseOfflineSymHybridStack
1591 * @ts.desc: Parse Native Hook and Arkts Mixed Stack Data in Offline Sym
1592 * @tc.type: FUNC
1593 */
1594 HWTEST_F(NativeHookParserTest, ParseOfflineSymMixedStack, TestSize.Level1)
1595 {
1596 TS_LOGI("test24-22");
1597 BatchNativeHookData nativeHookMixedStackData;
1598 SetOfflineAllocEvent(nativeHookMixedStackData, {TID_01, ADDR_01, SIZE_01, "", SEC_01, NSEC_01}, true, false);
1599 // start parse
1600 PbreaderNativeHookParser htraceNativeHookParser(stream_.traceDataCache_.get(), stream_.streamFilters_.get());
1601 htraceNativeHookParser.UpdataOfflineSymbolizationMode(true);
1602 std::string hookStrMsg = "";
1603 nativeHookMixedStackData.SerializeToString(&hookStrMsg);
1604 PbreaderDataSegment dataSeg;
1605 dataSeg.seg = std::make_shared<std::string>(hookStrMsg);
1606 ProtoReader::BytesView hookBytesView(reinterpret_cast<const uint8_t *>(hookStrMsg.data()), hookStrMsg.size());
1607 dataSeg.protoData = hookBytesView;
1608 bool hasMixedStackSplit = false;
1609 htraceNativeHookParser.Parse(dataSeg, hasMixedStackSplit);
1610 htraceNativeHookParser.FinishParseNativeHookData();
1611 // Verification parse Malloc event results
1612 auto expect_ipid = stream_.streamFilters_->processFilter_->GetInternalPid(PID);
1613 auto expect_itid = stream_.streamFilters_->processFilter_->GetInternalTid(TID_01);
1614 NativeHookCache expectNativeHookEventCache(1, expect_ipid, expect_itid, ALLOCEVENT.c_str(), INVALID_UINT64,
1615 TIMESTAMP_01, 0, 0, ADDR_01, SIZE_01, SIZE_01, 0);
1616 const NativeHook &nativeHook = stream_.traceDataCache_->GetConstNativeHookData();
1617 NativeHookCache resultNativeHookEventCache(nativeHook, 0);
1618 EXPECT_TRUE(expectNativeHookEventCache == resultNativeHookEventCache);
1619 // Verification parse Malloc Frame results
1620 const NativeHookFrame &nativeHookFrame = stream_.traceDataCache_->GetConstNativeHookFrameData();
1621 auto expectSymbolData = stream_.traceDataCache_->dataDict_.GetStringIndex(SYMBOL_NAME_03);
1622 auto expectFilePathData = stream_.traceDataCache_->dataDict_.GetStringIndex(FILE_PATH_03);
1623 NativeHookFrameCache jsExpectFrameCache(1, 0, IP_03, expectSymbolData, expectFilePathData, OFFSET_03,
1624 INVALID_UINT64);
1625 NativeHookFrameCache jsResultFrameCache(nativeHookFrame, 0);
1626 EXPECT_TRUE(jsExpectFrameCache == jsResultFrameCache);
1627 auto expectSymFailedSymName = stream_.traceDataCache_->dataDict_.GetStringIndex(SYMBOL_NAME_04);
1628 NativeHookFrameCache symFailedExpectFrameCache(1, 1, IP_02, expectSymFailedSymName, INVALID_UINT64, INVALID_UINT64,
1629 INVALID_UINT64);
1630 NativeHookFrameCache symFailedResultFrameCache(nativeHookFrame, 1);
1631 EXPECT_TRUE(symFailedExpectFrameCache == symFailedResultFrameCache);
1632 auto expectAllocSymbolData = stream_.traceDataCache_->dataDict_.GetStringIndex(SYMBOL_NAME_05);
1633 NativeHookFrameCache allocExpectFrameCache(1, INDEX_SIZE_02, STACK_MAP_ALLOC_IP, expectAllocSymbolData,
1634 INVALID_UINT64, INVALID_UINT64, INVALID_UINT64);
1635 NativeHookFrameCache allocResultFrameCache(nativeHookFrame, INDEX_SIZE_02);
1636 EXPECT_TRUE(allocExpectFrameCache == allocResultFrameCache);
1637 auto size = nativeHookFrame.Size();
1638 EXPECT_EQ(INDEX_SIZE_03, size);
1639 auto &statAndInfo = stream_.traceDataCache_->GetConstStatAndInfo();
1640 EXPECT_TRUE(1 == statAndInfo.GetValue(TRACE_NATIVE_HOOK_MALLOC, STAT_EVENT_RECEIVED));
1641 }
1642 } // namespace NativeMemoryUnitTest
1643 } // namespace TraceStreamer
1644 } // namespace SysTuning