// 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_gnu_hash_table.h"

#include <gtest/gtest.h>
#include "crazy_linker_gnu_hash_table_test_data.h"

#include <stdint.h>

namespace crazy {
namespace testing {

TEST(GnuHashTable, LookupByName) {
  GnuHashTable table;
  table.Init(reinterpret_cast<uintptr_t>(&kTestGnuHashTable));
  EXPECT_TRUE(table.IsValid());

  const ELF::Sym* sym;

#define CHECK_SYMBOL(name, offset, address, size)                           \
  sym = table.LookupByName(name, kTestGnuSymbolTable, kTestGnuStringTable); \
  EXPECT_TRUE(sym) << name;                                                 \
  EXPECT_EQ((address), sym->st_value) << name;                              \
  EXPECT_EQ((size), sym->st_size) << name;

  LIST_ELF_SYMBOLS_TestGnu(CHECK_SYMBOL);

#undef CHECK_SYMBOL

  // Check a few undefined symbols.
  EXPECT_FALSE(table.LookupByName("ahahahahah", kTestGnuSymbolTable,
                                  kTestGnuStringTable));
  EXPECT_FALSE(
      table.LookupByName("strsign", kTestGnuSymbolTable, kTestGnuStringTable));
}

TEST(GnuHashTable, DynSymbols) {
  GnuHashTable table;
  table.Init(reinterpret_cast<uintptr_t>(&kTestGnuHashTable));
  EXPECT_TRUE(table.IsValid());

  const size_t kExpectedOffset = kTestGnuHashTable[1];
  const size_t kExpectedCount =
      (sizeof(kTestGnuSymbolTable) / sizeof(kTestGnuSymbolTable[0])) -
      kExpectedOffset;

  EXPECT_EQ(kExpectedOffset, table.dyn_symbols_offset());
  EXPECT_EQ(kExpectedCount, table.dyn_symbols_count());
}

}  // namespace testing
}  // namespace crazy
