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