xref: /openbmc/phosphor-fan-presence/presence/test/fallbacktest.cpp (revision a081956ff4ad2f4d13206b7e80d0587ba187c15b)
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