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