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