14ca6f3f4SCarol Wang #include "scheduled_host_transition.hpp"
24ca6f3f4SCarol Wang
34ca6f3f4SCarol Wang #include <sdbusplus/bus.hpp>
44ca6f3f4SCarol Wang #include <sdbusplus/test/sdbus_mock.hpp>
56a5db3d3SCarol Wang #include <sdeventplus/event.hpp>
64ca6f3f4SCarol Wang #include <xyz/openbmc_project/ScheduledTime/error.hpp>
74ca6f3f4SCarol Wang
8e426b589SAndrew Geissler #include <gmock/gmock.h>
9e426b589SAndrew Geissler #include <gtest/gtest.h>
10e426b589SAndrew Geissler
114ca6f3f4SCarol Wang namespace phosphor
124ca6f3f4SCarol Wang {
134ca6f3f4SCarol Wang namespace state
144ca6f3f4SCarol Wang {
154ca6f3f4SCarol Wang namespace manager
164ca6f3f4SCarol Wang {
174ca6f3f4SCarol Wang
184ca6f3f4SCarol Wang using namespace std::chrono;
194ca6f3f4SCarol Wang using InvalidTimeError =
204ca6f3f4SCarol Wang sdbusplus::xyz::openbmc_project::ScheduledTime::Error::InvalidTime;
21ef7abe19SCarol Wang using HostTransition =
227e969cb9SPatrick Williams sdbusplus::server::xyz::openbmc_project::state::ScheduledHostTransition;
234ca6f3f4SCarol Wang
244ca6f3f4SCarol Wang class TestScheduledHostTransition : public testing::Test
254ca6f3f4SCarol Wang {
264ca6f3f4SCarol Wang public:
276a5db3d3SCarol Wang sdeventplus::Event event;
284ca6f3f4SCarol Wang sdbusplus::SdBusMock sdbusMock;
29f053e6feSPatrick Williams sdbusplus::bus_t mockedBus = sdbusplus::get_mocked_new(&sdbusMock);
304ca6f3f4SCarol Wang ScheduledHostTransition scheduledHostTransition;
314ca6f3f4SCarol Wang
TestScheduledHostTransition()326a5db3d3SCarol Wang TestScheduledHostTransition() :
336a5db3d3SCarol Wang event(sdeventplus::Event::get_default()),
34211d972dSPatrick Williams scheduledHostTransition(mockedBus, "", 0, event)
354ca6f3f4SCarol Wang {
364ca6f3f4SCarol Wang // Empty
374ca6f3f4SCarol Wang }
384ca6f3f4SCarol Wang
getCurrentTime()39*a1c0e5c7SPavithra Barithaya static seconds getCurrentTime()
404ca6f3f4SCarol Wang {
41*a1c0e5c7SPavithra Barithaya return ScheduledHostTransition::getTime();
424ca6f3f4SCarol Wang }
436a5db3d3SCarol Wang
isTimerEnabled()446a5db3d3SCarol Wang bool isTimerEnabled()
456a5db3d3SCarol Wang {
466a5db3d3SCarol Wang return scheduledHostTransition.timer.isEnabled();
476a5db3d3SCarol Wang }
48ef7abe19SCarol Wang
bmcTimeChange()49ef7abe19SCarol Wang void bmcTimeChange()
50ef7abe19SCarol Wang {
51ef7abe19SCarol Wang scheduledHostTransition.handleTimeUpdates();
52ef7abe19SCarol Wang }
534ca6f3f4SCarol Wang };
544ca6f3f4SCarol Wang
TEST_F(TestScheduledHostTransition,disableHostTransition)554ca6f3f4SCarol Wang TEST_F(TestScheduledHostTransition, disableHostTransition)
564ca6f3f4SCarol Wang {
574ca6f3f4SCarol Wang EXPECT_EQ(scheduledHostTransition.scheduledTime(0), 0);
586a5db3d3SCarol Wang EXPECT_FALSE(isTimerEnabled());
594ca6f3f4SCarol Wang }
604ca6f3f4SCarol Wang
TEST_F(TestScheduledHostTransition,invalidScheduledTime)614ca6f3f4SCarol Wang TEST_F(TestScheduledHostTransition, invalidScheduledTime)
624ca6f3f4SCarol Wang {
63*a1c0e5c7SPavithra Barithaya seconds currentTime = getCurrentTime();
644ca6f3f4SCarol Wang // scheduled time is 1 min earlier than current time
654ca6f3f4SCarol Wang uint64_t schTime =
66*a1c0e5c7SPavithra Barithaya static_cast<uint64_t>((currentTime - seconds(60)).count());
674ca6f3f4SCarol Wang EXPECT_THROW(scheduledHostTransition.scheduledTime(schTime),
684ca6f3f4SCarol Wang InvalidTimeError);
694ca6f3f4SCarol Wang }
704ca6f3f4SCarol Wang
TEST_F(TestScheduledHostTransition,validScheduledTime)716a5db3d3SCarol Wang TEST_F(TestScheduledHostTransition, validScheduledTime)
726a5db3d3SCarol Wang {
73*a1c0e5c7SPavithra Barithaya seconds currentTime = getCurrentTime();
746a5db3d3SCarol Wang // scheduled time is 1 min later than current time
756a5db3d3SCarol Wang uint64_t schTime =
76*a1c0e5c7SPavithra Barithaya static_cast<uint64_t>((currentTime + seconds(60)).count());
776a5db3d3SCarol Wang EXPECT_EQ(scheduledHostTransition.scheduledTime(schTime), schTime);
786a5db3d3SCarol Wang EXPECT_TRUE(isTimerEnabled());
796a5db3d3SCarol Wang }
806a5db3d3SCarol Wang
TEST_F(TestScheduledHostTransition,hostTransitionStatus)816a5db3d3SCarol Wang TEST_F(TestScheduledHostTransition, hostTransitionStatus)
826a5db3d3SCarol Wang {
836a5db3d3SCarol Wang // set requested transition to be on
846a5db3d3SCarol Wang scheduledHostTransition.scheduledTransition(Transition::On);
856a5db3d3SCarol Wang EXPECT_EQ(scheduledHostTransition.scheduledTransition(), Transition::On);
866a5db3d3SCarol Wang // set requested transition to be off
876a5db3d3SCarol Wang scheduledHostTransition.scheduledTransition(Transition::Off);
886a5db3d3SCarol Wang EXPECT_EQ(scheduledHostTransition.scheduledTransition(), Transition::Off);
896a5db3d3SCarol Wang }
906a5db3d3SCarol Wang
TEST_F(TestScheduledHostTransition,bmcTimeChangeWithDisabledHostTransition)91ef7abe19SCarol Wang TEST_F(TestScheduledHostTransition, bmcTimeChangeWithDisabledHostTransition)
92ef7abe19SCarol Wang {
93ef7abe19SCarol Wang // Disable host transition
94ef7abe19SCarol Wang scheduledHostTransition.scheduledTime(0);
95ef7abe19SCarol Wang bmcTimeChange();
96ef7abe19SCarol Wang // Check timer
97ef7abe19SCarol Wang EXPECT_FALSE(isTimerEnabled());
98ef7abe19SCarol Wang // Check scheduled time
99ef7abe19SCarol Wang EXPECT_EQ(scheduledHostTransition.HostTransition::scheduledTime(), 0);
100ef7abe19SCarol Wang }
101ef7abe19SCarol Wang
TEST_F(TestScheduledHostTransition,bmcTimeChangeBackward)102ef7abe19SCarol Wang TEST_F(TestScheduledHostTransition, bmcTimeChangeBackward)
103ef7abe19SCarol Wang {
104*a1c0e5c7SPavithra Barithaya seconds currentTime = getCurrentTime();
105ef7abe19SCarol Wang // Current time is earlier than scheduled time due to BMC time changing
106ef7abe19SCarol Wang uint64_t schTime =
107*a1c0e5c7SPavithra Barithaya static_cast<uint64_t>((currentTime + seconds(60)).count());
108ef7abe19SCarol Wang // Set scheduled time, which is the same as bmc time is changed.
109ef7abe19SCarol Wang // But can't use this method to write another case like
110ef7abe19SCarol Wang // bmcTimeChangeForward, because set a scheduled time earlier than current
111ef7abe19SCarol Wang // time will throw an error.
112ef7abe19SCarol Wang scheduledHostTransition.scheduledTime(schTime);
113ef7abe19SCarol Wang bmcTimeChange();
114ef7abe19SCarol Wang // Check timer
115ef7abe19SCarol Wang EXPECT_TRUE(isTimerEnabled());
116ef7abe19SCarol Wang }
117ef7abe19SCarol Wang
1184ca6f3f4SCarol Wang } // namespace manager
1194ca6f3f4SCarol Wang } // namespace state
1204ca6f3f4SCarol Wang } // namespace phosphor
121