12d2caa34SMatthew Barth #include "../fallback.hpp"
22d2caa34SMatthew Barth
32d2caa34SMatthew Barth #include "../psensor.hpp"
42d2caa34SMatthew Barth
57cd75d78SBrad Bishop #include <iostream>
67cd75d78SBrad Bishop #include <string>
72d2caa34SMatthew Barth
87cd75d78SBrad Bishop #include <gtest/gtest.h>
97cd75d78SBrad Bishop
107cd75d78SBrad Bishop int pstate = -1;
117cd75d78SBrad Bishop
127cd75d78SBrad Bishop namespace phosphor
137cd75d78SBrad Bishop {
147cd75d78SBrad Bishop namespace fan
157cd75d78SBrad Bishop {
167cd75d78SBrad Bishop namespace presence
177cd75d78SBrad Bishop {
setPresence(const Fan &,bool newState)18*a081956fSMike Capps void setPresence(const Fan&, bool newState)
197cd75d78SBrad Bishop {
207cd75d78SBrad Bishop if (newState)
217cd75d78SBrad Bishop {
227cd75d78SBrad Bishop pstate = 1;
237cd75d78SBrad Bishop }
247cd75d78SBrad Bishop else
257cd75d78SBrad Bishop {
267cd75d78SBrad Bishop pstate = 0;
277cd75d78SBrad Bishop }
287cd75d78SBrad Bishop }
297cd75d78SBrad Bishop
307cd75d78SBrad Bishop class TestSensor : public PresenceSensor
317cd75d78SBrad Bishop {
327cd75d78SBrad Bishop public:
start()337cd75d78SBrad Bishop bool start() override
347cd75d78SBrad Bishop {
357cd75d78SBrad Bishop ++started;
367cd75d78SBrad Bishop return _present;
377cd75d78SBrad Bishop }
387cd75d78SBrad Bishop
stop()397cd75d78SBrad Bishop void stop() override
407cd75d78SBrad Bishop {
417cd75d78SBrad Bishop ++stopped;
427cd75d78SBrad Bishop }
437cd75d78SBrad Bishop
present()447cd75d78SBrad Bishop bool present() override
457cd75d78SBrad Bishop {
467cd75d78SBrad Bishop return _present;
477cd75d78SBrad Bishop }
487cd75d78SBrad Bishop
fail()497cd75d78SBrad Bishop void fail() override
507cd75d78SBrad Bishop {
517cd75d78SBrad Bishop ++failed;
527cd75d78SBrad Bishop }
537cd75d78SBrad Bishop
547cd75d78SBrad Bishop bool _present = false;
557cd75d78SBrad Bishop size_t started = 0;
567cd75d78SBrad Bishop size_t stopped = 0;
577cd75d78SBrad Bishop size_t failed = 0;
587cd75d78SBrad Bishop };
597cd75d78SBrad Bishop
607cd75d78SBrad Bishop } // namespace presence
617cd75d78SBrad Bishop } // namespace fan
627cd75d78SBrad Bishop } // namespace phosphor
637cd75d78SBrad Bishop
647cd75d78SBrad Bishop using namespace phosphor::fan::presence;
657cd75d78SBrad Bishop
TEST(FallbackTest,TestOne)667cd75d78SBrad Bishop TEST(FallbackTest, TestOne)
677cd75d78SBrad Bishop {
687cd75d78SBrad Bishop // Validate a single sensor.
697cd75d78SBrad Bishop // Validate on->off->on.
707cd75d78SBrad Bishop pstate = -1;
71*a081956fSMike Capps Fan fan{"/path", "name", 0};
727cd75d78SBrad Bishop TestSensor ts;
737cd75d78SBrad Bishop ts._present = true;
747cd75d78SBrad Bishop std::vector<std::reference_wrapper<PresenceSensor>> sensors{ts};
757cd75d78SBrad Bishop Fallback f{fan, sensors};
767cd75d78SBrad Bishop
777cd75d78SBrad Bishop f.monitor();
787cd75d78SBrad Bishop ASSERT_EQ(pstate, 1);
797cd75d78SBrad Bishop ASSERT_EQ(ts.failed, 0);
807cd75d78SBrad Bishop ASSERT_EQ(ts.stopped, 0);
817cd75d78SBrad Bishop ASSERT_EQ(ts.started, 1);
827cd75d78SBrad Bishop
837cd75d78SBrad Bishop f.stateChanged(false);
847cd75d78SBrad Bishop ASSERT_EQ(pstate, 0);
857cd75d78SBrad Bishop ASSERT_EQ(ts.failed, 0);
867cd75d78SBrad Bishop ASSERT_EQ(ts.stopped, 0);
877cd75d78SBrad Bishop ASSERT_EQ(ts.started, 1);
887cd75d78SBrad Bishop
897cd75d78SBrad Bishop f.stateChanged(true);
907cd75d78SBrad Bishop ASSERT_EQ(pstate, 1);
917cd75d78SBrad Bishop ASSERT_EQ(ts.failed, 0);
927cd75d78SBrad Bishop ASSERT_EQ(ts.stopped, 0);
937cd75d78SBrad Bishop ASSERT_EQ(ts.started, 1);
947cd75d78SBrad Bishop }
957cd75d78SBrad Bishop
TEST(FallbackTest,TestTwoA)967cd75d78SBrad Bishop TEST(FallbackTest, TestTwoA)
977cd75d78SBrad Bishop {
987cd75d78SBrad Bishop // Validate two sensors.
997cd75d78SBrad Bishop // Validate both sensors on->off->on
1007cd75d78SBrad Bishop
1017cd75d78SBrad Bishop pstate = -1;
102*a081956fSMike Capps Fan fan{"/path", "name", 0};
1037cd75d78SBrad Bishop TestSensor ts1, ts2;
1047cd75d78SBrad Bishop ts1._present = true;
1057cd75d78SBrad Bishop ts2._present = true;
1067cd75d78SBrad Bishop
1077cd75d78SBrad Bishop std::vector<std::reference_wrapper<PresenceSensor>> sensors{ts1, ts2};
1087cd75d78SBrad Bishop Fallback f{fan, sensors};
1097cd75d78SBrad Bishop
1107cd75d78SBrad Bishop f.monitor();
1117cd75d78SBrad Bishop ASSERT_EQ(pstate, 1);
1127cd75d78SBrad Bishop ASSERT_EQ(ts1.failed, 0);
1137cd75d78SBrad Bishop ASSERT_EQ(ts1.stopped, 0);
1147cd75d78SBrad Bishop ASSERT_EQ(ts1.started, 1);
1157cd75d78SBrad Bishop ASSERT_EQ(ts2.failed, 0);
1167cd75d78SBrad Bishop ASSERT_EQ(ts2.stopped, 0);
1177cd75d78SBrad Bishop ASSERT_EQ(ts2.started, 0);
1187cd75d78SBrad Bishop
1197cd75d78SBrad Bishop ts1._present = false;
1207cd75d78SBrad Bishop ts2._present = false;
1217cd75d78SBrad Bishop f.stateChanged(false);
1227cd75d78SBrad Bishop ASSERT_EQ(pstate, 0);
1237cd75d78SBrad Bishop ASSERT_EQ(ts1.failed, 0);
1247cd75d78SBrad Bishop ASSERT_EQ(ts1.stopped, 0);
1257cd75d78SBrad Bishop ASSERT_EQ(ts1.started, 1);
1267cd75d78SBrad Bishop ASSERT_EQ(ts2.failed, 0);
1277cd75d78SBrad Bishop ASSERT_EQ(ts2.stopped, 0);
1287cd75d78SBrad Bishop ASSERT_EQ(ts2.started, 0);
1297cd75d78SBrad Bishop
1307cd75d78SBrad Bishop ts1._present = true;
1317cd75d78SBrad Bishop ts2._present = true;
1327cd75d78SBrad Bishop f.stateChanged(true);
1337cd75d78SBrad Bishop ASSERT_EQ(pstate, 1);
1347cd75d78SBrad Bishop ASSERT_EQ(ts1.failed, 0);
1357cd75d78SBrad Bishop ASSERT_EQ(ts1.stopped, 0);
1367cd75d78SBrad Bishop ASSERT_EQ(ts1.started, 1);
1377cd75d78SBrad Bishop ASSERT_EQ(ts2.failed, 0);
1387cd75d78SBrad Bishop ASSERT_EQ(ts2.stopped, 0);
1397cd75d78SBrad Bishop ASSERT_EQ(ts2.started, 0);
1407cd75d78SBrad Bishop }
1417cd75d78SBrad Bishop
TEST(FallbackTest,TestTwoB)1427cd75d78SBrad Bishop TEST(FallbackTest, TestTwoB)
1437cd75d78SBrad Bishop {
1447cd75d78SBrad Bishop // Validate two sensors.
1457cd75d78SBrad Bishop // Validate first sensor on->off.
1467cd75d78SBrad Bishop
1477cd75d78SBrad Bishop pstate = -1;
1487cd75d78SBrad Bishop Fan fan{"/path", "name"};
1497cd75d78SBrad Bishop TestSensor ts1, ts2;
1507cd75d78SBrad Bishop ts1._present = true;
1517cd75d78SBrad Bishop ts2._present = true;
1527cd75d78SBrad Bishop
1537cd75d78SBrad Bishop std::vector<std::reference_wrapper<PresenceSensor>> sensors{ts1, ts2};
1547cd75d78SBrad Bishop Fallback f{fan, sensors};
1557cd75d78SBrad Bishop
1567cd75d78SBrad Bishop f.monitor();
1577cd75d78SBrad Bishop ASSERT_EQ(pstate, 1);
1587cd75d78SBrad Bishop ts1._present = false;
1597cd75d78SBrad Bishop f.stateChanged(false);
1607cd75d78SBrad Bishop ASSERT_EQ(pstate, 1);
1617cd75d78SBrad Bishop ASSERT_EQ(ts1.failed, 1);
1627cd75d78SBrad Bishop ASSERT_EQ(ts1.stopped, 1);
1637cd75d78SBrad Bishop ASSERT_EQ(ts1.started, 1);
1647cd75d78SBrad Bishop ASSERT_EQ(ts2.failed, 0);
1657cd75d78SBrad Bishop ASSERT_EQ(ts2.stopped, 0);
1667cd75d78SBrad Bishop ASSERT_EQ(ts2.started, 1);
1677cd75d78SBrad Bishop
1687cd75d78SBrad Bishop // Flip the state of both sensors.
1697cd75d78SBrad Bishop ts1._present = true;
1707cd75d78SBrad Bishop ts2._present = false;
1717cd75d78SBrad Bishop f.stateChanged(false);
1727cd75d78SBrad Bishop ASSERT_EQ(pstate, 0);
1737cd75d78SBrad Bishop ASSERT_EQ(ts1.failed, 1);
1747cd75d78SBrad Bishop ASSERT_EQ(ts1.stopped, 1);
1757cd75d78SBrad Bishop ASSERT_EQ(ts1.started, 1);
1767cd75d78SBrad Bishop ASSERT_EQ(ts2.failed, 0);
1777cd75d78SBrad Bishop ASSERT_EQ(ts2.stopped, 0);
1787cd75d78SBrad Bishop ASSERT_EQ(ts2.started, 1);
1797cd75d78SBrad Bishop }
1807cd75d78SBrad Bishop
TEST(FallbackTest,TestTwoC)1817cd75d78SBrad Bishop TEST(FallbackTest, TestTwoC)
1827cd75d78SBrad Bishop {
1837cd75d78SBrad Bishop // Validate two sensors.
1847cd75d78SBrad Bishop // Validate first in bad state.
1857cd75d78SBrad Bishop
1867cd75d78SBrad Bishop pstate = -1;
1877cd75d78SBrad Bishop Fan fan{"/path", "name"};
1887cd75d78SBrad Bishop TestSensor ts1, ts2;
1897cd75d78SBrad Bishop ts1._present = false;
1907cd75d78SBrad Bishop ts2._present = true;
1917cd75d78SBrad Bishop
1927cd75d78SBrad Bishop std::vector<std::reference_wrapper<PresenceSensor>> sensors{ts1, ts2};
1937cd75d78SBrad Bishop Fallback f{fan, sensors};
1947cd75d78SBrad Bishop
1957cd75d78SBrad Bishop f.monitor();
1967cd75d78SBrad Bishop ASSERT_EQ(pstate, 1);
1977cd75d78SBrad Bishop ASSERT_EQ(ts1.failed, 1);
1987cd75d78SBrad Bishop ASSERT_EQ(ts1.stopped, 0);
1997cd75d78SBrad Bishop ASSERT_EQ(ts1.started, 0);
2007cd75d78SBrad Bishop ASSERT_EQ(ts2.failed, 0);
2017cd75d78SBrad Bishop ASSERT_EQ(ts2.stopped, 0);
2027cd75d78SBrad Bishop ASSERT_EQ(ts2.started, 1);
2037cd75d78SBrad Bishop
2047cd75d78SBrad Bishop f.stateChanged(false);
2057cd75d78SBrad Bishop ASSERT_EQ(pstate, 0);
2067cd75d78SBrad Bishop ASSERT_EQ(ts1.failed, 1);
2077cd75d78SBrad Bishop ASSERT_EQ(ts1.stopped, 0);
2087cd75d78SBrad Bishop ASSERT_EQ(ts1.started, 0);
2097cd75d78SBrad Bishop ASSERT_EQ(ts2.failed, 0);
2107cd75d78SBrad Bishop ASSERT_EQ(ts2.stopped, 0);
2117cd75d78SBrad Bishop ASSERT_EQ(ts2.started, 1);
2127cd75d78SBrad Bishop }
2137cd75d78SBrad Bishop
TEST(FallbackTest,TestTwoD)2147cd75d78SBrad Bishop TEST(FallbackTest, TestTwoD)
2157cd75d78SBrad Bishop {
2167cd75d78SBrad Bishop // Validate two sensors.
2177cd75d78SBrad Bishop // Validate both in bad state.
2187cd75d78SBrad Bishop
2197cd75d78SBrad Bishop pstate = -1;
2207cd75d78SBrad Bishop Fan fan{"/path", "name"};
2217cd75d78SBrad Bishop TestSensor ts1, ts2;
2227cd75d78SBrad Bishop ts1._present = false;
2237cd75d78SBrad Bishop ts2._present = false;
2247cd75d78SBrad Bishop
2257cd75d78SBrad Bishop std::vector<std::reference_wrapper<PresenceSensor>> sensors{ts1, ts2};
2267cd75d78SBrad Bishop Fallback f{fan, sensors};
2277cd75d78SBrad Bishop
2287cd75d78SBrad Bishop f.monitor();
2297cd75d78SBrad Bishop ASSERT_EQ(pstate, 0);
2307cd75d78SBrad Bishop ASSERT_EQ(ts1.failed, 0);
2317cd75d78SBrad Bishop ASSERT_EQ(ts1.stopped, 0);
2327cd75d78SBrad Bishop ASSERT_EQ(ts1.started, 1);
2337cd75d78SBrad Bishop ASSERT_EQ(ts2.failed, 0);
2347cd75d78SBrad Bishop ASSERT_EQ(ts2.stopped, 0);
2357cd75d78SBrad Bishop ASSERT_EQ(ts2.started, 0);
2367cd75d78SBrad Bishop }
237