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_disk_io_parser.h" 22 #include "parser/bytrace_parser/bytrace_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 HtracediskioParserTest : public ::testing::Test { 32 public: SetUp()33 void SetUp() 34 { 35 stream_.InitFilter(); 36 } 37 TearDown()38 void TearDown() {} 39 40 public: 41 SysTuning::TraceStreamer::TraceStreamerSelector stream_ = {}; 42 }; 43 44 /** 45 * @tc.name: ParseHtracediskioWithoutDiskioData 46 * @tc.desc: Parse a diskio that does not contain any DiskioData 47 * @tc.type: FUNC 48 */ 49 HWTEST_F(HtracediskioParserTest, ParseHtracediskioWithoutDiskioData, TestSize.Level1) 50 { 51 TS_LOGI("test13-1"); 52 uint64_t ts = 100; 53 auto diskioData = std::make_unique<DiskioData>(); 54 HtraceDiskIOParser htraceDiskIOParser(stream_.traceDataCache_.get(), stream_.streamFilters_.get()); 55 htraceDiskIOParser.Parse(*diskioData, ts); 56 auto size = stream_.traceDataCache_->GetConstDiskIOData().Size(); 57 EXPECT_FALSE(size); 58 } 59 60 /** 61 * @tc.name: ParseHtracediskioWithOneDiskioData 62 * @tc.desc: Parse a diskio with one DiskioData 63 * @tc.type: FUNC 64 */ 65 HWTEST_F(HtracediskioParserTest, ParseHtracediskioWithOneDiskioData, TestSize.Level1) 66 { 67 TS_LOGI("test13-2"); 68 uint64_t ts = 100; 69 const uint64_t RD = 100; 70 const uint64_t WR = 101; 71 const uint64_t RDPERSEC = 102; 72 const uint64_t WRPERSEC = 103; 73 StatsData* statsData = new StatsData(); 74 auto ioStatData = statsData->add_statsinfo(); 75 ioStatData->set_rd_kb(RD); 76 ioStatData->set_wr_kb(WR); 77 ioStatData->set_rd_per_sec(RDPERSEC); 78 ioStatData->set_wr_per_sec(WRPERSEC); 79 80 auto diskioData(std::make_unique<DiskioData>()); 81 diskioData->set_allocated_statsdata(statsData); 82 83 HtraceDiskIOParser htraceDiskioParser(stream_.traceDataCache_.get(), stream_.streamFilters_.get()); 84 htraceDiskioParser.Parse(*diskioData, ts); 85 htraceDiskioParser.Finish(); 86 auto size = stream_.traceDataCache_->GetConstDiskIOData().Size(); 87 EXPECT_FALSE(size); 88 } 89 90 /** 91 * @tc.name: ParseHtracediskioWithTwoDiskioData 92 * @tc.desc: Parse a diskio with two DiskioData 93 * @tc.type: FUNC 94 */ 95 HWTEST_F(HtracediskioParserTest, ParseHtracediskioWithTwoDiskioData, TestSize.Level1) 96 { 97 TS_LOGI("test13-3"); 98 uint64_t ts = 100; 99 const uint64_t RD_01 = 100; 100 const uint64_t WR_01 = 101; 101 const uint64_t RDPERSEC_01 = 102; 102 const uint64_t WRPERSEC_01 = 103; 103 104 const uint64_t RD_02 = 104; 105 const uint64_t WR_02 = 105; 106 const uint64_t RDPERSEC_02 = 106; 107 const uint64_t WRPERSEC_02 = 107; 108 109 StatsData* statsDataFirst = new StatsData(); 110 auto ioStatDatafirst = statsDataFirst->add_statsinfo(); 111 ioStatDatafirst->set_rd_kb(RD_01); 112 ioStatDatafirst->set_wr_kb(WR_01); 113 ioStatDatafirst->set_rd_per_sec(RDPERSEC_01); 114 ioStatDatafirst->set_wr_per_sec(WRPERSEC_01); 115 116 auto diskioData = std::make_unique<DiskioData>(); 117 diskioData->set_allocated_statsdata(statsDataFirst); 118 119 HtraceDiskIOParser htraceProcessParser(stream_.traceDataCache_.get(), stream_.streamFilters_.get()); 120 htraceProcessParser.Parse(*diskioData, ts); 121 122 StatsData* statsDataSecond = new StatsData(); 123 auto ioStatDataSecond = statsDataSecond->add_statsinfo(); 124 ioStatDataSecond->set_rd_kb(RD_02); 125 ioStatDataSecond->set_wr_kb(WR_02); 126 ioStatDataSecond->set_rd_per_sec(RDPERSEC_02); 127 ioStatDataSecond->set_wr_per_sec(WRPERSEC_02); 128 diskioData->set_allocated_statsdata(statsDataSecond); 129 130 htraceProcessParser.Parse(*diskioData, ts); 131 htraceProcessParser.Finish(); 132 auto size = stream_.traceDataCache_->GetConstDiskIOData().Size(); 133 EXPECT_EQ(1, size); 134 135 auto rdCountPerSecFirst = stream_.traceDataCache_->GetConstDiskIOData().RdCountPerSecDatas()[0]; 136 EXPECT_EQ(rdCountPerSecFirst, RDPERSEC_02); 137 138 auto wrCountPerSecFirst = stream_.traceDataCache_->GetConstDiskIOData().WrCountPerSecDatas()[0]; 139 EXPECT_EQ(wrCountPerSecFirst, WRPERSEC_02); 140 141 auto rdCountDatasFirst = stream_.traceDataCache_->GetConstDiskIOData().RdCountDatas()[0]; 142 EXPECT_EQ(rdCountDatasFirst, RD_02); 143 144 auto wrCountDatasFirst = stream_.traceDataCache_->GetConstDiskIOData().WrCountDatas()[0]; 145 EXPECT_EQ(wrCountDatasFirst, WR_02); 146 } 147 148 /** 149 * @tc.name: ParseHtracediskioWithThreeDiskioData 150 * @tc.desc: Parse a diskio with Three DiskioData 151 * @tc.type: FUNC 152 */ 153 HWTEST_F(HtracediskioParserTest, ParseHtracediskioWithThreeDiskioData, TestSize.Level1) 154 { 155 TS_LOGI("test13-4"); 156 uint64_t ts = 100; 157 const uint64_t RD_01 = 100; 158 const uint64_t WR_01 = 101; 159 const uint64_t RDPERSEC_01 = 102; 160 const uint64_t WRPERSEC_01 = 103; 161 162 const uint64_t RD_02 = 104; 163 const uint64_t WR_02 = 105; 164 const uint64_t RDPERSEC_02 = 106; 165 const uint64_t WRPERSEC_02 = 107; 166 167 const uint64_t RD_03 = 108; 168 const uint64_t WR_03 = 109; 169 const uint64_t RDPERSEC_03 = 110; 170 const uint64_t WRPERSEC_03 = 111; 171 172 StatsData* statsDataFirst = new StatsData(); 173 auto ioStatDatafirst = statsDataFirst->add_statsinfo(); 174 ioStatDatafirst->set_rd_kb(RD_01); 175 ioStatDatafirst->set_wr_kb(WR_01); 176 ioStatDatafirst->set_rd_per_sec(RDPERSEC_01); 177 ioStatDatafirst->set_wr_per_sec(WRPERSEC_01); 178 179 auto diskioData = std::make_unique<DiskioData>(); 180 diskioData->set_allocated_statsdata(statsDataFirst); 181 182 HtraceDiskIOParser htraceProcessParser(stream_.traceDataCache_.get(), stream_.streamFilters_.get()); 183 htraceProcessParser.Parse(*diskioData, ts); 184 185 StatsData* statsDataSecond = new StatsData(); 186 auto ioStatDataSecond = statsDataSecond->add_statsinfo(); 187 ioStatDataSecond->set_rd_kb(RD_02); 188 ioStatDataSecond->set_wr_kb(WR_02); 189 ioStatDataSecond->set_rd_per_sec(RDPERSEC_02); 190 ioStatDataSecond->set_wr_per_sec(WRPERSEC_02); 191 diskioData->set_allocated_statsdata(statsDataSecond); 192 193 htraceProcessParser.Parse(*diskioData, ts); 194 195 StatsData* statsDataThird = new StatsData(); 196 auto ioStatDataThird = statsDataThird->add_statsinfo(); 197 ioStatDataThird->set_rd_kb(RD_03); 198 ioStatDataThird->set_wr_kb(WR_03); 199 ioStatDataThird->set_rd_per_sec(RDPERSEC_03); 200 ioStatDataThird->set_wr_per_sec(WRPERSEC_03); 201 diskioData->set_allocated_statsdata(statsDataThird); 202 htraceProcessParser.Parse(*diskioData, ts); 203 htraceProcessParser.Finish(); 204 auto size = stream_.traceDataCache_->GetConstDiskIOData().Size(); 205 EXPECT_EQ(2, size); 206 207 auto rdCountPerSecFirst = stream_.traceDataCache_->GetConstDiskIOData().RdCountPerSecDatas()[0]; 208 auto rdCountPerSecSecond = stream_.traceDataCache_->GetConstDiskIOData().RdCountPerSecDatas()[1]; 209 EXPECT_EQ(rdCountPerSecFirst, RDPERSEC_02); 210 EXPECT_EQ(rdCountPerSecSecond, RDPERSEC_03); 211 212 auto wrCountPerSecFirst = stream_.traceDataCache_->GetConstDiskIOData().WrCountPerSecDatas()[0]; 213 auto wrCountPerSecSecond = stream_.traceDataCache_->GetConstDiskIOData().WrCountPerSecDatas()[1]; 214 EXPECT_EQ(wrCountPerSecFirst, WRPERSEC_02); 215 EXPECT_EQ(wrCountPerSecSecond, WRPERSEC_03); 216 217 auto rdCountDatasFirst = stream_.traceDataCache_->GetConstDiskIOData().RdCountDatas()[0]; 218 auto rdCountDatasSecond = stream_.traceDataCache_->GetConstDiskIOData().RdCountDatas()[1]; 219 EXPECT_EQ(rdCountDatasFirst, RD_02); 220 EXPECT_EQ(rdCountDatasSecond, RD_03); 221 222 auto wrCountDatasFirst = stream_.traceDataCache_->GetConstDiskIOData().WrCountDatas()[0]; 223 auto wrCountDatasSecond = stream_.traceDataCache_->GetConstDiskIOData().WrCountDatas()[1]; 224 EXPECT_EQ(wrCountDatasFirst, WR_02); 225 EXPECT_EQ(wrCountDatasSecond, WR_03); 226 } 227 228 /** 229 * @tc.name: ParseHtracediskioWithMultipleDiskioData 230 * @tc.desc: Parse a diskio with Multiple DiskioData 231 * @tc.type: FUNC 232 */ 233 HWTEST_F(HtracediskioParserTest, ParseHtracediskioWithMultipleDiskioData, TestSize.Level1) 234 { 235 TS_LOGI("test13-5"); 236 uint64_t ts = 100; 237 const uint64_t RD_01 = 100; 238 const uint64_t WR_01 = 101; 239 const uint64_t RDPERSEC_01 = 102; 240 const uint64_t WRPERSEC_01 = 103; 241 242 const uint64_t RD_02 = 104; 243 const uint64_t WR_02 = 105; 244 const uint64_t RDPERSEC_02 = 106; 245 const uint64_t WRPERSEC_02 = 107; 246 247 const uint64_t RD_03 = 108; 248 const uint64_t WR_03 = 109; 249 const uint64_t RDPERSEC_03 = 110; 250 const uint64_t WRPERSEC_03 = 111; 251 252 const uint64_t RD_04 = 112; 253 const uint64_t WR_04 = 113; 254 const uint64_t RDPERSEC_04 = 114; 255 const uint64_t WRPERSEC_04 = 115; 256 257 StatsData* statsDataFirst = new StatsData(); 258 auto ioStatDatafirst = statsDataFirst->add_statsinfo(); 259 ioStatDatafirst->set_rd_kb(RD_01); 260 ioStatDatafirst->set_wr_kb(WR_01); 261 ioStatDatafirst->set_rd_per_sec(RDPERSEC_01); 262 ioStatDatafirst->set_wr_per_sec(WRPERSEC_01); 263 264 auto diskioData = std::make_unique<DiskioData>(); 265 diskioData->set_allocated_statsdata(statsDataFirst); 266 267 HtraceDiskIOParser htraceProcessParser(stream_.traceDataCache_.get(), stream_.streamFilters_.get()); 268 htraceProcessParser.Parse(*diskioData, ts); 269 270 StatsData* statsDataSecond = new StatsData(); 271 auto ioStatDataSecond = statsDataSecond->add_statsinfo(); 272 ioStatDataSecond->set_rd_kb(RD_02); 273 ioStatDataSecond->set_wr_kb(WR_02); 274 ioStatDataSecond->set_rd_per_sec(RDPERSEC_02); 275 ioStatDataSecond->set_wr_per_sec(WRPERSEC_02); 276 diskioData->set_allocated_statsdata(statsDataSecond); 277 htraceProcessParser.Parse(*diskioData, ts); 278 279 StatsData* statsDataThird = new StatsData(); 280 auto ioStatDataThird = statsDataThird->add_statsinfo(); 281 ioStatDataThird->set_rd_kb(RD_03); 282 ioStatDataThird->set_wr_kb(WR_03); 283 ioStatDataThird->set_rd_per_sec(RDPERSEC_03); 284 ioStatDataThird->set_wr_per_sec(WRPERSEC_03); 285 diskioData->set_allocated_statsdata(statsDataThird); 286 htraceProcessParser.Parse(*diskioData, ts); 287 288 StatsData* statsDataForth = new StatsData(); 289 auto ioStatDataForth = statsDataForth->add_statsinfo(); 290 ioStatDataForth->set_rd_kb(RD_04); 291 ioStatDataForth->set_wr_kb(WR_04); 292 ioStatDataForth->set_rd_per_sec(RDPERSEC_04); 293 ioStatDataForth->set_wr_per_sec(WRPERSEC_04); 294 diskioData->set_allocated_statsdata(statsDataForth); 295 htraceProcessParser.Parse(*diskioData, ts); 296 htraceProcessParser.Finish(); 297 298 auto size = stream_.traceDataCache_->GetConstDiskIOData().Size(); 299 EXPECT_EQ(3, size); 300 301 auto rdCountPerSecFirst = stream_.traceDataCache_->GetConstDiskIOData().RdCountPerSecDatas()[0]; 302 auto rdCountPerSecSecond = stream_.traceDataCache_->GetConstDiskIOData().RdCountPerSecDatas()[1]; 303 auto rdCountPerSecThird = stream_.traceDataCache_->GetConstDiskIOData().RdCountPerSecDatas()[2]; 304 EXPECT_EQ(rdCountPerSecFirst, RDPERSEC_02); 305 EXPECT_EQ(rdCountPerSecSecond, RDPERSEC_03); 306 EXPECT_EQ(rdCountPerSecThird, RDPERSEC_04); 307 308 auto wrCountPerSecFirst = stream_.traceDataCache_->GetConstDiskIOData().WrCountPerSecDatas()[0]; 309 auto wrCountPerSecSecond = stream_.traceDataCache_->GetConstDiskIOData().WrCountPerSecDatas()[1]; 310 auto wrCountPerSecThird = stream_.traceDataCache_->GetConstDiskIOData().WrCountPerSecDatas()[2]; 311 EXPECT_EQ(wrCountPerSecFirst, WRPERSEC_02); 312 EXPECT_EQ(wrCountPerSecSecond, WRPERSEC_03); 313 EXPECT_EQ(wrCountPerSecThird, WRPERSEC_04); 314 315 auto rdCountDatasFirst = stream_.traceDataCache_->GetConstDiskIOData().RdCountDatas()[0]; 316 auto rdCountDatasSecond = stream_.traceDataCache_->GetConstDiskIOData().RdCountDatas()[1]; 317 auto rdCountDatasThird = stream_.traceDataCache_->GetConstDiskIOData().RdCountDatas()[2]; 318 EXPECT_EQ(rdCountDatasFirst, RD_02); 319 EXPECT_EQ(rdCountDatasSecond, RD_03); 320 EXPECT_EQ(rdCountDatasThird, RD_04); 321 322 auto wrCountDatasFirst = stream_.traceDataCache_->GetConstDiskIOData().WrCountDatas()[0]; 323 auto wrCountDatasSecond = stream_.traceDataCache_->GetConstDiskIOData().WrCountDatas()[1]; 324 auto wrCountDatasThird = stream_.traceDataCache_->GetConstDiskIOData().WrCountDatas()[2]; 325 EXPECT_EQ(wrCountDatasFirst, WR_02); 326 EXPECT_EQ(wrCountDatasSecond, WR_03); 327 EXPECT_EQ(wrCountDatasThird, WR_04); 328 } 329 } // namespace TraceStreamer 330 } // namespace SysTuning