#include <gtest/gtest.h>
#include <experimental/filesystem>
#include <sdbusplus/bus.hpp>
#include "config.h"
#include "phosphor-rsyslog-config/server-conf.hpp"
#include "gmock/gmock.h"

namespace phosphor
{
namespace logging
{
namespace test
{

namespace fs = std::experimental::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::bus& 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


