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
TEST(SensorsFromJson,emptyJsonNoSensors)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
TEST(SensorsFromJson,oneFanSensor)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
TEST(SensorsFromJson,IgnoreDbusSensor)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
TEST(SensorsFromJson,TempDbusSensor)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
TEST(SensorsFromJson,validateOptionalFields)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
TEST(SensorsFromJson,twoSensors)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