1 /*
2  * Copyright (c) 2021-2022 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 "subcommand_report_test.h"
17 
18 #include "subcommand.h"
19 #include "subcommand_report.h"
20 #include "subcommand_test.h"
21 
22 using namespace testing::ext;
23 using namespace std;
24 using namespace OHOS::HiviewDFX;
25 namespace OHOS {
26 namespace Developtools {
27 namespace HiPerf {
28 
29 constexpr int DEFAULT_RUN_TIMEOUT_MS = 10000;
30 
31 class SubCommandReportTest : public testing::Test {
32 public:
33 #if is_ohos
34     const std::string RESOURCE_PATH = "/data/test/resource/testdata/";
35 #else
36     const std::string RESOURCE_PATH = "./resource/testdata/";
37 #endif
38     static void SetUpTestCase(void);
39     static void TearDownTestCase(void);
40     void SetUp();
41     void TearDown();
42 
43     bool FindExpectStr(const std::string &stringOut, const std::string &counterNames) const;
44     bool FindExpectStrList(const std::string &stringOut,
45                            const std::vector<std::string> &counterNames) const;
46     bool FileCompare(const std::string &stringOut, const std::string &targetFile) const;
47     const std::vector<std::string> expectStr_ = {
48         "Heating", "count", "comm", "pid", "tid", "dso", "func",
49     };
50 };
SetUpTestCase()51 void SubCommandReportTest::SetUpTestCase() {}
52 
TearDownTestCase()53 void SubCommandReportTest::TearDownTestCase() {
54 }
55 
SetUp()56 void SubCommandReportTest::SetUp()
57 {
58     ASSERT_EQ(SubCommand::GetSubCommands().size(), 0u);
59     ASSERT_EQ(SubCommandReport::RegisterSubCommandReport(), true);
60     SubCommand::RegisterSubCommand("TEST_CMD_1", std::make_unique<SubCommandTest>("TEST_CMD_1"));
61 }
62 
TearDown()63 void SubCommandReportTest::TearDown()
64 {
65     SubCommand::ClearSubCommands();
66     ASSERT_EQ(SubCommand::GetSubCommands().size(), 0u);
67     MemoryHold::Get().Clean();
68 }
69 
FindExpectStr(const std::string &stringOut, const std::string &counterNames) const70 bool SubCommandReportTest::FindExpectStr(const std::string &stringOut,
71                                          const std::string &counterNames) const
72 {
73     auto lines = StringSplit(stringOut, "\n");
74     for (auto line : lines) {
75         if (line.find(counterNames.c_str()) != std::string::npos) {
76             return true;
77         }
78     }
79     return false;
80 }
81 
FindExpectStrList(const std::string &stringOut, const std::vector<std::string> &counterNames) const82 bool SubCommandReportTest::FindExpectStrList(const std::string &stringOut,
83                                              const std::vector<std::string> &counterNames) const
84 {
85     for (auto name : counterNames) {
86         if (stringOut.find(name) != std::string::npos) {
87             return true;
88         }
89     }
90     return false;
91 }
92 
FileCompare(const std::string &stringOut, const std::string &targetFile) const93 bool SubCommandReportTest::FileCompare(const std::string &stringOut,
94                                        const std::string &targetFile) const
95 {
96     std::vector<std::string> actualLines = StringSplit(stringOut, "\n");
97     std::vector<std::string> expectLines = StringSplit(ReadFileToString(targetFile), "\n");
98 
99     for (size_t i = 0; i < actualLines.size(); i++) {
100         actualLines[i].erase(actualLines[i].find_last_not_of(" ") + 1);
101     }
102 
103     for (size_t y = 0; y < expectLines.size(); y++) {
104         expectLines[y].erase(expectLines[y].find_last_not_of(" ") + 1);
105     }
106     auto actual = actualLines.begin();
107     auto expect = expectLines.begin();
108     EXPECT_EQ(actualLines.size(), expectLines.size());
109 
110     while (actual != actualLines.end() and expect != expectLines.end() and !HasFailure()) {
111         EXPECT_STREQ(actual->c_str(), expect->c_str());
112         actual++;
113         expect++;
114     }
115     return !HasFailure();
116 }
117 
118 /**
119  * @tc.name: TestParseOption
120  * @tc.desc:
121  * @tc.type: FUNC
122  */
HWTEST_F(SubCommandReportTest, TestParseOption, TestSize.Level1)123 HWTEST_F(SubCommandReportTest, TestParseOption, TestSize.Level1)
124 {
125     SubCommandReport mSubCommandReport;
126     std::vector<std::string> args;
127     args = {"-i"};
128     EXPECT_EQ(mSubCommandReport.ParseOption(args), false);
129     args = {"-o"};
130     EXPECT_EQ(mSubCommandReport.ParseOption(args), false);
131     args = {"--diff"};
132     EXPECT_EQ(mSubCommandReport.ParseOption(args), false);
133     args = {"--sort"};
134     EXPECT_EQ(mSubCommandReport.ParseOption(args), false);
135     args = {"--symbol-dir"};
136     EXPECT_EQ(mSubCommandReport.ParseOption(args), false);
137     args = {"--limit-percent"};
138     EXPECT_EQ(mSubCommandReport.ParseOption(args), false);
139     args = {"-s"};
140     EXPECT_EQ(mSubCommandReport.ParseOption(args), true);
141     args = {"--call-stack"};
142     EXPECT_EQ(mSubCommandReport.ParseOption(args), true);
143     args = {"--call-stack-limit-percent"};
144     EXPECT_EQ(mSubCommandReport.ParseOption(args), false);
145     args = {"--comms"};
146     EXPECT_EQ(mSubCommandReport.ParseOption(args), false);
147     args = {"--pids"};
148     EXPECT_EQ(mSubCommandReport.ParseOption(args), false);
149     args = {"--tids"};
150     EXPECT_EQ(mSubCommandReport.ParseOption(args), false);
151     args = {"--dsos"};
152     EXPECT_EQ(mSubCommandReport.ParseOption(args), false);
153     args = {"--funcs"};
154     EXPECT_EQ(mSubCommandReport.ParseOption(args), false);
155     args = {"--from-dsos"};
156     EXPECT_EQ(mSubCommandReport.ParseOption(args), true);
157     args = {"--from-funcs"};
158     EXPECT_EQ(mSubCommandReport.ParseOption(args), true);
159     args = {"--proto"};
160     EXPECT_EQ(mSubCommandReport.ParseOption(args), true);
161     args = {"--json"};
162     EXPECT_EQ(mSubCommandReport.ParseOption(args), true);
163     args = {"--branch"};
164     EXPECT_EQ(mSubCommandReport.ParseOption(args), true);
165     args = {"--debug"};
166     EXPECT_EQ(mSubCommandReport.ParseOption(args), true);
167     args.clear();
168 }
169 
170 /**
171  * @tc.name: TestDumpOptions
172  * @tc.desc:
173  * @tc.type: FUNC
174  */
HWTEST_F(SubCommandReportTest, TestDumpOptions, TestSize.Level1)175 HWTEST_F(SubCommandReportTest, TestDumpOptions, TestSize.Level1)
176 {
177     StdoutRecord stdoutRecord;
178     stdoutRecord.Start();
179     SubCommandReport mSubCommandReport;
180     mSubCommandReport.DumpOptions();
181     std::string stringOut = stdoutRecord.Stop();
182     EXPECT_TRUE(stringOut.find("comm,pid,tid,dso,func") != std::string::npos);
183 }
184 
185 /**
186  * @tc.name: TestOnSubCommand_i
187  * @tc.desc:
188  * @tc.type: FUNC
189  */
HWTEST_F(SubCommandReportTest, TestOnSubCommand_i, TestSize.Level1)190 HWTEST_F(SubCommandReportTest, TestOnSubCommand_i, TestSize.Level1)
191 {
192     StdoutRecord stdoutRecord;
193     stdoutRecord.Start();
194     const auto startTime = chrono::steady_clock::now();
195     EXPECT_EQ(Command::DispatchCommand("report -i " + RESOURCE_PATH + "report_test.data"), true);
196     const auto costMs = std::chrono::duration_cast<std::chrono::milliseconds>(
197         chrono::steady_clock::now() - startTime);
198     EXPECT_LE(costMs.count(), DEFAULT_RUN_TIMEOUT_MS);
199 
200     std::string stringOut = stdoutRecord.Stop();
201     if (HasFailure()) {
202         printf("output:\n%s", stringOut.c_str());
203     }
204     std::string targetFile = RESOURCE_PATH + "report_test_i.txt";
205     EXPECT_EQ(FileCompare(stringOut, targetFile), true);
206 }
207 
208 /**
209  * @tc.name: TestOnSubCommand_gzip_fail
210  * @tc.desc:
211  * @tc.type: FUNC
212  */
HWTEST_F(SubCommandReportTest, TestOnSubCommand_gzip_fail, TestSize.Level1)213 HWTEST_F(SubCommandReportTest, TestOnSubCommand_gzip_fail, TestSize.Level1)
214 {
215     StdoutRecord stdoutRecord;
216     stdoutRecord.Start();
217     const auto startTime = chrono::steady_clock::now();
218     std::string cmd = "tar -czvf " + RESOURCE_PATH + "report_test.data.tar.gz " + RESOURCE_PATH + "report_test.data";
219     std::system(cmd.c_str());
220     EXPECT_EQ(Command::DispatchCommand("report -i " + RESOURCE_PATH + "report_test.data.tar.gz"), false);
221     const auto costMs = std::chrono::duration_cast<std::chrono::milliseconds>(
222         chrono::steady_clock::now() - startTime);
223     EXPECT_LE(costMs.count(), DEFAULT_RUN_TIMEOUT_MS);
224 
225     std::string stringOut = stdoutRecord.Stop();
226     if (HasFailure()) {
227         printf("output:\n%s", stringOut.c_str());
228     }
229 }
230 
231 /**
232  * @tc.name: TestOnSubCommand_gzip
233  * @tc.desc:
234  * @tc.type: FUNC
235  */
HWTEST_F(SubCommandReportTest, TestOnSubCommand_gzip, TestSize.Level1)236 HWTEST_F(SubCommandReportTest, TestOnSubCommand_gzip, TestSize.Level1)
237 {
238     StdoutRecord stdoutRecord;
239     stdoutRecord.Start();
240     const auto startTime = chrono::steady_clock::now();
241     EXPECT_EQ(Command::DispatchCommand("report -i /data/local/tmp/perf.data.tar.gz"), true);
242     const auto costMs = std::chrono::duration_cast<std::chrono::milliseconds>(
243         chrono::steady_clock::now() - startTime);
244     EXPECT_LE(costMs.count(), DEFAULT_RUN_TIMEOUT_MS);
245 
246     std::string stringOut = stdoutRecord.Stop();
247     if (HasFailure()) {
248         printf("output:\n%s", stringOut.c_str());
249     }
250 }
251 
252 /**
253  * @tc.name: TestOnSubCommand_i1
254  * @tc.desc:
255  * @tc.type: FUNC
256  */
HWTEST_F(SubCommandReportTest, TestOnSubCommand_i1, TestSize.Level1)257 HWTEST_F(SubCommandReportTest, TestOnSubCommand_i1, TestSize.Level1)
258 {
259     StdoutRecord stdoutRecord;
260     stdoutRecord.Start();
261     const auto startTime = chrono::steady_clock::now();
262     EXPECT_EQ(Command::DispatchCommand("report -i " + RESOURCE_PATH + "perf1.data --debug"), false);
263     const auto costMs = std::chrono::duration_cast<std::chrono::milliseconds>(
264         chrono::steady_clock::now() - startTime);
265     EXPECT_LE(costMs.count(), DEFAULT_RUN_TIMEOUT_MS);
266 
267     std::string stringOut = stdoutRecord.Stop();
268     if (HasFailure()) {
269         printf("output:\n%s", stringOut.c_str());
270     }
271     const std::string expectStr =
272         "Can not access data file /data/test/resource/testdata/perf1.data";
273     EXPECT_EQ(FindExpectStr(stringOut, expectStr), true);
274 }
275 
276 /**
277  * @tc.name: TestOnSubCommand_i2
278  * @tc.desc:
279  * @tc.type: FUNC
280  */
HWTEST_F(SubCommandReportTest, TestOnSubCommand_i2, TestSize.Level1)281 HWTEST_F(SubCommandReportTest, TestOnSubCommand_i2, TestSize.Level1)
282 {
283     StdoutRecord stdoutRecord;
284     stdoutRecord.Start();
285     const auto startTime = chrono::steady_clock::now();
286     EXPECT_EQ(Command::DispatchCommand("report " + RESOURCE_PATH + "report_test.data -i"), false);
287     const auto costMs = std::chrono::duration_cast<std::chrono::milliseconds>(
288         chrono::steady_clock::now() - startTime);
289     EXPECT_LE(costMs.count(), DEFAULT_RUN_TIMEOUT_MS);
290 
291     std::string stringOut = stdoutRecord.Stop();
292     if (HasFailure()) {
293         printf("output:\n%s", stringOut.c_str());
294     }
295     const std::string expectStr = "option -i value missed";
296     EXPECT_EQ(FindExpectStr(stringOut, expectStr), true);
297 }
298 
299 /**
300  * @tc.name: TestOnSubCommand_diff
301  * @tc.desc:
302  * @tc.type: FUNC
303  */
HWTEST_F(SubCommandReportTest, TestOnSubCommand_diff, TestSize.Level1)304 HWTEST_F(SubCommandReportTest, TestOnSubCommand_diff, TestSize.Level1)
305 {
306     StdoutRecord stdoutRecord;
307     stdoutRecord.Start();
308     const auto startTime = chrono::steady_clock::now();
309     EXPECT_EQ(Command::DispatchCommand("report -i " + RESOURCE_PATH + "perf1.data --diff " +
310                                        RESOURCE_PATH + "report_test.data"),
311               false);
312     const auto costMs = std::chrono::duration_cast<std::chrono::milliseconds>(
313         chrono::steady_clock::now() - startTime);
314     EXPECT_LE(costMs.count(), DEFAULT_RUN_TIMEOUT_MS);
315 
316     std::string stringOut = stdoutRecord.Stop();
317     if (HasFailure()) {
318         printf("output:\n%s", stringOut.c_str());
319     }
320     const std::string expectStr =
321         "Can not access data file /data/test/resource/testdata/perf1.data";
322     EXPECT_EQ(FindExpectStr(stringOut, expectStr), true);
323 }
324 
325 /**
326  * @tc.name: TestOnSubCommand_Diff_Same
327  * @tc.desc:
328  * @tc.type: FUNC
329  */
HWTEST_F(SubCommandReportTest, TestOnSubCommand_Diff_Same, TestSize.Level1)330 HWTEST_F(SubCommandReportTest, TestOnSubCommand_Diff_Same, TestSize.Level1)
331 {
332     StdoutRecord stdoutRecord;
333     stdoutRecord.Start();
334     const auto startTime = chrono::steady_clock::now();
335 
336     EXPECT_EQ(Command::DispatchCommand("report -i " + RESOURCE_PATH + "report_test.data --diff " +
337                                        RESOURCE_PATH + "report_test.data"),
338               true);
339     const auto costMs = std::chrono::duration_cast<std::chrono::milliseconds>(
340         chrono::steady_clock::now() - startTime);
341     EXPECT_LE(costMs.count(), DEFAULT_RUN_TIMEOUT_MS);
342 
343     std::string stringOut = stdoutRecord.Stop();
344     if (HasFailure()) {
345         printf("output:\n%s", stringOut.c_str());
346     }
347     std::string targetFile = RESOURCE_PATH + "report_test_diff.txt";
348     EXPECT_EQ(FileCompare(stringOut, targetFile), true);
349 }
350 
351 /**
352  * @tc.name: TestOnSubCommand_sort
353  * @tc.desc:
354  * @tc.type: FUNC
355  */
HWTEST_F(SubCommandReportTest, TestOnSubCommand_sort, TestSize.Level1)356 HWTEST_F(SubCommandReportTest, TestOnSubCommand_sort, TestSize.Level1)
357 {
358     StdoutRecord stdoutRecord;
359     stdoutRecord.Start();
360     const auto startTime = chrono::steady_clock::now();
361     EXPECT_EQ(
362         Command::DispatchCommand("report -i " + RESOURCE_PATH + "report_test.data --sort pid"),
363         true);
364     const auto costMs = std::chrono::duration_cast<std::chrono::milliseconds>(
365         chrono::steady_clock::now() - startTime);
366     EXPECT_LE(costMs.count(), DEFAULT_RUN_TIMEOUT_MS);
367 
368     std::string stringOut = stdoutRecord.Stop();
369     if (HasFailure()) {
370         printf("output:\n%s", stringOut.c_str());
371     }
372     const std::string expectStr = "100.00%  271445 1204";
373     EXPECT_EQ(FindExpectStr(stringOut, expectStr), true);
374 }
375 
376 /**
377  * @tc.name: TestOnSubCommand_sort1
378  * @tc.desc:
379  * @tc.type: FUNC
380  */
HWTEST_F(SubCommandReportTest, TestOnSubCommand_sort1, TestSize.Level1)381 HWTEST_F(SubCommandReportTest, TestOnSubCommand_sort1, TestSize.Level1)
382 {
383     StdoutRecord stdoutRecord;
384     stdoutRecord.Start();
385     const auto startTime = chrono::steady_clock::now();
386     EXPECT_EQ(
387         Command::DispatchCommand("report -i " + RESOURCE_PATH + "report_test.data --sort pid,tid"),
388         true);
389     const auto costMs = std::chrono::duration_cast<std::chrono::milliseconds>(
390         chrono::steady_clock::now() - startTime);
391     EXPECT_LE(costMs.count(), DEFAULT_RUN_TIMEOUT_MS);
392 
393     std::string stringOut = stdoutRecord.Stop();
394     if (HasFailure()) {
395         printf("output:\n%s", stringOut.c_str());
396     }
397     std::string targetFile = RESOURCE_PATH + "report_test_sort1.txt";
398     EXPECT_EQ(FileCompare(stringOut, targetFile), true);
399 }
400 
401 /**
402  * @tc.name: TestOnSubCommand_sort2
403  * @tc.desc:
404  * @tc.type: FUNC
405  */
HWTEST_F(SubCommandReportTest, TestOnSubCommand_sort2, TestSize.Level1)406 HWTEST_F(SubCommandReportTest, TestOnSubCommand_sort2, TestSize.Level1)
407 {
408     StdoutRecord stdoutRecord;
409     stdoutRecord.Start();
410     const auto startTime = chrono::steady_clock::now();
411     EXPECT_EQ(
412         Command::DispatchCommand("report -i " + RESOURCE_PATH + "report_test.data --sort func"),
413         true);
414     const auto costMs = std::chrono::duration_cast<std::chrono::milliseconds>(
415         chrono::steady_clock::now() - startTime);
416     EXPECT_LE(costMs.count(), DEFAULT_RUN_TIMEOUT_MS);
417 
418     std::string stringOut = stdoutRecord.Stop();
419     if (HasFailure()) {
420         printf("output:\n%s", stringOut.c_str());
421     }
422     std::string targetFile = RESOURCE_PATH + "report_test_sort2.txt";
423     EXPECT_EQ(FileCompare(stringOut, targetFile), true);
424 }
425 
426 /**
427  * @tc.name: TestOnSubCommand_sort3
428  * @tc.desc:
429  * @tc.type: FUNC
430  */
HWTEST_F(SubCommandReportTest, TestOnSubCommand_sort3, TestSize.Level1)431 HWTEST_F(SubCommandReportTest, TestOnSubCommand_sort3, TestSize.Level1)
432 {
433     StdoutRecord stdoutRecord;
434     stdoutRecord.Start();
435     const auto startTime = chrono::steady_clock::now();
436     EXPECT_EQ(Command::DispatchCommand("report -i " + RESOURCE_PATH + "perf1.data --sort pid"),
437               false);
438     const auto costMs = std::chrono::duration_cast<std::chrono::milliseconds>(
439         chrono::steady_clock::now() - startTime);
440     EXPECT_LE(costMs.count(), DEFAULT_RUN_TIMEOUT_MS);
441 
442     std::string stringOut = stdoutRecord.Stop();
443     if (HasFailure()) {
444         printf("output:\n%s", stringOut.c_str());
445     }
446     const std::string expectStr =
447         "Can not access data file /data/test/resource/testdata/perf1.data";
448     EXPECT_EQ(FindExpectStr(stringOut, expectStr), true);
449 }
450 
451 /**
452  * @tc.name: TestOnSubCommand_sort4
453  * @tc.desc:
454  * @tc.type: FUNC
455  */
HWTEST_F(SubCommandReportTest, TestOnSubCommand_sort4, TestSize.Level1)456 HWTEST_F(SubCommandReportTest, TestOnSubCommand_sort4, TestSize.Level1)
457 {
458     StdoutRecord stdoutRecord;
459     stdoutRecord.Start();
460     const auto startTime = chrono::steady_clock::now();
461     EXPECT_EQ(
462         Command::DispatchCommand("report -i " + RESOURCE_PATH + "report_test.data --sort pids"),
463         false);
464     const auto costMs = std::chrono::duration_cast<std::chrono::milliseconds>(
465         chrono::steady_clock::now() - startTime);
466     EXPECT_LE(costMs.count(), DEFAULT_RUN_TIMEOUT_MS);
467 
468     std::string stringOut = stdoutRecord.Stop();
469     if (HasFailure()) {
470         printf("output:\n%s", stringOut.c_str());
471     }
472     const std::string expectStr = "unknown sort key name 'pids'";
473     EXPECT_EQ(FindExpectStr(stringOut, expectStr), true);
474 }
475 
476 /**
477  * @tc.name: TestOnSubCommand_symbol
478  * @tc.desc:
479  * @tc.type: FUNC
480  */
HWTEST_F(SubCommandReportTest, TestOnSubCommand_symbol, TestSize.Level1)481 HWTEST_F(SubCommandReportTest, TestOnSubCommand_symbol, TestSize.Level1)
482 {
483     StdoutRecord stdoutRecord;
484     stdoutRecord.Start();
485     const auto startTime = chrono::steady_clock::now();
486     EXPECT_EQ(
487         Command::DispatchCommand("report -i " + RESOURCE_PATH + "report_test.data --symbol-dir ./"),
488         true);
489     const auto costMs = std::chrono::duration_cast<std::chrono::milliseconds>(
490         chrono::steady_clock::now() - startTime);
491     EXPECT_LE(costMs.count(), DEFAULT_RUN_TIMEOUT_MS);
492 
493     std::string stringOut = stdoutRecord.Stop();
494     if (HasFailure()) {
495         printf("output:\n%s", stringOut.c_str());
496     }
497     std::string targetFile = RESOURCE_PATH + "report_test_symbol.txt";
498     EXPECT_EQ(FileCompare(stringOut, targetFile), true);
499 }
500 
501 /**
502  * @tc.name: TestOnSubCommand_limit
503  * @tc.desc:
504  * @tc.type: FUNC
505  */
HWTEST_F(SubCommandReportTest, TestOnSubCommand_limit, TestSize.Level1)506 HWTEST_F(SubCommandReportTest, TestOnSubCommand_limit, TestSize.Level1)
507 {
508     StdoutRecord stdoutRecord;
509     stdoutRecord.Start();
510     const auto startTime = chrono::steady_clock::now();
511     EXPECT_EQ(Command::DispatchCommand("report -i " + RESOURCE_PATH +
512                                        "report_test.data --limit-percent 5"),
513               true);
514     const auto costMs = std::chrono::duration_cast<std::chrono::milliseconds>(
515         chrono::steady_clock::now() - startTime);
516     EXPECT_LE(costMs.count(), DEFAULT_RUN_TIMEOUT_MS);
517 
518     std::string stringOut = stdoutRecord.Stop();
519     if (HasFailure()) {
520         printf("output:\n%s", stringOut.c_str());
521     }
522     std::string targetFile = RESOURCE_PATH + "report_test_limit.txt";
523     EXPECT_EQ(FileCompare(stringOut, targetFile), true);
524 }
525 
526 /**
527  * @tc.name: TestOnSubCommand_limit1
528  * @tc.desc:
529  * @tc.type: FUNC
530  */
HWTEST_F(SubCommandReportTest, TestOnSubCommand_limit1, TestSize.Level1)531 HWTEST_F(SubCommandReportTest, TestOnSubCommand_limit1, TestSize.Level1)
532 {
533     StdoutRecord stdoutRecord;
534     stdoutRecord.Start();
535     const auto startTime = chrono::steady_clock::now();
536     EXPECT_EQ(Command::DispatchCommand("report -i " + RESOURCE_PATH +
537                                        "report_test.data --limit-percent 1"),
538               true);
539     const auto costMs = std::chrono::duration_cast<std::chrono::milliseconds>(
540         chrono::steady_clock::now() - startTime);
541     EXPECT_LE(costMs.count(), DEFAULT_RUN_TIMEOUT_MS);
542 
543     std::string stringOut = stdoutRecord.Stop();
544     if (HasFailure()) {
545         printf("output:\n%s", stringOut.c_str());
546     }
547     std::string targetFile = RESOURCE_PATH + "report_test_limit1.txt";
548     EXPECT_EQ(FileCompare(stringOut, targetFile), true);
549 }
550 
551 /**
552  * @tc.name: TestOnSubCommand_limit2
553  * @tc.desc:
554  * @tc.type: FUNC
555  */
HWTEST_F(SubCommandReportTest, TestOnSubCommand_limit2, TestSize.Level1)556 HWTEST_F(SubCommandReportTest, TestOnSubCommand_limit2, TestSize.Level1)
557 {
558     StdoutRecord stdoutRecord;
559     stdoutRecord.Start();
560     const auto startTime = chrono::steady_clock::now();
561     EXPECT_EQ(Command::DispatchCommand("report -i " + RESOURCE_PATH +
562                                        "report_test.data --limit-percent 99"),
563               true);
564     const auto costMs = std::chrono::duration_cast<std::chrono::milliseconds>(
565         chrono::steady_clock::now() - startTime);
566     EXPECT_LE(costMs.count(), DEFAULT_RUN_TIMEOUT_MS);
567 
568     std::string stringOut = stdoutRecord.Stop();
569     if (HasFailure()) {
570         printf("output:\n%s", stringOut.c_str());
571     }
572     const std::string expectStr = "kernel.kallsyms";
573     EXPECT_EQ(FindExpectStr(stringOut, expectStr), false);
574 }
575 
576 /**
577  * @tc.name: TestOnSubCommand_limit3
578  * @tc.desc:
579  * @tc.type: FUNC
580  */
HWTEST_F(SubCommandReportTest, TestOnSubCommand_limit3, TestSize.Level1)581 HWTEST_F(SubCommandReportTest, TestOnSubCommand_limit3, TestSize.Level1)
582 {
583     StdoutRecord stdoutRecord;
584     stdoutRecord.Start();
585     const auto startTime = chrono::steady_clock::now();
586     EXPECT_EQ(Command::DispatchCommand("report -i " + RESOURCE_PATH +
587                                        "report_test.data --limit-percent -1"),
588               false);
589     const auto costMs = std::chrono::duration_cast<std::chrono::milliseconds>(
590         chrono::steady_clock::now() - startTime);
591     EXPECT_LE(costMs.count(), DEFAULT_RUN_TIMEOUT_MS);
592 
593     std::string stringOut = stdoutRecord.Stop();
594     if (HasFailure()) {
595         printf("output:\n%s", stringOut.c_str());
596     }
597     const std::string expectStr = "head limit error. must in (0 <= limit < 100)";
598     EXPECT_EQ(FindExpectStr(stringOut, expectStr), true);
599 }
600 
601 /**
602  * @tc.name: TestOnSubCommand_limit4
603  * @tc.desc:
604  * @tc.type: FUNC
605  */
HWTEST_F(SubCommandReportTest, TestOnSubCommand_limit4, TestSize.Level1)606 HWTEST_F(SubCommandReportTest, TestOnSubCommand_limit4, TestSize.Level1)
607 {
608     StdoutRecord stdoutRecord;
609     stdoutRecord.Start();
610     const auto startTime = chrono::steady_clock::now();
611     EXPECT_EQ(Command::DispatchCommand("report -i " + RESOURCE_PATH +
612                                        "report_test.data --limit-percent 101"),
613               false);
614     const auto costMs = std::chrono::duration_cast<std::chrono::milliseconds>(
615         chrono::steady_clock::now() - startTime);
616     EXPECT_LE(costMs.count(), DEFAULT_RUN_TIMEOUT_MS);
617 
618     std::string stringOut = stdoutRecord.Stop();
619     if (HasFailure()) {
620         printf("output:\n%s", stringOut.c_str());
621     }
622     const std::string expectStr = "head limit error. must in (0 <= limit < 100)";
623     EXPECT_EQ(FindExpectStr(stringOut, expectStr), true);
624 }
625 
626 /**
627  * @tc.name: TestOnSubCommand_callstack
628  * @tc.desc:
629  * @tc.type: FUNC
630  */
HWTEST_F(SubCommandReportTest, TestOnSubCommand_callstack, TestSize.Level1)631 HWTEST_F(SubCommandReportTest, TestOnSubCommand_callstack, TestSize.Level1)
632 {
633     StdoutRecord stdoutRecord;
634     stdoutRecord.Start();
635     const auto startTime = chrono::steady_clock::now();
636     EXPECT_EQ(
637         Command::DispatchCommand("report -i " + RESOURCE_PATH + "report_test.data --call-stack"),
638         true);
639     const auto costMs = std::chrono::duration_cast<std::chrono::milliseconds>(
640         chrono::steady_clock::now() - startTime);
641     EXPECT_LE(costMs.count(), DEFAULT_RUN_TIMEOUT_MS);
642 
643     std::string stringOut = stdoutRecord.Stop();
644     if (HasFailure()) {
645         printf("output:\n%s", stringOut.c_str());
646     }
647     std::string targetFile = RESOURCE_PATH + "report_test_callstack.txt";
648     EXPECT_EQ(FileCompare(stringOut, targetFile), true);
649 }
650 
651 /**
652  * @tc.name: TestOnSubCommand_comms
653  * @tc.desc:
654  * @tc.type: FUNC
655  */
HWTEST_F(SubCommandReportTest, TestOnSubCommand_comms, TestSize.Level1)656 HWTEST_F(SubCommandReportTest, TestOnSubCommand_comms, TestSize.Level1)
657 {
658     StdoutRecord stdoutRecord;
659     stdoutRecord.Start();
660     const auto startTime = chrono::steady_clock::now();
661     EXPECT_EQ(
662         Command::DispatchCommand("report -i " + RESOURCE_PATH + "report_test.data --comms hiperf"),
663         true);
664     const auto costMs = std::chrono::duration_cast<std::chrono::milliseconds>(
665         chrono::steady_clock::now() - startTime);
666     EXPECT_LE(costMs.count(), DEFAULT_RUN_TIMEOUT_MS);
667 
668     std::string stringOut = stdoutRecord.Stop();
669     if (HasFailure()) {
670         printf("output:\n%s", stringOut.c_str());
671     }
672     std::string targetFile = RESOURCE_PATH + "report_test_i.txt";
673     EXPECT_EQ(FileCompare(stringOut, targetFile), true);
674 }
675 
676 /**
677  * @tc.name: TestOnSubCommand_pids
678  * @tc.desc:
679  * @tc.type: FUNC
680  */
HWTEST_F(SubCommandReportTest, TestOnSubCommand_pids, TestSize.Level1)681 HWTEST_F(SubCommandReportTest, TestOnSubCommand_pids, TestSize.Level1)
682 {
683     StdoutRecord stdoutRecord;
684     stdoutRecord.Start();
685     const auto startTime = chrono::steady_clock::now();
686     EXPECT_EQ(
687         Command::DispatchCommand("report -i " + RESOURCE_PATH + "report_test.data --pids 1204"),
688         true);
689     const auto costMs = std::chrono::duration_cast<std::chrono::milliseconds>(
690         chrono::steady_clock::now() - startTime);
691     EXPECT_LE(costMs.count(), DEFAULT_RUN_TIMEOUT_MS);
692 
693     std::string stringOut = stdoutRecord.Stop();
694     if (HasFailure()) {
695         printf("output:\n%s", stringOut.c_str());
696     }
697     std::string targetFile = RESOURCE_PATH + "report_test_i.txt";
698     EXPECT_EQ(FileCompare(stringOut, targetFile), true);
699 }
700 
701 /**
702  * @tc.name: TestOnSubCommand_pids1
703  * @tc.desc:
704  * @tc.type: FUNC
705  */
HWTEST_F(SubCommandReportTest, TestOnSubCommand_pids1, TestSize.Level1)706 HWTEST_F(SubCommandReportTest, TestOnSubCommand_pids1, TestSize.Level1)
707 {
708     StdoutRecord stdoutRecord;
709     stdoutRecord.Start();
710     const auto startTime = chrono::steady_clock::now();
711     EXPECT_EQ(
712         Command::DispatchCommand("report -i " + RESOURCE_PATH + "report_test.data --pids 485"),
713         true);
714     const auto costMs = std::chrono::duration_cast<std::chrono::milliseconds>(
715         chrono::steady_clock::now() - startTime);
716     EXPECT_LE(costMs.count(), DEFAULT_RUN_TIMEOUT_MS);
717 
718     std::string stringOut = stdoutRecord.Stop();
719     if (HasFailure()) {
720         printf("output:\n%s", stringOut.c_str());
721     }
722     std::string targetFile = RESOURCE_PATH + "report_test_tids1.txt";
723     EXPECT_EQ(FileCompare(stringOut, targetFile), true);
724 }
725 
726 /**
727  * @tc.name: TestOnSubCommand_pids2
728  * @tc.desc:
729  * @tc.type: FUNC
730  */
HWTEST_F(SubCommandReportTest, TestOnSubCommand_pids2, TestSize.Level1)731 HWTEST_F(SubCommandReportTest, TestOnSubCommand_pids2, TestSize.Level1)
732 {
733     StdoutRecord stdoutRecord;
734     stdoutRecord.Start();
735     const auto startTime = chrono::steady_clock::now();
736     EXPECT_EQ(
737         Command::DispatchCommand("report -i " + RESOURCE_PATH + "report_test.data --pids 11111"),
738         true);
739     const auto costMs = std::chrono::duration_cast<std::chrono::milliseconds>(
740         chrono::steady_clock::now() - startTime);
741     EXPECT_LE(costMs.count(), DEFAULT_RUN_TIMEOUT_MS);
742 
743     std::string stringOut = stdoutRecord.Stop();
744     if (HasFailure()) {
745         printf("output:\n%s", stringOut.c_str());
746     }
747     std::string targetFile = RESOURCE_PATH + "report_test_tids1.txt";
748     EXPECT_EQ(FileCompare(stringOut, targetFile), true);
749 }
750 
751 /**
752  * @tc.name: TestOnSubCommand_pids3
753  * @tc.desc:
754  * @tc.type: FUNC
755  */
HWTEST_F(SubCommandReportTest, TestOnSubCommand_pids3, TestSize.Level1)756 HWTEST_F(SubCommandReportTest, TestOnSubCommand_pids3, TestSize.Level1)
757 {
758     StdoutRecord stdoutRecord;
759     stdoutRecord.Start();
760     const auto startTime = chrono::steady_clock::now();
761     EXPECT_EQ(
762         Command::DispatchCommand("report -i " + RESOURCE_PATH + "report_test.data --pids -106"),
763         false);
764     const auto costMs = std::chrono::duration_cast<std::chrono::milliseconds>(
765         chrono::steady_clock::now() - startTime);
766     EXPECT_LE(costMs.count(), DEFAULT_RUN_TIMEOUT_MS);
767 
768     std::string stringOut = stdoutRecord.Stop();
769     if (HasFailure()) {
770         printf("output:\n%s", stringOut.c_str());
771     }
772     const std::string expectStr = "error number for pid";
773     EXPECT_EQ(FindExpectStr(stringOut, expectStr), true);
774 }
775 
776 /**
777  * @tc.name: TestOnSubCommand_tids
778  * @tc.desc:
779  * @tc.type: FUNC
780  */
HWTEST_F(SubCommandReportTest, TestOnSubCommand_tids, TestSize.Level1)781 HWTEST_F(SubCommandReportTest, TestOnSubCommand_tids, TestSize.Level1)
782 {
783     StdoutRecord stdoutRecord;
784     stdoutRecord.Start();
785     const auto startTime = chrono::steady_clock::now();
786     EXPECT_EQ(
787         Command::DispatchCommand("report -i " + RESOURCE_PATH + "report_test.data --tids 1205"),
788         true);
789     const auto costMs = std::chrono::duration_cast<std::chrono::milliseconds>(
790         chrono::steady_clock::now() - startTime);
791     EXPECT_LE(costMs.count(), DEFAULT_RUN_TIMEOUT_MS);
792 
793     std::string stringOut = stdoutRecord.Stop();
794     if (HasFailure()) {
795         printf("output:\n%s", stringOut.c_str());
796     }
797     std::string targetFile = RESOURCE_PATH + "report_test_tids.txt";
798     EXPECT_EQ(FileCompare(stringOut, targetFile), true);
799 }
800 
801 /**
802  * @tc.name: TestOnSubCommand_tids1
803  * @tc.desc:
804  * @tc.type: FUNC
805  */
HWTEST_F(SubCommandReportTest, TestOnSubCommand_tids1, TestSize.Level1)806 HWTEST_F(SubCommandReportTest, TestOnSubCommand_tids1, TestSize.Level1)
807 {
808     StdoutRecord stdoutRecord;
809     stdoutRecord.Start();
810     const auto startTime = chrono::steady_clock::now();
811     EXPECT_EQ(
812         Command::DispatchCommand("report -i " + RESOURCE_PATH + "report_test.data --tids 905"),
813         true);
814     const auto costMs = std::chrono::duration_cast<std::chrono::milliseconds>(
815         chrono::steady_clock::now() - startTime);
816     EXPECT_LE(costMs.count(), DEFAULT_RUN_TIMEOUT_MS);
817 
818     std::string stringOut = stdoutRecord.Stop();
819     if (HasFailure()) {
820         printf("output:\n%s", stringOut.c_str());
821     }
822     std::string targetFile = RESOURCE_PATH + "report_test_tids1.txt";
823     EXPECT_EQ(FileCompare(stringOut, targetFile), true);
824 }
825 
826 /**
827  * @tc.name: TestOnSubCommand_tids2
828  * @tc.desc:
829  * @tc.type: FUNC
830  */
HWTEST_F(SubCommandReportTest, TestOnSubCommand_tids2, TestSize.Level1)831 HWTEST_F(SubCommandReportTest, TestOnSubCommand_tids2, TestSize.Level1)
832 {
833     StdoutRecord stdoutRecord;
834     stdoutRecord.Start();
835     const auto startTime = chrono::steady_clock::now();
836     EXPECT_EQ(
837         Command::DispatchCommand("report -i " + RESOURCE_PATH + "report_test.data --tids 11111"),
838         true);
839     const auto costMs = std::chrono::duration_cast<std::chrono::milliseconds>(
840         chrono::steady_clock::now() - startTime);
841     EXPECT_LE(costMs.count(), DEFAULT_RUN_TIMEOUT_MS);
842 
843     std::string stringOut = stdoutRecord.Stop();
844     if (HasFailure()) {
845         printf("output:\n%s", stringOut.c_str());
846     }
847     std::string targetFile = RESOURCE_PATH + "report_test_tids1.txt";
848     EXPECT_EQ(FileCompare(stringOut, targetFile), true);
849 }
850 
851 /**
852  * @tc.name: TestOnSubCommand_tids3
853  * @tc.desc:
854  * @tc.type: FUNC
855  */
HWTEST_F(SubCommandReportTest, TestOnSubCommand_tids3, TestSize.Level1)856 HWTEST_F(SubCommandReportTest, TestOnSubCommand_tids3, TestSize.Level1)
857 {
858     StdoutRecord stdoutRecord;
859     stdoutRecord.Start();
860     const auto startTime = chrono::steady_clock::now();
861     EXPECT_EQ(
862         Command::DispatchCommand("report -i " + RESOURCE_PATH + "report_test.data --tids -109"),
863         false);
864     const auto costMs = std::chrono::duration_cast<std::chrono::milliseconds>(
865         chrono::steady_clock::now() - startTime);
866     EXPECT_LE(costMs.count(), DEFAULT_RUN_TIMEOUT_MS);
867 
868     std::string stringOut = stdoutRecord.Stop();
869     if (HasFailure()) {
870         printf("output:\n%s", stringOut.c_str());
871     }
872     const std::string expectStr = "error number for tid";
873     EXPECT_EQ(FindExpectStr(stringOut, expectStr), true);
874 }
875 
876 /**
877  * @tc.name: TestOnSubCommand_dsos
878  * @tc.desc:
879  * @tc.type: FUNC
880  */
HWTEST_F(SubCommandReportTest, TestOnSubCommand_dsos, TestSize.Level1)881 HWTEST_F(SubCommandReportTest, TestOnSubCommand_dsos, TestSize.Level1)
882 {
883     StdoutRecord stdoutRecord;
884     stdoutRecord.Start();
885     const auto startTime = chrono::steady_clock::now();
886     EXPECT_EQ(Command::DispatchCommand("report -i " + RESOURCE_PATH +
887                                        "report_test.data --dsos [kernel.kallsyms]"),
888               true);
889     const auto costMs = std::chrono::duration_cast<std::chrono::milliseconds>(
890         chrono::steady_clock::now() - startTime);
891     EXPECT_LE(costMs.count(), DEFAULT_RUN_TIMEOUT_MS);
892 
893     std::string stringOut = stdoutRecord.Stop();
894     if (HasFailure()) {
895         printf("output:\n%s", stringOut.c_str());
896     }
897     std::string targetFile = RESOURCE_PATH + "report_test_dsos.txt";
898     EXPECT_EQ(FileCompare(stringOut, targetFile), true);
899 }
900 
901 /**
902  * @tc.name: TestOnSubCommand_dsos1
903  * @tc.desc:
904  * @tc.type: FUNC
905  */
HWTEST_F(SubCommandReportTest, TestOnSubCommand_dsos1, TestSize.Level1)906 HWTEST_F(SubCommandReportTest, TestOnSubCommand_dsos1, TestSize.Level1)
907 {
908     StdoutRecord stdoutRecord;
909     stdoutRecord.Start();
910     const auto startTime = chrono::steady_clock::now();
911     EXPECT_EQ(Command::DispatchCommand("report -i " + RESOURCE_PATH +
912                                        "report_test.data --dsos /system/lib/libcamera.so"),
913               true);
914     const auto costMs = std::chrono::duration_cast<std::chrono::milliseconds>(
915         chrono::steady_clock::now() - startTime);
916     EXPECT_LE(costMs.count(), DEFAULT_RUN_TIMEOUT_MS);
917 
918     std::string stringOut = stdoutRecord.Stop();
919     if (HasFailure()) {
920         printf("output:\n%s", stringOut.c_str());
921     }
922     std::string targetFile = RESOURCE_PATH + "report_test_tids1.txt";
923     EXPECT_EQ(FileCompare(stringOut, targetFile), true);
924 }
925 
926 /**
927  * @tc.name: TestOnSubCommand_dsos2
928  * @tc.desc:
929  * @tc.type: FUNC
930  */
HWTEST_F(SubCommandReportTest, TestOnSubCommand_dsos2, TestSize.Level1)931 HWTEST_F(SubCommandReportTest, TestOnSubCommand_dsos2, TestSize.Level1)
932 {
933     StdoutRecord stdoutRecord;
934     stdoutRecord.Start();
935     const auto startTime = chrono::steady_clock::now();
936     EXPECT_EQ(Command::DispatchCommand("report -i " + RESOURCE_PATH + "report_test.data --dso"),
937               false);
938     const auto costMs = std::chrono::duration_cast<std::chrono::milliseconds>(
939         chrono::steady_clock::now() - startTime);
940     EXPECT_LE(costMs.count(), DEFAULT_RUN_TIMEOUT_MS);
941 
942     std::string stringOut = stdoutRecord.Stop();
943     if (HasFailure()) {
944         printf("output:\n%s", stringOut.c_str());
945     }
946     const std::string expectStr = "unknown option";
947     EXPECT_EQ(FindExpectStr(stringOut, expectStr), true);
948 }
949 
950 /**
951  * @tc.name: TestOnSubCommand_funcs
952  * @tc.desc:
953  * @tc.type: FUNC
954  */
HWTEST_F(SubCommandReportTest, TestOnSubCommand_funcs, TestSize.Level1)955 HWTEST_F(SubCommandReportTest, TestOnSubCommand_funcs, TestSize.Level1)
956 {
957     StdoutRecord stdoutRecord;
958     stdoutRecord.Start();
959     const auto startTime = chrono::steady_clock::now();
960     EXPECT_EQ(Command::DispatchCommand("report -i " + RESOURCE_PATH +
961                                        "report_test.data --funcs finish_task_switch"),
962               true);
963     const auto costMs = std::chrono::duration_cast<std::chrono::milliseconds>(
964         chrono::steady_clock::now() - startTime);
965     EXPECT_LE(costMs.count(), DEFAULT_RUN_TIMEOUT_MS);
966 
967     std::string stringOut = stdoutRecord.Stop();
968     if (HasFailure()) {
969         printf("output:\n%s", stringOut.c_str());
970     }
971     std::string targetFile = RESOURCE_PATH + "report_test_funcs.txt";
972     EXPECT_EQ(FileCompare(stringOut, targetFile), true);
973 }
974 
975 /**
976  * @tc.name: TestOnSubCommand_funcs1
977  * @tc.desc:
978  * @tc.type: FUNC
979  */
HWTEST_F(SubCommandReportTest, TestOnSubCommand_funcs1, TestSize.Level1)980 HWTEST_F(SubCommandReportTest, TestOnSubCommand_funcs1, TestSize.Level1)
981 {
982     StdoutRecord stdoutRecord;
983     stdoutRecord.Start();
984     const auto startTime = chrono::steady_clock::now();
985     EXPECT_EQ(Command::DispatchCommand("report -i " + RESOURCE_PATH + "report_test.data --func"),
986               false);
987     const auto costMs = std::chrono::duration_cast<std::chrono::milliseconds>(
988         chrono::steady_clock::now() - startTime);
989     EXPECT_LE(costMs.count(), DEFAULT_RUN_TIMEOUT_MS);
990 
991     std::string stringOut = stdoutRecord.Stop();
992     if (HasFailure()) {
993         printf("output:\n%s", stringOut.c_str());
994     }
995     const std::string expectStr = "unknown option";
996     EXPECT_EQ(FindExpectStr(stringOut, expectStr), true);
997 }
998 
999 /**
1000  * @tc.name: TestOnSubCommand_json
1001  * @tc.desc:
1002  * @tc.type: FUNC
1003  */
HWTEST_F(SubCommandReportTest, TestOnSubCommand_json, TestSize.Level1)1004 HWTEST_F(SubCommandReportTest, TestOnSubCommand_json, TestSize.Level1)
1005 {
1006     StdoutRecord stdoutRecord;
1007     stdoutRecord.Start();
1008     const auto startTime = chrono::steady_clock::now();
1009     EXPECT_EQ(Command::DispatchCommand("report -i " + RESOURCE_PATH + "report_test.data --json"),
1010               true);
1011     const auto costMs = std::chrono::duration_cast<std::chrono::milliseconds>(
1012         chrono::steady_clock::now() - startTime);
1013     EXPECT_LE(costMs.count(), DEFAULT_RUN_TIMEOUT_MS);
1014 
1015     std::string stringOut = stdoutRecord.Stop();
1016     if (HasFailure()) {
1017         printf("output:\n%s", stringOut.c_str());
1018     }
1019     const std::string expectStr = "report will save at 'perf.json'";
1020     EXPECT_EQ(FindExpectStr(stringOut, expectStr), true);
1021 }
1022 
1023 /**
1024  * @tc.name: TestOnSubCommand_json1
1025  * @tc.desc:
1026  * @tc.type: FUNC
1027  */
HWTEST_F(SubCommandReportTest, TestOnSubCommand_json1, TestSize.Level1)1028 HWTEST_F(SubCommandReportTest, TestOnSubCommand_json1, TestSize.Level1)
1029 {
1030     StdoutRecord stdoutRecord;
1031     stdoutRecord.Start();
1032     const auto startTime = chrono::steady_clock::now();
1033     EXPECT_EQ(Command::DispatchCommand("report -i " + RESOURCE_PATH + "perf1.data --json"), false);
1034     const auto costMs = std::chrono::duration_cast<std::chrono::milliseconds>(
1035         chrono::steady_clock::now() - startTime);
1036     EXPECT_LE(costMs.count(), DEFAULT_RUN_TIMEOUT_MS);
1037 
1038     std::string stringOut = stdoutRecord.Stop();
1039     if (HasFailure()) {
1040         printf("output:\n%s", stringOut.c_str());
1041     }
1042     const std::string expectStr =
1043         "Can not access data file /data/test/resource/testdata/perf1.data";
1044     EXPECT_EQ(FindExpectStr(stringOut, expectStr), true);
1045 }
1046 
1047 /**
1048  * @tc.name: TestOnSubCommand_proto
1049  * @tc.desc:
1050  * @tc.type: FUNC
1051  */
HWTEST_F(SubCommandReportTest, TestOnSubCommand_proto, TestSize.Level1)1052 HWTEST_F(SubCommandReportTest, TestOnSubCommand_proto, TestSize.Level1)
1053 {
1054     StdoutRecord stdoutRecord;
1055     stdoutRecord.Start();
1056     const auto startTime = chrono::steady_clock::now();
1057     EXPECT_EQ(Command::DispatchCommand("report -i " + RESOURCE_PATH + "report_test.data --proto"),
1058               true);
1059     const auto costMs = std::chrono::duration_cast<std::chrono::milliseconds>(
1060         chrono::steady_clock::now() - startTime);
1061     EXPECT_LE(costMs.count(), DEFAULT_RUN_TIMEOUT_MS);
1062 
1063     std::string stringOut = stdoutRecord.Stop();
1064     if (HasFailure()) {
1065         printf("output:\n%s", stringOut.c_str());
1066     }
1067     const std::string expectStr = "create proto buf file succeed";
1068     EXPECT_EQ(FindExpectStr(stringOut, expectStr), true);
1069 }
1070 
1071 /**
1072  * @tc.name: TestOnSubCommand_proto1
1073  * @tc.desc:
1074  * @tc.type: FUNC
1075  */
HWTEST_F(SubCommandReportTest, TestOnSubCommand_proto1, TestSize.Level1)1076 HWTEST_F(SubCommandReportTest, TestOnSubCommand_proto1, TestSize.Level1)
1077 {
1078     StdoutRecord stdoutRecord;
1079     stdoutRecord.Start();
1080     const auto startTime = chrono::steady_clock::now();
1081     EXPECT_EQ(Command::DispatchCommand("report -i " + RESOURCE_PATH + "perf1.data --proto"), false);
1082     const auto costMs = std::chrono::duration_cast<std::chrono::milliseconds>(
1083         chrono::steady_clock::now() - startTime);
1084     EXPECT_LE(costMs.count(), DEFAULT_RUN_TIMEOUT_MS);
1085 
1086     std::string stringOut = stdoutRecord.Stop();
1087     if (HasFailure()) {
1088         printf("output:\n%s", stringOut.c_str());
1089     }
1090     const std::string expectStr =
1091         "Can not access data file /data/test/resource/testdata/perf1.data";
1092     EXPECT_EQ(FindExpectStr(stringOut, expectStr), true);
1093 }
1094 
1095 /**
1096  * @tc.name: TestLoadPerfData
1097  * @tc.desc:
1098  * @tc.type: FUNC
1099  */
HWTEST_F(SubCommandReportTest, TestLoadPerfData, TestSize.Level1)1100 HWTEST_F(SubCommandReportTest, TestLoadPerfData, TestSize.Level1)
1101 {
1102     EXPECT_EQ(Command::DispatchCommand("report -i " + RESOURCE_PATH + "report_test.data -o " +
1103                                        RESOURCE_PATH + "perfnew2.data"),
1104               true);
1105     EXPECT_EQ(IsPath(RESOURCE_PATH + "report_test.data"), true);
1106 }
1107 
1108 /**
1109  * @tc.name: TestOutputReport
1110  * @tc.desc:
1111  * @tc.type: FUNC
1112  */
HWTEST_F(SubCommandReportTest, TestOutputReport, TestSize.Level1)1113 HWTEST_F(SubCommandReportTest, TestOutputReport, TestSize.Level1)
1114 {
1115     EXPECT_EQ(Command::DispatchCommand("report -i " + RESOURCE_PATH + "report_test.data -o " +
1116                                        RESOURCE_PATH + "perfnew2.data"),
1117               true);
1118     EXPECT_EQ(IsPath(RESOURCE_PATH + "perfnew2.data"), true);
1119 }
1120 
1121 /**
1122  * @tc.name: TestVerifyOption
1123  * @tc.desc:
1124  * @tc.type: FUNC
1125  */
HWTEST_F(SubCommandReportTest, TestVerifyOption, TestSize.Level1)1126 HWTEST_F(SubCommandReportTest, TestVerifyOption, TestSize.Level1)
1127 {
1128     SubCommandReport mSubCommandReport;
1129     std::string recordFile;
1130     std::vector<std::string> args;
1131     args = {"report", "-i", RESOURCE_PATH + "/report_test.data", "--limit-percent", "60"};
1132     ASSERT_EQ(
1133         Option::GetOptionValue(args, "--limit-percent", mSubCommandReport.reportOption_.heatLimit_),
1134         true);
1135     ASSERT_EQ(Option::GetOptionValue(args, "-i", recordFile), true);
1136 
1137     EXPECT_EQ(mSubCommandReport.VerifyOption(), true);
1138 
1139     mSubCommandReport.FlushCacheRecord();
1140 
1141     mSubCommandReport.reportOption_.heatLimit_ = 101.0;
1142     EXPECT_EQ(mSubCommandReport.VerifyOption(), false);
1143 }
1144 
1145 /**
1146  * @tc.name: TestVerifyDisplayOption
1147  * @tc.desc:
1148  * @tc.type: FUNC
1149  */
HWTEST_F(SubCommandReportTest, TestVerifyDisplayOption, TestSize.Level1)1150 HWTEST_F(SubCommandReportTest, TestVerifyDisplayOption, TestSize.Level1)
1151 {
1152     SubCommandReport mSubCommandReport;
1153     std::string recordFile;
1154     std::vector<std::string> args;
1155     args = {"report", "-i", RESOURCE_PATH + "report_test.data ", "--pids", "-1"};
1156     ASSERT_EQ(Option::GetOptionValue(args, "--pids", mSubCommandReport.reportOption_.displayPids_),
1157               true);
1158     ASSERT_EQ(Option::GetOptionValue(args, "-i", recordFile), true);
1159     EXPECT_EQ(mSubCommandReport.VerifyDisplayOption(), false);
1160 
1161     mSubCommandReport.reportOption_.displayPids_.clear();
1162     args = {"report -i " + RESOURCE_PATH + "report_test.data --pids "};
1163     EXPECT_EQ(mSubCommandReport.VerifyDisplayOption(), true);
1164 }
1165 
1166 /**
1167  * @tc.name: TestDwarfCompress
1168  * @tc.desc:
1169  * @tc.type: FUNC
1170  */
HWTEST_F(SubCommandReportTest, TestDwarfCompress, TestSize.Level1)1171 HWTEST_F(SubCommandReportTest, TestDwarfCompress, TestSize.Level1)
1172 {
1173     StdoutRecord stdoutRecord;
1174     stdoutRecord.Start();
1175     EXPECT_EQ(
1176         Command::DispatchCommand("report -s -i " + RESOURCE_PATH + "dwarf.compress.data"),
1177         true);
1178     std::string stringOut = stdoutRecord.Stop();
1179     if (HasFailure()) {
1180         printf("output:\n%s", stringOut.c_str());
1181     }
1182     const std::string expectStr = "--dedup_stack";
1183     EXPECT_EQ(FindExpectStr(stringOut, expectStr), true);
1184     const std::string expectPercentageStr = "|- 28.67% futex_wait_queue_me";
1185     EXPECT_EQ(FindExpectStr(stringOut, expectPercentageStr), true);
1186 }
1187 
1188 /**
1189  * @tc.name: TestFpCompress
1190  * @tc.desc:
1191  * @tc.type: FUNC
1192  */
HWTEST_F(SubCommandReportTest, TestFpCompress, TestSize.Level1)1193 HWTEST_F(SubCommandReportTest, TestFpCompress, TestSize.Level1)
1194 {
1195     StdoutRecord stdoutRecord;
1196     stdoutRecord.Start();
1197     EXPECT_EQ(
1198         Command::DispatchCommand("report -s -i " + RESOURCE_PATH + "fp.compress.data"),
1199         true);
1200     std::string stringOut = stdoutRecord.Stop();
1201     if (HasFailure()) {
1202         printf("output:\n%s", stringOut.c_str());
1203     }
1204     const std::string expectStr = "--dedup_stack";
1205     EXPECT_EQ(FindExpectStr(stringOut, expectStr), true);
1206     const std::string expectPercentageStr = "el0_sync_compat_handler";
1207     EXPECT_EQ(FindExpectStr(stringOut, expectPercentageStr), true);
1208 }
1209 
1210 /**
1211  * @tc.name: TestDwarfUnCompress
1212  * @tc.desc:
1213  * @tc.type: FUNC
1214  */
HWTEST_F(SubCommandReportTest, TestDwarfUnCompress, TestSize.Level1)1215 HWTEST_F(SubCommandReportTest, TestDwarfUnCompress, TestSize.Level1)
1216 {
1217     StdoutRecord stdoutRecord;
1218     stdoutRecord.Start();
1219     EXPECT_EQ(
1220         Command::DispatchCommand("report -s -i " + RESOURCE_PATH + "dwarf.uncompress.data"),
1221         true);
1222     std::string stringOut = stdoutRecord.Stop();
1223     if (HasFailure()) {
1224         printf("output:\n%s", stringOut.c_str());
1225     }
1226     const std::string expectStr = "--dedup_stack";
1227     EXPECT_EQ(FindExpectStr(stringOut, expectStr), false);
1228     const std::string expectPercentageStr = "|-  7.63% __schedule";
1229     EXPECT_EQ(FindExpectStr(stringOut, expectPercentageStr), true);
1230 }
1231 
1232 /**
1233  * @tc.name: TestFpUnCompress
1234  * @tc.desc:
1235  * @tc.type: FUNC
1236  */
HWTEST_F(SubCommandReportTest, TestFpUnCompress, TestSize.Level1)1237 HWTEST_F(SubCommandReportTest, TestFpUnCompress, TestSize.Level1)
1238 {
1239     StdoutRecord stdoutRecord;
1240     stdoutRecord.Start();
1241     EXPECT_EQ(
1242         Command::DispatchCommand("report -s -i " + RESOURCE_PATH + "fp.uncompress.data"),
1243         true);
1244     std::string stringOut = stdoutRecord.Stop();
1245     if (HasFailure()) {
1246         printf("output:\n%s", stringOut.c_str());
1247     }
1248     const std::string expectStr = "--dedup_stack";
1249     EXPECT_EQ(FindExpectStr(stringOut, expectStr), false);
1250     const std::string expectPercentageStr = "|- 53.27% __kmalloc_reserve";
1251     EXPECT_EQ(FindExpectStr(stringOut, expectPercentageStr), true);
1252 }
1253 
1254 /**
1255  * @tc.name: TestOnSubCommand_from_funcs_fail
1256  * @tc.desc:
1257  * @tc.type: FUNC
1258  */
HWTEST_F(SubCommandReportTest, TestOnSubCommand_from_funcs_fail, TestSize.Level1)1259 HWTEST_F(SubCommandReportTest, TestOnSubCommand_from_funcs_fail, TestSize.Level1)
1260 {
1261     StdoutRecord stdoutRecord;
1262     stdoutRecord.Start();
1263     const auto startTime = chrono::steady_clock::now();
1264     EXPECT_EQ(Command::DispatchCommand("report -i " + RESOURCE_PATH +
1265                                        "report_test.data --from_funcs"),
1266               false);
1267     const auto costMs = std::chrono::duration_cast<std::chrono::milliseconds>(
1268         chrono::steady_clock::now() - startTime);
1269     EXPECT_LE(costMs.count(), DEFAULT_RUN_TIMEOUT_MS);
1270     std::string stringOut = stdoutRecord.Stop();
1271     if (HasFailure()) {
1272         printf("output:\n%s", stringOut.c_str());
1273     }
1274 }
1275 
1276 /**
1277  * @tc.name: TestOnSubCommand_offcpu
1278  * @tc.desc:
1279  * @tc.type: FUNC
1280  */
HWTEST_F(SubCommandReportTest, TestOnSubCommand_offcpu, TestSize.Level1)1281 HWTEST_F(SubCommandReportTest, TestOnSubCommand_offcpu, TestSize.Level1)
1282 {
1283     StdoutRecord stdoutRecord;
1284     stdoutRecord.Start();
1285     const auto startTime = chrono::steady_clock::now();
1286     EXPECT_EQ(Command::DispatchCommand("report -i /data/local/tmp/offcpu_perf.data"), true);
1287     const auto costMs = std::chrono::duration_cast<std::chrono::milliseconds>(
1288         chrono::steady_clock::now() - startTime);
1289     EXPECT_LE(costMs.count(), DEFAULT_RUN_TIMEOUT_MS);
1290     std::string stringOut = stdoutRecord.Stop();
1291     if (HasFailure()) {
1292         printf("output:\n%s", stringOut.c_str());
1293     }
1294 }
1295 } // namespace HiPerf
1296 } // namespace Developtools
1297 } // namespace OHOS
1298