1 #include "libpldm/entity.h"
2 
3 #include "platform-mc/numeric_sensor.hpp"
4 #include "platform-mc/terminus.hpp"
5 
6 #include <gtest/gtest.h>
7 
8 TEST(TerminusTest, supportedTypeTest)
9 {
10     auto t1 = pldm::platform_mc::Terminus(1, 1 << PLDM_BASE);
11     auto t2 =
12         pldm::platform_mc::Terminus(2, 1 << PLDM_BASE | 1 << PLDM_PLATFORM);
13 
14     EXPECT_EQ(true, t1.doesSupportType(PLDM_BASE));
15     EXPECT_EQ(false, t1.doesSupportType(PLDM_PLATFORM));
16     EXPECT_EQ(true, t2.doesSupportType(PLDM_BASE));
17     EXPECT_EQ(true, t2.doesSupportType(PLDM_PLATFORM));
18 }
19 
20 TEST(TerminusTest, getTidTest)
21 {
22     const pldm_tid_t tid = 1;
23     auto t1 = pldm::platform_mc::Terminus(tid, 1 << PLDM_BASE);
24 
25     EXPECT_EQ(tid, t1.getTid());
26 }
27 
28 TEST(TerminusTest, parseSensorAuxiliaryNamesPDRTest)
29 {
30     auto t1 =
31         pldm::platform_mc::Terminus(1, 1 << PLDM_BASE | 1 << PLDM_PLATFORM);
32     std::vector<uint8_t> pdr1{
33         0x0,
34         0x0,
35         0x0,
36         0x1,                             // record handle
37         0x1,                             // PDRHeaderVersion
38         PLDM_SENSOR_AUXILIARY_NAMES_PDR, // PDRType
39         0x0,
40         0x0,                             // recordChangeNumber
41         0x0,
42         21,                              // dataLength
43         0,
44         0x0,                             // PLDMTerminusHandle
45         0x1,
46         0x0,                             // sensorID
47         0x1,                             // sensorCount
48         0x1,                             // nameStringCount
49         'e',
50         'n',
51         0x0, // nameLanguageTag
52         0x0,
53         'T',
54         0x0,
55         'E',
56         0x0,
57         'M',
58         0x0,
59         'P',
60         0x0,
61         '1',
62         0x0,
63         0x0 // sensorName
64     };
65 
66     std::vector<uint8_t> pdr2{
67         0x1, 0x0, 0x0,
68         0x0,                             // record handle
69         0x1,                             // PDRHeaderVersion
70         PLDM_ENTITY_AUXILIARY_NAMES_PDR, // PDRType
71         0x1,
72         0x0,                             // recordChangeNumber
73         0x11,
74         0,                               // dataLength
75         /* Entity Auxiliary Names PDR Data*/
76         3,
77         0x80, // entityType system software
78         0x1,
79         0x0,  // Entity instance number =1
80         0,
81         0,    // Overall system
82         0,    // shared Name Count one name only
83         01,   // nameStringCount
84         0x65, 0x6e, 0x00,
85         0x00, // Language Tag "en"
86         0x53, 0x00, 0x30, 0x00,
87         0x00  // Entity Name "S0"
88     };
89 
90     t1.pdrs.emplace_back(pdr1);
91     t1.pdrs.emplace_back(pdr2);
92     t1.parseTerminusPDRs();
93 
94     auto sensorAuxNames = t1.getSensorAuxiliaryNames(0);
95     EXPECT_EQ(nullptr, sensorAuxNames);
96 
97     sensorAuxNames = t1.getSensorAuxiliaryNames(1);
98     EXPECT_NE(nullptr, sensorAuxNames);
99 
100     const auto& [sensorId, sensorCnt, names] = *sensorAuxNames;
101     EXPECT_EQ(1, sensorId);
102     EXPECT_EQ(1, sensorCnt);
103     EXPECT_EQ(1, names.size());
104     EXPECT_EQ(1, names[0].size());
105     EXPECT_EQ("en", names[0][0].first);
106     EXPECT_EQ("TEMP1", names[0][0].second);
107     EXPECT_EQ(2, t1.pdrs.size());
108     EXPECT_EQ("S0", t1.getTerminusName().value());
109 }
110 
111 TEST(TerminusTest, parseSensorAuxiliaryMultiNamesPDRTest)
112 {
113     auto t1 =
114         pldm::platform_mc::Terminus(1, 1 << PLDM_BASE | 1 << PLDM_PLATFORM);
115     std::vector<uint8_t> pdr1{
116         0x0,
117         0x0,
118         0x0,
119         0x1,                             // record handle
120         0x1,                             // PDRHeaderVersion
121         PLDM_SENSOR_AUXILIARY_NAMES_PDR, // PDRType
122         0x0,
123         0x0,                             // recordChangeNumber
124         0x0,
125         53,                              // dataLength
126         0,
127         0x0,                             // PLDMTerminusHandle
128         0x1,
129         0x0,                             // sensorID
130         0x1,                             // sensorCount
131         0x3,                             // nameStringCount
132         'e',
133         'n',
134         0x0, // nameLanguageTag
135         0x0,
136         'T',
137         0x0,
138         'E',
139         0x0,
140         'M',
141         0x0,
142         'P',
143         0x0,
144         '1',
145         0x0,
146         0x0, // sensorName Temp1
147         'f',
148         'r',
149         0x0, // nameLanguageTag
150         0x0,
151         'T',
152         0x0,
153         'E',
154         0x0,
155         'M',
156         0x0,
157         'P',
158         0x0,
159         '2',
160         0x0,
161         0x0, // sensorName Temp2
162         'f',
163         'r',
164         0x0, // nameLanguageTag
165         0x0,
166         'T',
167         0x0,
168         'E',
169         0x0,
170         'M',
171         0x0,
172         'P',
173         0x0,
174         '1',
175         0x0,
176         '2',
177         0x0,
178         0x0 // sensorName Temp12
179     };
180 
181     std::vector<uint8_t> pdr2{
182         0x1, 0x0, 0x0,
183         0x0,                             // record handle
184         0x1,                             // PDRHeaderVersion
185         PLDM_ENTITY_AUXILIARY_NAMES_PDR, // PDRType
186         0x1,
187         0x0,                             // recordChangeNumber
188         0x11,
189         0,                               // dataLength
190         /* Entity Auxiliary Names PDR Data*/
191         3,
192         0x80, // entityType system software
193         0x1,
194         0x0,  // Entity instance number =1
195         0,
196         0,    // Overall system
197         0,    // shared Name Count one name only
198         01,   // nameStringCount
199         0x65, 0x6e, 0x00,
200         0x00, // Language Tag "en"
201         0x53, 0x00, 0x30, 0x00,
202         0x00  // Entity Name "S0"
203     };
204 
205     t1.pdrs.emplace_back(pdr1);
206     t1.pdrs.emplace_back(pdr2);
207     t1.parseTerminusPDRs();
208 
209     auto sensorAuxNames = t1.getSensorAuxiliaryNames(0);
210     EXPECT_EQ(nullptr, sensorAuxNames);
211 
212     sensorAuxNames = t1.getSensorAuxiliaryNames(1);
213     EXPECT_NE(nullptr, sensorAuxNames);
214 
215     const auto& [sensorId, sensorCnt, names] = *sensorAuxNames;
216     EXPECT_EQ(1, sensorId);
217     EXPECT_EQ(1, sensorCnt);
218     EXPECT_EQ(1, names.size());
219     EXPECT_EQ(3, names[0].size());
220     EXPECT_EQ("en", names[0][0].first);
221     EXPECT_EQ("TEMP1", names[0][0].second);
222     EXPECT_EQ("fr", names[0][1].first);
223     EXPECT_EQ("TEMP2", names[0][1].second);
224     EXPECT_EQ("fr", names[0][2].first);
225     EXPECT_EQ("TEMP12", names[0][2].second);
226     EXPECT_EQ(2, t1.pdrs.size());
227     EXPECT_EQ("S0", t1.getTerminusName().value());
228 }
229 
230 TEST(TerminusTest, parseSensorAuxiliaryNamesMultiSensorsPDRTest)
231 {
232     auto t1 =
233         pldm::platform_mc::Terminus(1, 1 << PLDM_BASE | 1 << PLDM_PLATFORM);
234     std::vector<uint8_t> pdr1{
235         0x0,
236         0x0,
237         0x0,
238         0x1,                             // record handle
239         0x1,                             // PDRHeaderVersion
240         PLDM_SENSOR_AUXILIARY_NAMES_PDR, // PDRType
241         0x0,
242         0x0,                             // recordChangeNumber
243         0x0,
244         54,                              // dataLength
245         0,
246         0x0,                             // PLDMTerminusHandle
247         0x1,
248         0x0,                             // sensorID
249         0x2,                             // sensorCount
250         0x1,                             // nameStringCount
251         'e',
252         'n',
253         0x0, // nameLanguageTag
254         0x0,
255         'T',
256         0x0,
257         'E',
258         0x0,
259         'M',
260         0x0,
261         'P',
262         0x0,
263         '1',
264         0x0,
265         0x0, // sensorName Temp1
266         0x2, // nameStringCount
267         'f',
268         'r',
269         0x0, // nameLanguageTag
270         0x0,
271         'T',
272         0x0,
273         'E',
274         0x0,
275         'M',
276         0x0,
277         'P',
278         0x0,
279         '2',
280         0x0,
281         0x0, // sensorName Temp2
282         'f',
283         'r',
284         0x0, // nameLanguageTag
285         0x0,
286         'T',
287         0x0,
288         'E',
289         0x0,
290         'M',
291         0x0,
292         'P',
293         0x0,
294         '1',
295         0x0,
296         '2',
297         0x0,
298         0x0 // sensorName Temp12
299     };
300 
301     std::vector<uint8_t> pdr2{
302         0x1, 0x0, 0x0,
303         0x0,                             // record handle
304         0x1,                             // PDRHeaderVersion
305         PLDM_ENTITY_AUXILIARY_NAMES_PDR, // PDRType
306         0x1,
307         0x0,                             // recordChangeNumber
308         0x11,
309         0,                               // dataLength
310         /* Entity Auxiliary Names PDR Data*/
311         3,
312         0x80, // entityType system software
313         0x1,
314         0x0,  // Entity instance number =1
315         0,
316         0,    // Overall system
317         0,    // shared Name Count one name only
318         01,   // nameStringCount
319         0x65, 0x6e, 0x00,
320         0x00, // Language Tag "en"
321         0x53, 0x00, 0x30, 0x00,
322         0x00  // Entity Name "S0"
323     };
324 
325     t1.pdrs.emplace_back(pdr1);
326     t1.pdrs.emplace_back(pdr2);
327     t1.parseTerminusPDRs();
328 
329     auto sensorAuxNames = t1.getSensorAuxiliaryNames(0);
330     EXPECT_EQ(nullptr, sensorAuxNames);
331 
332     sensorAuxNames = t1.getSensorAuxiliaryNames(1);
333     EXPECT_NE(nullptr, sensorAuxNames);
334 
335     const auto& [sensorId, sensorCnt, names] = *sensorAuxNames;
336     EXPECT_EQ(1, sensorId);
337     EXPECT_EQ(2, sensorCnt);
338     EXPECT_EQ(2, names.size());
339     EXPECT_EQ(1, names[0].size());
340     EXPECT_EQ("en", names[0][0].first);
341     EXPECT_EQ("TEMP1", names[0][0].second);
342     EXPECT_EQ(2, names[1].size());
343     EXPECT_EQ("fr", names[1][0].first);
344     EXPECT_EQ("TEMP2", names[1][0].second);
345     EXPECT_EQ("fr", names[1][1].first);
346     EXPECT_EQ("TEMP12", names[1][1].second);
347     EXPECT_EQ(2, t1.pdrs.size());
348     EXPECT_EQ("S0", t1.getTerminusName().value());
349 }
350 
351 TEST(TerminusTest, parsePDRTestNoSensorPDR)
352 {
353     auto t1 =
354         pldm::platform_mc::Terminus(1, 1 << PLDM_BASE | 1 << PLDM_PLATFORM);
355     std::vector<uint8_t> pdr1{
356         0x1, 0x0, 0x0,
357         0x0,                             // record handle
358         0x1,                             // PDRHeaderVersion
359         PLDM_ENTITY_AUXILIARY_NAMES_PDR, // PDRType
360         0x1,
361         0x0,                             // recordChangeNumber
362         0x11,
363         0,                               // dataLength
364         /* Entity Auxiliary Names PDR Data*/
365         3,
366         0x80, // entityType system software
367         0x1,
368         0x0,  // Entity instance number =1
369         0,
370         0,    // Overall system
371         0,    // shared Name Count one name only
372         01,   // nameStringCount
373         0x65, 0x6e, 0x00,
374         0x00, // Language Tag "en"
375         0x53, 0x00, 0x30, 0x00,
376         0x00  // Entity Name "S0"
377     };
378 
379     t1.pdrs.emplace_back(pdr1);
380     t1.parseTerminusPDRs();
381 
382     auto sensorAuxNames = t1.getSensorAuxiliaryNames(1);
383     EXPECT_EQ(nullptr, sensorAuxNames);
384 }
385