xref: /openbmc/phosphor-state-manager/test/test_scheduled_host_transition.cpp (revision a1c0e5c7c0f1f71853ca22ad722e77a4380a7b77)
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