• 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 "subcommand_record_test.h"
17 
18 #include <algorithm>
19 #include <chrono>
20 #include <cinttypes>
21 #include <sched.h>
22 #include <sstream>
23 #include <sys/stat.h>
24 #include <sys/utsname.h>
25 #include <thread>
26 #include <poll.h>
27 #include <unistd.h>
28 
29 #include "command.h"
30 #include "debug_logger.h"
31 #include "utilities.h"
32 #include "utilities_test.h"
33 
34 using namespace std::literals::chrono_literals;
35 using namespace testing::ext;
36 using namespace std;
37 using namespace OHOS::HiviewDFX;
38 namespace OHOS {
39 namespace Developtools {
40 namespace HiPerf {
41 static const std::string TEST_FILE = "/data/local/tmp/perf.data";
42 static const std::chrono::milliseconds CONTROL_WAITREPY_TOMEOUT = 2ms;
43 
44 static constexpr size_t TEST_SIZE_F100_DWARF_SYSTEM = 1.4E4 * 1024;
45 static constexpr size_t TEST_SIZE_F500_DWARF_SYSTEM = 3.6E4 * 1024;
46 static constexpr size_t TEST_SIZE_F1000_DWARF_SYSTEM = 5.9E4 * 1024;
47 static constexpr size_t TEST_SIZE_F2000_DWARF_SYSTEM = 8.3E4 * 1024;
48 static constexpr size_t TEST_SIZE_F4000_DWARF_SYSTEM = 1.7E5 * 1024;
49 static constexpr size_t TEST_SIZE_F8000_DWARF_SYSTEM = 3.5E5 * 1024;
50 static constexpr size_t TEST_SIZE_F100_FP_SYSTEM = 10E3 * 1024;
51 static constexpr size_t TEST_SIZE_F500_FP_SYSTEM = 2E4 * 1024;
52 static constexpr size_t TEST_SIZE_F1000_FP_SYSTEM = 3E4 * 1024;
53 static constexpr size_t TEST_SIZE_F2000_FP_SYSTEM = 5E4 * 1024;
54 static constexpr size_t TEST_SIZE_F4000_FP_SYSTEM = 1E5 * 1024;
55 static constexpr size_t TEST_SIZE_F8000_FP_SYSTEM = 2E5 * 1024;
56 
57 static constexpr size_t TEST_SIZE_F100_DWARF_PROCESS = 5.6E3 * 1024;
58 static constexpr size_t TEST_SIZE_F500_DWARF_PROCESS = 1.6E4 * 1024;
59 static constexpr size_t TEST_SIZE_F1000_DWARF_PROCESS = 2.9E4 * 1024;
60 static constexpr size_t TEST_SIZE_F2000_DWARF_PROCESS = 6.1E4 * 1024;
61 static constexpr size_t TEST_SIZE_F4000_DWARF_PROCESS = 5.8E4 * 1024;
62 static constexpr size_t TEST_SIZE_F8000_DWARF_PROCESS = 1.2E5 * 1024;
63 static constexpr size_t TEST_SIZE_F100_FP_PROCESS = 3.6E3 * 1024;
64 static constexpr size_t TEST_SIZE_F500_FP_PROCESS = 8.8E3 * 1024;
65 static constexpr size_t TEST_SIZE_F1000_FP_PROCESS = 1.5E4 * 1024;
66 static constexpr size_t TEST_SIZE_F2000_FP_PROCESS = 3.1E4 * 1024;
67 static constexpr size_t TEST_SIZE_F4000_FP_PROCESS = 6.2E4 * 1024;
68 static constexpr size_t TEST_SIZE_F8000_FP_PROCESS = 1.3E5 * 1024;
69 
70 class SubCommandRecordTest : public testing::Test {
71 public:
72     static void SetUpTestCase(void);
73     static void TearDownTestCase(void);
74     void SetUp();
75     void TearDown();
76 
77     void TestEvents(std::string &opt, std::string &uk, bool isFork = true);
78 
79     static void ForkAndRunTest(const std::string& cmd, bool expect = true, bool fixPid = true);
80 
81     static void TestRecordCommand(const std::string &option, bool expect = true, bool fixPid = true);
82 
83     size_t GetFileSize(const char* fileName);
84 };
85 
SetUpTestCase()86 void SubCommandRecordTest::SetUpTestCase() {}
87 
TearDownTestCase()88 void SubCommandRecordTest::TearDownTestCase() {}
89 
SetUp()90 void SubCommandRecordTest::SetUp()
91 {
92     SubCommand::ClearSubCommands(); // clear the subCommands left from other UT
93     ASSERT_EQ(SubCommand::GetSubCommands().size(), 0u);
94     SubCommandRecord::RegisterSubCommandRecord();
95     ASSERT_EQ(SubCommand::GetSubCommands().size(), 1u);
96 }
97 
TearDown()98 void SubCommandRecordTest::TearDown()
99 {
100     ASSERT_EQ(SubCommand::GetSubCommands().size(), 1u);
101     SubCommand::ClearSubCommands();
102     ASSERT_EQ(SubCommand::GetSubCommands().size(), 0u);
103     MemoryHold::Get().Clean();
104 }
105 
ForkAndRunTest(const std::string & cmd,bool expect,bool fixPid)106 void SubCommandRecordTest::ForkAndRunTest(const std::string& cmd, bool expect, bool fixPid)
107 {
108     pid_t pid = fork();
109     if (pid < 0) {
110         FAIL() << "Fork test process failed";
111         return;
112     }
113     if (pid == 0) {
114         TestRecordCommand(cmd, expect, fixPid);
115         _exit(0);
116     }
117     int status;
118     int ret = wait(&status);
119     GTEST_LOG_(INFO) << "Status:" << status << " Result:" << ret;
120     ASSERT_EQ(status, 0);
121 }
122 
TestRecordCommand(const std::string & option,bool expect,bool fixPid)123 void SubCommandRecordTest::TestRecordCommand(const std::string &option, bool expect, bool fixPid)
124 {
125     StdoutRecord stdoutRecord;
126 
127     std::string cmdString = "record ";
128     if (fixPid) {
129         cmdString += "--app ";
130         cmdString += " " + TEST_PROCESSES;
131     }
132     cmdString += " " + option;
133     printf("command : %s\n", cmdString.c_str());
134 
135     // it need load some symbols and much more log
136     stdoutRecord.Start();
137     const auto startTime = chrono::steady_clock::now();
138     bool ret = Command::DispatchCommand(cmdString);
139     const auto costMs = std::chrono::duration_cast<std::chrono::milliseconds>(
140         chrono::steady_clock::now() - startTime);
141     std::string stringOut = stdoutRecord.Stop();
142 
143     printf("run %" PRId64 " ms return %s(expect %s)\n", (uint64_t)costMs.count(), ret ? "true" : "false",
144            expect ? "true" : "false");
145     EXPECT_EQ(expect, ret);
146 }
147 
GetFileSize(const char * fileName)148 size_t SubCommandRecordTest::GetFileSize(const char* fileName)
149 {
150     if (fileName == nullptr) {
151         return 0;
152     }
153     struct stat statbuf;
154     stat(fileName, &statbuf);
155     size_t fileSize = statbuf.st_size;
156     return fileSize;
157 }
158 
159 // app package name
160 HWTEST_F(SubCommandRecordTest, PackageName, TestSize.Level1)
161 {
162     ForkAndRunTest("-d 2 ", true, true);
163 }
164 
165 HWTEST_F(SubCommandRecordTest, PackageNameErr, TestSize.Level1)
166 {
167     TestRecordCommand("-d 2  --app package_name ", false, false);
168 }
169 
170 // check app milliseconds
171 /**
172  * @tc.name: CheckAppMsMin
173  * @tc.desc: Test chkms minimum value
174  * @tc.type: FUNC
175  * @tc.require: issueI5R305
176  */
177 HWTEST_F(SubCommandRecordTest, CheckAppMsMin, TestSize.Level1)
178 {
179     ForkAndRunTest("-d 0.5 --chkms 1 ");
180 }
181 
182 /**
183  * @tc.name: CheckAppMsMinErr
184  * @tc.desc: Test chkms less than minimum value
185  * @tc.type: FUNC
186  * @tc.require: issueI5R305
187  */
188 HWTEST_F(SubCommandRecordTest, CheckAppMsMinErr, TestSize.Level1)
189 {
190     TestRecordCommand("-d 0.5 --chkms 0 ", false);
191 }
192 
193 /**
194  * @tc.name: CheckAppMsMax
195  * @tc.desc: Test chkms maximum value
196  * @tc.type: FUNC
197  * @tc.require: issueI5R305
198  */
199 HWTEST_F(SubCommandRecordTest, CheckAppMsMax, TestSize.Level1)
200 {
201     ForkAndRunTest("-d 0.5 --chkms 200 ");
202 }
203 
204 /**
205  * @tc.name: CheckAppMsMaxErr
206  * @tc.desc: Test chkms more than maximum value
207  * @tc.type: FUNC
208  * @tc.require: issueI5R305
209  */
210 HWTEST_F(SubCommandRecordTest, CheckAppMsMaxErr, TestSize.Level1)
211 {
212     TestRecordCommand("-d 0.5 --chkms 201 ", false);
213 }
214 
215 /**
216  * @tc.name: CheckAppMsInputErr
217  * @tc.desc: Test erro type of chkms
218  * @tc.type: FUNC
219  * @tc.require: issueI5R305
220  */
221 HWTEST_F(SubCommandRecordTest, CheckAppMsInputErr, TestSize.Level1)
222 {
223     TestRecordCommand("-d 0.5 --chkms abc ", false);
224 }
225 // stop seconds
226 HWTEST_F(SubCommandRecordTest, StopSecondsMin, TestSize.Level1)
227 {
228     ForkAndRunTest("-d 0.1 ");
229 }
230 
231 HWTEST_F(SubCommandRecordTest, StopSecondsMinErr, TestSize.Level1)
232 {
233     TestRecordCommand("-d 0.099 ", false);
234 }
235 
236 HWTEST_F(SubCommandRecordTest, StopSecondsMax, TestSize.Level1)
237 {
238     std::string opt = "-d 10000.0 ";
239     opt += " ls "; // because UT don't need wait so long
240     ForkAndRunTest(opt, true, false);
241 }
242 
243 HWTEST_F(SubCommandRecordTest, StopSecondsMaxErr, TestSize.Level1)
244 {
245     std::string opt = "-d 10000.1 ";
246     opt += " ";
247     TestRecordCommand(opt, false);
248 }
249 
250 // system wide
251 HWTEST_F(SubCommandRecordTest, SystemWide, TestSize.Level1)
252 {
253     ForkAndRunTest("-d 2 -a ", true, false);
254 }
255 
256 // trackedCommand_
257 HWTEST_F(SubCommandRecordTest, TrackedCommandErr, TestSize.Level1)
258 {
259     TestRecordCommand("-d 2 -a aa ", false, false);
260 }
261 
262 // --app and -p
263 HWTEST_F(SubCommandRecordTest, HasTargetErr, TestSize.Level1)
264 {
265     TestRecordCommand("--app test -p 123 -d 3 ", false, false);
266 }
267 
268 HWTEST_F(SubCommandRecordTest, HasTargetErr1, TestSize.Level1)
269 {
270     TestRecordCommand("-d 3 ", false, false);
271 }
272 
273 // exclude hiperf
274 HWTEST_F(SubCommandRecordTest, ExcludePerf, TestSize.Level1)
275 {
276     ForkAndRunTest("-d 2 -a --exclude-hiperf ", true, false);
277 }
278 
279 HWTEST_F(SubCommandRecordTest, ExcludePerfErr, TestSize.Level1)
280 {
281     TestRecordCommand("-d 2 --exclude-hiperf ", false, true);
282 }
283 
284 // select cpu
285 HWTEST_F(SubCommandRecordTest, SelectCpu, TestSize.Level1)
286 {
287     ForkAndRunTest("-d 2 -c 0 ");
288 }
289 
290 HWTEST_F(SubCommandRecordTest, SelectCpuMulti, TestSize.Level1)
291 {
292     int maxCpuid = sysconf(_SC_NPROCESSORS_CONF);
293     std::string opt = "-d 2 -e sw-task-clock -c ";
294     for (int i = 0; i < maxCpuid; i++) {
295         opt += std::to_string(i);
296         opt += ",";
297     }
298     opt.pop_back();
299     opt += " ";
300     ForkAndRunTest(opt);
301 }
302 
303 HWTEST_F(SubCommandRecordTest, SelectCpuMinErr, TestSize.Level1)
304 {
305     TestRecordCommand("-d 2 -c -1 ", false);
306 }
307 
308 HWTEST_F(SubCommandRecordTest, SelectCpuMaxErr, TestSize.Level1)
309 {
310     int maxCpuid = sysconf(_SC_NPROCESSORS_CONF);
311     std::string opt = "-d 2 -c ";
312     opt += std::to_string(maxCpuid);
313     opt += " ";
314     TestRecordCommand(opt, false);
315 }
316 
317 HWTEST_F(SubCommandRecordTest, SelectCpuInputErr, TestSize.Level1)
318 {
319     TestRecordCommand("-d 2 -c abc ", false);
320 }
321 
322 // --control
323 HWTEST_F(SubCommandRecordTest, CheckControlErr, TestSize.Level1)
324 {
325     TestRecordCommand("-a --control st", false, false);
326 }
327 
328 // cpu percent
329 HWTEST_F(SubCommandRecordTest, CpuLimitMin, TestSize.Level1)
330 {
331     ForkAndRunTest("-d 2 --cpu-limit 1 ");
332 }
333 
334 HWTEST_F(SubCommandRecordTest, CpuLimitErr, TestSize.Level1)
335 {
336     TestRecordCommand("-d 2 --cpu-limit 0 ", false);
337 }
338 
339 HWTEST_F(SubCommandRecordTest, CpuLimitMax, TestSize.Level1)
340 {
341     ForkAndRunTest("-d 2 --cpu-limit 100 ");
342 }
343 
344 HWTEST_F(SubCommandRecordTest, CpuLimitMaxErr, TestSize.Level1)
345 {
346     TestRecordCommand("-d 2 --cpu-limit 101 ", false);
347 }
348 
349 HWTEST_F(SubCommandRecordTest, CpuLimitInputErr, TestSize.Level1)
350 {
351     TestRecordCommand("-d 2 --cpu-limit abc ", false);
352 }
353 
354 // frequency
355 HWTEST_F(SubCommandRecordTest, FrequncyMin, TestSize.Level1)
356 {
357     ForkAndRunTest("-d 2 -f 1 ");
358 }
359 
360 HWTEST_F(SubCommandRecordTest, FrequncyMinErr, TestSize.Level1)
361 {
362     TestRecordCommand("-d 2 -f 0 ", false);
363 }
364 
365 HWTEST_F(SubCommandRecordTest, FrequncyMax, TestSize.Level1)
366 {
367     ForkAndRunTest("-d 2 -f 100000 ");
368 }
369 
370 HWTEST_F(SubCommandRecordTest, FrequncyMaxErr, TestSize.Level1)
371 {
372     TestRecordCommand("-d 2 -f 100001 ", false);
373 }
374 
375 HWTEST_F(SubCommandRecordTest, FrequncyInputErr, TestSize.Level1)
376 {
377     TestRecordCommand("-d 2 -f abc ", false);
378 }
379 
380 // period
381 HWTEST_F(SubCommandRecordTest, PeriodMin, TestSize.Level1)
382 {
383     ForkAndRunTest("-d 2 --period 1 ");
384 }
385 
386 HWTEST_F(SubCommandRecordTest, PeriodMinErr, TestSize.Level1)
387 {
388     TestRecordCommand("-d 2 --period 0 ", false);
389 }
390 
391 HWTEST_F(SubCommandRecordTest, PeriodMax, TestSize.Level1)
392 {
393     std::string opt = "-d 2 --period ";
394     opt += std::to_string(INT_MAX);
395     opt += " ";
396     ForkAndRunTest(opt);
397 }
398 
399 HWTEST_F(SubCommandRecordTest, PeriodMaxErr, TestSize.Level1)
400 {
401     std::string opt = "-d 2 --period ";
402     uint32_t value = static_cast<uint32_t>(INT_MAX) + 1;
403     opt += std::to_string(value);
404     opt += " ";
405     TestRecordCommand(opt, false);
406 }
407 
408 HWTEST_F(SubCommandRecordTest, PeriodInputErr, TestSize.Level1)
409 {
410     TestRecordCommand("-d 2 --period abc ", false);
411 }
412 
413 HWTEST_F(SubCommandRecordTest, PeriodAndFrequncyConflict, TestSize.Level1)
414 {
415     TestRecordCommand("-d 2 -f 2000 --period 10 ", false);
416 }
417 
TestEvents(std::string & opt,std::string & uk,bool isFork)418 void SubCommandRecordTest::TestEvents(std::string &opt, std::string &uk, bool isFork)
419 {
420     PerfEvents perfEvents;
421     utsname unameBuf;
422     bool isHM = false;
423     if ((uname(&unameBuf)) == 0) {
424         std::string osrelease = unameBuf.release;
425         isHM = osrelease.find(HMKERNEL) != std::string::npos;
426     }
427     perfEvents.SetHM(isHM);
428     for (auto type : TYPE_CONFIGS) {
429         auto configs = perfEvents.GetSupportEvents(type.first);
430         if (configs.empty()) {
431             continue;
432         }
433 
434         const int MAX_TESTEVENT = 5;
435         int testEventCount = MAX_TESTEVENT;
436         std::string cmdline = opt;
437         for (auto config : configs) {
438             if (testEventCount <= 0) {
439                 break;
440             }
441             cmdline += config.second;
442             cmdline += uk;
443             cmdline += ",";
444             testEventCount--;
445         }
446         cmdline.pop_back(); // remove the last ','
447         if (isFork) {
448             ForkAndRunTest(cmdline);
449         } else {
450             TestRecordCommand(cmdline);
451         }
452         TearDown();
453         SetUp();
454     }
455 }
456 
457 // select events
458 HWTEST_F(SubCommandRecordTest, SelectEvents, TestSize.Level1)
459 {
460     std::string opt = "-d 2 -c 0 -e ";
461     std::string uk = "";
462     TestEvents(opt, uk);
463 }
464 
465 HWTEST_F(SubCommandRecordTest, SelectEventsUser, TestSize.Level1)
466 {
467     std::string opt = "-d 2 -c 0 -e ";
468     std::string uk = ":u";
469     TestEvents(opt, uk);
470 }
471 
472 HWTEST_F(SubCommandRecordTest, SelectEventsKernel, TestSize.Level1)
473 {
474     std::string opt = "-d 2 -c 0 -e ";
475     std::string uk = ":k";
476     TestEvents(opt, uk);
477 }
478 
479 HWTEST_F(SubCommandRecordTest, SelectEventsKernel_2, TestSize.Level1)
480 {
481     std::string opt = "-d 2 -c 0 -e ";
482     std::string uk = ":k";
483     TestEvents(opt, uk, false);
484 }
485 
486 HWTEST_F(SubCommandRecordTest, SelectEventsErr, TestSize.Level1)
487 {
488     ForkAndRunTest("-d 2 -c 0 -e what ", false);
489 }
490 
491 // select group events
492 HWTEST_F(SubCommandRecordTest, GroupEvents, TestSize.Level1)
493 {
494     std::string opt = "-d 2 -c 0 -g ";
495     std::string uk = "";
496     TestEvents(opt, uk);
497 }
498 
499 HWTEST_F(SubCommandRecordTest, GroupEventsUser, TestSize.Level1)
500 {
501     std::string opt = "-d 2 -c 0 -g ";
502     std::string uk = ":u";
503     TestEvents(opt, uk);
504 }
505 
506 HWTEST_F(SubCommandRecordTest, GroupEventsKernal, TestSize.Level1)
507 {
508     std::string opt = "-d 2 -c 0 -g ";
509     std::string uk = ":k";
510     TestEvents(opt, uk);
511 }
512 
513 HWTEST_F(SubCommandRecordTest, GroupEventsErr, TestSize.Level1)
514 {
515     ForkAndRunTest("-d 2 -c 0 -g what ", false);
516 }
517 
518 HWTEST_F(SubCommandRecordTest, NoInherit, TestSize.Level1)
519 {
520     ForkAndRunTest("-d 2 --no-inherit ");
521 }
522 
523 // select pid
524 HWTEST_F(SubCommandRecordTest, SelectPid, TestSize.Level1)
525 {
526     ForkAndRunTest("-d 2 -p 1 ", true, false);
527 }
528 
529 HWTEST_F(SubCommandRecordTest, KernelSymbols, TestSize.Level1)
530 {
531     TestRecordCommand("-d 2 -p 2 -s dwarf ", true, false);
532 }
533 
534 HWTEST_F(SubCommandRecordTest, SelectPidMulti, TestSize.Level1)
535 {
536     ForkAndRunTest("-d 2 -p 1,2,3 ", true, false);
537 }
538 
539 HWTEST_F(SubCommandRecordTest, SelectPidMinErr, TestSize.Level1)
540 {
541     TestRecordCommand("-d 2 -p 0 ", false, false);
542 }
543 
544 HWTEST_F(SubCommandRecordTest, SelectPidMinErr1, TestSize.Level1)
545 {
546     TestRecordCommand("-d 2 -p -1 ", false, false);
547 }
548 
549 HWTEST_F(SubCommandRecordTest, SelectPidErr, TestSize.Level1)
550 {
551     TestRecordCommand("-d 2 -p 99999999 ", false, false);
552 }
553 
554 HWTEST_F(SubCommandRecordTest, SelectPidInputErr, TestSize.Level1)
555 {
556     TestRecordCommand("-d 2 -p abc ", false, false);
557 }
558 
559 HWTEST_F(SubCommandRecordTest, SelectPidInputConfict, TestSize.Level1)
560 {
561     ForkAndRunTest("-d 2 -a -p 1 ", false, false);
562 }
563 
564 // select tid
565 HWTEST_F(SubCommandRecordTest, SelectTid, TestSize.Level1)
566 {
567     ForkAndRunTest("-d 2 -t 1 ", true, false);
568 }
569 
570 HWTEST_F(SubCommandRecordTest, SelectTidMulti, TestSize.Level1)
571 {
572     ForkAndRunTest("-d 2 -t 1,2,3 ", true, false);
573 }
574 
575 HWTEST_F(SubCommandRecordTest, SelectTidMinErr, TestSize.Level1)
576 {
577     TestRecordCommand("-d 2 -t 0 ", false, false);
578 }
579 
580 HWTEST_F(SubCommandRecordTest, SelectTidErr, TestSize.Level1)
581 {
582     TestRecordCommand("-d 2 -t 99999999 ", false, false);
583 }
584 
585 HWTEST_F(SubCommandRecordTest, SelectTidInputErr, TestSize.Level1)
586 {
587     TestRecordCommand("-d 2 -t abc ", false, false);
588 }
589 
590 // cpu off
591 HWTEST_F(SubCommandRecordTest, CpuOff, TestSize.Level1)
592 {
593     ForkAndRunTest("-d 2 --offcpu -o /data/local/tmp/offcpu_perf.data");
594 }
595 
596 HWTEST_F(SubCommandRecordTest, BranchFilterAny, TestSize.Level1)
597 {
598 #if is_ohos
599     TestRecordCommand("-d 2 -j any ", false); // broad doesn't support
600 #else
601     ForkAndRunTest("-d 2 -j any ");
602 #endif
603 }
604 
605 HWTEST_F(SubCommandRecordTest, BranchFilterAnyCall, TestSize.Level1)
606 {
607 #if is_ohos
608     TestRecordCommand("-d 2 -j any_call ", false); // broad doesn't support
609 #else
610     ForkAndRunTest("-d 2 -j any_call ");
611 #endif
612 }
613 
614 HWTEST_F(SubCommandRecordTest, BranchFilterIndCall, TestSize.Level1)
615 {
616 #if is_ohos
617     TestRecordCommand("-d 2 -j ind_call ", false); // broad doesn't support
618 #else
619     ForkAndRunTest("-d 2 -j ind_call ");
620 #endif
621 }
622 
623 HWTEST_F(SubCommandRecordTest, BranchFilterAnyRet, TestSize.Level1)
624 {
625 #if is_ohos
626     TestRecordCommand("-d 2 -j any_ret ", false); // broad doesn't support
627 #else
628     ForkAndRunTest("-d 2 -j any_ret ");
629 #endif
630 }
631 
632 HWTEST_F(SubCommandRecordTest, BranchFilterOnlyCall, TestSize.Level1)
633 {
634     TestRecordCommand("-d 2 -j call ", false);
635 }
636 
637 HWTEST_F(SubCommandRecordTest, BranchFilterAll, TestSize.Level1)
638 {
639 #if is_ohos
640     TestRecordCommand("-d 2 -j any,any_call,any_ret,ind_call,u,k ", false); // broad doesn't support
641 #else
642     ForkAndRunTest("-d 2 -j any,any_call,any_ret,ind_call,u,k ");
643 #endif
644 }
645 
646 HWTEST_F(SubCommandRecordTest, BranchFilterInputErr, TestSize.Level1)
647 {
648     TestRecordCommand("-d 2 -j what ", false);
649 }
650 
651 HWTEST_F(SubCommandRecordTest, BranchFilterInputMoreErr, TestSize.Level1)
652 {
653     TestRecordCommand("-d 2 -j any,n ", false);
654 }
655 
656 // call stack
657 HWTEST_F(SubCommandRecordTest, CallStackFp, TestSize.Level1)
658 {
659     ForkAndRunTest("-d 2 --call-stack fp ");
660     TearDown();
661     SetUp();
662     ForkAndRunTest("-d 2 -s fp ");
663 }
664 
665 HWTEST_F(SubCommandRecordTest, CallStackFpInputMoreErr, TestSize.Level1)
666 {
667     TestRecordCommand("-d 2 --call-stack fp,abc ", false);
668     TearDown();
669     SetUp();
670     TestRecordCommand("-d 2 -s fp,abc ", false);
671 }
672 
673 HWTEST_F(SubCommandRecordTest, CallStackInputErr, TestSize.Level1)
674 {
675     TestRecordCommand("-d 2 --call-stack what ", false);
676     TearDown();
677     SetUp();
678     TestRecordCommand("-d 2 -s what ", false);
679 }
680 
681 HWTEST_F(SubCommandRecordTest, CallStackDwarfSizeMin, TestSize.Level1)
682 {
683     // it will cause some crash in -fprofile-arcs and -ftest-coverage
684     // we will fix it latter
685     ForkAndRunTest("-d 2 --call-stack dwarf,8 ");
686     TearDown();
687     SetUp();
688     ForkAndRunTest("-d 2 -s dwarf,8 ");
689 }
690 
691 HWTEST_F(SubCommandRecordTest, CallStackDwarfSizeMinErr, TestSize.Level1)
692 {
693     TestRecordCommand("-d 2 --call-stack dwarf,7 ", false);
694     TearDown();
695     SetUp();
696     TestRecordCommand("-d 2 -s dwarf,7 ", false);
697 }
698 
699 HWTEST_F(SubCommandRecordTest, CallStackDwarfSizeMax, TestSize.Level1)
700 {
701     ForkAndRunTest("-d 2 --call-stack dwarf,65528 ");
702     TearDown();
703     SetUp();
704     ForkAndRunTest("-d 2 -s dwarf,65528 ");
705 }
706 
707 HWTEST_F(SubCommandRecordTest, CallStackDwarfSizeMaxErr, TestSize.Level1)
708 {
709     TestRecordCommand("-d 2 --call-stack dwarf,65529 ", false);
710     TearDown();
711     SetUp();
712     TestRecordCommand("-d 2 -s dwarf,65529 ", false);
713 }
714 
715 HWTEST_F(SubCommandRecordTest, CallStackDwarfSizeErr, TestSize.Level1)
716 {
717     TestRecordCommand("-d 2 --call-stack dwarf,15 ", false);
718     TearDown();
719     SetUp();
720     TestRecordCommand("-d 2 -s dwarf,15 ", false);
721 }
722 
723 HWTEST_F(SubCommandRecordTest, CallStackDwarfSizeInputErr, TestSize.Level1)
724 {
725     TestRecordCommand("-d 2 --call-stack dwarf,abc ", false);
726     TearDown();
727     SetUp();
728     TestRecordCommand("-d 2 -s dwarf,abc ", false);
729 }
730 
731 HWTEST_F(SubCommandRecordTest, CallStackDwarfSizeInputMoreErr, TestSize.Level1)
732 {
733     TestRecordCommand("-d 2 --call-stack dwarf,16,32 ", false);
734     TearDown();
735     SetUp();
736     TestRecordCommand("-d 2 -s dwarf,16,32 ", false);
737 }
738 
739 HWTEST_F(SubCommandRecordTest, CallStackUsageErr, TestSize.Level1)
740 {
741     TestRecordCommand("-d 2 -s abc --call-stack bcd", false);
742 }
743 
744 // unwind
745 HWTEST_F(SubCommandRecordTest, DlayUnwind, TestSize.Level1)
746 {
747     ForkAndRunTest("-d 2 -s dwarf,16 --delay-unwind ");
748 }
749 
750 HWTEST_F(SubCommandRecordTest, DisableUnwind, TestSize.Level1)
751 {
752     ForkAndRunTest("-d 2 -s dwarf,16 --disable-unwind ");
753 }
754 
755 HWTEST_F(SubCommandRecordTest, DisableCallstackMerge, TestSize.Level1)
756 {
757     ForkAndRunTest("-d 2 -s dwarf,16 --disable-callstack-expand ");
758 }
759 
760 // symbol dir
761 HWTEST_F(SubCommandRecordTest, SymbolDir, TestSize.Level1)
762 {
763     ForkAndRunTest("-d 2 --symbol-dir ./ ");
764 }
765 
766 HWTEST_F(SubCommandRecordTest, SymbolDirErr, TestSize.Level1)
767 {
768     TestRecordCommand("-d 2 --symbol-dir where ", false);
769 }
770 
771 // clock id
772 HWTEST_F(SubCommandRecordTest, ClockIdMonotonic, TestSize.Level1)
773 {
774     ForkAndRunTest("-d 2 --clockid monotonic ");
775 }
776 
777 HWTEST_F(SubCommandRecordTest, ClockIdMonotonicRaw, TestSize.Level1)
778 {
779     ForkAndRunTest("-d 2 --clockid monotonic_raw ");
780 }
781 
782 HWTEST_F(SubCommandRecordTest, ClockIdBoottime, TestSize.Level1)
783 {
784     ForkAndRunTest("-c 0 -d 2 -e sw-task-clock --clockid boottime ");
785 }
786 
787 HWTEST_F(SubCommandRecordTest, ClockIdRealtime, TestSize.Level1)
788 {
789     ForkAndRunTest("-c 0 -d 2 -e sw-task-clock --clockid realtime ");
790 }
791 
792 HWTEST_F(SubCommandRecordTest, ClockIdClockTai, TestSize.Level1)
793 {
794     ForkAndRunTest("-c 0 -d 2 -e sw-task-clock --clockid clock_tai ");
795 }
796 
797 HWTEST_F(SubCommandRecordTest, ClockIdInputErr, TestSize.Level1)
798 {
799     TestRecordCommand("-c 0 -d 2 --clockid what ", false);
800 }
801 
802 // mmap pages
803 HWTEST_F(SubCommandRecordTest, MmapPagesPower2Err, TestSize.Level1)
804 {
805     TestRecordCommand("-d 2 -m 101 ", false);
806 }
807 
808 HWTEST_F(SubCommandRecordTest, MmapPagesMin, TestSize.Level1)
809 {
810     ForkAndRunTest("-d 2 -m 2 ");
811 }
812 
813 HWTEST_F(SubCommandRecordTest, MmapPagesMinErr, TestSize.Level1)
814 {
815     TestRecordCommand("-d 2 -m 1 ", false);
816 }
817 
818 HWTEST_F(SubCommandRecordTest, MmapPagesMax, TestSize.Level1)
819 {
820     ForkAndRunTest("-d 2 -m 1024 ");
821 }
822 
823 HWTEST_F(SubCommandRecordTest, MmapPagesMaxErr, TestSize.Level1)
824 {
825     TestRecordCommand("-d 2 -m 1025 ", false);
826 }
827 
828 HWTEST_F(SubCommandRecordTest, MmapPagesInputErr, TestSize.Level1)
829 {
830     TestRecordCommand("-d 2 -m abc ", false);
831 }
832 
833 // output file name
834 HWTEST_F(SubCommandRecordTest, OutputFileName, TestSize.Level1)
835 {
836     ForkAndRunTest("-d 2 -o /data/local/tmp/output.perf.data ");
837 }
838 
839 HWTEST_F(SubCommandRecordTest, OutputFileNameErr, TestSize.Level1)
840 {
841     TestRecordCommand("-d 2 -o nopath/output.perf.data ", false);
842 }
843 
844 // data size limit
845 HWTEST_F(SubCommandRecordTest, DataLimit, TestSize.Level1)
846 {
847     ForkAndRunTest("-d 2 --data-limit 1K ");
848     TearDown();
849     SetUp();
850     ForkAndRunTest("-d 2 --data-limit 1M ");
851     TearDown();
852     SetUp();
853     ForkAndRunTest("-d 2 --data-limit 1G ");
854 }
855 
856 HWTEST_F(SubCommandRecordTest, DataLimit1, TestSize.Level1)
857 {
858     ForkAndRunTest("-a --data-limit 1K ", true, false);
859 }
860 
861 HWTEST_F(SubCommandRecordTest, DataLimitErr, TestSize.Level1)
862 {
863     TestRecordCommand("-d 2 --data-limit 10A ", false);
864     TearDown();
865     SetUp();
866     TestRecordCommand("-d 2 --data-limit 0G ", false);
867 }
868 
869 HWTEST_F(SubCommandRecordTest, RecordCompress, TestSize.Level1)
870 {
871     ForkAndRunTest("-d 2 -z -o /data/local/tmp/perf.data.tar.gz");
872 }
873 
874 HWTEST_F(SubCommandRecordTest, Verbose, TestSize.Level1)
875 {
876     ForkAndRunTest("-d 2 --verbose ");
877 }
878 
879 HWTEST_F(SubCommandRecordTest, DumpOptions, TestSize.Level1)
880 {
881     StdoutRecord stdoutRecord;
882     stdoutRecord.Start();
883     SubCommandRecord cmd;
884     cmd.DumpOptions();
885     std::string stringOut = stdoutRecord.Stop();
886     EXPECT_TRUE(stringOut.find("cpuPercent:	25") != std::string::npos);
887     EXPECT_TRUE(stringOut.find("mmapPages_:	1024") != std::string::npos);
888 }
889 
890 /**
891  * @tc.name: FileSizeOnFrequency100_DWARF_SYSTEM
892  * @tc.desc: Test size of file generated under system wide frequency 100 and dwarf unwind
893  * @tc.type: FUNC
894  */
895 HWTEST_F(SubCommandRecordTest, FileSizeOnFrequency100_DWARF_SYSTEM, TestSize.Level1)
896 {
897     ForkAndRunTest("-d 10 -a -f 100 -s dwarf", true, false);
898     std::string fileName = TEST_FILE;
899     size_t fileSize = GetFileSize(fileName.c_str());
900     EXPECT_LE(fileSize, TEST_SIZE_F100_DWARF_SYSTEM);
901 }
902 
903 /**
904  * @tc.name: FileSizeOnFrequency500_DWARF_SYSTEM
905  * @tc.desc: Test size of file generated under system wide frequency 500 and dwarf unwind
906  * @tc.type: FUNC
907  */
908 HWTEST_F(SubCommandRecordTest, FileSizeOnFrequency500_DWARF_SYSTEM, TestSize.Level1)
909 {
910     ForkAndRunTest("-d 10 -a -f 500 -s dwarf", true, false);
911     std::string fileName = TEST_FILE;
912     size_t fileSize = GetFileSize(fileName.c_str());
913     EXPECT_LE(fileSize, TEST_SIZE_F500_DWARF_SYSTEM);
914 }
915 
916 /**
917  * @tc.name: FileSizeOnFrequency1000_DWARF_SYSTEM
918  * @tc.desc: Test size of file generated under system wide frequency 1000 and dwarf unwind
919  * @tc.type: FUNC
920  */
921 HWTEST_F(SubCommandRecordTest, FileSizeOnFrequency1000_DWARF_SYSTEM, TestSize.Level1)
922 {
923     ForkAndRunTest("-d 10 -a -f 1000 -s dwarf", true, false);
924     std::string fileName = TEST_FILE;
925     size_t fileSize = GetFileSize(fileName.c_str());
926     EXPECT_LE(fileSize, TEST_SIZE_F1000_DWARF_SYSTEM);
927 }
928 
929 /**
930  * @tc.name: FileSizeOnFrequency2000_DWARF_SYSTEM
931  * @tc.desc: Test size of file generated under system wide frequency 2000 and dwarf unwind
932  * @tc.type: FUNC
933  */
934 HWTEST_F(SubCommandRecordTest, FileSizeOnFrequency2000_DWARF_SYSTEM, TestSize.Level1)
935 {
936     ForkAndRunTest("-d 10 -a -f 2000 -s dwarf", true, false);
937     std::string fileName = TEST_FILE;
938     size_t fileSize = GetFileSize(fileName.c_str());
939     EXPECT_LE(fileSize, TEST_SIZE_F2000_DWARF_SYSTEM);
940 }
941 
942 /**
943  * @tc.name: FileSizeOnFrequency4000_DWARF_SYSTEM
944  * @tc.desc: Test size of file generated under system wide frequency 4000 and dwarf unwind
945  * @tc.type: FUNC
946  */
947 HWTEST_F(SubCommandRecordTest, FileSizeOnFrequency4000_DWARF_SYSTEM, TestSize.Level1)
948 {
949     ForkAndRunTest("-d 10 -a -f 4000 -s dwarf", true, false);
950     std::string fileName = TEST_FILE;
951     size_t fileSize = GetFileSize(fileName.c_str());
952     EXPECT_LE(fileSize, TEST_SIZE_F4000_DWARF_SYSTEM);
953 }
954 
955 /**
956  * @tc.name: FileSizeOnFrequency8000_DWARF_SYSTEM
957  * @tc.desc: Test size of file generated under system wide frequency 8000 and dwarf unwind
958  * @tc.type: FUNC
959  */
960 HWTEST_F(SubCommandRecordTest, FileSizeOnFrequency8000_DWARF_SYSTEM, TestSize.Level1)
961 {
962     ForkAndRunTest("-d 10 -a -f 8000 -s dwarf", true, false);
963     std::string fileName = TEST_FILE;
964     size_t fileSize = GetFileSize(fileName.c_str());
965     EXPECT_LE(fileSize, TEST_SIZE_F8000_DWARF_SYSTEM);
966 }
967 
968 /**
969  * @tc.name: FileSizeOnFrequency100_FP_SYSTEM
970  * @tc.desc: Test size of file generated under system wide frequency 100 and fp unwind
971  * @tc.type: FUNC
972  */
973 HWTEST_F(SubCommandRecordTest, FileSizeOnFrequency100_FP_SYSTEM, TestSize.Level1)
974 {
975     ForkAndRunTest("-d 10 -a -f 100 -s fp", true, false);
976     std::string fileName = TEST_FILE;
977     size_t fileSize = GetFileSize(fileName.c_str());
978     EXPECT_LE(fileSize, TEST_SIZE_F100_FP_SYSTEM);
979 }
980 
981 /**
982  * @tc.name: FileSizeOnFrequency500_FP_SYSTEM
983  * @tc.desc: Test size of file generated under system wide frequency 500 and fp unwind
984  * @tc.type: FUNC
985  */
986 HWTEST_F(SubCommandRecordTest, FileSizeOnFrequency500_FP_SYSTEM, TestSize.Level1)
987 {
988     ForkAndRunTest("-d 10 -a -f 500 -s fp", true, false);
989     std::string fileName = TEST_FILE;
990     size_t fileSize = GetFileSize(fileName.c_str());
991     EXPECT_LE(fileSize, TEST_SIZE_F500_FP_SYSTEM);
992 }
993 
994 /**
995  * @tc.name: FileSizeOnFrequency1000_FP_SYSTEM
996  * @tc.desc: Test size of file generated under system wide frequency 1000 and fp unwind
997  * @tc.type: FUNC
998  */
999 HWTEST_F(SubCommandRecordTest, FileSizeOnFrequency1000_FP_SYSTEM, TestSize.Level1)
1000 {
1001     ForkAndRunTest("-d 10 -a -f 1000 -s fp", true, false);
1002     std::string fileName = TEST_FILE;
1003     size_t fileSize = GetFileSize(fileName.c_str());
1004     EXPECT_LE(fileSize, TEST_SIZE_F1000_FP_SYSTEM);
1005 }
1006 
1007 /**
1008  * @tc.name: FileSizeOnFrequency2000_FP_SYSTEM
1009  * @tc.desc: Test size of file generated under system wide frequency 2000 and fp unwind
1010  * @tc.type: FUNC
1011  */
1012 HWTEST_F(SubCommandRecordTest, FileSizeOnFrequency2000_FP_SYSTEM, TestSize.Level1)
1013 {
1014     ForkAndRunTest("-d 10 -a -f 2000 -s fp", true, false);
1015     std::string fileName = TEST_FILE;
1016     size_t fileSize = GetFileSize(fileName.c_str());
1017     EXPECT_LE(fileSize, TEST_SIZE_F2000_FP_SYSTEM);
1018 }
1019 
1020 /**
1021  * @tc.name: FileSizeOnFrequency4000_FP_SYSTEM
1022  * @tc.desc: Test size of file generated under system wide frequency 4000 and fp unwind
1023  * @tc.type: FUNC
1024  */
1025 HWTEST_F(SubCommandRecordTest, FileSizeOnFrequency4000_FP_SYSTEM, TestSize.Level1)
1026 {
1027     ForkAndRunTest("-d 10 -a -f 4000 -s fp", true, false);
1028     std::string fileName = TEST_FILE;
1029     size_t fileSize = GetFileSize(fileName.c_str());
1030     EXPECT_LE(fileSize, TEST_SIZE_F4000_FP_SYSTEM);
1031 }
1032 
1033 /**
1034  * @tc.name: FileSizeOnFrequency8000_FP_SYSTEM
1035  * @tc.desc: Test size of file generated under system wide frequency 8000 and fp unwind
1036  * @tc.type: FUNC
1037  */
1038 HWTEST_F(SubCommandRecordTest, FileSizeOnFrequency8000_FP_SYSTEM, TestSize.Level1)
1039 {
1040     ForkAndRunTest("-d 10 -a -f 8000 -s fp", true, false);
1041     std::string fileName = TEST_FILE;
1042     size_t fileSize = GetFileSize(fileName.c_str());
1043     EXPECT_LE(fileSize, TEST_SIZE_F8000_FP_SYSTEM);
1044 }
1045 
1046 /**
1047  * @tc.name: FileSizeOnFrequency100_DWARF_PROCESS
1048  * @tc.desc: Test size of file generated under one process frequency 100 and dwarf unwind
1049  * @tc.type: FUNC
1050  */
1051 HWTEST_F(SubCommandRecordTest, FileSizeOnFrequency100_DWARF_PROCESS, TestSize.Level1)
1052 {
1053     ForkAndRunTest("-d 10 -f 100 -s dwarf", true, true);
1054     std::string fileName = TEST_FILE;
1055     size_t fileSize = GetFileSize(fileName.c_str());
1056     EXPECT_LE(fileSize, TEST_SIZE_F100_DWARF_PROCESS);
1057 }
1058 
1059 /**
1060  * @tc.name: FileSizeOnFrequency500_DWARF_PROCESS
1061  * @tc.desc: Test size of file generated under one process frequency 500 and dwarf unwind
1062  * @tc.type: FUNC
1063  */
1064 HWTEST_F(SubCommandRecordTest, FileSizeOnFrequency500_DWARF_PROCESS, TestSize.Level1)
1065 {
1066     ForkAndRunTest("-d 10 -f 500 -s dwarf", true, true);
1067     std::string fileName = TEST_FILE;
1068     size_t fileSize = GetFileSize(fileName.c_str());
1069     EXPECT_LE(fileSize, TEST_SIZE_F500_DWARF_PROCESS);
1070 }
1071 
1072 /**
1073  * @tc.name: FileSizeOnFrequency1000_DWARF_PROCESS
1074  * @tc.desc: Test size of file generated under one process frequency 1000 and dwarf unwind
1075  * @tc.type: FUNC
1076  */
1077 HWTEST_F(SubCommandRecordTest, FileSizeOnFrequency1000_DWARF_PROCESS, TestSize.Level1)
1078 {
1079     ForkAndRunTest("-d 10 -f 1000 -s dwarf", true, true);
1080     std::string fileName = TEST_FILE;
1081     size_t fileSize = GetFileSize(fileName.c_str());
1082     EXPECT_LE(fileSize, TEST_SIZE_F1000_DWARF_PROCESS);
1083 }
1084 
1085 /**
1086  * @tc.name: FileSizeOnFrequency2000_DWARF_PROCESS
1087  * @tc.desc: Test size of file generated under one process frequency 2000 and dwarf unwind
1088  * @tc.type: FUNC
1089  */
1090 HWTEST_F(SubCommandRecordTest, FileSizeOnFrequency2000_DWARF_PROCESS, TestSize.Level1)
1091 {
1092     ForkAndRunTest("-d 10 -f 2000 -s dwarf", true, true);
1093     std::string fileName = TEST_FILE;
1094     size_t fileSize = GetFileSize(fileName.c_str());
1095     EXPECT_LE(fileSize, TEST_SIZE_F2000_DWARF_PROCESS);
1096 }
1097 
1098 /**
1099  * @tc.name: FileSizeOnFrequency4000_DWARF_PROCESS
1100  * @tc.desc: Test size of file generated under one process frequency 4000 and dwarf unwind
1101  * @tc.type: FUNC
1102  */
1103 HWTEST_F(SubCommandRecordTest, FileSizeOnFrequency4000_DWARF_PROCESS, TestSize.Level1)
1104 {
1105     ForkAndRunTest("-d 10 -f 4000 -s dwarf", true, true);
1106     std::string fileName = TEST_FILE;
1107     size_t fileSize = GetFileSize(fileName.c_str());
1108     EXPECT_LE(fileSize, TEST_SIZE_F4000_DWARF_PROCESS);
1109 }
1110 
1111 /**
1112  * @tc.name: FileSizeOnFrequency8000_DWARF_PROCESS
1113  * @tc.desc: Test size of file generated under one process frequency 8000 and dwarf unwind
1114  * @tc.type: FUNC
1115  */
1116 HWTEST_F(SubCommandRecordTest, FileSizeOnFrequency8000_DWARF_PROCESS, TestSize.Level1)
1117 {
1118     ForkAndRunTest("-d 10 -f 8000 -s dwarf", true, true);
1119     std::string fileName = TEST_FILE;
1120     size_t fileSize = GetFileSize(fileName.c_str());
1121     EXPECT_LE(fileSize, TEST_SIZE_F8000_DWARF_PROCESS);
1122 }
1123 
1124 /**
1125  * @tc.name: FileSizeOnFrequency100_FP_PROCESS
1126  * @tc.desc: Test size of file generated under one process frequency 100 and fp unwind
1127  * @tc.type: FUNC
1128  */
1129 HWTEST_F(SubCommandRecordTest, FileSizeOnFrequency100_FP_PROCESS, TestSize.Level1)
1130 {
1131     ForkAndRunTest("-d 10 -f 100 -s fp", true, true);
1132     std::string fileName = TEST_FILE;
1133     size_t fileSize = GetFileSize(fileName.c_str());
1134     EXPECT_LE(fileSize, TEST_SIZE_F100_FP_PROCESS);
1135 }
1136 
1137 /**
1138  * @tc.name: FileSizeOnFrequency500_FP_PROCESS
1139  * @tc.desc: Test size of file generated under one process frequency 500 and fp unwind
1140  * @tc.type: FUNC
1141  */
1142 HWTEST_F(SubCommandRecordTest, FileSizeOnFrequency500_FP_PROCESS, TestSize.Level1)
1143 {
1144     ForkAndRunTest("-d 10 -f 500 -s fp", true, true);
1145     std::string fileName = TEST_FILE;
1146     size_t fileSize = GetFileSize(fileName.c_str());
1147     EXPECT_LE(fileSize, TEST_SIZE_F500_FP_PROCESS);
1148 }
1149 
1150 /**
1151  * @tc.name: FileSizeOnFrequency1000_FP_PROCESS
1152  * @tc.desc: Test size of file generated under one process frequency 1000 and fp unwind
1153  * @tc.type: FUNC
1154  */
1155 HWTEST_F(SubCommandRecordTest, FileSizeOnFrequency1000_FP_PROCESS, TestSize.Level1)
1156 {
1157     ForkAndRunTest("-d 10 -f 1000 -s fp", true, true);
1158     std::string fileName = TEST_FILE;
1159     size_t fileSize = GetFileSize(fileName.c_str());
1160     EXPECT_LE(fileSize, TEST_SIZE_F1000_FP_PROCESS);
1161 }
1162 
1163 /**
1164  * @tc.name: FileSizeOnFrequency2000_FP_PROCESS
1165  * @tc.desc: Test size of file generated under one process frequency 2000 and fp unwind
1166  * @tc.type: FUNC
1167  */
1168 HWTEST_F(SubCommandRecordTest, FileSizeOnFrequency2000_FP_PROCESS, TestSize.Level1)
1169 {
1170     ForkAndRunTest("-d 10 -f 2000 -s fp", true, true);
1171     std::string fileName = TEST_FILE;
1172     size_t fileSize = GetFileSize(fileName.c_str());
1173     EXPECT_LE(fileSize, TEST_SIZE_F2000_FP_PROCESS);
1174 }
1175 
1176 /**
1177  * @tc.name: FileSizeOnFrequency4000_FP_PROCESS
1178  * @tc.desc: Test size of file generated under one process frequency 4000 and fp unwind
1179  * @tc.type: FUNC
1180  */
1181 HWTEST_F(SubCommandRecordTest, FileSizeOnFrequency4000_FP_PROCESS, TestSize.Level1)
1182 {
1183     ForkAndRunTest("-d 10 -f 4000 -s fp", true, true);
1184     std::string fileName = TEST_FILE;
1185     size_t fileSize = GetFileSize(fileName.c_str());
1186     EXPECT_LE(fileSize, TEST_SIZE_F4000_FP_PROCESS);
1187 }
1188 
1189 /**
1190  * @tc.name: FileSizeOnFrequency8000_FP_PROCESS
1191  * @tc.desc: Test size of file generated under one process frequency 8000 and fp unwind
1192  * @tc.type: FUNC
1193  */
1194 HWTEST_F(SubCommandRecordTest, FileSizeOnFrequency8000_FP_PROCESS, TestSize.Level1)
1195 {
1196     ForkAndRunTest("-d 10 -f 8000 -s fp", true, true);
1197     std::string fileName = TEST_FILE;
1198     size_t fileSize = GetFileSize(fileName.c_str());
1199     EXPECT_LE(fileSize, TEST_SIZE_F8000_FP_PROCESS);
1200 }
1201 
1202 /**
1203  * @tc.name: ExcludeThreadName
1204  * @tc.desc: Test --exclude-thread option sucess
1205  * @tc.type: FUNC
1206  */
1207 HWTEST_F(SubCommandRecordTest, ExcludeThreadName, TestSize.Level1)
1208 {
1209     ForkAndRunTest("-d 2 --exclude-thread DfxWatchdog ", true);
1210 }
1211 
1212 /**
1213  * @tc.name: ExcludeThreadNames
1214  * @tc.desc: Test --exclude-thread option multi threads
1215  * @tc.type: FUNC
1216  */
1217 HWTEST_F(SubCommandRecordTest, ExcludeThreadNames, TestSize.Level1)
1218 {
1219     ForkAndRunTest("-d 2 --exclude-thread DfxWatchdog,GC_WorkerThread ", true);
1220 }
1221 
1222 /**
1223  * @tc.name: ExcludeErrorThreadName
1224  * @tc.desc: Test --exclude-thread option error thread name
1225  * @tc.type: FUNC
1226  */
1227 HWTEST_F(SubCommandRecordTest, ExcludeErrorThreadName, TestSize.Level1)
1228 {
1229     ForkAndRunTest("-d 2 --exclude-thread test ", true);
1230 }
1231 
1232 /**
1233  * @tc.name: ExcludeErrorThreadNames
1234  * @tc.desc: Test --exclude-thread option multi error thread names
1235  * @tc.type: FUNC
1236  */
1237 HWTEST_F(SubCommandRecordTest, ExcludeErrorThreadNames, TestSize.Level1)
1238 {
1239     ForkAndRunTest("-d 2 --exclude-thread test1,test2 ", true);
1240 }
1241 
1242 /**
1243  * @tc.name: ExcludeTids
1244  * @tc.desc: Test --exclude-tid
1245  * @tc.type: FUNC
1246  */
1247 HWTEST_F(SubCommandRecordTest, ExcludeTids, TestSize.Level1)
1248 {
1249     ForkAndRunTest("-d 2 -s dwarf -f 2000 --exclude-tid 200");
1250 }
1251 
1252 /**
1253  * @tc.name: ExcludeThread
1254  * @tc.desc: Test --exclude-thread
1255  * @tc.type: FUNC
1256  */
1257 HWTEST_F(SubCommandRecordTest, ExcludeThread, TestSize.Level1)
1258 {
1259     ForkAndRunTest("-d 2 -s dwarf -f 2000 --exclude-thread com.app.test");
1260 }
1261 
1262 /**
1263  * @tc.name: ExcludeMixedThreadName
1264  * @tc.desc: Test --exclude-thread option mixed correct name and error name
1265  * @tc.type: FUNC
1266  */
1267 HWTEST_F(SubCommandRecordTest, ExcludeMixedThreadName, TestSize.Level1)
1268 {
1269     ForkAndRunTest("-d 2 --exclude-thread DfxWatchdog,test ", true);
1270 }
1271 
1272 // --restart
1273 HWTEST_F(SubCommandRecordTest, ReStartNotApp1, TestSize.Level1)
1274 {
1275     TestRecordCommand("-p 5 --restart ", false, false);
1276 }
1277 
1278 HWTEST_F(SubCommandRecordTest, ReStartNotApp2, TestSize.Level1)
1279 {
1280     TestRecordCommand("-a --restart ", false, false);
1281 }
1282 
1283 HWTEST_F(SubCommandRecordTest, ReStartNotApp3, TestSize.Level1)
1284 {
1285     TestRecordCommand("-p 5 -a --restart ", false, false);
1286 }
1287 
1288 HWTEST_F(SubCommandRecordTest, ReStartConflict, TestSize.Level1)
1289 {
1290     TestRecordCommand("--restart -a ", false, true);
1291 }
1292 
1293 HWTEST_F(SubCommandRecordTest, ReStart, TestSize.Level1)
1294 {
1295     TestRecordCommand("--restart ", false, true);
1296 }
1297 
1298 // --exclude-tid
1299 HWTEST_F(SubCommandRecordTest, ExcludeTidConflict, TestSize.Level1)
1300 {
1301     TestRecordCommand("--exclude-tid 5 --exclude-thread test ", false, true);
1302 }
1303 
1304 /**
1305  * @tc.name: CmdLinesSizeSucess
1306  * @tc.desc: Test --cmdline-size option
1307  * @tc.type: FUNC
1308  */
1309 HWTEST_F(SubCommandRecordTest, CmdLinesSizeSucess, TestSize.Level1)
1310 {
1311     ForkAndRunTest("-d 2 --cmdline-size 1024 ", true);
1312 }
1313 
1314 /**
1315  * @tc.name: CmdLinesSizeOutRange
1316  * @tc.desc: Test --cmdline-size option
1317  * @tc.type: FUNC
1318  */
1319 HWTEST_F(SubCommandRecordTest, CmdLinesSizeOutRange, TestSize.Level1)
1320 {
1321     TestRecordCommand("-d 2 --cmdline-size 8192 ", false);
1322 }
1323 
1324 /**
1325  * @tc.name: CmdLinesSizeNotPowerOf2
1326  * @tc.desc: Test --cmdline-size option
1327  * @tc.type: FUNC
1328  */
1329 HWTEST_F(SubCommandRecordTest, CmdLinesSizeNotPowerOf2, TestSize.Level1)
1330 {
1331     TestRecordCommand("-d 2 --cmdline-size 1000 ", false);
1332 }
1333 
1334 /**
1335  * @tc.name: EnableDebugInfoSymbolicFp
1336  * @tc.desc: Test --enable-debuginfo-symbolic option with -s fp
1337  * @tc.type: FUNC
1338  */
1339 HWTEST_F(SubCommandRecordTest, EnableDebugInfoSymbolicFp, TestSize.Level1)
1340 {
1341     ForkAndRunTest("-d 2 -s fp --enable-debuginfo-symbolic ", true);
1342 }
1343 
1344 /**
1345  * @tc.name: EnableDebugInfoSymbolicDwarf
1346  * @tc.desc: Test --enable-debuginfo-symbolic option with -s dwarf
1347  * @tc.type: FUNC
1348  */
1349 HWTEST_F(SubCommandRecordTest, EnableDebugInfoSymbolicDwarf, TestSize.Level1)
1350 {
1351     ForkAndRunTest("-d 2 -s dwarf --enable-debuginfo-symbolic ", true);
1352 }
1353 
1354 /**
1355  * @tc.name: CallChainUserOnlyFp
1356  * @tc.desc: Test --callchain-useronly option with fp
1357  * @tc.type: FUNC
1358  */
1359 HWTEST_F(SubCommandRecordTest, CallChainUserOnlyFp, TestSize.Level1)
1360 {
1361     ForkAndRunTest("-d 2 -s fp --callchain-useronly", true, true);
1362 }
1363 
1364 /**
1365  * @tc.name: CallChainUserOnlyDwarf
1366  * @tc.desc: Test --callchain-useronly option with dwarf
1367  * @tc.type: FUNC
1368  */
1369 HWTEST_F(SubCommandRecordTest, CallChainUserOnlyDwarf, TestSize.Level1)
1370 {
1371     ForkAndRunTest("-d 2 -s dwarf --callchain-useronly", true, true);
1372 }
1373 
1374 /**
1375  * @tc.name: CallChainUserOnlyError
1376  * @tc.desc: Test --callchain-useronly option without fp/dwarf
1377  * @tc.type: FUNC
1378  */
1379 HWTEST_F(SubCommandRecordTest, CallChainUserOnlyError, TestSize.Level1)
1380 {
1381     ForkAndRunTest("-d 2 --callchain-useronly", false, true);
1382 }
1383 
1384 /**
1385  * @tc.name: DedupStack
1386  * @tc.desc: Test --dedup_stack option
1387  * @tc.type: FUNC
1388  */
1389 HWTEST_F(SubCommandRecordTest, DedupStack, TestSize.Level1)
1390 {
1391     ForkAndRunTest("-d 2 -s dwarf --dedup_stack", true, true);
1392 }
1393 
1394 /**
1395  * @tc.name: DedupStackErr
1396  * @tc.desc: Test --dedup_stack option with -a
1397  * @tc.type: FUNC
1398  */
1399 HWTEST_F(SubCommandRecordTest, DedupStackErr, TestSize.Level1)
1400 {
1401     TestRecordCommand("-d 2 -a -s dwarf --dedup_stack", false, false);
1402 }
1403 
1404 /**
1405  * @tc.name: TestNoFork
1406  * @tc.desc: Test no fork
1407  * @tc.type: FUNC
1408  */
1409 HWTEST_F(SubCommandRecordTest, TestNoFork, TestSize.Level1)
1410 {
1411     TestRecordCommand("-d 2 -s dwarf --dedup_stack -f 2000 --cmdline-size 1024", true, true);
1412 }
1413 
1414 /**
1415  * @tc.name: TestAllNoFork
1416  * @tc.desc: Test no fork with -a
1417  * @tc.type: FUNC
1418  */
1419 HWTEST_F(SubCommandRecordTest, TestAllNoFork, TestSize.Level1)
1420 {
1421     TestRecordCommand("-d 2 -a -s dwarf --clockid monotonic --exclude-hiperf", true, false);
1422 }
1423 
1424 /**
1425  * @tc.name: CreateFifoServer
1426  * @tc.desc: Test create Fipo server
1427  * @tc.type: FUNC
1428  */
1429 HWTEST_F(SubCommandRecordTest, CreateFifoServer, TestSize.Level1)
1430 {
1431     SubCommandRecord cmd;
1432     EXPECT_EQ(cmd.CreateFifoServer(), false);
1433 }
1434 
1435 /**
1436  * @tc.name: SendFifoAndWaitReply
1437  * @tc.desc: Test send Fifo and wait reply
1438  * @tc.type: FUNC
1439  */
1440 HWTEST_F(SubCommandRecordTest, SendFifoAndWaitReply, TestSize.Level1)
1441 {
1442     SubCommandRecord cmd;
1443     std::string test = "test";
1444     EXPECT_EQ(cmd.SendFifoAndWaitReply(test, CONTROL_WAITREPY_TOMEOUT), false);
1445 }
1446 
1447 /**
1448  * @tc.name: ReportErr
1449  * @tc.desc: Test report option error
1450  * @tc.type: FUNC
1451  */
1452 HWTEST_F(SubCommandRecordTest, ReportErr, TestSize.Level1)
1453 {
1454     TestRecordCommand("-d 2 -a --report ", false, false);
1455 }
1456 
1457 /**
1458  * @tc.name: TestHasReport
1459  * @tc.desc: Test --report option
1460  * @tc.type: FUNC
1461  */
1462 HWTEST_F(SubCommandRecordTest, TestHasReport, TestSize.Level1)
1463 {
1464     TestRecordCommand("-d 2 -s dwarf --report", true, true);
1465 }
1466 
1467 /**
1468  * @tc.name: TraceCommand
1469  * @tc.desc: Test TraceCommand option
1470  * @tc.type: FUNC
1471  */
1472 HWTEST_F(SubCommandRecordTest, TraceCommand, TestSize.Level1)
1473 {
1474     TestRecordCommand("-d 2 -s dwarf ls", true, false);
1475 }
1476 
1477 /**
1478  * @tc.name: TraceCommandErr
1479  * @tc.desc: Test InvalidCommand option
1480  * @tc.type: FUNC
1481  */
1482 HWTEST_F(SubCommandRecordTest, TraceCommandErr, TestSize.Level1)
1483 {
1484     TestRecordCommand("-d 2 -s dwarf invalidcommand", false, false);
1485 }
1486 
1487 /**
1488  * @tc.name: TestInputErr
1489  * @tc.desc: Test input with -a
1490  * @tc.type: FUNC
1491  */
1492 HWTEST_F(SubCommandRecordTest, TestInputErr, TestSize.Level1)
1493 {
1494     TestRecordCommand("-d 2 -a -s dwarf -f 2000 --pipe_input", false, false);
1495 }
1496 
1497 /**
1498  * @tc.name: TestOutputErr
1499  * @tc.desc: Test output with -a
1500  * @tc.type: FUNC
1501  */
1502 HWTEST_F(SubCommandRecordTest, TestOutputErr, TestSize.Level1)
1503 {
1504     TestRecordCommand("-d 2 -a -s dwarf -f 2000 --pipe_output", false, false);
1505 }
1506 
1507 /**
1508  * @tc.name: TestBranchFilterErr
1509  * @tc.desc: Test branch filter with -a
1510  * @tc.type: FUNC
1511  */
1512 HWTEST_F(SubCommandRecordTest, TestBranchFilterErr, TestSize.Level1)
1513 {
1514     TestRecordCommand("-d 2 -a -s dwarf -f 2000 -j", false, false);
1515 }
1516 
1517 /**
1518  * @tc.name: TestCallStackErr
1519  * @tc.desc: Test call stack with -a
1520  * @tc.type: FUNC
1521  */
1522 HWTEST_F(SubCommandRecordTest, TestCallStackErr, TestSize.Level1)
1523 {
1524     TestRecordCommand("-d 2 -a -f 2000 --call-stack", false, false);
1525 }
1526 
1527 /**
1528  * @tc.name: TestEventGroupErr
1529  * @tc.desc: Test event group with -a
1530  * @tc.type: FUNC
1531  */
1532 HWTEST_F(SubCommandRecordTest, TestEventGroupErr, TestSize.Level1)
1533 {
1534     TestRecordCommand("-d 2 -a -f 2000 -g", false, false);
1535 }
1536 
1537 /**
1538  * @tc.name: TestExcludeThreadErr
1539  * @tc.desc: Test exclude-thread with -a
1540  * @tc.type: FUNC
1541  */
1542 HWTEST_F(SubCommandRecordTest, TestExcludeThreadErr, TestSize.Level1)
1543 {
1544     TestRecordCommand("-d 2 -a -f 2000 --exclude-thread", false, false);
1545 }
1546 
1547 /**
1548  * @tc.name: TestSymbolDirErr
1549  * @tc.desc: Test symbol-dir with -a
1550  * @tc.type: FUNC
1551  */
1552 HWTEST_F(SubCommandRecordTest, TestSymbolDirErr, TestSize.Level1)
1553 {
1554     TestRecordCommand("-d 2 -a -f 2000 --symbol-dir", false, false);
1555 }
1556 
1557 /**
1558  * @tc.name: TestControlErr
1559  * @tc.desc: Test control with -a
1560  * @tc.type: FUNC
1561  */
1562 HWTEST_F(SubCommandRecordTest, TestControlErr, TestSize.Level1)
1563 {
1564     TestRecordCommand("-d 2 -a -f 2000 --control", false, false);
1565 }
1566 
1567 /**
1568  * @tc.name: TestCmdlineSizeErr
1569  * @tc.desc: Test cmdline-size with -a
1570  * @tc.type: FUNC
1571  */
1572 HWTEST_F(SubCommandRecordTest, TestCmdlineSizeErr, TestSize.Level1)
1573 {
1574     TestRecordCommand("-d 2 -a -f 2000 --cmdline-size", false, false);
1575 }
1576 } // namespace HiPerf
1577 } // namespace Developtools
1578 } // namespace OHOS
1579