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