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 <gtest/gtest.h>
17 #include <csignal>
18 #include <map>
19 #include <securec.h>
20 #include <string>
21 #include <thread>
22 #include <unistd.h>
23 #include <vector>
24 #include <sys/prctl.h>
25 
26 #include "dfx_define.h"
27 #include "dfx_test_util.h"
28 #include "dfx_dump_catcher.h"
29 #include "dfx_sigdump_handler.h"
30 
31 using namespace testing;
32 using namespace testing::ext;
33 using namespace std;
34 
35 namespace OHOS {
36 namespace HiviewDFX {
37 class DfxSigDumpHandlerTest : public testing::Test {
38 public:
39     static void SetUpTestCase();
40     static void TearDownTestCase();
41     void SetUp();
42     void TearDown();
43     static void TestThreadRunTask();
44 };
45 
46 static const int TEST_THREAD_NUM = 10;
47 static const int TEST_SLEEP_SEC = 5;
48 
SetUpTestCase()49 void DfxSigDumpHandlerTest::SetUpTestCase()
50 {}
51 
TearDownTestCase()52 void DfxSigDumpHandlerTest::TearDownTestCase()
53 {}
54 
SetUp()55 void DfxSigDumpHandlerTest::SetUp()
56 {}
57 
TearDown()58 void DfxSigDumpHandlerTest::TearDown()
59 {}
60 
TestThreadRunTask()61 void DfxSigDumpHandlerTest::TestThreadRunTask()
62 {
63     std::this_thread::sleep_for(std::chrono::seconds(TEST_SLEEP_SEC));
64 }
65 /**
66  * @tc.name: DfxSigDumpHandlerTest
67  * @tc.desc: test DfxSigDumpHandler
68  * @tc.type: FUNC
69  */
70 HWTEST_F(DfxSigDumpHandlerTest, DfxSigDumpHandlerTest001, TestSize.Level2)
71 {
72     GTEST_LOG_(INFO) << "DfxSigDumpHandlerTest001: start.";
73     pid_t targetPid = getpid();
74     pid_t pid = fork();
75     if (pid < 0) {
76         GTEST_LOG_(ERROR) << "Failed to fork new test process.";
77     } else if (pid == 0) {
78         sleep(1);
79         DfxDumpCatcher dumplog;
80         std::string msg = "";
81         bool ret = dumplog.DumpCatchMix(targetPid, 0, msg);
82         EXPECT_EQ(ret, true) << "DfxSigDumpHandlerTest001 Failed";
83         std::string log[] = {"Pid:", "Timestamp", "test_sigdump_handler", "#00"};
84         log[0] = log[0] + std::to_string(targetPid);
85         int len = sizeof(log) / sizeof(log[0]);
86         int count = GetKeywordsNum(msg, log, len);
87         GTEST_LOG_(INFO) << msg;
88         EXPECT_EQ(count, len) << "DfxSigDumpHandlerTest001 Failed";
89     } else {
90         InitSigDumpHandler();
91         std::thread testThread[TEST_THREAD_NUM];
92         for (int i = 0; i < TEST_THREAD_NUM; i++) {
93             testThread[i] = std::thread(&DfxSigDumpHandlerTest::TestThreadRunTask);
94         }
95         for (int i = 0; i < TEST_THREAD_NUM; i++) {
96             testThread[i].join();
97         }
98         DeinitSigDumpHandler();
99     }
100     GTEST_LOG_(INFO) << "DfxSigDumpHandlerTest001: end.";
101 }
102 
103 } // namespace HiviewDFX
104 } // namepsace OHOS
105