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