1800b99b8Sopenharmony_ci/*
2800b99b8Sopenharmony_ci * Copyright (c) 2021-2023 Huawei Device Co., Ltd.
3800b99b8Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
4800b99b8Sopenharmony_ci * you may not use this file except in compliance with the License.
5800b99b8Sopenharmony_ci * You may obtain a copy of the License at
6800b99b8Sopenharmony_ci *
7800b99b8Sopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
8800b99b8Sopenharmony_ci *
9800b99b8Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
10800b99b8Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
11800b99b8Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12800b99b8Sopenharmony_ci * See the License for the specific language governing permissions and
13800b99b8Sopenharmony_ci * limitations under the License.
14800b99b8Sopenharmony_ci */
15800b99b8Sopenharmony_ci
16800b99b8Sopenharmony_ci#include <gtest/gtest.h>
17800b99b8Sopenharmony_ci
18800b99b8Sopenharmony_ci#include <securec.h>
19800b99b8Sopenharmony_ci#ifndef is_ohos_lite
20800b99b8Sopenharmony_ci#include "gmock/gmock.h"
21800b99b8Sopenharmony_ci#endif
22800b99b8Sopenharmony_ci#include <sys/socket.h>
23800b99b8Sopenharmony_ci#include <sys/un.h>
24800b99b8Sopenharmony_ci#include <unistd.h>
25800b99b8Sopenharmony_ci#include "dfx_exception.h"
26800b99b8Sopenharmony_ci#include "dfx_util.h"
27800b99b8Sopenharmony_ci#include "faultloggerd_client.h"
28800b99b8Sopenharmony_ci#include "faultloggerd_socket.h"
29800b99b8Sopenharmony_ci#include "fault_logger_config.h"
30800b99b8Sopenharmony_ci#include "fault_logger_daemon.h"
31800b99b8Sopenharmony_ci#include "fault_logger_pipe.h"
32800b99b8Sopenharmony_ci
33800b99b8Sopenharmony_ciusing namespace OHOS::HiviewDFX;
34800b99b8Sopenharmony_ciusing namespace testing::ext;
35800b99b8Sopenharmony_ciusing namespace std;
36800b99b8Sopenharmony_ci
37800b99b8Sopenharmony_cinamespace OHOS {
38800b99b8Sopenharmony_cinamespace HiviewDFX {
39800b99b8Sopenharmony_ciclass FaultLoggerDaemonTest : public testing::Test {
40800b99b8Sopenharmony_cipublic:
41800b99b8Sopenharmony_ci    static void SetUpTestCase(void) {}
42800b99b8Sopenharmony_ci    static void TearDownTestCase(void) {}
43800b99b8Sopenharmony_ci    void SetUp() {}
44800b99b8Sopenharmony_ci    void TearDown() {}
45800b99b8Sopenharmony_ci};
46800b99b8Sopenharmony_ci
47800b99b8Sopenharmony_ci#ifndef is_ohos_lite
48800b99b8Sopenharmony_ciclass MockFaultLoggerDaemon : public FaultLoggerDaemon {
49800b99b8Sopenharmony_cipublic:
50800b99b8Sopenharmony_ci    MOCK_METHOD(bool, CreateSockets, (), (override));
51800b99b8Sopenharmony_ci    MOCK_METHOD(bool, InitEnvironment, (), (override));
52800b99b8Sopenharmony_ci    MOCK_METHOD(bool, CreateEventFd, (), (override));
53800b99b8Sopenharmony_ci    MOCK_METHOD(void, WaitForRequest, (), (override));
54800b99b8Sopenharmony_ci};
55800b99b8Sopenharmony_ci#endif
56800b99b8Sopenharmony_ci} // namespace HiviewDFX
57800b99b8Sopenharmony_ci} // namespace OHOS
58800b99b8Sopenharmony_ci
59800b99b8Sopenharmony_cinamespace {
60800b99b8Sopenharmony_ciconstexpr int32_t FAULTLOGGERD_FUZZ_READ_BUFF = 1024;
61800b99b8Sopenharmony_cistatic constexpr uint32_t ROOT_UID = 0;
62800b99b8Sopenharmony_cistatic constexpr uint32_t BMS_UID = 1000;
63800b99b8Sopenharmony_cistatic constexpr uint32_t HIVIEW_UID = 1201;
64800b99b8Sopenharmony_cistatic constexpr uint32_t HIDUMPER_SERVICE_UID = 1212;
65800b99b8Sopenharmony_cistatic constexpr uint32_t FOUNDATION_UID = 5523;
66800b99b8Sopenharmony_cistatic constexpr uint32_t PIPE_TYPE_COUNT = 8;
67800b99b8Sopenharmony_ci
68800b99b8Sopenharmony_ci/**
69800b99b8Sopenharmony_ci * @tc.name: FaultLoggerDaemonTest001
70800b99b8Sopenharmony_ci * @tc.desc: test HandleDefaultClientRequest/HandleLogFileDesClientRequest func
71800b99b8Sopenharmony_ci * @tc.type: FUNC
72800b99b8Sopenharmony_ci */
73800b99b8Sopenharmony_ciHWTEST_F (FaultLoggerDaemonTest, FaultLoggerDaemonTest001, TestSize.Level2)
74800b99b8Sopenharmony_ci{
75800b99b8Sopenharmony_ci    GTEST_LOG_(INFO) << "FaultLoggerDaemonTest001: start.";
76800b99b8Sopenharmony_ci    std::shared_ptr<FaultLoggerDaemon> daemon = std::make_shared<FaultLoggerDaemon>();
77800b99b8Sopenharmony_ci    bool ret = daemon->InitEnvironment();
78800b99b8Sopenharmony_ci    ASSERT_TRUE(ret);
79800b99b8Sopenharmony_ci    struct FaultLoggerdRequest faultloggerdRequest;
80800b99b8Sopenharmony_ci    if (memset_s(&faultloggerdRequest, sizeof(faultloggerdRequest), 0, sizeof(struct FaultLoggerdRequest)) != 0) {
81800b99b8Sopenharmony_ci        GTEST_LOG_(ERROR) << "memset_s failed" ;
82800b99b8Sopenharmony_ci        ASSERT_TRUE(false);
83800b99b8Sopenharmony_ci    }
84800b99b8Sopenharmony_ci    faultloggerdRequest.type = 0;
85800b99b8Sopenharmony_ci    faultloggerdRequest.pid = getpid();
86800b99b8Sopenharmony_ci    faultloggerdRequest.tid = gettid();
87800b99b8Sopenharmony_ci    faultloggerdRequest.uid = getuid();
88800b99b8Sopenharmony_ci    daemon->HandleDefaultClientRequest(-1, &faultloggerdRequest);
89800b99b8Sopenharmony_ci    faultloggerdRequest.type = 2; // 2 : CPP_CRASH
90800b99b8Sopenharmony_ci    daemon->HandleDefaultClientRequest(-1, &faultloggerdRequest);
91800b99b8Sopenharmony_ci    daemon->HandleLogFileDesClientRequest(-1, &faultloggerdRequest);
92800b99b8Sopenharmony_ci    faultloggerdRequest.type = 101; // 101 : CPP_STACKTRACE
93800b99b8Sopenharmony_ci    daemon->HandleDefaultClientRequest(-1, &faultloggerdRequest);
94800b99b8Sopenharmony_ci    faultloggerdRequest.type = 102; // 102 : JS_STACKTRACE
95800b99b8Sopenharmony_ci    daemon->HandleDefaultClientRequest(-1, &faultloggerdRequest);
96800b99b8Sopenharmony_ci    faultloggerdRequest.type = 103; // 103 : JS_HEAP_SNAPSHOT
97800b99b8Sopenharmony_ci    daemon->HandleDefaultClientRequest(-1, &faultloggerdRequest);
98800b99b8Sopenharmony_ci    GTEST_LOG_(INFO) << "FaultLoggerDaemonTest001: end.";
99800b99b8Sopenharmony_ci}
100800b99b8Sopenharmony_ci
101800b99b8Sopenharmony_ci/**
102800b99b8Sopenharmony_ci * @tc.name: FaultLoggerDaemonTest002
103800b99b8Sopenharmony_ci * @tc.desc: test HandleSdkDumpRequest/HandlePipeFdClientRequest func
104800b99b8Sopenharmony_ci * @tc.type: FUNC
105800b99b8Sopenharmony_ci */
106800b99b8Sopenharmony_ciHWTEST_F (FaultLoggerDaemonTest, FaultLoggerDaemonTest002, TestSize.Level2)
107800b99b8Sopenharmony_ci{
108800b99b8Sopenharmony_ci    GTEST_LOG_(INFO) << "FaultLoggerDaemonTest002: start.";
109800b99b8Sopenharmony_ci    std::shared_ptr<FaultLoggerDaemon> daemon = std::make_shared<FaultLoggerDaemon>();
110800b99b8Sopenharmony_ci    bool ret = daemon->InitEnvironment();
111800b99b8Sopenharmony_ci    ASSERT_TRUE(ret);
112800b99b8Sopenharmony_ci    struct FaultLoggerdRequest faultloggerdRequest;
113800b99b8Sopenharmony_ci    if (memset_s(&faultloggerdRequest, sizeof(faultloggerdRequest), 0, sizeof(struct FaultLoggerdRequest)) != 0) {
114800b99b8Sopenharmony_ci        GTEST_LOG_(ERROR) << "memset_s failed" ;
115800b99b8Sopenharmony_ci        ASSERT_TRUE(false);
116800b99b8Sopenharmony_ci    }
117800b99b8Sopenharmony_ci    faultloggerdRequest.type = 2; // 2 : CPP_CRASH
118800b99b8Sopenharmony_ci    faultloggerdRequest.pid = getpid();
119800b99b8Sopenharmony_ci    faultloggerdRequest.tid = gettid();
120800b99b8Sopenharmony_ci    faultloggerdRequest.uid = getuid();
121800b99b8Sopenharmony_ci    daemon->HandleSdkDumpRequest(-1, &faultloggerdRequest);
122800b99b8Sopenharmony_ci    faultloggerdRequest.pipeType = FaultLoggerPipeType::PIPE_FD_READ_BUF;
123800b99b8Sopenharmony_ci    daemon->HandlePipeFdClientRequest(-1, &faultloggerdRequest);
124800b99b8Sopenharmony_ci    faultloggerdRequest.pipeType = FaultLoggerPipeType::PIPE_FD_WRITE_BUF;
125800b99b8Sopenharmony_ci    daemon->HandlePipeFdClientRequest(-1, &faultloggerdRequest);
126800b99b8Sopenharmony_ci    faultloggerdRequest.pipeType = FaultLoggerPipeType::PIPE_FD_READ_RES;
127800b99b8Sopenharmony_ci    daemon->HandlePipeFdClientRequest(-1, &faultloggerdRequest);
128800b99b8Sopenharmony_ci    faultloggerdRequest.pipeType = FaultLoggerPipeType::PIPE_FD_WRITE_RES;
129800b99b8Sopenharmony_ci    daemon->HandlePipeFdClientRequest(-1, &faultloggerdRequest);
130800b99b8Sopenharmony_ci    faultloggerdRequest.pipeType = FaultLoggerPipeType::PIPE_FD_DELETE;
131800b99b8Sopenharmony_ci    daemon->HandlePipeFdClientRequest(-1, &faultloggerdRequest);
132800b99b8Sopenharmony_ci    GTEST_LOG_(INFO) << "FaultLoggerDaemonTest002: end.";
133800b99b8Sopenharmony_ci}
134800b99b8Sopenharmony_ci
135800b99b8Sopenharmony_ci/**
136800b99b8Sopenharmony_ci * @tc.name: FaultLoggerDaemonTest003
137800b99b8Sopenharmony_ci * @tc.desc: test HandleSdkDumpRequest func
138800b99b8Sopenharmony_ci * @tc.type: FUNC
139800b99b8Sopenharmony_ci */
140800b99b8Sopenharmony_ciHWTEST_F (FaultLoggerDaemonTest, FaultLoggerDaemonTest003, TestSize.Level2)
141800b99b8Sopenharmony_ci{
142800b99b8Sopenharmony_ci    GTEST_LOG_(INFO) << "FaultLoggerDaemonTest003: start.";
143800b99b8Sopenharmony_ci    std::shared_ptr<FaultLoggerDaemon> daemon = std::make_shared<FaultLoggerDaemon>();
144800b99b8Sopenharmony_ci    bool ret = daemon->InitEnvironment();
145800b99b8Sopenharmony_ci    ASSERT_TRUE(ret);
146800b99b8Sopenharmony_ci    struct FaultLoggerdRequest faultloggerdRequest;
147800b99b8Sopenharmony_ci    if (memset_s(&faultloggerdRequest, sizeof(faultloggerdRequest), 0, sizeof(struct FaultLoggerdRequest)) != 0) {
148800b99b8Sopenharmony_ci        GTEST_LOG_(ERROR) << "memset_s failed" ;
149800b99b8Sopenharmony_ci        ASSERT_TRUE(false);
150800b99b8Sopenharmony_ci    }
151800b99b8Sopenharmony_ci    faultloggerdRequest.type = 2; // 2 : CPP_CRASH
152800b99b8Sopenharmony_ci    faultloggerdRequest.pid = getpid();
153800b99b8Sopenharmony_ci    faultloggerdRequest.tid = gettid();
154800b99b8Sopenharmony_ci    faultloggerdRequest.uid = getuid();
155800b99b8Sopenharmony_ci    daemon->HandleSdkDumpRequest(-1, &faultloggerdRequest);
156800b99b8Sopenharmony_ci    faultloggerdRequest.tid = 0;
157800b99b8Sopenharmony_ci    daemon->HandleSdkDumpRequest(-1, &faultloggerdRequest);
158800b99b8Sopenharmony_ci    GTEST_LOG_(INFO) << "FaultLoggerDaemonTest003: end.";
159800b99b8Sopenharmony_ci}
160800b99b8Sopenharmony_ci
161800b99b8Sopenharmony_ci/**
162800b99b8Sopenharmony_ci * @tc.name: FaultLoggerDaemonTest004
163800b99b8Sopenharmony_ci * @tc.desc: test CreateFileForRequest func
164800b99b8Sopenharmony_ci * @tc.type: FUNC
165800b99b8Sopenharmony_ci */
166800b99b8Sopenharmony_ciHWTEST_F (FaultLoggerDaemonTest, FaultLoggerDaemonTest004, TestSize.Level2)
167800b99b8Sopenharmony_ci{
168800b99b8Sopenharmony_ci    GTEST_LOG_(INFO) << "FaultLoggerDaemonTest004: start.";
169800b99b8Sopenharmony_ci    std::shared_ptr<FaultLoggerDaemon> daemon = std::make_shared<FaultLoggerDaemon>();
170800b99b8Sopenharmony_ci    int32_t type = (int32_t)FaultLoggerType::CPP_CRASH;
171800b99b8Sopenharmony_ci    int32_t pid = getpid();
172800b99b8Sopenharmony_ci    uint64_t time = GetTimeMilliSeconds();
173800b99b8Sopenharmony_ci    int fd = daemon->CreateFileForRequest(type, pid, 0, time);
174800b99b8Sopenharmony_ci    ASSERT_NE(fd, -1);
175800b99b8Sopenharmony_ci    close(fd);
176800b99b8Sopenharmony_ci    GTEST_LOG_(INFO) << "FaultLoggerDaemonTest004: end.";
177800b99b8Sopenharmony_ci}
178800b99b8Sopenharmony_ci
179800b99b8Sopenharmony_ci/**
180800b99b8Sopenharmony_ci * @tc.name: FaultLoggerDaemonTest005
181800b99b8Sopenharmony_ci * @tc.desc: test CreateFileForRequest JIT_CODE_LOG and FFRT_CRASH_LOG branch
182800b99b8Sopenharmony_ci * @tc.type: FUNC
183800b99b8Sopenharmony_ci */
184800b99b8Sopenharmony_ciHWTEST_F (FaultLoggerDaemonTest, FaultLoggerDaemonTest005, TestSize.Level2)
185800b99b8Sopenharmony_ci{
186800b99b8Sopenharmony_ci    GTEST_LOG_(INFO) << "FaultLoggerDaemonTest005: start.";
187800b99b8Sopenharmony_ci    std::shared_ptr<FaultLoggerDaemon> daemon = std::make_shared<FaultLoggerDaemon>();
188800b99b8Sopenharmony_ci    bool ret = daemon->InitEnvironment();
189800b99b8Sopenharmony_ci    ASSERT_TRUE(ret);
190800b99b8Sopenharmony_ci
191800b99b8Sopenharmony_ci    int32_t pid = getpid();
192800b99b8Sopenharmony_ci    uint64_t time = GetTimeMilliSeconds();
193800b99b8Sopenharmony_ci    int32_t type = static_cast<int32_t>(FaultLoggerType::JIT_CODE_LOG);
194800b99b8Sopenharmony_ci    int fd = daemon->CreateFileForRequest(type, pid, 0, time);
195800b99b8Sopenharmony_ci    ASSERT_NE(fd, -1);
196800b99b8Sopenharmony_ci    type = static_cast<int32_t>(FaultLoggerType::FFRT_CRASH_LOG);
197800b99b8Sopenharmony_ci    fd = daemon->CreateFileForRequest(type, pid, 0, time);
198800b99b8Sopenharmony_ci    ASSERT_NE(fd, -1);
199800b99b8Sopenharmony_ci    close(fd);
200800b99b8Sopenharmony_ci    GTEST_LOG_(INFO) << "FaultLoggerDaemonTest005: end.";
201800b99b8Sopenharmony_ci}
202800b99b8Sopenharmony_ci
203800b99b8Sopenharmony_civoid DoClientProcess(const std::string& socketFileName)
204800b99b8Sopenharmony_ci{
205800b99b8Sopenharmony_ci    sleep(2); // 2 : wait 2 seconds, waiting for the service to be ready
206800b99b8Sopenharmony_ci    int clientSocketFd = -1;
207800b99b8Sopenharmony_ci    bool ret = StartConnect(clientSocketFd, socketFileName.c_str(), 10); // 10 : socket connect time out 10 second
208800b99b8Sopenharmony_ci    ASSERT_TRUE(ret);
209800b99b8Sopenharmony_ci    ASSERT_NE(clientSocketFd, -1);
210800b99b8Sopenharmony_ci    GTEST_LOG_(INFO) << "child connect finished, client fd:" << clientSocketFd;
211800b99b8Sopenharmony_ci
212800b99b8Sopenharmony_ci    int data = 12345; // 12345 is for server Cred test
213800b99b8Sopenharmony_ci    ret = SendMsgIovToSocket(clientSocketFd, reinterpret_cast<void *>(&data), sizeof(data));
214800b99b8Sopenharmony_ci    ASSERT_TRUE(ret);
215800b99b8Sopenharmony_ci
216800b99b8Sopenharmony_ci    GTEST_LOG_(INFO) << "Start read file desc";
217800b99b8Sopenharmony_ci    int testFd = ReadFileDescriptorFromSocket(clientSocketFd);
218800b99b8Sopenharmony_ci    GTEST_LOG_(INFO) << "recv testFd:" << testFd;
219800b99b8Sopenharmony_ci    ASSERT_NE(testFd, -1);
220800b99b8Sopenharmony_ci    close(clientSocketFd);
221800b99b8Sopenharmony_ci    close(testFd);
222800b99b8Sopenharmony_ci}
223800b99b8Sopenharmony_ci
224800b99b8Sopenharmony_civoid TestSecurityCheck(const std::string& socketFileName)
225800b99b8Sopenharmony_ci{
226800b99b8Sopenharmony_ci    int32_t serverSocketFd = -1;
227800b99b8Sopenharmony_ci    bool ret = StartListen(serverSocketFd, socketFileName.c_str(), 5); // 5: means max connection count is 5
228800b99b8Sopenharmony_ci    ASSERT_TRUE(ret);
229800b99b8Sopenharmony_ci    ASSERT_NE(serverSocketFd, -1);
230800b99b8Sopenharmony_ci    GTEST_LOG_(INFO) << "server start listen fd:" << serverSocketFd;
231800b99b8Sopenharmony_ci
232800b99b8Sopenharmony_ci    struct timeval timev = {
233800b99b8Sopenharmony_ci        20, // 20 : recv timeout 20 seconds
234800b99b8Sopenharmony_ci        0
235800b99b8Sopenharmony_ci    };
236800b99b8Sopenharmony_ci    void* pTimev = &timev;
237800b99b8Sopenharmony_ci    int retOpt = OHOS_TEMP_FAILURE_RETRY(setsockopt(serverSocketFd, SOL_SOCKET, SO_RCVTIMEO,
238800b99b8Sopenharmony_ci        static_cast<const char*>(pTimev), sizeof(struct timeval)));
239800b99b8Sopenharmony_ci    ASSERT_NE(retOpt, -1);
240800b99b8Sopenharmony_ci
241800b99b8Sopenharmony_ci    struct sockaddr_un clientAddr;
242800b99b8Sopenharmony_ci    socklen_t clientAddrSize = static_cast<socklen_t>(sizeof(clientAddr));
243800b99b8Sopenharmony_ci    int32_t connectionFd = OHOS_TEMP_FAILURE_RETRY(accept(serverSocketFd,
244800b99b8Sopenharmony_ci        reinterpret_cast<struct sockaddr *>(&clientAddr), &clientAddrSize));
245800b99b8Sopenharmony_ci    ASSERT_GT(connectionFd, 0);
246800b99b8Sopenharmony_ci
247800b99b8Sopenharmony_ci    std::shared_ptr<FaultLoggerDaemon> daemon = std::make_shared<FaultLoggerDaemon>();
248800b99b8Sopenharmony_ci    struct FaultLoggerdRequest faultloggerdRequest;
249800b99b8Sopenharmony_ci    if (memset_s(&faultloggerdRequest, sizeof(faultloggerdRequest), 0, sizeof(struct FaultLoggerdRequest)) != 0) {
250800b99b8Sopenharmony_ci        GTEST_LOG_(ERROR) << "memset_s failed" ;
251800b99b8Sopenharmony_ci        ASSERT_TRUE(false);
252800b99b8Sopenharmony_ci    }
253800b99b8Sopenharmony_ci    faultloggerdRequest.type = 2; // 2 : CPP_CRASH
254800b99b8Sopenharmony_ci    faultloggerdRequest.pid = getpid();
255800b99b8Sopenharmony_ci    faultloggerdRequest.tid = gettid();
256800b99b8Sopenharmony_ci    faultloggerdRequest.uid = getuid();
257800b99b8Sopenharmony_ci
258800b99b8Sopenharmony_ci    FaultLoggerCheckPermissionResp resp = daemon->SecurityCheck(connectionFd, &faultloggerdRequest);
259800b99b8Sopenharmony_ci    ASSERT_EQ(resp, FaultLoggerCheckPermissionResp::CHECK_PERMISSION_REJECT);
260800b99b8Sopenharmony_ci
261800b99b8Sopenharmony_ci    close(connectionFd);
262800b99b8Sopenharmony_ci    close(serverSocketFd);
263800b99b8Sopenharmony_ci}
264800b99b8Sopenharmony_ci
265800b99b8Sopenharmony_ci/**
266800b99b8Sopenharmony_ci * @tc.name: FaultLoggerDaemonTest006
267800b99b8Sopenharmony_ci * @tc.desc: test SecurityCheck abnormal branch
268800b99b8Sopenharmony_ci * @tc.type: FUNC
269800b99b8Sopenharmony_ci */
270800b99b8Sopenharmony_ciHWTEST_F (FaultLoggerDaemonTest, FaultLoggerDaemonTest006, TestSize.Level2)
271800b99b8Sopenharmony_ci{
272800b99b8Sopenharmony_ci    GTEST_LOG_(INFO) << "FaultLoggerDaemonTest006: start.";
273800b99b8Sopenharmony_ci    std::string testSocketName = "faultloggerd.server.test";
274800b99b8Sopenharmony_ci    int32_t pid = fork();
275800b99b8Sopenharmony_ci    if (pid == 0) {
276800b99b8Sopenharmony_ci        DoClientProcess(testSocketName);
277800b99b8Sopenharmony_ci        GTEST_LOG_(INFO) << "client exit";
278800b99b8Sopenharmony_ci        exit(0);
279800b99b8Sopenharmony_ci    } else if (pid > 0) {
280800b99b8Sopenharmony_ci        TestSecurityCheck(testSocketName);
281800b99b8Sopenharmony_ci
282800b99b8Sopenharmony_ci        int status;
283800b99b8Sopenharmony_ci        bool isSuccess = waitpid(pid, &status, 0) != -1;
284800b99b8Sopenharmony_ci        if (!isSuccess) {
285800b99b8Sopenharmony_ci            ASSERT_FALSE(isSuccess);
286800b99b8Sopenharmony_ci            return;
287800b99b8Sopenharmony_ci        }
288800b99b8Sopenharmony_ci
289800b99b8Sopenharmony_ci        int exitCode = -1;
290800b99b8Sopenharmony_ci        if (WIFEXITED(status)) {
291800b99b8Sopenharmony_ci            exitCode = WEXITSTATUS(status);
292800b99b8Sopenharmony_ci            GTEST_LOG_(INFO) << "Exit status was " << exitCode;
293800b99b8Sopenharmony_ci        }
294800b99b8Sopenharmony_ci        ASSERT_EQ(exitCode, 0);
295800b99b8Sopenharmony_ci    }
296800b99b8Sopenharmony_ci    GTEST_LOG_(INFO) << "FaultLoggerDaemonTest006: end.";
297800b99b8Sopenharmony_ci}
298800b99b8Sopenharmony_ci
299800b99b8Sopenharmony_civoid TestCheckRequestCredential(const std::string& socketFileName)
300800b99b8Sopenharmony_ci{
301800b99b8Sopenharmony_ci    int32_t serverSocketFd = -1;
302800b99b8Sopenharmony_ci    bool ret = StartListen(serverSocketFd, socketFileName.c_str(), 5); // 5: means max connection count is 5
303800b99b8Sopenharmony_ci    ASSERT_TRUE(ret);
304800b99b8Sopenharmony_ci    ASSERT_NE(serverSocketFd, -1);
305800b99b8Sopenharmony_ci    GTEST_LOG_(INFO) << "server start listen fd:" << serverSocketFd;
306800b99b8Sopenharmony_ci
307800b99b8Sopenharmony_ci    struct timeval timev = {
308800b99b8Sopenharmony_ci        20, // 20 : recv timeout 20 seconds
309800b99b8Sopenharmony_ci        0
310800b99b8Sopenharmony_ci    };
311800b99b8Sopenharmony_ci    void* pTimev = &timev;
312800b99b8Sopenharmony_ci    int retOpt = OHOS_TEMP_FAILURE_RETRY(setsockopt(serverSocketFd, SOL_SOCKET, SO_RCVTIMEO,
313800b99b8Sopenharmony_ci        static_cast<const char*>(pTimev), sizeof(struct timeval)));
314800b99b8Sopenharmony_ci    ASSERT_NE(retOpt, -1);
315800b99b8Sopenharmony_ci
316800b99b8Sopenharmony_ci    struct sockaddr_un clientAddr;
317800b99b8Sopenharmony_ci    socklen_t clientAddrSize = static_cast<socklen_t>(sizeof(clientAddr));
318800b99b8Sopenharmony_ci    int32_t connectionFd = OHOS_TEMP_FAILURE_RETRY(accept(serverSocketFd,
319800b99b8Sopenharmony_ci        reinterpret_cast<struct sockaddr *>(&clientAddr), &clientAddrSize));
320800b99b8Sopenharmony_ci    ASSERT_GT(connectionFd, 0);
321800b99b8Sopenharmony_ci
322800b99b8Sopenharmony_ci    std::shared_ptr<FaultLoggerDaemon> daemon = std::make_shared<FaultLoggerDaemon>();
323800b99b8Sopenharmony_ci    struct FaultLoggerdRequest faultloggerdRequest;
324800b99b8Sopenharmony_ci    if (memset_s(&faultloggerdRequest, sizeof(faultloggerdRequest), 0, sizeof(struct FaultLoggerdRequest)) != 0) {
325800b99b8Sopenharmony_ci        GTEST_LOG_(ERROR) << "memset_s failed" ;
326800b99b8Sopenharmony_ci        ASSERT_TRUE(false);
327800b99b8Sopenharmony_ci    }
328800b99b8Sopenharmony_ci    faultloggerdRequest.type = 2; // 2 : CPP_CRASH
329800b99b8Sopenharmony_ci    faultloggerdRequest.pid = getpid();
330800b99b8Sopenharmony_ci    faultloggerdRequest.tid = gettid();
331800b99b8Sopenharmony_ci    faultloggerdRequest.uid = getuid();
332800b99b8Sopenharmony_ci
333800b99b8Sopenharmony_ci    bool result = daemon->CheckRequestCredential(connectionFd, nullptr);
334800b99b8Sopenharmony_ci    ASSERT_EQ(result, false);
335800b99b8Sopenharmony_ci    result = daemon->CheckRequestCredential(connectionFd, &faultloggerdRequest);
336800b99b8Sopenharmony_ci    ASSERT_EQ(result, false);
337800b99b8Sopenharmony_ci
338800b99b8Sopenharmony_ci    close(connectionFd);
339800b99b8Sopenharmony_ci    close(serverSocketFd);
340800b99b8Sopenharmony_ci}
341800b99b8Sopenharmony_ci
342800b99b8Sopenharmony_ci/**
343800b99b8Sopenharmony_ci * @tc.name: FaultLoggerDaemonTest007
344800b99b8Sopenharmony_ci * @tc.desc: test CheckRequestCredential abnormal branch
345800b99b8Sopenharmony_ci * @tc.type: FUNC
346800b99b8Sopenharmony_ci */
347800b99b8Sopenharmony_ciHWTEST_F (FaultLoggerDaemonTest, FaultLoggerDaemonTest007, TestSize.Level2)
348800b99b8Sopenharmony_ci{
349800b99b8Sopenharmony_ci    GTEST_LOG_(INFO) << "FaultLoggerDaemonTest007: start.";
350800b99b8Sopenharmony_ci    std::string testSocketName = "faultloggerd.server.test";
351800b99b8Sopenharmony_ci    int32_t pid = fork();
352800b99b8Sopenharmony_ci    if (pid == 0) {
353800b99b8Sopenharmony_ci        DoClientProcess(testSocketName);
354800b99b8Sopenharmony_ci        GTEST_LOG_(INFO) << "client exit";
355800b99b8Sopenharmony_ci        exit(0);
356800b99b8Sopenharmony_ci    } else if (pid > 0) {
357800b99b8Sopenharmony_ci        TestCheckRequestCredential(testSocketName);
358800b99b8Sopenharmony_ci
359800b99b8Sopenharmony_ci        int status;
360800b99b8Sopenharmony_ci        bool isSuccess = waitpid(pid, &status, 0) != -1;
361800b99b8Sopenharmony_ci        if (!isSuccess) {
362800b99b8Sopenharmony_ci            ASSERT_FALSE(isSuccess);
363800b99b8Sopenharmony_ci            return;
364800b99b8Sopenharmony_ci        }
365800b99b8Sopenharmony_ci
366800b99b8Sopenharmony_ci        int exitCode = -1;
367800b99b8Sopenharmony_ci        if (WIFEXITED(status)) {
368800b99b8Sopenharmony_ci            exitCode = WEXITSTATUS(status);
369800b99b8Sopenharmony_ci            GTEST_LOG_(INFO) << "Exit status was " << exitCode;
370800b99b8Sopenharmony_ci        }
371800b99b8Sopenharmony_ci        ASSERT_EQ(exitCode, 0);
372800b99b8Sopenharmony_ci    }
373800b99b8Sopenharmony_ci    GTEST_LOG_(INFO) << "FaultLoggerDaemonTest007: end.";
374800b99b8Sopenharmony_ci}
375800b99b8Sopenharmony_ci
376800b99b8Sopenharmony_civoid TestHandleExceptionRequest(const std::string& socketFileName)
377800b99b8Sopenharmony_ci{
378800b99b8Sopenharmony_ci    int32_t serverSocketFd = -1;
379800b99b8Sopenharmony_ci    bool ret = StartListen(serverSocketFd, socketFileName.c_str(), 5); // 5: means max connection count is 5
380800b99b8Sopenharmony_ci    ASSERT_TRUE(ret);
381800b99b8Sopenharmony_ci    ASSERT_NE(serverSocketFd, -1);
382800b99b8Sopenharmony_ci    GTEST_LOG_(INFO) << "server start listen fd:" << serverSocketFd;
383800b99b8Sopenharmony_ci
384800b99b8Sopenharmony_ci    struct timeval timev = {
385800b99b8Sopenharmony_ci        20, // 20 : recv timeout 20 seconds
386800b99b8Sopenharmony_ci        0
387800b99b8Sopenharmony_ci    };
388800b99b8Sopenharmony_ci    void* pTimev = &timev;
389800b99b8Sopenharmony_ci    int retOpt = OHOS_TEMP_FAILURE_RETRY(setsockopt(serverSocketFd, SOL_SOCKET, SO_RCVTIMEO,
390800b99b8Sopenharmony_ci        static_cast<const char*>(pTimev), sizeof(struct timeval)));
391800b99b8Sopenharmony_ci    ASSERT_NE(retOpt, -1);
392800b99b8Sopenharmony_ci
393800b99b8Sopenharmony_ci    struct sockaddr_un clientAddr;
394800b99b8Sopenharmony_ci    socklen_t clientAddrSize = static_cast<socklen_t>(sizeof(clientAddr));
395800b99b8Sopenharmony_ci    int32_t connectionFd = OHOS_TEMP_FAILURE_RETRY(accept(serverSocketFd,
396800b99b8Sopenharmony_ci        reinterpret_cast<struct sockaddr *>(&clientAddr), &clientAddrSize));
397800b99b8Sopenharmony_ci    ASSERT_GT(connectionFd, 0);
398800b99b8Sopenharmony_ci
399800b99b8Sopenharmony_ci    std::shared_ptr<FaultLoggerDaemon> daemon = std::make_shared<FaultLoggerDaemon>();
400800b99b8Sopenharmony_ci    struct FaultLoggerdRequest faultloggerdRequest;
401800b99b8Sopenharmony_ci    if (memset_s(&faultloggerdRequest, sizeof(faultloggerdRequest), 0, sizeof(struct FaultLoggerdRequest)) != 0) {
402800b99b8Sopenharmony_ci        GTEST_LOG_(ERROR) << "memset_s failed" ;
403800b99b8Sopenharmony_ci        ASSERT_TRUE(false);
404800b99b8Sopenharmony_ci    }
405800b99b8Sopenharmony_ci    faultloggerdRequest.type = 2; // 2 : CPP_CRASH
406800b99b8Sopenharmony_ci    faultloggerdRequest.pid = getpid();
407800b99b8Sopenharmony_ci    faultloggerdRequest.tid = gettid();
408800b99b8Sopenharmony_ci    faultloggerdRequest.uid = getuid();
409800b99b8Sopenharmony_ci
410800b99b8Sopenharmony_ci    daemon->HandleExceptionRequest(connectionFd, &faultloggerdRequest);
411800b99b8Sopenharmony_ci
412800b99b8Sopenharmony_ci    close(connectionFd);
413800b99b8Sopenharmony_ci    close(serverSocketFd);
414800b99b8Sopenharmony_ci}
415800b99b8Sopenharmony_ci
416800b99b8Sopenharmony_ci/**
417800b99b8Sopenharmony_ci * @tc.name: FaultLoggerDaemonTest008
418800b99b8Sopenharmony_ci * @tc.desc: test HandleExceptionRequest abnormal branch
419800b99b8Sopenharmony_ci * @tc.type: FUNC
420800b99b8Sopenharmony_ci */
421800b99b8Sopenharmony_ciHWTEST_F (FaultLoggerDaemonTest, FaultLoggerDaemonTest008, TestSize.Level2)
422800b99b8Sopenharmony_ci{
423800b99b8Sopenharmony_ci    GTEST_LOG_(INFO) << "FaultLoggerDaemonTest008: start.";
424800b99b8Sopenharmony_ci    std::string testSocketName = "faultloggerd.server.test";
425800b99b8Sopenharmony_ci    int32_t pid = fork();
426800b99b8Sopenharmony_ci    if (pid == 0) {
427800b99b8Sopenharmony_ci        DoClientProcess(testSocketName);
428800b99b8Sopenharmony_ci        GTEST_LOG_(INFO) << "client exit";
429800b99b8Sopenharmony_ci        exit(0);
430800b99b8Sopenharmony_ci    } else if (pid > 0) {
431800b99b8Sopenharmony_ci        TestHandleExceptionRequest(testSocketName);
432800b99b8Sopenharmony_ci
433800b99b8Sopenharmony_ci        int status;
434800b99b8Sopenharmony_ci        bool isSuccess = waitpid(pid, &status, 0) != -1;
435800b99b8Sopenharmony_ci        if (!isSuccess) {
436800b99b8Sopenharmony_ci            ASSERT_FALSE(isSuccess);
437800b99b8Sopenharmony_ci            return;
438800b99b8Sopenharmony_ci        }
439800b99b8Sopenharmony_ci
440800b99b8Sopenharmony_ci        int exitCode = -1;
441800b99b8Sopenharmony_ci        if (WIFEXITED(status)) {
442800b99b8Sopenharmony_ci            exitCode = WEXITSTATUS(status);
443800b99b8Sopenharmony_ci            GTEST_LOG_(INFO) << "Exit status was " << exitCode;
444800b99b8Sopenharmony_ci        }
445800b99b8Sopenharmony_ci        ASSERT_EQ(exitCode, 0);
446800b99b8Sopenharmony_ci    }
447800b99b8Sopenharmony_ci    GTEST_LOG_(INFO) << "FaultLoggerDaemonTest008: end.";
448800b99b8Sopenharmony_ci}
449800b99b8Sopenharmony_ci
450800b99b8Sopenharmony_ci/**
451800b99b8Sopenharmony_ci * @tc.name: FaultLoggerDaemonTest009
452800b99b8Sopenharmony_ci * @tc.desc: test HandleAccept abnormal branch
453800b99b8Sopenharmony_ci * @tc.type: FUNC
454800b99b8Sopenharmony_ci */
455800b99b8Sopenharmony_ciHWTEST_F (FaultLoggerDaemonTest, FaultLoggerDaemonTest009, TestSize.Level2)
456800b99b8Sopenharmony_ci{
457800b99b8Sopenharmony_ci    GTEST_LOG_(INFO) << "FaultLoggerDaemonTest009: start.";
458800b99b8Sopenharmony_ci    std::shared_ptr<FaultLoggerDaemon> daemon = std::make_shared<FaultLoggerDaemon>();
459800b99b8Sopenharmony_ci    bool ret = daemon->InitEnvironment();
460800b99b8Sopenharmony_ci    ASSERT_TRUE(ret);
461800b99b8Sopenharmony_ci    daemon->HandleAccept(1, 1);
462800b99b8Sopenharmony_ci    GTEST_LOG_(INFO) << "FaultLoggerDaemonTest009: end.";
463800b99b8Sopenharmony_ci}
464800b99b8Sopenharmony_ci
465800b99b8Sopenharmony_ci/**
466800b99b8Sopenharmony_ci * @tc.name: FaultLoggerDaemonTest010
467800b99b8Sopenharmony_ci * @tc.desc: test HandleRequestByClientType abnormal branch
468800b99b8Sopenharmony_ci * @tc.type: FUNC
469800b99b8Sopenharmony_ci */
470800b99b8Sopenharmony_ciHWTEST_F (FaultLoggerDaemonTest, FaultLoggerDaemonTest010, TestSize.Level2)
471800b99b8Sopenharmony_ci{
472800b99b8Sopenharmony_ci    GTEST_LOG_(INFO) << "FaultLoggerDaemonTest010: start.";
473800b99b8Sopenharmony_ci    std::shared_ptr<FaultLoggerDaemon> daemon = std::make_shared<FaultLoggerDaemon>();
474800b99b8Sopenharmony_ci    bool ret = daemon->InitEnvironment();
475800b99b8Sopenharmony_ci    ASSERT_TRUE(ret);
476800b99b8Sopenharmony_ci
477800b99b8Sopenharmony_ci    int32_t connectionFd = 1;
478800b99b8Sopenharmony_ci
479800b99b8Sopenharmony_ci    FaultLoggerdRequest request;
480800b99b8Sopenharmony_ci    request.clientType = FaultLoggerClientType::DEFAULT_CLIENT;
481800b99b8Sopenharmony_ci    daemon->HandleRequestByClientType(connectionFd, &request);
482800b99b8Sopenharmony_ci    request.clientType = FaultLoggerClientType::LOG_FILE_DES_CLIENT;
483800b99b8Sopenharmony_ci    daemon->HandleRequestByClientType(connectionFd, &request);
484800b99b8Sopenharmony_ci    request.clientType = FaultLoggerClientType::PRINT_T_HILOG_CLIENT;
485800b99b8Sopenharmony_ci    daemon->HandleRequestByClientType(connectionFd, &request);
486800b99b8Sopenharmony_ci    request.clientType = FaultLoggerClientType::PERMISSION_CLIENT;
487800b99b8Sopenharmony_ci    daemon->HandleRequestByClientType(connectionFd, &request);
488800b99b8Sopenharmony_ci    request.clientType = FaultLoggerClientType::PIPE_FD_CLIENT;
489800b99b8Sopenharmony_ci    daemon->HandleRequestByClientType(connectionFd, &request);
490800b99b8Sopenharmony_ci    request.clientType = FaultLoggerClientType::SDK_DUMP_CLIENT;
491800b99b8Sopenharmony_ci    daemon->HandleRequestByClientType(connectionFd, &request);
492800b99b8Sopenharmony_ci    request.clientType = FaultLoggerClientType::REPORT_EXCEPTION_CLIENT;
493800b99b8Sopenharmony_ci    daemon->HandleRequestByClientType(connectionFd, &request);
494800b99b8Sopenharmony_ci    request.clientType = -1;
495800b99b8Sopenharmony_ci    daemon->HandleRequestByClientType(connectionFd, &request);
496800b99b8Sopenharmony_ci    GTEST_LOG_(INFO) << "FaultLoggerDaemonTest010: end.";
497800b99b8Sopenharmony_ci}
498800b99b8Sopenharmony_ci
499800b99b8Sopenharmony_civoid TestHandleRequestByPipeType(std::shared_ptr<FaultLoggerDaemon> daemon, FaultLoggerPipe2* faultLoggerPipe,
500800b99b8Sopenharmony_ci    FaultLoggerdRequest request, int32_t pipeType, bool isChangeFd)
501800b99b8Sopenharmony_ci{
502800b99b8Sopenharmony_ci    int fd = -1;
503800b99b8Sopenharmony_ci    request.pipeType = pipeType;
504800b99b8Sopenharmony_ci    daemon->HandleRequestByPipeType(fd, 1, &request, faultLoggerPipe);
505800b99b8Sopenharmony_ci    if (isChangeFd) {
506800b99b8Sopenharmony_ci        ASSERT_NE(fd, -1);
507800b99b8Sopenharmony_ci    } else {
508800b99b8Sopenharmony_ci        ASSERT_EQ(fd, -1);
509800b99b8Sopenharmony_ci    }
510800b99b8Sopenharmony_ci}
511800b99b8Sopenharmony_ci
512800b99b8Sopenharmony_ci/**
513800b99b8Sopenharmony_ci * @tc.name: FaultLoggerDaemonTest011
514800b99b8Sopenharmony_ci * @tc.desc: test HandleRequestByPipeType abnormal branch
515800b99b8Sopenharmony_ci * @tc.type: FUNC
516800b99b8Sopenharmony_ci */
517800b99b8Sopenharmony_ciHWTEST_F (FaultLoggerDaemonTest, FaultLoggerDaemonTest011, TestSize.Level2)
518800b99b8Sopenharmony_ci{
519800b99b8Sopenharmony_ci    GTEST_LOG_(INFO) << "FaultLoggerDaemonTest011: start.";
520800b99b8Sopenharmony_ci    std::shared_ptr<FaultLoggerDaemon> daemon = std::make_shared<FaultLoggerDaemon>();
521800b99b8Sopenharmony_ci    bool ret = daemon->InitEnvironment();
522800b99b8Sopenharmony_ci    ASSERT_TRUE(ret);
523800b99b8Sopenharmony_ci
524800b99b8Sopenharmony_ci    FaultLoggerdRequest request;
525800b99b8Sopenharmony_ci    FaultLoggerPipe2* faultLoggerPipe = new FaultLoggerPipe2(GetTimeMilliSeconds());
526800b99b8Sopenharmony_ci    bool isChangeFds4Pipe[PIPE_TYPE_COUNT] = {false, true, false, true, false, false, false, false};
527800b99b8Sopenharmony_ci    for (int i = 0; i < PIPE_TYPE_COUNT; i++) {
528800b99b8Sopenharmony_ci        TestHandleRequestByPipeType(daemon, faultLoggerPipe, request, i, isChangeFds4Pipe[i]);
529800b99b8Sopenharmony_ci    }
530800b99b8Sopenharmony_ci    delete(faultLoggerPipe);
531800b99b8Sopenharmony_ci
532800b99b8Sopenharmony_ci    FaultLoggerPipe2* faultLoggerJsonPipe = new FaultLoggerPipe2(GetTimeMilliSeconds(), true);
533800b99b8Sopenharmony_ci    bool isChangeFds4JsonPipe[PIPE_TYPE_COUNT] = {false, false, false, false, false, true, false, true};
534800b99b8Sopenharmony_ci    for (int i = 0; i < PIPE_TYPE_COUNT; i++) {
535800b99b8Sopenharmony_ci        TestHandleRequestByPipeType(daemon, faultLoggerJsonPipe, request, i, isChangeFds4JsonPipe[i]);
536800b99b8Sopenharmony_ci    }
537800b99b8Sopenharmony_ci    delete(faultLoggerJsonPipe);
538800b99b8Sopenharmony_ci    GTEST_LOG_(INFO) << "FaultLoggerDaemonTest011: end.";
539800b99b8Sopenharmony_ci}
540800b99b8Sopenharmony_ci
541800b99b8Sopenharmony_ci#ifndef is_ohos_lite
542800b99b8Sopenharmony_ci/**
543800b99b8Sopenharmony_ci * @tc.name: FaultLoggerDaemonTest012
544800b99b8Sopenharmony_ci * @tc.desc: test FaultLoggerDaemon HandleStaticForFuzzer
545800b99b8Sopenharmony_ci * @tc.type: FUNC
546800b99b8Sopenharmony_ci */
547800b99b8Sopenharmony_ciHWTEST_F (FaultLoggerDaemonTest, FaultLoggerDaemonTest012, TestSize.Level2)
548800b99b8Sopenharmony_ci{
549800b99b8Sopenharmony_ci    std::shared_ptr<FaultLoggerDaemon> daemon = std::make_shared<FaultLoggerDaemon>();
550800b99b8Sopenharmony_ci    int params[][2] = {
551800b99b8Sopenharmony_ci        {FaultLoggerType::CPP_STACKTRACE, ROOT_UID},
552800b99b8Sopenharmony_ci        {FaultLoggerType::JS_STACKTRACE, BMS_UID},
553800b99b8Sopenharmony_ci        {FaultLoggerType::LEAK_STACKTRACE, HIVIEW_UID},
554800b99b8Sopenharmony_ci        {FaultLoggerType::FFRT_CRASH_LOG, HIDUMPER_SERVICE_UID},
555800b99b8Sopenharmony_ci        {FaultLoggerType::JIT_CODE_LOG, FOUNDATION_UID},
556800b99b8Sopenharmony_ci        {FaultLoggerType::JS_HEAP_LEAK_LIST, FOUNDATION_UID},
557800b99b8Sopenharmony_ci    };
558800b99b8Sopenharmony_ci    bool ret = false;
559800b99b8Sopenharmony_ci    for (int i = 0; i < sizeof(params) / sizeof(params[0]); i++) {
560800b99b8Sopenharmony_ci        ret = daemon->HandleStaticForFuzzer(params[i][0], params[i][1]);
561800b99b8Sopenharmony_ci        EXPECT_TRUE(ret);
562800b99b8Sopenharmony_ci    }
563800b99b8Sopenharmony_ci    ret = daemon->HandleStaticForFuzzer(-1, 1);
564800b99b8Sopenharmony_ci    EXPECT_FALSE(ret);
565800b99b8Sopenharmony_ci    GTEST_LOG_(INFO) << "FaultLoggerDaemonTest012: end.";
566800b99b8Sopenharmony_ci}
567800b99b8Sopenharmony_ci
568800b99b8Sopenharmony_ci/**
569800b99b8Sopenharmony_ci * @tc.name: FaultLoggerDaemonTest013
570800b99b8Sopenharmony_ci * @tc.desc: test FaultLoggerDaemon StartServer and AddEvent
571800b99b8Sopenharmony_ci * @tc.type: FUNC
572800b99b8Sopenharmony_ci */
573800b99b8Sopenharmony_ciHWTEST_F (FaultLoggerDaemonTest, FaultLoggerDaemonTest013, TestSize.Level2)
574800b99b8Sopenharmony_ci{
575800b99b8Sopenharmony_ci    GTEST_LOG_(INFO) << "FaultLoggerDaemonTest013: start.";
576800b99b8Sopenharmony_ci    MockFaultLoggerDaemon mockDaemon;
577800b99b8Sopenharmony_ci
578800b99b8Sopenharmony_ci    EXPECT_CALL(mockDaemon, CreateSockets()).WillOnce(testing::Return(false));
579800b99b8Sopenharmony_ci    EXPECT_EQ(mockDaemon.StartServer(), -1);
580800b99b8Sopenharmony_ci    EXPECT_CALL(mockDaemon, CreateSockets()).WillOnce(testing::Return(true));
581800b99b8Sopenharmony_ci    EXPECT_CALL(mockDaemon, InitEnvironment()).WillOnce(testing::Return(false));
582800b99b8Sopenharmony_ci    EXPECT_EQ(mockDaemon.StartServer(), -1);
583800b99b8Sopenharmony_ci    EXPECT_CALL(mockDaemon, CreateSockets()).WillOnce(testing::Return(true));
584800b99b8Sopenharmony_ci    EXPECT_CALL(mockDaemon, InitEnvironment()).WillOnce(testing::Return(true));
585800b99b8Sopenharmony_ci    EXPECT_CALL(mockDaemon, CreateEventFd()).WillOnce(testing::Return(false));
586800b99b8Sopenharmony_ci    EXPECT_EQ(mockDaemon.StartServer(), -1);
587800b99b8Sopenharmony_ci    EXPECT_CALL(mockDaemon, CreateSockets()).WillOnce(testing::Return(true));
588800b99b8Sopenharmony_ci    EXPECT_CALL(mockDaemon, InitEnvironment()).WillOnce(testing::Return(true));
589800b99b8Sopenharmony_ci    EXPECT_CALL(mockDaemon, CreateEventFd()).WillOnce(testing::Return(true));
590800b99b8Sopenharmony_ci    EXPECT_CALL(mockDaemon, WaitForRequest()).WillOnce(testing::Return());
591800b99b8Sopenharmony_ci    EXPECT_EQ(mockDaemon.StartServer(), 0);
592800b99b8Sopenharmony_ci
593800b99b8Sopenharmony_ci    FaultLoggerDaemon daemon;
594800b99b8Sopenharmony_ci    EXPECT_EQ(daemon.InitEnvironment(), true);
595800b99b8Sopenharmony_ci    EXPECT_EQ(daemon.CreateEventFd(), true);
596800b99b8Sopenharmony_ci    daemon.CleanupEventFd();
597800b99b8Sopenharmony_ci    daemon.CleanupSockets();
598800b99b8Sopenharmony_ci    daemon.AddEvent(1, 1, 1);
599800b99b8Sopenharmony_ci    GTEST_LOG_(INFO) << "FaultLoggerDaemonTest013: end.";
600800b99b8Sopenharmony_ci}
601800b99b8Sopenharmony_ci#endif
602800b99b8Sopenharmony_ci
603800b99b8Sopenharmony_cibool CheckReadResp(int sockfd)
604800b99b8Sopenharmony_ci{
605800b99b8Sopenharmony_ci    char controlBuffer[SOCKET_BUFFER_SIZE] = {0};
606800b99b8Sopenharmony_ci    ssize_t nread = OHOS_TEMP_FAILURE_RETRY(read(sockfd, controlBuffer, sizeof(controlBuffer) - 1));
607800b99b8Sopenharmony_ci    if (nread != static_cast<ssize_t>(strlen(FAULTLOGGER_DAEMON_RESP))) {
608800b99b8Sopenharmony_ci        return false;
609800b99b8Sopenharmony_ci    }
610800b99b8Sopenharmony_ci    return true;
611800b99b8Sopenharmony_ci}
612800b99b8Sopenharmony_ci
613800b99b8Sopenharmony_civoid HandleRequestByPipeTypeCommon(std::shared_ptr<FaultLoggerDaemon> daemon, int32_t pipeType,
614800b99b8Sopenharmony_ci    bool isPassCheck = false, bool isJson = false, bool isChangeFd = false)
615800b99b8Sopenharmony_ci{
616800b99b8Sopenharmony_ci    int fd = -1;
617800b99b8Sopenharmony_ci    FaultLoggerdRequest request;
618800b99b8Sopenharmony_ci    request.pipeType = pipeType;
619800b99b8Sopenharmony_ci    std::unique_ptr<FaultLoggerPipe2> ptr = std::make_unique<FaultLoggerPipe2>(GetTimeMilliSeconds(), isJson);
620800b99b8Sopenharmony_ci
621800b99b8Sopenharmony_ci    if (!isPassCheck) {
622800b99b8Sopenharmony_ci        daemon->HandleRequestByPipeType(fd, 1, &request, ptr.get());
623800b99b8Sopenharmony_ci        if (!isChangeFd) {
624800b99b8Sopenharmony_ci            EXPECT_EQ(fd, -1);
625800b99b8Sopenharmony_ci        } else {
626800b99b8Sopenharmony_ci            EXPECT_NE(fd, -1);
627800b99b8Sopenharmony_ci        }
628800b99b8Sopenharmony_ci        close(fd);
629800b99b8Sopenharmony_ci        return;
630800b99b8Sopenharmony_ci    }
631800b99b8Sopenharmony_ci
632800b99b8Sopenharmony_ci    int socketFd[2]; // 2 : the length of the array
633800b99b8Sopenharmony_ci    if (socketpair(AF_UNIX, SOCK_STREAM, 0, socketFd) == 0) {
634800b99b8Sopenharmony_ci        pid_t pid = fork();
635800b99b8Sopenharmony_ci        if (pid == 0) {
636800b99b8Sopenharmony_ci            sleep(1);
637800b99b8Sopenharmony_ci            if (CheckReadResp(socketFd[1])) {
638800b99b8Sopenharmony_ci                std::string test = "test";
639800b99b8Sopenharmony_ci                OHOS_TEMP_FAILURE_RETRY(write(socketFd[1], test.c_str(), sizeof(test)));
640800b99b8Sopenharmony_ci            }
641800b99b8Sopenharmony_ci        } else if (pid > 0) {
642800b99b8Sopenharmony_ci            daemon->connectionMap_[socketFd[0]] = socketFd[0];
643800b99b8Sopenharmony_ci            daemon->HandleRequestByPipeType(fd, socketFd[0], &request, ptr.get());
644800b99b8Sopenharmony_ci            if (!isChangeFd) {
645800b99b8Sopenharmony_ci                EXPECT_EQ(fd, -1);
646800b99b8Sopenharmony_ci            } else {
647800b99b8Sopenharmony_ci                EXPECT_NE(fd, -1);
648800b99b8Sopenharmony_ci            }
649800b99b8Sopenharmony_ci            close(fd);
650800b99b8Sopenharmony_ci            close(socketFd[1]);
651800b99b8Sopenharmony_ci        }
652800b99b8Sopenharmony_ci    }
653800b99b8Sopenharmony_ci}
654800b99b8Sopenharmony_ci
655800b99b8Sopenharmony_ci/**
656800b99b8Sopenharmony_ci * @tc.name: FaultLoggerDaemonTest014
657800b99b8Sopenharmony_ci * @tc.desc: test FaultLoggerDaemon for HandleRequestByPipeType
658800b99b8Sopenharmony_ci * @tc.type: FUNC
659800b99b8Sopenharmony_ci */
660800b99b8Sopenharmony_ciHWTEST_F (FaultLoggerDaemonTest, FaultLoggerDaemonTest014, TestSize.Level4)
661800b99b8Sopenharmony_ci{
662800b99b8Sopenharmony_ci    GTEST_LOG_(INFO) << "FaultLoggerDaemonTest014: start.";
663800b99b8Sopenharmony_ci    std::shared_ptr<FaultLoggerDaemon> daemon = std::make_shared<FaultLoggerDaemon>();
664800b99b8Sopenharmony_ci    daemon->InitEnvironment();
665800b99b8Sopenharmony_ci    HandleRequestByPipeTypeCommon(daemon, FaultLoggerPipeType::PIPE_FD_READ_BUF, true, false, true);
666800b99b8Sopenharmony_ci    sleep(2);
667800b99b8Sopenharmony_ci    HandleRequestByPipeTypeCommon(daemon, FaultLoggerPipeType::PIPE_FD_READ_RES, true, false, true);
668800b99b8Sopenharmony_ci    sleep(2);
669800b99b8Sopenharmony_ci    HandleRequestByPipeTypeCommon(daemon, FaultLoggerPipeType::PIPE_FD_JSON_READ_BUF, true, true, true);
670800b99b8Sopenharmony_ci    sleep(2);
671800b99b8Sopenharmony_ci    HandleRequestByPipeTypeCommon(daemon, FaultLoggerPipeType::PIPE_FD_JSON_READ_RES, true, true, true);
672800b99b8Sopenharmony_ci    sleep(2);
673800b99b8Sopenharmony_ci    HandleRequestByPipeTypeCommon(daemon, FaultLoggerPipeType::PIPE_FD_READ_BUF, false, false, false);
674800b99b8Sopenharmony_ci    HandleRequestByPipeTypeCommon(daemon, FaultLoggerPipeType::PIPE_FD_WRITE_BUF, false, false, true);
675800b99b8Sopenharmony_ci    HandleRequestByPipeTypeCommon(daemon, FaultLoggerPipeType::PIPE_FD_READ_RES, false, false, false);
676800b99b8Sopenharmony_ci    HandleRequestByPipeTypeCommon(daemon, FaultLoggerPipeType::PIPE_FD_WRITE_RES, false, false, true);
677800b99b8Sopenharmony_ci    HandleRequestByPipeTypeCommon(daemon, FaultLoggerPipeType::PIPE_FD_JSON_READ_BUF, false, true, false);
678800b99b8Sopenharmony_ci    HandleRequestByPipeTypeCommon(daemon, FaultLoggerPipeType::PIPE_FD_JSON_WRITE_BUF, false, true, true);
679800b99b8Sopenharmony_ci    HandleRequestByPipeTypeCommon(daemon, FaultLoggerPipeType::PIPE_FD_JSON_READ_RES, false, true, false);
680800b99b8Sopenharmony_ci    HandleRequestByPipeTypeCommon(daemon, FaultLoggerPipeType::PIPE_FD_JSON_WRITE_RES, false, true, true);
681800b99b8Sopenharmony_ci    GTEST_LOG_(INFO) << "FaultLoggerDaemonTest014: end.";
682800b99b8Sopenharmony_ci}
683800b99b8Sopenharmony_ci
684800b99b8Sopenharmony_civoid HandleRequestTestCommon(std::shared_ptr<FaultLoggerDaemon> daemon, char* buff, size_t len,
685800b99b8Sopenharmony_ci    void *(*startRoutine)(void *))
686800b99b8Sopenharmony_ci{
687800b99b8Sopenharmony_ci    int socketFd[2]; // 2 : the length of the array
688800b99b8Sopenharmony_ci    if (socketpair(AF_UNIX, SOCK_STREAM, 0, socketFd) == 0) {
689800b99b8Sopenharmony_ci        OHOS_TEMP_FAILURE_RETRY(write(socketFd[1], buff, len));
690800b99b8Sopenharmony_ci        daemon->connectionMap_[socketFd[0]] = socketFd[0];
691800b99b8Sopenharmony_ci
692800b99b8Sopenharmony_ci        if (!startRoutine) {
693800b99b8Sopenharmony_ci            daemon->HandleRequest(0, socketFd[0]);
694800b99b8Sopenharmony_ci        } else {
695800b99b8Sopenharmony_ci            pthread_t threadId;
696800b99b8Sopenharmony_ci            if (pthread_create(&threadId, nullptr, startRoutine, reinterpret_cast<void*>(socketFd[1])) != 0) {
697800b99b8Sopenharmony_ci                perror("Failed to create thread");
698800b99b8Sopenharmony_ci                close(socketFd[0]);
699800b99b8Sopenharmony_ci                close(socketFd[1]);
700800b99b8Sopenharmony_ci                return;
701800b99b8Sopenharmony_ci            }
702800b99b8Sopenharmony_ci
703800b99b8Sopenharmony_ci            daemon->HandleRequest(0, socketFd[0]);
704800b99b8Sopenharmony_ci            EXPECT_NE(socketFd[0], -1);
705800b99b8Sopenharmony_ci
706800b99b8Sopenharmony_ci            pthread_join(threadId, nullptr);
707800b99b8Sopenharmony_ci        }
708800b99b8Sopenharmony_ci        close(socketFd[1]);
709800b99b8Sopenharmony_ci    }
710800b99b8Sopenharmony_ci}
711800b99b8Sopenharmony_ci
712800b99b8Sopenharmony_civoid HandleRequestByClientTypeForDefaultClientTest(std::shared_ptr<FaultLoggerDaemon> daemon)
713800b99b8Sopenharmony_ci{
714800b99b8Sopenharmony_ci    FaultLoggerdRequest requst;
715800b99b8Sopenharmony_ci    requst.clientType = FaultLoggerClientType::DEFAULT_CLIENT;
716800b99b8Sopenharmony_ci    HandleRequestTestCommon(daemon, reinterpret_cast<char*>(&requst), sizeof(FaultLoggerdRequest), nullptr);
717800b99b8Sopenharmony_ci    requst.type = FaultLoggerType::CPP_CRASH;
718800b99b8Sopenharmony_ci    HandleRequestTestCommon(daemon, reinterpret_cast<char*>(&requst), sizeof(FaultLoggerdRequest), nullptr);
719800b99b8Sopenharmony_ci    requst.type = FaultLoggerType::JS_HEAP_SNAPSHOT;
720800b99b8Sopenharmony_ci    HandleRequestTestCommon(daemon, reinterpret_cast<char*>(&requst), sizeof(FaultLoggerdRequest), nullptr);
721800b99b8Sopenharmony_ci    daemon->crashTimeMap_[1] = time(nullptr) - 10; // 10 : Get the first 10 seconds of the current time
722800b99b8Sopenharmony_ci    HandleRequestTestCommon(daemon, reinterpret_cast<char*>(&requst), sizeof(FaultLoggerdRequest), nullptr);
723800b99b8Sopenharmony_ci    daemon->crashTimeMap_[1] = time(nullptr);
724800b99b8Sopenharmony_ci    HandleRequestTestCommon(daemon, reinterpret_cast<char*>(&requst), sizeof(FaultLoggerdRequest), nullptr);
725800b99b8Sopenharmony_ci}
726800b99b8Sopenharmony_ci
727800b99b8Sopenharmony_civoid *ReadThread1(void *param)
728800b99b8Sopenharmony_ci{
729800b99b8Sopenharmony_ci    long fd = reinterpret_cast<long>(param);
730800b99b8Sopenharmony_ci    char buff[FAULTLOGGERD_FUZZ_READ_BUFF];
731800b99b8Sopenharmony_ci    OHOS_TEMP_FAILURE_RETRY(read(fd, buff, sizeof(buff)));
732800b99b8Sopenharmony_ci    char msg[] = "any test str";
733800b99b8Sopenharmony_ci    OHOS_TEMP_FAILURE_RETRY(write(fd, reinterpret_cast<char*>(msg), sizeof(msg)));
734800b99b8Sopenharmony_ci    return nullptr;
735800b99b8Sopenharmony_ci}
736800b99b8Sopenharmony_ci
737800b99b8Sopenharmony_civoid *ReadThread2(void *param)
738800b99b8Sopenharmony_ci{
739800b99b8Sopenharmony_ci    long fd = reinterpret_cast<long>(param);
740800b99b8Sopenharmony_ci    char buff[FAULTLOGGERD_FUZZ_READ_BUFF];
741800b99b8Sopenharmony_ci    OHOS_TEMP_FAILURE_RETRY(read(fd, buff, sizeof(buff)));
742800b99b8Sopenharmony_ci    CrashDumpException test;
743800b99b8Sopenharmony_ci    test.error = CRASH_DUMP_LOCAL_REPORT;
744800b99b8Sopenharmony_ci    OHOS_TEMP_FAILURE_RETRY(write(fd, reinterpret_cast<char*>(&test), sizeof(CrashDumpException)));
745800b99b8Sopenharmony_ci    return nullptr;
746800b99b8Sopenharmony_ci}
747800b99b8Sopenharmony_ci
748800b99b8Sopenharmony_civoid *ReadThread3(void *param)
749800b99b8Sopenharmony_ci{
750800b99b8Sopenharmony_ci    long fd = reinterpret_cast<long>(param);
751800b99b8Sopenharmony_ci    char buff[FAULTLOGGERD_FUZZ_READ_BUFF];
752800b99b8Sopenharmony_ci    OHOS_TEMP_FAILURE_RETRY(read(fd, buff, sizeof(buff)));
753800b99b8Sopenharmony_ci    CrashDumpException test{};
754800b99b8Sopenharmony_ci    OHOS_TEMP_FAILURE_RETRY(write(fd, reinterpret_cast<char*>(&test), sizeof(CrashDumpException)));
755800b99b8Sopenharmony_ci    return nullptr;
756800b99b8Sopenharmony_ci}
757800b99b8Sopenharmony_ci
758800b99b8Sopenharmony_civoid HandleRequestByClientTypeTest(std::shared_ptr<FaultLoggerDaemon> daemon)
759800b99b8Sopenharmony_ci{
760800b99b8Sopenharmony_ci    {
761800b99b8Sopenharmony_ci        FaultLoggerdRequest requst;
762800b99b8Sopenharmony_ci        requst.clientType = FaultLoggerClientType::LOG_FILE_DES_CLIENT;
763800b99b8Sopenharmony_ci        HandleRequestTestCommon(daemon, reinterpret_cast<char*>(&requst), sizeof(FaultLoggerdRequest), nullptr);
764800b99b8Sopenharmony_ci    }
765800b99b8Sopenharmony_ci    {
766800b99b8Sopenharmony_ci        FaultLoggerdRequest requst;
767800b99b8Sopenharmony_ci        requst.clientType = FaultLoggerClientType::PRINT_T_HILOG_CLIENT;
768800b99b8Sopenharmony_ci        HandleRequestTestCommon(daemon, reinterpret_cast<char*>(&requst), sizeof(FaultLoggerdRequest), ReadThread2);
769800b99b8Sopenharmony_ci    }
770800b99b8Sopenharmony_ci    {
771800b99b8Sopenharmony_ci        FaultLoggerdRequest requst;
772800b99b8Sopenharmony_ci        requst.clientType = FaultLoggerClientType::PERMISSION_CLIENT;
773800b99b8Sopenharmony_ci        HandleRequestTestCommon(daemon, reinterpret_cast<char*>(&requst), sizeof(FaultLoggerdRequest), ReadThread2);
774800b99b8Sopenharmony_ci    }
775800b99b8Sopenharmony_ci    {
776800b99b8Sopenharmony_ci        FaultLoggerdRequest requst;
777800b99b8Sopenharmony_ci        requst.clientType = FaultLoggerClientType::SDK_DUMP_CLIENT;
778800b99b8Sopenharmony_ci        requst.pid = 1;
779800b99b8Sopenharmony_ci        HandleRequestTestCommon(daemon, reinterpret_cast<char*>(&requst), sizeof(FaultLoggerdRequest), ReadThread2);
780800b99b8Sopenharmony_ci    }
781800b99b8Sopenharmony_ci    {
782800b99b8Sopenharmony_ci        FaultLoggerdRequest requst;
783800b99b8Sopenharmony_ci        requst.clientType = FaultLoggerClientType::PIPE_FD_CLIENT;
784800b99b8Sopenharmony_ci        HandleRequestTestCommon(daemon, reinterpret_cast<char*>(&requst), sizeof(FaultLoggerdRequest), nullptr);
785800b99b8Sopenharmony_ci    }
786800b99b8Sopenharmony_ci    {
787800b99b8Sopenharmony_ci        FaultLoggerdRequest requst;
788800b99b8Sopenharmony_ci        requst.clientType = FaultLoggerClientType::REPORT_EXCEPTION_CLIENT;
789800b99b8Sopenharmony_ci        HandleRequestTestCommon(daemon, reinterpret_cast<char*>(&requst), sizeof(FaultLoggerdRequest), ReadThread1);
790800b99b8Sopenharmony_ci        HandleRequestTestCommon(daemon, reinterpret_cast<char*>(&requst), sizeof(FaultLoggerdRequest), ReadThread2);
791800b99b8Sopenharmony_ci        HandleRequestTestCommon(daemon, reinterpret_cast<char*>(&requst), sizeof(FaultLoggerdRequest), ReadThread3);
792800b99b8Sopenharmony_ci    }
793800b99b8Sopenharmony_ci    {
794800b99b8Sopenharmony_ci        FaultLoggerdRequest requst;
795800b99b8Sopenharmony_ci        requst.clientType = -1;
796800b99b8Sopenharmony_ci        HandleRequestTestCommon(daemon, reinterpret_cast<char*>(&requst), sizeof(FaultLoggerdRequest), nullptr);
797800b99b8Sopenharmony_ci    }
798800b99b8Sopenharmony_ci}
799800b99b8Sopenharmony_ci
800800b99b8Sopenharmony_ci/**
801800b99b8Sopenharmony_ci * @tc.name: FaultLoggerDaemonTest015
802800b99b8Sopenharmony_ci * @tc.desc: test FaultLoggerDaemon for HandleRequest
803800b99b8Sopenharmony_ci * @tc.type: FUNC
804800b99b8Sopenharmony_ci */
805800b99b8Sopenharmony_ciHWTEST_F (FaultLoggerDaemonTest, FaultLoggerDaemonTest015, TestSize.Level4)
806800b99b8Sopenharmony_ci{
807800b99b8Sopenharmony_ci    GTEST_LOG_(INFO) << "FaultLoggerDaemonTest015: start.";
808800b99b8Sopenharmony_ci    std::shared_ptr<FaultLoggerDaemon> daemon = std::make_shared<FaultLoggerDaemon>();
809800b99b8Sopenharmony_ci    {
810800b99b8Sopenharmony_ci        int32_t epollFd = 1;
811800b99b8Sopenharmony_ci        int32_t connectionFd = 4; // 4 : simulate an fd greater than 3
812800b99b8Sopenharmony_ci        daemon->HandleRequest(epollFd, connectionFd);
813800b99b8Sopenharmony_ci        connectionFd = 2;
814800b99b8Sopenharmony_ci        daemon->HandleRequest(epollFd, connectionFd);
815800b99b8Sopenharmony_ci        EXPECT_EQ(epollFd, 1);
816800b99b8Sopenharmony_ci        epollFd = -1;
817800b99b8Sopenharmony_ci        daemon->HandleRequest(epollFd, connectionFd);
818800b99b8Sopenharmony_ci        EXPECT_EQ(epollFd, -1);
819800b99b8Sopenharmony_ci        connectionFd = 4;
820800b99b8Sopenharmony_ci        daemon->HandleRequest(epollFd, connectionFd);
821800b99b8Sopenharmony_ci        EXPECT_EQ(epollFd, -1);
822800b99b8Sopenharmony_ci    }
823800b99b8Sopenharmony_ci    {
824800b99b8Sopenharmony_ci        int socketFd[2]; // 2 : the length of the array
825800b99b8Sopenharmony_ci        if (socketpair(AF_UNIX, SOCK_STREAM, 0, socketFd) == 0) {
826800b99b8Sopenharmony_ci            close(socketFd[1]);
827800b99b8Sopenharmony_ci            daemon->HandleRequest(0, socketFd[0]);
828800b99b8Sopenharmony_ci        }
829800b99b8Sopenharmony_ci    }
830800b99b8Sopenharmony_ci    {
831800b99b8Sopenharmony_ci        FaultLoggerdRequest requst;
832800b99b8Sopenharmony_ci        int socketFd[2]; // 2 : the length of the array
833800b99b8Sopenharmony_ci        if (socketpair(AF_UNIX, SOCK_STREAM, 0, socketFd) == 0) {
834800b99b8Sopenharmony_ci            OHOS_TEMP_FAILURE_RETRY(write(socketFd[1], reinterpret_cast<char*>(&requst), sizeof(FaultLoggerdRequest)));
835800b99b8Sopenharmony_ci            daemon->HandleRequest(0, socketFd[0]);
836800b99b8Sopenharmony_ci            close(socketFd[1]);
837800b99b8Sopenharmony_ci        }
838800b99b8Sopenharmony_ci        EXPECT_NE(socketFd[1], -1);
839800b99b8Sopenharmony_ci    }
840800b99b8Sopenharmony_ci
841800b99b8Sopenharmony_ci    if (!daemon->InitEnvironment()) {
842800b99b8Sopenharmony_ci        daemon->CleanupSockets();
843800b99b8Sopenharmony_ci    }
844800b99b8Sopenharmony_ci    GTEST_LOG_(INFO) << "FaultLoggerDaemonTest015: end.";
845800b99b8Sopenharmony_ci}
846800b99b8Sopenharmony_ci
847800b99b8Sopenharmony_cistd::vector<FaultLoggerdStatsRequest> InitStatsRequests()
848800b99b8Sopenharmony_ci{
849800b99b8Sopenharmony_ci    std::vector<FaultLoggerdStatsRequest> statsRequest;
850800b99b8Sopenharmony_ci    {
851800b99b8Sopenharmony_ci        FaultLoggerdStatsRequest requst{};
852800b99b8Sopenharmony_ci        requst.type = PROCESS_DUMP;
853800b99b8Sopenharmony_ci        requst.signalTime = GetTimeMilliSeconds();
854800b99b8Sopenharmony_ci        requst.pid = 1;
855800b99b8Sopenharmony_ci        requst.processdumpStartTime = time(nullptr);
856800b99b8Sopenharmony_ci        requst.processdumpFinishTime = time(nullptr) + 10; // 10 : Get the last 10 seconds of the current time
857800b99b8Sopenharmony_ci        statsRequest.emplace_back(requst);
858800b99b8Sopenharmony_ci    }
859800b99b8Sopenharmony_ci    {
860800b99b8Sopenharmony_ci        FaultLoggerdStatsRequest requst{};
861800b99b8Sopenharmony_ci        auto lastRequst = statsRequest.back();
862800b99b8Sopenharmony_ci        requst.type = DUMP_CATCHER;
863800b99b8Sopenharmony_ci        requst.pid = lastRequst.pid;
864800b99b8Sopenharmony_ci        requst.requestTime = time(nullptr);
865800b99b8Sopenharmony_ci        requst.dumpCatcherFinishTime = time(nullptr) + 10; // 10 : Get the last 10 seconds of the current time
866800b99b8Sopenharmony_ci        requst.result = 1;
867800b99b8Sopenharmony_ci        statsRequest.emplace_back(requst);
868800b99b8Sopenharmony_ci    }
869800b99b8Sopenharmony_ci    {
870800b99b8Sopenharmony_ci        FaultLoggerdStatsRequest requst{};
871800b99b8Sopenharmony_ci        requst.type = DUMP_CATCHER;
872800b99b8Sopenharmony_ci        requst.pid = 1;
873800b99b8Sopenharmony_ci        requst.requestTime = time(nullptr);
874800b99b8Sopenharmony_ci        requst.dumpCatcherFinishTime = time(nullptr) + 10; // 10 : Get the last 10 seconds of the current time
875800b99b8Sopenharmony_ci        requst.result = 1;
876800b99b8Sopenharmony_ci        statsRequest.emplace_back(requst);
877800b99b8Sopenharmony_ci    }
878800b99b8Sopenharmony_ci    return statsRequest;
879800b99b8Sopenharmony_ci}
880800b99b8Sopenharmony_ci
881800b99b8Sopenharmony_ci/**
882800b99b8Sopenharmony_ci * @tc.name: FaultLoggerDaemonTest016
883800b99b8Sopenharmony_ci * @tc.desc: test FaultLoggerDaemon for HandleDumpStats
884800b99b8Sopenharmony_ci * @tc.type: FUNC
885800b99b8Sopenharmony_ci */
886800b99b8Sopenharmony_ciHWTEST_F (FaultLoggerDaemonTest, FaultLoggerDaemonTest016, TestSize.Level4)
887800b99b8Sopenharmony_ci{
888800b99b8Sopenharmony_ci    GTEST_LOG_(INFO) << "FaultLoggerDaemonTest016: start.";
889800b99b8Sopenharmony_ci    std::shared_ptr<FaultLoggerDaemon> daemon = std::make_shared<FaultLoggerDaemon>();
890800b99b8Sopenharmony_ci    std::vector<FaultLoggerdStatsRequest> statsRequest = InitStatsRequests();
891800b99b8Sopenharmony_ci    for (auto requst : statsRequest) {
892800b99b8Sopenharmony_ci        HandleRequestTestCommon(daemon, reinterpret_cast<char*>(&requst), sizeof(FaultLoggerdStatsRequest), nullptr);
893800b99b8Sopenharmony_ci    }
894800b99b8Sopenharmony_ci    GTEST_LOG_(INFO) << "FaultLoggerDaemonTest016: end.";
895800b99b8Sopenharmony_ci}
896800b99b8Sopenharmony_ci
897800b99b8Sopenharmony_ci/**
898800b99b8Sopenharmony_ci * @tc.name: FaultLoggerDaemonTest017
899800b99b8Sopenharmony_ci * @tc.desc: test FaultLoggerDaemon for HandleRequest
900800b99b8Sopenharmony_ci * @tc.type: FUNC
901800b99b8Sopenharmony_ci */
902800b99b8Sopenharmony_ciHWTEST_F (FaultLoggerDaemonTest, FaultLoggerDaemonTest017, TestSize.Level4)
903800b99b8Sopenharmony_ci{
904800b99b8Sopenharmony_ci    GTEST_LOG_(INFO) << "FaultLoggerDaemonTest017: start.";
905800b99b8Sopenharmony_ci    std::shared_ptr<FaultLoggerDaemon> daemon = std::make_shared<FaultLoggerDaemon>();
906800b99b8Sopenharmony_ci    HandleRequestByClientTypeForDefaultClientTest(daemon);
907800b99b8Sopenharmony_ci    HandleRequestByClientTypeTest(daemon);
908800b99b8Sopenharmony_ci    GTEST_LOG_(INFO) << "FaultLoggerDaemonTest017: end.";
909800b99b8Sopenharmony_ci}
910800b99b8Sopenharmony_ci}