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