1 #include "libpldm/platform.h"
2 
3 #include "common/utils.hpp"
4 
5 #include <gtest/gtest.h>
6 
7 using namespace pldm::utils;
8 
9 TEST(decodeDate, testGooduintToDate)
10 {
11     uint64_t data = 20191212115959;
12     uint16_t year = 2019;
13     uint8_t month = 12;
14     uint8_t day = 12;
15     uint8_t hours = 11;
16     uint8_t minutes = 59;
17     uint8_t seconds = 59;
18 
19     uint16_t retyear = 0;
20     uint8_t retmonth = 0;
21     uint8_t retday = 0;
22     uint8_t rethours = 0;
23     uint8_t retminutes = 0;
24     uint8_t retseconds = 0;
25 
26     auto ret = uintToDate(data, &retyear, &retmonth, &retday, &rethours,
27                           &retminutes, &retseconds);
28 
29     EXPECT_EQ(ret, true);
30     EXPECT_EQ(year, retyear);
31     EXPECT_EQ(month, retmonth);
32     EXPECT_EQ(day, retday);
33     EXPECT_EQ(hours, rethours);
34     EXPECT_EQ(minutes, retminutes);
35     EXPECT_EQ(seconds, retseconds);
36 }
37 
38 TEST(decodeDate, testBaduintToDate)
39 {
40     uint64_t data = 10191212115959;
41 
42     uint16_t retyear = 0;
43     uint8_t retmonth = 0;
44     uint8_t retday = 0;
45     uint8_t rethours = 0;
46     uint8_t retminutes = 0;
47     uint8_t retseconds = 0;
48 
49     auto ret = uintToDate(data, &retyear, &retmonth, &retday, &rethours,
50                           &retminutes, &retseconds);
51 
52     EXPECT_EQ(ret, false);
53 }
54 
55 TEST(parseEffecterData, testGoodDecodeEffecterData)
56 {
57     std::vector<uint8_t> effecterData = {1, 1, 0, 1};
58     uint8_t effecterCount = 2;
59     set_effecter_state_field stateField0 = {1, 1};
60     set_effecter_state_field stateField1 = {0, 1};
61 
62     auto effecterField = parseEffecterData(effecterData, effecterCount);
63     EXPECT_NE(effecterField, std::nullopt);
64     EXPECT_EQ(effecterCount, effecterField->size());
65 
66     std::vector<set_effecter_state_field> stateField = effecterField.value();
67     EXPECT_EQ(stateField[0].set_request, stateField0.set_request);
68     EXPECT_EQ(stateField[0].effecter_state, stateField0.effecter_state);
69     EXPECT_EQ(stateField[1].set_request, stateField1.set_request);
70     EXPECT_EQ(stateField[1].effecter_state, stateField1.effecter_state);
71 }
72 
73 TEST(parseEffecterData, testBadDecodeEffecterData)
74 {
75     std::vector<uint8_t> effecterData = {0, 1, 0, 1, 0, 1};
76     uint8_t effecterCount = 2;
77 
78     auto effecterField = parseEffecterData(effecterData, effecterCount);
79 
80     EXPECT_EQ(effecterField, std::nullopt);
81 }
82 
83 TEST(FindStateEffecterPDR, testOneMatch)
84 {
85     auto repo = pldm_pdr_init();
86     uint8_t tid = 1;
87     uint16_t entityID = 33;
88     uint16_t stateSetId = 196;
89 
90     std::vector<uint8_t> pdr(sizeof(struct pldm_state_effecter_pdr) -
91                              sizeof(uint8_t) +
92                              sizeof(struct state_effecter_possible_states));
93 
94     auto rec = reinterpret_cast<pldm_state_effecter_pdr*>(pdr.data());
95 
96     auto state =
97         reinterpret_cast<state_effecter_possible_states*>(rec->possible_states);
98 
99     rec->hdr.type = 11;
100     rec->hdr.record_handle = 1;
101     rec->entity_type = 33;
102     rec->container_id = 0;
103     rec->composite_effecter_count = 1;
104     state->state_set_id = 196;
105     state->possible_states_size = 1;
106 
107     pldm_pdr_add(repo, pdr.data(), pdr.size(), 0, false, 1);
108 
109     auto record = findStateEffecterPDR(tid, entityID, stateSetId, repo);
110 
111     EXPECT_EQ(pdr, record[0]);
112 
113     pldm_pdr_destroy(repo);
114 }
115 
116 TEST(FindStateEffecterPDR, testNoMatch)
117 {
118     auto repo = pldm_pdr_init();
119     uint8_t tid = 1;
120     uint16_t entityID = 44;
121     uint16_t stateSetId = 196;
122 
123     std::vector<uint8_t> pdr(sizeof(struct pldm_state_effecter_pdr) -
124                              sizeof(uint8_t) +
125                              sizeof(struct state_effecter_possible_states));
126 
127     auto rec = reinterpret_cast<pldm_state_effecter_pdr*>(pdr.data());
128 
129     auto state =
130         reinterpret_cast<state_effecter_possible_states*>(rec->possible_states);
131 
132     rec->hdr.type = 11;
133     rec->hdr.record_handle = 1;
134     rec->entity_type = 33;
135     rec->container_id = 0;
136     rec->composite_effecter_count = 1;
137     state->state_set_id = 196;
138     state->possible_states_size = 1;
139 
140     pldm_pdr_add(repo, pdr.data(), pdr.size(), 0, false, 1);
141 
142     auto record = findStateEffecterPDR(tid, entityID, stateSetId, repo);
143 
144     EXPECT_EQ(record.empty(), true);
145 
146     pldm_pdr_destroy(repo);
147 }
148 
149 TEST(FindStateEffecterPDR, testEmptyRepo)
150 {
151     auto repo = pldm_pdr_init();
152     uint8_t tid = 1;
153     uint16_t entityID = 33;
154     uint16_t stateSetId = 196;
155 
156     std::vector<uint8_t> pdr(sizeof(struct pldm_state_effecter_pdr) -
157                              sizeof(uint8_t) +
158                              sizeof(struct state_effecter_possible_states));
159 
160     auto record = findStateEffecterPDR(tid, entityID, stateSetId, repo);
161 
162     EXPECT_EQ(record.empty(), true);
163 
164     pldm_pdr_destroy(repo);
165 }
166 
167 TEST(FindStateEffecterPDR, testMoreMatch)
168 {
169     auto repo = pldm_pdr_init();
170     uint8_t tid = 1;
171 
172     std::vector<uint8_t> pdr(sizeof(struct pldm_state_effecter_pdr) -
173                              sizeof(uint8_t) +
174                              sizeof(struct state_effecter_possible_states));
175 
176     auto rec = reinterpret_cast<pldm_state_effecter_pdr*>(pdr.data());
177 
178     auto state =
179         reinterpret_cast<state_effecter_possible_states*>(rec->possible_states);
180 
181     rec->hdr.type = 11;
182     rec->hdr.record_handle = 1;
183     rec->entity_type = 31;
184     rec->container_id = 0;
185     rec->composite_effecter_count = 1;
186     state->state_set_id = 129;
187     state->possible_states_size = 1;
188 
189     pldm_pdr_add(repo, pdr.data(), pdr.size(), 0, false, 1);
190 
191     std::vector<uint8_t> pdr_second(
192         sizeof(struct pldm_state_effecter_pdr) - sizeof(uint8_t) +
193         sizeof(struct state_effecter_possible_states));
194 
195     auto rec_second =
196         reinterpret_cast<pldm_state_effecter_pdr*>(pdr_second.data());
197 
198     auto state_second = reinterpret_cast<state_effecter_possible_states*>(
199         rec_second->possible_states);
200 
201     rec_second->hdr.type = 11;
202     rec_second->hdr.record_handle = 2;
203     rec_second->entity_type = 31;
204     rec_second->container_id = 0;
205     rec_second->composite_effecter_count = 1;
206     state_second->state_set_id = 129;
207     state_second->possible_states_size = 1;
208 
209     pldm_pdr_add(repo, pdr_second.data(), pdr_second.size(), 0, false, 1);
210 
211     uint16_t entityID_ = 31;
212     uint16_t stateSetId_ = 129;
213 
214     auto record = findStateEffecterPDR(tid, entityID_, stateSetId_, repo);
215 
216     EXPECT_EQ(pdr, record[0]);
217     EXPECT_EQ(pdr_second, record[1]);
218 
219     pldm_pdr_destroy(repo);
220 }
221 
222 TEST(FindStateEffecterPDR, testManyNoMatch)
223 {
224     auto repo = pldm_pdr_init();
225     uint8_t tid = 1;
226     uint16_t entityID = 33;
227     uint16_t stateSetId = 196;
228 
229     std::vector<uint8_t> pdr(sizeof(struct pldm_state_effecter_pdr) -
230                              sizeof(uint8_t) +
231                              sizeof(struct state_effecter_possible_states));
232 
233     auto rec = reinterpret_cast<pldm_state_effecter_pdr*>(pdr.data());
234 
235     auto state =
236         reinterpret_cast<state_effecter_possible_states*>(rec->possible_states);
237 
238     rec->hdr.type = 11;
239     rec->hdr.record_handle = 1;
240     rec->entity_type = 34;
241     rec->container_id = 0;
242     rec->composite_effecter_count = 1;
243     state->state_set_id = 198;
244     state->possible_states_size = 1;
245 
246     pldm_pdr_add(repo, pdr.data(), pdr.size(), 0, false, 1);
247 
248     std::vector<uint8_t> pdr_second(
249         sizeof(struct pldm_state_effecter_pdr) - sizeof(uint8_t) +
250         sizeof(struct state_effecter_possible_states));
251 
252     auto rec_second =
253         reinterpret_cast<pldm_state_effecter_pdr*>(pdr_second.data());
254 
255     auto state_second = reinterpret_cast<state_effecter_possible_states*>(
256         rec_second->possible_states);
257 
258     rec_second->hdr.type = 11;
259     rec_second->hdr.record_handle = 2;
260     rec_second->entity_type = 39;
261     rec_second->container_id = 0;
262     rec_second->composite_effecter_count = 1;
263     state_second->state_set_id = 169;
264     state_second->possible_states_size = 1;
265 
266     pldm_pdr_add(repo, pdr_second.data(), pdr_second.size(), 0, false, 1);
267 
268     auto record = findStateEffecterPDR(tid, entityID, stateSetId, repo);
269 
270     EXPECT_EQ(record.empty(), true);
271 
272     pldm_pdr_destroy(repo);
273 }
274 
275 TEST(FindStateEffecterPDR, testOneMatchOneNoMatch)
276 {
277     auto repo = pldm_pdr_init();
278     uint8_t tid = 1;
279     uint16_t entityID = 67;
280     uint16_t stateSetId = 192;
281 
282     std::vector<uint8_t> pdr(sizeof(struct pldm_state_effecter_pdr) -
283                              sizeof(uint8_t) +
284                              sizeof(struct state_effecter_possible_states));
285 
286     auto rec = reinterpret_cast<pldm_state_effecter_pdr*>(pdr.data());
287 
288     auto state =
289         reinterpret_cast<state_effecter_possible_states*>(rec->possible_states);
290 
291     rec->hdr.type = 11;
292     rec->hdr.record_handle = 1;
293     rec->entity_type = 32;
294     rec->container_id = 0;
295     rec->composite_effecter_count = 1;
296     state->state_set_id = 198;
297     state->possible_states_size = 1;
298 
299     pldm_pdr_add(repo, pdr.data(), pdr.size(), 0, false, 1);
300 
301     std::vector<uint8_t> pdr_second(
302         sizeof(struct pldm_state_effecter_pdr) - sizeof(uint8_t) +
303         sizeof(struct state_effecter_possible_states));
304 
305     auto rec_second =
306         reinterpret_cast<pldm_state_effecter_pdr*>(pdr_second.data());
307 
308     auto state_second = reinterpret_cast<state_effecter_possible_states*>(
309         rec_second->possible_states);
310 
311     rec_second->hdr.type = 11;
312     rec_second->hdr.record_handle = 2;
313     rec_second->entity_type = 67;
314     rec_second->container_id = 0;
315     rec_second->composite_effecter_count = 1;
316     state_second->state_set_id = 192;
317     state_second->possible_states_size = 1;
318 
319     pldm_pdr_add(repo, pdr_second.data(), pdr_second.size(), 0, false, 1);
320 
321     auto record = findStateEffecterPDR(tid, entityID, stateSetId, repo);
322 
323     EXPECT_EQ(pdr_second, record[0]);
324     EXPECT_EQ(record.size(), 1);
325 
326     pldm_pdr_destroy(repo);
327 }
328 
329 TEST(FindStateEffecterPDR, testOneMatchManyNoMatch)
330 {
331     auto repo = pldm_pdr_init();
332     uint8_t tid = 1;
333     uint16_t entityID = 67;
334     uint16_t stateSetId = 192;
335 
336     std::vector<uint8_t> pdr(sizeof(struct pldm_state_effecter_pdr) -
337                              sizeof(uint8_t) +
338                              sizeof(struct state_effecter_possible_states));
339 
340     auto rec = reinterpret_cast<pldm_state_effecter_pdr*>(pdr.data());
341 
342     auto state =
343         reinterpret_cast<state_effecter_possible_states*>(rec->possible_states);
344 
345     rec->hdr.type = 11;
346     rec->hdr.record_handle = 1;
347     rec->entity_type = 32;
348     rec->container_id = 0;
349     rec->composite_effecter_count = 1;
350     state->state_set_id = 198;
351     state->possible_states_size = 1;
352 
353     pldm_pdr_add(repo, pdr.data(), pdr.size(), 0, false, 1);
354 
355     std::vector<uint8_t> pdr_second(
356         sizeof(struct pldm_state_effecter_pdr) - sizeof(uint8_t) +
357         sizeof(struct state_effecter_possible_states));
358 
359     auto rec_second =
360         reinterpret_cast<pldm_state_effecter_pdr*>(pdr_second.data());
361 
362     auto state_second = reinterpret_cast<state_effecter_possible_states*>(
363         rec_second->possible_states);
364 
365     rec_second->hdr.type = 11;
366     rec_second->hdr.record_handle = 2;
367     rec_second->entity_type = 67;
368     rec_second->container_id = 0;
369     rec_second->composite_effecter_count = 1;
370     state_second->state_set_id = 192;
371     state_second->possible_states_size = 1;
372 
373     pldm_pdr_add(repo, pdr_second.data(), pdr_second.size(), 0, false, 1);
374 
375     std::vector<uint8_t> pdr_third(
376         sizeof(struct pldm_state_effecter_pdr) - sizeof(uint8_t) +
377         sizeof(struct state_effecter_possible_states));
378 
379     auto rec_third =
380         reinterpret_cast<pldm_state_effecter_pdr*>(pdr_third.data());
381 
382     auto state_third = reinterpret_cast<state_effecter_possible_states*>(
383         rec_third->possible_states);
384 
385     rec_third->hdr.type = 11;
386     rec_third->hdr.record_handle = 3;
387     rec_third->entity_type = 69;
388     rec_third->container_id = 0;
389     rec_third->composite_effecter_count = 1;
390     state_third->state_set_id = 199;
391     state_third->possible_states_size = 1;
392 
393     auto record = findStateEffecterPDR(tid, entityID, stateSetId, repo);
394 
395     EXPECT_EQ(pdr_second, record[0]);
396     EXPECT_EQ(record.size(), 1);
397 
398     pldm_pdr_destroy(repo);
399 }
400 
401 TEST(FindStateEffecterPDR, testCompositeEffecter)
402 {
403     auto repo = pldm_pdr_init();
404     uint8_t tid = 1;
405     uint16_t entityID = 67;
406     uint16_t stateSetId = 192;
407 
408     std::vector<uint8_t> pdr(sizeof(struct pldm_state_effecter_pdr) -
409                              sizeof(uint8_t) +
410                              sizeof(struct state_effecter_possible_states) * 3);
411 
412     auto rec = reinterpret_cast<pldm_state_effecter_pdr*>(pdr.data());
413     auto state_start = rec->possible_states;
414 
415     auto state = reinterpret_cast<state_effecter_possible_states*>(state_start);
416 
417     rec->hdr.type = 11;
418     rec->hdr.record_handle = 1;
419     rec->entity_type = 67;
420     rec->container_id = 0;
421     rec->composite_effecter_count = 3;
422     state->state_set_id = 198;
423     state->possible_states_size = 1;
424 
425     state_start += state->possible_states_size + sizeof(state->state_set_id) +
426                    sizeof(state->possible_states_size);
427     state = reinterpret_cast<state_effecter_possible_states*>(state_start);
428     state->state_set_id = 193;
429     state->possible_states_size = 1;
430 
431     state_start += state->possible_states_size + sizeof(state->state_set_id) +
432                    sizeof(state->possible_states_size);
433     state = reinterpret_cast<state_effecter_possible_states*>(state_start);
434     state->state_set_id = 192;
435     state->possible_states_size = 1;
436 
437     pldm_pdr_add(repo, pdr.data(), pdr.size(), 0, false, 1);
438 
439     auto record = findStateEffecterPDR(tid, entityID, stateSetId, repo);
440 
441     EXPECT_EQ(pdr, record[0]);
442 
443     pldm_pdr_destroy(repo);
444 }
445 
446 TEST(FindStateEffecterPDR, testNoMatchCompositeEffecter)
447 {
448     auto repo = pldm_pdr_init();
449     uint8_t tid = 1;
450     uint16_t entityID = 67;
451     uint16_t stateSetId = 192;
452 
453     std::vector<uint8_t> pdr(sizeof(struct pldm_state_effecter_pdr) -
454                              sizeof(uint8_t) +
455                              sizeof(struct state_effecter_possible_states) * 3);
456 
457     auto rec = reinterpret_cast<pldm_state_effecter_pdr*>(pdr.data());
458     auto state_start = rec->possible_states;
459 
460     auto state = reinterpret_cast<state_effecter_possible_states*>(state_start);
461 
462     rec->hdr.type = 11;
463     rec->hdr.record_handle = 1;
464     rec->entity_type = 34;
465     rec->container_id = 0;
466     rec->composite_effecter_count = 3;
467     state->state_set_id = 198;
468     state->possible_states_size = 1;
469 
470     state_start += state->possible_states_size + sizeof(state->state_set_id) +
471                    sizeof(state->possible_states_size);
472     state = reinterpret_cast<state_effecter_possible_states*>(state_start);
473     state->state_set_id = 193;
474     state->possible_states_size = 1;
475 
476     state_start += state->possible_states_size + sizeof(state->state_set_id) +
477                    sizeof(state->possible_states_size);
478     state = reinterpret_cast<state_effecter_possible_states*>(state_start);
479     state->state_set_id = 123;
480     state->possible_states_size = 1;
481 
482     pldm_pdr_add(repo, pdr.data(), pdr.size(), 0, false, 1);
483 
484     auto record = findStateEffecterPDR(tid, entityID, stateSetId, repo);
485 
486     EXPECT_EQ(record.empty(), true);
487 
488     pldm_pdr_destroy(repo);
489 }
490 
491 TEST(FindStateSensorPDR, testOneMatch)
492 {
493     auto repo = pldm_pdr_init();
494     uint8_t tid = 1;
495     uint16_t entityID = 5;
496     uint16_t stateSetId = 1;
497 
498     std::vector<uint8_t> pdr(sizeof(struct pldm_state_sensor_pdr) -
499                              sizeof(uint8_t) +
500                              sizeof(struct state_sensor_possible_states));
501 
502     auto rec = reinterpret_cast<pldm_state_sensor_pdr*>(pdr.data());
503 
504     auto state =
505         reinterpret_cast<state_sensor_possible_states*>(rec->possible_states);
506 
507     rec->hdr.type = 4;
508     rec->hdr.record_handle = 1;
509     rec->entity_type = 5;
510     rec->container_id = 0;
511     rec->composite_sensor_count = 1;
512     state->state_set_id = 1;
513     state->possible_states_size = 1;
514 
515     pldm_pdr_add(repo, pdr.data(), pdr.size(), 0, false, 1);
516 
517     auto record = findStateSensorPDR(tid, entityID, stateSetId, repo);
518 
519     EXPECT_EQ(pdr, record[0]);
520 
521     pldm_pdr_destroy(repo);
522 }
523 
524 TEST(FindStateSensorPDR, testNoMatch)
525 {
526     auto repo = pldm_pdr_init();
527     uint8_t tid = 1;
528     uint16_t entityID = 5;
529     uint16_t stateSetId = 1;
530 
531     std::vector<uint8_t> pdr(sizeof(struct pldm_state_sensor_pdr) -
532                              sizeof(uint8_t) +
533                              sizeof(struct state_sensor_possible_states));
534 
535     auto rec = reinterpret_cast<pldm_state_sensor_pdr*>(pdr.data());
536 
537     auto state =
538         reinterpret_cast<state_sensor_possible_states*>(rec->possible_states);
539 
540     rec->hdr.type = 4;
541     rec->hdr.record_handle = 1;
542     rec->entity_type = 55;
543     rec->container_id = 0;
544     rec->composite_sensor_count = 1;
545     state->state_set_id = 1;
546     state->possible_states_size = 1;
547 
548     pldm_pdr_add(repo, pdr.data(), pdr.size(), 0, false, 1);
549 
550     auto record = findStateSensorPDR(tid, entityID, stateSetId, repo);
551 
552     EXPECT_EQ(record.empty(), true);
553 
554     pldm_pdr_destroy(repo);
555 }
556 
557 TEST(FindStateSensorPDR, testEmptyRepo)
558 {
559     auto repo = pldm_pdr_init();
560     uint8_t tid = 1;
561     uint16_t entityID = 5;
562     uint16_t stateSetId = 1;
563 
564     std::vector<uint8_t> pdr(sizeof(struct pldm_state_sensor_pdr) -
565                              sizeof(uint8_t) +
566                              sizeof(struct state_sensor_possible_states));
567 
568     auto record = findStateSensorPDR(tid, entityID, stateSetId, repo);
569 
570     EXPECT_EQ(record.empty(), true);
571 
572     pldm_pdr_destroy(repo);
573 }
574 
575 TEST(FindStateSensorPDR, testMoreMatch)
576 {
577     auto repo = pldm_pdr_init();
578     uint8_t tid = 1;
579 
580     std::vector<uint8_t> pdr(sizeof(struct pldm_state_sensor_pdr) -
581                              sizeof(uint8_t) +
582                              sizeof(struct state_sensor_possible_states));
583 
584     auto rec = reinterpret_cast<pldm_state_sensor_pdr*>(pdr.data());
585 
586     auto state =
587         reinterpret_cast<state_sensor_possible_states*>(rec->possible_states);
588 
589     rec->hdr.type = 4;
590     rec->hdr.record_handle = 1;
591     rec->entity_type = 5;
592     rec->container_id = 0;
593     rec->composite_sensor_count = 1;
594     state->state_set_id = 1;
595     state->possible_states_size = 1;
596 
597     pldm_pdr_add(repo, pdr.data(), pdr.size(), 0, false, 1);
598 
599     std::vector<uint8_t> pdr_second(
600         sizeof(struct pldm_state_sensor_pdr) - sizeof(uint8_t) +
601         sizeof(struct state_sensor_possible_states));
602 
603     auto rec_second =
604         reinterpret_cast<pldm_state_sensor_pdr*>(pdr_second.data());
605 
606     auto state_second = reinterpret_cast<state_sensor_possible_states*>(
607         rec_second->possible_states);
608 
609     rec_second->hdr.type = 4;
610     rec_second->hdr.record_handle = 2;
611     rec_second->entity_type = 5;
612     rec_second->container_id = 0;
613     rec_second->composite_sensor_count = 1;
614     state_second->state_set_id = 1;
615     state_second->possible_states_size = 1;
616 
617     pldm_pdr_add(repo, pdr_second.data(), pdr_second.size(), 0, false, 1);
618 
619     uint16_t entityID_ = 5;
620     uint16_t stateSetId_ = 1;
621 
622     auto record = findStateSensorPDR(tid, entityID_, stateSetId_, repo);
623 
624     EXPECT_EQ(pdr, record[0]);
625     EXPECT_EQ(pdr_second, record[1]);
626 
627     pldm_pdr_destroy(repo);
628 }
629 
630 TEST(FindStateSensorPDR, testManyNoMatch)
631 {
632     auto repo = pldm_pdr_init();
633     uint8_t tid = 1;
634     uint16_t entityID = 5;
635     uint16_t stateSetId = 1;
636 
637     std::vector<uint8_t> pdr(sizeof(struct pldm_state_sensor_pdr) -
638                              sizeof(uint8_t) +
639                              sizeof(struct state_sensor_possible_states));
640 
641     auto rec = reinterpret_cast<pldm_state_sensor_pdr*>(pdr.data());
642 
643     auto state =
644         reinterpret_cast<state_sensor_possible_states*>(rec->possible_states);
645 
646     rec->hdr.type = 4;
647     rec->hdr.record_handle = 1;
648     rec->entity_type = 56;
649     rec->container_id = 0;
650     rec->composite_sensor_count = 1;
651     state->state_set_id = 2;
652     state->possible_states_size = 1;
653 
654     pldm_pdr_add(repo, pdr.data(), pdr.size(), 0, false, 1);
655 
656     std::vector<uint8_t> pdr_second(
657         sizeof(struct pldm_state_sensor_pdr) - sizeof(uint8_t) +
658         sizeof(struct state_sensor_possible_states));
659 
660     auto rec_second =
661         reinterpret_cast<pldm_state_sensor_pdr*>(pdr_second.data());
662 
663     auto state_second = reinterpret_cast<state_sensor_possible_states*>(
664         rec_second->possible_states);
665 
666     rec_second->hdr.type = 4;
667     rec_second->hdr.record_handle = 2;
668     rec_second->entity_type = 66;
669     rec_second->container_id = 0;
670     rec_second->composite_sensor_count = 1;
671     state_second->state_set_id = 3;
672     state_second->possible_states_size = 1;
673 
674     pldm_pdr_add(repo, pdr_second.data(), pdr_second.size(), 0, false, 1);
675 
676     auto record = findStateSensorPDR(tid, entityID, stateSetId, repo);
677 
678     EXPECT_EQ(record.empty(), true);
679 
680     pldm_pdr_destroy(repo);
681 }
682 
683 TEST(FindStateSensorPDR, testOneMatchOneNoMatch)
684 {
685     auto repo = pldm_pdr_init();
686     uint8_t tid = 1;
687     uint16_t entityID = 5;
688     uint16_t stateSetId = 1;
689 
690     std::vector<uint8_t> pdr(sizeof(struct pldm_state_sensor_pdr) -
691                              sizeof(uint8_t) +
692                              sizeof(struct state_sensor_possible_states));
693 
694     auto rec = reinterpret_cast<pldm_state_sensor_pdr*>(pdr.data());
695 
696     auto state =
697         reinterpret_cast<state_sensor_possible_states*>(rec->possible_states);
698 
699     rec->hdr.type = 4;
700     rec->hdr.record_handle = 1;
701     rec->entity_type = 10;
702     rec->container_id = 0;
703     rec->composite_sensor_count = 1;
704     state->state_set_id = 20;
705     state->possible_states_size = 1;
706 
707     pldm_pdr_add(repo, pdr.data(), pdr.size(), 0, false, 1);
708 
709     std::vector<uint8_t> pdr_second(
710         sizeof(struct pldm_state_sensor_pdr) - sizeof(uint8_t) +
711         sizeof(struct state_sensor_possible_states));
712 
713     auto rec_second =
714         reinterpret_cast<pldm_state_sensor_pdr*>(pdr_second.data());
715 
716     auto state_second = reinterpret_cast<state_sensor_possible_states*>(
717         rec_second->possible_states);
718 
719     rec_second->hdr.type = 4;
720     rec_second->hdr.record_handle = 2;
721     rec_second->entity_type = 5;
722     rec_second->container_id = 0;
723     rec_second->composite_sensor_count = 1;
724     state_second->state_set_id = 1;
725     state_second->possible_states_size = 1;
726 
727     pldm_pdr_add(repo, pdr_second.data(), pdr_second.size(), 0, false, 1);
728 
729     auto record = findStateSensorPDR(tid, entityID, stateSetId, repo);
730 
731     EXPECT_EQ(pdr_second, record[0]);
732     EXPECT_EQ(record.size(), 1);
733 
734     pldm_pdr_destroy(repo);
735 }
736 
737 TEST(FindStateSensorPDR, testOneMatchManyNoMatch)
738 {
739     auto repo = pldm_pdr_init();
740     uint8_t tid = 1;
741     uint16_t entityID = 5;
742     uint16_t stateSetId = 1;
743 
744     std::vector<uint8_t> pdr(sizeof(struct pldm_state_sensor_pdr) -
745                              sizeof(uint8_t) +
746                              sizeof(struct state_sensor_possible_states));
747 
748     auto rec = reinterpret_cast<pldm_state_sensor_pdr*>(pdr.data());
749 
750     auto state =
751         reinterpret_cast<state_sensor_possible_states*>(rec->possible_states);
752 
753     rec->hdr.type = 4;
754     rec->hdr.record_handle = 1;
755     rec->entity_type = 6;
756     rec->container_id = 0;
757     rec->composite_sensor_count = 1;
758     state->state_set_id = 9;
759     state->possible_states_size = 1;
760 
761     pldm_pdr_add(repo, pdr.data(), pdr.size(), 0, false, 1);
762 
763     std::vector<uint8_t> pdr_second(
764         sizeof(struct pldm_state_sensor_pdr) - sizeof(uint8_t) +
765         sizeof(struct state_sensor_possible_states));
766 
767     auto rec_second =
768         reinterpret_cast<pldm_state_sensor_pdr*>(pdr_second.data());
769 
770     auto state_second = reinterpret_cast<state_sensor_possible_states*>(
771         rec_second->possible_states);
772 
773     rec_second->hdr.type = 4;
774     rec_second->hdr.record_handle = 2;
775     rec_second->entity_type = 5;
776     rec_second->container_id = 0;
777     rec_second->composite_sensor_count = 1;
778     state_second->state_set_id = 1;
779     state_second->possible_states_size = 1;
780 
781     pldm_pdr_add(repo, pdr_second.data(), pdr_second.size(), 0, false, 1);
782 
783     std::vector<uint8_t> pdr_third(sizeof(struct pldm_state_sensor_pdr) -
784                                    sizeof(uint8_t) +
785                                    sizeof(struct state_sensor_possible_states));
786 
787     auto rec_third = reinterpret_cast<pldm_state_sensor_pdr*>(pdr_third.data());
788 
789     auto state_third = reinterpret_cast<state_sensor_possible_states*>(
790         rec_third->possible_states);
791 
792     rec_third->hdr.type = 4;
793     rec_third->hdr.record_handle = 3;
794     rec_third->entity_type = 7;
795     rec_third->container_id = 0;
796     rec_third->composite_sensor_count = 1;
797     state_third->state_set_id = 12;
798     state_third->possible_states_size = 1;
799 
800     auto record = findStateSensorPDR(tid, entityID, stateSetId, repo);
801 
802     EXPECT_EQ(pdr_second, record[0]);
803     EXPECT_EQ(record.size(), 1);
804 
805     pldm_pdr_destroy(repo);
806 }
807 
808 TEST(FindStateSensorPDR, testCompositeSensor)
809 {
810     auto repo = pldm_pdr_init();
811     uint8_t tid = 1;
812     uint16_t entityID = 5;
813     uint16_t stateSetId = 1;
814 
815     std::vector<uint8_t> pdr(sizeof(struct pldm_state_sensor_pdr) -
816                              sizeof(uint8_t) +
817                              sizeof(struct state_sensor_possible_states) * 3);
818 
819     auto rec = reinterpret_cast<pldm_state_sensor_pdr*>(pdr.data());
820     auto state_start = rec->possible_states;
821 
822     auto state = reinterpret_cast<state_sensor_possible_states*>(state_start);
823 
824     rec->hdr.type = 4;
825     rec->hdr.record_handle = 1;
826     rec->entity_type = 5;
827     rec->container_id = 0;
828     rec->composite_sensor_count = 3;
829     state->state_set_id = 2;
830     state->possible_states_size = 1;
831 
832     state_start += state->possible_states_size + sizeof(state->state_set_id) +
833                    sizeof(state->possible_states_size);
834     state = reinterpret_cast<state_sensor_possible_states*>(state_start);
835 
836     state->state_set_id = 7;
837     state->possible_states_size = 1;
838 
839     state_start += state->possible_states_size + sizeof(state->state_set_id) +
840                    sizeof(state->possible_states_size);
841     state = reinterpret_cast<state_sensor_possible_states*>(state_start);
842 
843     state->state_set_id = 1;
844     state->possible_states_size = 1;
845 
846     pldm_pdr_add(repo, pdr.data(), pdr.size(), 0, false, 1);
847 
848     auto record = findStateSensorPDR(tid, entityID, stateSetId, repo);
849 
850     EXPECT_EQ(pdr, record[0]);
851 
852     pldm_pdr_destroy(repo);
853 }
854 
855 TEST(FindStateSensorPDR, testNoMatchCompositeSensor)
856 {
857     auto repo = pldm_pdr_init();
858     uint8_t tid = 1;
859     uint16_t entityID = 5;
860     uint16_t stateSetId = 1;
861 
862     std::vector<uint8_t> pdr(sizeof(struct pldm_state_sensor_pdr) -
863                              sizeof(uint8_t) +
864                              sizeof(struct state_sensor_possible_states) * 3);
865 
866     auto rec = reinterpret_cast<pldm_state_sensor_pdr*>(pdr.data());
867     auto state_start = rec->possible_states;
868 
869     auto state = reinterpret_cast<state_sensor_possible_states*>(state_start);
870 
871     rec->hdr.type = 4;
872     rec->hdr.record_handle = 1;
873     rec->entity_type = 21;
874     rec->container_id = 0;
875     rec->composite_sensor_count = 3;
876     state->state_set_id = 15;
877     state->possible_states_size = 1;
878 
879     state_start += state->possible_states_size + sizeof(state->state_set_id) +
880                    sizeof(state->possible_states_size);
881     state = reinterpret_cast<state_sensor_possible_states*>(state_start);
882     state->state_set_id = 19;
883     state->possible_states_size = 1;
884 
885     state_start += state->possible_states_size + sizeof(state->state_set_id) +
886                    sizeof(state->possible_states_size);
887     state = reinterpret_cast<state_sensor_possible_states*>(state_start);
888     state->state_set_id = 39;
889     state->possible_states_size = 1;
890 
891     pldm_pdr_add(repo, pdr.data(), pdr.size(), 0, false, 1);
892 
893     auto record = findStateSensorPDR(tid, entityID, stateSetId, repo);
894 
895     EXPECT_EQ(record.empty(), true);
896 
897     pldm_pdr_destroy(repo);
898 }
899 
900 TEST(toString, allTestCases)
901 {
902     variable_field buffer{};
903     constexpr std::string_view str1{};
904     auto returnStr1 = toString(buffer);
905     EXPECT_EQ(returnStr1, str1);
906 
907     constexpr std::string_view str2{"0penBmc"};
908     constexpr std::array<uint8_t, 7> bufferArr1{0x30, 0x70, 0x65, 0x6e,
909                                                 0x42, 0x6d, 0x63};
910     buffer.ptr = bufferArr1.data();
911     buffer.length = bufferArr1.size();
912     auto returnStr2 = toString(buffer);
913     EXPECT_EQ(returnStr2, str2);
914 
915     constexpr std::string_view str3{"0pen mc"};
916     // \xa0 - the non-breaking space in ISO-8859-1
917     constexpr std::array<uint8_t, 7> bufferArr2{0x30, 0x70, 0x65, 0x6e,
918                                                 0xa0, 0x6d, 0x63};
919     buffer.ptr = bufferArr2.data();
920     buffer.length = bufferArr2.size();
921     auto returnStr3 = toString(buffer);
922     EXPECT_EQ(returnStr3, str3);
923 }
924 
925 TEST(Split, allTestCases)
926 {
927     std::string s1 = "aa,bb,cc,dd";
928     auto results1 = split(s1, ",");
929     EXPECT_EQ(results1[0], "aa");
930     EXPECT_EQ(results1[1], "bb");
931     EXPECT_EQ(results1[2], "cc");
932     EXPECT_EQ(results1[3], "dd");
933 
934     std::string s2 = "aa||bb||cc||dd";
935     auto results2 = split(s2, "||");
936     EXPECT_EQ(results2[0], "aa");
937     EXPECT_EQ(results2[1], "bb");
938     EXPECT_EQ(results2[2], "cc");
939     EXPECT_EQ(results2[3], "dd");
940 
941     std::string s3 = " aa || bb||cc|| dd";
942     auto results3 = split(s3, "||", " ");
943     EXPECT_EQ(results3[0], "aa");
944     EXPECT_EQ(results3[1], "bb");
945     EXPECT_EQ(results3[2], "cc");
946     EXPECT_EQ(results3[3], "dd");
947 
948     std::string s4 = "aa\\\\bb\\cc\\dd";
949     auto results4 = split(s4, "\\");
950     EXPECT_EQ(results4[0], "aa");
951     EXPECT_EQ(results4[1], "bb");
952     EXPECT_EQ(results4[2], "cc");
953     EXPECT_EQ(results4[3], "dd");
954 
955     std::string s5 = "aa\\";
956     auto results5 = split(s5, "\\");
957     EXPECT_EQ(results5[0], "aa");
958 }
959