// Copyright 2018 The Chromium 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 "crazy_linker_elf_symbols.h"

#include <gtest/gtest.h>
#include <memory>

#include "crazy_linker_elf_hash_table_test_data.h"
#include "crazy_linker_gnu_hash_table_test_data.h"

namespace crazy {
namespace testing {

class ElfSymbolsTest : public ::testing::Test {
 protected:
  ElfSymbolsTest(const ELF::Sym* symbol_table,
                 const char* string_table,
                 uintptr_t dt_elf_hash,
                 uintptr_t dt_gnu_hash)
      : symbols_(symbol_table, string_table, dt_elf_hash, dt_gnu_hash) {}

  ElfSymbols symbols_;
};

class ElfSymbolsElfHashTest : public ElfSymbolsTest {
 public:
  ElfSymbolsElfHashTest()
      : ElfSymbolsTest(kTestElfSymbolTable,
                       kTestElfStringTable,
                       reinterpret_cast<uintptr_t>(kTestElfHashTable),
                       0) {}
};

class ElfSymbolsGnuHashTest : public ElfSymbolsTest {
 public:
  ElfSymbolsGnuHashTest()
      : ElfSymbolsTest(kTestGnuSymbolTable,
                       kTestGnuStringTable,
                       0,
                       reinterpret_cast<uintptr_t>(kTestGnuHashTable)) {}
};

#define CHECK_SYMBOL_BY_NAME(name, offset, address, size) \
  sym = symbols_.LookupByName(name);                      \
  EXPECT_TRUE(sym) << name;                               \
  EXPECT_EQ((address), sym->st_value) << name;            \
  EXPECT_EQ((size), sym->st_size) << name;

#define CHECK_SYMBOL_BY_ADDRESS(name, offset, address, size)            \
  sym = symbols_.LookupByAddress(reinterpret_cast<void*>(address), 0);  \
  EXPECT_TRUE(sym) << name;                                             \
  EXPECT_STREQ((name), symbols_.string_table() + sym->st_name) << name; \
  EXPECT_EQ((address), sym->st_value) << name;

#define CHECK_SYMBOL_BY_NEAREST_ADDRESS(name, offset, address, size)           \
  EXPECT_TRUE(                                                                 \
      symbols_.LookupNearestByAddress(reinterpret_cast<void*>((address)-2), 0, \
                                      &sym_name, &sym_addr, &sym_size))        \
      << name;                                                                 \
  EXPECT_STREQ((name), sym_name) << name;                                      \
  EXPECT_EQ((address), reinterpret_cast<uintptr_t>(sym_addr)) << name;         \
  EXPECT_EQ((size), sym_size) << name;

TEST_F(ElfSymbolsElfHashTest, LookupByName) {
  const ELF::Sym* sym;
  LIST_ELF_SYMBOLS_TestElf(CHECK_SYMBOL_BY_NAME);
}

TEST_F(ElfSymbolsElfHashTest, LookupByAddress) {
  const ELF::Sym* sym;
  LIST_ELF_SYMBOLS_TestElf(CHECK_SYMBOL_BY_ADDRESS);
}

TEST_F(ElfSymbolsElfHashTest, LookupNearestByAddress) {
  const char* sym_name;
  void* sym_addr;
  size_t sym_size;
  LIST_ELF_SYMBOLS_TestElf(CHECK_SYMBOL_BY_NEAREST_ADDRESS);
}

TEST_F(ElfSymbolsGnuHashTest, LookupByName) {
  const ELF::Sym* sym;
  LIST_ELF_SYMBOLS_TestGnu(CHECK_SYMBOL_BY_NAME);
}

TEST_F(ElfSymbolsGnuHashTest, LookupByAddress) {
  const ELF::Sym* sym;
  LIST_ELF_SYMBOLS_TestGnu(CHECK_SYMBOL_BY_ADDRESS);
}

TEST_F(ElfSymbolsGnuHashTest, LookupNearestByAddress) {
  const char* sym_name;
  void* sym_addr;
  size_t sym_size;
  LIST_ELF_SYMBOLS_TestGnu(CHECK_SYMBOL_BY_NEAREST_ADDRESS);
}

}  // namespace testing
}  // namespace crazy
