blob: c0763c8093969fad2a46c0e97fabe9b5083ca170 [file] [log] [blame]
Lei YU415b9642017-02-09 11:37:26 +08001#include "manager.hpp"
Lei YUa5003ce2017-02-24 15:35:25 +08002#include "mocked_property_change_listener.hpp"
Gunnar Millsab4cc6a2018-09-14 14:42:39 -05003#include "types.hpp"
4
5#include <sdbusplus/bus.hpp>
6
7#include <gtest/gtest.h>
Lei YUa5003ce2017-02-24 15:35:25 +08008
9using ::testing::_;
Lei YU415b9642017-02-09 11:37:26 +080010
11namespace phosphor
12{
13namespace time
14{
15
16class TestManager : public testing::Test
17{
Gunnar Millsab4cc6a2018-09-14 14:42:39 -050018 public:
19 sdbusplus::bus::bus bus;
20 Manager manager;
21 MockPropertyChangeListner listener1;
22 MockPropertyChangeListner listener2;
Lei YU415b9642017-02-09 11:37:26 +080023
Gunnar Millsab4cc6a2018-09-14 14:42:39 -050024 TestManager() : bus(sdbusplus::bus::new_default()), manager(bus)
25 {
26 // Add two mocked listeners so that we can test
27 // the behavior related to listeners
28 manager.addListener(&listener1);
29 manager.addListener(&listener2);
30 }
Lei YU415b9642017-02-09 11:37:26 +080031
Gunnar Millsab4cc6a2018-09-14 14:42:39 -050032 // Proxies for Manager's private members and functions
33 Mode getTimeMode()
34 {
35 return manager.timeMode;
36 }
37 Owner getTimeOwner()
38 {
39 return manager.timeOwner;
40 }
41 bool hostOn()
42 {
43 return manager.hostOn;
44 }
45 std::string getRequestedMode()
46 {
47 return manager.requestedMode;
48 }
49 std::string getRequestedOwner()
50 {
51 return manager.requestedOwner;
52 }
53 void notifyPropertyChanged(const std::string& key, const std::string& value)
54 {
55 manager.onPropertyChanged(key, value);
56 }
57 void notifyOnHostState(bool hostOn)
58 {
59 manager.onHostState(hostOn);
60 }
Lei YU415b9642017-02-09 11:37:26 +080061};
62
Lei YUddd54422017-04-18 16:38:44 +080063TEST_F(TestManager, DISABLED_empty)
Lei YU415b9642017-02-09 11:37:26 +080064{
Lei YU7f4fca52017-02-23 15:15:51 +080065 EXPECT_FALSE(hostOn());
66 EXPECT_EQ("", getRequestedMode());
67 EXPECT_EQ("", getRequestedOwner());
Lei YU57eab122017-06-16 10:27:30 +080068
69 // Default mode/owner is MANUAL/BOTH
Lei YUad143542017-07-25 14:27:07 +080070 EXPECT_EQ(Mode::Manual, getTimeMode());
71 EXPECT_EQ(Owner::Both, getTimeOwner());
Lei YU415b9642017-02-09 11:37:26 +080072}
73
Lei YUdebe1d82017-10-13 13:21:37 +080074TEST_F(TestManager, DISABLED_hostStateChange)
Lei YU7f4fca52017-02-23 15:15:51 +080075{
Lei YUdebe1d82017-10-13 13:21:37 +080076 notifyOnHostState(true);
Lei YU7f4fca52017-02-23 15:15:51 +080077 EXPECT_TRUE(hostOn());
Lei YUdebe1d82017-10-13 13:21:37 +080078 notifyOnHostState(false);
Lei YU7f4fca52017-02-23 15:15:51 +080079 EXPECT_FALSE(hostOn());
80}
81
Lei YUddd54422017-04-18 16:38:44 +080082TEST_F(TestManager, DISABLED_propertyChanged)
Lei YU7f4fca52017-02-23 15:15:51 +080083{
Gunnar Mills7f25c532017-10-25 20:45:28 -050084 // When host is off, property change will be notified to listeners
Lei YU7f4fca52017-02-23 15:15:51 +080085 EXPECT_FALSE(hostOn());
Lei YUa5003ce2017-02-24 15:35:25 +080086
87 // Check mocked listeners shall receive notifications on property changed
Lei YUad143542017-07-25 14:27:07 +080088 EXPECT_CALL(listener1, onModeChanged(Mode::Manual)).Times(1);
89 EXPECT_CALL(listener1, onOwnerChanged(Owner::Host)).Times(1);
90 EXPECT_CALL(listener2, onModeChanged(Mode::Manual)).Times(1);
91 EXPECT_CALL(listener2, onOwnerChanged(Owner::Host)).Times(1);
Lei YUa5003ce2017-02-24 15:35:25 +080092
Lei YUad143542017-07-25 14:27:07 +080093 notifyPropertyChanged(
Lei YU710d49b2017-08-01 17:10:17 +080094 "TimeSyncMethod",
Lei YUad143542017-07-25 14:27:07 +080095 "xyz.openbmc_project.Time.Synchronization.Method.Manual");
Gunnar Millsab4cc6a2018-09-14 14:42:39 -050096 notifyPropertyChanged("TimeOwner",
97 "xyz.openbmc_project.Time.Owner.Owners.Host");
Lei YUa5003ce2017-02-24 15:35:25 +080098
Lei YU7f4fca52017-02-23 15:15:51 +080099 EXPECT_EQ("", getRequestedMode());
100 EXPECT_EQ("", getRequestedOwner());
Lei YU7f4fca52017-02-23 15:15:51 +0800101
Lei YU7f4fca52017-02-23 15:15:51 +0800102 // When host is on, property changes are saved as requested ones
Lei YUdebe1d82017-10-13 13:21:37 +0800103 notifyOnHostState(true);
Lei YUa5003ce2017-02-24 15:35:25 +0800104
105 // Check mocked listeners shall not receive notifications
Lei YUad143542017-07-25 14:27:07 +0800106 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);
Lei YUa5003ce2017-02-24 15:35:25 +0800110
Lei YUad143542017-07-25 14:27:07 +0800111 notifyPropertyChanged(
Lei YU710d49b2017-08-01 17:10:17 +0800112 "TimeSyncMethod",
Lei YUad143542017-07-25 14:27:07 +0800113 "xyz.openbmc_project.Time.Synchronization.Method.NTP");
Gunnar Millsab4cc6a2018-09-14 14:42:39 -0500114 notifyPropertyChanged("TimeOwner",
115 "xyz.openbmc_project.Time.Owner.Owners.Split");
Lei YUa5003ce2017-02-24 15:35:25 +0800116
Lei YUad143542017-07-25 14:27:07 +0800117 EXPECT_EQ("xyz.openbmc_project.Time.Synchronization.Method.NTP",
118 getRequestedMode());
119 EXPECT_EQ("xyz.openbmc_project.Time.Owner.Owners.Split",
120 getRequestedOwner());
Lei YU7f4fca52017-02-23 15:15:51 +0800121
Lei YU7f4fca52017-02-23 15:15:51 +0800122 // When host becomes off, the requested mode/owner shall be notified
Gunnar Mills7f25c532017-10-25 20:45:28 -0500123 // to listeners, and be cleared
Lei YUa5003ce2017-02-24 15:35:25 +0800124 EXPECT_CALL(listener1, onModeChanged(Mode::NTP)).Times(1);
Lei YUad143542017-07-25 14:27:07 +0800125 EXPECT_CALL(listener1, onOwnerChanged(Owner::Split)).Times(1);
Lei YUa5003ce2017-02-24 15:35:25 +0800126 EXPECT_CALL(listener2, onModeChanged(Mode::NTP)).Times(1);
Lei YUad143542017-07-25 14:27:07 +0800127 EXPECT_CALL(listener2, onOwnerChanged(Owner::Split)).Times(1);
Lei YUa5003ce2017-02-24 15:35:25 +0800128
Lei YUdebe1d82017-10-13 13:21:37 +0800129 notifyOnHostState(false);
Lei YUa5003ce2017-02-24 15:35:25 +0800130
Lei YU7f4fca52017-02-23 15:15:51 +0800131 EXPECT_EQ("", getRequestedMode());
132 EXPECT_EQ("", getRequestedOwner());
133
134 // When host is on, and invalid property is changed,
135 // verify the code asserts because it shall never occur
Lei YUdebe1d82017-10-13 13:21:37 +0800136 notifyOnHostState(true);
Lei YU7f4fca52017-02-23 15:15:51 +0800137 ASSERT_DEATH(notifyPropertyChanged("invalid property", "whatever"), "");
138}
139
Lei YUddd54422017-04-18 16:38:44 +0800140TEST_F(TestManager, DISABLED_propertyChangedAndChangedbackWhenHostOn)
Lei YUa5003ce2017-02-24 15:35:25 +0800141{
142 // Property is now MANUAL/HOST
Lei YUad143542017-07-25 14:27:07 +0800143 notifyPropertyChanged(
Lei YU710d49b2017-08-01 17:10:17 +0800144 "TimeSyncMethod",
Lei YUad143542017-07-25 14:27:07 +0800145 "xyz.openbmc_project.Time.Synchronization.Method.Manual");
Gunnar Millsab4cc6a2018-09-14 14:42:39 -0500146 notifyPropertyChanged("TimeOwner",
147 "xyz.openbmc_project.Time.Owner.Owners.Host");
Lei YUa5003ce2017-02-24 15:35:25 +0800148
149 // Set host on
Lei YUdebe1d82017-10-13 13:21:37 +0800150 notifyOnHostState(true);
Lei YUa5003ce2017-02-24 15:35:25 +0800151
152 // Check mocked listeners shall not receive notifications
153 EXPECT_CALL(listener1, onModeChanged(_)).Times(0);
154 EXPECT_CALL(listener1, onOwnerChanged(_)).Times(0);
155 EXPECT_CALL(listener2, onModeChanged(_)).Times(0);
156 EXPECT_CALL(listener2, onOwnerChanged(_)).Times(0);
157
Lei YUad143542017-07-25 14:27:07 +0800158 notifyPropertyChanged(
Lei YU710d49b2017-08-01 17:10:17 +0800159 "TimeSyncMethod",
Lei YUad143542017-07-25 14:27:07 +0800160 "xyz.openbmc_project.Time.Synchronization.Method.NTP");
Gunnar Millsab4cc6a2018-09-14 14:42:39 -0500161 notifyPropertyChanged("TimeOwner",
162 "xyz.openbmc_project.Time.Owner.Owners.Split");
Lei YUa5003ce2017-02-24 15:35:25 +0800163
164 // Saved as requested mode/owner
Lei YUad143542017-07-25 14:27:07 +0800165 EXPECT_EQ("xyz.openbmc_project.Time.Synchronization.Method.NTP",
166 getRequestedMode());
167 EXPECT_EQ("xyz.openbmc_project.Time.Owner.Owners.Split",
168 getRequestedOwner());
Lei YUa5003ce2017-02-24 15:35:25 +0800169
170 // Property changed back to MANUAL/HOST
Lei YUad143542017-07-25 14:27:07 +0800171 notifyPropertyChanged(
Lei YU710d49b2017-08-01 17:10:17 +0800172 "TimeSyncMethod",
Lei YUad143542017-07-25 14:27:07 +0800173 "xyz.openbmc_project.Time.Synchronization.Method.Manual");
Gunnar Millsab4cc6a2018-09-14 14:42:39 -0500174 notifyPropertyChanged("TimeOwner",
175 "xyz.openbmc_project.Time.Owner.Owners.Host");
Lei YUa5003ce2017-02-24 15:35:25 +0800176
177 // Requested mode/owner shall be updated
Lei YUad143542017-07-25 14:27:07 +0800178 EXPECT_EQ("xyz.openbmc_project.Time.Synchronization.Method.Manual",
179 getRequestedMode());
180 EXPECT_EQ("xyz.openbmc_project.Time.Owner.Owners.Host",
181 getRequestedOwner());
Lei YUa5003ce2017-02-24 15:35:25 +0800182
183 // Because the latest mode/owner is the same as when host is off,
184 // The listeners shall not be notified, and requested mode/owner
185 // shall be cleared
186 EXPECT_CALL(listener1, onModeChanged(_)).Times(0);
187 EXPECT_CALL(listener1, onOwnerChanged(_)).Times(0);
188 EXPECT_CALL(listener2, onModeChanged(_)).Times(0);
189 EXPECT_CALL(listener2, onOwnerChanged(_)).Times(0);
190
Lei YUdebe1d82017-10-13 13:21:37 +0800191 notifyOnHostState(false);
Lei YUa5003ce2017-02-24 15:35:25 +0800192
193 EXPECT_EQ("", getRequestedMode());
194 EXPECT_EQ("", getRequestedOwner());
195}
196
Lei YUa7417132017-02-23 15:24:05 +0800197// TODO: if gmock is ready, add case to test
198// updateNtpSetting() and updateNetworkSetting()
199
Gunnar Millsab4cc6a2018-09-14 14:42:39 -0500200} // namespace time
201} // namespace phosphor