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