1 #include "sensors/buildjson.hpp"
2 #include "sensors/sensor.hpp"
3 
4 #include <gmock/gmock.h>
5 #include <gtest/gtest.h>
6 
7 namespace pid_control
8 {
9 namespace
10 {
11 
12 TEST(SensorsFromJson, emptyJsonNoSensors)
13 {
14     // If the json has no sensors, the map is empty.
15 
16     auto j2 = R"(
17       {
18         "sensors": []
19       }
20     )"_json;
21 
22     auto output = buildSensorsFromJson(j2);
23     EXPECT_TRUE(output.empty());
24 }
25 
26 TEST(SensorsFromJson, oneFanSensor)
27 {
28     // If the json has one sensor, it's in the map.
29 
30     auto j2 = R"(
31       {
32         "sensors": [{
33             "name": "fan1",
34             "type": "fan",
35             "readPath": "/xyz/openbmc_project/sensors/fan_tach/fan1",
36             "writePath": "/sys/devices/platform/ahb/ahb:apb/1e786000.pwm-tacho-controller/hwmon/**/pwm1",
37             "min": 0,
38             "max": 255
39         }]
40       }
41     )"_json;
42 
43     auto output = buildSensorsFromJson(j2);
44     EXPECT_EQ(static_cast<u_int64_t>(1), output.size());
45     EXPECT_EQ(output["fan1"].type, "fan");
46     EXPECT_EQ(output["fan1"].readPath,
47               "/xyz/openbmc_project/sensors/fan_tach/fan1");
48     EXPECT_EQ(output["fan1"].writePath,
49               "/sys/devices/platform/ahb/ahb:apb/1e786000.pwm-tacho-controller/"
50               "hwmon/**/pwm1");
51     EXPECT_EQ(output["fan1"].min, 0);
52     EXPECT_EQ(output["fan1"].max, 255);
53     EXPECT_EQ(output["fan1"].timeout,
54               Sensor::getDefaultTimeout(output["fan1"].type));
55     EXPECT_EQ(output["fan1"].ignoreDbusMinMax, false);
56 }
57 
58 TEST(SensorsFromJson, IgnoreDbusSensor)
59 {
60     auto j2 = R"(
61       {
62         "sensors": [{
63             "name": "fan1",
64             "type": "fan",
65             "readPath": "/xyz/openbmc_project/sensors/fan_tach/fan1",
66             "ignoreDbusMinMax": true
67         }]
68       }
69     )"_json;
70 
71     auto output = buildSensorsFromJson(j2);
72     EXPECT_EQ(static_cast<u_int64_t>(1), output.size());
73     EXPECT_EQ(output["fan1"].type, "fan");
74     EXPECT_EQ(output["fan1"].readPath,
75               "/xyz/openbmc_project/sensors/fan_tach/fan1");
76     EXPECT_EQ(output["fan1"].writePath, "");
77     EXPECT_EQ(output["fan1"].min, 0);
78     EXPECT_EQ(output["fan1"].max, 0);
79     EXPECT_EQ(output["fan1"].timeout,
80               Sensor::getDefaultTimeout(output["fan1"].type));
81     EXPECT_EQ(output["fan1"].ignoreDbusMinMax, true);
82 }
83 
84 TEST(SensorsFromJson, TempDbusSensor)
85 {
86     auto j2 = R"(
87       {
88         "sensors": [{
89             "name": "CPU_DTS",
90             "type": "temp",
91             "readPath": "/xyz/openbmc_project/sensors/temperature/CPU_DTS",
92             "unavailableAsFailed": false
93         }]
94       }
95     )"_json;
96 
97     auto output = buildSensorsFromJson(j2);
98     EXPECT_EQ(static_cast<u_int64_t>(1), output.size());
99     EXPECT_EQ(output["CPU_DTS"].type, "temp");
100     EXPECT_EQ(output["CPU_DTS"].readPath,
101               "/xyz/openbmc_project/sensors/temperature/CPU_DTS");
102     EXPECT_EQ(output["CPU_DTS"].writePath, "");
103     EXPECT_EQ(output["CPU_DTS"].min, 0);
104     EXPECT_EQ(output["CPU_DTS"].max, 0);
105     EXPECT_EQ(output["CPU_DTS"].timeout,
106               Sensor::getDefaultTimeout(output["CPU_DTS"].type));
107     EXPECT_EQ(output["CPU_DTS"].unavailableAsFailed, false);
108 }
109 
110 TEST(SensorsFromJson, validateOptionalFields)
111 {
112     // The writePath, min, max, timeout, and ignoreDbusMinMax fields are
113     // optional.
114 
115     auto j2 = R"(
116       {
117         "sensors": [{
118             "name": "fan1",
119             "type": "fan",
120             "readPath": "/xyz/openbmc_project/sensors/fan_tach/fan1"
121         }]
122       }
123     )"_json;
124 
125     auto output = buildSensorsFromJson(j2);
126     EXPECT_EQ(static_cast<u_int64_t>(1), output.size());
127     EXPECT_EQ(output["fan1"].type, "fan");
128     EXPECT_EQ(output["fan1"].readPath,
129               "/xyz/openbmc_project/sensors/fan_tach/fan1");
130     EXPECT_EQ(output["fan1"].writePath, "");
131     EXPECT_EQ(output["fan1"].min, 0);
132     EXPECT_EQ(output["fan1"].max, 0);
133     EXPECT_EQ(output["fan1"].timeout,
134               Sensor::getDefaultTimeout(output["fan1"].type));
135     EXPECT_EQ(output["fan1"].ignoreDbusMinMax, false);
136     EXPECT_EQ(output["fan1"].unavailableAsFailed, true);
137 }
138 
139 TEST(SensorsFromJson, twoSensors)
140 {
141     // Same as one sensor, but two.
142     // If a configuration has two sensors with the same name the information
143     // last is the information used.
144 
145     auto j2 = R"(
146       {
147         "sensors": [{
148             "name": "fan1",
149             "type": "fan",
150             "readPath": "/xyz/openbmc_project/sensors/fan_tach/fan1"
151         }, {
152             "name": "fan2",
153             "type": "fan",
154             "readPath": "/xyz/openbmc_project/sensors/fan_tach/fan1"
155         }]
156       }
157     )"_json;
158 
159     auto output = buildSensorsFromJson(j2);
160     EXPECT_EQ(static_cast<u_int64_t>(2), output.size());
161 }
162 
163 } // namespace
164 } // namespace pid_control
165