1 /* 2 * Copyright (c) Huawei Technologies Co., Ltd. 2023. All rights reserved. 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 "diskio_plugin_result.pb.h" 22 #include "diskio_plugin_result.pbreader.h" 23 #include "disk_io_parser/pbreader_disk_io_parser.h" 24 #include "parser/ptreader_parser/ptreader_parser.h" 25 #include "parser/common_types.h" 26 #include "trace_streamer_selector.h" 27 28 using namespace testing::ext; 29 using namespace SysTuning::TraceStreamer; 30 31 namespace SysTuning { 32 namespace TraceStreamer { 33 namespace DiskioParserUnitTest { 34 const uint64_t TS = 100; 35 const uint64_t RD_01 = 100; 36 const uint64_t WR_01 = 101; 37 const uint64_t RDPERSEC_01 = 102; 38 const uint64_t WRPERSEC_01 = 103; 39 const uint64_t RD_02 = 104; 40 const uint64_t WR_02 = 105; 41 const uint64_t RDPERSEC_02 = 106; 42 const uint64_t WRPERSEC_02 = 107; 43 const uint64_t RD_03 = 108; 44 const uint64_t WR_03 = 109; 45 const uint64_t RDPERSEC_03 = 110; 46 const uint64_t WRPERSEC_03 = 111; 47 const uint64_t RD_04 = 112; 48 const uint64_t WR_04 = 113; 49 const uint64_t RDPERSEC_04 = 114; 50 const uint64_t WRPERSEC_04 = 115; 51 52 struct DiskiodataInfo { 53 uint64_t rd_kb; 54 uint64_t wr_kb; 55 uint64_t rd_per_sec; 56 uint64_t wr_per_sec; 57 }; 58 59 class PbreaderDiskioParserTest : public ::testing::Test { 60 public: SetUp()61 void SetUp() 62 { 63 stream_.InitFilter(); 64 } 65 TearDown()66 void TearDown() {} 67 SetDiskioData(DiskiodataInfo & diskiodataInfo)68 std::string SetDiskioData(DiskiodataInfo &diskiodataInfo) 69 { 70 auto diskioInfo(std::make_unique<DiskioData>()); 71 StatsData *statsDataSecond = new StatsData(); 72 auto ioStatDataSecond = statsDataSecond->add_statsinfo(); 73 ioStatDataSecond->set_rd_kb(diskiodataInfo.rd_kb); 74 ioStatDataSecond->set_wr_kb(diskiodataInfo.wr_kb); 75 ioStatDataSecond->set_rd_per_sec(diskiodataInfo.rd_per_sec); 76 ioStatDataSecond->set_wr_per_sec(diskiodataInfo.wr_per_sec); 77 diskioInfo->set_allocated_statsdata(statsDataSecond); 78 79 std::string diskioData = ""; 80 diskioInfo->SerializeToString(&diskioData); 81 return diskioData; 82 } 83 84 public: 85 SysTuning::TraceStreamer::TraceStreamerSelector stream_ = {}; 86 }; 87 88 /** 89 * @tc.name: ParsePbreaderDiskioWithoutDiskioData 90 * @tc.desc: Parse a diskio that does not contain any DiskioData 91 * @tc.type: FUNC 92 */ 93 HWTEST_F(PbreaderDiskioParserTest, ParsePbreaderDiskioWithoutDiskioData, TestSize.Level1) 94 { 95 TS_LOGI("test13-1"); 96 auto diskioInfo = std::make_unique<DiskioData>(); 97 std::string diskioData = ""; 98 diskioInfo->SerializeToString(&diskioData); 99 ProtoReader::BytesView diskioInfoData(reinterpret_cast<const uint8_t *>(diskioData.data()), diskioData.size()); 100 PbreaderDiskIOParser pbreaderDiskioParser(stream_.traceDataCache_.get(), stream_.streamFilters_.get()); 101 pbreaderDiskioParser.Parse(diskioInfoData, TS); 102 auto size = stream_.traceDataCache_->GetConstDiskIOData().Size(); 103 EXPECT_FALSE(size); 104 } 105 106 /** 107 * @tc.name: ParsePbreaderDiskioWithOneDiskioData 108 * @tc.desc: Parse a diskio with one DiskioData 109 * @tc.type: FUNC 110 */ 111 HWTEST_F(PbreaderDiskioParserTest, ParsePbreaderDiskioWithOneDiskioData, TestSize.Level1) 112 { 113 TS_LOGI("test13-2"); 114 115 DiskiodataInfo diskiodataInfo = {RD_01, WR_01, RDPERSEC_01, WRPERSEC_01}; 116 std::string diskioData = SetDiskioData(diskiodataInfo); 117 ProtoReader::BytesView diskioInfoData(reinterpret_cast<const uint8_t *>(diskioData.data()), diskioData.size()); 118 PbreaderDiskIOParser pbreaderDiskioParser(stream_.traceDataCache_.get(), stream_.streamFilters_.get()); 119 pbreaderDiskioParser.Parse(diskioInfoData, TS); 120 pbreaderDiskioParser.Finish(); 121 auto size = stream_.traceDataCache_->GetConstDiskIOData().Size(); 122 EXPECT_FALSE(size); 123 } 124 125 /** 126 * @tc.name: ParsePbreaderDiskioWithTwoDiskioData 127 * @tc.desc: Parse a diskio with two DiskioData 128 * @tc.type: FUNC 129 */ 130 HWTEST_F(PbreaderDiskioParserTest, ParsePbreaderDiskioWithTwoDiskioData, TestSize.Level1) 131 { 132 TS_LOGI("test13-3"); 133 134 DiskiodataInfo diskiodataInfo = {RD_01, WR_01, RDPERSEC_01, WRPERSEC_01}; 135 std::string diskioData = SetDiskioData(diskiodataInfo); 136 ProtoReader::BytesView diskioInfoData01(reinterpret_cast<const uint8_t *>(diskioData.data()), diskioData.size()); 137 138 PbreaderDiskIOParser pbreaderDiskioParser(stream_.traceDataCache_.get(), stream_.streamFilters_.get()); 139 pbreaderDiskioParser.Parse(diskioInfoData01, TS); 140 141 DiskiodataInfo diskiodataInfo02 = {RD_02, WR_02, RDPERSEC_02, WRPERSEC_02}; 142 diskioData = SetDiskioData(diskiodataInfo02); 143 ProtoReader::BytesView diskioInfoData02(reinterpret_cast<const uint8_t *>(diskioData.data()), diskioData.size()); 144 pbreaderDiskioParser.Parse(diskioInfoData02, TS); 145 pbreaderDiskioParser.Finish(); 146 147 auto diskIOData = stream_.traceDataCache_->GetConstDiskIOData(); 148 ASSERT_EQ(1, diskIOData.Size()); 149 EXPECT_EQ(diskIOData.RdCountPerSecDatas()[0], RDPERSEC_02); 150 EXPECT_EQ(diskIOData.WrCountPerSecDatas()[0], WRPERSEC_02); 151 EXPECT_EQ(diskIOData.RdCountDatas()[0], RD_02); 152 EXPECT_EQ(diskIOData.WrCountDatas()[0], WR_02); 153 } 154 155 /** 156 * @tc.name: ParsePbreaderDiskioWithThreeDiskioData 157 * @tc.desc: Parse a diskio with Three DiskioData 158 * @tc.type: FUNC 159 */ 160 HWTEST_F(PbreaderDiskioParserTest, ParsePbreaderDiskioWithThreeDiskioData, TestSize.Level1) 161 { 162 TS_LOGI("test13-4"); 163 164 DiskiodataInfo diskiodataInfo = {RD_01, WR_01, RDPERSEC_01, WRPERSEC_01}; 165 std::string diskioData = SetDiskioData(diskiodataInfo); 166 ProtoReader::BytesView diskioInfoData01(reinterpret_cast<const uint8_t *>(diskioData.data()), diskioData.size()); 167 168 PbreaderDiskIOParser pbreaderDiskioParser(stream_.traceDataCache_.get(), stream_.streamFilters_.get()); 169 pbreaderDiskioParser.Parse(diskioInfoData01, TS); 170 171 DiskiodataInfo diskiodataInfo02 = {RD_02, WR_02, RDPERSEC_02, WRPERSEC_02}; 172 diskioData = SetDiskioData(diskiodataInfo02); 173 ProtoReader::BytesView diskioInfoData02(reinterpret_cast<const uint8_t *>(diskioData.data()), diskioData.size()); 174 pbreaderDiskioParser.Parse(diskioInfoData02, TS); 175 176 DiskiodataInfo diskiodataInfo03 = {RD_03, WR_03, RDPERSEC_03, WRPERSEC_03}; 177 diskioData = SetDiskioData(diskiodataInfo03); 178 ProtoReader::BytesView diskioInfoData03(reinterpret_cast<const uint8_t *>(diskioData.data()), diskioData.size()); 179 pbreaderDiskioParser.Parse(diskioInfoData03, TS); 180 pbreaderDiskioParser.Finish(); 181 182 auto diskIOData = stream_.traceDataCache_->GetConstDiskIOData(); 183 ASSERT_EQ(2, diskIOData.Size()); 184 EXPECT_EQ(diskIOData.RdCountPerSecDatas()[0], RDPERSEC_02); 185 EXPECT_EQ(diskIOData.RdCountPerSecDatas()[1], RDPERSEC_03); 186 EXPECT_EQ(diskIOData.WrCountPerSecDatas()[0], WRPERSEC_02); 187 EXPECT_EQ(diskIOData.WrCountPerSecDatas()[1], WRPERSEC_03); 188 EXPECT_EQ(diskIOData.RdCountDatas()[0], RD_02); 189 EXPECT_EQ(diskIOData.RdCountDatas()[1], RD_03); 190 EXPECT_EQ(diskIOData.WrCountDatas()[0], WR_02); 191 EXPECT_EQ(diskIOData.WrCountDatas()[1], WR_03); 192 } 193 194 /** 195 * @tc.name: ParsePbreaderDiskioWithMultipleDiskioData 196 * @tc.desc: Parse a diskio with Multiple DiskioData 197 * @tc.type: FUNC 198 */ 199 HWTEST_F(PbreaderDiskioParserTest, ParsePbreaderDiskioWithMultipleDiskioData, TestSize.Level1) 200 { 201 TS_LOGI("test13-5"); 202 203 DiskiodataInfo diskiodataInfo = {RD_01, WR_01, RDPERSEC_01, WRPERSEC_01}; 204 std::string diskioData = SetDiskioData(diskiodataInfo); 205 ProtoReader::BytesView diskioInfoData01(reinterpret_cast<const uint8_t *>(diskioData.data()), diskioData.size()); 206 207 PbreaderDiskIOParser pbreaderDiskioParser(stream_.traceDataCache_.get(), stream_.streamFilters_.get()); 208 pbreaderDiskioParser.Parse(diskioInfoData01, TS); 209 210 DiskiodataInfo diskiodataInfo02 = {RD_02, WR_02, RDPERSEC_02, WRPERSEC_02}; 211 diskioData = SetDiskioData(diskiodataInfo02); 212 ProtoReader::BytesView diskioInfoData02(reinterpret_cast<const uint8_t *>(diskioData.data()), diskioData.size()); 213 pbreaderDiskioParser.Parse(diskioInfoData02, TS); 214 215 DiskiodataInfo diskiodataInfo03 = {RD_03, WR_03, RDPERSEC_03, WRPERSEC_03}; 216 diskioData = SetDiskioData(diskiodataInfo03); 217 ProtoReader::BytesView diskioInfoData03(reinterpret_cast<const uint8_t *>(diskioData.data()), diskioData.size()); 218 pbreaderDiskioParser.Parse(diskioInfoData03, TS); 219 220 DiskiodataInfo diskiodataInfo04 = {RD_04, WR_04, RDPERSEC_04, WRPERSEC_04}; 221 diskioData = SetDiskioData(diskiodataInfo04); 222 ProtoReader::BytesView diskioInfoData04(reinterpret_cast<const uint8_t *>(diskioData.data()), diskioData.size()); 223 pbreaderDiskioParser.Parse(diskioInfoData04, TS); 224 pbreaderDiskioParser.Finish(); 225 226 auto diskIOData = stream_.traceDataCache_->GetConstDiskIOData(); 227 ASSERT_EQ(3, diskIOData.Size()); 228 EXPECT_EQ(diskIOData.RdCountPerSecDatas()[0], RDPERSEC_02); 229 EXPECT_EQ(diskIOData.RdCountPerSecDatas()[1], RDPERSEC_03); 230 EXPECT_EQ(diskIOData.RdCountPerSecDatas()[2], RDPERSEC_04); 231 EXPECT_EQ(diskIOData.WrCountPerSecDatas()[0], WRPERSEC_02); 232 EXPECT_EQ(diskIOData.WrCountPerSecDatas()[1], WRPERSEC_03); 233 EXPECT_EQ(diskIOData.WrCountPerSecDatas()[2], WRPERSEC_04); 234 EXPECT_EQ(diskIOData.RdCountDatas()[0], RD_02); 235 EXPECT_EQ(diskIOData.RdCountDatas()[1], RD_03); 236 EXPECT_EQ(diskIOData.RdCountDatas()[2], RD_04); 237 EXPECT_EQ(diskIOData.WrCountDatas()[0], WR_02); 238 EXPECT_EQ(diskIOData.WrCountDatas()[1], WR_03); 239 EXPECT_EQ(diskIOData.WrCountDatas()[2], WR_04); 240 } 241 } // namespace DiskioParserUnitTest 242 } // namespace TraceStreamer 243 } // namespace SysTuning