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 */ 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 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 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 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