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(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(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, validateOptionalFields)
85 {
86     // The writePath, min, max, timeout, and ignoreDbusMinMax fields are
87     // optional.
88 
89     auto j2 = R"(
90       {
91         "sensors": [{
92             "name": "fan1",
93             "type": "fan",
94             "readPath": "/xyz/openbmc_project/sensors/fan_tach/fan1"
95         }]
96       }
97     )"_json;
98 
99     auto output = buildSensorsFromJson(j2);
100     EXPECT_EQ(1, output.size());
101     EXPECT_EQ(output["fan1"].type, "fan");
102     EXPECT_EQ(output["fan1"].readPath,
103               "/xyz/openbmc_project/sensors/fan_tach/fan1");
104     EXPECT_EQ(output["fan1"].writePath, "");
105     EXPECT_EQ(output["fan1"].min, 0);
106     EXPECT_EQ(output["fan1"].max, 0);
107     EXPECT_EQ(output["fan1"].timeout,
108               Sensor::getDefaultTimeout(output["fan1"].type));
109     EXPECT_EQ(output["fan1"].ignoreDbusMinMax, false);
110 }
111 
112 TEST(SensorsFromJson, twoSensors)
113 {
114     // Same as one sensor, but two.
115     // If a configuration has two sensors with the same name the information
116     // last is the information used.
117 
118     auto j2 = R"(
119       {
120         "sensors": [{
121             "name": "fan1",
122             "type": "fan",
123             "readPath": "/xyz/openbmc_project/sensors/fan_tach/fan1"
124         }, {
125             "name": "fan2",
126             "type": "fan",
127             "readPath": "/xyz/openbmc_project/sensors/fan_tach/fan1"
128         }]
129       }
130     )"_json;
131 
132     auto output = buildSensorsFromJson(j2);
133     EXPECT_EQ(2, output.size());
134 }
135 
136 } // namespace
137 } // namespace pid_control
138