1/* 2 * Copyright (c) 2024 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 <ctime> 17#include <gtest/gtest.h> 18#include <securec.h> 19#include <string> 20#include <vector> 21 22#include "crash_exception.h" 23#include "crash_exception_listener.h" 24#include "dfx_errors.h" 25#include "dfx_util.h" 26#include "hisysevent_manager.h" 27 28using namespace OHOS::HiviewDFX; 29using namespace testing::ext; 30using namespace std; 31 32namespace OHOS { 33namespace HiviewDFX { 34class CrashExceptionTest : public testing::Test { 35public: 36 static void SetUpTestCase(void) {} 37 static void TearDownTestCase(void) {} 38 void SetUp() {} 39 void TearDown() {} 40}; 41 42static constexpr int32_t TEST_PROCESS_ID = 1234; 43static constexpr int32_t TEST_UID = 5678; 44 45/** 46 * @tc.name: CrashExceptionTest001 47 * @tc.desc: test ReportCrashException 48 * @tc.type: FUNC 49 */ 50HWTEST_F(CrashExceptionTest, CrashExceptionTest001, TestSize.Level2) 51{ 52 GTEST_LOG_(INFO) << "CrashExceptionTest001: start."; 53 char testProcessName[] = "process_name_ptr"; 54 std::shared_ptr<CrashExceptionListener> crashListener = std::make_shared<CrashExceptionListener>(); 55 ListenerRule tagRule("RELIABILITY", "CPP_CRASH_EXCEPTION", RuleType::WHOLE_WORD); 56 std::vector<ListenerRule> sysRules; 57 sysRules.push_back(tagRule); 58 HiSysEventManager::AddListener(crashListener, sysRules); 59 crashListener->SetKeyWord(testProcessName); 60 ReportCrashException(testProcessName, TEST_PROCESS_ID, TEST_UID, CrashExceptionCode::CRASH_UNKNOWN); 61 ASSERT_TRUE(crashListener->CheckKeywordInReasons()); 62 HiSysEventManager::RemoveListener(crashListener); 63 GTEST_LOG_(INFO) << "CrashExceptionTest001: end."; 64} 65 66/** 67 * @tc.name: CrashExceptionTest002 68 * @tc.desc: test ReportCrashException, error code is success. 69 * @tc.type: FUNC 70 */ 71HWTEST_F(CrashExceptionTest, CrashExceptionTest002, TestSize.Level2) 72{ 73 GTEST_LOG_(INFO) << "CrashExceptionTest002: start."; 74 char testProcessName[] = "process_name_ptr"; 75 std::shared_ptr<CrashExceptionListener> crashListener = std::make_shared<CrashExceptionListener>(); 76 ListenerRule tagRule("RELIABILITY", "CPP_CRASH_EXCEPTION", RuleType::WHOLE_WORD); 77 std::vector<ListenerRule> sysRules; 78 sysRules.push_back(tagRule); 79 HiSysEventManager::AddListener(crashListener, sysRules); 80 crashListener->SetKeyWord(testProcessName); 81 ReportCrashException(testProcessName, TEST_PROCESS_ID, TEST_UID, CrashExceptionCode::CRASH_ESUCCESS); 82 ASSERT_FALSE(crashListener->CheckKeywordInReasons()); 83 HiSysEventManager::RemoveListener(crashListener); 84 GTEST_LOG_(INFO) << "CrashExceptionTest002: end."; 85} 86 87/** 88 * @tc.name: CrashExceptionTest003 89 * @tc.desc: test ReportCrashException, process name length is more than 128 bytes. 90 * @tc.type: FUNC 91 */ 92HWTEST_F(CrashExceptionTest, CrashExceptionTest003, TestSize.Level2) 93{ 94 GTEST_LOG_(INFO) << "CrashExceptionTest003: start."; 95 char testProcessName[] = "process_name_ptr_1111111111111111111111111111111111111" 96 "11111111111111111111111111111111111111111111111111111111111111111111111111111111" 97 "11111111111111111111111111111111111111111111111111111111111111111111111111111111"; 98 std::shared_ptr<CrashExceptionListener> crashListener = std::make_shared<CrashExceptionListener>(); 99 ListenerRule tagRule("RELIABILITY", "CPP_CRASH_EXCEPTION", RuleType::WHOLE_WORD); 100 std::vector<ListenerRule> sysRules; 101 sysRules.push_back(tagRule); 102 HiSysEventManager::AddListener(crashListener, sysRules); 103 crashListener->SetKeyWord(testProcessName); 104 ReportCrashException(testProcessName, TEST_PROCESS_ID, TEST_UID, CrashExceptionCode::CRASH_UNKNOWN); 105 ASSERT_FALSE(crashListener->CheckKeywordInReasons()); 106 HiSysEventManager::RemoveListener(crashListener); 107 GTEST_LOG_(INFO) << "CrashExceptionTest003: end."; 108} 109 110/** 111 * @tc.name: CrashExceptionTest004 112 * @tc.desc: test ReportCrashException 113 * @tc.type: FUNC 114 */ 115HWTEST_F(CrashExceptionTest, CrashExceptionTest004, TestSize.Level2) 116{ 117 GTEST_LOG_(INFO) << "CrashExceptionTest004: start."; 118 std::string keyWord = "process_name_string"; 119 std::shared_ptr<CrashExceptionListener> crashListener = std::make_shared<CrashExceptionListener>(); 120 ListenerRule tagRule("RELIABILITY", "CPP_CRASH_EXCEPTION", RuleType::WHOLE_WORD); 121 std::vector<ListenerRule> sysRules; 122 sysRules.push_back(tagRule); 123 HiSysEventManager::AddListener(crashListener, sysRules); 124 crashListener->SetKeyWord(keyWord); 125 ReportCrashException(keyWord, TEST_PROCESS_ID, TEST_UID, CrashExceptionCode::CRASH_UNKNOWN); 126 ASSERT_TRUE(crashListener->CheckKeywordInReasons()); 127 HiSysEventManager::RemoveListener(crashListener); 128 GTEST_LOG_(INFO) << "CrashExceptionTest004: end."; 129} 130 131/** 132 * @tc.name: CrashExceptionTest005 133 * @tc.desc: test ReportCrashException, error code is success. 134 * @tc.type: FUNC 135 */ 136HWTEST_F(CrashExceptionTest, CrashExceptionTest005, TestSize.Level2) 137{ 138 GTEST_LOG_(INFO) << "CrashExceptionTest005: start."; 139 std::string keyWord = "process_name_string"; 140 std::shared_ptr<CrashExceptionListener> crashListener = std::make_shared<CrashExceptionListener>(); 141 ListenerRule tagRule("RELIABILITY", "CPP_CRASH_EXCEPTION", RuleType::WHOLE_WORD); 142 std::vector<ListenerRule> sysRules; 143 sysRules.push_back(tagRule); 144 HiSysEventManager::AddListener(crashListener, sysRules); 145 crashListener->SetKeyWord(keyWord); 146 ReportCrashException(keyWord, TEST_PROCESS_ID, TEST_UID, CrashExceptionCode::CRASH_ESUCCESS); 147 ASSERT_FALSE(crashListener->CheckKeywordInReasons()); 148 HiSysEventManager::RemoveListener(crashListener); 149 GTEST_LOG_(INFO) << "CrashExceptionTest005: end."; 150} 151 152/** 153 * @tc.name: CrashExceptionTest006 154 * @tc.desc: test ReportUnwinderException 155 * @tc.type: FUNC 156 */ 157HWTEST_F(CrashExceptionTest, CrashExceptionTest006, TestSize.Level2) 158{ 159 GTEST_LOG_(INFO) << "CrashExceptionTest006: start."; 160 std::string keyWord = "process_name_unwind"; 161 std::shared_ptr<CrashExceptionListener> crashListener = std::make_shared<CrashExceptionListener>(); 162 ListenerRule tagRule("RELIABILITY", "CPP_CRASH_EXCEPTION", RuleType::WHOLE_WORD); 163 std::vector<ListenerRule> sysRules; 164 sysRules.push_back(tagRule); 165 HiSysEventManager::AddListener(crashListener, sysRules); 166 crashListener->SetKeyWord(keyWord); 167 SetCrashProcInfo(keyWord, TEST_PROCESS_ID, TEST_UID); 168 ReportUnwinderException(UnwindErrorCode::UNW_ERROR_STEP_ARK_FRAME); 169 ASSERT_TRUE(crashListener->CheckKeywordInReasons()); 170 HiSysEventManager::RemoveListener(crashListener); 171 GTEST_LOG_(INFO) << "CrashExceptionTest006: end."; 172} 173 174/** 175 * @tc.name: CrashExceptionTest007 176 * @tc.desc: test ReportUnwinderException, invalid unwind error code. 177 * @tc.type: FUNC 178 */ 179HWTEST_F(CrashExceptionTest, CrashExceptionTest007, TestSize.Level2) 180{ 181 GTEST_LOG_(INFO) << "CrashExceptionTest007: start."; 182 std::string keyWord = "process_name_unwind"; 183 std::shared_ptr<CrashExceptionListener> crashListener = std::make_shared<CrashExceptionListener>(); 184 ListenerRule tagRule("RELIABILITY", "CPP_CRASH_EXCEPTION", RuleType::WHOLE_WORD); 185 std::vector<ListenerRule> sysRules; 186 sysRules.push_back(tagRule); 187 HiSysEventManager::AddListener(crashListener, sysRules); 188 crashListener->SetKeyWord(keyWord); 189 SetCrashProcInfo(keyWord, TEST_PROCESS_ID, TEST_UID); 190 ReportUnwinderException(0); 191 ASSERT_FALSE(crashListener->CheckKeywordInReasons()); 192 HiSysEventManager::RemoveListener(crashListener); 193 GTEST_LOG_(INFO) << "CrashExceptionTest007: end."; 194} 195 196/** 197 * @tc.name: CrashExceptionTest08 198 * @tc.desc: test CheckFaultSummaryValid, valid Fault Summary. 199 * @tc.type: FUNC 200 */ 201HWTEST_F(CrashExceptionTest, CrashExceptionTest08, TestSize.Level2) 202{ 203 GTEST_LOG_(INFO) << "CrashExceptionTest08: start."; 204 std::string summary = std::string("Thread name:sensors\n") + 205 "#00 pc 000c5738 /system/lib/ld-musl-arm.so.1(ioctl+72)(b985d2b9b22c3e542388f5803bac6a56)\n" + 206 "#01 pc 00007fcf /system/lib/chipset-pub-sdk/libipc_common.z.so(OHOS::BinderConnector::WriteBinder(\n" + 207 "#02 pc 00034f35 /system/lib/platformsdk/libipc_core.z.so(OHOS::BinderInvoker::TransactWithDriver(\n" + 208 "#03 pc 000350a5 /system/lib/platformsdk/libipc_core.z.so(OHOS::BinderInvoker::StartWorkLoop(\n" + 209 "#04 pc 000363df /system/lib/platformsdk/libipc_core.z.so(OHOS::BinderInvoker::JoinThread(\n" + 210 "#05 pc 00010955 /system/lib/platformsdk/libsystem_ability_fwk.z.so(\n" + 211 "#06 pc 0000391b /system/bin/sa_main(main.cfi+1986)(c626ef160394bf644c17e6769318dc7d)\n" + 212 "#07 pc 00073560 /system/lib/ld-musl-arm.so.1(libc_start_main_stage2+56)(\n" + 213 "#08 pc 00003078 /system/bin/sa_main(_start_c+84)(c626ef160394bf644c17e6769318dc7d)\n" + 214 "#09 pc 0000301c /system/bin/sa_main(c626ef160394bf644c17e6769318dc7d)\n"; 215 ASSERT_TRUE(CheckFaultSummaryValid(summary)); 216 GTEST_LOG_(INFO) << "CrashExceptionTest08: end."; 217} 218 219/** 220 * @tc.name: CrashExceptionTest09 221 * @tc.desc: test CheckFaultSummaryValid, valid Fault Summary. 222 * @tc.type: FUNC 223 */ 224HWTEST_F(CrashExceptionTest, CrashExceptionTest09, TestSize.Level2) 225{ 226 GTEST_LOG_(INFO) << "CrashExceptionTest09: start."; 227 std::string summary = std::string("Thread name:sensors\n") + 228 "#00 pc 000c5738 /system/lib/ld-musl-arm.so.1(ioctl+72)(b985d2b9b22c3e542388f5803bac6a56)\n" + 229 "#01 pc 00007fcf Not mapped\n" + 230 "#02 pc 00034f35 /system/lib/platformsdk/libipc_core.z.so(OHOS::BinderInvoker::TransactWithDriver(\n" + 231 "#03 pc 000350a5 /system/lib/platformsdk/libipc_core.z.so(OHOS::BinderInvoker::StartWorkLoop(\n" + 232 "#04 pc 000363df /system/lib/platformsdk/libipc_core.z.so(OHOS::BinderInvoker::JoinThread(\n" + 233 "#05 pc 00010955 /system/lib/platformsdk/libsystem_ability_fwk.z.so(\n" + 234 "#06 pc 0000391b /system/bin/sa_main(main.cfi+1986)(c626ef160394bf644c17e6769318dc7d)\n" + 235 "#07 pc 00073560 /system/lib/ld-musl-arm.so.1(libc_start_main_stage2+56)(\n" + 236 "#08 pc 00003078 /system/bin/sa_main(_start_c+84)(c626ef160394bf644c17e6769318dc7d)\n" + 237 "#09 pc 0000301c /system/bin/sa_main(c626ef160394bf644c17e6769318dc7d)\n"; 238 ASSERT_TRUE(CheckFaultSummaryValid(summary)); 239 GTEST_LOG_(INFO) << "CrashExceptionTest09: end."; 240} 241 242/** 243 * @tc.name: CrashExceptionTest010 244 * @tc.desc: test CheckFaultSummaryValid, invalid Fault Summary. 245 * @tc.type: FUNC 246 */ 247HWTEST_F(CrashExceptionTest, CrashExceptionTest010, TestSize.Level2) 248{ 249 GTEST_LOG_(INFO) << "CrashExceptionTest010: start."; 250 std::string summary = std::string("Thread name:sensors\n") + 251 "#00 pc 000c5738 /system/lib/ld-musl-arm.so.1(ioctl+72)(b985d2b9b22c3e542388f5803bac6a56)\n" + 252 "#01 pc 00007fcf /system/lib/chipset-pub-sdk/libipc_common.z.so(OHOS::BinderConnector::WriteBinder(\n"; 253 ASSERT_FALSE(CheckFaultSummaryValid(summary)); 254 GTEST_LOG_(INFO) << "CrashExceptionTest010: end."; 255} 256 257/** 258 * @tc.name: CrashExceptionTest011 259 * @tc.desc: test SetCrashProcInfo functions 260 * @tc.type: FUNC 261 */ 262HWTEST_F(CrashExceptionTest, CrashExceptionTest011, TestSize.Level2) 263{ 264 GTEST_LOG_(INFO) << "CrashExceptionTest011: start."; 265 std::string name = ""; 266 const int32_t pid = -1; 267 SetCrashProcInfo(name, pid, 0); 268 ReportUnwinderException(0); 269 ASSERT_EQ(name, ""); 270 GTEST_LOG_(INFO) << "CrashExceptionTest011: end."; 271} 272} // namespace HiviewDFX 273} // namespace OHOS