• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2022-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 <securec.h>
18 
19 #include "ffrt_inner.h"
20 #include "fp_backtrace.h"
21 
22 using namespace testing;
23 using namespace testing::ext;
24 
25 namespace OHOS {
26 namespace HiviewDFX {
27 
28 #define DEFAULT_MAX_FRAME_NUM 256
29 #define MIN_FRAME_NUM 2
30 
31 class FpBacktraceTest : public testing::Test {};
32 
33 /**
34  * @tc.name: FpBacktraceTestTest001
35  * @tc.desc: test get backtrace of current thread by fp
36  * @tc.type: FUNC
37  */
38 HWTEST_F(FpBacktraceTest, FpBacktraceTestTest001, TestSize.Level2)
39 {
40     GTEST_LOG_(INFO) << "BacktraceLocalTest001: start.";
41     auto fpBacktrace = FpBacktrace::CreateInstance();
42 #if is_ohos && !is_mingw && __aarch64__
43     ASSERT_NE(nullptr, fpBacktrace);
44     void* pcArray[DEFAULT_MAX_FRAME_NUM]{0};
45     int size = fpBacktrace->BacktraceFromFp(__builtin_frame_address(0), pcArray, DEFAULT_MAX_FRAME_NUM);
46     ASSERT_GE(size, 0);
47     for (int i = 0; i < size; i++) {
48         ASSERT_NE(fpBacktrace->SymbolicAddress(pcArray[i]), nullptr);
49     }
50     for (int i = 0; i < size; i++) {
51         ASSERT_NE(fpBacktrace->SymbolicAddress(pcArray[i]), nullptr);
52     }
53 #else
54     ASSERT_EQ(nullptr, fpBacktrace);
55 #endif
56     GTEST_LOG_(INFO) << "BacktraceLocalTest001: end.";
57 }
58 
59 #if is_ohos && !is_mingw && __aarch64__
60 /**
61  * @tc.name: FpBacktraceTestTest002
62  * @tc.desc: test get backtrace by a invalid parameter.
63  * @tc.type: FUNC
64  */
65 HWTEST_F(FpBacktraceTest, FpBacktraceTestTest002, TestSize.Level2)
66 {
67     GTEST_LOG_(INFO) << "BacktraceLocalTest002: start.";
68     auto fpBacktrace = FpBacktrace::CreateInstance();
69     ASSERT_NE(nullptr, fpBacktrace);
70     void* pcArray[DEFAULT_MAX_FRAME_NUM]{0};
71     uint64_t address = std::numeric_limits<uint64_t>::max();
72     ASSERT_EQ(fpBacktrace->BacktraceFromFp(nullptr, nullptr, 0), 0);
73     ASSERT_EQ(fpBacktrace->BacktraceFromFp(reinterpret_cast<void*>(address), nullptr, 0), 0);
74     ASSERT_EQ(fpBacktrace->BacktraceFromFp(reinterpret_cast<void*>(address), pcArray, 0), 0);
75     ASSERT_EQ(fpBacktrace->BacktraceFromFp(reinterpret_cast<void*>(address), pcArray, DEFAULT_MAX_FRAME_NUM), 0);
76     GTEST_LOG_(INFO) << "BacktraceLocalTest002: end.";
77 }
78 
79 /**
80  * @tc.name: FpBacktraceTestTest003
81  * @tc.desc: test get backtrace for ffrt thread.
82  * @tc.type: FUNC
83  */
84 HWTEST_F(FpBacktraceTest, FpBacktraceTestTest003, TestSize.Level2)
85 {
86     GTEST_LOG_(INFO) << "BacktraceLocalTest003: start.";
87     auto fpBacktrace = FpBacktrace::CreateInstance();
88     ASSERT_NE(nullptr, fpBacktrace);
89     int size = 0;
__anonf94e6af30102null90     ffrt::submit([&] {
91         void* pcArray[DEFAULT_MAX_FRAME_NUM]{0};
92         size = fpBacktrace->BacktraceFromFp(__builtin_frame_address(0), pcArray, DEFAULT_MAX_FRAME_NUM);
93     }, {}, {});
94     ffrt::wait();
95     ASSERT_GT(size, 0);
96     GTEST_LOG_(INFO) << "BacktraceLocalTest003: end.";
97 }
98 
99 /**
100  * @tc.name: FpBacktraceTestTest004
101  * @tc.desc: test get backtrace for other thread.
102  * @tc.type: FUNC
103  */
104 HWTEST_F(FpBacktraceTest, FpBacktraceTestTest004, TestSize.Level2)
105 {
106     GTEST_LOG_(INFO) << "BacktraceLocalTest004: start.";
107     auto fpBacktrace = FpBacktrace::CreateInstance();
108     ASSERT_NE(nullptr, fpBacktrace);
109     int size = 0;
110     auto startFp = __builtin_frame_address(0);
__anonf94e6af30202null111     ffrt::submit([&] {
112         void* pcArray[DEFAULT_MAX_FRAME_NUM]{0};
113         size = fpBacktrace->BacktraceFromFp(startFp, pcArray, DEFAULT_MAX_FRAME_NUM);
114     }, {}, {});
115     ffrt::wait();
116     ASSERT_GT(size, 0);
117     GTEST_LOG_(INFO) << "BacktraceLocalTest004: end.";
118 }
119 #endif
120 } // namespace HiviewDFX
121 } // namepsace OHOS
122