#include <dlfcn.h>

#include <string>

#include "absl/debugging/leak_check.h"
#include "absl/log/check.h"
#include "absl/strings/str_cat.h"
#include "googlemock/include/gmock/gmock.h"

namespace {

constexpr char kFileName[] = "librenode_mpact_cheriot.so";

constexpr char kDepotPath[] = "cheriot/";

class LibRenodeMpactCheriotSoTest : public ::testing::Test {
 protected:
  LibRenodeMpactCheriotSoTest() {
    std::string path = absl::StrCat(kDepotPath, kFileName);
    absl::LeakCheckDisabler disabler;  // Ignore leaks from dlopen.
    lib_ = dlopen(path.c_str(), RTLD_LAZY);
    CHECK_NE(lib_, nullptr);
  }

  ~LibRenodeMpactCheriotSoTest() { dlclose(lib_); }

  void *lib_ = nullptr;
};

TEST_F(LibRenodeMpactCheriotSoTest, Construct) {
  EXPECT_NE(dlsym(lib_, "construct"), nullptr);
}

TEST_F(LibRenodeMpactCheriotSoTest, ConstructWithSysbus) {
  EXPECT_NE(dlsym(lib_, "construct_with_sysbus"), nullptr);
}

TEST_F(LibRenodeMpactCheriotSoTest, Connect) {
  EXPECT_NE(dlsym(lib_, "connect"), nullptr);
}

TEST_F(LibRenodeMpactCheriotSoTest, ConnectWithSysbus) {
  EXPECT_NE(dlsym(lib_, "connect_with_sysbus"), nullptr);
}

TEST_F(LibRenodeMpactCheriotSoTest, Destruct) {
  EXPECT_NE(dlsym(lib_, "destruct"), nullptr);
}

TEST_F(LibRenodeMpactCheriotSoTest, GetRegInfoSize) {
  EXPECT_NE(dlsym(lib_, "get_reg_info_size"), nullptr);
}

TEST_F(LibRenodeMpactCheriotSoTest, GetRegInfo) {
  EXPECT_NE(dlsym(lib_, "get_reg_info"), nullptr);
}

TEST_F(LibRenodeMpactCheriotSoTest, LoadElf) {
  EXPECT_NE(dlsym(lib_, "load_elf"), nullptr);
}

TEST_F(LibRenodeMpactCheriotSoTest, ReadRegister) {
  EXPECT_NE(dlsym(lib_, "read_register"), nullptr);
}

TEST_F(LibRenodeMpactCheriotSoTest, WriteRegister) {
  EXPECT_NE(dlsym(lib_, "write_register"), nullptr);
}

TEST_F(LibRenodeMpactCheriotSoTest, ReadMemory) {
  EXPECT_NE(dlsym(lib_, "read_memory"), nullptr);
}

TEST_F(LibRenodeMpactCheriotSoTest, WriteMemory) {
  EXPECT_NE(dlsym(lib_, "write_memory"), nullptr);
}

TEST_F(LibRenodeMpactCheriotSoTest, Reset) {
  EXPECT_NE(dlsym(lib_, "reset"), nullptr);
}

TEST_F(LibRenodeMpactCheriotSoTest, Step) {
  EXPECT_NE(dlsym(lib_, "step"), nullptr);
}

TEST_F(LibRenodeMpactCheriotSoTest, SetConfig) {
  EXPECT_NE(dlsym(lib_, "set_config"), nullptr);
}

TEST_F(LibRenodeMpactCheriotSoTest, SetIrqValue) {
  EXPECT_NE(dlsym(lib_, "set_irq_value"), nullptr);
}

}  // namespace
