1/* 2 * Copyright (c) 2022-2023 Huawei Device Co., Ltd. 3 * Licensed under the Apache License, Version 2.0 (the "License"); 4 * you may not use this file except in compliance with the License. 5 * You may obtain a copy of the License at 6 * 7 * http://www.apache.org/licenses/LICENSE-2.0 8 * 9 * Unless required by applicable law or agreed to in writing, software 10 * distributed under the License is distributed on an "AS IS" BASIS, 11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 * See the License for the specific language governing permissions and 13 * limitations under the License. 14 */ 15 16#include "faultloggerd_module_test.h" 17 18#include <securec.h> 19#include <sstream> 20#include <unistd.h> 21 22#include "dfx_test_util.h" 23#include "faultloggerd_client.h" 24 25using namespace OHOS::HiviewDFX; 26using namespace testing::ext; 27 28namespace { 29void WaitForServiceReady(const std::string& serviceName) 30{ 31 int pid = GetProcessPid(serviceName); 32 if (pid <= 0) { 33 std::string cmd = "start " + serviceName; 34 ExecuteCommands(cmd); 35 const int sleepTime = 10; // 10 seconds 36 sleep(sleepTime); 37 pid = GetProcessPid(serviceName); 38 } 39 ASSERT_GT(pid, 0); 40 ASSERT_TRUE(CheckConnectStatus()); 41} 42 43void CheckFdRequestFunction(FaultLoggerType type, bool isValidFd) 44{ 45 int32_t fd = RequestFileDescriptor(static_cast<int32_t>(type)); 46 ASSERT_EQ((fd >= 0), isValidFd); 47 if (fd >= 0) { 48 close(fd); 49 } 50} 51 52/** 53 * @tc.name: FaultloggerdClientPipeFdRquestTest001 54 * @tc.desc: check faultloggerd RequestPipeFd function 55 * @tc.type: FUNC 56 */ 57HWTEST_F(FaultloggerdModuleTest, FaultloggerdClientPipeFdRquestTest001, TestSize.Level0) 58{ 59 RequestSdkDump(getpid(), getpid()); 60 int32_t pipeFd = RequestPipeFd(getpid(), FaultLoggerPipeType::PIPE_FD_READ_BUF); 61 ASSERT_NE(pipeFd, -1); 62 int32_t ret = RequestDelPipeFd(getpid()); 63 ASSERT_EQ(ret, 0); 64 pipeFd = RequestPipeFd(getpid(), FaultLoggerPipeType::PIPE_FD_READ_BUF); 65 ASSERT_EQ(pipeFd, -1); 66} 67 68/** 69 * @tc.name: FaultloggerdServiceTest001 70 * @tc.desc: check faultloggerd running status and ensure it has been started 71 * @tc.type: FUNC 72 */ 73HWTEST_F(FaultloggerdModuleTest, FaultloggerdServiceTest001, TestSize.Level0) 74{ 75 WaitForServiceReady("faultloggerd"); 76} 77 78#if defined(__BIONIC__) 79/** 80 * @tc.name: FaultloggerdDfxHandlerPreloadTest001 81 * @tc.desc: check whether libdfx_signalhandler.z.so is preloaded. 82 * @tc.type: FUNC 83 */ 84HWTEST_F(FaultloggerdModuleTest, FaultloggerdDfxHandlerPreloadTest001, TestSize.Level0) 85{ 86 std::string cmd = "cat /proc/" + std::to_string(getpid()) + "/maps"; 87 std::string result = ExecuteCommands(cmd); 88 ASSERT_EQ(result.find("libdfx_signalhandler.z.so") != std::string::npos, true); 89} 90#endif 91 92/** 93 * @tc.name: FaultloggerdClientFdRquestTest001 94 * @tc.desc: check faultloggerd logging function 95 * @tc.type: FUNC 96 */ 97HWTEST_F(FaultloggerdModuleTest, FaultloggerdClientFdRquestTest001, TestSize.Level0) 98{ 99 CheckFdRequestFunction(FaultLoggerType::CPP_CRASH, true); 100 CheckFdRequestFunction(FaultLoggerType::CPP_STACKTRACE, true); 101 CheckFdRequestFunction(FaultLoggerType::JS_STACKTRACE, true); 102 CheckFdRequestFunction(FaultLoggerType::JS_HEAP_SNAPSHOT, true); 103 CheckFdRequestFunction(FaultLoggerType::LEAK_STACKTRACE, true); 104} 105 106/** 107 * @tc.name: FaultloggerdClientFdRquestTest002 108 * @tc.desc: check faultloggerd RequestLogFileDescriptor function 109 * @tc.type: FUNC 110 */ 111HWTEST_F(FaultloggerdModuleTest, FaultloggerdClientFdRquestTest002, TestSize.Level0) 112{ 113 struct FaultLoggerdRequest testRequest; 114 (void)memset_s(&testRequest, sizeof(testRequest), 0, sizeof(testRequest)); 115 testRequest.type = (int)FaultLoggerType::CPP_CRASH; 116 testRequest.pid = getpid(); 117 testRequest.tid = gettid(); 118 testRequest.uid = getuid(); 119 int32_t fd = RequestLogFileDescriptor(&testRequest); 120 ASSERT_TRUE(fd >= 0); 121 if (fd >= 0) { 122 close(fd); 123 } 124} 125 126/** 127 * @tc.name: FaultloggerdClientFdRquestTest003 128 * @tc.desc: check faultloggerd RequestPrintTHilog function 129 * @tc.type: FUNC 130 */ 131HWTEST_F(FaultloggerdModuleTest, FaultloggerdClientFdRquestTest003, TestSize.Level0) 132{ 133 char msg[] = "test log"; 134 size_t len = strlen(msg); 135 ASSERT_EQ(RequestPrintTHilog(msg, len), 0); 136} 137 138/** 139 * @tc.name: FaultloggerdClientFdRquestTest004 140 * @tc.desc: check faultloggerd RequestFileDescriptorEx function 141 * @tc.type: FUNC 142 */ 143HWTEST_F(FaultloggerdModuleTest, FaultloggerdClientFdRquestTest004, TestSize.Level0) 144{ 145 struct FaultLoggerdRequest testRequest; 146 (void)memset_s(&testRequest, sizeof(testRequest), 0, sizeof(testRequest)); 147 testRequest.type = (int)FaultLoggerType::CPP_CRASH; 148 testRequest.pid = getpid(); 149 testRequest.tid = gettid(); 150 testRequest.uid = getuid(); 151 int32_t fd = RequestFileDescriptorEx(&testRequest); 152 ASSERT_TRUE(fd >= 0); 153 if (fd >= 0) { 154 close(fd); 155 } 156} 157 158/** 159 * @tc.name: FaultloggerdClientPipeFdRquestTest002 160 * @tc.desc: check faultloggerd RequestPipeFd function by param error 161 * @tc.type: FUNC 162 */ 163HWTEST_F(FaultloggerdModuleTest, FaultloggerdClientPipeFdRquestTest002, TestSize.Level0) 164{ 165 RequestSdkDump(getpid(), getpid()); 166 int32_t pipeFd = RequestPipeFd(getpid(), -1); 167 ASSERT_EQ(pipeFd, -1); 168 pipeFd = RequestPipeFd(getpid(), FaultLoggerPipeType::PIPE_FD_DELETE); 169 ASSERT_EQ(pipeFd, -1); 170} 171 172/** 173 * @tc.name: FaultloggerdPermissionCheckTest001 174 * @tc.desc: check faultloggerd RequestCheckPermission function 175 * @tc.type: FUNC 176 */ 177HWTEST_F(FaultloggerdModuleTest, FaultloggerdPermissionCheckTest001, TestSize.Level0) 178{ 179 ASSERT_TRUE(RequestCheckPermission(getpid())); 180} 181} 182