blob: bbaca9660a12418c862dd30199f4acb767dc9c43 [file] [log] [blame]
Lei YU415b9642017-02-09 11:37:26 +08001#include <sdbusplus/bus.hpp>
2#include <gtest/gtest.h>
3
4#include "types.hpp"
5#include "manager.hpp"
Lei YUa5003ce2017-02-24 15:35:25 +08006#include "mocked_property_change_listener.hpp"
7
8using ::testing::_;
Lei YU415b9642017-02-09 11:37:26 +08009
10namespace phosphor
11{
12namespace time
13{
14
15class TestManager : public testing::Test
16{
17 public:
18 sdbusplus::bus::bus bus;
19 Manager manager;
Lei YUa5003ce2017-02-24 15:35:25 +080020 MockPropertyChangeListner listener1;
21 MockPropertyChangeListner listener2;
Lei YU415b9642017-02-09 11:37:26 +080022
23 TestManager()
24 : bus(sdbusplus::bus::new_default()),
25 manager(bus)
26 {
Lei YUa5003ce2017-02-24 15:35:25 +080027 // Add two mocked listeners so that we can test
28 // the behavior related to listeners
29 manager.addListener(&listener1);
30 manager.addListener(&listener2);
Lei YU415b9642017-02-09 11:37:26 +080031 }
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 Mode convertToMode(const std::string& mode)
43 {
44 return Manager::convertToMode(mode);
45 }
46 Owner convertToOwner(const std::string& owner)
47 {
48 return Manager::convertToOwner(owner);
49 }
Lei YU7f4fca52017-02-23 15:15:51 +080050 bool hostOn()
51 {
52 return manager.hostOn;
53 }
54 std::string getRequestedMode()
55 {
56 return manager.requestedMode;
57 }
58 std::string getRequestedOwner()
59 {
60 return manager.requestedOwner;
61 }
62 void notifyPropertyChanged(const std::string& key,
63 const std::string& value)
64 {
65 manager.onPropertyChanged(key, value);
66 }
67 void notifyPgoodChanged(bool pgood)
68 {
69 manager.onPgoodChanged(pgood);
70 }
Lei YU415b9642017-02-09 11:37:26 +080071};
72
73TEST_F(TestManager, empty)
74{
Lei YU7f4fca52017-02-23 15:15:51 +080075 EXPECT_FALSE(hostOn());
76 EXPECT_EQ("", getRequestedMode());
77 EXPECT_EQ("", getRequestedOwner());
Lei YU415b9642017-02-09 11:37:26 +080078 EXPECT_EQ(Mode::NTP, getTimeMode());
79 EXPECT_EQ(Owner::BMC, getTimeOwner());
80}
81
82TEST_F(TestManager, convertToMode)
83{
84 EXPECT_EQ(Mode::NTP, convertToMode("NTP"));
85 EXPECT_EQ(Mode::MANUAL, convertToMode("MANUAL"));
86
87 // All unrecognized strings are mapped to Ntp
88 EXPECT_EQ(Mode::NTP, convertToMode(""));
89 EXPECT_EQ(Mode::NTP, convertToMode("Manual"));
90 EXPECT_EQ(Mode::NTP, convertToMode("whatever"));
91}
92
93
94TEST_F(TestManager, convertToOwner)
95{
96 EXPECT_EQ(Owner::BMC, convertToOwner("BMC"));
97 EXPECT_EQ(Owner::HOST, convertToOwner("HOST"));
98 EXPECT_EQ(Owner::SPLIT, convertToOwner("SPLIT"));
99 EXPECT_EQ(Owner::BOTH, convertToOwner("BOTH"));
100
101 // All unrecognized strings are mapped to Bmc
102 EXPECT_EQ(Owner::BMC, convertToOwner(""));
103 EXPECT_EQ(Owner::BMC, convertToOwner("Split"));
104 EXPECT_EQ(Owner::BMC, convertToOwner("xyz"));
105}
106
Lei YU7f4fca52017-02-23 15:15:51 +0800107TEST_F(TestManager, pgoodChange)
108{
109 notifyPgoodChanged(true);
110 EXPECT_TRUE(hostOn());
111 notifyPgoodChanged(false);
112 EXPECT_FALSE(hostOn());
113}
114
Lei YUa5003ce2017-02-24 15:35:25 +0800115TEST_F(TestManager, propertyChanged)
Lei YU7f4fca52017-02-23 15:15:51 +0800116{
117 // When host is off, property change will be notified to listners
118 EXPECT_FALSE(hostOn());
Lei YUa5003ce2017-02-24 15:35:25 +0800119
120 // Check mocked listeners shall receive notifications on property changed
121 EXPECT_CALL(listener1, onModeChanged(Mode::MANUAL)).Times(1);
122 EXPECT_CALL(listener1, onOwnerChanged(Owner::HOST)).Times(1);
123 EXPECT_CALL(listener2, onModeChanged(Mode::MANUAL)).Times(1);
124 EXPECT_CALL(listener2, onOwnerChanged(Owner::HOST)).Times(1);
125
Lei YU7f4fca52017-02-23 15:15:51 +0800126 notifyPropertyChanged("time_mode", "MANUAL");
127 notifyPropertyChanged("time_owner", "HOST");
Lei YUa5003ce2017-02-24 15:35:25 +0800128
Lei YU7f4fca52017-02-23 15:15:51 +0800129 EXPECT_EQ("", getRequestedMode());
130 EXPECT_EQ("", getRequestedOwner());
Lei YU7f4fca52017-02-23 15:15:51 +0800131
Lei YU7f4fca52017-02-23 15:15:51 +0800132 // When host is on, property changes are saved as requested ones
Lei YUa5003ce2017-02-24 15:35:25 +0800133 notifyPgoodChanged(true);
134
135 // Check mocked listeners shall not receive notifications
136 EXPECT_CALL(listener1, onModeChanged(Mode::MANUAL)).Times(0);
137 EXPECT_CALL(listener1, onOwnerChanged(Owner::HOST)).Times(0);
138 EXPECT_CALL(listener2, onModeChanged(Mode::MANUAL)).Times(0);
139 EXPECT_CALL(listener2, onOwnerChanged(Owner::HOST)).Times(0);
140
141 notifyPropertyChanged("time_mode", "NTP");
142 notifyPropertyChanged("time_owner", "SPLIT");
143
144 EXPECT_EQ("NTP", getRequestedMode());
145 EXPECT_EQ("SPLIT", getRequestedOwner());
Lei YU7f4fca52017-02-23 15:15:51 +0800146
147
148 // When host becomes off, the requested mode/owner shall be notified
149 // to listners, and be cleared
Lei YUa5003ce2017-02-24 15:35:25 +0800150 EXPECT_CALL(listener1, onModeChanged(Mode::NTP)).Times(1);
151 EXPECT_CALL(listener1, onOwnerChanged(Owner::SPLIT)).Times(1);
152 EXPECT_CALL(listener2, onModeChanged(Mode::NTP)).Times(1);
153 EXPECT_CALL(listener2, onOwnerChanged(Owner::SPLIT)).Times(1);
154
Lei YU7f4fca52017-02-23 15:15:51 +0800155 notifyPgoodChanged(false);
Lei YUa5003ce2017-02-24 15:35:25 +0800156
Lei YU7f4fca52017-02-23 15:15:51 +0800157 EXPECT_EQ("", getRequestedMode());
158 EXPECT_EQ("", getRequestedOwner());
159
160 // When host is on, and invalid property is changed,
161 // verify the code asserts because it shall never occur
162 notifyPgoodChanged(true);
163 ASSERT_DEATH(notifyPropertyChanged("invalid property", "whatever"), "");
164}
165
Lei YUa5003ce2017-02-24 15:35:25 +0800166TEST_F(TestManager, propertyChangedAndChangedbackWhenHostOn)
167{
168 // Property is now MANUAL/HOST
169 notifyPropertyChanged("time_mode", "MANUAL");
170 notifyPropertyChanged("time_owner", "HOST");
171
172 // Set host on
173 notifyPgoodChanged(true);
174
175 // Check mocked listeners shall not receive notifications
176 EXPECT_CALL(listener1, onModeChanged(_)).Times(0);
177 EXPECT_CALL(listener1, onOwnerChanged(_)).Times(0);
178 EXPECT_CALL(listener2, onModeChanged(_)).Times(0);
179 EXPECT_CALL(listener2, onOwnerChanged(_)).Times(0);
180
181 notifyPropertyChanged("time_mode", "NTP");
182 notifyPropertyChanged("time_owner", "SPLIT");
183
184 // Saved as requested mode/owner
185 EXPECT_EQ("NTP", getRequestedMode());
186 EXPECT_EQ("SPLIT", getRequestedOwner());
187
188 // Property changed back to MANUAL/HOST
189 notifyPropertyChanged("time_mode", "MANUAL");
190 notifyPropertyChanged("time_owner", "HOST");
191
192 // Requested mode/owner shall be updated
193 EXPECT_EQ("MANUAL", getRequestedMode());
194 EXPECT_EQ("HOST", getRequestedOwner());
195
196 // Because the latest mode/owner is the same as when host is off,
197 // The listeners shall not be notified, and requested mode/owner
198 // shall be cleared
199 EXPECT_CALL(listener1, onModeChanged(_)).Times(0);
200 EXPECT_CALL(listener1, onOwnerChanged(_)).Times(0);
201 EXPECT_CALL(listener2, onModeChanged(_)).Times(0);
202 EXPECT_CALL(listener2, onOwnerChanged(_)).Times(0);
203
204 notifyPgoodChanged(false);
205
206 EXPECT_EQ("", getRequestedMode());
207 EXPECT_EQ("", getRequestedOwner());
208}
209
Lei YUa7417132017-02-23 15:24:05 +0800210// TODO: if gmock is ready, add case to test
211// updateNtpSetting() and updateNetworkSetting()
212
Lei YU415b9642017-02-09 11:37:26 +0800213}
214}