• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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