Auto determine failsafe duty according sensor fail

- Auto determine the failsafe duty when sensor failed

example:
If PID config as follows, when "Die CPU0" sensor failed, fans in zone 0
will be set to 80%, when "DIMM0" sensor failed, since there is no
"FailSafePercent" setting in config, so set to zone's FailSafePercent
100%.
```
{
    "Class": "temp",
    ...
    ...
    ...
    "Inputs": [
        "Die CPU0"
    ],
    "Name": "CPU0 PID",
    "FailSafePercent": 80.0,
    ...
    ...
    ...
    "Type": "Pid",
    "Zones": [
        "Zone 0"
    ]
},
{
    "Class": "temp",
    ...
    ...
    ...
    "Inputs": [
        "DIMM[0-9]",
        "DIMM1[0-5]"
    ],
    "Name": "DIMM CPU0 PID",
    ...
    ...
    ...
    "Type": "Pid",
    "Zones": [
        "Zone 0"
    ]
},
{
    "FailSafePercent": 100.0,
    "MinThermalOutput": 0.0,
    "Name": "Zone 0",
    "Type": "Pid.Zone",
    "ZoneIndex": 0
},
```

Tested:
If zone1 and zone2 into failsafe duty 40% =>
fan0_pwm         | 1Dh | ok  | 29.0 | 24.70 unspecifi
fan1_pwm         | 1Eh | ok  | 29.1 | 24.70 unspecifi
fan2_pwm         | 1Fh | ok  | 29.2 | 39.98 unspecifi
fan3_pwm         | 20h | ok  | 29.3 | 39.98 unspecifi
fan4_pwm         | 21h | ok  | 29.4 | 39.98 unspecifi
fan5_pwm         | 22h | ok  | 29.5 | 39.98 unspecifi

cpu0_nbm         | 48h | ok  |  7.79 | 36 degrees C

Let cpu0_nbm(zone0 and zone2) into failsafe which set failsafe duty as
100% =>
fan0_pwm         | 1Dh | ok  | 29.0 | 99.96 unspecifi
fan1_pwm         | 1Eh | ok  | 29.1 | 99.96 unspecifi
fan2_pwm         | 1Fh | ok  | 29.2 | 39.98 unspecifi
fan3_pwm         | 20h | ok  | 29.3 | 39.98 unspecifi
fan4_pwm         | 21h | ok  | 29.4 | 99.96 unspecifi
fan5_pwm         | 22h | ok  | 29.5 | 99.96 unspecifi

cpu0_nbm         | 48h | ns  |  7.79 | No Reading

Signed-off-by: Harvey Wu <Harvey.Wu@quantatw.com>
Change-Id: Iaf5ffd1853e5cd110a1ef66c7a1fd073bc894dda
diff --git a/test/pid_zone_unittest.cpp b/test/pid_zone_unittest.cpp
index b494896..5155971 100644
--- a/test/pid_zone_unittest.cpp
+++ b/test/pid_zone_unittest.cpp
@@ -57,7 +57,7 @@
     const char* objPath = "/path/";
     int64_t zone = 1;
     double minThermalOutput = 1000.0;
-    double failSafePercent = 0;
+    double failSafePercent = 100;
     conf::CycleTime cycleTime;
 
     double d;
@@ -130,7 +130,7 @@
     sdbusplus::SdBusMock sdbus_mock_enable;
     int64_t zoneId = 1;
     double minThermalOutput = 1000.0;
-    double failSafePercent = 0;
+    double failSafePercent = 100;
     double setpoint = 50.0;
     bool defer = true;
     bool accSetPoint = false;
@@ -298,45 +298,45 @@
     EXPECT_EQ(zone->getMinThermalSetPoint(), zone->getMaxSetPointRequest());
 }
 
-TEST_F(PidZoneTest, GetFailSafePercent_ReturnsExpected)
+TEST_F(PidZoneTest, GetFailSafePercent_SingleFailedReturnsExpected)
 {
-    // Verify the value used to create the object is stored.
-    // when the final failsafe percent is zero , it indicate
-    // no failsafe percent is configured  , set it to 100% as
-    // the default setting.
+    // Tests when only one sensor failed and the sensor's failsafe duty is zero,
+    // and verify that the sensor name is empty and failsafe duty is PID zone's
+    // failsafe duty.
 
+    std::vector<std::string> input1 = {"temp1"};
+    std::vector<std::string> input2 = {"temp2"};
+    std::vector<std::string> input3 = {"temp3"};
     std::vector<double> values = {0, 0, 0};
-    int64_t defaultPercent = 100;
 
-    zone->addPidFailSafePercent("temp1", values[0]);
-    zone->addPidFailSafePercent("temp2", values[1]);
-    zone->addPidFailSafePercent("temp3", values[2]);
+    zone->addPidFailSafePercent(input1, values[0]);
+    zone->addPidFailSafePercent(input2, values[1]);
+    zone->addPidFailSafePercent(input3, values[2]);
 
-    zone->initPidFailSafePercent();
+    zone->markSensorMissing("temp1");
 
-    EXPECT_EQ(defaultPercent, zone->getFailSafePercent());
+    EXPECT_EQ(failSafePercent, zone->getFailSafePercent());
 }
 
-TEST_F(PidZoneTest, GetFailSafePercent_VerifyReturnsExpected)
+TEST_F(PidZoneTest, GetFailSafePercent_MultiFailedReturnsExpected)
 {
-    // Tests adding PID controller with FailSafePercent to the zone,
-    // and verifies it's returned as expected.
+    // Tests when multi sensor failed, and verify the final failsafe's sensor
+    // name and duty as expected.
 
+    std::vector<std::string> input1 = {"temp1"};
+    std::vector<std::string> input2 = {"temp2"};
+    std::vector<std::string> input3 = {"temp3"};
     std::vector<double> values = {60, 80, 70};
-    double max_value = 0;
 
-    for (const auto& value : values)
-    {
-        max_value = std::max(max_value, value);
-    }
+    zone->addPidFailSafePercent(input1, values[0]);
+    zone->addPidFailSafePercent(input2, values[1]);
+    zone->addPidFailSafePercent(input3, values[2]);
 
-    zone->addPidFailSafePercent("temp1", values[0]);
-    zone->addPidFailSafePercent("temp2", values[1]);
-    zone->addPidFailSafePercent("temp3", values[2]);
+    zone->markSensorMissing("temp1");
+    zone->markSensorMissing("temp2");
+    zone->markSensorMissing("temp3");
 
-    zone->initPidFailSafePercent();
-
-    EXPECT_EQ(max_value, zone->getFailSafePercent());
+    EXPECT_EQ(80, zone->getFailSafePercent());
 }
 
 TEST_F(PidZoneTest, ThermalInputs_FailsafeToValid_ReadsSensors)