1 #include <sdbusplus/bus.hpp> 2 #include <gtest/gtest.h> 3 4 #include "types.hpp" 5 #include "manager.hpp" 6 #include "mocked_property_change_listener.hpp" 7 8 using ::testing::_; 9 10 namespace phosphor 11 { 12 namespace time 13 { 14 15 class TestManager : public testing::Test 16 { 17 public: 18 sdbusplus::bus::bus bus; 19 Manager manager; 20 MockPropertyChangeListner listener1; 21 MockPropertyChangeListner listener2; 22 23 TestManager() 24 : bus(sdbusplus::bus::new_default()), 25 manager(bus) 26 { 27 // Add two mocked listeners so that we can test 28 // the behavior related to listeners 29 manager.addListener(&listener1); 30 manager.addListener(&listener2); 31 } 32 33 // Proxies for Manager's private members and functions 34 Mode getTimeMode() 35 { 36 return manager.timeMode; 37 } 38 Owner getTimeOwner() 39 { 40 return manager.timeOwner; 41 } 42 bool hostOn() 43 { 44 return manager.hostOn; 45 } 46 std::string getRequestedMode() 47 { 48 return manager.requestedMode; 49 } 50 std::string getRequestedOwner() 51 { 52 return manager.requestedOwner; 53 } 54 void notifyPropertyChanged(const std::string& key, 55 const std::string& value) 56 { 57 manager.onPropertyChanged(key, value); 58 } 59 void notifyPgoodChanged(bool pgood) 60 { 61 manager.onPgoodChanged(pgood); 62 } 63 }; 64 65 TEST_F(TestManager, DISABLED_empty) 66 { 67 EXPECT_FALSE(hostOn()); 68 EXPECT_EQ("", getRequestedMode()); 69 EXPECT_EQ("", getRequestedOwner()); 70 71 // Default mode/owner is MANUAL/BOTH 72 EXPECT_EQ(Mode::MANUAL, getTimeMode()); 73 EXPECT_EQ(Owner::BOTH, getTimeOwner()); 74 } 75 76 77 TEST_F(TestManager, DISABLED_pgoodChange) 78 { 79 notifyPgoodChanged(true); 80 EXPECT_TRUE(hostOn()); 81 notifyPgoodChanged(false); 82 EXPECT_FALSE(hostOn()); 83 } 84 85 TEST_F(TestManager, DISABLED_propertyChanged) 86 { 87 // When host is off, property change will be notified to listners 88 EXPECT_FALSE(hostOn()); 89 90 // Check mocked listeners shall receive notifications on property changed 91 EXPECT_CALL(listener1, onModeChanged(Mode::MANUAL)).Times(1); 92 EXPECT_CALL(listener1, onOwnerChanged(Owner::HOST)).Times(1); 93 EXPECT_CALL(listener2, onModeChanged(Mode::MANUAL)).Times(1); 94 EXPECT_CALL(listener2, onOwnerChanged(Owner::HOST)).Times(1); 95 96 notifyPropertyChanged("time_mode", "MANUAL"); 97 notifyPropertyChanged("time_owner", "HOST"); 98 99 EXPECT_EQ("", getRequestedMode()); 100 EXPECT_EQ("", getRequestedOwner()); 101 102 // When host is on, property changes are saved as requested ones 103 notifyPgoodChanged(true); 104 105 // Check mocked listeners shall not receive notifications 106 EXPECT_CALL(listener1, onModeChanged(Mode::MANUAL)).Times(0); 107 EXPECT_CALL(listener1, onOwnerChanged(Owner::HOST)).Times(0); 108 EXPECT_CALL(listener2, onModeChanged(Mode::MANUAL)).Times(0); 109 EXPECT_CALL(listener2, onOwnerChanged(Owner::HOST)).Times(0); 110 111 notifyPropertyChanged("time_mode", "NTP"); 112 notifyPropertyChanged("time_owner", "SPLIT"); 113 114 EXPECT_EQ("NTP", getRequestedMode()); 115 EXPECT_EQ("SPLIT", getRequestedOwner()); 116 117 118 // When host becomes off, the requested mode/owner shall be notified 119 // to listners, and be cleared 120 EXPECT_CALL(listener1, onModeChanged(Mode::NTP)).Times(1); 121 EXPECT_CALL(listener1, onOwnerChanged(Owner::SPLIT)).Times(1); 122 EXPECT_CALL(listener2, onModeChanged(Mode::NTP)).Times(1); 123 EXPECT_CALL(listener2, onOwnerChanged(Owner::SPLIT)).Times(1); 124 125 notifyPgoodChanged(false); 126 127 EXPECT_EQ("", getRequestedMode()); 128 EXPECT_EQ("", getRequestedOwner()); 129 130 // When host is on, and invalid property is changed, 131 // verify the code asserts because it shall never occur 132 notifyPgoodChanged(true); 133 ASSERT_DEATH(notifyPropertyChanged("invalid property", "whatever"), ""); 134 } 135 136 TEST_F(TestManager, DISABLED_propertyChangedAndChangedbackWhenHostOn) 137 { 138 // Property is now MANUAL/HOST 139 notifyPropertyChanged("time_mode", "MANUAL"); 140 notifyPropertyChanged("time_owner", "HOST"); 141 142 // Set host on 143 notifyPgoodChanged(true); 144 145 // Check mocked listeners shall not receive notifications 146 EXPECT_CALL(listener1, onModeChanged(_)).Times(0); 147 EXPECT_CALL(listener1, onOwnerChanged(_)).Times(0); 148 EXPECT_CALL(listener2, onModeChanged(_)).Times(0); 149 EXPECT_CALL(listener2, onOwnerChanged(_)).Times(0); 150 151 notifyPropertyChanged("time_mode", "NTP"); 152 notifyPropertyChanged("time_owner", "SPLIT"); 153 154 // Saved as requested mode/owner 155 EXPECT_EQ("NTP", getRequestedMode()); 156 EXPECT_EQ("SPLIT", getRequestedOwner()); 157 158 // Property changed back to MANUAL/HOST 159 notifyPropertyChanged("time_mode", "MANUAL"); 160 notifyPropertyChanged("time_owner", "HOST"); 161 162 // Requested mode/owner shall be updated 163 EXPECT_EQ("MANUAL", getRequestedMode()); 164 EXPECT_EQ("HOST", getRequestedOwner()); 165 166 // Because the latest mode/owner is the same as when host is off, 167 // The listeners shall not be notified, and requested mode/owner 168 // shall be cleared 169 EXPECT_CALL(listener1, onModeChanged(_)).Times(0); 170 EXPECT_CALL(listener1, onOwnerChanged(_)).Times(0); 171 EXPECT_CALL(listener2, onModeChanged(_)).Times(0); 172 EXPECT_CALL(listener2, onOwnerChanged(_)).Times(0); 173 174 notifyPgoodChanged(false); 175 176 EXPECT_EQ("", getRequestedMode()); 177 EXPECT_EQ("", getRequestedOwner()); 178 } 179 180 // TODO: if gmock is ready, add case to test 181 // updateNtpSetting() and updateNetworkSetting() 182 183 } 184 } 185