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