#include "manager.hpp"
#include "mocked_property_change_listener.hpp"
#include "types.hpp"

#include <sdbusplus/bus.hpp>

#include <gtest/gtest.h>

using ::testing::_;

namespace phosphor
{
namespace time
{

class TestManager : public testing::Test
{
  public:
    sdbusplus::bus::bus bus;
    Manager manager;

    TestManager() : bus(sdbusplus::bus::new_default()), manager(bus)
    {
    }

    // Proxies for Manager's private members and functions
    Mode getTimeMode()
    {
        return manager.timeMode;
    }
    void notifyPropertyChanged(const std::string& key, const std::string& value)
    {
        manager.onPropertyChanged(key, value);
    }
};

TEST_F(TestManager, DISABLED_propertyChanged)
{
    notifyPropertyChanged(
        "TimeSyncMethod",
        "xyz.openbmc_project.Time.Synchronization.Method.Manual");
    EXPECT_EQ(Mode::Manual, getTimeMode());

    notifyPropertyChanged(
        "TimeSyncMethod",
        "xyz.openbmc_project.Time.Synchronization.Method.NTP");
    EXPECT_EQ(Mode::NTP, getTimeMode());

    ASSERT_DEATH(notifyPropertyChanged("invalid property", "whatever"), "");
}

} // namespace time
} // namespace phosphor
