1 #include "build/buildjson.hpp" 2 #include "errors/exception.hpp" 3 4 #include <gmock/gmock.h> 5 #include <gtest/gtest.h> 6 7 namespace pid_control 8 { 9 namespace 10 { 11 12 TEST(ConfigurationVerificationTest, VerifyHappy) 13 { 14 /* Verify a happy configuration throws no exceptions. */ 15 auto j2 = R"( 16 { 17 "sensors": [{ 18 "name": "fan1", 19 "type": "fan", 20 "readPath": "/xyz/openbmc_project/sensors/fan_tach/fan1" 21 }], 22 "zones": [{ 23 "id": 1, 24 "minThermalOutput": 3000.0, 25 "failsafePercent": 75.0, 26 "pids": [{ 27 "name": "fan1-5", 28 "type": "fan", 29 "inputs": ["fan1", "fan5"], 30 "setpoint": 90.0, 31 "pid": { 32 "samplePeriod": 0.1, 33 "proportionalCoeff": 0.0, 34 "integralCoeff": 0.0, 35 "feedFwdOffsetCoeff": 0.0, 36 "feedFwdGainCoeff": 0.010, 37 "integralLimit_min": 0.0, 38 "integralLimit_max": 0.0, 39 "outLim_min": 30.0, 40 "outLim_max": 100.0, 41 "slewNeg": 0.0, 42 "slewPos": 0.0 43 } 44 }] 45 }] 46 } 47 )"_json; 48 49 validateJson(j2); 50 } 51 52 TEST(ConfigurationVerificationTest, VerifyNoSensorKey) 53 { 54 /* Verify the sensors key must be present. */ 55 auto j2 = R"( 56 { 57 "zones": [{ 58 "id": 1, 59 "minThermalOutput": 3000.0, 60 "failsafePercent": 75.0, 61 "pids": [{ 62 "name": "fan1-5", 63 "type": "fan", 64 "inputs": ["fan1", "fan5"], 65 "setpoint": 90.0, 66 "pid": { 67 "samplePeriod": 0.1, 68 "proportionalCoeff": 0.0, 69 "integralCoeff": 0.0, 70 "feedFwdOffsetCoeff": 0.0, 71 "feedFwdGainCoeff": 0.010, 72 "integralLimit_min": 0.0, 73 "integralLimit_max": 0.0, 74 "outLim_min": 30.0, 75 "outLim_max": 100.0, 76 "slewNeg": 0.0, 77 "slewPos": 0.0 78 } 79 }] 80 }] 81 } 82 )"_json; 83 84 EXPECT_THROW(validateJson(j2), ConfigurationException); 85 } 86 87 TEST(ConfigurationVerificationTest, VerifyNoZoneKey) 88 { 89 /* Verify the zones key must be present. */ 90 auto j2 = R"( 91 { 92 "sensors": [{ 93 "name": "fan1", 94 "type": "fan", 95 "readPath": "/xyz/openbmc_project/sensors/fan_tach/fan1" 96 }] 97 } 98 )"_json; 99 100 EXPECT_THROW(validateJson(j2), ConfigurationException); 101 } 102 103 TEST(ConfigurationVerificationTest, VerifyNoSensor) 104 { 105 /* Verify that there needs to be at least one sensor in the sensors key. */ 106 auto j2 = R"( 107 { 108 "sensors": [], 109 "zones": [{ 110 "id": 1, 111 "minThermalOutput": 3000.0, 112 "failsafePercent": 75.0, 113 "pids": [{ 114 "name": "fan1-5", 115 "type": "fan", 116 "inputs": ["fan1", "fan5"], 117 "setpoint": 90.0, 118 "pid": { 119 "samplePeriod": 0.1, 120 "proportionalCoeff": 0.0, 121 "integralCoeff": 0.0, 122 "feedFwdOffsetCoeff": 0.0, 123 "feedFwdGainCoeff": 0.010, 124 "integralLimit_min": 0.0, 125 "integralLimit_max": 0.0, 126 "outLim_min": 30.0, 127 "outLim_max": 100.0, 128 "slewNeg": 0.0, 129 "slewPos": 0.0 130 } 131 }] 132 }] 133 } 134 )"_json; 135 136 EXPECT_THROW(validateJson(j2), ConfigurationException); 137 } 138 139 TEST(ConfigurationVerificationTest, VerifyNoPidInZone) 140 { 141 /* Verify that there needs to be at least one PID in the zone. */ 142 auto j2 = R"( 143 { 144 "sensors": [{ 145 "name": "fan1", 146 "type": "fan", 147 "readPath": "/xyz/openbmc_project/sensors/fan_tach/fan1" 148 }], 149 "zones": [{ 150 "id": 1, 151 "minThermalOutput": 3000.0, 152 "failsafePercent": 75.0, 153 "pids": [] 154 }] 155 } 156 )"_json; 157 158 EXPECT_THROW(validateJson(j2), ConfigurationException); 159 } 160 161 } // namespace 162 } // namespace pid_control 163