#include <timer_test.hpp>
#include <chrono>
#include <memory>
#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);
};
