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