1 /*
2 * Copyright (c) 2022 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 "utility_common_utils_test.h"
17
18 #include <unistd.h>
19
20 #include "calc_fingerprint.h"
21 #include "file_util.h"
22 #include "log_parse.h"
23 #include "tbox.h"
24
25 using namespace std;
26
27 namespace OHOS {
28 namespace HiviewDFX {
29 namespace {
30 const char LOG_FILE_PATH[] = "/data/test/hiview_utility_test/";
31 constexpr int SUFFIX_0 = 0;
32
GetLogDir(std::string & testCaseName)33 std::string GetLogDir(std::string& testCaseName)
34 {
35 std::string workPath = std::string(LOG_FILE_PATH);
36 if (workPath.back() != '/') {
37 workPath = workPath + "/";
38 }
39 workPath.append(testCaseName);
40 workPath.append("/");
41 std::string logDestDir = workPath;
42 if (!FileUtil::FileExists(logDestDir)) {
43 FileUtil::ForceCreateDirectory(logDestDir, FileUtil::FILE_PERM_770);
44 }
45 return logDestDir;
46 }
47
GenerateLogFileName(std::string & testCaseName,int index)48 std::string GenerateLogFileName(std::string& testCaseName, int index)
49 {
50 return GetLogDir(testCaseName) + "testFile" + std::to_string(index);
51 }
52 }
53
SetUpTestCase()54 void UtilityCommonUtilsTest::SetUpTestCase() {}
55
TearDownTestCase()56 void UtilityCommonUtilsTest::TearDownTestCase() {}
57
SetUp()58 void UtilityCommonUtilsTest::SetUp() {}
59
TearDown()60 void UtilityCommonUtilsTest::TearDown()
61 {
62 (void)FileUtil::ForceRemoveDirectory(LOG_FILE_PATH);
63 }
64
65 /**
66 * @tc.name: CalcFingerprintTest001
67 * @tc.desc: Test CalcFileSha interface method of class CalcFingerprint
68 * @tc.type: FUNC
69 * @tc.require: issueI65DUW
70 */
71 HWTEST_F(UtilityCommonUtilsTest, CalcFingerprintTest001, testing::ext::TestSize.Level3)
72 {
73 (void)FileUtil::ForceRemoveDirectory(LOG_FILE_PATH);
74 std::string caseName = "CalcFingerprintTest001";
75 CalcFingerprint calcFingerprint;
76 char hash[SHA256_DIGEST_LENGTH] = {0};
77 auto ret = calcFingerprint.CalcFileSha("", hash, SHA256_DIGEST_LENGTH);
78 ASSERT_EQ(EINVAL, ret);
79 ret = calcFingerprint.CalcFileSha(GenerateLogFileName(caseName, SUFFIX_0), hash, SHA256_DIGEST_LENGTH);
80 ASSERT_EQ(ENOENT, ret);
81 ret = calcFingerprint.CalcFileSha("//....../asdsa", hash, SHA256_DIGEST_LENGTH);
82 ASSERT_EQ(EINVAL, ret);
83 FileUtil::SaveStringToFile(GenerateLogFileName(caseName, SUFFIX_0), "test");
84 ret = calcFingerprint.CalcFileSha(GenerateLogFileName(caseName, SUFFIX_0), nullptr, SHA256_DIGEST_LENGTH);
85 ASSERT_EQ(EINVAL, ret);
86 int invalidLen = 2;
87 ret = calcFingerprint.CalcFileSha(GenerateLogFileName(caseName, SUFFIX_0), hash, invalidLen);
88 ASSERT_EQ(ENOMEM, ret);
89 }
90
91 /**
92 * @tc.name: CalcFingerprintTest002
93 * @tc.desc: Test CalcBufferSha interface method of class CalcFingerprint
94 * @tc.type: FUNC
95 * @tc.require: issueI65DUW
96 */
97 HWTEST_F(UtilityCommonUtilsTest, CalcFingerprintTest002, testing::ext::TestSize.Level3)
98 {
99 (void)FileUtil::ForceRemoveDirectory(LOG_FILE_PATH);
100 CalcFingerprint calcFingerprint;
101 char hash[SHA256_DIGEST_LENGTH] = {0};
102 std::string buffer1 = "";
103 auto ret = calcFingerprint.CalcBufferSha(buffer1, buffer1.size(), hash, SHA256_DIGEST_LENGTH);
104 ASSERT_EQ(EINVAL, ret);
105 std::string buffer2 = "123";
106 ret = calcFingerprint.CalcBufferSha(buffer2, buffer2.size(), nullptr, SHA256_DIGEST_LENGTH);
107 ASSERT_EQ(EINVAL, ret);
108 }
109
110 /* @tc.name: LogParseTest001
111 * @tc.desc: Test IsIgnoreLibrary interface method of class LogParse
112 * @tc.type: FUNC
113 * @tc.require: issueI65DUW
114 */
115 HWTEST_F(UtilityCommonUtilsTest, LogParseTest001, testing::ext::TestSize.Level3)
116 {
117 LogParse logParse;
118 auto ret = logParse.IsIgnoreLibrary("watchdog");
119 ASSERT_TRUE(ret);
120 ret = logParse.IsIgnoreLibrary("ohos");
121 ASSERT_TRUE(!ret);
122 }
123
124 /* @tc.name: LogParseTest002
125 * @tc.desc: Test MatchExceptionLibrary interface method of class LogParse
126 * @tc.type: FUNC
127 * @tc.require: issueI65DUW
128 */
129 HWTEST_F(UtilityCommonUtilsTest, LogParseTest002, testing::ext::TestSize.Level3)
130 {
131 LogParse logParse;
132 auto ret = logParse.MatchExceptionLibrary("IllegalAccessExceptionWrapper");
133 ASSERT_EQ("IllegalAccessException", ret);
134 ret = logParse.MatchExceptionLibrary("NoException");
135 ASSERT_EQ(LogParse::UNMATCHED_EXCEPTION, ret);
136 }
137
138 /* @tc.name: TboxTest001
139 * @tc.desc: Test interfaces method of class Tbox
140 * @tc.type: FUNC
141 * @tc.require: issueI65DUW
142 */
143 HWTEST_F(UtilityCommonUtilsTest, TboxTest001, testing::ext::TestSize.Level3)
144 {
145 auto tboxSp = make_shared<Tbox>(); // trigger con/destrcutor
146 std::string val = "123";
147 size_t mask = 1;
148 int mode1 = FP_FILE;
149 auto ret = Tbox::CalcFingerPrint(val, mask, mode1);
150 ASSERT_TRUE(!ret.empty());
151 int mode2 = FP_BUFFER;
152 ret = Tbox::CalcFingerPrint(val, mask, mode2);
153 ASSERT_TRUE(!ret.empty());
154 int invalidMode = -1;
155 ret = Tbox::CalcFingerPrint(val, mask, invalidMode);
156 ASSERT_TRUE(ret == "0");
157 std::string stackName = "-_";
158 auto ret2 = Tbox::IsCallStack(stackName);
159 ASSERT_TRUE(ret2);
160 std::string stackName2 = "123";
161 auto ret3 = Tbox::IsCallStack(stackName2);
162 ASSERT_TRUE(ret3);
163 auto ret4 = Tbox::HasCausedBy("Caused by:Invalid description");
164 ASSERT_TRUE(ret4);
165 auto ret5 = Tbox::HasCausedBy("Suppressed:Invalid description");
166 ASSERT_TRUE(ret5);
167 auto ret6 = Tbox::HasCausedBy("Invalid description");
168 ASSERT_TRUE(!ret6);
169 }
170
171 /* @tc.name: TboxTest002
172 * @tc.desc: Test GetStackName method of class Tbox
173 * @tc.type: FUNC
174 * @tc.require: issueI65DUW
175 */
176 HWTEST_F(UtilityCommonUtilsTest, TboxTest002, testing::ext::TestSize.Level3)
177 {
178 auto ret = Tbox::GetStackName(" at DES)");
179 ASSERT_EQ("DES", ret);
180 ret = Tbox::GetStackName(" - DES(");
181 ASSERT_EQ("unknown", ret);
182 ret = Tbox::GetStackName(" - DE+S(");
183 ASSERT_EQ("DE)", ret);
184 }
185
186 /* @tc.name: TboxTest003
187 * @tc.desc: Test WaitForDoneFile method of class Tbox
188 * @tc.type: FUNC
189 * @tc.require: issueI65DUW
190 */
191 HWTEST_F(UtilityCommonUtilsTest, TboxTest003, testing::ext::TestSize.Level3)
192 {
193 (void)FileUtil::ForceRemoveDirectory(LOG_FILE_PATH);
194 std::string caseName = "TboxTest003";
195 auto ret = Tbox::WaitForDoneFile(GenerateLogFileName(caseName, SUFFIX_0), 1);
196 ASSERT_TRUE(!ret);
197 FileUtil::SaveStringToFile(GenerateLogFileName(caseName, SUFFIX_0), "test");
198 ret = Tbox::WaitForDoneFile(GenerateLogFileName(caseName, SUFFIX_0), 1);
199 ASSERT_TRUE(ret);
200 }
201
202 /* @tc.name: TboxTest004
203 * @tc.desc: Test FilterTrace method of class Tbox
204 * @tc.type: FUNC
205 * @tc.require: DTS2023061410216
206 */
207 HWTEST_F(UtilityCommonUtilsTest, TboxTest004, testing::ext::TestSize.Level3)
208 {
209 std::string stack = R"("#00 pc 00000000000cfaac /system/lib/ld-musl-aarch64.so.1
210 #01 pc 00000000000cfc60 /system/lib/ld-musl-aarch64.so.1(raise+76)
211 #02 pc 0000000000094c98 /system/lib/ld-musl-aarch64.so.1(abort+20)
212 #03 pc 00000000000af8d8 /system/lib64/libc++.so(c790e35ba2b0181d76f8e722e0f6670ff6aaf23c)
213 #04 pc 0000000000098004 /system/lib64/libc++.so(c790e35ba2b0181d76f8e722e0f6670ff6aaf23c)
214 #05 pc 00000000000aea80 /system/lib64/libc++.so(c790e35ba2b0181d76f8e722e0f6670ff6aaf23c)
215 #06 pc 00000000000b1d6c /system/lib64/libc++.so(__cxa_rethrow+216)(c790e35ba2b0181d76f8e722e0f6670ff6aaf23c)
216 #07 pc 000000000010020c /system/lib64/libbms.z.so(3256be1e0b8fdc2b4e25a28f1c2086eb)
217 #08 pc 0000000000105e58 /system/lib64/libbms.z.so(3256be1e0b8fdc2b4e25a28f1c2086eb)
218 #09 pc 00000000001d478c /system/lib64/libbms.z.so(3256be1e0b8fdc2b4e25a28f1c2086eb)
219 #10 pc 00000000000d6ea8 /system/lib64/libbms.z.so(3256be1e0b8fdc2b4e25a28f1c2086eb)
220 #11 pc 00000000000d869c /system/lib64/libbms.z.so(3256be1e0b8fdc2b4e25a28f1c2086eb)
221 #12 pc 00000000000d614c /system/lib64/libbms.z.so(3256be1e0b8fdc2b4e25a28f1c2086eb)
222 #13 pc 00000000000d5454 /system/lib64/libbms.z.so(3256be1e0b8fdc2b4e25a28f1c2086eb)
223 #14 pc 0000000000130928 /system/lib64/libbms.z.so(3256be1e0b8fdc2b4e25a28f1c2086eb)
224 #15 pc 0000000000091c3c /system/lib64/libappexecfwk_core.z.so(OHOS::AppExecFwk::BundleMgrHost
225 #16 pc 00000000000a27b0 /system/lib64/libappexecfwk_corOHOS::MessageOption&)+1004)
226 #17 pc 0000000000034efc /system/lib64/platformsdk/libipc_core.z.so(OHOS::BinderInvoker::OnTransaction
227 #18 pc 0000000000035554 /system/lib64/platformsdk/libipc_core.z.so(OHOS::BinderInvoker::HandleCommandsInner
228 #19 pc 00000000000348b4 /system/lib64/platformsdk/libipc_core.z.so(OHOS::BinderInvoker::HandleCommands
229 #20 pc 0000000000034820 /system/lib64/platformsdk/libipc_core.z.so(OHOS::BinderInvoker::StartWorkLoop()
230 #21 pc 00000000000355f4 /system/lib64/platformsdk/libipc_core.z.so(OHOS::BinderInvoker::JoinThread(bool)
231 #22 pc 000000000002ff24 /system/lib64/platformsdk/libipc_core.z.so(OHOS::IPCWorkThread::ThreadHandler)
232 #23 pc 00000000000e4934 /system/lib/ld-musl-aarch64.so.1
233 #24 pc 00000000000876b4 /system/lib/ld-musl-aarch64.so.1")";
234
235 std::map<std::string, std::string> eventInfos;
236 eventInfos.insert(std::pair("END_STACK", stack));
237 eventInfos.insert(std::pair("PNAME", "foundation"));
238 Tbox::FilterTrace(eventInfos);
239
240 EXPECT_STREQ(eventInfos["FIRST_FRAME"].c_str(), "/system/lib64/libbms.z.so(3256be1e0b8fdc2b4e25a28f1c2086eb)");
241 EXPECT_STREQ(eventInfos["SECOND_FRAME"].c_str(), "/system/lib64/libbms.z.so(3256be1e0b8fdc2b4e25a28f1c2086eb)");
242 EXPECT_STREQ(eventInfos["LAST_FRAME"].c_str(),
243 "/system/lib64/platformsdk/libipc_core.z.so(OHOS::IPCWorkThread::ThreadHandler)");
244 }
245
246 /* @tc.name: TboxTest005
247 * @tc.desc: Test FilterTrace method of class Tbox
248 * @tc.type: FUNC
249 * @tc.require: DTS2023061410216
250 */
251 HWTEST_F(UtilityCommonUtilsTest, TboxTest005, testing::ext::TestSize.Level3)
252 {
253 std::string stack = R"("#00 pc 000000000006ca40 /system/lib64/libc.so(syscall+32)
254 #01 pc 0000000000070cc4 /system/lib64/libc.so(__futex_wait_ex(void volatile*, bool, timespec const*)+144)
255 #02 pc 00000000000cf2cc /system/lib64/libc.so(pthread_cond_timedwait+124)
256 #03 pc 0000000000071714 /system/lib64/libc++.so(std::__1::condition_variable)
257 #04 pc 000000000001a33c /system/lib64/libeventhandler.z.so(OHOS::AppExecFwk::NoneIoWaiter)
258 #05 pc 0000000000011db4 /system/lib64/libeventhandler.z.so(OHOS::AppExecFwk::EventQueue::WaitUntilLocked)
259 #06 pc 0000000000011cf8 /system/lib64/libeventhandler.z.so(OHOS::AppExecFwk::EventQueue::GetEvent()+112)
260 #07 pc 0000000000017728 /system/lib64/libeventhandler.z.so
261 #08 pc 000000000001608c /system/lib64/libeventhandler.z.so(OHOS::AppExecFwk::EventRunner::Run()+96)
262 #09 pc 000000000009380c /system/lib64/libappkit_native.z.so(OHOS::AppExecFwk::MainThread::Start()+372)
263 #10 pc 00000000000144b8 /system/bin/appspawn
264 #11 pc 00000000000139ec /system/bin/appspawn
265 #12 pc 000000000001fd90 /system/lib64/libbegetutil.z.so
266 #13 pc 000000000001f980 /system/lib64/libbegetutil.z.so
267 #14 pc 000000000001ccd0 /system/lib64/libbegetutil.z.so(ProcessEvent+108)
268 #15 pc 000000000001c6cc /system/lib64/libbegetutil.z.so
269 #16 pc 00000000000128b4 /system/bin/appspawn
270 #17 pc 000000000001053c /system/bin/appspawn
271 #18 pc 000000000006afa4 /system/lib64/libc.so(__libc_init+112")";
272
273 std::map<std::string, std::string> eventInfos;
274 eventInfos.insert(std::pair("END_STACK", stack));
275 eventInfos.insert(std::pair("PNAME", "foundation"));
276 Tbox::FilterTrace(eventInfos);
277
278 EXPECT_STREQ(eventInfos["FIRST_FRAME"].c_str(),
279 "/system/lib64/libeventhandler.z.so(OHOS::AppExecFwk::NoneIoWaiter)");
280 EXPECT_STREQ(eventInfos["SECOND_FRAME"].c_str(),
281 "/system/lib64/libeventhandler.z.so(OHOS::AppExecFwk::EventQueue::WaitUntilLocked)");
282 EXPECT_STREQ(eventInfos["LAST_FRAME"].c_str(), "/system/bin/appspawn");
283 }
284
285 /* @tc.name: TboxTest006
286 * @tc.desc: Test WaitForDoneFile method of class Tbox
287 * @tc.type: FUNC
288 * @tc.require: issueI8Z9FF
289 */
290 HWTEST_F(UtilityCommonUtilsTest, TboxTest006, testing::ext::TestSize.Level3)
291 {
292 std::string timeStr = "197001060319";
293
294 auto happenTime = Tbox::GetHappenTime(timeStr, "(\\d{4})(\\d{2})(\\d{2})(\\d{2})(\\d{2})(\\d{2})");
295
296 ASSERT_TRUE(!happenTime);
297 }
298
299 /* @tc.name: TboxTest007
300 * @tc.desc: Test WaitForDoneFile method of class Tbox
301 * @tc.type: FUNC
302 * @tc.require: issueI8Z9FF
303 */
304 HWTEST_F(UtilityCommonUtilsTest, TboxTest007, testing::ext::TestSize.Level3)
305 {
306 std::string timeStr = "19700106031950";
307
308 auto happenTime = Tbox::GetHappenTime(timeStr, "(\\d{4})(\\d{2})(\\d{2})(\\d{2})(\\d{2})(\\d{2})");
309
310 ASSERT_EQ(happenTime, 415190);
311 }
312
313 /* @tc.name: TboxTest008
314 * @tc.desc: Test WaitForDoneFile method of class Tbox
315 * @tc.type: FUNC
316 * @tc.require: issueI8Z9FF
317 */
318 HWTEST_F(UtilityCommonUtilsTest, TboxTest008, testing::ext::TestSize.Level3)
319 {
320 std::string timeStr = "20240217034255";
321 int64_t timeStrtoTm = 1708112575;
322 int64_t offset = 28800;
323 auto happenTime = Tbox::GetHappenTime(timeStr, "(\\d{4})(\\d{2})(\\d{2})(\\d{2})(\\d{2})(\\d{2})");
324
325 if (happenTime - timeStrtoTm > offset) {
326 ASSERT_EQ(happenTime - timeStrtoTm, offset);
327 } else {
328 ASSERT_TRUE(happenTime);
329 }
330 }
331 }
332 }