1 /*
2 * Copyright (c) 2023 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 <gtest/gtest.h>
17
18 #include <string>
19 #include <unistd.h>
20
21 #include "dfx_define.h"
22 #include "dfx_dump_catcher.h"
23 #include "dfx_test_util.h"
24
25 using namespace testing::ext;
26 using namespace std;
27
28 namespace OHOS {
29 namespace HiviewDFX {
30 namespace {
31 static int g_testPid = 0;
32 }
33 class DumpCatcherCommandTest : public testing::Test {
34 public:
35 static void SetUpTestCase();
36 static void TearDownTestCase();
37 void SetUp();
38 void TearDown();
39 };
40
SetUpTestCase()41 void DumpCatcherCommandTest::SetUpTestCase()
42 {
43 InstallTestHap("/data/FaultloggerdJsTest.hap");
44 string testBundleName = TEST_BUNDLE_NAME;
45 string testAbiltyName = testBundleName + ".MainAbility";
46 g_testPid = LaunchTestHap(testAbiltyName, testBundleName);
47 }
48
TearDownTestCase()49 void DumpCatcherCommandTest::TearDownTestCase()
50 {
51 StopTestHap(TEST_BUNDLE_NAME);
52 UninstallTestHap(TEST_BUNDLE_NAME);
53 }
54
SetUp()55 void DumpCatcherCommandTest::SetUp()
56 {}
57
TearDown()58 void DumpCatcherCommandTest::TearDown()
59 {}
60
61 /**
62 * @tc.name: DumpCatcherCommandTest001
63 * @tc.desc: test dumpcatcher command: -p [accountmgr]
64 * @tc.type: FUNC
65 */
HWTEST_F(DumpCatcherCommandTest, DumpCatcherCommandTest001, TestSize.Level2)66 HWTEST_F(DumpCatcherCommandTest, DumpCatcherCommandTest001, TestSize.Level2)
67 {
68 GTEST_LOG_(INFO) << "DumpCatcherCommandTest001: start.";
69 int testPid = GetProcessPid("accountmgr");
70 string testCommand = "dumpcatcher -p " + to_string(testPid);
71 string dumpRes = ExecuteCommands(testCommand);
72 GTEST_LOG_(INFO) << dumpRes;
73 string log[] = {"Pid:", "Name:", "#00", "#01", "#02"};
74 log[0] = log[0] + to_string(testPid);
75 log[1] = log[1] + "accountmgr";
76 int len = sizeof(log) / sizeof(log[0]);
77 int count = GetKeywordsNum(dumpRes, log, len);
78 EXPECT_EQ(count, len) << "DumpCatcherCommandTest001 Failed";
79 GTEST_LOG_(INFO) << "DumpCatcherCommandTest001: end.";
80 }
81
82 /**
83 * @tc.name: DumpCatcherCommandTest002
84 * @tc.desc: test dumpcatcher command: -p [accountmgr] -t [main thread]
85 * @tc.type: FUNC
86 */
HWTEST_F(DumpCatcherCommandTest, DumpCatcherCommandTest002, TestSize.Level2)87 HWTEST_F(DumpCatcherCommandTest, DumpCatcherCommandTest002, TestSize.Level2)
88 {
89 GTEST_LOG_(INFO) << "DumpCatcherCommandTest002: start.";
90 int testPid = GetProcessPid("accountmgr");
91 string testCommand = "dumpcatcher -p " + to_string(testPid) + " -t " + to_string(testPid);
92 string dumpRes = ExecuteCommands(testCommand);
93 GTEST_LOG_(INFO) << dumpRes;
94 string log[] = {"Pid:", "Name:", "#00", "#01", "#02"};
95 log[0] = log[0] + to_string(testPid);
96 log[1] = log[1] + "accountmgr";
97 int len = sizeof(log) / sizeof(log[0]);
98 int count = GetKeywordsNum(dumpRes, log, len);
99 EXPECT_EQ(count, len) << "DumpCatcherCommandTest002 Failed";
100 GTEST_LOG_(INFO) << "DumpCatcherCommandTest002: end.";
101 }
102
103 /**
104 * @tc.name: DumpCatcherCommandTest003
105 * @tc.desc: test dumpcatcher command: -p [test hap]
106 * @tc.type: FUNC
107 */
HWTEST_F(DumpCatcherCommandTest, DumpCatcherCommandTest003, TestSize.Level2)108 HWTEST_F(DumpCatcherCommandTest, DumpCatcherCommandTest003, TestSize.Level2)
109 {
110 GTEST_LOG_(INFO) << "DumpCatcherCommandTest003: start.";
111 bool isSuccess = g_testPid != 0;
112 if (!isSuccess) {
113 ASSERT_FALSE(isSuccess);
114 GTEST_LOG_(ERROR) << "Failed to launch target hap.";
115 return;
116 }
117 isSuccess = CheckProcessComm(g_testPid, TRUNCATE_TEST_BUNDLE_NAME);
118 if (!isSuccess) {
119 ASSERT_FALSE(isSuccess);
120 GTEST_LOG_(ERROR) << "Error process comm";
121 return;
122 }
123 string testCommand = "dumpcatcher -p " + to_string(g_testPid);
124 string dumpRes = ExecuteCommands(testCommand);
125 GTEST_LOG_(INFO) << dumpRes;
126 string log[] = {"Pid:", "Name:", "#00", "#01", "#02"};
127 log[0] = log[0] + to_string(g_testPid);
128 log[1] = log[1] + TRUNCATE_TEST_BUNDLE_NAME;
129 int len = sizeof(log) / sizeof(log[0]);
130 int count = GetKeywordsNum(dumpRes, log, len);
131 EXPECT_EQ(count, len) << "DumpCatcherCommandTest003 Failed";
132 GTEST_LOG_(INFO) << "DumpCatcherCommandTest003: end.";
133 }
134
135 /**
136 * @tc.name: DumpCatcherCommandTest004
137 * @tc.desc: test dumpcatcher command: -p [test hap] -t [main thread]
138 * @tc.type: FUNC
139 */
HWTEST_F(DumpCatcherCommandTest, DumpCatcherCommandTest004, TestSize.Level2)140 HWTEST_F(DumpCatcherCommandTest, DumpCatcherCommandTest004, TestSize.Level2)
141 {
142 GTEST_LOG_(INFO) << "DumpCatcherCommandTest004: start.";
143 bool isSuccess = g_testPid != 0;
144 if (!isSuccess) {
145 ASSERT_FALSE(isSuccess);
146 GTEST_LOG_(ERROR) << "Failed to launch target hap.";
147 return;
148 }
149 isSuccess = CheckProcessComm(g_testPid, TRUNCATE_TEST_BUNDLE_NAME);
150 if (!isSuccess) {
151 ASSERT_FALSE(isSuccess);
152 GTEST_LOG_(ERROR) << "Error process comm";
153 return;
154 }
155 string testCommand = "dumpcatcher -p " + to_string(g_testPid) + " -t " + to_string(g_testPid);
156 string dumpRes = ExecuteCommands(testCommand);
157 GTEST_LOG_(INFO) << dumpRes;
158 string log[] = {"Pid:", "Name:", "#00", "#01", "#02"};
159 log[0] = log[0] + to_string(g_testPid);
160 log[1] = log[1] + TRUNCATE_TEST_BUNDLE_NAME;
161 int len = sizeof(log) / sizeof(log[0]);
162 int count = GetKeywordsNum(dumpRes, log, len);
163 EXPECT_EQ(count, len) << "DumpCatcherCommandTest004 Failed";
164 GTEST_LOG_(INFO) << "DumpCatcherCommandTest004: end.";
165 }
166
167 /**
168 * @tc.name: DumpCatcherCommandTest005
169 * @tc.desc: test dumpcatcher command: -p [test hap]
170 * @tc.type: FUNC
171 */
HWTEST_F(DumpCatcherCommandTest, DumpCatcherCommandTest005, TestSize.Level2)172 HWTEST_F(DumpCatcherCommandTest, DumpCatcherCommandTest005, TestSize.Level2)
173 {
174 GTEST_LOG_(INFO) << "DumpCatcherCommandTest005: start.";
175 bool isSuccess = g_testPid != 0;
176 if (!isSuccess) {
177 ASSERT_FALSE(isSuccess);
178 GTEST_LOG_(ERROR) << "Failed to launch target hap.";
179 return;
180 }
181 isSuccess = CheckProcessComm(g_testPid, TRUNCATE_TEST_BUNDLE_NAME);
182 if (!isSuccess) {
183 ASSERT_FALSE(isSuccess);
184 GTEST_LOG_(ERROR) << "Error process comm";
185 return;
186 }
187 string testCommand = "dumpcatcher -p " + to_string(g_testPid);
188 string dumpRes = ExecuteCommands(testCommand);
189 GTEST_LOG_(INFO) << dumpRes;
190 string log[] = {"Pid:", "Name:", "#00", "#01", "#02"};
191 log[0] = log[0] + to_string(g_testPid);
192 log[1] = log[1] + TRUNCATE_TEST_BUNDLE_NAME;
193 int len = sizeof(log) / sizeof(log[0]);
194 int count = GetKeywordsNum(dumpRes, log, len);
195 EXPECT_EQ(count, len) << "DumpCatcherCommandTest005 Failed";
196 GTEST_LOG_(INFO) << "DumpCatcherCommandTest005: end.";
197 }
198
199 /**
200 * @tc.name: DumpCatcherCommandTest012
201 * @tc.desc: test dumpcatcher command:
202 * @tc.type: FUNC
203 */
HWTEST_F(DumpCatcherCommandTest, DumpCatcherCommandTest012, TestSize.Level2)204 HWTEST_F(DumpCatcherCommandTest, DumpCatcherCommandTest012, TestSize.Level2)
205 {
206 GTEST_LOG_(INFO) << "DumpCatcherCommandTest012: start.";
207 string procCMD = "dumpcatcher";
208 string procDumpLog = ExecuteCommands(procCMD);
209 EXPECT_EQ(procDumpLog, "") << "DumpCatcherCommandTest012 Failed";
210 GTEST_LOG_(INFO) << "DumpCatcherCommandTest012: end.";
211 }
212
213 /**
214 * @tc.name: DumpCatcherCommandTest013
215 * @tc.desc: test dumpcatcher command: -i
216 * @tc.type: FUNC
217 */
HWTEST_F(DumpCatcherCommandTest, DumpCatcherCommandTest013, TestSize.Level2)218 HWTEST_F(DumpCatcherCommandTest, DumpCatcherCommandTest013, TestSize.Level2)
219 {
220 GTEST_LOG_(INFO) << "DumpCatcherCommandTest013: start.";
221 string procCMD = "dumpcatcher -i";
222 string procDumpLog = ExecuteCommands(procCMD);
223 string log[] = {"Usage:"};
224 int expectNum = sizeof(log) / sizeof(log[0]);
225 int count = GetKeywordsNum(procDumpLog, log, expectNum);
226 EXPECT_EQ(count, expectNum) << "DumpCatcherCommandTest013 Failed";
227 GTEST_LOG_(INFO) << "DumpCatcherCommandTest013: end.";
228 }
229
230 /**
231 * @tc.name: DumpCatcherCommandTest014
232 * @tc.desc: test dumpcatcher command: -p 1 tid 1
233 * @tc.type: FUNC
234 * @tc.require: issueI5PJ9O
235 */
HWTEST_F(DumpCatcherCommandTest, DumpCatcherCommandTest014, TestSize.Level2)236 HWTEST_F(DumpCatcherCommandTest, DumpCatcherCommandTest014, TestSize.Level2)
237 {
238 GTEST_LOG_(INFO) << "DumpCatcherCommandTest014: start.";
239 string systemui = "init";
240 string procCMD = "dumpcatcher -p 1 -t 1";
241 string procDumpLog = ExecuteCommands(procCMD);
242 GTEST_LOG_(INFO) << "procDumpLog: " << procDumpLog;
243 string log[] = {"Pid:1", "Name:init", "#00", "#01", "#02"};
244 int len = sizeof(log) / sizeof(log[0]);
245 int count = GetKeywordsNum(procDumpLog, log, len);
246 EXPECT_EQ(count, len) << "DumpCatcherCommandTest014 Failed";
247 GTEST_LOG_(INFO) << "DumpCatcherCommandTest014: end.";
248 }
249
250 /**
251 * @tc.name: DumpCatcherCommandTest015
252 * @tc.desc: test dumpcatcher abnormal scenario
253 * @tc.type: FUNC
254 */
HWTEST_F(DumpCatcherCommandTest, DumpCatcherCommandTest015, TestSize.Level2)255 HWTEST_F(DumpCatcherCommandTest, DumpCatcherCommandTest015, TestSize.Level2)
256 {
257 GTEST_LOG_(INFO) << "DumpCatcherCommandTest015: start.";
258 std::shared_ptr<DfxDumpCatcher> dump = make_shared<DfxDumpCatcher>();
259 std::string msg = "";
260 bool ret = dump->DoDumpCurrTid(0, msg, 0);
261 ASSERT_EQ(ret, false);
262 ret = dump->DoDumpLocalTid(-1, msg, 0);
263 ASSERT_EQ(ret, false);
264 ret = dump->DoDumpLocalPid(-1, msg, 0);
265 ASSERT_EQ(ret, false);
266 std::vector<int> pidV;
267 ret = dump->DumpCatchMultiPid(pidV, msg);
268 ASSERT_EQ(ret, false);
269 GTEST_LOG_(INFO) << "DumpCatcherCommandTest015: end.";
270 }
271 } // namespace HiviewDFX
272 } // namepsace OHOS