#include "config.h"

#include "bmc_epoch.hpp"
#include "types.hpp"

#include <sdbusplus/bus.hpp>

#include <memory>

#include <gtest/gtest.h>

namespace phosphor
{
namespace time
{

using namespace std::chrono;

class TestBmcEpoch : public testing::Test
{
  public:
    sdbusplus::bus::bus bus;
    sd_event* event;
    std::unique_ptr<BmcEpoch> bmcEpoch;

    TestBmcEpoch() : bus(sdbusplus::bus::new_default())
    {
        // BmcEpoch requires sd_event to init
        sd_event_default(&event);
        bus.attach_event(event, SD_EVENT_PRIORITY_NORMAL);
        bmcEpoch = std::make_unique<BmcEpoch>(bus, OBJPATH_BMC);
    }

    ~TestBmcEpoch()
    {
        bus.detach_event();
        sd_event_unref(event);
    }

    // Proxies for BmcEpoch's private members and functions
    Mode getTimeMode()
    {
        return bmcEpoch->timeMode;
    }
    void setTimeMode(Mode mode)
    {
        bmcEpoch->timeMode = mode;
    }
    void triggerTimeChange()
    {
        bmcEpoch->onTimeChange(nullptr, -1, 0, bmcEpoch.get());
    }
};

TEST_F(TestBmcEpoch, onModeChange)
{
    bmcEpoch->onModeChanged(Mode::NTP);
    EXPECT_EQ(Mode::NTP, getTimeMode());

    bmcEpoch->onModeChanged(Mode::Manual);
    EXPECT_EQ(Mode::Manual, getTimeMode());
}

TEST_F(TestBmcEpoch, empty)
{
    // Default mode is MANUAL
    EXPECT_EQ(Mode::Manual, getTimeMode());
}

TEST_F(TestBmcEpoch, getElapsed)
{
    auto t1 = bmcEpoch->elapsed();
    EXPECT_NE(0, t1);
    auto t2 = bmcEpoch->elapsed();
    EXPECT_GE(t2, t1);
}

TEST_F(TestBmcEpoch, setElapsedOK)
{
    // TODO: setting time will call sd-bus functions and it will fail on host
    // if we have gmock for sdbusplus::bus, we can test setElapsed.
    // But for now we can not test it
}

} // namespace time
} // namespace phosphor
