xref: /openbmc/libpldm/tests/dsp/pdr.cpp (revision 274732fc)
1 #include <endian.h>
2 #include <libpldm/pdr.h>
3 #include <libpldm/platform.h>
4 
5 #include <array>
6 #include <cstdint>
7 #include <cstdlib>
8 #include <cstring>
9 #include <vector>
10 
11 #include <gtest/gtest.h>
12 
TEST(PDRAccess,testInit)13 TEST(PDRAccess, testInit)
14 {
15     auto repo = pldm_pdr_init();
16     EXPECT_EQ(pldm_pdr_get_record_count(repo), 0u);
17     EXPECT_EQ(pldm_pdr_get_repo_size(repo), 0u);
18     pldm_pdr_destroy(repo);
19 }
20 
TEST(PDRUpdate,testAdd)21 TEST(PDRUpdate, testAdd)
22 {
23     auto repo = pldm_pdr_init();
24 
25     std::array<uint8_t, 10> data{};
26     uint32_t handle = 0;
27     EXPECT_EQ(
28         pldm_pdr_add_check(repo, data.data(), data.size(), false, 1, &handle),
29         0);
30     EXPECT_EQ(handle, 1u);
31     EXPECT_EQ(pldm_pdr_get_record_count(repo), 1u);
32     EXPECT_EQ(pldm_pdr_get_repo_size(repo), data.size());
33 
34     handle = 0;
35     EXPECT_EQ(
36         pldm_pdr_add_check(repo, data.data(), data.size(), false, 1, &handle),
37         0);
38     EXPECT_EQ(handle, 2u);
39 
40     handle = 0;
41     EXPECT_EQ(
42         pldm_pdr_add_check(repo, data.data(), data.size(), false, 1, &handle),
43         0);
44     EXPECT_EQ(handle, 3u);
45 
46     handle = 0xdeeddeedu;
47     EXPECT_EQ(
48         pldm_pdr_add_check(repo, data.data(), data.size(), false, 1, &handle),
49         0);
50     EXPECT_EQ(handle, 0xdeeddeed);
51     EXPECT_EQ(pldm_pdr_get_record_count(repo), 4u);
52     EXPECT_EQ(pldm_pdr_get_repo_size(repo), data.size() * 4u);
53 
54     pldm_pdr_destroy(repo);
55 }
56 
TEST(PDRRemoveByTerminus,testRemoveByTerminus)57 TEST(PDRRemoveByTerminus, testRemoveByTerminus)
58 {
59     std::array<uint8_t, 10> data{};
60 
61     auto repo = pldm_pdr_init();
62 
63     EXPECT_EQ(
64         pldm_pdr_add_check(repo, data.data(), data.size(), false, 1, NULL), 0);
65     pldm_pdr_remove_pdrs_by_terminus_handle(repo, 1);
66     EXPECT_EQ(pldm_pdr_get_record_count(repo), 0u);
67     pldm_pdr_destroy(repo);
68 
69     repo = pldm_pdr_init();
70     EXPECT_EQ(pldm_pdr_add_check(repo, data.data(), data.size(), true, 2, NULL),
71               0);
72     EXPECT_EQ(pldm_pdr_add_check(repo, data.data(), data.size(), true, 1, NULL),
73               0);
74     EXPECT_EQ(pldm_pdr_get_record_count(repo), 2u);
75     pldm_pdr_remove_pdrs_by_terminus_handle(repo, 1);
76     EXPECT_EQ(pldm_pdr_get_record_count(repo), 1u);
77     pldm_pdr_destroy(repo);
78 
79     repo = pldm_pdr_init();
80     EXPECT_EQ(pldm_pdr_add_check(repo, data.data(), data.size(), true, 1, NULL),
81               0);
82     EXPECT_EQ(pldm_pdr_add_check(repo, data.data(), data.size(), true, 2, NULL),
83               0);
84     EXPECT_EQ(pldm_pdr_add_check(repo, data.data(), data.size(), true, 2, NULL),
85               0);
86     EXPECT_EQ(pldm_pdr_get_record_count(repo), 3u);
87     pldm_pdr_remove_pdrs_by_terminus_handle(repo, 2);
88     EXPECT_EQ(pldm_pdr_get_record_count(repo), 1u);
89     pldm_pdr_destroy(repo);
90 
91     repo = pldm_pdr_init();
92     EXPECT_EQ(pldm_pdr_add_check(repo, data.data(), data.size(), true, 1, NULL),
93               0);
94     EXPECT_EQ(
95         pldm_pdr_add_check(repo, data.data(), data.size(), false, 2, NULL), 0);
96     EXPECT_EQ(pldm_pdr_add_check(repo, data.data(), data.size(), true, 1, NULL),
97               0);
98     EXPECT_EQ(pldm_pdr_get_record_count(repo), 3u);
99     pldm_pdr_remove_remote_pdrs(repo);
100     EXPECT_EQ(pldm_pdr_get_record_count(repo), 1u);
101     pldm_pdr_remove_pdrs_by_terminus_handle(repo, 1);
102     EXPECT_EQ(pldm_pdr_get_record_count(repo), 1u);
103     pldm_pdr_remove_pdrs_by_terminus_handle(repo, 2);
104     EXPECT_EQ(pldm_pdr_get_record_count(repo), 0u);
105     pldm_pdr_destroy(repo);
106 }
107 
TEST(PDRUpdate,testRemove)108 TEST(PDRUpdate, testRemove)
109 {
110     std::array<uint8_t, 10> data{};
111 
112     auto repo = pldm_pdr_init();
113     pldm_pdr_remove_remote_pdrs(repo);
114     EXPECT_EQ(pldm_pdr_get_record_count(repo), 0u);
115     pldm_pdr_destroy(repo);
116 
117     repo = pldm_pdr_init();
118     EXPECT_EQ(pldm_pdr_add_check(repo, data.data(), data.size(), true, 1, NULL),
119               0);
120     pldm_pdr_remove_remote_pdrs(repo);
121     EXPECT_EQ(pldm_pdr_get_record_count(repo), 0u);
122     pldm_pdr_destroy(repo);
123 
124     repo = pldm_pdr_init();
125     EXPECT_EQ(
126         pldm_pdr_add_check(repo, data.data(), data.size(), false, 1, NULL), 0);
127     pldm_pdr_remove_remote_pdrs(repo);
128     EXPECT_EQ(pldm_pdr_get_record_count(repo), 1u);
129     pldm_pdr_destroy(repo);
130 
131     repo = pldm_pdr_init();
132     EXPECT_EQ(
133         pldm_pdr_add_check(repo, data.data(), data.size(), false, 1, NULL), 0);
134     EXPECT_EQ(pldm_pdr_add_check(repo, data.data(), data.size(), true, 1, NULL),
135               0);
136     pldm_pdr_remove_remote_pdrs(repo);
137     EXPECT_EQ(pldm_pdr_get_record_count(repo), 1u);
138     pldm_pdr_destroy(repo);
139 
140     repo = pldm_pdr_init();
141     EXPECT_EQ(pldm_pdr_add_check(repo, data.data(), data.size(), true, 1, NULL),
142               0);
143     EXPECT_EQ(
144         pldm_pdr_add_check(repo, data.data(), data.size(), false, 1, NULL), 0);
145     pldm_pdr_remove_remote_pdrs(repo);
146     EXPECT_EQ(pldm_pdr_get_record_count(repo), 1u);
147     pldm_pdr_destroy(repo);
148 
149     repo = pldm_pdr_init();
150     EXPECT_EQ(pldm_pdr_add_check(repo, data.data(), data.size(), true, 1, NULL),
151               0);
152     EXPECT_EQ(pldm_pdr_add_check(repo, data.data(), data.size(), true, 1, NULL),
153               0);
154     EXPECT_EQ(pldm_pdr_add_check(repo, data.data(), data.size(), true, 1, NULL),
155               0);
156     EXPECT_EQ(pldm_pdr_add_check(repo, data.data(), data.size(), true, 1, NULL),
157               0);
158     pldm_pdr_remove_remote_pdrs(repo);
159     EXPECT_EQ(pldm_pdr_get_record_count(repo), 0u);
160     EXPECT_EQ(pldm_pdr_add_check(repo, data.data(), data.size(), true, 1, NULL),
161               0);
162     EXPECT_EQ(
163         pldm_pdr_add_check(repo, data.data(), data.size(), false, 1, NULL), 0);
164     EXPECT_EQ(pldm_pdr_get_record_count(repo), 2u);
165     pldm_pdr_destroy(repo);
166 
167     repo = pldm_pdr_init();
168     EXPECT_EQ(
169         pldm_pdr_add_check(repo, data.data(), data.size(), false, 1, NULL), 0);
170     EXPECT_EQ(
171         pldm_pdr_add_check(repo, data.data(), data.size(), false, 1, NULL), 0);
172     EXPECT_EQ(
173         pldm_pdr_add_check(repo, data.data(), data.size(), false, 1, NULL), 0);
174     EXPECT_EQ(
175         pldm_pdr_add_check(repo, data.data(), data.size(), false, 1, NULL), 0);
176     pldm_pdr_remove_remote_pdrs(repo);
177     EXPECT_EQ(pldm_pdr_get_record_count(repo), 4u);
178     EXPECT_EQ(pldm_pdr_add_check(repo, data.data(), data.size(), true, 1, NULL),
179               0);
180     EXPECT_EQ(
181         pldm_pdr_add_check(repo, data.data(), data.size(), false, 1, NULL), 0);
182     EXPECT_EQ(pldm_pdr_get_record_count(repo), 6u);
183     pldm_pdr_destroy(repo);
184 
185     repo = pldm_pdr_init();
186     EXPECT_EQ(pldm_pdr_add_check(repo, data.data(), data.size(), true, 1, NULL),
187               0);
188     EXPECT_EQ(
189         pldm_pdr_add_check(repo, data.data(), data.size(), false, 1, NULL), 0);
190     EXPECT_EQ(
191         pldm_pdr_add_check(repo, data.data(), data.size(), false, 1, NULL), 0);
192     EXPECT_EQ(
193         pldm_pdr_add_check(repo, data.data(), data.size(), false, 1, NULL), 0);
194     pldm_pdr_remove_remote_pdrs(repo);
195     EXPECT_EQ(pldm_pdr_get_record_count(repo), 3u);
196     EXPECT_EQ(pldm_pdr_add_check(repo, data.data(), data.size(), true, 1, NULL),
197               0);
198     EXPECT_EQ(
199         pldm_pdr_add_check(repo, data.data(), data.size(), false, 1, NULL), 0);
200     EXPECT_EQ(pldm_pdr_get_record_count(repo), 5u);
201     pldm_pdr_destroy(repo);
202 
203     repo = pldm_pdr_init();
204     EXPECT_EQ(
205         pldm_pdr_add_check(repo, data.data(), data.size(), false, 1, NULL), 0);
206     EXPECT_EQ(
207         pldm_pdr_add_check(repo, data.data(), data.size(), false, 1, NULL), 0);
208     EXPECT_EQ(
209         pldm_pdr_add_check(repo, data.data(), data.size(), false, 1, NULL), 0);
210     EXPECT_EQ(pldm_pdr_add_check(repo, data.data(), data.size(), true, 1, NULL),
211               0);
212     pldm_pdr_remove_remote_pdrs(repo);
213     EXPECT_EQ(pldm_pdr_get_record_count(repo), 3u);
214     EXPECT_EQ(pldm_pdr_add_check(repo, data.data(), data.size(), true, 1, NULL),
215               0);
216     EXPECT_EQ(
217         pldm_pdr_add_check(repo, data.data(), data.size(), false, 1, NULL), 0);
218     EXPECT_EQ(pldm_pdr_get_record_count(repo), 5u);
219     pldm_pdr_destroy(repo);
220 
221     repo = pldm_pdr_init();
222     EXPECT_EQ(pldm_pdr_add_check(repo, data.data(), data.size(), true, 1, NULL),
223               0);
224     EXPECT_EQ(
225         pldm_pdr_add_check(repo, data.data(), data.size(), false, 1, NULL), 0);
226     EXPECT_EQ(pldm_pdr_add_check(repo, data.data(), data.size(), true, 1, NULL),
227               0);
228     EXPECT_EQ(
229         pldm_pdr_add_check(repo, data.data(), data.size(), false, 1, NULL), 0);
230     pldm_pdr_remove_remote_pdrs(repo);
231     EXPECT_EQ(pldm_pdr_get_record_count(repo), 2u);
232     EXPECT_EQ(
233         pldm_pdr_add_check(repo, data.data(), data.size(), false, 1, NULL), 0);
234     EXPECT_EQ(pldm_pdr_add_check(repo, data.data(), data.size(), true, 1, NULL),
235               0);
236     EXPECT_EQ(pldm_pdr_get_record_count(repo), 4u);
237     pldm_pdr_destroy(repo);
238 
239     repo = pldm_pdr_init();
240     EXPECT_EQ(
241         pldm_pdr_add_check(repo, data.data(), data.size(), false, 1, NULL), 0);
242     EXPECT_EQ(
243         pldm_pdr_add_check(repo, data.data(), data.size(), false, 1, NULL), 0);
244     EXPECT_EQ(
245         pldm_pdr_add_check(repo, data.data(), data.size(), false, 1, NULL), 0);
246     EXPECT_EQ(pldm_pdr_add_check(repo, data.data(), data.size(), true, 1, NULL),
247               0);
248     pldm_pdr_remove_remote_pdrs(repo);
249     EXPECT_EQ(pldm_pdr_get_record_count(repo), 3u);
250     EXPECT_EQ(
251         pldm_pdr_add_check(repo, data.data(), data.size(), false, 1, NULL), 0);
252     EXPECT_EQ(pldm_pdr_add_check(repo, data.data(), data.size(), true, 1, NULL),
253               0);
254     EXPECT_EQ(pldm_pdr_get_record_count(repo), 5u);
255     pldm_pdr_destroy(repo);
256 
257     repo = pldm_pdr_init();
258     EXPECT_EQ(
259         pldm_pdr_add_check(repo, data.data(), data.size(), false, 1, NULL), 0);
260     EXPECT_EQ(pldm_pdr_add_check(repo, data.data(), data.size(), true, 1, NULL),
261               0);
262     EXPECT_EQ(
263         pldm_pdr_add_check(repo, data.data(), data.size(), false, 1, NULL), 0);
264     EXPECT_EQ(pldm_pdr_add_check(repo, data.data(), data.size(), true, 1, NULL),
265               0);
266     pldm_pdr_remove_remote_pdrs(repo);
267     EXPECT_EQ(pldm_pdr_get_record_count(repo), 2u);
268     EXPECT_EQ(
269         pldm_pdr_add_check(repo, data.data(), data.size(), false, 1, NULL), 0);
270     EXPECT_EQ(pldm_pdr_add_check(repo, data.data(), data.size(), true, 1, NULL),
271               0);
272     EXPECT_EQ(pldm_pdr_get_record_count(repo), 4u);
273     pldm_pdr_destroy(repo);
274 
275     repo = pldm_pdr_init();
276     EXPECT_EQ(pldm_pdr_add_check(repo, data.data(), data.size(), true, 1, NULL),
277               0);
278     EXPECT_EQ(pldm_pdr_add_check(repo, data.data(), data.size(), true, 1, NULL),
279               0);
280     EXPECT_EQ(pldm_pdr_add_check(repo, data.data(), data.size(), true, 1, NULL),
281               0);
282     EXPECT_EQ(
283         pldm_pdr_add_check(repo, data.data(), data.size(), false, 1, NULL), 0);
284     pldm_pdr_remove_remote_pdrs(repo);
285     EXPECT_EQ(pldm_pdr_get_record_count(repo), 1u);
286     EXPECT_EQ(
287         pldm_pdr_add_check(repo, data.data(), data.size(), false, 1, NULL), 0);
288     EXPECT_EQ(pldm_pdr_add_check(repo, data.data(), data.size(), true, 1, NULL),
289               0);
290     EXPECT_EQ(pldm_pdr_get_record_count(repo), 3u);
291     pldm_pdr_destroy(repo);
292 
293     repo = pldm_pdr_init();
294     EXPECT_EQ(
295         pldm_pdr_add_check(repo, data.data(), data.size(), false, 1, NULL), 0);
296     EXPECT_EQ(pldm_pdr_add_check(repo, data.data(), data.size(), true, 1, NULL),
297               0);
298     EXPECT_EQ(pldm_pdr_add_check(repo, data.data(), data.size(), true, 1, NULL),
299               0);
300     EXPECT_EQ(pldm_pdr_add_check(repo, data.data(), data.size(), true, 1, NULL),
301               0);
302     pldm_pdr_remove_remote_pdrs(repo);
303     EXPECT_EQ(pldm_pdr_get_record_count(repo), 1u);
304     EXPECT_EQ(
305         pldm_pdr_add_check(repo, data.data(), data.size(), false, 1, NULL), 0);
306     EXPECT_EQ(pldm_pdr_add_check(repo, data.data(), data.size(), true, 1, NULL),
307               0);
308     EXPECT_EQ(pldm_pdr_get_record_count(repo), 3u);
309     pldm_pdr_destroy(repo);
310 
311     repo = pldm_pdr_init();
312     EXPECT_EQ(
313         pldm_pdr_add_check(repo, data.data(), data.size(), false, 1, NULL), 0);
314     EXPECT_EQ(pldm_pdr_add_check(repo, data.data(), data.size(), true, 1, NULL),
315               0);
316     EXPECT_EQ(pldm_pdr_add_check(repo, data.data(), data.size(), true, 1, NULL),
317               0);
318     EXPECT_EQ(
319         pldm_pdr_add_check(repo, data.data(), data.size(), false, 1, NULL), 0);
320     pldm_pdr_remove_remote_pdrs(repo);
321     EXPECT_EQ(pldm_pdr_get_record_count(repo), 2u);
322     EXPECT_EQ(
323         pldm_pdr_add_check(repo, data.data(), data.size(), false, 1, NULL), 0);
324     EXPECT_EQ(pldm_pdr_add_check(repo, data.data(), data.size(), true, 1, NULL),
325               0);
326     EXPECT_EQ(pldm_pdr_get_record_count(repo), 4u);
327     pldm_pdr_destroy(repo);
328 
329     repo = pldm_pdr_init();
330     EXPECT_EQ(pldm_pdr_add_check(repo, data.data(), data.size(), true, 1, NULL),
331               0);
332     EXPECT_EQ(
333         pldm_pdr_add_check(repo, data.data(), data.size(), false, 1, NULL), 0);
334     EXPECT_EQ(
335         pldm_pdr_add_check(repo, data.data(), data.size(), false, 1, NULL), 0);
336     EXPECT_EQ(pldm_pdr_add_check(repo, data.data(), data.size(), true, 1, NULL),
337               0);
338     pldm_pdr_remove_remote_pdrs(repo);
339     EXPECT_EQ(pldm_pdr_get_record_count(repo), 2u);
340     uint32_t handle = 0;
341     EXPECT_EQ(
342         pldm_pdr_add_check(repo, data.data(), data.size(), false, 1, &handle),
343         0);
344     EXPECT_EQ(handle, 3u);
345     handle = 0;
346     EXPECT_EQ(
347         pldm_pdr_add_check(repo, data.data(), data.size(), true, 1, &handle),
348         0);
349     EXPECT_EQ(handle, 4u);
350     EXPECT_EQ(pldm_pdr_get_record_count(repo), 4u);
351     pldm_pdr_destroy(repo);
352 }
353 
TEST(PDRAccess,testGet)354 TEST(PDRAccess, testGet)
355 {
356     auto repo = pldm_pdr_init();
357 
358     std::array<uint32_t, 10> in{100, 345, 3, 6, 89, 0, 11, 45, 23434, 123123};
359     uint32_t handle = 1;
360     EXPECT_EQ(pldm_pdr_add_check(repo, reinterpret_cast<uint8_t*>(in.data()),
361                                  sizeof(in), false, 1, &handle),
362               0);
363     EXPECT_EQ(pldm_pdr_get_record_count(repo), 1u);
364     EXPECT_EQ(pldm_pdr_get_repo_size(repo), sizeof(in));
365     uint32_t size{};
366     uint32_t nextRecHdl{};
367     uint8_t* outData = nullptr;
368     auto hdl = pldm_pdr_find_record(repo, 0, &outData, &size, &nextRecHdl);
369     EXPECT_NE(hdl, nullptr);
370     EXPECT_EQ(size, sizeof(in));
371     EXPECT_EQ(nextRecHdl, 0u);
372     EXPECT_EQ(memcmp(outData, in.data(), sizeof(in)), 0);
373     outData = nullptr;
374 
375     auto hdl2 = pldm_pdr_find_record(repo, 1, &outData, &size, &nextRecHdl);
376     EXPECT_EQ(hdl, hdl2);
377     EXPECT_NE(hdl, nullptr);
378     EXPECT_EQ(size, sizeof(in));
379     EXPECT_EQ(nextRecHdl, 0u);
380     EXPECT_EQ(memcmp(outData, in.data(), sizeof(in)), 0);
381     outData = nullptr;
382 
383     hdl = pldm_pdr_find_record(repo, htole32(0xdeaddead), &outData, &size,
384                                &nextRecHdl);
385     EXPECT_EQ(hdl, nullptr);
386     EXPECT_EQ(size, 0u);
387     EXPECT_EQ(nextRecHdl, 0u);
388     EXPECT_EQ(outData, nullptr);
389     outData = nullptr;
390 
391     std::array<uint32_t, 10> in2{1000, 3450, 30,  60,     890,
392                                  0,    110,  450, 234034, 123123};
393     handle = 2;
394     EXPECT_EQ(pldm_pdr_add_check(repo, reinterpret_cast<uint8_t*>(in2.data()),
395                                  sizeof(in2), false, 1, &handle),
396               0);
397     handle = 3;
398     EXPECT_EQ(pldm_pdr_add_check(repo, reinterpret_cast<uint8_t*>(in2.data()),
399                                  sizeof(in2), false, 1, &handle),
400               0);
401     handle = 4;
402     EXPECT_EQ(pldm_pdr_add_check(repo, reinterpret_cast<uint8_t*>(in2.data()),
403                                  sizeof(in2), true, 1, &handle),
404               0);
405     EXPECT_EQ(pldm_pdr_get_record_count(repo), 4u);
406     EXPECT_EQ(pldm_pdr_get_repo_size(repo), sizeof(in2) * 4);
407     hdl = pldm_pdr_find_record(repo, 0, &outData, &size, &nextRecHdl);
408     EXPECT_NE(hdl, nullptr);
409     EXPECT_EQ(size, sizeof(in));
410     EXPECT_EQ(nextRecHdl, 2u);
411     EXPECT_EQ(memcmp(outData, in.data(), sizeof(in)), 0);
412     outData = nullptr;
413     hdl2 = pldm_pdr_find_record(repo, 1, &outData, &size, &nextRecHdl);
414     EXPECT_EQ(hdl, hdl2);
415     EXPECT_NE(hdl, nullptr);
416     EXPECT_EQ(size, sizeof(in));
417     EXPECT_EQ(nextRecHdl, 2u);
418     EXPECT_EQ(memcmp(outData, in.data(), sizeof(in)), 0);
419     outData = nullptr;
420     hdl = pldm_pdr_find_record(repo, 2, &outData, &size, &nextRecHdl);
421     EXPECT_NE(hdl, nullptr);
422     EXPECT_EQ(size, sizeof(in2));
423     EXPECT_EQ(nextRecHdl, 3u);
424     EXPECT_EQ(memcmp(outData, in2.data(), sizeof(in2)), 0);
425     outData = nullptr;
426     hdl = pldm_pdr_find_record(repo, 3, &outData, &size, &nextRecHdl);
427     EXPECT_NE(hdl, nullptr);
428     EXPECT_EQ(pldm_pdr_record_is_remote(hdl), false);
429     EXPECT_EQ(size, sizeof(in2));
430     EXPECT_EQ(nextRecHdl, 4u);
431     EXPECT_EQ(memcmp(outData, in2.data(), sizeof(in2)), 0);
432     outData = nullptr;
433     hdl = pldm_pdr_find_record(repo, 4, &outData, &size, &nextRecHdl);
434     EXPECT_NE(hdl, nullptr);
435     EXPECT_EQ(pldm_pdr_record_is_remote(hdl), true);
436     EXPECT_EQ(size, sizeof(in2));
437     EXPECT_EQ(nextRecHdl, 0u);
438     EXPECT_EQ(memcmp(outData, in2.data(), sizeof(in2)), 0);
439     outData = nullptr;
440 
441     pldm_pdr_destroy(repo);
442 }
443 
TEST(PDRAccess,testGetNext)444 TEST(PDRAccess, testGetNext)
445 {
446     auto repo = pldm_pdr_init();
447 
448     std::array<uint32_t, 10> in{100, 345, 3, 6, 89, 0, 11, 45, 23434, 123123};
449     uint32_t handle = 1;
450     EXPECT_EQ(pldm_pdr_add_check(repo, reinterpret_cast<uint8_t*>(in.data()),
451                                  sizeof(in), false, 1, &handle),
452               0);
453     EXPECT_EQ(pldm_pdr_get_record_count(repo), 1u);
454     EXPECT_EQ(pldm_pdr_get_repo_size(repo), sizeof(in));
455     uint32_t size{};
456     uint32_t nextRecHdl{};
457     uint8_t* outData = nullptr;
458     auto hdl = pldm_pdr_find_record(repo, 0, &outData, &size, &nextRecHdl);
459     EXPECT_NE(hdl, nullptr);
460     EXPECT_EQ(size, sizeof(in));
461     EXPECT_EQ(nextRecHdl, 0u);
462     EXPECT_EQ(memcmp(outData, in.data(), sizeof(in)), 0);
463     outData = nullptr;
464 
465     std::array<uint32_t, 10> in2{1000, 3450, 30,  60,     890,
466                                  0,    110,  450, 234034, 123123};
467     handle = 2;
468     EXPECT_EQ(pldm_pdr_add_check(repo, reinterpret_cast<uint8_t*>(in2.data()),
469                                  sizeof(in2), false, 1, &handle),
470               0);
471     handle = 3;
472     EXPECT_EQ(pldm_pdr_add_check(repo, reinterpret_cast<uint8_t*>(in2.data()),
473                                  sizeof(in2), false, 1, &handle),
474               0);
475     handle = 4;
476     EXPECT_EQ(pldm_pdr_add_check(repo, reinterpret_cast<uint8_t*>(in2.data()),
477                                  sizeof(in2), false, 1, &handle),
478               0);
479     EXPECT_EQ(pldm_pdr_get_record_count(repo), 4u);
480     EXPECT_EQ(pldm_pdr_get_repo_size(repo), sizeof(in2) * 4);
481     hdl = pldm_pdr_get_next_record(repo, hdl, &outData, &size, &nextRecHdl);
482     EXPECT_NE(hdl, nullptr);
483     EXPECT_EQ(size, sizeof(in2));
484     EXPECT_EQ(nextRecHdl, 3u);
485     EXPECT_EQ(memcmp(outData, in2.data(), sizeof(in2)), 0);
486     outData = nullptr;
487     hdl = pldm_pdr_get_next_record(repo, hdl, &outData, &size, &nextRecHdl);
488     EXPECT_NE(hdl, nullptr);
489     EXPECT_EQ(size, sizeof(in2));
490     EXPECT_EQ(nextRecHdl, 4u);
491     EXPECT_EQ(memcmp(outData, in2.data(), sizeof(in2)), 0);
492     outData = nullptr;
493     hdl = pldm_pdr_get_next_record(repo, hdl, &outData, &size, &nextRecHdl);
494     EXPECT_NE(hdl, nullptr);
495     EXPECT_EQ(size, sizeof(in2));
496     EXPECT_EQ(nextRecHdl, 0u);
497     EXPECT_EQ(memcmp(outData, in2.data(), sizeof(in2)), 0);
498     outData = nullptr;
499 
500     pldm_pdr_destroy(repo);
501 }
502 
TEST(PDRAccess,testFindByType)503 TEST(PDRAccess, testFindByType)
504 {
505     auto repo = pldm_pdr_init();
506 
507     std::array<uint8_t, sizeof(pldm_pdr_hdr)> data{};
508     pldm_pdr_hdr* hdr = reinterpret_cast<pldm_pdr_hdr*>(data.data());
509     hdr->type = 1;
510     uint32_t first = 0;
511     EXPECT_EQ(
512         pldm_pdr_add_check(repo, data.data(), data.size(), false, 1, &first),
513         0);
514     hdr->type = 2;
515     uint32_t second = 0;
516     EXPECT_EQ(
517         pldm_pdr_add_check(repo, data.data(), data.size(), false, 1, &second),
518         0);
519     hdr->type = 3;
520     uint32_t third = 0;
521     EXPECT_EQ(
522         pldm_pdr_add_check(repo, data.data(), data.size(), false, 1, &third),
523         0);
524     hdr->type = 4;
525     uint32_t fourth = 0;
526     EXPECT_EQ(
527         pldm_pdr_add_check(repo, data.data(), data.size(), false, 1, &fourth),
528         0);
529 
530     uint8_t* outData = nullptr;
531     uint32_t size{};
532     auto firstRec =
533         pldm_pdr_find_record_by_type(repo, 1, nullptr, &outData, &size);
534     EXPECT_EQ(pldm_pdr_get_record_handle(repo, firstRec), first);
535     outData = nullptr;
536     auto secondRec =
537         pldm_pdr_find_record_by_type(repo, 2, nullptr, &outData, &size);
538     EXPECT_EQ(pldm_pdr_get_record_handle(repo, secondRec), second);
539     outData = nullptr;
540     auto thirdRec =
541         pldm_pdr_find_record_by_type(repo, 3, nullptr, &outData, &size);
542     EXPECT_EQ(pldm_pdr_get_record_handle(repo, thirdRec), third);
543     outData = nullptr;
544     auto fourthRec =
545         pldm_pdr_find_record_by_type(repo, 4, nullptr, &outData, &size);
546     EXPECT_EQ(pldm_pdr_get_record_handle(repo, fourthRec), fourth);
547     outData = nullptr;
548     auto fifthRec =
549         pldm_pdr_find_record_by_type(repo, 5, nullptr, &outData, &size);
550     EXPECT_EQ(fifthRec, nullptr);
551     EXPECT_EQ(outData, nullptr);
552     EXPECT_EQ(size, 0u);
553 
554     auto rec =
555         pldm_pdr_find_record_by_type(repo, 3, secondRec, &outData, &size);
556     EXPECT_EQ(pldm_pdr_get_record_handle(repo, rec), third);
557     outData = nullptr;
558     rec = pldm_pdr_find_record_by_type(repo, 4, secondRec, &outData, &size);
559     EXPECT_EQ(pldm_pdr_get_record_handle(repo, rec), fourth);
560     outData = nullptr;
561     rec = pldm_pdr_find_record_by_type(repo, 2, firstRec, &outData, &size);
562     EXPECT_EQ(pldm_pdr_get_record_handle(repo, rec), second);
563     outData = nullptr;
564 
565     pldm_pdr_destroy(repo);
566 }
567 
TEST(PDRUpdate,testAddFruRecordSet)568 TEST(PDRUpdate, testAddFruRecordSet)
569 {
570     auto repo = pldm_pdr_init();
571 
572     uint32_t handle = 0;
573     EXPECT_EQ(
574         pldm_pdr_add_fru_record_set_check(repo, 1, 10, 1, 0, 100, &handle), 0);
575     EXPECT_EQ(handle, 1u);
576     EXPECT_EQ(pldm_pdr_get_record_count(repo), 1u);
577     EXPECT_EQ(pldm_pdr_get_repo_size(repo),
578               sizeof(pldm_pdr_hdr) + sizeof(pldm_pdr_fru_record_set));
579     uint32_t size{};
580     uint32_t nextRecHdl{};
581     uint8_t* outData = nullptr;
582     auto hdl = pldm_pdr_find_record(repo, 0, &outData, &size, &nextRecHdl);
583     EXPECT_NE(hdl, nullptr);
584     EXPECT_EQ(size, sizeof(pldm_pdr_hdr) + sizeof(pldm_pdr_fru_record_set));
585     EXPECT_EQ(nextRecHdl, 0u);
586     pldm_pdr_hdr* hdr = reinterpret_cast<pldm_pdr_hdr*>(outData);
587     EXPECT_EQ(hdr->version, 1u);
588     EXPECT_EQ(hdr->type, PLDM_PDR_FRU_RECORD_SET);
589     EXPECT_EQ(hdr->length, htole16(sizeof(pldm_pdr_fru_record_set)));
590     EXPECT_EQ(hdr->record_handle, htole32(1));
591     pldm_pdr_fru_record_set* fru = reinterpret_cast<pldm_pdr_fru_record_set*>(
592         outData + sizeof(pldm_pdr_hdr));
593     EXPECT_EQ(fru->terminus_handle, htole16(1));
594     EXPECT_EQ(fru->fru_rsi, htole16(10));
595     EXPECT_EQ(fru->entity_type, htole16(1));
596     EXPECT_EQ(fru->entity_instance_num, htole16(0));
597     EXPECT_EQ(fru->container_id, htole16(100));
598     outData = nullptr;
599 
600     handle = 0;
601     EXPECT_EQ(
602         pldm_pdr_add_fru_record_set_check(repo, 2, 11, 2, 1, 101, &handle), 0);
603     EXPECT_EQ(handle, 2u);
604     EXPECT_EQ(pldm_pdr_get_record_count(repo), 2u);
605     EXPECT_EQ(pldm_pdr_get_repo_size(repo),
606               2 * (sizeof(pldm_pdr_hdr) + sizeof(pldm_pdr_fru_record_set)));
607     hdl = pldm_pdr_find_record(repo, 2, &outData, &size, &nextRecHdl);
608     EXPECT_NE(hdl, nullptr);
609     EXPECT_EQ(size, sizeof(pldm_pdr_hdr) + sizeof(pldm_pdr_fru_record_set));
610     EXPECT_EQ(nextRecHdl, 0u);
611     hdr = reinterpret_cast<pldm_pdr_hdr*>(outData);
612     EXPECT_EQ(hdr->version, 1u);
613     EXPECT_EQ(hdr->type, PLDM_PDR_FRU_RECORD_SET);
614     EXPECT_EQ(hdr->length, htole16(sizeof(pldm_pdr_fru_record_set)));
615     EXPECT_EQ(hdr->record_handle, htole32(2));
616     fru = reinterpret_cast<pldm_pdr_fru_record_set*>(outData +
617                                                      sizeof(pldm_pdr_hdr));
618     EXPECT_EQ(fru->terminus_handle, htole16(2));
619     EXPECT_EQ(fru->fru_rsi, htole16(11));
620     EXPECT_EQ(fru->entity_type, htole16(2));
621     EXPECT_EQ(fru->entity_instance_num, htole16(1));
622     EXPECT_EQ(fru->container_id, htole16(101));
623     outData = nullptr;
624 
625     hdl = pldm_pdr_find_record(repo, 1, &outData, &size, &nextRecHdl);
626     EXPECT_NE(hdl, nullptr);
627     EXPECT_EQ(size, sizeof(pldm_pdr_hdr) + sizeof(pldm_pdr_fru_record_set));
628     EXPECT_EQ(nextRecHdl, 2u);
629     hdr = reinterpret_cast<pldm_pdr_hdr*>(outData);
630     EXPECT_EQ(hdr->version, 1u);
631     EXPECT_EQ(hdr->type, PLDM_PDR_FRU_RECORD_SET);
632     EXPECT_EQ(hdr->length, htole16(sizeof(pldm_pdr_fru_record_set)));
633     EXPECT_EQ(hdr->record_handle, htole32(1));
634     fru = reinterpret_cast<pldm_pdr_fru_record_set*>(outData +
635                                                      sizeof(pldm_pdr_hdr));
636     EXPECT_EQ(fru->terminus_handle, htole16(1));
637     EXPECT_EQ(fru->fru_rsi, htole16(10));
638     EXPECT_EQ(fru->entity_type, htole16(1));
639     EXPECT_EQ(fru->entity_instance_num, htole16(0));
640     EXPECT_EQ(fru->container_id, htole16(100));
641     outData = nullptr;
642 
643     pldm_pdr_destroy(repo);
644 }
645 
TEST(PDRUpdate,tesFindtFruRecordSet)646 TEST(PDRUpdate, tesFindtFruRecordSet)
647 {
648     auto repo = pldm_pdr_init();
649 
650     uint16_t terminusHdl{};
651     uint16_t entityType{};
652     uint16_t entityInstanceNum{};
653     uint16_t containerId{};
654     uint32_t first = 1;
655     EXPECT_EQ(pldm_pdr_add_fru_record_set_check(repo, 1, 1, 1, 0, 100, &first),
656               0);
657     uint32_t second = 2;
658     EXPECT_EQ(pldm_pdr_add_fru_record_set_check(repo, 1, 2, 1, 1, 100, &second),
659               0);
660     uint32_t third = 3;
661     EXPECT_EQ(pldm_pdr_add_fru_record_set_check(repo, 1, 3, 1, 2, 100, &third),
662               0);
663     EXPECT_EQ(first, pldm_pdr_get_record_handle(
664                          repo, pldm_pdr_fru_record_set_find_by_rsi(
665                                    repo, 1, &terminusHdl, &entityType,
666                                    &entityInstanceNum, &containerId)));
667     EXPECT_EQ(second, pldm_pdr_get_record_handle(
668                           repo, pldm_pdr_fru_record_set_find_by_rsi(
669                                     repo, 2, &terminusHdl, &entityType,
670                                     &entityInstanceNum, &containerId)));
671     EXPECT_EQ(third, pldm_pdr_get_record_handle(
672                          repo, pldm_pdr_fru_record_set_find_by_rsi(
673                                    repo, 3, &terminusHdl, &entityType,
674                                    &entityInstanceNum, &containerId)));
675     EXPECT_EQ(terminusHdl, 1u);
676     EXPECT_EQ(entityType, 1u);
677     EXPECT_EQ(entityInstanceNum, 2u);
678     EXPECT_EQ(containerId, 100u);
679     EXPECT_EQ(nullptr, pldm_pdr_fru_record_set_find_by_rsi(
680                            repo, 4, &terminusHdl, &entityType,
681                            &entityInstanceNum, &containerId));
682 
683     pldm_pdr_destroy(repo);
684 }
685 
686 #ifdef LIBPLDM_API_TESTING
TEST(PDRUpdate,testFindLastInRange)687 TEST(PDRUpdate, testFindLastInRange)
688 {
689     auto repo = pldm_pdr_init();
690 
691     std::array<uint8_t, 10> data{};
692     uint32_t handle1 = 0;
693     EXPECT_EQ(
694         pldm_pdr_add_check(repo, data.data(), data.size(), false, 1, &handle1),
695         0);
696     uint32_t handle2 = 23;
697     EXPECT_EQ(
698         pldm_pdr_add_check(repo, data.data(), data.size(), false, 1, &handle2),
699         0);
700     uint32_t handle3 = 77;
701     EXPECT_EQ(
702         pldm_pdr_add_check(repo, data.data(), data.size(), false, 1, &handle3),
703         0);
704     uint32_t handle4 = 16777325;
705     EXPECT_EQ(
706         pldm_pdr_add_check(repo, data.data(), data.size(), true, 1, &handle4),
707         0);
708     uint32_t handle5 = 16777344;
709     EXPECT_EQ(
710         pldm_pdr_add_check(repo, data.data(), data.size(), true, 1, &handle5),
711         0);
712 
713     auto rec1 = pldm_pdr_find_last_in_range(repo, 0, 100);
714     auto rec2 = pldm_pdr_find_last_in_range(repo, 16777300, 33554431);
715     EXPECT_NE(rec1, nullptr);
716     EXPECT_NE(rec2, nullptr);
717     EXPECT_NE(handle1, pldm_pdr_get_record_handle(repo, rec1));
718     EXPECT_NE(handle2, pldm_pdr_get_record_handle(repo, rec1));
719     EXPECT_EQ(handle3, pldm_pdr_get_record_handle(repo, rec1));
720     EXPECT_NE(handle4, pldm_pdr_get_record_handle(repo, rec2));
721     EXPECT_EQ(handle5, pldm_pdr_get_record_handle(repo, rec2));
722 
723     pldm_pdr_destroy(repo);
724 }
725 #endif
726 
727 #ifdef LIBPLDM_API_TESTING
TEST(PDRAccess,testGetTerminusHandle)728 TEST(PDRAccess, testGetTerminusHandle)
729 {
730 
731     auto repo = pldm_pdr_init();
732 
733     pldm_pdr_hdr hdr;
734 
735     hdr.type = 1;
736     uint16_t firstTerminusHandle = 1;
737     EXPECT_EQ(pldm_pdr_add_check(repo, reinterpret_cast<const uint8_t*>(&hdr),
738                                  sizeof(hdr), false, firstTerminusHandle, NULL),
739               0);
740 
741     hdr.type = 2;
742     uint16_t secondTerminusHandle = 2;
743     EXPECT_EQ(pldm_pdr_add_check(repo, reinterpret_cast<const uint8_t*>(&hdr),
744                                  sizeof(hdr), true, secondTerminusHandle, NULL),
745               0);
746 
747     hdr.type = 3;
748     uint16_t thirdTerminusHandle = 3;
749     EXPECT_EQ(pldm_pdr_add_check(repo, reinterpret_cast<const uint8_t*>(&hdr),
750                                  sizeof(hdr), true, thirdTerminusHandle, NULL),
751               0);
752 
753     uint8_t* outData = nullptr;
754     uint32_t size{};
755 
756     auto firstRec =
757         pldm_pdr_find_record_by_type(repo, 1, nullptr, &outData, &size);
758     EXPECT_EQ(pldm_pdr_get_terminus_handle(repo, firstRec),
759               firstTerminusHandle);
760     outData = nullptr;
761 
762     auto secondRec =
763         pldm_pdr_find_record_by_type(repo, 2, nullptr, &outData, &size);
764     EXPECT_EQ(pldm_pdr_get_terminus_handle(repo, secondRec),
765               secondTerminusHandle);
766     outData = nullptr;
767 
768     auto thirdRec =
769         pldm_pdr_find_record_by_type(repo, 3, nullptr, &outData, &size);
770     EXPECT_EQ(pldm_pdr_get_terminus_handle(repo, thirdRec),
771               thirdTerminusHandle);
772     outData = nullptr;
773 
774     pldm_pdr_destroy(repo);
775 }
776 #endif
777 
TEST(EntityAssociationPDR,testInit)778 TEST(EntityAssociationPDR, testInit)
779 {
780     auto tree = pldm_entity_association_tree_init();
781     EXPECT_NE(tree, nullptr);
782     pldm_entity_association_tree_destroy(tree);
783 }
784 
TEST(EntityAssociationPDR,testBuild)785 TEST(EntityAssociationPDR, testBuild)
786 {
787     //        1
788     //        |
789     //        2--3--4
790     //        |
791     //        5--6--7
792     //        |  |
793     //        9  8
794 
795     pldm_entity entities[9]{};
796 
797     entities[0].entity_type = 1;
798     entities[1].entity_type = 2;
799     entities[2].entity_type = 2;
800     entities[3].entity_type = 3;
801     entities[4].entity_type = 4;
802     entities[5].entity_type = 5;
803     entities[6].entity_type = 5;
804     entities[7].entity_type = 6;
805     entities[8].entity_type = 7;
806 
807     auto tree = pldm_entity_association_tree_init();
808 
809     auto l1 = pldm_entity_association_tree_add(
810         tree, &entities[0], 0xffff, nullptr, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
811     EXPECT_NE(l1, nullptr);
812     auto l2a = pldm_entity_association_tree_add(
813         tree, &entities[1], 0xffff, l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
814     EXPECT_NE(l2a, nullptr);
815     auto l2b = pldm_entity_association_tree_add(
816         tree, &entities[2], 0xffff, l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
817     EXPECT_NE(l2b, nullptr);
818     auto l2c = pldm_entity_association_tree_add(
819         tree, &entities[3], 0xffff, l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
820     EXPECT_NE(l2c, nullptr);
821     auto l3a = pldm_entity_association_tree_add(
822         tree, &entities[4], 0xffff, l2a, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
823     EXPECT_NE(l3a, nullptr);
824     auto l3b = pldm_entity_association_tree_add(
825         tree, &entities[5], 0xffff, l2a, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
826     EXPECT_NE(l3b, nullptr);
827     auto l3c = pldm_entity_association_tree_add(
828         tree, &entities[6], 0xffff, l2a, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
829     EXPECT_NE(l3b, nullptr);
830     auto l4a = pldm_entity_association_tree_add(
831         tree, &entities[7], 0xffff, l3a, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
832     EXPECT_NE(l4a, nullptr);
833     auto l4b = pldm_entity_association_tree_add(
834         tree, &entities[8], 0xffff, l3b, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
835     EXPECT_NE(l4b, nullptr);
836 
837     EXPECT_EQ(pldm_entity_is_node_parent(l1), true);
838     EXPECT_EQ(pldm_entity_is_node_parent(l2a), true);
839     EXPECT_EQ(pldm_entity_is_node_parent(l3a), true);
840     EXPECT_EQ(pldm_entity_is_node_parent(l3b), true);
841 
842     EXPECT_EQ(pldm_entity_is_node_parent(l2b), false);
843     EXPECT_EQ(pldm_entity_is_node_parent(l2c), false);
844     EXPECT_EQ(pldm_entity_is_node_parent(l3c), false);
845     EXPECT_EQ(pldm_entity_is_node_parent(l4a), false);
846     EXPECT_EQ(pldm_entity_is_node_parent(l4b), false);
847 
848     EXPECT_EQ(pldm_entity_is_exist_parent(l1), false);
849 
850     pldm_entity nodeL1 = pldm_entity_extract(l1);
851     pldm_entity parentL2a = pldm_entity_get_parent(l2a);
852     pldm_entity parentL2b = pldm_entity_get_parent(l2b);
853     pldm_entity parentL2c = pldm_entity_get_parent(l2c);
854     EXPECT_EQ(pldm_entity_is_exist_parent(l2a), true);
855     EXPECT_EQ(pldm_entity_is_exist_parent(l2b), true);
856     EXPECT_EQ(pldm_entity_is_exist_parent(l2c), true);
857     EXPECT_EQ(parentL2a.entity_type, nodeL1.entity_type);
858     EXPECT_EQ(parentL2a.entity_instance_num, nodeL1.entity_instance_num);
859     EXPECT_EQ(parentL2a.entity_container_id, nodeL1.entity_container_id);
860     EXPECT_EQ(parentL2b.entity_type, nodeL1.entity_type);
861     EXPECT_EQ(parentL2b.entity_instance_num, nodeL1.entity_instance_num);
862     EXPECT_EQ(parentL2b.entity_container_id, nodeL1.entity_container_id);
863     EXPECT_EQ(parentL2c.entity_type, nodeL1.entity_type);
864     EXPECT_EQ(parentL2c.entity_instance_num, nodeL1.entity_instance_num);
865     EXPECT_EQ(parentL2c.entity_container_id, nodeL1.entity_container_id);
866 
867     pldm_entity nodeL2a = pldm_entity_extract(l2a);
868     pldm_entity parentL3a = pldm_entity_get_parent(l3a);
869     pldm_entity parentL3b = pldm_entity_get_parent(l3b);
870     pldm_entity parentL3c = pldm_entity_get_parent(l3c);
871     EXPECT_EQ(pldm_entity_is_exist_parent(l3a), true);
872     EXPECT_EQ(pldm_entity_is_exist_parent(l3b), true);
873     EXPECT_EQ(pldm_entity_is_exist_parent(l3c), true);
874     EXPECT_EQ(parentL3a.entity_type, nodeL2a.entity_type);
875     EXPECT_EQ(parentL3a.entity_instance_num, nodeL2a.entity_instance_num);
876     EXPECT_EQ(parentL3a.entity_container_id, nodeL2a.entity_container_id);
877     EXPECT_EQ(parentL3b.entity_type, nodeL2a.entity_type);
878     EXPECT_EQ(parentL3b.entity_instance_num, nodeL2a.entity_instance_num);
879     EXPECT_EQ(parentL3b.entity_container_id, nodeL2a.entity_container_id);
880     EXPECT_EQ(parentL3c.entity_type, nodeL2a.entity_type);
881     EXPECT_EQ(parentL3c.entity_instance_num, nodeL2a.entity_instance_num);
882     EXPECT_EQ(parentL3c.entity_container_id, nodeL2a.entity_container_id);
883 
884     pldm_entity nodeL3a = pldm_entity_extract(l3a);
885     pldm_entity parentL4a = pldm_entity_get_parent(l4a);
886     EXPECT_EQ(pldm_entity_is_exist_parent(l4a), true);
887     EXPECT_EQ(parentL4a.entity_type, nodeL3a.entity_type);
888     EXPECT_EQ(parentL4a.entity_instance_num, nodeL3a.entity_instance_num);
889     EXPECT_EQ(parentL4a.entity_container_id, nodeL3a.entity_container_id);
890 
891     pldm_entity nodeL3b = pldm_entity_extract(l3b);
892     pldm_entity parentL4b = pldm_entity_get_parent(l4b);
893     EXPECT_EQ(pldm_entity_is_exist_parent(l4b), true);
894     EXPECT_EQ(parentL4b.entity_type, nodeL3b.entity_type);
895     EXPECT_EQ(parentL4b.entity_instance_num, nodeL3b.entity_instance_num);
896     EXPECT_EQ(parentL4b.entity_container_id, nodeL3b.entity_container_id);
897 
898     size_t num{};
899     pldm_entity* out = nullptr;
900     pldm_entity_association_tree_visit(tree, &out, &num);
901     EXPECT_EQ(num, 9u);
902 
903     EXPECT_EQ(out[0].entity_type, 1u);
904     EXPECT_EQ(out[0].entity_instance_num, 1u);
905     EXPECT_EQ(out[0].entity_container_id, 0u);
906 
907     EXPECT_EQ(out[1].entity_type, 2u);
908     EXPECT_EQ(out[1].entity_instance_num, 1u);
909     EXPECT_EQ(out[1].entity_container_id, 1u);
910     EXPECT_EQ(out[2].entity_type, 2u);
911     EXPECT_EQ(out[2].entity_instance_num, 2u);
912     EXPECT_EQ(out[2].entity_container_id, 1u);
913     EXPECT_EQ(out[3].entity_type, 3u);
914     EXPECT_EQ(out[3].entity_instance_num, 1u);
915     EXPECT_EQ(out[3].entity_container_id, 1u);
916 
917     EXPECT_EQ(out[4].entity_type, 4u);
918     EXPECT_EQ(out[4].entity_instance_num, 1u);
919     EXPECT_EQ(out[4].entity_container_id, 2u);
920     EXPECT_EQ(out[5].entity_type, 5u);
921     EXPECT_EQ(out[5].entity_instance_num, 1u);
922     EXPECT_EQ(out[5].entity_container_id, 2u);
923     EXPECT_EQ(out[6].entity_type, 5u);
924     EXPECT_EQ(out[6].entity_instance_num, 2u);
925     EXPECT_EQ(out[6].entity_container_id, 2u);
926 
927     EXPECT_EQ(out[7].entity_type, 7u);
928     EXPECT_EQ(out[7].entity_instance_num, 1u);
929     EXPECT_EQ(out[7].entity_container_id, 4u);
930     EXPECT_EQ(out[8].entity_type, 6u);
931     EXPECT_EQ(out[8].entity_instance_num, 1u);
932     EXPECT_EQ(out[8].entity_container_id, 3u);
933 
934     free(out);
935 
936     pldm_entity p1 = pldm_entity_extract(l1);
937     EXPECT_EQ(p1.entity_type, 1u);
938     EXPECT_EQ(p1.entity_instance_num, 1u);
939     EXPECT_EQ(p1.entity_container_id, 0u);
940 
941     pldm_entity p2a = pldm_entity_extract(l2a);
942     EXPECT_EQ(p2a.entity_type, 2u);
943     EXPECT_EQ(p2a.entity_instance_num, 1u);
944     EXPECT_EQ(p2a.entity_container_id, 1u);
945     pldm_entity p2b = pldm_entity_extract(l2b);
946     EXPECT_EQ(p2b.entity_type, 2u);
947     EXPECT_EQ(p2b.entity_instance_num, 2u);
948     EXPECT_EQ(p2b.entity_container_id, 1u);
949     pldm_entity p2c = pldm_entity_extract(l2c);
950     EXPECT_EQ(p2c.entity_type, 3u);
951     EXPECT_EQ(p2c.entity_instance_num, 1u);
952     EXPECT_EQ(p2c.entity_container_id, 1u);
953 
954     pldm_entity p3a = pldm_entity_extract(l3a);
955     EXPECT_EQ(p3a.entity_type, 4u);
956     EXPECT_EQ(p3a.entity_instance_num, 1u);
957     EXPECT_EQ(p3a.entity_container_id, 2u);
958     pldm_entity p3b = pldm_entity_extract(l3b);
959     EXPECT_EQ(p3b.entity_type, 5u);
960     EXPECT_EQ(p3b.entity_instance_num, 1u);
961     EXPECT_EQ(p3b.entity_container_id, 2u);
962     pldm_entity p3c = pldm_entity_extract(l3c);
963     EXPECT_EQ(p3c.entity_type, 5u);
964     EXPECT_EQ(p3c.entity_instance_num, 2u);
965     EXPECT_EQ(p3c.entity_container_id, 2u);
966 
967     pldm_entity p4a = pldm_entity_extract(l4a);
968     EXPECT_EQ(p4a.entity_type, 6u);
969     EXPECT_EQ(p4a.entity_instance_num, 1u);
970     EXPECT_EQ(p4a.entity_container_id, 3u);
971     pldm_entity p4b = pldm_entity_extract(l4b);
972     EXPECT_EQ(p4b.entity_type, 7u);
973     EXPECT_EQ(p4b.entity_instance_num, 1u);
974     EXPECT_EQ(p4b.entity_container_id, 4u);
975 
976     pldm_entity_association_tree_destroy(tree);
977 }
978 
979 #if LIBPLDM_API_TESTING
TEST(EntityAssociationPDR,findAndAddRemotePDR)980 TEST(EntityAssociationPDR, findAndAddRemotePDR)
981 {
982     //         Tree - 1
983     //
984     //        11521(1,0)
985     //             |
986     //          45 (1,1)
987     //             |
988     //          64 (1,2)
989     //             |
990     //    ------------------
991     //    |                 |
992     //  67(0,3)           67(1,3)
993     //    |                 |
994     // 135(0,4)          135(0,5)
995     //    |                 |
996     // 32903(0,6)         32903(0,7)
997 
998     pldm_entity entities[9]{};
999     entities[0].entity_type = 11521;
1000     entities[1].entity_type = 45;
1001     entities[2].entity_type = 64;
1002     entities[3].entity_type = 67;
1003     entities[4].entity_type = 67;
1004     entities[5].entity_type = 135;
1005     entities[5].entity_container_id = 2;
1006     entities[6].entity_type = 135;
1007     entities[6].entity_container_id = 3;
1008     entities[7].entity_type = 32903;
1009     entities[8].entity_type = 32903;
1010     auto tree = pldm_entity_association_tree_init();
1011     auto l1 = pldm_entity_association_tree_add_entity(
1012         tree, &entities[0], 0xffff, nullptr, PLDM_ENTITY_ASSOCIAION_LOGICAL,
1013         false, true, 0xffff);
1014     EXPECT_NE(l1, nullptr);
1015     auto l2 = pldm_entity_association_tree_add_entity(
1016         tree, &entities[1], 0xffff, l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL, false,
1017         false, 0xffff);
1018     EXPECT_NE(l2, nullptr);
1019     auto l3 = pldm_entity_association_tree_add_entity(
1020         tree, &entities[2], 0xffff, l2, PLDM_ENTITY_ASSOCIAION_PHYSICAL, false,
1021         true, 0xffff);
1022     EXPECT_NE(l3, nullptr);
1023     auto l4a = pldm_entity_association_tree_add_entity(
1024         tree, &entities[3], 0, l3, PLDM_ENTITY_ASSOCIAION_PHYSICAL, false,
1025         false, 0xffff);
1026     EXPECT_NE(l4a, nullptr);
1027     auto l4b = pldm_entity_association_tree_add_entity(
1028         tree, &entities[4], 1, l3, PLDM_ENTITY_ASSOCIAION_PHYSICAL, true, true,
1029         0xffff);
1030     EXPECT_NE(l4b, nullptr);
1031     auto l5a = pldm_entity_association_tree_add_entity(
1032         tree, &entities[5], 0, l4a, PLDM_ENTITY_ASSOCIAION_PHYSICAL, false,
1033         false, 0xffff);
1034     EXPECT_NE(l5a, nullptr);
1035     auto l5b = pldm_entity_association_tree_add_entity(
1036         tree, &entities[6], 0, l4b, PLDM_ENTITY_ASSOCIAION_PHYSICAL, false,
1037         false, 0xffff);
1038     EXPECT_NE(l5b, nullptr);
1039     pldm_entity entity{};
1040     entity.entity_type = 135;
1041     entity.entity_instance_num = 0;
1042     entity.entity_container_id = 2;
1043     auto result1 = pldm_entity_association_tree_find(tree, &entity);
1044     EXPECT_EQ(result1, l5a);
1045     EXPECT_EQ(entities[5].entity_container_id, 2);
1046     auto l6a = pldm_entity_association_tree_add_entity(
1047         tree, &entities[7], 0, result1, PLDM_ENTITY_ASSOCIAION_PHYSICAL, false,
1048         false, 0xffff);
1049     EXPECT_NE(l6a, nullptr);
1050     entity.entity_type = 135;
1051     entity.entity_instance_num = 0;
1052     entity.entity_container_id = 3;
1053     auto result2 = pldm_entity_association_tree_find(tree, &entity);
1054     EXPECT_NE(result2, l5b);
1055     EXPECT_EQ(entities[6].entity_container_id, 3);
1056     auto l7a = pldm_entity_association_tree_add_entity(
1057         tree, &entities[8], 0, result2, PLDM_ENTITY_ASSOCIAION_PHYSICAL, false,
1058         false, 0xffff);
1059     EXPECT_EQ(l7a, nullptr);
1060     pldm_entity_association_tree_destroy(tree);
1061 }
1062 #endif
1063 
TEST(EntityAssociationPDR,testSpecialTrees)1064 TEST(EntityAssociationPDR, testSpecialTrees)
1065 {
1066     pldm_entity entities[3]{};
1067 
1068     entities[0].entity_type = 1;
1069     entities[1].entity_type = 2;
1070     entities[2].entity_type = 1;
1071 
1072     // A
1073     auto tree = pldm_entity_association_tree_init();
1074     auto node = pldm_entity_association_tree_add(
1075         tree, &entities[0], 0xffff, nullptr, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
1076     EXPECT_NE(node, nullptr);
1077     size_t num{};
1078     pldm_entity* out = nullptr;
1079     pldm_entity_association_tree_visit(tree, &out, &num);
1080     EXPECT_EQ(num, 1u);
1081     EXPECT_EQ(out[0].entity_type, 1u);
1082     EXPECT_EQ(out[0].entity_instance_num, 1u);
1083     EXPECT_EQ(out[0].entity_container_id, 0u);
1084     free(out);
1085     pldm_entity_association_tree_destroy(tree);
1086 
1087     // A-A-A
1088     tree = pldm_entity_association_tree_init();
1089     node = pldm_entity_association_tree_add(tree, &entities[0], 0xffff, nullptr,
1090                                             PLDM_ENTITY_ASSOCIAION_PHYSICAL);
1091     EXPECT_NE(node, nullptr);
1092     node = pldm_entity_association_tree_add(tree, &entities[1], 0xffff, nullptr,
1093                                             PLDM_ENTITY_ASSOCIAION_PHYSICAL);
1094     EXPECT_NE(node, nullptr);
1095     node = pldm_entity_association_tree_add(tree, &entities[2], 0xffff, nullptr,
1096                                             PLDM_ENTITY_ASSOCIAION_PHYSICAL);
1097     EXPECT_NE(node, nullptr);
1098     pldm_entity_association_tree_visit(tree, &out, &num);
1099     EXPECT_EQ(num, 3u);
1100     EXPECT_EQ(out[0].entity_type, 1u);
1101     EXPECT_EQ(out[0].entity_instance_num, 1u);
1102     EXPECT_EQ(out[0].entity_container_id, 0u);
1103     EXPECT_EQ(out[1].entity_type, 1u);
1104     EXPECT_EQ(out[1].entity_instance_num, 2u);
1105     EXPECT_EQ(out[1].entity_container_id, 0u);
1106     EXPECT_EQ(out[2].entity_type, 2u);
1107     EXPECT_EQ(out[2].entity_instance_num, 1u);
1108     EXPECT_EQ(out[2].entity_container_id, 0u);
1109     free(out);
1110     pldm_entity_association_tree_destroy(tree);
1111 
1112     // A
1113     // |
1114     // A
1115     // |
1116     // A
1117     tree = pldm_entity_association_tree_init();
1118     node = pldm_entity_association_tree_add(tree, &entities[0], 0xffff, nullptr,
1119                                             PLDM_ENTITY_ASSOCIAION_PHYSICAL);
1120     EXPECT_NE(node, nullptr);
1121     auto node1 = pldm_entity_association_tree_add(
1122         tree, &entities[1], 0xffff, node, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
1123     EXPECT_NE(node1, nullptr);
1124     auto node2 = pldm_entity_association_tree_add(
1125         tree, &entities[2], 0xffff, node1, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
1126     EXPECT_NE(node2, nullptr);
1127     pldm_entity_association_tree_visit(tree, &out, &num);
1128     EXPECT_EQ(num, 3u);
1129     EXPECT_EQ(out[0].entity_type, 1u);
1130     EXPECT_EQ(out[0].entity_instance_num, 1u);
1131     EXPECT_EQ(out[0].entity_container_id, 0u);
1132     EXPECT_EQ(out[1].entity_type, 2u);
1133     EXPECT_EQ(out[1].entity_instance_num, 1u);
1134     EXPECT_EQ(out[1].entity_container_id, 1u);
1135     EXPECT_EQ(out[2].entity_type, 1u);
1136     EXPECT_EQ(out[2].entity_instance_num, 1u);
1137     EXPECT_EQ(out[2].entity_container_id, 2u);
1138     free(out);
1139     pldm_entity_association_tree_destroy(tree);
1140 
1141     // A-A
1142     //   |
1143     //   A-A
1144     tree = pldm_entity_association_tree_init();
1145     node = pldm_entity_association_tree_add(tree, &entities[0], 0xffff, nullptr,
1146                                             PLDM_ENTITY_ASSOCIAION_PHYSICAL);
1147     EXPECT_NE(node, nullptr);
1148     node = pldm_entity_association_tree_add(tree, &entities[0], 0xffff, nullptr,
1149                                             PLDM_ENTITY_ASSOCIAION_PHYSICAL);
1150     EXPECT_NE(node, nullptr);
1151     node1 = pldm_entity_association_tree_add(tree, &entities[1], 0xffff, node,
1152                                              PLDM_ENTITY_ASSOCIAION_PHYSICAL);
1153     EXPECT_NE(node1, nullptr);
1154     node2 = pldm_entity_association_tree_add(tree, &entities[2], 0xffff, node,
1155                                              PLDM_ENTITY_ASSOCIAION_PHYSICAL);
1156     EXPECT_NE(node2, nullptr);
1157     pldm_entity_association_tree_visit(tree, &out, &num);
1158     EXPECT_EQ(num, 4u);
1159     EXPECT_EQ(out[0].entity_type, 1u);
1160     EXPECT_EQ(out[0].entity_instance_num, 1u);
1161     EXPECT_EQ(out[0].entity_container_id, 0u);
1162     EXPECT_EQ(out[1].entity_type, 1u);
1163     EXPECT_EQ(out[1].entity_instance_num, 2u);
1164     EXPECT_EQ(out[1].entity_container_id, 0u);
1165     EXPECT_EQ(out[2].entity_type, 2u);
1166     EXPECT_EQ(out[2].entity_instance_num, 1u);
1167     EXPECT_EQ(out[2].entity_container_id, 1u);
1168     EXPECT_EQ(out[3].entity_type, 1u);
1169     EXPECT_EQ(out[3].entity_instance_num, 1u);
1170     EXPECT_EQ(out[3].entity_container_id, 1u);
1171     free(out);
1172     pldm_entity_association_tree_destroy(tree);
1173 }
1174 
TEST(EntityAssociationPDR,testPDR)1175 TEST(EntityAssociationPDR, testPDR)
1176 {
1177     // e = entity type, c = container id, i = instance num
1178 
1179     //        INPUT
1180     //        1(e=1)--1a(e=2)
1181     //        |
1182     //        2(e=2)--3(e=2)--4(e=2)--5(e=3)
1183     //        |
1184     //        6(e=4)--7(e=5)--8(e=5)--9(e=5)
1185     //        |       |
1186     //        11(e=6) 10(e=7)
1187 
1188     //        Expected OUTPUT
1189     //        1(e=1,c=0,i=1)
1190     //        |
1191     //        2(e=2,c=1,i=1)--3(e=2,c=1,i=2)--4(e=3,c=1,i=1)--5(e=3,c=1,i=2)
1192     //        |
1193     //        6(e=4,c=2,i=1)--7(e=5,c=2,i=1)--8(e=5,c=2,i=2)--9(e=5,c=2,i=3)
1194     //        |               |
1195     //        10(e=6,c=3,i=1) 11(e=7,c=4,i=1)
1196     pldm_entity entities[11]{};
1197 
1198     entities[0].entity_type = 1;
1199     entities[1].entity_type = 2;
1200     entities[2].entity_type = 3;
1201     entities[3].entity_type = 2;
1202     entities[4].entity_type = 3;
1203     entities[5].entity_type = 4;
1204     entities[6].entity_type = 5;
1205     entities[7].entity_type = 5;
1206     entities[8].entity_type = 5;
1207     entities[9].entity_type = 6;
1208     entities[10].entity_type = 7;
1209 
1210     auto tree = pldm_entity_association_tree_init();
1211 
1212     auto l1 = pldm_entity_association_tree_add(
1213         tree, &entities[0], 0xffff, nullptr, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
1214     EXPECT_NE(l1, nullptr);
1215     auto l1a = pldm_entity_association_tree_add(
1216         tree, &entities[1], 0xffff, nullptr, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
1217     EXPECT_NE(l1a, nullptr);
1218 
1219     auto l2a = pldm_entity_association_tree_add(
1220         tree, &entities[1], 0xffff, l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
1221     EXPECT_NE(l2a, nullptr);
1222     auto l2b = pldm_entity_association_tree_add(tree, &entities[2], 0xffff, l1,
1223                                                 PLDM_ENTITY_ASSOCIAION_LOGICAL);
1224     EXPECT_NE(l2b, nullptr);
1225     auto l2c = pldm_entity_association_tree_add(
1226         tree, &entities[3], 0xffff, l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
1227     EXPECT_NE(l2c, nullptr);
1228     auto l2d = pldm_entity_association_tree_add(tree, &entities[4], 0xffff, l1,
1229                                                 PLDM_ENTITY_ASSOCIAION_LOGICAL);
1230     EXPECT_NE(l2d, nullptr);
1231 
1232     auto l3a = pldm_entity_association_tree_add(
1233         tree, &entities[5], 0xffff, l2a, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
1234     EXPECT_NE(l3a, nullptr);
1235     auto l3b = pldm_entity_association_tree_add(
1236         tree, &entities[6], 0xffff, l2a, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
1237     EXPECT_NE(l3b, nullptr);
1238     auto l3c = pldm_entity_association_tree_add(tree, &entities[7], 0xffff, l2a,
1239                                                 PLDM_ENTITY_ASSOCIAION_LOGICAL);
1240     EXPECT_NE(l3c, nullptr);
1241     auto l3d = pldm_entity_association_tree_add(tree, &entities[8], 0xffff, l2a,
1242                                                 PLDM_ENTITY_ASSOCIAION_LOGICAL);
1243     EXPECT_NE(l3d, nullptr);
1244 
1245     auto l4a = pldm_entity_association_tree_add(
1246         tree, &entities[9], 0xffff, l3a, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
1247     EXPECT_NE(l4a, nullptr);
1248     auto l4b = pldm_entity_association_tree_add(
1249         tree, &entities[10], 0xffff, l3b, PLDM_ENTITY_ASSOCIAION_LOGICAL);
1250     EXPECT_NE(l4b, nullptr);
1251 
1252     EXPECT_EQ(pldm_entity_get_num_children(l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL),
1253               2);
1254     EXPECT_EQ(pldm_entity_get_num_children(l1, PLDM_ENTITY_ASSOCIAION_LOGICAL),
1255               2);
1256     EXPECT_EQ(
1257         pldm_entity_get_num_children(l2a, PLDM_ENTITY_ASSOCIAION_PHYSICAL), 2);
1258     EXPECT_EQ(
1259         pldm_entity_get_num_children(l3b, PLDM_ENTITY_ASSOCIAION_PHYSICAL), 0);
1260     EXPECT_EQ(pldm_entity_get_num_children(l3b, PLDM_ENTITY_ASSOCIAION_LOGICAL),
1261               1);
1262 
1263     auto repo = pldm_pdr_init();
1264     int rc = pldm_entity_association_pdr_add_check(tree, repo, false, 1);
1265     ASSERT_EQ(rc, 0);
1266 
1267     EXPECT_EQ(pldm_pdr_get_record_count(repo), 6u);
1268 
1269     uint32_t currRecHandle{};
1270     uint32_t nextRecHandle{};
1271     uint8_t* data = nullptr;
1272     uint32_t size{};
1273     uint32_t commonSize = sizeof(struct pldm_pdr_hdr) + sizeof(uint16_t) +
1274                           sizeof(uint8_t) + sizeof(pldm_entity) +
1275                           sizeof(uint8_t);
1276 
1277     pldm_pdr_find_record(repo, currRecHandle, &data, &size, &nextRecHandle);
1278     EXPECT_EQ(size, commonSize + (pldm_entity_get_num_children(
1279                                       l1, PLDM_ENTITY_ASSOCIAION_LOGICAL) *
1280                                   sizeof(pldm_entity)));
1281     uint8_t* start = data;
1282     pldm_pdr_hdr* hdr = reinterpret_cast<pldm_pdr_hdr*>(start);
1283     EXPECT_EQ(le32toh(hdr->record_handle), 1u);
1284     EXPECT_EQ(hdr->type, PLDM_PDR_ENTITY_ASSOCIATION);
1285     EXPECT_EQ(le16toh(hdr->length), size - sizeof(struct pldm_pdr_hdr));
1286     start += sizeof(pldm_pdr_hdr);
1287     uint16_t* containerId = reinterpret_cast<uint16_t*>(start);
1288     EXPECT_EQ(le16toh(*containerId), 1u);
1289     start += sizeof(uint16_t);
1290     EXPECT_EQ(*start, PLDM_ENTITY_ASSOCIAION_LOGICAL);
1291     start += sizeof(uint8_t);
1292     pldm_entity* entity = reinterpret_cast<pldm_entity*>(start);
1293     EXPECT_EQ(le16toh(entity->entity_type), 1u);
1294     EXPECT_EQ(le16toh(entity->entity_instance_num), 1u);
1295     EXPECT_EQ(le16toh(entity->entity_container_id), 0u);
1296     start += sizeof(pldm_entity);
1297     EXPECT_EQ(*start,
1298               pldm_entity_get_num_children(l1, PLDM_ENTITY_ASSOCIAION_LOGICAL));
1299     start += sizeof(uint8_t);
1300     entity = reinterpret_cast<pldm_entity*>(start);
1301     EXPECT_EQ(le16toh(entity->entity_type), 3u);
1302     EXPECT_EQ(le16toh(entity->entity_instance_num), 1u);
1303     EXPECT_EQ(le16toh(entity->entity_container_id), 1u);
1304     start += sizeof(pldm_entity);
1305     entity = reinterpret_cast<pldm_entity*>(start);
1306     EXPECT_EQ(le16toh(entity->entity_type), 3u);
1307     EXPECT_EQ(le16toh(entity->entity_instance_num), 2u);
1308     EXPECT_EQ(le16toh(entity->entity_container_id), 1u);
1309 
1310     currRecHandle = nextRecHandle;
1311 
1312     pldm_pdr_find_record(repo, currRecHandle, &data, &size, &nextRecHandle);
1313     EXPECT_EQ(size, commonSize + (pldm_entity_get_num_children(
1314                                       l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL) *
1315                                   sizeof(pldm_entity)));
1316     start = data;
1317     hdr = reinterpret_cast<pldm_pdr_hdr*>(start);
1318     EXPECT_EQ(le32toh(hdr->record_handle), 2u);
1319     EXPECT_EQ(hdr->type, PLDM_PDR_ENTITY_ASSOCIATION);
1320     EXPECT_EQ(le16toh(hdr->length), size - sizeof(struct pldm_pdr_hdr));
1321     start += sizeof(pldm_pdr_hdr);
1322     containerId = reinterpret_cast<uint16_t*>(start);
1323     EXPECT_EQ(le16toh(*containerId), 1u);
1324     start += sizeof(uint16_t);
1325     EXPECT_EQ(*start, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
1326     start += sizeof(uint8_t);
1327     entity = reinterpret_cast<pldm_entity*>(start);
1328     EXPECT_EQ(le16toh(entity->entity_type), 1u);
1329     EXPECT_EQ(le16toh(entity->entity_instance_num), 1u);
1330     EXPECT_EQ(le16toh(entity->entity_container_id), 0u);
1331     start += sizeof(pldm_entity);
1332     EXPECT_EQ(*start, pldm_entity_get_num_children(
1333                           l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL));
1334     start += sizeof(uint8_t);
1335     entity = reinterpret_cast<pldm_entity*>(start);
1336     EXPECT_EQ(le16toh(entity->entity_type), 2u);
1337     EXPECT_EQ(le16toh(entity->entity_instance_num), 1u);
1338     EXPECT_EQ(le16toh(entity->entity_container_id), 1u);
1339     start += sizeof(pldm_entity);
1340     entity = reinterpret_cast<pldm_entity*>(start);
1341     EXPECT_EQ(le16toh(entity->entity_type), 2u);
1342     EXPECT_EQ(le16toh(entity->entity_instance_num), 2u);
1343     EXPECT_EQ(le16toh(entity->entity_container_id), 1u);
1344 
1345     currRecHandle = nextRecHandle;
1346 
1347     pldm_pdr_find_record(repo, currRecHandle, &data, &size, &nextRecHandle);
1348     EXPECT_EQ(size, commonSize + (pldm_entity_get_num_children(
1349                                       l2a, PLDM_ENTITY_ASSOCIAION_LOGICAL) *
1350                                   sizeof(pldm_entity)));
1351     start = data;
1352     hdr = reinterpret_cast<pldm_pdr_hdr*>(start);
1353     EXPECT_EQ(le32toh(hdr->record_handle), 3u);
1354     EXPECT_EQ(hdr->type, PLDM_PDR_ENTITY_ASSOCIATION);
1355     EXPECT_EQ(le16toh(hdr->length), size - sizeof(struct pldm_pdr_hdr));
1356     start += sizeof(pldm_pdr_hdr);
1357     containerId = reinterpret_cast<uint16_t*>(start);
1358     EXPECT_EQ(le16toh(*containerId), 2u);
1359     start += sizeof(uint16_t);
1360     EXPECT_EQ(*start, PLDM_ENTITY_ASSOCIAION_LOGICAL);
1361     start += sizeof(uint8_t);
1362     entity = reinterpret_cast<pldm_entity*>(start);
1363     EXPECT_EQ(le16toh(entity->entity_type), 2u);
1364     EXPECT_EQ(le16toh(entity->entity_instance_num), 1u);
1365     EXPECT_EQ(le16toh(entity->entity_container_id), 1u);
1366     start += sizeof(pldm_entity);
1367     EXPECT_EQ(*start, pldm_entity_get_num_children(
1368                           l2a, PLDM_ENTITY_ASSOCIAION_LOGICAL));
1369     start += sizeof(uint8_t);
1370     entity = reinterpret_cast<pldm_entity*>(start);
1371     EXPECT_EQ(le16toh(entity->entity_type), 5);
1372     EXPECT_EQ(le16toh(entity->entity_instance_num), 2u);
1373     EXPECT_EQ(le16toh(entity->entity_container_id), 2u);
1374     start += sizeof(pldm_entity);
1375     entity = reinterpret_cast<pldm_entity*>(start);
1376     EXPECT_EQ(le16toh(entity->entity_type), 5u);
1377     EXPECT_EQ(le16toh(entity->entity_instance_num), 3u);
1378     EXPECT_EQ(le16toh(entity->entity_container_id), 2u);
1379 
1380     currRecHandle = nextRecHandle;
1381 
1382     pldm_pdr_find_record(repo, currRecHandle, &data, &size, &nextRecHandle);
1383     EXPECT_EQ(size, commonSize + (pldm_entity_get_num_children(
1384                                       l2a, PLDM_ENTITY_ASSOCIAION_PHYSICAL) *
1385                                   sizeof(pldm_entity)));
1386     start = data;
1387     hdr = reinterpret_cast<pldm_pdr_hdr*>(start);
1388     EXPECT_EQ(le32toh(hdr->record_handle), 4u);
1389     EXPECT_EQ(hdr->type, PLDM_PDR_ENTITY_ASSOCIATION);
1390     EXPECT_EQ(le16toh(hdr->length), size - sizeof(struct pldm_pdr_hdr));
1391     start += sizeof(pldm_pdr_hdr);
1392     containerId = reinterpret_cast<uint16_t*>(start);
1393     EXPECT_EQ(le16toh(*containerId), 2u);
1394     start += sizeof(uint16_t);
1395     EXPECT_EQ(*start, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
1396     start += sizeof(uint8_t);
1397     entity = reinterpret_cast<pldm_entity*>(start);
1398     EXPECT_EQ(le16toh(entity->entity_type), 2u);
1399     EXPECT_EQ(le16toh(entity->entity_instance_num), 1u);
1400     EXPECT_EQ(le16toh(entity->entity_container_id), 1u);
1401     start += sizeof(pldm_entity);
1402     EXPECT_EQ(*start, pldm_entity_get_num_children(
1403                           l2a, PLDM_ENTITY_ASSOCIAION_PHYSICAL));
1404     start += sizeof(uint8_t);
1405     entity = reinterpret_cast<pldm_entity*>(start);
1406     EXPECT_EQ(le16toh(entity->entity_type), 4u);
1407     EXPECT_EQ(le16toh(entity->entity_instance_num), 1u);
1408     EXPECT_EQ(le16toh(entity->entity_container_id), 2u);
1409     start += sizeof(pldm_entity);
1410     entity = reinterpret_cast<pldm_entity*>(start);
1411     EXPECT_EQ(le16toh(entity->entity_type), 5u);
1412     EXPECT_EQ(le16toh(entity->entity_instance_num), 1u);
1413     EXPECT_EQ(le16toh(entity->entity_container_id), 2u);
1414 
1415     currRecHandle = nextRecHandle;
1416 
1417     pldm_pdr_find_record(repo, currRecHandle, &data, &size, &nextRecHandle);
1418     EXPECT_EQ(size, commonSize + (pldm_entity_get_num_children(
1419                                       l3a, PLDM_ENTITY_ASSOCIAION_PHYSICAL) *
1420                                   sizeof(pldm_entity)));
1421     start = data;
1422     hdr = reinterpret_cast<pldm_pdr_hdr*>(start);
1423     EXPECT_EQ(le32toh(hdr->record_handle), 5u);
1424     EXPECT_EQ(hdr->type, PLDM_PDR_ENTITY_ASSOCIATION);
1425     EXPECT_EQ(le16toh(hdr->length), size - sizeof(struct pldm_pdr_hdr));
1426     start += sizeof(pldm_pdr_hdr);
1427     containerId = reinterpret_cast<uint16_t*>(start);
1428     EXPECT_EQ(le16toh(*containerId), 3u);
1429     start += sizeof(uint16_t);
1430     EXPECT_EQ(*start, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
1431     start += sizeof(uint8_t);
1432     entity = reinterpret_cast<pldm_entity*>(start);
1433     EXPECT_EQ(le16toh(entity->entity_type), 4u);
1434     EXPECT_EQ(le16toh(entity->entity_instance_num), 1u);
1435     EXPECT_EQ(le16toh(entity->entity_container_id), 2u);
1436     start += sizeof(pldm_entity);
1437     EXPECT_EQ(*start, pldm_entity_get_num_children(
1438                           l3a, PLDM_ENTITY_ASSOCIAION_PHYSICAL));
1439     start += sizeof(uint8_t);
1440     entity = reinterpret_cast<pldm_entity*>(start);
1441     EXPECT_EQ(le16toh(entity->entity_type), 6u);
1442     EXPECT_EQ(le16toh(entity->entity_instance_num), 1u);
1443     EXPECT_EQ(le16toh(entity->entity_container_id), 3u);
1444 
1445     currRecHandle = nextRecHandle;
1446 
1447     pldm_pdr_find_record(repo, currRecHandle, &data, &size, &nextRecHandle);
1448     EXPECT_EQ(size, commonSize + (pldm_entity_get_num_children(
1449                                       l3b, PLDM_ENTITY_ASSOCIAION_LOGICAL) *
1450                                   sizeof(pldm_entity)));
1451     start = data;
1452     hdr = reinterpret_cast<pldm_pdr_hdr*>(start);
1453     EXPECT_EQ(le32toh(hdr->record_handle), 6u);
1454     EXPECT_EQ(hdr->type, PLDM_PDR_ENTITY_ASSOCIATION);
1455     EXPECT_EQ(le16toh(hdr->length), size - sizeof(struct pldm_pdr_hdr));
1456     start += sizeof(pldm_pdr_hdr);
1457     containerId = reinterpret_cast<uint16_t*>(start);
1458     EXPECT_EQ(le16toh(*containerId), 4u);
1459     start += sizeof(uint16_t);
1460     EXPECT_EQ(*start, PLDM_ENTITY_ASSOCIAION_LOGICAL);
1461     start += sizeof(uint8_t);
1462     entity = reinterpret_cast<pldm_entity*>(start);
1463     EXPECT_EQ(le16toh(entity->entity_type), 5u);
1464     EXPECT_EQ(le16toh(entity->entity_instance_num), 1u);
1465     EXPECT_EQ(le16toh(entity->entity_container_id), 2u);
1466     start += sizeof(pldm_entity);
1467     EXPECT_EQ(*start, pldm_entity_get_num_children(
1468                           l3b, PLDM_ENTITY_ASSOCIAION_LOGICAL));
1469     start += sizeof(uint8_t);
1470     entity = reinterpret_cast<pldm_entity*>(start);
1471     EXPECT_EQ(le16toh(entity->entity_type), 7u);
1472     EXPECT_EQ(le16toh(entity->entity_instance_num), 1u);
1473     EXPECT_EQ(le16toh(entity->entity_container_id), 4u);
1474 
1475     EXPECT_EQ(nextRecHandle, 0u);
1476 
1477     pldm_pdr_destroy(repo);
1478     pldm_entity_association_tree_destroy(tree);
1479 }
1480 
TEST(EntityAssociationPDR,testFind)1481 TEST(EntityAssociationPDR, testFind)
1482 {
1483     //        1
1484     //        |
1485     //        2--3--4
1486     //        |
1487     //        5--6--7
1488     //        |  |
1489     //        8  9
1490 
1491     pldm_entity entities[9]{};
1492 
1493     entities[0].entity_type = 1;
1494     entities[1].entity_type = 2;
1495     entities[2].entity_type = 2;
1496     entities[3].entity_type = 3;
1497     entities[4].entity_type = 4;
1498     entities[5].entity_type = 5;
1499     entities[6].entity_type = 5;
1500     entities[7].entity_type = 6;
1501     entities[8].entity_type = 7;
1502 
1503     auto tree = pldm_entity_association_tree_init();
1504 
1505     auto l1 = pldm_entity_association_tree_add(
1506         tree, &entities[0], 0xffff, nullptr, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
1507     EXPECT_NE(l1, nullptr);
1508     auto l2a = pldm_entity_association_tree_add(
1509         tree, &entities[1], 0xffff, l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
1510     EXPECT_NE(l2a, nullptr);
1511     auto l2b = pldm_entity_association_tree_add(
1512         tree, &entities[2], 0xffff, l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
1513     EXPECT_NE(l2b, nullptr);
1514     auto l2c = pldm_entity_association_tree_add(
1515         tree, &entities[3], 0xffff, l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
1516     EXPECT_NE(l2c, nullptr);
1517     auto l3a = pldm_entity_association_tree_add(
1518         tree, &entities[4], 0xffff, l2a, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
1519     EXPECT_NE(l3a, nullptr);
1520     auto l3b = pldm_entity_association_tree_add(
1521         tree, &entities[5], 0xffff, l2a, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
1522     EXPECT_NE(l3b, nullptr);
1523     auto l3c = pldm_entity_association_tree_add(
1524         tree, &entities[6], 0xffff, l2a, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
1525     EXPECT_NE(l3c, nullptr);
1526     auto l4a = pldm_entity_association_tree_add(
1527         tree, &entities[7], 0xffff, l3a, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
1528     EXPECT_NE(l4a, nullptr);
1529     auto l4b = pldm_entity_association_tree_add(
1530         tree, &entities[8], 0xffff, l3b, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
1531     EXPECT_NE(l4b, nullptr);
1532 
1533     pldm_entity entity{};
1534 
1535     entity.entity_type = 1;
1536     entity.entity_instance_num = 1;
1537     auto result = pldm_entity_association_tree_find(tree, &entity);
1538     EXPECT_EQ(result, l1);
1539     EXPECT_EQ(entity.entity_container_id, 0);
1540 
1541     entity.entity_type = 2;
1542     entity.entity_instance_num = 1;
1543     result = pldm_entity_association_tree_find(tree, &entity);
1544     EXPECT_EQ(result, l2a);
1545     EXPECT_EQ(entity.entity_container_id, 1);
1546     entity.entity_type = 2;
1547     entity.entity_instance_num = 2;
1548     result = pldm_entity_association_tree_find(tree, &entity);
1549     EXPECT_EQ(result, l2b);
1550     EXPECT_EQ(entity.entity_container_id, 1);
1551     entity.entity_type = 3;
1552     entity.entity_instance_num = 1;
1553     result = pldm_entity_association_tree_find(tree, &entity);
1554     EXPECT_EQ(result, l2c);
1555     EXPECT_EQ(entity.entity_container_id, 1);
1556 
1557     entity.entity_type = 7;
1558     entity.entity_instance_num = 1;
1559     result = pldm_entity_association_tree_find(tree, &entity);
1560     EXPECT_EQ(result, l4b);
1561     EXPECT_EQ(entity.entity_container_id, 4);
1562 
1563     pldm_entity_association_tree_destroy(tree);
1564 }
1565 
TEST(EntityAssociationPDR,testCopyTree)1566 TEST(EntityAssociationPDR, testCopyTree)
1567 {
1568     pldm_entity entities[4]{};
1569     entities[0].entity_type = 1;
1570     entities[1].entity_type = 2;
1571     entities[2].entity_type = 2;
1572     entities[3].entity_type = 3;
1573 
1574     auto orgTree = pldm_entity_association_tree_init();
1575     auto newTree = pldm_entity_association_tree_init();
1576     auto l1 =
1577         pldm_entity_association_tree_add(orgTree, &entities[0], 0xffff, nullptr,
1578                                          PLDM_ENTITY_ASSOCIAION_PHYSICAL);
1579     EXPECT_NE(l1, nullptr);
1580     auto l2a = pldm_entity_association_tree_add(
1581         orgTree, &entities[1], 0xffff, l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
1582     EXPECT_NE(l2a, nullptr);
1583     auto l2b = pldm_entity_association_tree_add(
1584         orgTree, &entities[2], 0xffff, l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
1585     EXPECT_NE(l2b, nullptr);
1586     auto l2c = pldm_entity_association_tree_add(
1587         orgTree, &entities[3], 0xffff, l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
1588     EXPECT_NE(l2c, nullptr);
1589     size_t orgNum{};
1590     pldm_entity* orgOut = nullptr;
1591     pldm_entity_association_tree_visit(orgTree, &orgOut, &orgNum);
1592     EXPECT_EQ(orgNum, 4u);
1593 
1594     pldm_entity_association_tree_copy_root(orgTree, newTree);
1595     size_t newNum{};
1596     pldm_entity* newOut = nullptr;
1597     pldm_entity_association_tree_visit(newTree, &newOut, &newNum);
1598     EXPECT_EQ(newNum, orgNum);
1599     EXPECT_EQ(newOut[0].entity_type, 1u);
1600     EXPECT_EQ(newOut[0].entity_instance_num, 1u);
1601     EXPECT_EQ(newOut[0].entity_container_id, 0u);
1602     free(orgOut);
1603     free(newOut);
1604     pldm_entity_association_tree_destroy(orgTree);
1605     pldm_entity_association_tree_destroy(newTree);
1606 }
1607 
TEST(EntityAssociationPDR,testExtract)1608 TEST(EntityAssociationPDR, testExtract)
1609 {
1610     std::vector<uint8_t> pdr{};
1611     pdr.resize(sizeof(pldm_pdr_hdr) + sizeof(pldm_pdr_entity_association) +
1612                sizeof(pldm_entity) * 4);
1613     pldm_pdr_hdr* hdr = reinterpret_cast<pldm_pdr_hdr*>(pdr.data());
1614     hdr->type = PLDM_PDR_ENTITY_ASSOCIATION;
1615     hdr->length =
1616         htole16(sizeof(pldm_pdr_entity_association) + sizeof(pldm_entity) * 4);
1617 
1618     pldm_pdr_entity_association* e =
1619         reinterpret_cast<pldm_pdr_entity_association*>(pdr.data() +
1620                                                        sizeof(pldm_pdr_hdr));
1621     e->container_id = htole16(1);
1622     e->num_children = 5;
1623     e->container.entity_type = htole16(1);
1624     e->container.entity_instance_num = htole16(1);
1625     e->container.entity_container_id = htole16(0);
1626 
1627     pldm_entity* entity = e->children;
1628     entity->entity_type = htole16(2);
1629     entity->entity_instance_num = htole16(1);
1630     entity->entity_container_id = htole16(1);
1631     ++entity;
1632     entity->entity_type = htole16(3);
1633     entity->entity_instance_num = htole16(1);
1634     entity->entity_container_id = htole16(1);
1635     ++entity;
1636     entity->entity_type = htole16(4);
1637     entity->entity_instance_num = htole16(1);
1638     entity->entity_container_id = htole16(1);
1639     ++entity;
1640     entity->entity_type = htole16(5);
1641     entity->entity_instance_num = htole16(1);
1642     entity->entity_container_id = htole16(1);
1643     ++entity;
1644     entity->entity_type = htole16(6);
1645     entity->entity_instance_num = htole16(1);
1646     entity->entity_container_id = htole16(1);
1647 
1648     size_t num{};
1649     pldm_entity* out = nullptr;
1650     pldm_entity_association_pdr_extract(pdr.data(), pdr.size(), &num, &out);
1651     EXPECT_EQ(num, (unsigned)e->num_children + 1);
1652     EXPECT_EQ(out[0].entity_type, 1u);
1653     EXPECT_EQ(out[0].entity_instance_num, 1u);
1654     EXPECT_EQ(out[0].entity_container_id, 0u);
1655     EXPECT_EQ(out[1].entity_type, 2u);
1656     EXPECT_EQ(out[1].entity_instance_num, 1u);
1657     EXPECT_EQ(out[1].entity_container_id, 1u);
1658     EXPECT_EQ(out[2].entity_type, 3u);
1659     EXPECT_EQ(out[2].entity_instance_num, 1u);
1660     EXPECT_EQ(out[2].entity_container_id, 1u);
1661     EXPECT_EQ(out[3].entity_type, 4u);
1662     EXPECT_EQ(out[3].entity_instance_num, 1u);
1663     EXPECT_EQ(out[3].entity_container_id, 1u);
1664     EXPECT_EQ(out[4].entity_type, 5u);
1665     EXPECT_EQ(out[4].entity_instance_num, 1u);
1666     EXPECT_EQ(out[4].entity_container_id, 1u);
1667     EXPECT_EQ(out[5].entity_type, 6u);
1668     EXPECT_EQ(out[5].entity_instance_num, 1u);
1669     EXPECT_EQ(out[5].entity_container_id, 1u);
1670 
1671     free(out);
1672 }
1673 
TEST(EntityAssociationPDR,testGetChildren)1674 TEST(EntityAssociationPDR, testGetChildren)
1675 {
1676     pldm_entity entities[4]{};
1677     entities[0].entity_type = 1;
1678     entities[1].entity_type = 2;
1679     entities[2].entity_type = 2;
1680     entities[3].entity_type = 3;
1681 
1682     auto tree = pldm_entity_association_tree_init();
1683     auto l1 = pldm_entity_association_tree_add(
1684         tree, &entities[0], 0xffff, nullptr, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
1685     EXPECT_NE(l1, nullptr);
1686     auto l2a = pldm_entity_association_tree_add(
1687         tree, &entities[1], 0xffff, l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
1688     EXPECT_NE(l2a, nullptr);
1689     auto l2b = pldm_entity_association_tree_add(
1690         tree, &entities[2], 0xffff, l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
1691     EXPECT_NE(l2b, nullptr);
1692     auto l2c = pldm_entity_association_tree_add(
1693         tree, &entities[3], 0xffff, l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
1694     EXPECT_NE(l2c, nullptr);
1695 
1696     pldm_entity et1;
1697     et1.entity_type = 2;
1698     et1.entity_instance_num = 1;
1699     EXPECT_EQ(true, pldm_is_current_parent_child(l1, &et1));
1700 
1701     pldm_entity et2;
1702     et2.entity_type = 2;
1703     et2.entity_instance_num = 2;
1704     EXPECT_EQ(true, pldm_is_current_parent_child(l1, &et2));
1705 
1706     pldm_entity et3;
1707     et3.entity_type = 2;
1708     et3.entity_instance_num = 3;
1709     EXPECT_EQ(false, pldm_is_current_parent_child(l1, &et3));
1710 
1711     pldm_entity_association_tree_destroy(tree);
1712 }
1713 
TEST(EntityAssociationPDR,testEntityInstanceNumber)1714 TEST(EntityAssociationPDR, testEntityInstanceNumber)
1715 {
1716     pldm_entity entities[9]{};
1717 
1718     entities[0].entity_type = 1;
1719     entities[1].entity_type = 2;
1720     entities[2].entity_type = 2;
1721     entities[3].entity_type = 2;
1722     entities[4].entity_type = 2;
1723     entities[5].entity_type = 2;
1724     entities[6].entity_type = 2;
1725     entities[7].entity_type = 3;
1726     entities[8].entity_type = 3;
1727 
1728     auto tree = pldm_entity_association_tree_init();
1729     auto repo = pldm_pdr_init();
1730 
1731     uint16_t terminusHdl{};
1732     uint16_t entityType{};
1733     uint16_t entityInstanceNum{};
1734     uint16_t containerId{};
1735 
1736     auto node = pldm_entity_association_tree_add(
1737         tree, &entities[0], 0xffff, nullptr, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
1738     EXPECT_NE(node, nullptr);
1739 
1740     auto l1 = pldm_entity_association_tree_add(tree, &entities[1], 63, node,
1741                                                PLDM_ENTITY_ASSOCIAION_PHYSICAL);
1742     uint32_t first = 1;
1743     EXPECT_EQ(pldm_pdr_add_fru_record_set_check(
1744                   repo, 1, 1, entities[1].entity_type,
1745                   entities[1].entity_instance_num,
1746                   entities[1].entity_container_id, &first),
1747               0);
1748     EXPECT_NE(l1, nullptr);
1749     EXPECT_EQ(entities[1].entity_instance_num, 63);
1750     EXPECT_EQ(first, pldm_pdr_get_record_handle(
1751                          repo, pldm_pdr_fru_record_set_find_by_rsi(
1752                                    repo, 1, &terminusHdl, &entityType,
1753                                    &entityInstanceNum, &containerId)));
1754     EXPECT_EQ(entityType, 2);
1755     EXPECT_EQ(entityInstanceNum, 63);
1756 
1757     auto l2 = pldm_entity_association_tree_add(tree, &entities[2], 37, node,
1758                                                PLDM_ENTITY_ASSOCIAION_PHYSICAL);
1759     uint32_t second = 2;
1760     EXPECT_EQ(pldm_pdr_add_fru_record_set_check(
1761                   repo, 1, 2, entities[2].entity_type,
1762                   entities[2].entity_instance_num,
1763                   entities[2].entity_container_id, &second),
1764               0);
1765     EXPECT_NE(l2, nullptr);
1766     EXPECT_EQ(entities[2].entity_instance_num, 37);
1767     EXPECT_EQ(second, pldm_pdr_get_record_handle(
1768                           repo, pldm_pdr_fru_record_set_find_by_rsi(
1769                                     repo, 2, &terminusHdl, &entityType,
1770                                     &entityInstanceNum, &containerId)));
1771     EXPECT_EQ(entityType, 2);
1772     EXPECT_EQ(entityInstanceNum, 37);
1773 
1774     auto l3 = pldm_entity_association_tree_add(tree, &entities[3], 44, node,
1775                                                PLDM_ENTITY_ASSOCIAION_PHYSICAL);
1776     uint32_t third = 3;
1777     EXPECT_EQ(pldm_pdr_add_fru_record_set_check(
1778                   repo, 1, 3, entities[3].entity_type,
1779                   entities[3].entity_instance_num,
1780                   entities[3].entity_container_id, &third),
1781               0);
1782     EXPECT_NE(l3, nullptr);
1783     EXPECT_EQ(entities[3].entity_instance_num, 44);
1784     EXPECT_EQ(third, pldm_pdr_get_record_handle(
1785                          repo, pldm_pdr_fru_record_set_find_by_rsi(
1786                                    repo, 3, &terminusHdl, &entityType,
1787                                    &entityInstanceNum, &containerId)));
1788     EXPECT_EQ(entityType, 2);
1789     EXPECT_EQ(entityInstanceNum, 44);
1790 
1791     auto l4 = pldm_entity_association_tree_add(tree, &entities[4], 89, node,
1792                                                PLDM_ENTITY_ASSOCIAION_PHYSICAL);
1793     uint32_t fourth = 4;
1794     EXPECT_EQ(pldm_pdr_add_fru_record_set_check(
1795                   repo, 1, 4, entities[4].entity_type,
1796                   entities[4].entity_instance_num,
1797                   entities[4].entity_container_id, &fourth),
1798               0);
1799     EXPECT_NE(l4, nullptr);
1800     EXPECT_EQ(entities[4].entity_instance_num, 89);
1801     EXPECT_EQ(fourth, pldm_pdr_get_record_handle(
1802                           repo, pldm_pdr_fru_record_set_find_by_rsi(
1803                                     repo, 4, &terminusHdl, &entityType,
1804                                     &entityInstanceNum, &containerId)));
1805     EXPECT_EQ(entityType, 2);
1806     EXPECT_EQ(entityInstanceNum, 89);
1807 
1808     auto l5 = pldm_entity_association_tree_add(tree, &entities[5], 0xffff, node,
1809                                                PLDM_ENTITY_ASSOCIAION_PHYSICAL);
1810     uint32_t fifth = 5;
1811     EXPECT_EQ(pldm_pdr_add_fru_record_set_check(
1812                   repo, 1, 5, entities[5].entity_type,
1813                   entities[5].entity_instance_num,
1814                   entities[5].entity_container_id, &fifth),
1815               0);
1816     EXPECT_NE(l5, nullptr);
1817     EXPECT_EQ(entities[5].entity_instance_num, 90);
1818     EXPECT_EQ(fifth, pldm_pdr_get_record_handle(
1819                          repo, pldm_pdr_fru_record_set_find_by_rsi(
1820                                    repo, 5, &terminusHdl, &entityType,
1821                                    &entityInstanceNum, &containerId)));
1822     EXPECT_EQ(entityType, 2);
1823     EXPECT_EQ(entityInstanceNum, 90);
1824 
1825     auto l6 = pldm_entity_association_tree_add(tree, &entities[6], 90, node,
1826                                                PLDM_ENTITY_ASSOCIAION_PHYSICAL);
1827     EXPECT_EQ(l6, nullptr);
1828 
1829     auto l7 = pldm_entity_association_tree_add(tree, &entities[7], 100, l1,
1830                                                PLDM_ENTITY_ASSOCIAION_PHYSICAL);
1831     uint32_t seventh = 7;
1832     EXPECT_EQ(pldm_pdr_add_fru_record_set_check(
1833                   repo, 1, 7, entities[7].entity_type,
1834                   entities[7].entity_instance_num,
1835                   entities[7].entity_container_id, &seventh),
1836               0);
1837     EXPECT_NE(l7, nullptr);
1838     EXPECT_EQ(entities[7].entity_instance_num, 100);
1839     EXPECT_EQ(seventh, pldm_pdr_get_record_handle(
1840                            repo, pldm_pdr_fru_record_set_find_by_rsi(
1841                                      repo, 7, &terminusHdl, &entityType,
1842                                      &entityInstanceNum, &containerId)));
1843     EXPECT_EQ(entityType, 3);
1844     EXPECT_EQ(entityInstanceNum, 100);
1845 
1846     auto l8 = pldm_entity_association_tree_add(tree, &entities[8], 100, l2,
1847                                                PLDM_ENTITY_ASSOCIAION_PHYSICAL);
1848     uint32_t eighth = 8;
1849     EXPECT_EQ(pldm_pdr_add_fru_record_set_check(
1850                   repo, 1, 8, entities[8].entity_type,
1851                   entities[8].entity_instance_num,
1852                   entities[8].entity_container_id, &eighth),
1853               0);
1854     EXPECT_NE(l8, nullptr);
1855     EXPECT_EQ(entities[8].entity_instance_num, 100);
1856     EXPECT_EQ(eighth, pldm_pdr_get_record_handle(
1857                           repo, pldm_pdr_fru_record_set_find_by_rsi(
1858                                     repo, 8, &terminusHdl, &entityType,
1859                                     &entityInstanceNum, &containerId)));
1860     EXPECT_EQ(entityType, 3);
1861     EXPECT_EQ(entityInstanceNum, 100);
1862 
1863     pldm_pdr_destroy(repo);
1864     pldm_entity_association_tree_destroy(tree);
1865 }
1866 
1867 #ifdef LIBPLDM_API_TESTING
TEST(EntityAssociationPDR,testFindChildContainerID)1868 TEST(EntityAssociationPDR, testFindChildContainerID)
1869 {
1870     pldm_entity entities[3]{};
1871     entities[0].entity_type = 1;
1872     entities[1].entity_type = 2;
1873     entities[2].entity_type = 3;
1874     entities[1].entity_container_id = 2;
1875     entities[1].entity_instance_num = 1;
1876 
1877     auto tree = pldm_entity_association_tree_init();
1878     auto l1 = pldm_entity_association_tree_add_entity(
1879         tree, &entities[0], 0xffff, nullptr, PLDM_ENTITY_ASSOCIAION_LOGICAL,
1880         false, true, 0xffff);
1881 
1882     EXPECT_NE(l1, nullptr);
1883     auto l2 = pldm_entity_association_tree_add_entity(
1884         tree, &entities[1], 0xffff, l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL, false,
1885         false, 0xffff);
1886     EXPECT_NE(l2, nullptr);
1887     auto l3 = pldm_entity_association_tree_add_entity(
1888         tree, &entities[2], 0xffff, l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL, false,
1889         true, 0xffff);
1890     EXPECT_NE(l3, nullptr);
1891 
1892     EXPECT_EQ(pldm_entity_get_num_children(l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL),
1893               2);
1894 
1895     auto repo = pldm_pdr_init();
1896     int rc = pldm_entity_association_pdr_add_check(tree, repo, false, 1);
1897     ASSERT_EQ(rc, 0);
1898 
1899     EXPECT_EQ(pldm_pdr_get_record_count(repo), 1u);
1900 
1901     uint16_t container_id{};
1902     pldm_pdr_find_child_container_id_index_range_exclude(
1903         repo, 1, 1, 0, 0x01000000, 0x01ffffff, &container_id);
1904     EXPECT_EQ(container_id, 2);
1905 
1906     uint16_t container_id1{};
1907     pldm_pdr_find_child_container_id_index_range_exclude(
1908         repo, 1, 1, 0, 0x00000001, 0x00ffffff, &container_id1);
1909     EXPECT_EQ(container_id1, 0);
1910 
1911     pldm_pdr_destroy(repo);
1912     pldm_entity_association_tree_destroy(tree);
1913 }
1914 #endif
1915 
TEST(EntityAssociationPDR,testNodeAddCheck)1916 TEST(EntityAssociationPDR, testNodeAddCheck)
1917 {
1918     // pldm_entity entities[4]{};
1919     pldm_entity* entities = (pldm_entity*)malloc(sizeof(pldm_entity) * 4);
1920     entities[0].entity_type = 1;
1921     entities[1].entity_type = 2;
1922     entities[2].entity_type = 2;
1923     entities[3].entity_type = 3;
1924 
1925     auto tree = pldm_entity_association_tree_init();
1926 
1927     auto l1 = pldm_entity_association_tree_add(
1928         tree, &entities[0], 0xffff, nullptr, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
1929     EXPECT_NE(l1, nullptr);
1930     auto l2a = pldm_entity_association_tree_add(
1931         tree, &entities[1], 0xffff, l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
1932     EXPECT_NE(l2a, nullptr);
1933     auto l2b = pldm_entity_association_tree_add(
1934         tree, &entities[2], 0xffff, l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
1935     EXPECT_NE(l2b, nullptr);
1936     auto l2c = pldm_entity_association_tree_add(
1937         tree, &entities[3], 0xffff, l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
1938     EXPECT_NE(l2c, nullptr);
1939 
1940     auto repo = pldm_pdr_init();
1941 
1942     EXPECT_EQ(pldm_entity_association_pdr_add_from_node_with_record_handle(
1943                   l1, repo, &entities, 4, false, 1, 0),
1944               0);
1945     EXPECT_EQ(pldm_entity_association_pdr_add_from_node_with_record_handle(
1946                   l1, repo, &entities, 4, false, 1, 2),
1947               0);
1948     EXPECT_EQ(pldm_entity_association_pdr_add_from_node_with_record_handle(
1949                   l1, repo, &entities, 4, false, 1, 23),
1950               0);
1951     EXPECT_EQ(pldm_entity_association_pdr_add_from_node_with_record_handle(
1952                   l1, repo, &entities, 4, false, 1, 34),
1953               0);
1954 
1955     EXPECT_EQ(pldm_pdr_get_record_count(repo), 4u);
1956 
1957     uint8_t* outData = nullptr;
1958     uint32_t size{};
1959     uint32_t nextRecHdl{};
1960     auto hdl = pldm_pdr_find_record(repo, 0, &outData, &size, &nextRecHdl);
1961     EXPECT_NE(hdl, nullptr);
1962 
1963     outData = nullptr;
1964     auto hdl1 = pldm_pdr_find_record(repo, 2, &outData, &size, &nextRecHdl);
1965     EXPECT_NE(hdl1, nullptr);
1966     pldm_pdr_hdr* hdr = reinterpret_cast<pldm_pdr_hdr*>(outData);
1967     EXPECT_EQ(hdr->record_handle, 2);
1968 
1969     outData = nullptr;
1970     auto hdl2 = pldm_pdr_find_record(repo, 23, &outData, &size, &nextRecHdl);
1971     EXPECT_NE(hdl2, nullptr);
1972     pldm_pdr_hdr* hdr1 = reinterpret_cast<pldm_pdr_hdr*>(outData);
1973     EXPECT_EQ(hdr1->record_handle, 23);
1974 
1975     outData = nullptr;
1976     auto hdl3 = pldm_pdr_find_record(repo, 3, &outData, &size, &nextRecHdl);
1977     EXPECT_EQ(hdl3, nullptr);
1978 
1979     free(entities);
1980     pldm_pdr_destroy(repo);
1981     pldm_entity_association_tree_destroy(tree);
1982 }
1983 
1984 #ifdef LIBPLDM_API_TESTING
TEST(EntityAssociationPDR,testAddContainedEntityRemotePDR)1985 TEST(EntityAssociationPDR, testAddContainedEntityRemotePDR)
1986 {
1987     // pldm_entity entities[5]{};
1988     pldm_entity* entities = (pldm_entity*)malloc(sizeof(pldm_entity) * 5);
1989     entities[0].entity_type = 1;
1990     entities[1].entity_type = 2;
1991     entities[2].entity_type = 3;
1992     entities[3].entity_type = 4;
1993     entities[4].entity_type = 5;
1994 
1995     auto tree = pldm_entity_association_tree_init();
1996     auto l1 = pldm_entity_association_tree_add(
1997         tree, &entities[0], 0xffff, nullptr, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
1998     EXPECT_NE(l1, nullptr);
1999     auto l2a = pldm_entity_association_tree_add(
2000         tree, &entities[1], 0xffff, l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
2001     EXPECT_NE(l2a, nullptr);
2002     auto l2b = pldm_entity_association_tree_add(
2003         tree, &entities[2], 0xffff, l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
2004     EXPECT_NE(l2b, nullptr);
2005     auto l2c = pldm_entity_association_tree_add(
2006         tree, &entities[3], 0xffff, l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
2007     EXPECT_NE(l2c, nullptr);
2008     auto l3a = pldm_entity_association_tree_add(
2009         tree, &entities[4], 0xffff, l2a, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
2010     EXPECT_NE(l3a, nullptr);
2011 
2012     auto repo = pldm_pdr_init();
2013 
2014     EXPECT_EQ(pldm_entity_association_pdr_add_from_node_with_record_handle(
2015                   l1, repo, &entities, 5, false, 1, 0),
2016               0);
2017     EXPECT_EQ(pldm_entity_association_pdr_add_from_node_with_record_handle(
2018                   l1, repo, &entities, 5, false, 1, 2),
2019               0);
2020     EXPECT_EQ(pldm_entity_association_pdr_add_from_node_with_record_handle(
2021                   l1, repo, &entities, 5, false, 1, 23),
2022               0);
2023     EXPECT_EQ(pldm_entity_association_pdr_add_from_node_with_record_handle(
2024                   l1, repo, &entities, 5, false, 1, 34),
2025               0);
2026     EXPECT_EQ(pldm_entity_association_pdr_add_from_node_with_record_handle(
2027                   l2a, repo, &entities, 5, false, 1, 3),
2028               0);
2029 
2030     pldm_entity entity1[1];
2031     entity1[0].entity_type = 2;
2032 
2033     EXPECT_EQ(pldm_entity_association_pdr_add_contained_entity_to_remote_pdr(
2034                   repo, &entity1[0], 2),
2035               0);
2036 
2037     free(entities);
2038     pldm_pdr_destroy(repo);
2039     pldm_entity_association_tree_destroy(tree);
2040 }
2041 #endif
2042 
2043 #ifdef LIBPLDM_API_TESTING
TEST(EntityAssociationPDR,testAddContainedEntityNew)2044 TEST(EntityAssociationPDR, testAddContainedEntityNew)
2045 {
2046     // pldm_entity entities[5]{};
2047     pldm_entity* entities = (pldm_entity*)malloc(sizeof(pldm_entity) * 5);
2048     entities[0].entity_type = 1;
2049     entities[1].entity_type = 2;
2050     entities[2].entity_type = 3;
2051     entities[3].entity_type = 4;
2052     entities[4].entity_type = 5;
2053 
2054     auto tree = pldm_entity_association_tree_init();
2055     auto l1 = pldm_entity_association_tree_add(
2056         tree, &entities[0], 0xffff, nullptr, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
2057     EXPECT_NE(l1, nullptr);
2058     auto l2a = pldm_entity_association_tree_add(
2059         tree, &entities[1], 0xffff, l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
2060     EXPECT_NE(l2a, nullptr);
2061     auto l2b = pldm_entity_association_tree_add(
2062         tree, &entities[2], 0xffff, l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
2063     EXPECT_NE(l2b, nullptr);
2064     auto l2c = pldm_entity_association_tree_add(
2065         tree, &entities[3], 0xffff, l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
2066     EXPECT_NE(l2c, nullptr);
2067     auto l3a = pldm_entity_association_tree_add(
2068         tree, &entities[4], 0xffff, l2a, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
2069     EXPECT_NE(l3a, nullptr);
2070 
2071     auto repo = pldm_pdr_init();
2072 
2073     EXPECT_EQ(pldm_entity_association_pdr_add_from_node_with_record_handle(
2074                   l1, repo, &entities, 5, false, 1, 0),
2075               0);
2076     EXPECT_EQ(pldm_entity_association_pdr_add_from_node_with_record_handle(
2077                   l1, repo, &entities, 5, false, 1, 2),
2078               0);
2079     EXPECT_EQ(pldm_entity_association_pdr_add_from_node_with_record_handle(
2080                   l1, repo, &entities, 5, false, 1, 23),
2081               0);
2082     EXPECT_EQ(pldm_entity_association_pdr_add_from_node_with_record_handle(
2083                   l1, repo, &entities, 5, false, 1, 34),
2084               0);
2085     EXPECT_EQ(pldm_entity_association_pdr_add_from_node_with_record_handle(
2086                   l2a, repo, &entities, 5, false, 1, 3),
2087               0);
2088 
2089     uint32_t updated_record_handle = 0;
2090 
2091     pldm_entity entity2[1]{};
2092     entity2[0].entity_type = 4;
2093 
2094     pldm_entity entity3[1]{};
2095     entity3[0].entity_type = 4;
2096 
2097     EXPECT_EQ(pldm_entity_association_pdr_create_new(
2098                   repo, 34, &entity2[0], &entity3[0], &updated_record_handle),
2099               0);
2100 
2101     EXPECT_EQ(updated_record_handle, 35);
2102 
2103     free(entities);
2104     pldm_pdr_destroy(repo);
2105     pldm_entity_association_tree_destroy(tree);
2106 }
2107 #endif
2108