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#include <sys/stat.h>
18#include <ctime>
19#include <securec.h>
20#include <string>
21#include <vector>
22#include "dfx_define.h"
23#include "dfx_util.h"
24#include "dfx_dump_res.h"
25#include "dfx_log.h"
26#include "string_util.h"
27
28using namespace OHOS::HiviewDFX;
29using namespace testing::ext;
30using namespace std;
31
32namespace OHOS {
33namespace HiviewDFX {
34class CommonTest : public testing::Test {
35public:
36    static void SetUpTestCase(void) {}
37    static void TearDownTestCase(void) {}
38    void SetUp() {}
39    void TearDown() {}
40};
41
42static void getLibPathsBySystemBits(vector<std::string> &filePaths)
43{
44    std::vector<std::string> lib64FilePaths = {
45        "/system/lib64/librustc_demangle.z.so",
46        "/system/lib64/libstacktrace_rust.dylib.so",
47        "/system/lib64/libpanic_handler.dylib.so",
48        "/system/lib64/platformsdk/libjson_stack_formatter.z.so",
49        "/system/lib64/chipset-pub-sdk/libdfx_dumpcatcher.z.so",
50        "/system/lib64/chipset-pub-sdk/libfaultloggerd.z.so",
51        "/system/lib64/chipset-pub-sdk/libdfx_signalhandler.z.so",
52        "/system/lib64/chipset-pub-sdk/libasync_stack.z.so",
53        "/system/lib64/chipset-pub-sdk/libbacktrace_local.so",
54        "/system/lib64/chipset-pub-sdk/libunwinder.z.so",
55        "/system/lib64/chipset-pub-sdk/libdfx_procinfo.z.so",
56        "/system/lib64/chipset-pub-sdk/libcrash_exception.z.so",
57        "/system/lib64/module/libfaultlogger_napi.z.so"
58    };
59    std::vector<std::string> libFilePaths = {
60        "/system/lib/librustc_demangle.z.so",
61        "/system/lib/libstacktrace_rust.dylib.so",
62        "/system/lib/libpanic_handler.dylib.so",
63        "/system/lib/platformsdk/libjson_stack_formatter.z.so",
64        "/system/lib/chipset-pub-sdk/libdfx_dumpcatcher.z.so",
65        "/system/lib/chipset-pub-sdk/libfaultloggerd.z.so",
66        "/system/lib/chipset-pub-sdk/libdfx_signalhandler.z.so",
67        "/system/lib/chipset-pub-sdk/libasync_stack.z.so",
68        "/system/lib/chipset-pub-sdk/libbacktrace_local.so",
69        "/system/lib/chipset-pub-sdk/libunwinder.z.so",
70        "/system/lib/chipset-pub-sdk/libdfx_procinfo.z.so",
71        "/system/lib/chipset-pub-sdk/libcrash_exception.z.so",
72        "/system/lib/module/libfaultlogger_napi.z.so"
73    };
74#ifdef __LP64__
75    filePaths.insert(filePaths.end(), lib64FilePaths.begin(), lib64FilePaths.end());
76#else
77    filePaths.insert(filePaths.end(), libFilePaths.begin(), libFilePaths.end());
78#endif
79}
80
81namespace {
82#ifdef LOG_DOMAIN
83#undef LOG_DOMAIN
84#define LOG_DOMAIN 0xD002D11
85#endif
86
87#ifdef LOG_TAG
88#undef LOG_TAG
89#define LOG_TAG "DfxCommonTest"
90#endif
91
92/**
93 * @tc.name: DfxUtilTest001
94 * @tc.desc: test DfxUtil GetCurrentTimeStr
95 * @tc.type: FUNC
96 */
97HWTEST_F(CommonTest, DfxUtilTest001, TestSize.Level2)
98{
99    GTEST_LOG_(INFO) << "DfxUtilTest001: start.";
100    time_t now = time(nullptr);
101    std::string timeStr = GetCurrentTimeStr(static_cast<uint64_t>(now));
102    GTEST_LOG_(INFO) << timeStr;
103    ASSERT_NE(timeStr, "invalid timestamp\n");
104    now += 100000; // 100000 : test time offset
105    timeStr = GetCurrentTimeStr(static_cast<uint64_t>(now));
106    GTEST_LOG_(INFO) << timeStr;
107    ASSERT_NE(timeStr, "invalid timestamp\n");
108    GTEST_LOG_(INFO) << "DfxUtilTest001: end.";
109}
110
111/**
112 * @tc.name: DfxUtilTest002
113 * @tc.desc: test DfxUtil TrimAndDupStr
114 * @tc.type: FUNC
115 */
116HWTEST_F(CommonTest, DfxUtilTest002, TestSize.Level2)
117{
118    GTEST_LOG_(INFO) << "DfxUtilTest002: start.";
119    std::string testStr = " abcd  ";
120    std::string resStr;
121    bool ret = TrimAndDupStr(testStr, resStr);
122    ASSERT_EQ(ret, true);
123    ASSERT_EQ(resStr, "abcd");
124    GTEST_LOG_(INFO) << "DfxUtilTest002: end.";
125}
126
127/**
128 * @tc.name: DfxDumpResTest001
129 * @tc.desc: test DfxDumpRes functions
130 * @tc.type: FUNC
131 */
132HWTEST_F(CommonTest, DfxDumpResTest001, TestSize.Level2)
133{
134    GTEST_LOG_(INFO) << "DfxDumpResTest001: start.";
135    int32_t res = DUMP_ESUCCESS;
136    std::string result = DfxDumpRes::ToString(res);
137    ASSERT_EQ(result, "0 ( no error )");
138    GTEST_LOG_(INFO) << "DfxDumpResTest001: end.";
139}
140
141/**
142 * @tc.name: StringUtilTest001
143 * @tc.desc: test StartsWith functions
144 * @tc.type: FUNC
145 */
146HWTEST_F(CommonTest, StringUtilTest001, TestSize.Level2)
147{
148    GTEST_LOG_(INFO) << "StringUtilTest001: start.";
149    std::string start = "[anon:ArkTS Code2024]";
150    bool ret = StartsWith(start, "[anon:ArkTS Code");
151    EXPECT_TRUE(ret);
152    std::string end = "test.hap";
153    ret = EndsWith(end, ".hap");
154    EXPECT_TRUE(ret);
155    GTEST_LOG_(INFO) << "StringUtilTest001: end.";
156}
157
158/**
159 * @tc.name: ROMBaselineTest001
160 * @tc.desc: test the ROM baseline of the faultloggerd component
161 * @tc.type: FUNC
162 */
163HWTEST_F(CommonTest, ROMBaselineTest001, TestSize.Level2)
164{
165    GTEST_LOG_(INFO) << "ROMBaselineTest001: start.";
166    std::vector<std::string> filePaths = {
167        "/system/etc/faultlogger.conf",
168        "/system/etc/param/faultloggerd.para",
169        "/system/etc/param/faultloggerd.para.dac",
170        "/system/etc/init/faultloggerd.cfg",
171        "/system/etc/hiview/extract_rule.json",
172        "/system/etc/hiview/compose_rule.json",
173        "/system/bin/processdump",
174        "/system/bin/faultloggerd",
175        "/system/bin/dumpcatcher",
176        "/system/bin/crashvalidator"
177    };
178    getLibPathsBySystemBits(filePaths);
179    struct stat fileStat;
180    long long totalSize = 0;
181    constexpr long long sectorSize = 4;
182    for (const auto &filePath : filePaths) {
183        int ret = stat(filePath.c_str(), &fileStat);
184        if (ret != 0) {
185            printf("Failed to get file size of %s\n", filePath.c_str());
186        } else {
187            long long size = fileStat.st_size / 1024;
188            size = size + sectorSize - size % sectorSize;
189            printf("File size of %s is %lldKB\n", filePath.c_str(), size);
190            totalSize += size;
191        }
192    }
193    printf("Total file size is %lldKB\n", totalSize);
194    constexpr long long baseline = 1054;
195    EXPECT_LT(totalSize, static_cast<long long>(baseline * 1.05));
196    GTEST_LOG_(INFO) << "ROMBaselineTest001: end.";
197}
198}
199} // namespace HiviewDFX
200} // namespace OHOS