• 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 <hwext/gtest-ext.h>
17 #include <hwext/gtest-tag.h>
18 
19 #include "htrace_mem_parser.h"
20 #include "trace_streamer_selector.h"
21 
22 using namespace testing::ext;
23 using namespace SysTuning::TraceStreamer;
24 namespace SysTuning {
25 namespace TraceStreamer {
26 class SmapsParserTest : public ::testing::Test {
27 public:
SetUp()28     void SetUp()
29     {
30         stream_.InitFilter();
31     }
32 
TearDown()33     void TearDown()
34     {
35         if (access(dbPath_.c_str(), F_OK) == 0) {
36             remove(dbPath_.c_str());
37         }
38     }
39 
40 public:
41     SysTuning::TraceStreamer::TraceStreamerSelector stream_ = {};
42     const std::string dbPath_ = "data/resource/out.db";
43 };
44 /**
45  * @tc.name: ParseSmapsParse
46  * @tc.desc: Parse SmapsData object and export database
47  * @tc.type: FUNC
48  */
49 HWTEST_F(SmapsParserTest, ParseSmapsParse, TestSize.Level1)
50 {
51     TS_LOGI("test29-1");
52     HtraceMemParser SmapsEvent(stream_.traceDataCache_.get(), stream_.streamFilters_.get());
53 
54     MemoryData tracePacket;
55     ProcessMemoryInfo* memInfo = tracePacket.add_processesinfo();
56     SmapsInfo* smapsInfo = memInfo->add_smapinfo();
57     EXPECT_TRUE(smapsInfo != nullptr);
58     int size = memInfo->smapinfo_size();
59     EXPECT_TRUE(size == 1);
60     uint64_t timeStamp = 1616439852302;
61     BuiltinClocks clock = TS_CLOCK_BOOTTIME;
62 
63     SmapsEvent.ParseProcessInfo(tracePacket, timeStamp);
64     SmapsEvent.Finish();
65     stream_.traceDataCache_->ExportDatabase(dbPath_);
66 
67     EXPECT_TRUE(access(dbPath_.c_str(),F_OK) == 0);
68     memInfo->clear_smapinfo();
69 
70     auto eventCount = stream_.traceDataCache_->GetConstStatAndInfo().GetValue(TRACE_SMAPS, STAT_EVENT_RECEIVED);
71     EXPECT_TRUE(1 == eventCount);
72     EXPECT_TRUE(stream_.traceDataCache_->GetConstProcessMeasureData().Size() == MEM_MAX * 1);
73     EXPECT_EQ(stream_.traceDataCache_->GetConstProcessData().size(), 1);
74 }
75 /**
76  * @tc.name: ParseSmapsParseTestMeasureDataSize
77  * @tc.desc: Parse SmapsData object and count StatInfo
78  * @tc.type: FUNC
79  */
80 HWTEST_F(SmapsParserTest, ParseSmapsParseTestMeasureDataSize, TestSize.Level1)
81 {
82     TS_LOGI("test29-2");
83     HtraceMemParser SmapsEvent(stream_.traceDataCache_.get(), stream_.streamFilters_.get());
84 
85     MemoryData tracePacket;
86     ProcessMemoryInfo* memInfo = tracePacket.add_processesinfo();
87     SmapsInfo* SmapsInfo = memInfo->add_smapinfo();
88     EXPECT_TRUE(SmapsInfo != nullptr);
89     int size = memInfo->smapinfo_size();
90     EXPECT_TRUE(size == 1);
91     uint64_t timeStamp = 1616439852302;
92     BuiltinClocks clock = TS_CLOCK_BOOTTIME;
93     std::string startAddr = "5589523000";
94     std::string endAddr = "5589543000";
95     std::string permission = "r--p";
96     std::string path = "/system/bin/hiprofilerd";
97     uint64_t vartualSize = 128;
98     uint64_t rss = 112;
99     uint64_t pss = 112;
100     uint64_t reside = 87.5;
101     SmapsInfo->set_start_addr(startAddr);
102     SmapsInfo->set_end_addr(endAddr);
103     SmapsInfo->set_permission(permission);
104     SmapsInfo->set_path(path);
105     SmapsInfo->set_size(vartualSize);
106     SmapsInfo->set_rss(rss);
107     SmapsInfo->set_pss(pss);
108     SmapsInfo->set_reside(reside);
109 
110     SmapsEvent.ParseProcessInfo(tracePacket, timeStamp);
111     SmapsEvent.Finish();
112     stream_.traceDataCache_->ExportDatabase(dbPath_);
113 
114     EXPECT_TRUE(access(dbPath_.c_str(),F_OK) == 0);
115     memInfo->clear_smapinfo();
116 
117     auto eventCount = stream_.traceDataCache_->GetConstStatAndInfo().GetValue(TRACE_SMAPS, STAT_EVENT_RECEIVED);
118     EXPECT_TRUE(1 == eventCount);
119     EXPECT_TRUE(stream_.traceDataCache_->GetConstProcessMeasureData().Size() == MEM_MAX * 1);
120     EXPECT_EQ(stream_.traceDataCache_->GetConstProcessData().size(), 1);
121 
122     EXPECT_TRUE(stream_.traceDataCache_->GetConstSmapsData().StartAddrs()[0] == "0x5589523000");
123     EXPECT_TRUE(stream_.traceDataCache_->GetConstSmapsData().EndAddrs()[0] == "0x5589543000");
124     uint64_t protection = stream_.traceDataCache_->GetDataIndex(permission);
125     EXPECT_TRUE(stream_.traceDataCache_->GetConstSmapsData().ProtectionIds()[0] == protection);
126     uint64_t pat = stream_.traceDataCache_->GetDataIndex(path);
127     EXPECT_TRUE(stream_.traceDataCache_->GetConstSmapsData().PathIds()[0] == pat);
128     EXPECT_TRUE(stream_.traceDataCache_->GetConstSmapsData().Sizes()[0] == vartualSize);
129     EXPECT_TRUE(stream_.traceDataCache_->GetConstSmapsData().Rss()[0] == rss);
130     EXPECT_TRUE(stream_.traceDataCache_->GetConstSmapsData().Pss()[0] == pss);
131     EXPECT_TRUE(stream_.traceDataCache_->GetConstSmapsData().Resides()[0] == reside);
132     EXPECT_EQ(stream_.traceDataCache_->GetConstProcessData().size(), 1);
133 }
134 /**
135  * @tc.name: ParseSmapsParseTestMutiMeasureData
136  * @tc.desc: Parse muti SmapsData object and count StatInfo
137  * @tc.type: FUNC
138  */
139 HWTEST_F(SmapsParserTest, ParseSmapsParseTestMutiMeasureData, TestSize.Level1)
140 {
141     TS_LOGI("test29-3");
142     HtraceMemParser SmapsEvent(stream_.traceDataCache_.get(), stream_.streamFilters_.get());
143 
144     MemoryData tracePacket;
145     ProcessMemoryInfo* memInfo = tracePacket.add_processesinfo();
146     SmapsInfo* smapsInfo0 = memInfo->add_smapinfo();
147     EXPECT_TRUE(smapsInfo0 != nullptr);
148     int size = memInfo->smapinfo_size();
149     EXPECT_TRUE(size == 1);
150     uint64_t timeStamp = 1616439852302;
151     BuiltinClocks clock0 = TS_CLOCK_BOOTTIME;
152     std::string startAddr0 = "5589523000";
153     std::string endAddr0 = "5589543000";
154     std::string permission0 = "r--p";
155     std::string path0 = "/system/bin/hiprofilerd";
156     uint64_t vartualSize0 = 128;
157     uint64_t rss0 = 112;
158     uint64_t pss0 = 112;
159     uint64_t reside0 = 87.5;
160     smapsInfo0->set_start_addr(startAddr0);
161     smapsInfo0->set_end_addr(endAddr0);
162     smapsInfo0->set_permission(permission0);
163     smapsInfo0->set_path(path0);
164     smapsInfo0->set_size(vartualSize0);
165     smapsInfo0->set_rss(rss0);
166     smapsInfo0->set_pss(pss0);
167     smapsInfo0->set_reside(reside0);
168 
169     SmapsInfo* smapsInfo1 = memInfo->add_smapinfo();
170     EXPECT_TRUE(smapsInfo1 != nullptr);
171     size = memInfo->smapinfo_size();
172     EXPECT_TRUE(size == 2);
173     timeStamp = 1616439852302;
174     BuiltinClocks clock1 = TS_CLOCK_BOOTTIME;
175     std::string startAddr1 = "5589543000";
176     std::string endAddr1 = "5589589000";
177     std::string permission1 = "r-xp";
178     std::string path1 = "/system/bin/hiprofilerd";
179     uint64_t vartualSize1 = 280;
180     uint64_t rss1 = 280;
181     uint64_t pss1 = 280;
182     uint64_t reside1 = 100;
183     smapsInfo1->set_start_addr(startAddr1);
184     smapsInfo1->set_end_addr(endAddr1);
185     smapsInfo1->set_permission(permission1);
186     smapsInfo1->set_path(path1);
187     smapsInfo1->set_size(vartualSize1);
188     smapsInfo1->set_rss(rss1);
189     smapsInfo1->set_pss(pss1);
190     smapsInfo1->set_reside(reside1);
191 
192     SmapsEvent.ParseProcessInfo(tracePacket, timeStamp);
193     SmapsEvent.Finish();
194     stream_.traceDataCache_->ExportDatabase(dbPath_);
195 
196     EXPECT_TRUE(access(dbPath_.c_str(),F_OK) == 0);
197     memInfo->clear_smapinfo();
198 
199     auto eventCount = stream_.traceDataCache_->GetConstStatAndInfo().GetValue(TRACE_SMAPS, STAT_EVENT_RECEIVED);
200     EXPECT_TRUE(1 == eventCount);
201 
202     EXPECT_TRUE(stream_.traceDataCache_->GetConstSmapsData().StartAddrs()[0] == "0x5589523000");
203     EXPECT_TRUE(stream_.traceDataCache_->GetConstSmapsData().EndAddrs()[0] == "0x5589543000");
204     uint64_t protection = stream_.traceDataCache_->GetDataIndex(permission0);
205     EXPECT_TRUE(stream_.traceDataCache_->GetConstSmapsData().ProtectionIds()[0] == protection);
206     uint64_t pathId = stream_.traceDataCache_->GetDataIndex(path0);
207     EXPECT_TRUE(stream_.traceDataCache_->GetConstSmapsData().PathIds()[0] == pathId);
208     EXPECT_TRUE(stream_.traceDataCache_->GetConstSmapsData().Sizes()[0] == vartualSize0);
209     EXPECT_TRUE(stream_.traceDataCache_->GetConstSmapsData().Rss()[0] == rss0);
210     EXPECT_TRUE(stream_.traceDataCache_->GetConstSmapsData().Pss()[0] == pss0);
211     EXPECT_TRUE(stream_.traceDataCache_->GetConstSmapsData().Resides()[0] == reside0);
212 
213     EXPECT_TRUE(stream_.traceDataCache_->GetConstSmapsData().StartAddrs()[1] == "0x5589543000");
214     EXPECT_TRUE(stream_.traceDataCache_->GetConstSmapsData().EndAddrs()[1] == "0x5589589000");
215     protection = stream_.traceDataCache_->GetDataIndex(permission1);
216     EXPECT_TRUE(stream_.traceDataCache_->GetConstSmapsData().ProtectionIds()[1] == protection);
217     pathId = stream_.traceDataCache_->GetDataIndex(path1);
218     EXPECT_TRUE(stream_.traceDataCache_->GetConstSmapsData().PathIds()[1] == pathId);
219     EXPECT_TRUE(stream_.traceDataCache_->GetConstSmapsData().Sizes()[1] == vartualSize1);
220     EXPECT_TRUE(stream_.traceDataCache_->GetConstSmapsData().Rss()[1] == rss1);
221     EXPECT_TRUE(stream_.traceDataCache_->GetConstSmapsData().Pss()[1] == pss1);
222     EXPECT_TRUE(stream_.traceDataCache_->GetConstSmapsData().Resides()[1] == reside1);
223 }
224 /**
225  * @tc.name: ParseMutiEmptySmapsDataAndCountStatInfo
226  * @tc.desc: Parse muti Empty SmapsData object and count StatInfo
227  * @tc.type: FUNC
228  */
229 HWTEST_F(SmapsParserTest, ParseMutiEmptySmapsDataAndCountStatInfo, TestSize.Level1)
230 {
231     TS_LOGI("test29-4");
232     HtraceMemParser SmapsEvent(stream_.traceDataCache_.get(), stream_.streamFilters_.get());
233 
234     MemoryData tracePacket;
235     ProcessMemoryInfo* memInfo = tracePacket.add_processesinfo();
236     SmapsInfo* smapsInfo0 = memInfo->add_smapinfo();
237     EXPECT_TRUE(smapsInfo0 != nullptr);
238     int size = memInfo->smapinfo_size();
239     EXPECT_TRUE(size == 1);
240     uint64_t timeStamp = 1616439852302;
241     BuiltinClocks clock = TS_CLOCK_BOOTTIME;
242 
243     SmapsInfo* smapsInfo1 = memInfo->add_smapinfo();
244     EXPECT_TRUE(smapsInfo1 != nullptr);
245     size = memInfo->smapinfo_size();
246     EXPECT_TRUE(size == 2);
247 
248     SmapsEvent.ParseProcessInfo(tracePacket, timeStamp);
249     SmapsEvent.Finish();
250     stream_.traceDataCache_->ExportDatabase(dbPath_);
251 
252     EXPECT_TRUE(access(dbPath_.c_str(),F_OK) == 0);
253     memInfo->clear_smapinfo();
254 
255     auto eventCount = stream_.traceDataCache_->GetConstStatAndInfo().GetValue(TRACE_SMAPS, STAT_EVENT_RECEIVED);
256     EXPECT_TRUE(1 == eventCount);
257     EXPECT_EQ(stream_.traceDataCache_->GetConstProcessData().size(), 1);
258 }
259 /**
260  * @tc.name: ParseEmptySmapsData
261  * @tc.desc: Parse Empty SmapsData
262  * @tc.type: FUNC
263  */
264 HWTEST_F(SmapsParserTest, ParseEmptySmapsData, TestSize.Level1)
265 {
266     TS_LOGI("test29-5");
267     HtraceMemParser SmapsEvent(stream_.traceDataCache_.get(), stream_.streamFilters_.get());
268 
269     MemoryData tracePacket;
270     int size = tracePacket.processesinfo_size();
271     EXPECT_TRUE(size == 0);
272     uint64_t timeStamp = 1616439852302;
273     BuiltinClocks clock = TS_CLOCK_BOOTTIME;
274 
275     SmapsEvent.ParseProcessInfo(tracePacket, timeStamp);
276     SmapsEvent.Finish();
277     stream_.traceDataCache_->ExportDatabase(dbPath_);
278 
279     EXPECT_TRUE(access(dbPath_.c_str(),F_OK) == 0);
280     tracePacket.clear_processesinfo();
281 
282     auto eventCount = stream_.traceDataCache_->GetConstStatAndInfo().GetValue(TRACE_SMAPS, STAT_EVENT_RECEIVED);
283     EXPECT_EQ(0, eventCount);
284 }
285 } // namespace TraceStreamer
286 } // namespace SysTuning
287