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