1 // SPDX-License-Identifier: Apache-2.0
2 // SPDX-FileCopyrightText: Copyright OpenBMC Authors
3 #include "utils/sensor_utils.hpp"
4
5 #include <optional>
6 #include <string>
7 #include <tuple>
8
9 #include <gtest/gtest.h>
10
11 namespace redfish::sensor_utils
12 {
13 namespace
14 {
15
TEST(SplitSensorNameAndType,Type)16 TEST(SplitSensorNameAndType, Type)
17 {
18 EXPECT_EQ(splitSensorNameAndType("fantach_foo_1").first, "fan_tach");
19 EXPECT_EQ(splitSensorNameAndType("temperature_foo2").first, "temperature");
20 }
21
TEST(SplitSensorNameAndType,Name)22 TEST(SplitSensorNameAndType, Name)
23 {
24 EXPECT_EQ(splitSensorNameAndType("fantach_foo_1").second, "foo_1");
25 EXPECT_EQ(splitSensorNameAndType("temperature_foo2").second, "foo2");
26 }
27
TEST(SplitSensorNameAndType,Error)28 TEST(SplitSensorNameAndType, Error)
29 {
30 EXPECT_TRUE(splitSensorNameAndType("fantach").first.empty());
31 EXPECT_TRUE(splitSensorNameAndType("temperature").second.empty());
32 }
33
TEST(GetSensorId,Success)34 TEST(GetSensorId, Success)
35 {
36 std::string sensorId;
37
38 sensorId = getSensorId("fan0_0", "fan_tach");
39 EXPECT_EQ(sensorId, "fantach_fan0_0");
40
41 sensorId = getSensorId("0_1", "fan_pwm");
42 EXPECT_EQ(sensorId, "fanpwm_0_1");
43
44 sensorId = getSensorId("fan2", "fan_tach");
45 EXPECT_EQ(sensorId, "fantach_fan2");
46
47 sensorId = getSensorId("fan_3", "fan_tach");
48 EXPECT_EQ(sensorId, "fantach_fan_3");
49
50 sensorId = getSensorId("temp2", "temperature");
51 EXPECT_EQ(sensorId, "temperature_temp2");
52 }
53
TEST(ChassisSubNodeToString,Success)54 TEST(ChassisSubNodeToString, Success)
55 {
56 std::string subNodeStr;
57
58 subNodeStr = chassisSubNodeToString(ChassisSubNode::environmentMetricsNode);
59 EXPECT_EQ(subNodeStr, "EnvironmentMetrics");
60
61 subNodeStr = chassisSubNodeToString(ChassisSubNode::powerNode);
62 EXPECT_EQ(subNodeStr, "Power");
63
64 subNodeStr = chassisSubNodeToString(ChassisSubNode::sensorsNode);
65 EXPECT_EQ(subNodeStr, "Sensors");
66
67 subNodeStr = chassisSubNodeToString(ChassisSubNode::thermalNode);
68 EXPECT_EQ(subNodeStr, "Thermal");
69
70 subNodeStr = chassisSubNodeToString(ChassisSubNode::thermalMetricsNode);
71 EXPECT_EQ(subNodeStr, "ThermalMetrics");
72
73 subNodeStr = chassisSubNodeToString(ChassisSubNode::unknownNode);
74 EXPECT_EQ(subNodeStr, "");
75 }
76
TEST(ChassisSubNodeFromString,Success)77 TEST(ChassisSubNodeFromString, Success)
78 {
79 ChassisSubNode subNode = ChassisSubNode::unknownNode;
80
81 subNode = chassisSubNodeFromString("EnvironmentMetrics");
82 EXPECT_EQ(subNode, ChassisSubNode::environmentMetricsNode);
83
84 subNode = chassisSubNodeFromString("Power");
85 EXPECT_EQ(subNode, ChassisSubNode::powerNode);
86
87 subNode = chassisSubNodeFromString("Sensors");
88 EXPECT_EQ(subNode, ChassisSubNode::sensorsNode);
89
90 subNode = chassisSubNodeFromString("Thermal");
91 EXPECT_EQ(subNode, ChassisSubNode::thermalNode);
92
93 subNode = chassisSubNodeFromString("ThermalMetrics");
94 EXPECT_EQ(subNode, ChassisSubNode::thermalMetricsNode);
95
96 subNode = chassisSubNodeFromString("BadNode");
97 EXPECT_EQ(subNode, ChassisSubNode::unknownNode);
98
99 subNode = chassisSubNodeFromString("");
100 EXPECT_EQ(subNode, ChassisSubNode::unknownNode);
101 }
102
TEST(IsExcerptNode,True)103 TEST(IsExcerptNode, True)
104 {
105 EXPECT_TRUE(isExcerptNode(ChassisSubNode::environmentMetricsNode));
106 EXPECT_TRUE(isExcerptNode(ChassisSubNode::thermalMetricsNode));
107 }
108
TEST(IsExcerptNode,False)109 TEST(IsExcerptNode, False)
110 {
111 EXPECT_FALSE(isExcerptNode(ChassisSubNode::sensorsNode));
112 EXPECT_FALSE(isExcerptNode(ChassisSubNode::powerNode));
113 EXPECT_FALSE(isExcerptNode(ChassisSubNode::thermalNode));
114 EXPECT_FALSE(isExcerptNode(ChassisSubNode::unknownNode));
115 }
116
TEST(UpdateSensorStatistics,ParametersValid)117 TEST(UpdateSensorStatistics, ParametersValid)
118 {
119 nlohmann::json sensorJson;
120 Reading reading =
121 std::make_tuple("metricId1", "metadata1", 42.5, 1234567890);
122 Readings metrics = {reading};
123 Statistics statistics = std::make_tuple(1234567890, metrics);
124 SensorPaths sensorPaths;
125 ReadingParameters readingParams = {std::make_tuple(
126 sensorPaths,
127 "xyz.openbmc_project.Telemetry.Report.OperationType.Maximum",
128 "metricId1", 60)};
129
130 updateSensorStatistics(sensorJson, statistics, readingParams);
131
132 EXPECT_EQ(sensorJson["PeakReading"], 42.5);
133 EXPECT_EQ(sensorJson["PeakReadingTime"], 1234567890);
134 }
135
TEST(UpdateSensorStatistics,EmptyMetrics)136 TEST(UpdateSensorStatistics, EmptyMetrics)
137 {
138 nlohmann::json sensorJson;
139 Readings metrics;
140 Statistics statistics = std::make_tuple(1234567890, metrics);
141 SensorPaths sensorPaths;
142 ReadingParameters readingParams = {std::make_tuple(
143 sensorPaths,
144 "xyz.openbmc_project.Telemetry.Report.OperationType.Maximum",
145 "metricId1", 60)};
146
147 updateSensorStatistics(sensorJson, statistics, readingParams);
148
149 EXPECT_FALSE(sensorJson.contains("PeakReading"));
150 EXPECT_FALSE(sensorJson.contains("PeakReadingTime"));
151 }
152
TEST(UpdateSensorStatistics,NonMaximumOperationType)153 TEST(UpdateSensorStatistics, NonMaximumOperationType)
154 {
155 nlohmann::json sensorJson;
156 Reading reading =
157 std::make_tuple("metricId1", "metadata1", 42.5, 1234567890);
158 Readings metrics = {reading};
159 Statistics statistics = std::make_tuple(1234567890, metrics);
160 SensorPaths sensorPaths;
161 ReadingParameters readingParams = {std::make_tuple(
162 sensorPaths,
163 "xyz.openbmc_project.Telemetry.Report.OperationType.Minimum",
164 "metricId1", 60)};
165
166 updateSensorStatistics(sensorJson, statistics, readingParams);
167
168 EXPECT_FALSE(sensorJson.contains("PeakReading"));
169 EXPECT_FALSE(sensorJson.contains("PeakReadingTime"));
170 }
171
TEST(UpdateSensorStatistics,ParamsNullopt)172 TEST(UpdateSensorStatistics, ParamsNullopt)
173 {
174 nlohmann::json sensorJson;
175 std::optional<Statistics> statistics = std::nullopt;
176 std::optional<ReadingParameters> readingParams = std::nullopt;
177
178 updateSensorStatistics(sensorJson, statistics, readingParams);
179
180 EXPECT_FALSE(sensorJson.contains("PeakReading"));
181 EXPECT_FALSE(sensorJson.contains("PeakReadingTime"));
182 }
183
184 } // namespace
185 } // namespace redfish::sensor_utils
186