1 /*
2  * Copyright (c) 2022 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 <string>
18 #include <cstdlib>
19 
20 #include "dfx_define.h"
21 #include "rustc_demangle.h"
22 
23 using namespace testing;
24 using namespace testing::ext;
25 
26 namespace OHOS {
27 namespace HiviewDFX {
28 static const int BUF_LEN = 100;
29 
30 class RustcDemangleTest : public testing::Test {
31 public:
32     static void SetUpTestCase();
33     static void TearDownTestCase();
34     void SetUp();
35     void TearDown();
36 };
37 
SetUpTestCase()38 void RustcDemangleTest::SetUpTestCase()
39 {}
40 
TearDownTestCase()41 void RustcDemangleTest::TearDownTestCase()
42 {}
43 
SetUp()44 void RustcDemangleTest::SetUp()
45 {}
46 
TearDown()47 void RustcDemangleTest::TearDown()
48 {}
49 
50 /**
51  * @tc.name: RustcDemangleTest001
52  * @tc.desc: test RustcDemangle ok
53  * @tc.type: FUNC
54  */
55 HWTEST_F(RustcDemangleTest, RustcDemangleTest001, TestSize.Level2)
56 {
57     GTEST_LOG_(INFO) << "RustcDemangleTest001: start.";
58     char buf[BUF_LEN] = "_RNvCs7FufEY4pgE0_21panic_handler_example4main\0";
59     char *res = reinterpret_cast<char*>(std::malloc(sizeof(char) * BUF_LEN));
60     res = rustc_demangle(buf);
61     int ret = -1;
62     if (res != nullptr) {
63         GTEST_LOG_(INFO) << "RustcDemangleTest001: res=" << std::string(res);
64         ret = strcmp(res, "panic_handler_example::main");
65         std::free(res);
66     }
67     EXPECT_EQ(true, ret == 0) << "RustcDemangleTest001 Failed";
68     GTEST_LOG_(INFO) << "RustcDemangleTest001: end.";
69 }
70 
71 /**
72  * @tc.name: RustcDemangleTest002
73  * @tc.desc: test RustcDemangle not rust symbol
74  * @tc.type: FUNC
75  */
76 HWTEST_F(RustcDemangleTest, RustcDemangleTest002, TestSize.Level2)
77 {
78     GTEST_LOG_(INFO) << "RustcDemangleTest002: start.";
79     char buf[BUF_LEN] = "la la la\0";
80     char *res = reinterpret_cast<char*>(std::malloc(sizeof(char) * BUF_LEN));
81     res = rustc_demangle(buf);
82     EXPECT_EQ(true, res == nullptr) << "RustcDemangleTest002 Failed";
83     if (res != nullptr) {
84         free(res);
85     }
86     GTEST_LOG_(INFO) << "RustcDemangleTest002: end.";
87 }
88 
89 /**
90  * @tc.name: RustcDemangleTest003
91  * @tc.desc: test RustcDemangle str null
92  * @tc.type: FUNC
93  */
94 HWTEST_F(RustcDemangleTest, RustcDemangleTest003, TestSize.Level2)
95 {
96     GTEST_LOG_(INFO) << "RustcDemangleTest003: start.";
97     char buf[BUF_LEN] = "\0";
98     char *res = reinterpret_cast<char*>(malloc(sizeof(char) * BUF_LEN));
99     res = rustc_demangle(buf);
100     EXPECT_EQ(true, res == nullptr) << "RustcDemangleTest003 Failed";
101     if (res != nullptr) {
102         std::free(res);
103     }
104     GTEST_LOG_(INFO) << "RustcDemangleTest003: end.";
105 }
106 
107 /**
108  * @tc.name: RustcDemangleTest004
109  * @tc.desc: test RustcDemangle invalidid utf8
110  * @tc.type: FUNC
111  */
112 HWTEST_F(RustcDemangleTest, RustcDemangleTest004, TestSize.Level2)
113 {
114     GTEST_LOG_(INFO) << "RustcDemangleTest004: start.";
115     char buf[BUF_LEN] = "\xe7\x8a\xb6\xe6\x80\x81\0";
116     char *res = reinterpret_cast<char*>(std::malloc(sizeof(char) * BUF_LEN));
117     res = rustc_demangle(buf);
118     EXPECT_EQ(true, res == nullptr) << "RustcDemangleTest004 Failed";
119     if (res != nullptr) {
120         std::free(res);
121     }
122     GTEST_LOG_(INFO) << "RustcDemangleTest004: end.";
123 }
124 } // namespace HiviewDFX
125 } // namepsace OHOS
126