1 /* 2 * Copyright (c) 2021 Huawei Device Co., Ltd. 3 * Licensed under the Apache License, Version 2.0 (the "License"); 4 * you may not use this file except in compliance with the License. 5 * You may obtain a copy of the License at 6 * 7 * http://www.apache.org/licenses/LICENSE-2.0 8 * 9 * Unless required by applicable law or agreed to in writing, software 10 * distributed under the License is distributed on an "AS IS" BASIS, 11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 * See the License for the specific language governing permissions and 13 * limitations under the License. 14 */ 15 16 #include <fcntl.h> 17 #include <hwext/gtest-ext.h> 18 #include <hwext/gtest-tag.h> 19 #include <memory> 20 21 #include "htrace_process_parser.h" 22 #include "parser/bytrace_parser/bytrace_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 uint64_t TS = 100; 34 const uint32_t PID_01 = 311; 35 const std::string NAME_01 = "resource_schedu01"; 36 const int32_t PPID_01 = 21; 37 const int32_t UID_01 = 1; 38 const uint32_t PID_02 = 312; 39 const std::string NAME_02 = "resource_schedu02"; 40 const int32_t PPID_02 = 22; 41 const int32_t UID_02 = 2; 42 const uint32_t PID_03 = 313; 43 const std::string NAME_03 = "resource_schedu03"; 44 const int32_t PPID_03 = 23; 45 const int32_t UID_03 = 3; 46 const uint32_t PID_04 = 313; 47 const std::string NAME_04 = "resource_schedu03"; 48 const int32_t PPID_04 = 23; 49 const int32_t UID_04 = 3; 50 51 class HtraceProcessParserTest : public ::testing::Test { 52 public: SetUp()53 void SetUp() 54 { 55 stream_.InitFilter(); 56 } 57 TearDown()58 void TearDown() {} 59 SetProcessesinfo(ProcessData * processData,uint32_t pid,std::string name,uint32_t ppid,uint32_t uid)60 void SetProcessesinfo(ProcessData* processData, uint32_t pid, std::string name, uint32_t ppid, uint32_t uid) 61 { 62 ProcessInfo* processInfo = processData->add_processesinfo(); 63 processInfo->set_pid(pid); 64 processInfo->set_name(name); 65 processInfo->set_ppid(ppid); 66 processInfo->set_uid(uid); 67 } 68 69 public: 70 SysTuning::TraceStreamer::TraceStreamerSelector stream_ = {}; 71 }; 72 73 /** 74 * @tc.name: ParseHtraceProcessWithoutProcessData 75 * @tc.desc: Parse a Process that does not contain any ProcessData 76 * @tc.type: FUNC 77 */ 78 HWTEST_F(HtraceProcessParserTest, ParseHtraceProcessWithoutProcessData, TestSize.Level1) 79 { 80 TS_LOGI("test18-1"); 81 auto processData = std::make_unique<ProcessData>(); 82 std::string processStrMsg = ""; 83 processData->SerializeToString(&processStrMsg); 84 ProtoReader::BytesView processBytesView(reinterpret_cast<const uint8_t*>(processStrMsg.data()), 85 processStrMsg.size()); 86 HtraceProcessParser htraceProcessParser(stream_.traceDataCache_.get(), stream_.streamFilters_.get()); 87 htraceProcessParser.Parse(processBytesView, TS); 88 auto size = stream_.traceDataCache_->GetConstLiveProcessData().Size(); 89 EXPECT_FALSE(size); 90 } 91 92 /** 93 * @tc.name: ParseHtraceProcessWithProcessData 94 * @tc.desc: Parse a Process with ProcessData 95 * @tc.type: FUNC 96 */ 97 HWTEST_F(HtraceProcessParserTest, ParseHtraceProcessWithProcessData, TestSize.Level1) 98 { 99 TS_LOGI("test18-2"); 100 const uint32_t pid = 312; 101 const string name = "resource_schedu"; 102 const int32_t ppid = 22; 103 const int32_t uid = 23; 104 auto processData = std::make_unique<ProcessData>(); 105 SetProcessesinfo(processData.get(), pid, name, ppid, uid); 106 std::string processStrMsg = ""; 107 processData->SerializeToString(&processStrMsg); 108 ProtoReader::BytesView processBytesView(reinterpret_cast<const uint8_t*>(processStrMsg.data()), 109 processStrMsg.size()); 110 HtraceProcessParser htraceProcessParser(stream_.traceDataCache_.get(), stream_.streamFilters_.get()); 111 htraceProcessParser.Parse(processBytesView, TS); 112 htraceProcessParser.Finish(); 113 114 auto size = stream_.traceDataCache_->GetConstLiveProcessData().Size(); 115 EXPECT_FALSE(size); 116 } 117 118 /** 119 * @tc.name: ParseHtraceProcessWithTwoProcessData 120 * @tc.desc: Parse a Process with ProcessData 121 * @tc.type: FUNC 122 */ 123 HWTEST_F(HtraceProcessParserTest, ParseHtraceProcessWithTwoProcessData, TestSize.Level1) 124 { 125 TS_LOGI("test18-3"); 126 auto processData = std::make_unique<ProcessData>(); 127 SetProcessesinfo(processData.get(), PID_01, NAME_01, PPID_01, UID_01); 128 SetProcessesinfo(processData.get(), PID_02, NAME_02, PPID_02, UID_02); 129 std::string processStrMsg = ""; 130 processData->SerializeToString(&processStrMsg); 131 ProtoReader::BytesView processBytesView(reinterpret_cast<const uint8_t*>(processStrMsg.data()), 132 processStrMsg.size()); 133 HtraceProcessParser htraceProcessParser(stream_.traceDataCache_.get(), stream_.streamFilters_.get()); 134 htraceProcessParser.Parse(processBytesView, TS); 135 htraceProcessParser.Finish(); 136 137 auto liveProcessData = stream_.traceDataCache_->GetConstLiveProcessData(); 138 ASSERT_EQ(1, liveProcessData.Size()); 139 EXPECT_EQ(liveProcessData.ProcessID()[0], PID_02); 140 EXPECT_EQ(liveProcessData.ProcessName()[0], NAME_02); 141 EXPECT_EQ(liveProcessData.ParentProcessID()[0], PPID_02); 142 EXPECT_EQ(liveProcessData.Uid()[0], UID_02); 143 EXPECT_EQ(liveProcessData.UserName()[0], std::to_string(UID_02)); 144 } 145 146 /** 147 * @tc.name: ParseHtraceProcessWithThreeProcessData 148 * @tc.desc: Parse a Process with ProcessData 149 * @tc.type: FUNC 150 */ 151 HWTEST_F(HtraceProcessParserTest, ParseHtraceProcessWithThreeProcessData, TestSize.Level1) 152 { 153 TS_LOGI("test18-4"); 154 155 auto processData = std::make_unique<ProcessData>(); 156 SetProcessesinfo(processData.get(), PID_01, NAME_01, PPID_01, UID_01); 157 SetProcessesinfo(processData.get(), PID_02, NAME_02, PPID_02, UID_02); 158 SetProcessesinfo(processData.get(), PID_03, NAME_03, PPID_03, UID_03); 159 std::string processStrMsg = ""; 160 processData->SerializeToString(&processStrMsg); 161 ProtoReader::BytesView processBytesView(reinterpret_cast<const uint8_t*>(processStrMsg.data()), 162 processStrMsg.size()); 163 HtraceProcessParser htraceProcessParser(stream_.traceDataCache_.get(), stream_.streamFilters_.get()); 164 htraceProcessParser.Parse(processBytesView, TS); 165 htraceProcessParser.Finish(); 166 167 auto liveProcessData = stream_.traceDataCache_->GetConstLiveProcessData(); 168 ASSERT_EQ(2, liveProcessData.Size()); 169 EXPECT_EQ(liveProcessData.ProcessID()[0], PID_02); 170 EXPECT_EQ(liveProcessData.ProcessID()[1], PID_03); 171 EXPECT_EQ(liveProcessData.ProcessName()[0], NAME_02); 172 EXPECT_EQ(liveProcessData.ProcessName()[1], NAME_03); 173 EXPECT_EQ(liveProcessData.ParentProcessID()[0], PPID_02); 174 EXPECT_EQ(liveProcessData.ParentProcessID()[1], PPID_03); 175 EXPECT_EQ(liveProcessData.Uid()[0], UID_02); 176 EXPECT_EQ(liveProcessData.Uid()[1], UID_03); 177 EXPECT_EQ(liveProcessData.UserName()[0], std::to_string(UID_02)); 178 EXPECT_EQ(liveProcessData.UserName()[1], std::to_string(UID_03)); 179 } 180 181 /** 182 * @tc.name: ParseHtraceProcessWithMultipleProcessData 183 * @tc.desc: Parse a Process with ProcessData 184 * @tc.type: FUNC 185 */ 186 HWTEST_F(HtraceProcessParserTest, ParseHtraceProcessWithMultipleProcessData, TestSize.Level1) 187 { 188 TS_LOGI("test18-5"); 189 auto processData = std::make_unique<ProcessData>(); 190 SetProcessesinfo(processData.get(), PID_01, NAME_01, PPID_01, UID_01); 191 SetProcessesinfo(processData.get(), PID_02, NAME_02, PPID_02, UID_02); 192 SetProcessesinfo(processData.get(), PID_03, NAME_03, PPID_03, UID_03); 193 SetProcessesinfo(processData.get(), PID_04, NAME_04, PPID_04, UID_04); 194 std::string processStrMsg = ""; 195 processData->SerializeToString(&processStrMsg); 196 ProtoReader::BytesView processBytesView(reinterpret_cast<const uint8_t*>(processStrMsg.data()), 197 processStrMsg.size()); 198 HtraceProcessParser htraceProcessParser(stream_.traceDataCache_.get(), stream_.streamFilters_.get()); 199 htraceProcessParser.Parse(processBytesView, TS); 200 htraceProcessParser.Finish(); 201 202 auto liveProcessData = stream_.traceDataCache_->GetConstLiveProcessData(); 203 ASSERT_EQ(3, liveProcessData.Size()); 204 EXPECT_EQ(liveProcessData.ProcessID()[0], PID_02); 205 EXPECT_EQ(liveProcessData.ProcessID()[1], PID_03); 206 EXPECT_EQ(liveProcessData.ProcessID()[2], PID_04); 207 EXPECT_EQ(liveProcessData.ProcessName()[0], NAME_02); 208 EXPECT_EQ(liveProcessData.ProcessName()[1], NAME_03); 209 EXPECT_EQ(liveProcessData.ProcessName()[2], NAME_04); 210 EXPECT_EQ(liveProcessData.ParentProcessID()[0], PPID_02); 211 EXPECT_EQ(liveProcessData.ParentProcessID()[1], PPID_03); 212 EXPECT_EQ(liveProcessData.ParentProcessID()[2], PPID_04); 213 EXPECT_EQ(liveProcessData.Uid()[0], UID_02); 214 EXPECT_EQ(liveProcessData.Uid()[1], UID_03); 215 EXPECT_EQ(liveProcessData.Uid()[2], UID_04); 216 EXPECT_EQ(liveProcessData.UserName()[0], std::to_string(UID_02)); 217 EXPECT_EQ(liveProcessData.UserName()[1], std::to_string(UID_03)); 218 EXPECT_EQ(liveProcessData.UserName()[2], std::to_string(UID_04)); 219 } 220 } // namespace TraceStreamer 221 } // namespace SysTuning