#include "config.h"

#include "phosphor-rsyslog-config/server-conf.hpp"

#include <sdbusplus/bus.hpp>

#include <filesystem>

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

namespace phosphor
{
namespace logging
{
namespace test
{

namespace fs = std::filesystem;

char tmplt[] = "/tmp/logging_test.XXXXXX";
auto bus = sdbusplus::bus::new_default();
fs::path dir(fs::path(mkdtemp(tmplt)));

class MockServer : public phosphor::rsyslog_config::Server
{
  public:
    MockServer(sdbusplus::bus_t& bus, const std::string& path,
               const char* filePath) :
        phosphor::rsyslog_config::Server(bus, path, filePath)
    {}

    MOCK_METHOD0(restart, void());
};

class TestRemoteLogging : public testing::Test
{
  public:
    TestRemoteLogging()
    {
        configFilePath = std::string(dir.c_str()) + "/server.conf";
        config = new MockServer(bus, BUSPATH_REMOTE_LOGGING_CONFIG,
                                configFilePath.c_str());
    }

    ~TestRemoteLogging()
    {
        delete config;
    }

    static void TearDownTestCase()
    {
        fs::remove_all(dir);
    }

    MockServer* config;
    std::string configFilePath;
};

} // namespace test
} // namespace logging
} // namespace phosphor
