• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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