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 #include <fcntl.h>
16 #include <gtest/gtest.h>
17 #define private public
18 #include "executor/memory_dumper.h"
19 #include "executor/api_dumper.h"
20 #include "executor/cmd_dumper.h"
21 #include "executor/cpu_dumper.h"
22 #include "executor/file_stream_dumper.h"
23 #include "executor/ipc_stat_dumper.h"
24 #include "executor/jsheap_memory_dumper.h"
25 #include "executor/cjheap_memory_dumper.h"
26 #include "executor/list_dumper.h"
27 #include "executor/sa_dumper.h"
28 #include "executor/version_dumper.h"
29 #include "executor/traffic_dumper.h"
30 #include "util/config_utils.h"
31 #include "util/string_utils.h"
32 #include "manager/dump_implement.h"
33 #undef private
34
35 using namespace std;
36 using namespace testing::ext;
37 using namespace OHOS;
38 using namespace OHOS::HiviewDFX;
39 namespace OHOS {
40 namespace HiviewDFX {
41 static std::shared_ptr<DumperParameter> g_parameter;
42 static std::shared_ptr<std::vector<std::vector<std::string>>> g_dump_datas;
43 static std::shared_ptr<DumpCfg> g_config;
44 class HidumperDumpersTest : public testing::Test {
45 public:
46 static void SetUpTestCase(void);
47 static void TearDownTestCase(void);
48 void SetUp();
49 void TearDown();
50 static void HandleDumperComon(std::string dumperType);
51 static void HandleDumperExcute(std::string dumperType);
52 static void HandleCpuDumperTest(int pid);
53 static void HandleMemoryDumperTest(int pid);
54 static void HandleTrafficDumperTest(int pid);
55 static void GetDumperVariable();
56 static void HandleIpcStatDumperTest(void);
57 static DumpStatus SetIpcStatCmdTest(const DumperOpts &opts);
58
59 protected:
60 static constexpr auto& FILE_CPUINFO = "/proc/cpuinfo";
61 static constexpr auto DEFAULT_PID = 1;
62 static constexpr auto DEFAULT_UID = 0;
63 };
64
SetUpTestCase(void)65 void HidumperDumpersTest::SetUpTestCase(void)
66 {
67 }
68
TearDownTestCase(void)69 void HidumperDumpersTest::TearDownTestCase(void)
70 {
71 }
72
SetUp(void)73 void HidumperDumpersTest::SetUp(void)
74 {
75 GetDumperVariable();
76 }
77
TearDown(void)78 void HidumperDumpersTest::TearDown(void)
79 {
80 }
81
GetDumperVariable()82 void HidumperDumpersTest::GetDumperVariable()
83 {
84 g_parameter = std::make_shared<DumperParameter>();
85 g_dump_datas = std::make_shared<std::vector<std::vector<std::string>>>();
86 g_config = std::make_shared<DumpCfg>();
87 }
88
HandleDumperExcute(std::string dumperType)89 void HidumperDumpersTest::HandleDumperExcute(std::string dumperType)
90 {
91 std::shared_ptr<HidumperExecutor> dumper = std::make_shared<FileStreamDumper>();
92 if (StringUtils::GetInstance().IsSameStr(dumperType, "APIDumper")) {
93 dumper = std::make_shared<APIDumper>();
94 } else if (StringUtils::GetInstance().IsSameStr(dumperType, "VersionDumper")) {
95 dumper = std::make_shared<VersionDumper>();
96 } else if (StringUtils::GetInstance().IsSameStr(dumperType, "CMDDumper")) {
97 dumper = std::make_shared<CMDDumper>();
98 } else if (StringUtils::GetInstance().IsSameStr(dumperType, "SADumper")) {
99 dumper = std::make_shared<SADumper>();
100 } else {
101 dumper = std::make_shared<ListDumper>();
102 }
103 dumper->SetDumpConfig(g_config);
104 if (StringUtils::GetInstance().IsSameStr(dumperType, "SADumper")
105 || StringUtils::GetInstance().IsSameStr(dumperType, "ListDumper")) {
106 int fd = open("/dev/null", O_RDWR | O_CREAT | O_TRUNC, 0664);
107 if (fd <= 0) {
108 fd = STDERR_FILENO;
109 }
110 std::vector<std::u16string> args;
111 std::shared_ptr<RawParam> rawParam = std::make_shared<RawParam>(0, 1, 0, args, fd);
112 g_parameter->setClientCallback(rawParam);
113 DumpStatus ret = DumpStatus::DUMP_FAIL;
114 ret = dumper->PreExecute(g_parameter, g_dump_datas);
115 ASSERT_EQ(ret, DumpStatus::DUMP_OK);
116 ret = dumper->Execute();
117 ASSERT_EQ(ret, DumpStatus::DUMP_OK);
118 if (StringUtils::GetInstance().IsSameStr(dumperType, "ListDumper")) {
119 ret = dumper->AfterExecute();
120 ASSERT_EQ(ret, DumpStatus::DUMP_OK);
121 }
122 } else {
123 DumpStatus ret = dumper->DoPreExecute(g_parameter, g_dump_datas);
124 ASSERT_TRUE(ret == DumpStatus::DUMP_OK) << "PreExecute failed.";
125 ret = dumper->DoExecute();
126 ASSERT_TRUE(ret == DumpStatus::DUMP_OK) << "Execute failed.";
127 ret = dumper->DoAfterExecute();
128 ASSERT_TRUE(ret == DumpStatus::DUMP_OK) << "AfterExecute failed.";
129 }
130 }
131
132 #ifdef HIDUMPER_HIVIEWDFX_HIVIEW_ENABLE
HandleCpuDumperTest(int pid)133 void HidumperDumpersTest::HandleCpuDumperTest(int pid)
134 {
135 auto parameter = std::make_shared<DumperParameter>();
136 DumperOpts opts;
137 opts.isDumpCpuUsage_ = pid == -1 ? true : false;
138 opts.cpuUsagePid_ = pid;
139 parameter->SetOpts(opts);
140 auto dumpDatas = std::make_shared<std::vector<std::vector<std::string>>>();
141 auto cpuDumper = std::make_shared<CPUDumper>();
142 DumpStatus ret = DumpStatus::DUMP_FAIL;
143 ret = cpuDumper->PreExecute(parameter, dumpDatas);
144 ASSERT_EQ(ret, DumpStatus::DUMP_OK);
145 ret = cpuDumper->Execute();
146 if (pid == -1) {
147 ASSERT_EQ(ret, DumpStatus::DUMP_OK);
148 ret = cpuDumper->AfterExecute();
149 ASSERT_EQ(ret, DumpStatus::DUMP_OK);
150 } else {
151 ASSERT_EQ(ret, DumpStatus::DUMP_FAIL);
152 }
153 }
154 #endif
155
156
HandleMemoryDumperTest(int pid)157 void HidumperDumpersTest::HandleMemoryDumperTest(int pid)
158 {
159 auto memoryDumper = std::make_shared<MemoryDumper>();
160 memoryDumper->pid_ = pid;
161 auto dumpDatas = std::make_shared<std::vector<std::vector<std::string>>>();
162 memoryDumper->dumpDatas_ = dumpDatas;
163 int res = DumpStatus::DUMP_MORE_DATA;
164 while (res == DumpStatus::DUMP_MORE_DATA) {
165 res = memoryDumper->Execute();
166 }
167 ASSERT_EQ(res, DumpStatus::DUMP_OK);
168 }
169
HandleTrafficDumperTest(int pid)170 void HidumperDumpersTest::HandleTrafficDumperTest(int pid)
171 {
172 auto trafficDumper = std::make_shared<TrafficDumper>();
173 trafficDumper->pid_ = pid;
174 auto dumpDatas = std::make_shared<std::vector<std::vector<std::string>>>();
175 ASSERT_NE(dumpDatas, nullptr);
176 trafficDumper->result_ = dumpDatas;
177 DumpStatus ret = DumpStatus::DUMP_FAIL;
178 ret = trafficDumper->Execute();
179 ASSERT_EQ(ret, DumpStatus::DUMP_OK);
180 ret = trafficDumper->AfterExecute();
181 ASSERT_EQ(ret, DumpStatus::DUMP_OK);
182 }
183
HandleDumperComon(std::string dumperType)184 void HidumperDumpersTest::HandleDumperComon(std::string dumperType)
185 {
186 std::shared_ptr<HidumperExecutor> dumper = std::make_shared<FileStreamDumper>();
187 if (StringUtils::GetInstance().IsSameStr(dumperType, "CMDDumper")) {
188 dumper = std::make_shared<CMDDumper>();
189 }
190 dumper->SetDumpConfig(g_config);
191 DumpStatus ret = dumper->DoPreExecute(g_parameter, g_dump_datas);
192 ASSERT_TRUE(ret == DumpStatus::DUMP_OK) << "PreExecute failed.";
193 ret = DumpStatus::DUMP_MORE_DATA;
194 while (ret == DumpStatus::DUMP_MORE_DATA) {
195 // loop for all lines
196 ret = dumper->DoExecute();
197 ASSERT_TRUE(ret == DumpStatus::DUMP_OK || ret == DumpStatus::DUMP_MORE_DATA) << "Execute failed.";
198 ret = dumper->DoAfterExecute();
199 ASSERT_TRUE(ret == DumpStatus::DUMP_OK || ret == DumpStatus::DUMP_MORE_DATA) << "Execute failed.";
200 }
201 }
202
HandleIpcStatDumperTest(void)203 void HidumperDumpersTest::HandleIpcStatDumperTest(void)
204 {
205 auto parameter = std::make_shared<DumperParameter>();
206 std::vector<std::u16string> args;
207 DumperOpts opts;
208 auto dumpDatas = std::make_shared<std::vector<std::vector<std::string>>>();
209 auto ipcStatDumper = std::make_shared<IPCStatDumper>();
210
211 int fd = open("/dev/null", O_RDWR | O_CREAT | O_TRUNC, 0664);
212 if (fd <= 0) {
213 fd = STDERR_FILENO;
214 }
215 std::shared_ptr<RawParam> rawParam = std::make_shared<RawParam>(0, 1, 0, args, fd);
216
217 opts.isDumpIpc_ = true;
218 opts.isDumpAllIpc_ = true;
219 opts.isDumpIpcStartStat_ = true;
220 parameter->SetOpts(opts);
221 parameter->setClientCallback(rawParam);
222
223 DumpStatus ret = DumpStatus::DUMP_FAIL;
224 ret = ipcStatDumper->PreExecute(parameter, dumpDatas);
225 ASSERT_EQ(ret, DumpStatus::DUMP_OK);
226 ret = ipcStatDumper->Execute();
227 ASSERT_EQ(ret, DumpStatus::DUMP_OK);
228 ret = ipcStatDumper->AfterExecute();
229 ASSERT_EQ(ret, DumpStatus::DUMP_OK);
230 }
231
SetIpcStatCmdTest(const DumperOpts & opts)232 DumpStatus HidumperDumpersTest::SetIpcStatCmdTest(const DumperOpts &opts)
233 {
234 auto parameter = std::make_shared<DumperParameter>();
235 std::vector<std::u16string> args;
236 auto dumpDatas = std::make_shared<std::vector<std::vector<std::string>>>();
237 auto ipcStatDumper = std::make_shared<IPCStatDumper>();
238
239 int fd = open("/dev/null", O_RDWR | O_CREAT | O_TRUNC, 0664);
240 if (fd <= 0) {
241 fd = STDERR_FILENO;
242 }
243 std::shared_ptr<RawParam> rawParam = std::make_shared<RawParam>(0, 1, 0, args, fd);
244 parameter->SetOpts(opts);
245 parameter->setClientCallback(rawParam);
246
247 DumpStatus ret = DumpStatus::DUMP_FAIL;
248 ret = ipcStatDumper->PreExecute(parameter, dumpDatas);
249 if (ret != DumpStatus::DUMP_OK) {
250 return ret;
251 }
252 ret = ipcStatDumper->Execute();
253 return ret;
254 }
255
256 /**
257 * @tc.name: FileDumperTest001
258 * @tc.desc: Test FileDumper base function with loop = TRUE.
259 * @tc.type: FUNC
260 */
261 HWTEST_F(HidumperDumpersTest, FileDumperTest001, TestSize.Level3)
262 {
263 g_config->name_ = "FileDumperTest";
264 std::string file_name = FILE_CPUINFO;
265 g_config->target_ = file_name;
266 g_config->loop_ = DumperConstant::LOOP;
267 g_config->args_ = OptionArgs::Create();
268 g_config->args_->SetPid(DEFAULT_PID, DEFAULT_UID);
269 g_config->args_->SetCpuId(0);
270 HandleDumperComon("FileStreamDumper");
271 }
272
273 /**
274 * @tc.name: FileDumperTest002
275 * @tc.desc: Test FileDumper base function with loop = FALSE.
276 * @tc.type: FUNC
277 */
278 HWTEST_F(HidumperDumpersTest, FileDumperTest002, TestSize.Level3)
279 {
280 g_config->name_ = "FileDumperTest";
281 std::string file_name = FILE_CPUINFO;
282 g_config->target_ = file_name;
283 g_config->loop_ = DumperConstant::NONE;
284 HandleDumperComon("FileStreamDumper");
285 }
286
287 /**
288 * @tc.name: FileDumperTest005
289 * @tc.desc: Test FileDumper base function with replacing PID in file paths.
290 * @tc.type: FUNC
291 */
292 HWTEST_F(HidumperDumpersTest, FileDumperTest005, TestSize.Level0)
293 {
294 g_config->name_ = "FileDumperTest";
295 std::string file_name = "/proc/%pid/smaps";
296 g_config->target_ = file_name;
297 g_config->loop_ = DumperConstant::LOOP;
298 g_config->args_ = OptionArgs::Create();
299 g_config->args_->SetPid(DEFAULT_PID, DEFAULT_UID);
300 g_config->args_->SetCpuId(1);
301 HandleDumperComon("FileStreamDumper");
302 }
303
304 /**
305 * @tc.name: APIDumperTest001
306 * @tc.desc: Test APIDumper target is build_version.
307 * @tc.type: FUNC
308 */
309 HWTEST_F(HidumperDumpersTest, APIDumperTest001, TestSize.Level3)
310 {
311 g_config->name_ = "dumper_build_id";
312 g_config->target_ = "build_version";
313 HandleDumperExcute("APIDumper");
314 }
315
316 /**
317 * @tc.name: APIDumperTest002
318 * @tc.desc: Test APIDumper target is hw_sc.build.os.releasetype.
319 * @tc.type: FUNC
320 */
321 HWTEST_F(HidumperDumpersTest, APIDumperTest002, TestSize.Level3)
322 {
323 g_config->name_ = "dumper_release_type";
324 g_config->target_ = "hw_sc.build.os.releasetype";
325 HandleDumperExcute("APIDumper");
326 }
327
328 /**
329 * @tc.name: APIDumperTest003
330 * @tc.desc: Test APIDumper target is hw_sc.build.os.version.
331 * @tc.type: FUNC
332 */
333 HWTEST_F(HidumperDumpersTest, APIDumperTest003, TestSize.Level3)
334 {
335 g_config->name_ = "dumper_os_version";
336 g_config->target_ = "hw_sc.build.os.version";
337 HandleDumperExcute("APIDumper");
338 }
339
340 /**
341 * @tc.name: APIDumperTest004
342 * @tc.desc: Test APIDumper target is system_param.
343 * @tc.type: FUNC
344 */
345 HWTEST_F(HidumperDumpersTest, APIDumperTest004, TestSize.Level3)
346 {
347 g_config->name_ = "dumper_system_param";
348 g_config->target_ = "system_param";
349 HandleDumperExcute("APIDumper");
350 }
351
352 /**
353 * @tc.name: VersionDumperTest001
354 * @tc.desc: Test VersionDumper.
355 * @tc.type: FUNC
356 */
357 HWTEST_F(HidumperDumpersTest, VersionDumperTest001, TestSize.Level3)
358 {
359 HandleDumperExcute("VersionDumper");
360 }
361
362 /**
363 * @tc.name: CMDDumperTest001
364 * @tc.desc: CMD Dumper base function with loop = TRUE.
365 * @tc.type: FUNC
366 */
367 HWTEST_F(HidumperDumpersTest, CMDDumperTest001, TestSize.Level3)
368 {
369 g_config->name_ = "CmdDumperTest";
370 std::string cmd = "ps -ef";
371 g_config->target_ = cmd;
372 g_config->loop_ = DumperConstant::LOOP;
373 HandleDumperComon("CMDDumper");
374 }
375
376 /**
377 * @tc.name: CMDDumperTest002
378 * @tc.desc: CMD Dumper base function with loop = False.
379 * @tc.type: FUNC
380 */
381 HWTEST_F(HidumperDumpersTest, CMDDumperTest002, TestSize.Level3)
382 {
383 g_config->name_ = "CmdDumperTest";
384 std::string cmd = "ps -ef";
385 g_config->target_ = cmd;
386 g_config->loop_ = DumperConstant::NONE;
387 HandleDumperComon("CMDDumper");
388 }
389
390 /**
391 * @tc.name: CMDDumperTest003
392 * @tc.desc: CMD Dumper GetCmdInterface.
393 * @tc.type: FUNC
394 */
395 HWTEST_F(HidumperDumpersTest, CMDDumperTest003, TestSize.Level3)
396 {
397 auto dumpDatas = std::make_shared<std::vector<std::vector<std::string>>>();
398 auto cmdDumper = std::make_shared<CMDDumper>();
399
400 int ret = cmdDumper->GetCmdInterface("hidumper --mem 1", dumpDatas);
401 ASSERT_EQ(ret, DumpStatus::DUMP_OK);
402 }
403
404 /**
405 * @tc.name: CMDDumperTest004
406 * @tc.desc: CMD Dumper GetCmdInterface prune.
407 * @tc.type: FUNC
408 */
409 HWTEST_F(HidumperDumpersTest, CMDDumperTest004, TestSize.Level3)
410 {
411 auto dumpDatas = std::make_shared<std::vector<std::vector<std::string>>>();
412 auto cmdDumper = std::make_shared<CMDDumper>();
413
414 int ret = cmdDumper->GetCmdInterface("hidumper --mem --prune", dumpDatas);
415 ASSERT_EQ(ret, DumpStatus::DUMP_OK);
416 }
417
418 /**
419 * @tc.name: MemoryDumperTest001
420 * @tc.desc: Test MemoryDumper one process has correct ret.
421 * @tc.type: FUNC
422 */
423 HWTEST_F(HidumperDumpersTest, MemoryDumperTest001, TestSize.Level1)
424 {
425 HandleMemoryDumperTest(1);
426 }
427
428 /**
429 * @tc.name: MemoryDumperTest002
430 * @tc.desc: Test MemoryDumper all process has correct ret.
431 * @tc.type: FUNC
432 */
433 HWTEST_F(HidumperDumpersTest, MemoryDumperTest002, TestSize.Level1)
434 {
435 HandleMemoryDumperTest(-1);
436 }
437 /**
438 * @tc.name: MemoryDumperTest003
439 * @tc.desc: Test MemoryDumper isReceivedSigInt.
440 * @tc.type: FUNC
441 */
442 HWTEST_F(HidumperDumpersTest, MemoryDumperTest003, TestSize.Level1)
443 {
444 auto memoryDumper = std::make_shared<MemoryDumper>();
445 memoryDumper->pid_ = 1;
446 auto dumpDatas = std::make_shared<std::vector<std::vector<std::string>>>();
447 memoryDumper->dumpDatas_ = dumpDatas;
448 memoryDumper->isReceivedSigInt_ = true;
449 int res = memoryDumper->Execute();
450 ASSERT_EQ(res, DumpStatus::DUMP_OK);
451 }
452 /**
453 * @tc.name: MemoryDumperTest004
454 * @tc.desc: Test MemoryDumper timeInterval.
455 * @tc.type: FUNC
456 */
457 HWTEST_F(HidumperDumpersTest, MemoryDumperTest004, TestSize.Level1)
458 {
459 auto memoryDumper = std::make_shared<MemoryDumper>();
460 memoryDumper->pid_ = 1;
461 auto dumpDatas = std::make_shared<std::vector<std::vector<std::string>>>();
462 memoryDumper->dumpDatas_ = dumpDatas;
463 memoryDumper->timeInterval_ = 1;
464 int res = memoryDumper->Execute();
465 ASSERT_EQ(res, DumpStatus::DUMP_OK);
466 }
467 /**
468 * @tc.name: MemoryDumperTest005
469 * @tc.desc: Test MemoryDumper dumpMemPrune.
470 * @tc.type: FUNC
471 */
472 HWTEST_F(HidumperDumpersTest, MemoryDumperTest005, TestSize.Level1)
473 {
474 auto memoryDumper = std::make_shared<MemoryDumper>();
475 memoryDumper->pid_ = -1;
476 auto dumpDatas = std::make_shared<std::vector<std::vector<std::string>>>();
477 memoryDumper->dumpDatas_ = dumpDatas;
478 memoryDumper->dumpMemPrune_ = true;
479 int res = memoryDumper->Execute();
480 ASSERT_EQ(res, DumpStatus::DUMP_OK);
481 }
482
483 /**
484 * @tc.name: SADumperTest001
485 * @tc.desc: Test SADumper no saname has correct ret.
486 * @tc.type: FUNC
487 */
488 HWTEST_F(HidumperDumpersTest, SADumperTest001, TestSize.Level1)
489 {
490 g_config->args_ = OptionArgs::Create();
491 HandleDumperExcute("SADumper");
492 }
493
494 /**
495 * @tc.name: SADumperTest002
496 * @tc.desc: Test SADumper one saname has correct ret.
497 * @tc.type: FUNC
498 */
499 HWTEST_F(HidumperDumpersTest, SADumperTest002, TestSize.Level1)
500 {
501 g_config->args_ = OptionArgs::Create();
502 const std::vector<std::string> names = {"1202"};
503 const std::vector<std::string> args;
504 g_config->args_->SetNamesAndArgs(names, args);
505 HandleDumperExcute("SADumper");
506 }
507
508 /**
509 * @tc.name: CpuDumperTest001
510 * @tc.desc: Test CpuDumper dump all process has correct ret.
511 * @tc.type: FUNC
512 */
513 #ifdef HIDUMPER_HIVIEWDFX_HIVIEW_ENABLE
514 HWTEST_F(HidumperDumpersTest, CpuDumperTest001, TestSize.Level1)
515 {
516 HandleCpuDumperTest(-1);
517 }
518 #endif
519
520 /**
521 * @tc.name: CpuDumperTest002
522 * @tc.desc: Test CpuDumper has correct ret when opts is vaild.
523 * @tc.type: FUNC
524 */
525 #ifdef HIDUMPER_HIVIEWDFX_HIVIEW_ENABLE
526 HWTEST_F(HidumperDumpersTest, CpuDumperTest002, TestSize.Level1)
527 {
528 HandleCpuDumperTest(getpid());
529 }
530 #endif
531
532 /**
533 * @tc.name: ListDumperTest001
534 * @tc.desc: Test ListDumper dump ABILITY has correct ret.
535 * @tc.type: FUNC
536 */
537 HWTEST_F(HidumperDumpersTest, ListDumperTest001, TestSize.Level1)
538 {
539 g_config->target_ = ConfigUtils::STR_ABILITY;
540 HandleDumperExcute("ListDumper");
541 }
542
543 /**
544 * @tc.name: ListDumperTest002
545 * @tc.desc: Test ListDumper dump SYSTEM has correct ret.
546 * @tc.type: FUNC
547 */
548 HWTEST_F(HidumperDumpersTest, ListDumperTest002, TestSize.Level1)
549 {
550 g_config->target_ = ConfigUtils::STR_SYSTEM;
551 HandleDumperExcute("ListDumper");
552 }
553
554 /**
555 * @tc.name: TrafficDumperTest001
556 * @tc.desc: Test TrafficDumper dump valid process traffic information.
557 * @tc.type: FUNC
558 */
559 HWTEST_F(HidumperDumpersTest, TrafficDumperTest001, TestSize.Level1)
560 {
561 HandleTrafficDumperTest(1);
562 }
563
564 /**
565 * @tc.name: TrafficDumperTest002
566 * @tc.desc: Test TrafficDumper dump invalid process traffic information.
567 * @tc.type: FUNC
568 */
569 HWTEST_F(HidumperDumpersTest, TrafficDumperTest002, TestSize.Level1)
570 {
571 HandleTrafficDumperTest(-1);
572 }
573
574 /**
575 * @tc.name: IpcStatDumperTest001
576 * @tc.desc: Test IpcDumper dump all processes.
577 * @tc.type: FUNC
578 */
579 HWTEST_F(HidumperDumpersTest, IpcStatDumperTest001, TestSize.Level1)
580 {
581 HandleIpcStatDumperTest();
582 }
583
584 /**
585 * @tc.name: IpcStatDumperTest002
586 * @tc.desc: Test IpcDumper CheckPidIsSa failed.
587 * @tc.type: FUNC
588 */
589 HWTEST_F(HidumperDumpersTest, IpcStatDumperTest002, TestSize.Level1)
590 {
591 auto parameter = std::make_shared<DumperParameter>();
592 std::vector<std::string> args;
593 DumperOpts opts;
594 auto dumpDatas = std::make_shared<std::vector<std::vector<std::string>>>();
595 auto ipcStatDumper = std::make_shared<IPCStatDumper>();
596
597 sptr<ISystemAbilityManager> sam = nullptr;
598 sptr<IRemoteObject> sa = nullptr;
599 bool ret = ipcStatDumper->CheckPidIsSa(sam, args, sa);
600 ASSERT_EQ(ret, false);
601 }
602
603 /**
604 * @tc.name: IpcStatDumperTest004
605 * @tc.desc: Test IpcDumper dump with invaid pid.
606 * @tc.type: FUNC
607 */
608 HWTEST_F(HidumperDumpersTest, IpcStatDumperTest004, TestSize.Level1)
609 {
610 DumperOpts opts;
611 opts.isDumpIpc_ = true;
612 opts.isDumpAllIpc_ = false;
613 opts.ipcStatPid_ = DEFAULT_PID;
614 opts.isDumpIpcStartStat_ = true;
615 DumpStatus ret = SetIpcStatCmdTest(opts);
616 ASSERT_EQ(ret, DumpStatus::DUMP_FAIL);
617 }
618
619 /**
620 * @tc.name: IpcStatDumperTest005
621 * @tc.desc: Test IpcDumper with invalid cmd;
622 * @tc.type: FUNC
623 */
624 HWTEST_F(HidumperDumpersTest, IpcStatDumperTest005, TestSize.Level1)
625 {
626 DumperOpts opts;
627 opts.isDumpIpc_ = true;
628 opts.isDumpAllIpc_ = true;
629 opts.isDumpIpcStartStat_ = false;
630 opts.isDumpIpcStopStat_ = false;
631 opts.isDumpIpcStat_ = false;
632 DumpStatus ret = SetIpcStatCmdTest(opts);
633 ASSERT_EQ(ret, DumpStatus::DUMP_FAIL);
634 }
635
636 /**
637 * @tc.name: IpcStatDumperTest006
638 * @tc.desc: Test IpcDumper CheckPidIsApp.
639 * @tc.type: FUNC
640 */
641 HWTEST_F(HidumperDumpersTest, IpcStatDumperTest006, TestSize.Level1)
642 {
643 std::vector<std::string> args;
644 auto ipcStatDumper = std::make_shared<IPCStatDumper>();
645 sptr<ISystemAbilityManager> sam = nullptr;
646 sptr<IRemoteObject> sa = nullptr;
647 bool ret = ipcStatDumper->CheckPidIsApp(sam, args, sa);
648 ASSERT_EQ(ret, false);
649 }
650
651 /**
652 * @tc.name: IpcStatDumperTest007
653 * @tc.desc: Test IpcDumper DumpIpcStat.
654 * @tc.type: FUNC
655 */
656 HWTEST_F(HidumperDumpersTest, IpcStatDumperTest007, TestSize.Level1)
657 {
658 auto ipcStatDumper = std::make_shared<IPCStatDumper>();
659 sptr<ISystemAbilityManager> sam = nullptr;
660 sptr<IRemoteObject> sa = nullptr;
661 DumpStatus ret = ipcStatDumper->DumpIpcStat(sam, sa);
662 ASSERT_EQ(ret, DumpStatus::DUMP_FAIL);
663 }
664
665 /**
666 * @tc.name: IpcStatDumperTest008
667 * @tc.desc: Test IpcDumper ptrReqCtl_ is nullptr.
668 * @tc.type: FUNC
669 */
670 HWTEST_F(HidumperDumpersTest, IpcStatDumperTest008, TestSize.Level1)
671 {
672 auto parameter = std::make_shared<DumperParameter>();
673 std::vector<std::u16string> args;
674 DumperOpts opts;
675 auto dumpDatas = std::make_shared<std::vector<std::vector<std::string>>>();
676 auto ipcStatDumper = std::make_shared<IPCStatDumper>();
677
678 int fd = open("/dev/null", O_RDWR | O_CREAT | O_TRUNC, 0664);
679 if (fd <= 0) {
680 fd = STDERR_FILENO;
681 }
682
683 opts.isDumpIpc_ = true;
684 opts.isDumpAllIpc_ = true;
685 opts.isDumpIpcStartStat_ = true;
686 parameter->SetOpts(opts);
687 parameter->setClientCallback(nullptr);
688
689 DumpStatus ret = DumpStatus::DUMP_FAIL;
690 ret = ipcStatDumper->PreExecute(parameter, dumpDatas);
691 ret = ipcStatDumper->Execute();
692 ipcStatDumper->SendErrorMessage("ptrReqCtl_ test");
693 ASSERT_EQ(ret, DumpStatus::DUMP_FAIL);
694 }
695
696 /**
697 * @tc.name: IpcStatDumperTest009
698 * @tc.desc: Test IpcDumper DoDumpIpcStat with sa nullptr.
699 * @tc.type: FUNC
700 */
701 HWTEST_F(HidumperDumpersTest, IpcStatDumperTest009, TestSize.Level1)
702 {
703 auto ipcStatDumper = std::make_shared<IPCStatDumper>();
704 sptr<IRemoteObject> sa = nullptr;
705 DumpStatus ret = ipcStatDumper->DoDumpIpcStat(sa);
706 ASSERT_EQ(ret, DumpStatus::DUMP_FAIL);
707 }
708
709
710 /**
711 * @tc.name: IpcStatDumperTest009
712 * @tc.desc: Test IpcDumper with invalid rawParamFd.
713 * @tc.type: FUNC
714 */
715 HWTEST_F(HidumperDumpersTest, IpcStatDumperTest010, TestSize.Level1)
716 {
717 char *argv[] = {
718 const_cast<char *>("hidumper"),
719 const_cast<char *>("--ipc"),
720 const_cast<char *>("1"),
721 const_cast<char *>("--start-stat"),
722 };
723 int argc = sizeof(argv) / sizeof(argv[0]);
724 std::vector<std::u16string> args;
725 std::shared_ptr<RawParam> rawParam = std::make_shared<RawParam>(0, 1, 0, args, -1);
726 int ret = DumpImplement::GetInstance().Main(argc, argv, rawParam);
727 ASSERT_EQ(ret, DumpStatus::DUMP_OK);
728 }
729
730 /**
731 * @tc.name: JsHeapDumperTest001
732 * @tc.desc: Test JsHeapDumper with init pid
733 * @tc.type: FUNC
734 */
735 HWTEST_F(HidumperDumpersTest, JsHeapDumperTest001, TestSize.Level1)
736 {
737 char *argv[] = {
738 const_cast<char *>("hidumper"),
739 const_cast<char *>("--mem-jsheap"),
740 const_cast<char *>("1"),
741 };
742 int argc = sizeof(argv) / sizeof(argv[0]);
743 std::vector<std::u16string> args;
744 std::shared_ptr<RawParam> rawParam = std::make_shared<RawParam>(0, 1, 0, args, -1);
745 int ret = DumpImplement::GetInstance().Main(argc, argv, rawParam);
746 ASSERT_EQ(ret, DumpStatus::DUMP_OK);
747 }
748
749 /**
750 * @tc.name: JsHeapDumperTest002
751 * @tc.desc: Test JsHeapDumper with init pid and trigger gc.
752 * @tc.type: FUNC
753 */
754 HWTEST_F(HidumperDumpersTest, JsHeapDumperTest002, TestSize.Level1)
755 {
756 char *argv[] = {
757 const_cast<char *>("hidumper"),
758 const_cast<char *>("--mem-jsheap"),
759 const_cast<char *>("1"),
760 const_cast<char *>("--gc"),
761 };
762 int argc = sizeof(argv) / sizeof(argv[0]);
763 std::vector<std::u16string> args;
764 std::shared_ptr<RawParam> rawParam = std::make_shared<RawParam>(0, 1, 0, args, -1);
765 int ret = DumpImplement::GetInstance().Main(argc, argv, rawParam);
766 ASSERT_EQ(ret, DumpStatus::DUMP_OK);
767 }
768
769 /**
770 * @tc.name: JsHeapDumperTest003
771 * @tc.desc: Test JsHeapDumper with nullptr parameter.
772 * @tc.type: FUNC
773 */
774 HWTEST_F(HidumperDumpersTest, JsHeapDumperTest003, TestSize.Level1)
775 {
776 auto jsHeapDumper = std::make_unique<JsHeapMemoryDumper>();
777 DumpStatus ret = jsHeapDumper->PreExecute(nullptr, g_dump_datas);
778 ASSERT_EQ(ret, DumpStatus::DUMP_FAIL);
779 }
780
781 /**
782 * @tc.name: JsHeapDumperTest004
783 * @tc.desc: Test JsHeapDumper with init pid and dump jsleaklist
784 * @tc.type: FUNC
785 */
786 HWTEST_F(HidumperDumpersTest, JsHeapDumperTest004, TestSize.Level1)
787 {
788 char *argv[] = {
789 const_cast<char *>("hidumper"),
790 const_cast<char *>("--mem-jsheap"),
791 const_cast<char *>("1"),
792 const_cast<char *>("--leakobj"),
793 };
794 int argc = sizeof(argv) / sizeof(argv[0]);
795 std::vector<std::u16string> args;
796 std::shared_ptr<RawParam> rawParam = std::make_shared<RawParam>(0, 1, 0, args, -1);
797 int ret = DumpImplement::GetInstance().Main(argc, argv, rawParam);
798 ASSERT_EQ(ret, DumpStatus::DUMP_OK);
799 }
800
801 /**
802 * @tc.name: JsHeapDumperTest005
803 * @tc.desc: Test JsHeapDumper with init pid and dump rawheap
804 * @tc.type: FUNC
805 */
806 HWTEST_F(HidumperDumpersTest, JsHeapDumperTest005, TestSize.Level1)
807 {
808 char *argv[] = {
809 const_cast<char *>("hidumper"),
810 const_cast<char *>("--mem-jsheap"),
811 const_cast<char *>("1"),
812 const_cast<char *>("--raw"),
813 };
814 int argc = sizeof(argv) / sizeof(argv[0]);
815 std::vector<std::u16string> args;
816 std::shared_ptr<RawParam> rawParam = std::make_shared<RawParam>(0, 1, 0, args, -1);
817 int ret = DumpImplement::GetInstance().Main(argc, argv, rawParam);
818 ASSERT_EQ(ret, DumpStatus::DUMP_OK);
819 }
820
821 /**
822 * @tc.name: JsHeapDumperTest006
823 * @tc.desc: Test JsHeapDumper with init pid and dump rawheap
824 * @tc.type: FUNC
825 */
826 HWTEST_F(HidumperDumpersTest, JsHeapDumperTest006, TestSize.Level1)
827 {
828 char *argv[] = {
829 const_cast<char *>("hidumper"),
830 const_cast<char *>("--mem-jsheap"),
831 const_cast<char *>("1"),
832 const_cast<char *>("-T"),
833 const_cast<char *>("1"),
834 const_cast<char *>("--raw"),
835 };
836 int argc = sizeof(argv) / sizeof(argv[0]);
837 std::vector<std::u16string> args;
838 std::shared_ptr<RawParam> rawParam = std::make_shared<RawParam>(0, 1, 0, args, -1);
839 int ret = DumpImplement::GetInstance().Main(argc, argv, rawParam);
840 ASSERT_EQ(ret, DumpStatus::DUMP_OK);
841 }
842
843 /**
844 * @tc.name: JsHeapDumperTest007
845 * @tc.desc: Test raw parameter
846 * @tc.type: FUNC
847 */
848 HWTEST_F(HidumperDumpersTest, JsHeapDumperTest007, TestSize.Level1)
849 {
850 char *argv[] = {
851 const_cast<char *>("hidumper"),
852 const_cast<char *>("--raw"),
853 };
854 int argc = sizeof(argv) / sizeof(argv[0]);
855 std::vector<std::u16string> args;
856 std::shared_ptr<RawParam> rawParam = std::make_shared<RawParam>(0, 1, 0, args, -1);
857 int ret = DumpImplement::GetInstance().Main(argc, argv, rawParam);
858 ASSERT_EQ(ret, DumpStatus::DUMP_FAIL);
859 }
860
861 /**
862 * @tc.name: HelpDumperTest001
863 * @tc.desc: Test hidumper -h
864 * @tc.type: FUNC
865 */
866 HWTEST_F(HidumperDumpersTest, HelpDumperTest001, TestSize.Level1)
867 {
868 char *argv[] = {
869 const_cast<char *>("hidumper"),
870 const_cast<char *>("-h"),
871 };
872 int argc = sizeof(argv) / sizeof(argv[0]);
873 std::vector<std::u16string> args;
874 std::shared_ptr<RawParam> rawParam = std::make_shared<RawParam>(0, 1, 0, args, -1);
875 int ret = DumpImplement::GetInstance().Main(argc, argv, rawParam);
876 ASSERT_EQ(ret, DumpStatus::DUMP_HELP);
877 }
878
879 /**
880 * @tc.name: InvalidArgTest001
881 * @tc.desc: Test invalid args
882 * @tc.type: FUNC
883 */
884 HWTEST_F(HidumperDumpersTest, InvalidArgTest001, TestSize.Level1)
885 {
886 int argc = ARG_MAX_COUNT + 1;
887 std::shared_ptr<DumperParameter> ptrDumperParameter = std::make_shared<DumperParameter>();
888 int ret = DumpImplement::GetInstance().CmdParse(argc, nullptr, ptrDumperParameter);
889 ASSERT_EQ(ret, DumpStatus::DUMP_FAIL);
890 char *argv[] = {
891 const_cast<char *>("hidumper"),
892 const_cast<char *>("-h"),
893 nullptr,
894 };
895 argc = sizeof(argv) / sizeof(argv[0]);
896 ret = DumpImplement::GetInstance().CmdParse(argc, argv, ptrDumperParameter);
897 ASSERT_EQ(ret, DumpStatus::DUMP_FAIL);
898 }
899
900 /**
901 * @tc.name: InvalidArgTest002
902 * @tc.desc: Test invalid args
903 * @tc.type: FUNC
904 */
905 HWTEST_F(HidumperDumpersTest, InvalidArgTest002, TestSize.Level1)
906 {
907 char *argv[] = {
908 const_cast<char *>("hidumper"),
909 const_cast<char *>("-h"),
910 const_cast<char *>(""),
911 };
912 int argc = sizeof(argv) / sizeof(argv[0]);
913 std::shared_ptr<DumperParameter> ptrDumperParameter = std::make_shared<DumperParameter>();
914 int ret = DumpImplement::GetInstance().CmdParse(argc, argv, ptrDumperParameter);
915 ASSERT_EQ(ret, DumpStatus::DUMP_FAIL);
916 }
917
918 /**
919 * @tc.name: InvalidArgTest003
920 * @tc.desc: Test invalid args
921 * @tc.type: FUNC
922 */
923 HWTEST_F(HidumperDumpersTest, InvalidArgTest003, TestSize.Level1)
924 {
925 std::string largeStr(SINGLE_ARG_MAXLEN + 1, 'a');
926 char *argv[] = {
927 const_cast<char *>("hidumper"),
928 const_cast<char *>("-h"),
929 const_cast<char *>(largeStr.c_str()),
930 };
931 int argc = sizeof(argv) / sizeof(argv[0]);
932 std::shared_ptr<DumperParameter> ptrDumperParameter = std::make_shared<DumperParameter>();
933 int ret = DumpImplement::GetInstance().CmdParse(argc, argv, ptrDumperParameter);
934 ASSERT_EQ(ret, DumpStatus::DUMP_FAIL);
935 }
936
937 /**
938 * @tc.name: InvalidArgTest004
939 * @tc.desc: Test invalid args for RawParam
940 * @tc.type: FUNC
941 */
942 HWTEST_F(HidumperDumpersTest, InvalidArgTest004, TestSize.Level1)
943 {
944 std::vector<std::u16string> args;
945 std::shared_ptr<RawParam> rawParam = std::make_shared<RawParam>(0, 1, 0, args, -1);
946 rawParam->Init(args);
947 ASSERT_TRUE(args.size() == 0);
948 args.push_back(Str8ToStr16("test"));
949 rawParam->Init(args);
950 ASSERT_TRUE(args.size() == 0);
951 }
952
953 /**
954 * @tc.name: SendErrorMsgTest001
955 * @tc.desc: Test error msg.
956 * @tc.type: FUNC
957 */
958 HWTEST_F(HidumperDumpersTest, SendErrorMsgTest001, TestSize.Level1)
959 {
960 DumpImplement::GetInstance().SendReleaseAppErrorMessage("--mem-smaps");
961 ASSERT_TRUE(DumpImplement::GetInstance().ptrReqCtl_ == nullptr);
962 std::vector<std::u16string> args;
963 DumpImplement::GetInstance().ptrReqCtl_ = std::make_shared<RawParam>(0, 1, 0, args, -1);
964 DumpImplement::GetInstance().SendReleaseAppErrorMessage("--mem-smaps");
965 }
966
967 /**
968 * @tc.name: SendErrorMsgTest002
969 * @tc.desc: Test error msg.
970 * @tc.type: FUNC
971 */
972 HWTEST_F(HidumperDumpersTest, SendErrorMsgTest002, TestSize.Level1)
973 {
974 DumpImplement::GetInstance().ptrReqCtl_ = nullptr;
975 DumpImplement::GetInstance().SendReleaseVersionErrorMessage("-t");
976 ASSERT_TRUE(DumpImplement::GetInstance().ptrReqCtl_ == nullptr);
977 std::vector<std::u16string> args;
978 DumpImplement::GetInstance().ptrReqCtl_ = std::make_shared<RawParam>(0, 1, 0, args, -1);
979 DumpImplement::GetInstance().SendReleaseVersionErrorMessage("-t");
980 }
981 /**
982 * @tc.name: CjHeapDumperTest001
983 * @tc.desc: Test CjHeapDumper with init pid
984 * @tc.type: FUNC
985 */
986 HWTEST_F(HidumperDumpersTest, CjHeapDumperTest001, TestSize.Level1)
987 {
988 char *argv[] = {
989 const_cast<char *>("hidumper"),
990 const_cast<char *>("--mem-cjheap"),
991 const_cast<char *>("1"),
992 };
993 int argc = sizeof(argv) / sizeof(argv[0]);
994 std::vector<std::u16string> args;
995 std::shared_ptr<RawParam> rawParam = std::make_shared<RawParam>(0, 1, 0, args, -1);
996 int ret = DumpImplement::GetInstance().Main(argc, argv, rawParam);
997 ASSERT_EQ(ret, DumpStatus::DUMP_OK);
998 }
999
1000 /**
1001 * @tc.name: CjHeapDumperTest002
1002 * @tc.desc: Test CjHeapDumper with init pid and trigger gc.
1003 * @tc.type: FUNC
1004 */
1005 HWTEST_F(HidumperDumpersTest, CjHeapDumperTest002, TestSize.Level1)
1006 {
1007 char *argv[] = {
1008 const_cast<char *>("hidumper"),
1009 const_cast<char *>("--mem-cjheap"),
1010 const_cast<char *>("1"),
1011 const_cast<char *>("--gc"),
1012 };
1013 int argc = sizeof(argv) / sizeof(argv[0]);
1014 std::vector<std::u16string> args;
1015 std::shared_ptr<RawParam> rawParam = std::make_shared<RawParam>(0, 1, 0, args, -1);
1016 int ret = DumpImplement::GetInstance().Main(argc, argv, rawParam);
1017 ASSERT_EQ(ret, DumpStatus::DUMP_OK);
1018 }
1019
1020 /**
1021 * @tc.name: CjHeapDumperTest003
1022 * @tc.desc: Test CjHeapDumper with nullptr parameter.
1023 * @tc.type: FUNC
1024 */
1025 HWTEST_F(HidumperDumpersTest, CjHeapDumperTest003, TestSize.Level1)
1026 {
1027 auto CjHeapDumper = std::make_unique<CjHeapMemoryDumper>();
1028 DumpStatus ret = CjHeapDumper->PreExecute(nullptr, g_dump_datas);
1029 ASSERT_EQ(ret, DumpStatus::DUMP_FAIL);
1030 }
1031
1032 /**
1033 * @tc.name: CjHeapDumperTest004
1034 * @tc.desc: Test CjHeapDumper with init pid and dump jsleaklist
1035 * @tc.type: FUNC
1036 */
1037 HWTEST_F(HidumperDumpersTest, CjHeapDumperTest004, TestSize.Level1)
1038 {
1039 char *argv[] = {
1040 const_cast<char *>("hidumper"),
1041 const_cast<char *>("--mem-cjheap"),
1042 const_cast<char *>("1"),
1043 const_cast<char *>("--leakobj"),
1044 };
1045 int argc = sizeof(argv) / sizeof(argv[0]);
1046 std::vector<std::u16string> args;
1047 std::shared_ptr<RawParam> rawParam = std::make_shared<RawParam>(0, 1, 0, args, -1);
1048 int ret = DumpImplement::GetInstance().Main(argc, argv, rawParam);
1049 ASSERT_EQ(ret, DumpStatus::DUMP_OK);
1050 }
1051
1052 /**
1053 * @tc.name: PruneHeapDumperTest001
1054 * @tc.desc: Test PruneHeapDumperTest001
1055 * @tc.type: FUNC
1056 */
1057 HWTEST_F(HidumperDumpersTest, PruneHeapDumperTest001, TestSize.Level1)
1058 {
1059 char *argv[] = {
1060 const_cast<char *>("hidumper"),
1061 const_cast<char *>("--mem"),
1062 const_cast<char *>("--prune"),
1063 };
1064 int argc = sizeof(argv) / sizeof(argv[0]);
1065 std::vector<std::u16string> args;
1066 std::shared_ptr<RawParam> rawParam = std::make_shared<RawParam>(0, 1, 0, args, -1);
1067 int ret = DumpImplement::GetInstance().Main(argc, argv, rawParam);
1068 ASSERT_EQ(ret, DumpStatus::DUMP_OK);
1069 }
1070 } // namespace HiviewDFX
1071 } // namespace OHOS