• 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 "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