• 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 "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