1 #include "ipmb/IpmbSensor.hpp"
2 
3 #include <cstddef>
4 #include <cstdint>
5 #include <vector>
6 
7 #include <gtest/gtest.h>
8 
9 namespace
10 {
11 
TEST(IPMBSensor,Byte0)12 TEST(IPMBSensor, Byte0)
13 {
14     std::vector<uint8_t> data;
15     data.push_back(42);
16 
17     double responseValue = 0.0;
18     size_t errCount = 0;
19     EXPECT_TRUE(IpmbSensor::processReading(ReadingFormat::byte0, 0, data,
20                                            responseValue, errCount));
21     EXPECT_EQ(responseValue, 42.0);
22 }
23 
TEST(IPMBSensor,NineBitValidPositive)24 TEST(IPMBSensor, NineBitValidPositive)
25 {
26     std::vector<uint8_t> data;
27     data.push_back(0x2a);
28     data.push_back(0x00);
29 
30     double responseValue = 0.0;
31     size_t errCount = 0;
32     EXPECT_TRUE(IpmbSensor::processReading(ReadingFormat::nineBit, 0, data,
33                                            responseValue, errCount));
34     EXPECT_EQ(responseValue, 42.0);
35     EXPECT_EQ(errCount, 0);
36 }
37 
TEST(IPMBSensor,NineBitValidNegative)38 TEST(IPMBSensor, NineBitValidNegative)
39 {
40     std::vector<uint8_t> data;
41     data.push_back(0x9c);
42     data.push_back(0x01);
43 
44     double responseValue = 0.0;
45     size_t errCount = 0;
46     EXPECT_TRUE(IpmbSensor::processReading(ReadingFormat::nineBit, 0, data,
47                                            responseValue, errCount));
48     EXPECT_EQ(responseValue, -100.0);
49     EXPECT_EQ(errCount, 0);
50 }
51 
TEST(IPMBSensor,NineBitMin)52 TEST(IPMBSensor, NineBitMin)
53 {
54     std::vector<uint8_t> data;
55     data.push_back(0x01);
56     data.push_back(0x01);
57 
58     double responseValue = 0.0;
59     size_t errCount = 0;
60     EXPECT_TRUE(IpmbSensor::processReading(ReadingFormat::nineBit, 0, data,
61                                            responseValue, errCount));
62     EXPECT_EQ(responseValue, -255.0);
63     EXPECT_EQ(errCount, 0);
64 }
65 
66 // The Altra Family SoC BMC Interface Specification says the maximum 9-bit value
67 // is 256, but that can't be represented in 9 bits, so test the max as 255.
TEST(IPMBSensor,NineBitMax)68 TEST(IPMBSensor, NineBitMax)
69 {
70     std::vector<uint8_t> data;
71     data.push_back(0xff);
72     data.push_back(0x00);
73 
74     double responseValue = 0.0;
75     size_t errCount = 0;
76     EXPECT_TRUE(IpmbSensor::processReading(ReadingFormat::nineBit, 0, data,
77                                            responseValue, errCount));
78     EXPECT_EQ(responseValue, 255.0);
79     EXPECT_EQ(errCount, 0);
80 }
81 
TEST(IPMBSensor,NineBitTooShort)82 TEST(IPMBSensor, NineBitTooShort)
83 {
84     std::vector<uint8_t> data;
85     data.push_back(0x00);
86 
87     double responseValue = 0.0;
88     size_t errCount = 0;
89     EXPECT_FALSE(IpmbSensor::processReading(ReadingFormat::nineBit, 0, data,
90                                             responseValue, errCount));
91 }
92 
TEST(IPMBSensor,NineBitTooLong)93 TEST(IPMBSensor, NineBitTooLong)
94 {
95     std::vector<uint8_t> data;
96     data.push_back(0x00);
97     data.push_back(0x00);
98     data.push_back(0x00);
99 
100     double responseValue = 0.0;
101     size_t errCount = 0;
102     EXPECT_FALSE(IpmbSensor::processReading(ReadingFormat::nineBit, 0, data,
103                                             responseValue, errCount));
104 }
105 
TEST(IPMBSensor,NineBitInvalid)106 TEST(IPMBSensor, NineBitInvalid)
107 {
108     std::vector<uint8_t> data;
109     data.push_back(0xff);
110     data.push_back(0xff);
111 
112     double responseValue = 0.0;
113     size_t errCount = 0;
114     EXPECT_FALSE(IpmbSensor::processReading(ReadingFormat::nineBit, 0, data,
115                                             responseValue, errCount));
116 }
117 
TEST(IPMBSensor,TenBitValid1)118 TEST(IPMBSensor, TenBitValid1)
119 {
120     std::vector<uint8_t> data;
121     data.push_back(0x08);
122     data.push_back(0x00);
123 
124     double responseValue = 0.0;
125     size_t errCount = 0;
126     EXPECT_TRUE(IpmbSensor::processReading(ReadingFormat::tenBit, 0, data,
127                                            responseValue, errCount));
128     EXPECT_EQ(responseValue, 8.0);
129     EXPECT_EQ(errCount, 0);
130 }
131 
TEST(IPMBSensor,TenBitValid2)132 TEST(IPMBSensor, TenBitValid2)
133 {
134     std::vector<uint8_t> data;
135     data.push_back(0x30);
136     data.push_back(0x02);
137 
138     double responseValue = 0.0;
139     size_t errCount = 0;
140     EXPECT_TRUE(IpmbSensor::processReading(ReadingFormat::tenBit, 0, data,
141                                            responseValue, errCount));
142 
143     EXPECT_EQ(responseValue, 560.0);
144     EXPECT_EQ(errCount, 0);
145 }
146 
TEST(IPMBSensor,TenBitMin)147 TEST(IPMBSensor, TenBitMin)
148 {
149     std::vector<uint8_t> data;
150     data.push_back(0x00);
151     data.push_back(0x00);
152 
153     double responseValue = 0.0;
154     size_t errCount = 0;
155     EXPECT_TRUE(IpmbSensor::processReading(ReadingFormat::tenBit, 0, data,
156                                            responseValue, errCount));
157 
158     EXPECT_EQ(responseValue, 0.0);
159     EXPECT_EQ(errCount, 0);
160 }
161 
TEST(IPMBSensor,TenBitValidMax)162 TEST(IPMBSensor, TenBitValidMax)
163 {
164     std::vector<uint8_t> data;
165     data.push_back(0xff);
166     data.push_back(0x03);
167 
168     double responseValue = 0.0;
169     size_t errCount = 0;
170     EXPECT_TRUE(IpmbSensor::processReading(ReadingFormat::tenBit, 0, data,
171                                            responseValue, errCount));
172 
173     EXPECT_EQ(responseValue, 1023.0);
174     EXPECT_EQ(errCount, 0);
175 }
176 
TEST(IPMBSensor,TenBitTooShort)177 TEST(IPMBSensor, TenBitTooShort)
178 {
179     std::vector<uint8_t> data;
180     data.push_back(0xff);
181 
182     double responseValue = 0.0;
183     size_t errCount = 0;
184     EXPECT_FALSE(IpmbSensor::processReading(ReadingFormat::tenBit, 0, data,
185                                             responseValue, errCount));
186 }
187 
TEST(IPMBSensor,TenBitTooLong)188 TEST(IPMBSensor, TenBitTooLong)
189 {
190     std::vector<uint8_t> data;
191     data.push_back(0x00);
192     data.push_back(0x00);
193     data.push_back(0x00);
194 
195     double responseValue = 0.0;
196     size_t errCount = 0;
197     EXPECT_FALSE(IpmbSensor::processReading(ReadingFormat::tenBit, 0, data,
198                                             responseValue, errCount));
199 }
200 
TEST(IPMBSensor,TenBitInvalid)201 TEST(IPMBSensor, TenBitInvalid)
202 {
203     std::vector<uint8_t> data;
204     data.push_back(0xff);
205     data.push_back(0xff);
206 
207     double responseValue = 0.0;
208     size_t errCount = 0;
209     EXPECT_FALSE(IpmbSensor::processReading(ReadingFormat::tenBit, 0, data,
210                                             responseValue, errCount));
211 }
212 
TEST(IPMBSensor,FifteenBitValid1)213 TEST(IPMBSensor, FifteenBitValid1)
214 {
215     std::vector<uint8_t> data;
216     data.push_back(0xda);
217     data.push_back(0x02);
218 
219     double responseValue = 0.0;
220     size_t errCount = 0;
221     EXPECT_TRUE(IpmbSensor::processReading(ReadingFormat::fifteenBit, 0, data,
222                                            responseValue, errCount));
223     EXPECT_EQ(responseValue, 0.730);
224     EXPECT_EQ(errCount, 0);
225 }
226 
TEST(IPMBSensor,FifteenBitMin)227 TEST(IPMBSensor, FifteenBitMin)
228 {
229     std::vector<uint8_t> data;
230     data.push_back(0x00);
231     data.push_back(0x00);
232 
233     double responseValue = 0.0;
234     size_t errCount = 0;
235     EXPECT_TRUE(IpmbSensor::processReading(ReadingFormat::fifteenBit, 0, data,
236                                            responseValue, errCount));
237     EXPECT_EQ(responseValue, 0.0);
238     EXPECT_EQ(errCount, 0);
239 }
240 
TEST(IPMBSensor,FifteenBitMax)241 TEST(IPMBSensor, FifteenBitMax)
242 {
243     std::vector<uint8_t> data;
244     data.push_back(0xff);
245     data.push_back(0x7f);
246 
247     double responseValue = 0.0;
248     size_t errCount = 0;
249     EXPECT_TRUE(IpmbSensor::processReading(ReadingFormat::fifteenBit, 0, data,
250                                            responseValue, errCount));
251     EXPECT_EQ(responseValue, 32.767);
252     EXPECT_EQ(errCount, 0);
253 }
254 
TEST(IPMBSensor,FifteenBitTooShort)255 TEST(IPMBSensor, FifteenBitTooShort)
256 {
257     std::vector<uint8_t> data;
258     data.push_back(0xff);
259 
260     double responseValue = 0.0;
261     size_t errCount = 0;
262     EXPECT_FALSE(IpmbSensor::processReading(ReadingFormat::fifteenBit, 0, data,
263                                             responseValue, errCount));
264 }
265 
TEST(IPMBSensor,FifteenBitTooLong)266 TEST(IPMBSensor, FifteenBitTooLong)
267 {
268     std::vector<uint8_t> data;
269     data.push_back(0x00);
270     data.push_back(0x00);
271     data.push_back(0x00);
272 
273     double responseValue = 0.0;
274     size_t errCount = 0;
275     EXPECT_FALSE(IpmbSensor::processReading(ReadingFormat::fifteenBit, 0, data,
276                                             responseValue, errCount));
277 }
278 
TEST(IPMBSensor,FifteenBitInvalid)279 TEST(IPMBSensor, FifteenBitInvalid)
280 {
281     std::vector<uint8_t> data;
282     data.push_back(0xff);
283     data.push_back(0xff);
284 
285     double responseValue = 0.0;
286     size_t errCount = 0;
287     EXPECT_FALSE(IpmbSensor::processReading(ReadingFormat::fifteenBit, 0, data,
288                                             responseValue, errCount));
289 }
290 
291 } // namespace
292