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

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

// Test Watchdog functionality
class WdogTest : public TimerTest
{
  public:
    // Gets called as part of each TEST_F construction
    WdogTest() :
        bus(sdbusplus::bus::new_default()),
        wdog(std::make_unique<phosphor::watchdog::Watchdog>(bus, TEST_PATH,
                                                            eventP)),
        defaultInterval(milliseconds(wdog->interval())), defaultDrift(30)
    {
        // Check for successful creation of
        // event handler and bus handler
        EXPECT_GE(rc, 0);

        // Initially the watchdog would be disabled
        EXPECT_FALSE(wdog->enabled());
    }

    // sdbusplus handle
    sdbusplus::bus::bus bus;

    // Watchdog object
    std::unique_ptr<phosphor::watchdog::Watchdog> wdog;

    // This is the default interval as given in Interface definition
    milliseconds defaultInterval;

    // Acceptable drift when we compare the interval to timeRemaining.
    // This is needed since it depends on when do we get scheduled and it
    // has happened that remaining time was off by few msecs.
    milliseconds defaultDrift;

  protected:
    // Dummy name for object path
    // This is just to satisfy the constructor. Does not have
    // a need to check if the objects paths have been created.
    static constexpr auto TEST_PATH = "/test/path";

    // Returns how long it took for the current watchdog timer to be
    // disabled or have its timeRemaining reset.
    seconds waitForWatchdog(seconds timeLimit);
};
