• 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 <string>
20 #include <unordered_map>
21 
22 #include "htrace_mem_parser.h"
23 #include "parser/common_types.h"
24 #include "trace_streamer_selector.h"
25 
26 using namespace testing::ext;
27 using namespace SysTuning::TraceStreamer;
28 
29 namespace SysTuning {
30 namespace TraceStreamer {
31 class HtraceSysVMemParserTest : public ::testing::Test {
32 public:
SetUp()33     void SetUp()
34     {
35         stream_.InitFilter();
36     }
37 
TearDown()38     void TearDown()
39     {
40         if (access(dbPath_.c_str(), F_OK) == 0) {
41             remove(dbPath_.c_str());
42         }
43     }
44 
45 public:
46     SysTuning::TraceStreamer::TraceStreamerSelector stream_ = {};
47     const std::string dbPath_ = "/data/resource/out.db";
48 };
49 
50 /**
51  * @tc.name: ParseSysMemParseWithRandomValue
52  * @tc.desc: Virtual memory parsing test, input a random reasonable value
53  * @tc.type: FUNC
54  */
55 HWTEST_F(HtraceSysVMemParserTest, ParseSysVMemParse, TestSize.Level1)
56 {
57     TS_LOGI("test13-1");
58     HtraceMemParser* memParser = new HtraceMemParser(stream_.traceDataCache_.get(), stream_.streamFilters_.get());
59 
60     MemoryData tracePacket;
61     SysVMeminfo* vmem = tracePacket.add_vmeminfo();
62     EXPECT_TRUE(vmem != nullptr);
63     int size = tracePacket.vmeminfo_size();
64     EXPECT_TRUE(size == 1);
65     vmem->set_key(SysVMeminfoType::VMEMINFO_UNSPECIFIED);
66     uint64_t value = random();
67     vmem->set_value(value);
68     uint64_t timeStamp = 1616439852302;
69     BuiltinClocks clock = TS_CLOCK_REALTIME;
70 
71     memParser->Parse(tracePacket, timeStamp, clock);
72     stream_.traceDataCache_->ExportDatabase(dbPath_);
73 
74     EXPECT_TRUE(access(dbPath_.c_str(), F_OK) == 0);
75     tracePacket.clear_meminfo();
76     delete memParser;
77 
78     auto eventCount =
79         stream_.traceDataCache_->GetConstStatAndInfo().GetValue(TRACE_SYS_VIRTUAL_MEMORY, STAT_EVENT_RECEIVED);
80     EXPECT_TRUE(1 == eventCount);
81     EXPECT_TRUE(stream_.traceDataCache_->GetConstMeasureData().Size() == 1);
82     EXPECT_TRUE(stream_.traceDataCache_->GetConstMeasureData().ValuesData()[0] == static_cast<int64_t>(value));
83 }
84 
85 /**
86  * @tc.name: ParseSysVMemNomal
87  * @tc.desc: Virtual memory parsing test nomal
88  * @tc.type: FUNC
89  */
90 HWTEST_F(HtraceSysVMemParserTest, ParseSysVMemNomal, TestSize.Level1)
91 {
92     TS_LOGI("test13-2");
93     HtraceMemParser* memParser = new HtraceMemParser(stream_.traceDataCache_.get(), stream_.streamFilters_.get());
94 
95     MemoryData tracePacket;
96     SysVMeminfo* vmem = tracePacket.add_vmeminfo();
97     EXPECT_TRUE(vmem != nullptr);
98     int size = tracePacket.vmeminfo_size();
99     EXPECT_TRUE(size == 1);
100     vmem->set_key(SysVMeminfoType::VMEMINFO_NR_FREE_PAGES);
101     uint64_t value = random();
102     vmem->set_value(value);
103 
104     vmem = tracePacket.add_vmeminfo();
105     EXPECT_TRUE(vmem != nullptr);
106     size = tracePacket.vmeminfo_size();
107     EXPECT_TRUE(size == 2);
108     vmem->set_key(SysVMeminfoType::VMEMINFO_NR_ALLOC_BATCH);
109     uint64_t value2 = random();
110     vmem->set_value(value2);
111 
112     uint64_t timeStamp = 1616439852302;
113     BuiltinClocks clock = TS_CLOCK_REALTIME;
114 
115     memParser->Parse(tracePacket, timeStamp, clock);
116     stream_.traceDataCache_->ExportDatabase(dbPath_);
117 
118     EXPECT_TRUE(access(dbPath_.c_str(), F_OK) == 0);
119     tracePacket.clear_meminfo();
120     delete memParser;
121 
122     auto eventCount =
123         stream_.traceDataCache_->GetConstStatAndInfo().GetValue(TRACE_SYS_VIRTUAL_MEMORY, STAT_EVENT_RECEIVED);
124     EXPECT_TRUE(1 == eventCount);
125     EXPECT_TRUE(stream_.traceDataCache_->GetConstMeasureData().Size() == 2);
126     EXPECT_TRUE(stream_.traceDataCache_->GetConstMeasureData().ValuesData()[0] == static_cast<int64_t>(value));
127     EXPECT_TRUE(stream_.traceDataCache_->GetConstMeasureData().ValuesData()[1] == static_cast<int64_t>(value2));
128 }
129 
130 /**
131  * @tc.name: ParseSysVMemAbnomal
132  * @tc.desc: Virtual memory parsing test abnomal
133  * @tc.type: FUNC
134  */
135 HWTEST_F(HtraceSysVMemParserTest, ParseSysVMemAbnomal, TestSize.Level1)
136 {
137     TS_LOGI("test13-3");
138     HtraceMemParser* memParser = new HtraceMemParser(stream_.traceDataCache_.get(), stream_.streamFilters_.get());
139 
140     MemoryData tracePacket;
141     SysVMeminfo* vmem = tracePacket.add_vmeminfo();
142     EXPECT_TRUE(vmem != nullptr);
143     int size = tracePacket.vmeminfo_size();
144     EXPECT_TRUE(size == 1);
145     vmem->set_key(SysVMeminfoType::VMEMINFO_NR_FREE_PAGES);
146     uint64_t value = random();
147     vmem->set_value(value);
148 
149     vmem = tracePacket.add_vmeminfo();
150     EXPECT_TRUE(vmem != nullptr);
151     size = tracePacket.vmeminfo_size();
152     EXPECT_TRUE(size == 2);
153     uint64_t value2 = random();
154     vmem->set_value(value2);
155 
156     uint64_t timeStamp = 1616439852302;
157     BuiltinClocks clock = TS_CLOCK_REALTIME;
158 
159     memParser->Parse(tracePacket, timeStamp, clock);
160     stream_.traceDataCache_->ExportDatabase(dbPath_);
161 
162     EXPECT_TRUE(access(dbPath_.c_str(), F_OK) == 0);
163     tracePacket.clear_meminfo();
164     delete memParser;
165 
166     auto eventCount =
167         stream_.traceDataCache_->GetConstStatAndInfo().GetValue(TRACE_SYS_VIRTUAL_MEMORY, STAT_EVENT_RECEIVED);
168     EXPECT_TRUE(1 == eventCount);
169     eventCount =
170         stream_.traceDataCache_->GetConstStatAndInfo().GetValue(TRACE_SYS_VIRTUAL_MEMORY, STAT_EVENT_DATA_INVALID);
171     EXPECT_TRUE(0 == eventCount);
172     EXPECT_TRUE(stream_.traceDataCache_->GetConstMeasureData().Size() == 2);
173     EXPECT_TRUE(stream_.traceDataCache_->GetConstMeasureData().ValuesData()[0] == static_cast<int64_t>(value));
174 }
175 
176 /**
177  * @tc.name: ParseSysVMemWithMutiNomal
178  * @tc.desc: Virtual memory parsing test with muti nomal
179  * @tc.type: FUNC
180  */
181 HWTEST_F(HtraceSysVMemParserTest, ParseSysVMemWithMutiNomal, TestSize.Level1)
182 {
183     TS_LOGI("test13-4");
184     HtraceMemParser* memParser = new HtraceMemParser(stream_.traceDataCache_.get(), stream_.streamFilters_.get());
185 
186     MemoryData tracePacket;
187     SysVMeminfo* vmem = tracePacket.add_vmeminfo();
188     EXPECT_TRUE(vmem != nullptr);
189     int size = tracePacket.vmeminfo_size();
190     EXPECT_TRUE(size == 1);
191     vmem->set_key(SysVMeminfoType::VMEMINFO_WORKINGSET_RESTORE);
192     uint64_t value = random();
193     vmem->set_value(value);
194 
195     vmem = tracePacket.add_vmeminfo();
196     EXPECT_TRUE(vmem != nullptr);
197     size = tracePacket.vmeminfo_size();
198     EXPECT_TRUE(size == 2);
199     vmem->set_key(SysVMeminfoType::SysVMeminfoType_INT_MIN_SENTINEL_DO_NOT_USE_);
200     uint64_t value2 = random();
201     vmem->set_value(value2);
202 
203     vmem = tracePacket.add_vmeminfo();
204     EXPECT_TRUE(vmem != nullptr);
205     size = tracePacket.vmeminfo_size();
206     EXPECT_TRUE(size == 3);
207     vmem->set_key(SysVMeminfoType::SysVMeminfoType_INT_MAX_SENTINEL_DO_NOT_USE_);
208     uint64_t value3 = random();
209     vmem->set_value(value3);
210 
211     uint64_t timeStamp = 1616439852302;
212     BuiltinClocks clock = TS_CLOCK_REALTIME;
213 
214     memParser->Parse(tracePacket, timeStamp, clock);
215     stream_.traceDataCache_->ExportDatabase(dbPath_);
216 
217     EXPECT_TRUE(access(dbPath_.c_str(), F_OK) == 0);
218     tracePacket.clear_vmeminfo();
219     delete memParser;
220 
221     auto eventCount =
222         stream_.traceDataCache_->GetConstStatAndInfo().GetValue(TRACE_SYS_VIRTUAL_MEMORY, STAT_EVENT_RECEIVED);
223     EXPECT_TRUE(1 == eventCount);
224     eventCount =
225         stream_.traceDataCache_->GetConstStatAndInfo().GetValue(TRACE_SYS_VIRTUAL_MEMORY, STAT_EVENT_DATA_INVALID);
226     EXPECT_TRUE(2 == eventCount);
227     EXPECT_TRUE(stream_.traceDataCache_->GetConstMeasureData().Size() == 1);
228     EXPECT_TRUE(stream_.traceDataCache_->GetConstMeasureData().ValuesData()[0] == static_cast<int64_t>(value));
229 }
230 
231 /**
232  * @tc.name: ParseSysVMemWithRandomValue
233  * @tc.desc: Virtual memory parsing test, input a random reasonable value
234  * @tc.type: FUNC
235  */
236 HWTEST_F(HtraceSysVMemParserTest, ParseSysVMemWithRandomValue, TestSize.Level1)
237 {
238     TS_LOGI("test13-5");
239     HtraceMemParser* memParser = new HtraceMemParser(stream_.traceDataCache_.get(), stream_.streamFilters_.get());
240 
241     MemoryData tracePacket;
242 
243     std::map<SysVMeminfoType, int64_t> sysVMemValueMap_ = {};
244     for (auto i = 0; i < SysVMeminfoType::VMEMINFO_WORKINGSET_RESTORE + 1; i++) {
245         uint64_t value = random();
246         sysVMemValueMap_.insert(std::make_pair(static_cast<SysVMeminfoType>(i), value));
247         SysVMeminfo* vmem = tracePacket.add_vmeminfo();
248         EXPECT_TRUE(vmem != nullptr);
249         vmem->set_key(static_cast<SysVMeminfoType>(i));
250         vmem->set_value(value);
251         int size = tracePacket.vmeminfo_size();
252         EXPECT_TRUE(size == i + 1);
253     }
254 
255     uint64_t timeStamp = 1616439852302;
256     BuiltinClocks clock = TS_CLOCK_REALTIME;
257 
258     memParser->Parse(tracePacket, timeStamp, clock);
259     stream_.traceDataCache_->ExportDatabase(dbPath_);
260 
261     EXPECT_TRUE(access(dbPath_.c_str(), F_OK) == 0);
262     tracePacket.clear_vmeminfo();
263     delete memParser;
264 
265     auto eventCount =
266         stream_.traceDataCache_->GetConstStatAndInfo().GetValue(TRACE_SYS_VIRTUAL_MEMORY, STAT_EVENT_RECEIVED);
267     EXPECT_TRUE(1 == eventCount);
268 
269     for (auto i = 0; i < SysVMeminfoType::VMEMINFO_WORKINGSET_RESTORE + 1; i++) {
270         EXPECT_TRUE(stream_.traceDataCache_->GetConstMeasureData().ValuesData()[i] ==
271                     sysVMemValueMap_.at(static_cast<SysVMeminfoType>(i)));
272     }
273 }
274 } // namespace TraceStreamer
275 } // namespace SysTuning
276