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 "process_parser/pbreader_process_parser.h" 22 #include "parser/ptreader_parser/ptreader_parser.h" 23 #include "parser/common_types.h" 24 #include "process_plugin_result.pb.h" 25 #include "process_plugin_result.pbreader.h" 26 #include "trace_streamer_selector.h" 27 28 using namespace testing::ext; 29 using namespace SysTuning::TraceStreamer; 30 31 namespace SysTuning { 32 namespace TraceStreamer { 33 namespace PbreaderProcessParserUnitTest { 34 uint64_t TS = 100; 35 const uint32_t PID_01 = 311; 36 const std::string NAME_01 = "resource_schedu01"; 37 const int32_t PPID_01 = 21; 38 const int32_t UID_01 = 1; 39 const uint32_t PID_02 = 312; 40 const std::string NAME_02 = "resource_schedu02"; 41 const int32_t PPID_02 = 22; 42 const int32_t UID_02 = 2; 43 const uint32_t PID_03 = 313; 44 const std::string NAME_03 = "resource_schedu03"; 45 const int32_t PPID_03 = 23; 46 const int32_t UID_03 = 3; 47 const uint32_t PID_04 = 313; 48 const std::string NAME_04 = "resource_schedu03"; 49 const int32_t PPID_04 = 23; 50 const int32_t UID_04 = 3; 51 52 class HtraceProcessParserTest : public ::testing::Test { 53 public: SetUp()54 void SetUp() 55 { 56 stream_.InitFilter(); 57 } 58 TearDown()59 void TearDown() {} 60 SetProcessesinfo(ProcessData * processData,uint32_t pid,std::string name,uint32_t ppid,uint32_t uid)61 void SetProcessesinfo(ProcessData *processData, uint32_t pid, std::string name, uint32_t ppid, uint32_t uid) 62 { 63 ProcessInfo *processInfo = processData->add_processesinfo(); 64 processInfo->set_pid(pid); 65 processInfo->set_name(name); 66 processInfo->set_ppid(ppid); 67 processInfo->set_uid(uid); 68 } 69 70 public: 71 SysTuning::TraceStreamer::TraceStreamerSelector stream_ = {}; 72 }; 73 74 /** 75 * @tc.name: ParseHtraceProcessWithoutProcessData 76 * @tc.desc: Parse a Process that does not contain any ProcessData 77 * @tc.type: FUNC 78 */ 79 HWTEST_F(HtraceProcessParserTest, ParseHtraceProcessWithoutProcessData, TestSize.Level1) 80 { 81 TS_LOGI("test18-1"); 82 auto processData = std::make_unique<ProcessData>(); 83 std::string processStrMsg = ""; 84 processData->SerializeToString(&processStrMsg); 85 ProtoReader::BytesView processBytesView(reinterpret_cast<const uint8_t *>(processStrMsg.data()), 86 processStrMsg.size()); 87 PbreaderProcessParser htraceProcessParser(stream_.traceDataCache_.get(), stream_.streamFilters_.get()); 88 htraceProcessParser.Parse(processBytesView, TS); 89 auto size = stream_.traceDataCache_->GetConstLiveProcessData().Size(); 90 EXPECT_FALSE(size); 91 } 92 93 /** 94 * @tc.name: ParseHtraceProcessWithProcessData 95 * @tc.desc: Parse a Process with ProcessData 96 * @tc.type: FUNC 97 */ 98 HWTEST_F(HtraceProcessParserTest, ParseHtraceProcessWithProcessData, TestSize.Level1) 99 { 100 TS_LOGI("test18-2"); 101 const uint32_t pid = 312; 102 const string name = "resource_schedu"; 103 const int32_t ppid = 22; 104 const int32_t uid = 23; 105 auto processData = std::make_unique<ProcessData>(); 106 SetProcessesinfo(processData.get(), pid, name, ppid, uid); 107 std::string processStrMsg = ""; 108 processData->SerializeToString(&processStrMsg); 109 ProtoReader::BytesView processBytesView(reinterpret_cast<const uint8_t *>(processStrMsg.data()), 110 processStrMsg.size()); 111 PbreaderProcessParser htraceProcessParser(stream_.traceDataCache_.get(), stream_.streamFilters_.get()); 112 htraceProcessParser.Parse(processBytesView, TS); 113 htraceProcessParser.Finish(); 114 115 auto size = stream_.traceDataCache_->GetConstLiveProcessData().Size(); 116 EXPECT_FALSE(size); 117 } 118 119 /** 120 * @tc.name: ParseHtraceProcessWithTwoProcessData 121 * @tc.desc: Parse a Process with ProcessData 122 * @tc.type: FUNC 123 */ 124 HWTEST_F(HtraceProcessParserTest, ParseHtraceProcessWithTwoProcessData, TestSize.Level1) 125 { 126 TS_LOGI("test18-3"); 127 auto processData = std::make_unique<ProcessData>(); 128 SetProcessesinfo(processData.get(), PID_01, NAME_01, PPID_01, UID_01); 129 SetProcessesinfo(processData.get(), PID_02, NAME_02, PPID_02, UID_02); 130 std::string processStrMsg = ""; 131 processData->SerializeToString(&processStrMsg); 132 ProtoReader::BytesView processBytesView(reinterpret_cast<const uint8_t *>(processStrMsg.data()), 133 processStrMsg.size()); 134 PbreaderProcessParser htraceProcessParser(stream_.traceDataCache_.get(), stream_.streamFilters_.get()); 135 htraceProcessParser.Parse(processBytesView, TS); 136 htraceProcessParser.Finish(); 137 138 auto liveProcessData = stream_.traceDataCache_->GetConstLiveProcessData(); 139 ASSERT_EQ(1, liveProcessData.Size()); 140 EXPECT_EQ(liveProcessData.ProcessID()[0], PID_02); 141 EXPECT_EQ(liveProcessData.ProcessName()[0], NAME_02); 142 EXPECT_EQ(liveProcessData.ParentProcessID()[0], PPID_02); 143 EXPECT_EQ(liveProcessData.Uid()[0], UID_02); 144 EXPECT_EQ(liveProcessData.UserName()[0], std::to_string(UID_02)); 145 } 146 147 /** 148 * @tc.name: ParseHtraceProcessWithThreeProcessData 149 * @tc.desc: Parse a Process with ProcessData 150 * @tc.type: FUNC 151 */ 152 HWTEST_F(HtraceProcessParserTest, ParseHtraceProcessWithThreeProcessData, TestSize.Level1) 153 { 154 TS_LOGI("test18-4"); 155 156 auto processData = std::make_unique<ProcessData>(); 157 SetProcessesinfo(processData.get(), PID_01, NAME_01, PPID_01, UID_01); 158 SetProcessesinfo(processData.get(), PID_02, NAME_02, PPID_02, UID_02); 159 SetProcessesinfo(processData.get(), PID_03, NAME_03, PPID_03, UID_03); 160 std::string processStrMsg = ""; 161 processData->SerializeToString(&processStrMsg); 162 ProtoReader::BytesView processBytesView(reinterpret_cast<const uint8_t *>(processStrMsg.data()), 163 processStrMsg.size()); 164 PbreaderProcessParser htraceProcessParser(stream_.traceDataCache_.get(), stream_.streamFilters_.get()); 165 htraceProcessParser.Parse(processBytesView, TS); 166 htraceProcessParser.Finish(); 167 168 auto liveProcessData = stream_.traceDataCache_->GetConstLiveProcessData(); 169 ASSERT_EQ(2, liveProcessData.Size()); 170 EXPECT_EQ(liveProcessData.ProcessID()[0], PID_02); 171 EXPECT_EQ(liveProcessData.ProcessID()[1], PID_03); 172 EXPECT_EQ(liveProcessData.ProcessName()[0], NAME_02); 173 EXPECT_EQ(liveProcessData.ProcessName()[1], NAME_03); 174 EXPECT_EQ(liveProcessData.ParentProcessID()[0], PPID_02); 175 EXPECT_EQ(liveProcessData.ParentProcessID()[1], PPID_03); 176 EXPECT_EQ(liveProcessData.Uid()[0], UID_02); 177 EXPECT_EQ(liveProcessData.Uid()[1], UID_03); 178 EXPECT_EQ(liveProcessData.UserName()[0], std::to_string(UID_02)); 179 EXPECT_EQ(liveProcessData.UserName()[1], std::to_string(UID_03)); 180 } 181 182 /** 183 * @tc.name: ParseHtraceProcessWithMultipleProcessData 184 * @tc.desc: Parse a Process with ProcessData 185 * @tc.type: FUNC 186 */ 187 HWTEST_F(HtraceProcessParserTest, ParseHtraceProcessWithMultipleProcessData, TestSize.Level1) 188 { 189 TS_LOGI("test18-5"); 190 auto processData = std::make_unique<ProcessData>(); 191 SetProcessesinfo(processData.get(), PID_01, NAME_01, PPID_01, UID_01); 192 SetProcessesinfo(processData.get(), PID_02, NAME_02, PPID_02, UID_02); 193 SetProcessesinfo(processData.get(), PID_03, NAME_03, PPID_03, UID_03); 194 SetProcessesinfo(processData.get(), PID_04, NAME_04, PPID_04, UID_04); 195 std::string processStrMsg = ""; 196 processData->SerializeToString(&processStrMsg); 197 ProtoReader::BytesView processBytesView(reinterpret_cast<const uint8_t *>(processStrMsg.data()), 198 processStrMsg.size()); 199 PbreaderProcessParser htraceProcessParser(stream_.traceDataCache_.get(), stream_.streamFilters_.get()); 200 htraceProcessParser.Parse(processBytesView, TS); 201 htraceProcessParser.Finish(); 202 203 auto liveProcessData = stream_.traceDataCache_->GetConstLiveProcessData(); 204 ASSERT_EQ(3, liveProcessData.Size()); 205 EXPECT_EQ(liveProcessData.ProcessID()[0], PID_02); 206 EXPECT_EQ(liveProcessData.ProcessID()[1], PID_03); 207 EXPECT_EQ(liveProcessData.ProcessID()[2], PID_04); 208 EXPECT_EQ(liveProcessData.ProcessName()[0], NAME_02); 209 EXPECT_EQ(liveProcessData.ProcessName()[1], NAME_03); 210 EXPECT_EQ(liveProcessData.ProcessName()[2], NAME_04); 211 EXPECT_EQ(liveProcessData.ParentProcessID()[0], PPID_02); 212 EXPECT_EQ(liveProcessData.ParentProcessID()[1], PPID_03); 213 EXPECT_EQ(liveProcessData.ParentProcessID()[2], PPID_04); 214 EXPECT_EQ(liveProcessData.Uid()[0], UID_02); 215 EXPECT_EQ(liveProcessData.Uid()[1], UID_03); 216 EXPECT_EQ(liveProcessData.Uid()[2], UID_04); 217 EXPECT_EQ(liveProcessData.UserName()[0], std::to_string(UID_02)); 218 EXPECT_EQ(liveProcessData.UserName()[1], std::to_string(UID_03)); 219 EXPECT_EQ(liveProcessData.UserName()[2], std::to_string(UID_04)); 220 } 221 } // namespace PbreaderProcessParserUnitTest 222 } // namespace TraceStreamer 223 } // namespace SysTuning