blob: fb63a6108b219a0027703afd4026614e6cfc5422 [file] [log] [blame]
// Copyright 2021 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "symbol-tests.h"
#include <array>
namespace {
constexpr std::string_view kEmpty{};
constexpr elfldltl::SymbolName kEmptySymbol(kEmpty);
constexpr uint32_t kEmptyCompatHash = 0;
constexpr uint32_t kEmptyGnuHash = 5381;
constexpr uint32_t kFoobarCompatHash = 0x06d65882;
constexpr uint32_t kFoobarGnuHash = 0xfde460be;
TEST(ElfldltlSymbolTests, CompatHash) {
EXPECT_EQ(kEmptyCompatHash, elfldltl::SymbolName(kEmpty).compat_hash());
EXPECT_EQ(kFoobarCompatHash, elfldltl::SymbolName(kFoobar).compat_hash());
}
static_assert(kEmptySymbol.compat_hash() == kEmptyCompatHash);
static_assert(kFoobarSymbol.compat_hash() == kFoobarCompatHash);
TEST(ElfldltlSymbolTests, GnuHash) {
EXPECT_EQ(kEmptyGnuHash, elfldltl::SymbolName(kEmpty).gnu_hash());
EXPECT_EQ(kFoobarGnuHash, elfldltl::SymbolName(kFoobar).gnu_hash());
}
static_assert(kEmptySymbol.gnu_hash() == kEmptyGnuHash);
static_assert(kFoobarSymbol.gnu_hash() == kFoobarGnuHash);
constexpr auto CompatHashSize = [](auto&& elf) {
using Elf = std::decay_t<decltype(elf)>;
elfldltl::SymbolInfo<Elf> si;
kTestSymbols<Elf>.SetInfo(si);
si.set_compat_hash(kTestCompatHash<typename Elf::Word>);
EXPECT_EQ(si.safe_symtab().size(), kTestSymbolCount);
};
TEST(ElfldltlSymbolTests, CompatHashSize) {
ASSERT_NO_FATAL_FAILURE(TestAllFormats(CompatHashSize));
}
constexpr auto GnuHashSize = [](auto&& elf) {
using Elf = std::decay_t<decltype(elf)>;
elfldltl::SymbolInfo<Elf> si;
kTestSymbols<Elf>.SetInfo(si);
si.set_gnu_hash(kTestGnuHash<typename Elf::Addr>);
EXPECT_EQ(si.safe_symtab().size(), kTestSymbolCount);
};
TEST(ElfldltlSymbolTests, GnuHashSize) { ASSERT_NO_FATAL_FAILURE(TestAllFormats(GnuHashSize)); }
constexpr auto LookupCompatHash = [](auto&& elf) {
using Elf = std::decay_t<decltype(elf)>;
elfldltl::SymbolInfo<Elf> si;
kTestSymbols<Elf>.SetInfo(si);
si.set_compat_hash(kTestCompatHash<typename Elf::Word>);
EXPECT_NULL(kNotFoundSymbol.Lookup(si));
EXPECT_NULL(kQuuxSymbol.Lookup(si)); // Undefined should be skipped.
const auto* foo = kFooSymbol.Lookup(si);
ASSERT_NOT_NULL(foo);
EXPECT_EQ(foo->value(), 1);
const auto* bar = kBarSymbol.Lookup(si);
ASSERT_NOT_NULL(bar);
EXPECT_EQ(bar->value(), 2);
const auto* foobar = kFoobarSymbol.Lookup(si);
ASSERT_NOT_NULL(foobar);
EXPECT_EQ(foobar->value(), 3);
};
TEST(ElfldltlSymbolTests, LookupCompatHash) {
ASSERT_NO_FATAL_FAILURE(TestAllFormats(LookupCompatHash));
}
constexpr auto LookupGnuHash = [](auto&& elf) {
using Elf = std::decay_t<decltype(elf)>;
elfldltl::SymbolInfo<Elf> si;
kTestSymbols<Elf>.SetInfo(si);
si.set_gnu_hash(kTestGnuHash<typename Elf::Addr>);
EXPECT_NULL(kNotFoundSymbol.Lookup(si));
EXPECT_NULL(kQuuxSymbol.Lookup(si)); // Undefined should be skipped.
const auto* foo = kFooSymbol.Lookup(si);
ASSERT_NOT_NULL(foo);
EXPECT_EQ(foo->value(), 1);
const auto* bar = kBarSymbol.Lookup(si);
ASSERT_NOT_NULL(bar);
EXPECT_EQ(bar->value(), 2);
const auto* foobar = kFoobarSymbol.Lookup(si);
ASSERT_NOT_NULL(foobar);
EXPECT_EQ(foobar->value(), 3);
};
TEST(ElfldltlSymbolTests, LookupGnuHash) { ASSERT_NO_FATAL_FAILURE(TestAllFormats(LookupGnuHash)); }
} // namespace