#include <sdbusplus/bus.hpp>
#include <gtest/gtest.h>

#include "bmc_epoch.hpp"
#include "config.h"
#include "types.hpp"

namespace phosphor
{
namespace time
{

using namespace std::chrono;
class TestBmcEpoch : public testing::Test
{
    public:
        sdbusplus::bus::bus bus;
        BmcEpoch bmcEpoch;

        TestBmcEpoch()
            : bus(sdbusplus::bus::new_default()),
              bmcEpoch(bus, OBJPATH_BMC)
        {
            // Empty
        }

        // Proxies for BmcEpoch's private members and functions
        Mode getTimeMode()
        {
            return bmcEpoch.timeMode;
        }
        Owner getTimeOwner()
        {
            return bmcEpoch.timeOwner;
        }
        void setTimeOwner(Owner owner)
        {
            bmcEpoch.timeOwner = owner;
        }
        void setTimeMode(Mode mode)
        {
            bmcEpoch.timeMode = mode;
        }
};

TEST_F(TestBmcEpoch, empty)
{
    EXPECT_EQ(Mode::NTP, getTimeMode());
    EXPECT_EQ(Owner::BMC, getTimeOwner());
}

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

TEST_F(TestBmcEpoch, setElapsedNotAllowed)
{
    auto epochNow = duration_cast<microseconds>(
        system_clock::now().time_since_epoch()).count();
    // In NTP mode, setting time is not allowed
    auto ret = bmcEpoch.elapsed(epochNow);
    EXPECT_EQ(0, ret);

    // In Host owner, setting time is not allowed
    setTimeMode(Mode::MANUAL);
    setTimeOwner(Owner::HOST);
    ret = bmcEpoch.elapsed(epochNow);
    EXPECT_EQ(0, ret);
}

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
}

}
}
