1 /*
2  * Copyright (c) Huawei Technologies Co., Ltd. 2022. All rights reserved.
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 #include <cstring>
16 
17 #include <gtest/gtest.h>
18 
19 #include "elf_symbol_info.h"
20 
21 using namespace testing::ext;
22 
23 namespace OHOS {
24 namespace Developtools {
25 namespace Hiebpf {
26 class ElfSymbolInfoTest : public ::testing::Test {
27 public:
SetUpTestCase()28     static void SetUpTestCase() {};
TearDownTestCase()29     static void TearDownTestCase() {};
30 
SetUp()31     void SetUp() {}
TearDown()32     void TearDown() {}
33 
34     const std::string TEST_FILE_64 = "/data/test/resources/testdata/elf64.stripped";
35     const std::string TEST_FILE_32 = "/data/test/resources/testdata/elf32.unstripped";
36 };
37 
38 /**
39  * @tc.name: GetSymbolTable
40  * @tc.desc: Test framework
41  * @tc.type: FUNC
42  */
HWTEST_F(ElfSymbolInfoTest, GetSymbolTable32Unstripped, TestSize.Level1)43 HWTEST_F(ElfSymbolInfoTest, GetSymbolTable32Unstripped, TestSize.Level1)
44 {
45     ElfSymbolInfo elfSymbolInfo;
46     ElfSymbolInfo::ElfSymbolTable elfSymbolTable;
47     ASSERT_TRUE(elfSymbolInfo.GetSymbolTable(TEST_FILE_32, elfSymbolTable));
48     ASSERT_GT(elfSymbolTable.textOffset_, 0);
49     ASSERT_GT(elfSymbolTable.symTable_.size(), 0);
50     ASSERT_GT(elfSymbolTable.strTable_.size(), 0);
51 
52     const uint32_t symEntSize32 = 16;
53     ASSERT_EQ(elfSymbolTable.symEntSize_, symEntSize32);
54 
55     ASSERT_EQ(elfSymbolTable.fileName_, TEST_FILE_32);
56 }
57 
HWTEST_F(ElfSymbolInfoTest, GetSymbolTable64Stripped, TestSize.Level1)58 HWTEST_F(ElfSymbolInfoTest, GetSymbolTable64Stripped, TestSize.Level1)
59 {
60     ElfSymbolInfo elfSymbolInfo;
61     ElfSymbolInfo::ElfSymbolTable elfSymbolTable;
62     ASSERT_TRUE(elfSymbolInfo.GetSymbolTable(TEST_FILE_64, elfSymbolTable));
63     ASSERT_GT(elfSymbolTable.textOffset_, 0);
64     ASSERT_GT(elfSymbolTable.symTable_.size(), 0);
65     ASSERT_GT(elfSymbolTable.strTable_.size(), 0);
66 
67     const uint32_t symEntSize64 = 24;
68     ASSERT_EQ(elfSymbolTable.symEntSize_, symEntSize64);
69 
70     ASSERT_EQ(elfSymbolTable.fileName_, TEST_FILE_64);
71 }
72 
HWTEST_F(ElfSymbolInfoTest, Cache, TestSize.Level1)73 HWTEST_F(ElfSymbolInfoTest, Cache, TestSize.Level1)
74 {
75     ElfSymbolInfo elfSymbolInfo;
76     ASSERT_FALSE(elfSymbolInfo.IsCached(TEST_FILE_64));
77     elfSymbolInfo.CacheFileName(TEST_FILE_64);
78     ASSERT_TRUE(elfSymbolInfo.IsCached(TEST_FILE_64));
79 }
80 
HWTEST_F(ElfSymbolInfoTest, GetBinary, TestSize.Level1)81 HWTEST_F(ElfSymbolInfoTest, GetBinary, TestSize.Level1)
82 {
83     ElfSymbolInfo elfSymbolInfo;
84     ElfSymbolInfo::ElfSymbolTable elfSymbolTable;
85     ASSERT_TRUE(elfSymbolInfo.GetSymbolTable(TEST_FILE_64, elfSymbolTable));
86     std::vector<uint8_t> buf;
87     uint32_t size = elfSymbolInfo.GetBinary(elfSymbolTable, buf);
88     const uint32_t binLen = sizeof(elfSymbolTable.textVaddr_) +
89                             sizeof(elfSymbolTable.textOffset_) +
90                             sizeof(uint32_t) + sizeof(uint32_t) + // strTabLen + symTabLen
91                             sizeof(uint32_t) + // fileNameLen
92                             sizeof(elfSymbolTable.symEntSize_) +
93                             elfSymbolTable.strTable_.size() +
94                             elfSymbolTable.symTable_.size() +
95                             elfSymbolTable.fileName_.size() + 1;
96     ASSERT_EQ(size, binLen);
97 
98     uint8_t *p = buf.data() + binLen - elfSymbolTable.fileName_.size() - 1;
99     std::string fileName = (char *)p;
100     ASSERT_EQ(fileName, TEST_FILE_64);
101 }
102 } // namespace Hiebpf
103 } // namespace Developtools
104 } // namespace OHOS
105