1 #include "scheduled_host_transition.hpp" 2 3 #include <sdbusplus/bus.hpp> 4 #include <sdbusplus/test/sdbus_mock.hpp> 5 #include <sdeventplus/event.hpp> 6 #include <xyz/openbmc_project/ScheduledTime/error.hpp> 7 8 #include <gmock/gmock.h> 9 #include <gtest/gtest.h> 10 11 namespace phosphor 12 { 13 namespace state 14 { 15 namespace manager 16 { 17 18 using namespace std::chrono; 19 using InvalidTimeError = 20 sdbusplus::xyz::openbmc_project::ScheduledTime::Error::InvalidTime; 21 using HostTransition = 22 sdbusplus::server::xyz::openbmc_project::state::ScheduledHostTransition; 23 24 class TestScheduledHostTransition : public testing::Test 25 { 26 public: 27 sdeventplus::Event event; 28 sdbusplus::SdBusMock sdbusMock; 29 sdbusplus::bus_t mockedBus = sdbusplus::get_mocked_new(&sdbusMock); 30 ScheduledHostTransition scheduledHostTransition; 31 32 TestScheduledHostTransition() : 33 event(sdeventplus::Event::get_default()), 34 scheduledHostTransition(mockedBus, "", 0, event) 35 { 36 // Empty 37 } 38 39 static seconds getCurrentTime() 40 { 41 return ScheduledHostTransition::getTime(); 42 } 43 44 bool isTimerEnabled() 45 { 46 return scheduledHostTransition.timer.isEnabled(); 47 } 48 49 void bmcTimeChange() 50 { 51 scheduledHostTransition.handleTimeUpdates(); 52 } 53 }; 54 55 TEST_F(TestScheduledHostTransition, disableHostTransition) 56 { 57 EXPECT_EQ(scheduledHostTransition.scheduledTime(0), 0); 58 EXPECT_FALSE(isTimerEnabled()); 59 } 60 61 TEST_F(TestScheduledHostTransition, invalidScheduledTime) 62 { 63 seconds currentTime = getCurrentTime(); 64 // scheduled time is 1 min earlier than current time 65 uint64_t schTime = 66 static_cast<uint64_t>((currentTime - seconds(60)).count()); 67 EXPECT_THROW(scheduledHostTransition.scheduledTime(schTime), 68 InvalidTimeError); 69 } 70 71 TEST_F(TestScheduledHostTransition, validScheduledTime) 72 { 73 seconds currentTime = getCurrentTime(); 74 // scheduled time is 1 min later than current time 75 uint64_t schTime = 76 static_cast<uint64_t>((currentTime + seconds(60)).count()); 77 EXPECT_EQ(scheduledHostTransition.scheduledTime(schTime), schTime); 78 EXPECT_TRUE(isTimerEnabled()); 79 } 80 81 TEST_F(TestScheduledHostTransition, hostTransitionStatus) 82 { 83 // set requested transition to be on 84 scheduledHostTransition.scheduledTransition(Transition::On); 85 EXPECT_EQ(scheduledHostTransition.scheduledTransition(), Transition::On); 86 // set requested transition to be off 87 scheduledHostTransition.scheduledTransition(Transition::Off); 88 EXPECT_EQ(scheduledHostTransition.scheduledTransition(), Transition::Off); 89 } 90 91 TEST_F(TestScheduledHostTransition, bmcTimeChangeWithDisabledHostTransition) 92 { 93 // Disable host transition 94 scheduledHostTransition.scheduledTime(0); 95 bmcTimeChange(); 96 // Check timer 97 EXPECT_FALSE(isTimerEnabled()); 98 // Check scheduled time 99 EXPECT_EQ(scheduledHostTransition.HostTransition::scheduledTime(), 0); 100 } 101 102 TEST_F(TestScheduledHostTransition, bmcTimeChangeBackward) 103 { 104 seconds currentTime = getCurrentTime(); 105 // Current time is earlier than scheduled time due to BMC time changing 106 uint64_t schTime = 107 static_cast<uint64_t>((currentTime + seconds(60)).count()); 108 // Set scheduled time, which is the same as bmc time is changed. 109 // But can't use this method to write another case like 110 // bmcTimeChangeForward, because set a scheduled time earlier than current 111 // time will throw an error. 112 scheduledHostTransition.scheduledTime(schTime); 113 bmcTimeChange(); 114 // Check timer 115 EXPECT_TRUE(isTimerEnabled()); 116 } 117 118 } // namespace manager 119 } // namespace state 120 } // namespace phosphor 121