test: pid: zone

Add unit-tests for the PID zone module.
Add zone_mock.

Tested: Ran on quanta-q71l board and it behaved as expected.

Change-Id: I51185b2d2daacea6ffb687e8f38c4fe2b2a1bed3
Signed-off-by: Patrick Venture <venture@google.com>
diff --git a/pid/controller.hpp b/pid/controller.hpp
index d02f9cc..fa89ad1 100644
--- a/pid/controller.hpp
+++ b/pid/controller.hpp
@@ -6,7 +6,7 @@
 #include "fan.hpp"
 #include "ec/pid.hpp"
 
-class PIDZone;
+class ZoneInterface;
 
 /*
  * Base class for PID controllers.  Each PID that implements this needs to
@@ -15,7 +15,7 @@
 class PIDController
 {
     public:
-        PIDController(const std::string& id, PIDZone* owner)
+        PIDController(const std::string& id, ZoneInterface* owner)
             : _owner(owner),
               _id(id)
         { }
@@ -47,7 +47,7 @@
         }
 
     protected:
-        PIDZone* _owner;
+        ZoneInterface* _owner;
 
     private:
         // parameters
diff --git a/pid/fancontroller.cpp b/pid/fancontroller.cpp
index 340c6d0..c2dee74 100644
--- a/pid/fancontroller.cpp
+++ b/pid/fancontroller.cpp
@@ -22,7 +22,7 @@
 #include "zone.hpp"
 
 std::unique_ptr<PIDController> FanController::CreateFanPid(
-    PIDZone* owner,
+    ZoneInterface* owner,
     const std::string& id,
     std::vector<std::string>& inputs,
     ec::pidinfo initial)
@@ -133,7 +133,7 @@
     // PidSensorMap for writing.
     for (auto& it : _inputs)
     {
-        auto& sensor = _owner->getSensor(it);
+        auto sensor = _owner->getSensor(it);
         sensor->write(static_cast<double>(percent));
     }
 
diff --git a/pid/fancontroller.hpp b/pid/fancontroller.hpp
index b627915..b9b015c 100644
--- a/pid/fancontroller.hpp
+++ b/pid/fancontroller.hpp
@@ -18,14 +18,14 @@
 {
     public:
         static std::unique_ptr<PIDController> CreateFanPid(
-            PIDZone* owner,
+            ZoneInterface* owner,
             const std::string& id,
             std::vector<std::string>& inputs,
             ec::pidinfo initial);
 
         FanController(const std::string& id,
                       std::vector<std::string>& inputs,
-                      PIDZone* owner)
+                      ZoneInterface* owner)
             : PIDController(id, owner),
               _inputs(inputs),
               _direction(FanSpeedDirection::NEUTRAL)
diff --git a/pid/thermalcontroller.cpp b/pid/thermalcontroller.cpp
index 61e5ca9..dee2d4e 100644
--- a/pid/thermalcontroller.cpp
+++ b/pid/thermalcontroller.cpp
@@ -20,7 +20,7 @@
 
 
 std::unique_ptr<PIDController> ThermalController::CreateThermalPid(
-    PIDZone* owner,
+    ZoneInterface* owner,
     const std::string& id,
     std::vector<std::string>& inputs,
     float setpoint,
diff --git a/pid/thermalcontroller.hpp b/pid/thermalcontroller.hpp
index dbfcfc9..32d4a7f 100644
--- a/pid/thermalcontroller.hpp
+++ b/pid/thermalcontroller.hpp
@@ -16,7 +16,7 @@
 {
     public:
         static std::unique_ptr<PIDController> CreateThermalPid(
-            PIDZone* owner,
+            ZoneInterface* owner,
             const std::string& id,
             std::vector<std::string>& inputs,
             float setpoint,
@@ -24,7 +24,7 @@
 
         ThermalController(const std::string& id,
                           std::vector<std::string>& inputs,
-                          PIDZone* owner)
+                          ZoneInterface* owner)
             : PIDController(id, owner),
               _inputs(inputs)
         { }
diff --git a/pid/zone.cpp b/pid/zone.cpp
index 26bff6a..fdf16fc 100644
--- a/pid/zone.cpp
+++ b/pid/zone.cpp
@@ -208,7 +208,7 @@
 
     for (auto& f : _fanInputs)
     {
-        auto& sensor = _mgr.getSensor(f);
+        auto sensor = _mgr.getSensor(f);
         ReadReturn r = sensor->read();
         _cachedValuesByName[f] = r.value;
 
@@ -240,7 +240,7 @@
 
     for (auto& t : _thermalInputs)
     {
-        auto& sensor = _mgr.getSensor(t);
+        auto sensor = _mgr.getSensor(t);
         ReadReturn r = sensor->read();
         int64_t timeout = sensor->GetTimeout();
 
@@ -316,7 +316,7 @@
     }
 }
 
-const std::unique_ptr<Sensor>& PIDZone::getSensor(std::string name)
+Sensor* PIDZone::getSensor(std::string name)
 {
     return _mgr.getSensor(name);
 }
diff --git a/pid/zone.hpp b/pid/zone.hpp
index f6ee5e8..1934a66 100644
--- a/pid/zone.hpp
+++ b/pid/zone.hpp
@@ -23,12 +23,25 @@
     sdbusplus::xyz::openbmc_project::Control::server::Mode;
 using ModeObject = ServerObject<ModeInterface>;
 
+class ZoneInterface
+{
+    public:
+        virtual ~ZoneInterface() = default;
+
+        virtual double getCachedValue(const std::string& name) = 0;
+        virtual void addRPMSetPoint(float setpoint) = 0;
+        virtual float getMaxRPMRequest() const = 0;
+        virtual bool getFailSafeMode() const = 0;
+        virtual float getFailSafePercent() const = 0;
+        virtual Sensor* getSensor(std::string name) = 0;
+};
+
 /*
  * The PIDZone inherits from the Mode object so that it can listen for control
  * mode changes.  It primarily holds all PID loops and holds the sensor value
  * cache that's used per iteration of the PID loops.
  */
-class PIDZone : public ModeObject
+class PIDZone : public ZoneInterface, public ModeObject
 {
     public:
         PIDZone(int64_t zone,
@@ -50,21 +63,21 @@
 #endif
         }
 
-        float getMaxRPMRequest(void) const;
+        float getMaxRPMRequest(void) const override;
         bool getManualMode(void) const;
 
         /* Could put lock around this since it's accessed from two threads, but
          * only one reader/one writer.
          */
         void setManualMode(bool mode);
-        bool getFailSafeMode(void) const;
+        bool getFailSafeMode(void) const override;
         int64_t getZoneId(void) const;
-        void addRPMSetPoint(float setpoint);
+        void addRPMSetPoint(float setpoint) override;
         void clearRPMSetPoints(void);
-        float getFailSafePercent(void) const;
+        float getFailSafePercent(void) const override;
         float getMinThermalRpmSetPt(void) const;
 
-        const std::unique_ptr<Sensor>& getSensor(std::string name);
+        Sensor* getSensor(std::string name) override;
         void determineMaxRPMRequest(void);
         void updateFanTelemetry(void);
         void updateSensors(void);
@@ -75,7 +88,7 @@
 
         void addFanPID(std::unique_ptr<PIDController> pid);
         void addThermalPID(std::unique_ptr<PIDController> pid);
-        double getCachedValue(const std::string& name);
+        double getCachedValue(const std::string& name) override;
         void addFanInput(std::string fan);
         void addThermalInput(std::string therm);