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}