#include <chrono>
#include <timer_test.hpp>

using namespace std::chrono;
using namespace std::chrono_literals;

/** @brief Starts the timer and expects it to
 *         expire in configured time and expects the
 *         deault callback handler to kick-in
 */
TEST_F(TimerTest, testTimerForExpirationDefaultTimeoutHandler)
{
    // Expect timer to expire in 2 seconds
    auto expireTime = seconds(2s);

    phosphor::watchdog::Timer timer(eventP);

    // Set the expiration and enable the timer
    timer.start(duration_cast<milliseconds>(expireTime));
    timer.setEnabled<std::true_type>();

    // Waiting 2 seconds to expect expiration
    int count = 0;
    while(count < expireTime.count() && !timer.expired())
    {
        // Returns -0- on timeout and positive number on dispatch
        auto sleepTime = duration_cast<microseconds>(seconds(1));
        if(!sd_event_run(eventP.get(), sleepTime.count()))
        {
            count++;
        }
    }
    EXPECT_TRUE(timer.expired());
    EXPECT_EQ(expireTime.count() - 1, count);

    // Make sure secondary callback was not called.
    EXPECT_FALSE(expired);
}

/** @brief Starts the timer and expects it to expire
 *         in configured time and expects the secondary
 *         callback to be called into along with default.
 */
TEST_F(TimerTest, testTimerForExpirationSecondCallBack)
{
    // Expect timer to expire in 2 seconds
    auto expireTime = seconds(2s);

    phosphor::watchdog::Timer timer(eventP,
                    std::bind(&TimerTest::timeOutHandler, this));

    // Set the expiration and enable the timer
    timer.start(duration_cast<milliseconds>(expireTime));
    timer.setEnabled<std::true_type>();

    // Waiting 2 seconds to expect expiration
    int count = 0;
    while(count < expireTime.count() && !timer.expired())
    {
        // Returns -0- on timeout and positive number on dispatch
        auto sleepTime = duration_cast<microseconds>(seconds(1));
        if(!sd_event_run(eventP.get(), sleepTime.count()))
        {
            count++;
        }
    }
    EXPECT_TRUE(timer.expired());
    EXPECT_EQ(expireTime.count() - 1, count);

    // This gets set as part of secondary callback
    EXPECT_TRUE(expired);
}
