xref: /openbmc/libpldm/tests/dsp/pdr.cpp (revision e4240679)
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 
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 
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 
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 
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 
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 
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 
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 
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 
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
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 TEST(EntityAssociationPDR, testInit)
728 {
729     auto tree = pldm_entity_association_tree_init();
730     EXPECT_NE(tree, nullptr);
731     pldm_entity_association_tree_destroy(tree);
732 }
733 
734 TEST(EntityAssociationPDR, testBuild)
735 {
736     //        1
737     //        |
738     //        2--3--4
739     //        |
740     //        5--6--7
741     //        |  |
742     //        9  8
743 
744     pldm_entity entities[9]{};
745 
746     entities[0].entity_type = 1;
747     entities[1].entity_type = 2;
748     entities[2].entity_type = 2;
749     entities[3].entity_type = 3;
750     entities[4].entity_type = 4;
751     entities[5].entity_type = 5;
752     entities[6].entity_type = 5;
753     entities[7].entity_type = 6;
754     entities[8].entity_type = 7;
755 
756     auto tree = pldm_entity_association_tree_init();
757 
758     auto l1 = pldm_entity_association_tree_add(
759         tree, &entities[0], 0xffff, nullptr, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
760     EXPECT_NE(l1, nullptr);
761     auto l2a = pldm_entity_association_tree_add(
762         tree, &entities[1], 0xffff, l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
763     EXPECT_NE(l2a, nullptr);
764     auto l2b = pldm_entity_association_tree_add(
765         tree, &entities[2], 0xffff, l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
766     EXPECT_NE(l2b, nullptr);
767     auto l2c = pldm_entity_association_tree_add(
768         tree, &entities[3], 0xffff, l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
769     EXPECT_NE(l2c, nullptr);
770     auto l3a = pldm_entity_association_tree_add(
771         tree, &entities[4], 0xffff, l2a, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
772     EXPECT_NE(l3a, nullptr);
773     auto l3b = pldm_entity_association_tree_add(
774         tree, &entities[5], 0xffff, l2a, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
775     EXPECT_NE(l3b, nullptr);
776     auto l3c = pldm_entity_association_tree_add(
777         tree, &entities[6], 0xffff, l2a, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
778     EXPECT_NE(l3b, nullptr);
779     auto l4a = pldm_entity_association_tree_add(
780         tree, &entities[7], 0xffff, l3a, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
781     EXPECT_NE(l4a, nullptr);
782     auto l4b = pldm_entity_association_tree_add(
783         tree, &entities[8], 0xffff, l3b, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
784     EXPECT_NE(l4b, nullptr);
785 
786     EXPECT_EQ(pldm_entity_is_node_parent(l1), true);
787     EXPECT_EQ(pldm_entity_is_node_parent(l2a), true);
788     EXPECT_EQ(pldm_entity_is_node_parent(l3a), true);
789     EXPECT_EQ(pldm_entity_is_node_parent(l3b), true);
790 
791     EXPECT_EQ(pldm_entity_is_node_parent(l2b), false);
792     EXPECT_EQ(pldm_entity_is_node_parent(l2c), false);
793     EXPECT_EQ(pldm_entity_is_node_parent(l3c), false);
794     EXPECT_EQ(pldm_entity_is_node_parent(l4a), false);
795     EXPECT_EQ(pldm_entity_is_node_parent(l4b), false);
796 
797     EXPECT_EQ(pldm_entity_is_exist_parent(l1), false);
798 
799     pldm_entity nodeL1 = pldm_entity_extract(l1);
800     pldm_entity parentL2a = pldm_entity_get_parent(l2a);
801     pldm_entity parentL2b = pldm_entity_get_parent(l2b);
802     pldm_entity parentL2c = pldm_entity_get_parent(l2c);
803     EXPECT_EQ(pldm_entity_is_exist_parent(l2a), true);
804     EXPECT_EQ(pldm_entity_is_exist_parent(l2b), true);
805     EXPECT_EQ(pldm_entity_is_exist_parent(l2c), true);
806     EXPECT_EQ(parentL2a.entity_type, nodeL1.entity_type);
807     EXPECT_EQ(parentL2a.entity_instance_num, nodeL1.entity_instance_num);
808     EXPECT_EQ(parentL2a.entity_container_id, nodeL1.entity_container_id);
809     EXPECT_EQ(parentL2b.entity_type, nodeL1.entity_type);
810     EXPECT_EQ(parentL2b.entity_instance_num, nodeL1.entity_instance_num);
811     EXPECT_EQ(parentL2b.entity_container_id, nodeL1.entity_container_id);
812     EXPECT_EQ(parentL2c.entity_type, nodeL1.entity_type);
813     EXPECT_EQ(parentL2c.entity_instance_num, nodeL1.entity_instance_num);
814     EXPECT_EQ(parentL2c.entity_container_id, nodeL1.entity_container_id);
815 
816     pldm_entity nodeL2a = pldm_entity_extract(l2a);
817     pldm_entity parentL3a = pldm_entity_get_parent(l3a);
818     pldm_entity parentL3b = pldm_entity_get_parent(l3b);
819     pldm_entity parentL3c = pldm_entity_get_parent(l3c);
820     EXPECT_EQ(pldm_entity_is_exist_parent(l3a), true);
821     EXPECT_EQ(pldm_entity_is_exist_parent(l3b), true);
822     EXPECT_EQ(pldm_entity_is_exist_parent(l3c), true);
823     EXPECT_EQ(parentL3a.entity_type, nodeL2a.entity_type);
824     EXPECT_EQ(parentL3a.entity_instance_num, nodeL2a.entity_instance_num);
825     EXPECT_EQ(parentL3a.entity_container_id, nodeL2a.entity_container_id);
826     EXPECT_EQ(parentL3b.entity_type, nodeL2a.entity_type);
827     EXPECT_EQ(parentL3b.entity_instance_num, nodeL2a.entity_instance_num);
828     EXPECT_EQ(parentL3b.entity_container_id, nodeL2a.entity_container_id);
829     EXPECT_EQ(parentL3c.entity_type, nodeL2a.entity_type);
830     EXPECT_EQ(parentL3c.entity_instance_num, nodeL2a.entity_instance_num);
831     EXPECT_EQ(parentL3c.entity_container_id, nodeL2a.entity_container_id);
832 
833     pldm_entity nodeL3a = pldm_entity_extract(l3a);
834     pldm_entity parentL4a = pldm_entity_get_parent(l4a);
835     EXPECT_EQ(pldm_entity_is_exist_parent(l4a), true);
836     EXPECT_EQ(parentL4a.entity_type, nodeL3a.entity_type);
837     EXPECT_EQ(parentL4a.entity_instance_num, nodeL3a.entity_instance_num);
838     EXPECT_EQ(parentL4a.entity_container_id, nodeL3a.entity_container_id);
839 
840     pldm_entity nodeL3b = pldm_entity_extract(l3b);
841     pldm_entity parentL4b = pldm_entity_get_parent(l4b);
842     EXPECT_EQ(pldm_entity_is_exist_parent(l4b), true);
843     EXPECT_EQ(parentL4b.entity_type, nodeL3b.entity_type);
844     EXPECT_EQ(parentL4b.entity_instance_num, nodeL3b.entity_instance_num);
845     EXPECT_EQ(parentL4b.entity_container_id, nodeL3b.entity_container_id);
846 
847     size_t num{};
848     pldm_entity* out = nullptr;
849     pldm_entity_association_tree_visit(tree, &out, &num);
850     EXPECT_EQ(num, 9u);
851 
852     EXPECT_EQ(out[0].entity_type, 1u);
853     EXPECT_EQ(out[0].entity_instance_num, 1u);
854     EXPECT_EQ(out[0].entity_container_id, 0u);
855 
856     EXPECT_EQ(out[1].entity_type, 2u);
857     EXPECT_EQ(out[1].entity_instance_num, 1u);
858     EXPECT_EQ(out[1].entity_container_id, 1u);
859     EXPECT_EQ(out[2].entity_type, 2u);
860     EXPECT_EQ(out[2].entity_instance_num, 2u);
861     EXPECT_EQ(out[2].entity_container_id, 1u);
862     EXPECT_EQ(out[3].entity_type, 3u);
863     EXPECT_EQ(out[3].entity_instance_num, 1u);
864     EXPECT_EQ(out[3].entity_container_id, 1u);
865 
866     EXPECT_EQ(out[4].entity_type, 4u);
867     EXPECT_EQ(out[4].entity_instance_num, 1u);
868     EXPECT_EQ(out[4].entity_container_id, 2u);
869     EXPECT_EQ(out[5].entity_type, 5u);
870     EXPECT_EQ(out[5].entity_instance_num, 1u);
871     EXPECT_EQ(out[5].entity_container_id, 2u);
872     EXPECT_EQ(out[6].entity_type, 5u);
873     EXPECT_EQ(out[6].entity_instance_num, 2u);
874     EXPECT_EQ(out[6].entity_container_id, 2u);
875 
876     EXPECT_EQ(out[7].entity_type, 7u);
877     EXPECT_EQ(out[7].entity_instance_num, 1u);
878     EXPECT_EQ(out[7].entity_container_id, 4u);
879     EXPECT_EQ(out[8].entity_type, 6u);
880     EXPECT_EQ(out[8].entity_instance_num, 1u);
881     EXPECT_EQ(out[8].entity_container_id, 3u);
882 
883     free(out);
884 
885     pldm_entity p1 = pldm_entity_extract(l1);
886     EXPECT_EQ(p1.entity_type, 1u);
887     EXPECT_EQ(p1.entity_instance_num, 1u);
888     EXPECT_EQ(p1.entity_container_id, 0u);
889 
890     pldm_entity p2a = pldm_entity_extract(l2a);
891     EXPECT_EQ(p2a.entity_type, 2u);
892     EXPECT_EQ(p2a.entity_instance_num, 1u);
893     EXPECT_EQ(p2a.entity_container_id, 1u);
894     pldm_entity p2b = pldm_entity_extract(l2b);
895     EXPECT_EQ(p2b.entity_type, 2u);
896     EXPECT_EQ(p2b.entity_instance_num, 2u);
897     EXPECT_EQ(p2b.entity_container_id, 1u);
898     pldm_entity p2c = pldm_entity_extract(l2c);
899     EXPECT_EQ(p2c.entity_type, 3u);
900     EXPECT_EQ(p2c.entity_instance_num, 1u);
901     EXPECT_EQ(p2c.entity_container_id, 1u);
902 
903     pldm_entity p3a = pldm_entity_extract(l3a);
904     EXPECT_EQ(p3a.entity_type, 4u);
905     EXPECT_EQ(p3a.entity_instance_num, 1u);
906     EXPECT_EQ(p3a.entity_container_id, 2u);
907     pldm_entity p3b = pldm_entity_extract(l3b);
908     EXPECT_EQ(p3b.entity_type, 5u);
909     EXPECT_EQ(p3b.entity_instance_num, 1u);
910     EXPECT_EQ(p3b.entity_container_id, 2u);
911     pldm_entity p3c = pldm_entity_extract(l3c);
912     EXPECT_EQ(p3c.entity_type, 5u);
913     EXPECT_EQ(p3c.entity_instance_num, 2u);
914     EXPECT_EQ(p3c.entity_container_id, 2u);
915 
916     pldm_entity p4a = pldm_entity_extract(l4a);
917     EXPECT_EQ(p4a.entity_type, 6u);
918     EXPECT_EQ(p4a.entity_instance_num, 1u);
919     EXPECT_EQ(p4a.entity_container_id, 3u);
920     pldm_entity p4b = pldm_entity_extract(l4b);
921     EXPECT_EQ(p4b.entity_type, 7u);
922     EXPECT_EQ(p4b.entity_instance_num, 1u);
923     EXPECT_EQ(p4b.entity_container_id, 4u);
924 
925     pldm_entity_association_tree_destroy(tree);
926 }
927 
928 #if LIBPLDM_API_TESTING
929 TEST(EntityAssociationPDR, findAndAddRemotePDR)
930 {
931     //         Tree - 1
932     //
933     //        11521(1,0)
934     //             |
935     //          45 (1,1)
936     //             |
937     //          64 (1,2)
938     //             |
939     //    ------------------
940     //    |                 |
941     //  67(0,3)           67(1,3)
942     //    |                 |
943     // 135(0,4)          135(0,5)
944     //    |                 |
945     // 32903(0,6)         32903(0,7)
946 
947     pldm_entity entities[9]{};
948     entities[0].entity_type = 11521;
949     entities[1].entity_type = 45;
950     entities[2].entity_type = 64;
951     entities[3].entity_type = 67;
952     entities[4].entity_type = 67;
953     entities[5].entity_type = 135;
954     entities[5].entity_container_id = 2;
955     entities[6].entity_type = 135;
956     entities[6].entity_container_id = 3;
957     entities[7].entity_type = 32903;
958     entities[8].entity_type = 32903;
959     auto tree = pldm_entity_association_tree_init();
960     auto l1 = pldm_entity_association_tree_add_entity(
961         tree, &entities[0], 0xffff, nullptr, PLDM_ENTITY_ASSOCIAION_LOGICAL,
962         false, true, 0xffff);
963     EXPECT_NE(l1, nullptr);
964     auto l2 = pldm_entity_association_tree_add_entity(
965         tree, &entities[1], 0xffff, l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL, false,
966         false, 0xffff);
967     EXPECT_NE(l2, nullptr);
968     auto l3 = pldm_entity_association_tree_add_entity(
969         tree, &entities[2], 0xffff, l2, PLDM_ENTITY_ASSOCIAION_PHYSICAL, false,
970         true, 0xffff);
971     EXPECT_NE(l3, nullptr);
972     auto l4a = pldm_entity_association_tree_add_entity(
973         tree, &entities[3], 0, l3, PLDM_ENTITY_ASSOCIAION_PHYSICAL, false,
974         false, 0xffff);
975     EXPECT_NE(l4a, nullptr);
976     auto l4b = pldm_entity_association_tree_add_entity(
977         tree, &entities[4], 1, l3, PLDM_ENTITY_ASSOCIAION_PHYSICAL, true, true,
978         0xffff);
979     EXPECT_NE(l4b, nullptr);
980     auto l5a = pldm_entity_association_tree_add_entity(
981         tree, &entities[5], 0, l4a, PLDM_ENTITY_ASSOCIAION_PHYSICAL, false,
982         false, 0xffff);
983     EXPECT_NE(l5a, nullptr);
984     auto l5b = pldm_entity_association_tree_add_entity(
985         tree, &entities[6], 0, l4b, PLDM_ENTITY_ASSOCIAION_PHYSICAL, false,
986         false, 0xffff);
987     EXPECT_NE(l5b, nullptr);
988     pldm_entity entity{};
989     entity.entity_type = 135;
990     entity.entity_instance_num = 0;
991     entity.entity_container_id = 2;
992     auto result1 = pldm_entity_association_tree_find(tree, &entity);
993     EXPECT_EQ(result1, l5a);
994     EXPECT_EQ(entities[5].entity_container_id, 2);
995     auto l6a = pldm_entity_association_tree_add_entity(
996         tree, &entities[7], 0, result1, PLDM_ENTITY_ASSOCIAION_PHYSICAL, false,
997         false, 0xffff);
998     EXPECT_NE(l6a, nullptr);
999     entity.entity_type = 135;
1000     entity.entity_instance_num = 0;
1001     entity.entity_container_id = 3;
1002     auto result2 = pldm_entity_association_tree_find(tree, &entity);
1003     EXPECT_NE(result2, l5b);
1004     EXPECT_EQ(entities[6].entity_container_id, 3);
1005     auto l7a = pldm_entity_association_tree_add_entity(
1006         tree, &entities[8], 0, result2, PLDM_ENTITY_ASSOCIAION_PHYSICAL, false,
1007         false, 0xffff);
1008     EXPECT_EQ(l7a, nullptr);
1009     pldm_entity_association_tree_destroy(tree);
1010 }
1011 #endif
1012 
1013 TEST(EntityAssociationPDR, testSpecialTrees)
1014 {
1015     pldm_entity entities[3]{};
1016 
1017     entities[0].entity_type = 1;
1018     entities[1].entity_type = 2;
1019     entities[2].entity_type = 1;
1020 
1021     // A
1022     auto tree = pldm_entity_association_tree_init();
1023     auto node = pldm_entity_association_tree_add(
1024         tree, &entities[0], 0xffff, nullptr, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
1025     EXPECT_NE(node, nullptr);
1026     size_t num{};
1027     pldm_entity* out = nullptr;
1028     pldm_entity_association_tree_visit(tree, &out, &num);
1029     EXPECT_EQ(num, 1u);
1030     EXPECT_EQ(out[0].entity_type, 1u);
1031     EXPECT_EQ(out[0].entity_instance_num, 1u);
1032     EXPECT_EQ(out[0].entity_container_id, 0u);
1033     free(out);
1034     pldm_entity_association_tree_destroy(tree);
1035 
1036     // A-A-A
1037     tree = pldm_entity_association_tree_init();
1038     node = pldm_entity_association_tree_add(tree, &entities[0], 0xffff, nullptr,
1039                                             PLDM_ENTITY_ASSOCIAION_PHYSICAL);
1040     EXPECT_NE(node, nullptr);
1041     node = pldm_entity_association_tree_add(tree, &entities[1], 0xffff, nullptr,
1042                                             PLDM_ENTITY_ASSOCIAION_PHYSICAL);
1043     EXPECT_NE(node, nullptr);
1044     node = pldm_entity_association_tree_add(tree, &entities[2], 0xffff, nullptr,
1045                                             PLDM_ENTITY_ASSOCIAION_PHYSICAL);
1046     EXPECT_NE(node, nullptr);
1047     pldm_entity_association_tree_visit(tree, &out, &num);
1048     EXPECT_EQ(num, 3u);
1049     EXPECT_EQ(out[0].entity_type, 1u);
1050     EXPECT_EQ(out[0].entity_instance_num, 1u);
1051     EXPECT_EQ(out[0].entity_container_id, 0u);
1052     EXPECT_EQ(out[1].entity_type, 1u);
1053     EXPECT_EQ(out[1].entity_instance_num, 2u);
1054     EXPECT_EQ(out[1].entity_container_id, 0u);
1055     EXPECT_EQ(out[2].entity_type, 2u);
1056     EXPECT_EQ(out[2].entity_instance_num, 1u);
1057     EXPECT_EQ(out[2].entity_container_id, 0u);
1058     free(out);
1059     pldm_entity_association_tree_destroy(tree);
1060 
1061     // A
1062     // |
1063     // A
1064     // |
1065     // A
1066     tree = pldm_entity_association_tree_init();
1067     node = pldm_entity_association_tree_add(tree, &entities[0], 0xffff, nullptr,
1068                                             PLDM_ENTITY_ASSOCIAION_PHYSICAL);
1069     EXPECT_NE(node, nullptr);
1070     auto node1 = pldm_entity_association_tree_add(
1071         tree, &entities[1], 0xffff, node, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
1072     EXPECT_NE(node1, nullptr);
1073     auto node2 = pldm_entity_association_tree_add(
1074         tree, &entities[2], 0xffff, node1, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
1075     EXPECT_NE(node2, nullptr);
1076     pldm_entity_association_tree_visit(tree, &out, &num);
1077     EXPECT_EQ(num, 3u);
1078     EXPECT_EQ(out[0].entity_type, 1u);
1079     EXPECT_EQ(out[0].entity_instance_num, 1u);
1080     EXPECT_EQ(out[0].entity_container_id, 0u);
1081     EXPECT_EQ(out[1].entity_type, 2u);
1082     EXPECT_EQ(out[1].entity_instance_num, 1u);
1083     EXPECT_EQ(out[1].entity_container_id, 1u);
1084     EXPECT_EQ(out[2].entity_type, 1u);
1085     EXPECT_EQ(out[2].entity_instance_num, 1u);
1086     EXPECT_EQ(out[2].entity_container_id, 2u);
1087     free(out);
1088     pldm_entity_association_tree_destroy(tree);
1089 
1090     // A-A
1091     //   |
1092     //   A-A
1093     tree = pldm_entity_association_tree_init();
1094     node = pldm_entity_association_tree_add(tree, &entities[0], 0xffff, nullptr,
1095                                             PLDM_ENTITY_ASSOCIAION_PHYSICAL);
1096     EXPECT_NE(node, nullptr);
1097     node = pldm_entity_association_tree_add(tree, &entities[0], 0xffff, nullptr,
1098                                             PLDM_ENTITY_ASSOCIAION_PHYSICAL);
1099     EXPECT_NE(node, nullptr);
1100     node1 = pldm_entity_association_tree_add(tree, &entities[1], 0xffff, node,
1101                                              PLDM_ENTITY_ASSOCIAION_PHYSICAL);
1102     EXPECT_NE(node1, nullptr);
1103     node2 = pldm_entity_association_tree_add(tree, &entities[2], 0xffff, node,
1104                                              PLDM_ENTITY_ASSOCIAION_PHYSICAL);
1105     EXPECT_NE(node2, nullptr);
1106     pldm_entity_association_tree_visit(tree, &out, &num);
1107     EXPECT_EQ(num, 4u);
1108     EXPECT_EQ(out[0].entity_type, 1u);
1109     EXPECT_EQ(out[0].entity_instance_num, 1u);
1110     EXPECT_EQ(out[0].entity_container_id, 0u);
1111     EXPECT_EQ(out[1].entity_type, 1u);
1112     EXPECT_EQ(out[1].entity_instance_num, 2u);
1113     EXPECT_EQ(out[1].entity_container_id, 0u);
1114     EXPECT_EQ(out[2].entity_type, 2u);
1115     EXPECT_EQ(out[2].entity_instance_num, 1u);
1116     EXPECT_EQ(out[2].entity_container_id, 1u);
1117     EXPECT_EQ(out[3].entity_type, 1u);
1118     EXPECT_EQ(out[3].entity_instance_num, 1u);
1119     EXPECT_EQ(out[3].entity_container_id, 1u);
1120     free(out);
1121     pldm_entity_association_tree_destroy(tree);
1122 }
1123 
1124 TEST(EntityAssociationPDR, testPDR)
1125 {
1126     // e = entity type, c = container id, i = instance num
1127 
1128     //        INPUT
1129     //        1(e=1)--1a(e=2)
1130     //        |
1131     //        2(e=2)--3(e=2)--4(e=2)--5(e=3)
1132     //        |
1133     //        6(e=4)--7(e=5)--8(e=5)--9(e=5)
1134     //        |       |
1135     //        11(e=6) 10(e=7)
1136 
1137     //        Expected OUTPUT
1138     //        1(e=1,c=0,i=1)
1139     //        |
1140     //        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)
1141     //        |
1142     //        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)
1143     //        |               |
1144     //        10(e=6,c=3,i=1) 11(e=7,c=4,i=1)
1145     pldm_entity entities[11]{};
1146 
1147     entities[0].entity_type = 1;
1148     entities[1].entity_type = 2;
1149     entities[2].entity_type = 3;
1150     entities[3].entity_type = 2;
1151     entities[4].entity_type = 3;
1152     entities[5].entity_type = 4;
1153     entities[6].entity_type = 5;
1154     entities[7].entity_type = 5;
1155     entities[8].entity_type = 5;
1156     entities[9].entity_type = 6;
1157     entities[10].entity_type = 7;
1158 
1159     auto tree = pldm_entity_association_tree_init();
1160 
1161     auto l1 = pldm_entity_association_tree_add(
1162         tree, &entities[0], 0xffff, nullptr, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
1163     EXPECT_NE(l1, nullptr);
1164     auto l1a = pldm_entity_association_tree_add(
1165         tree, &entities[1], 0xffff, nullptr, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
1166     EXPECT_NE(l1a, nullptr);
1167 
1168     auto l2a = pldm_entity_association_tree_add(
1169         tree, &entities[1], 0xffff, l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
1170     EXPECT_NE(l2a, nullptr);
1171     auto l2b = pldm_entity_association_tree_add(tree, &entities[2], 0xffff, l1,
1172                                                 PLDM_ENTITY_ASSOCIAION_LOGICAL);
1173     EXPECT_NE(l2b, nullptr);
1174     auto l2c = pldm_entity_association_tree_add(
1175         tree, &entities[3], 0xffff, l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
1176     EXPECT_NE(l2c, nullptr);
1177     auto l2d = pldm_entity_association_tree_add(tree, &entities[4], 0xffff, l1,
1178                                                 PLDM_ENTITY_ASSOCIAION_LOGICAL);
1179     EXPECT_NE(l2d, nullptr);
1180 
1181     auto l3a = pldm_entity_association_tree_add(
1182         tree, &entities[5], 0xffff, l2a, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
1183     EXPECT_NE(l3a, nullptr);
1184     auto l3b = pldm_entity_association_tree_add(
1185         tree, &entities[6], 0xffff, l2a, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
1186     EXPECT_NE(l3b, nullptr);
1187     auto l3c = pldm_entity_association_tree_add(tree, &entities[7], 0xffff, l2a,
1188                                                 PLDM_ENTITY_ASSOCIAION_LOGICAL);
1189     EXPECT_NE(l3c, nullptr);
1190     auto l3d = pldm_entity_association_tree_add(tree, &entities[8], 0xffff, l2a,
1191                                                 PLDM_ENTITY_ASSOCIAION_LOGICAL);
1192     EXPECT_NE(l3d, nullptr);
1193 
1194     auto l4a = pldm_entity_association_tree_add(
1195         tree, &entities[9], 0xffff, l3a, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
1196     EXPECT_NE(l4a, nullptr);
1197     auto l4b = pldm_entity_association_tree_add(
1198         tree, &entities[10], 0xffff, l3b, PLDM_ENTITY_ASSOCIAION_LOGICAL);
1199     EXPECT_NE(l4b, nullptr);
1200 
1201     EXPECT_EQ(pldm_entity_get_num_children(l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL),
1202               2);
1203     EXPECT_EQ(pldm_entity_get_num_children(l1, PLDM_ENTITY_ASSOCIAION_LOGICAL),
1204               2);
1205     EXPECT_EQ(
1206         pldm_entity_get_num_children(l2a, PLDM_ENTITY_ASSOCIAION_PHYSICAL), 2);
1207     EXPECT_EQ(
1208         pldm_entity_get_num_children(l3b, PLDM_ENTITY_ASSOCIAION_PHYSICAL), 0);
1209     EXPECT_EQ(pldm_entity_get_num_children(l3b, PLDM_ENTITY_ASSOCIAION_LOGICAL),
1210               1);
1211 
1212     auto repo = pldm_pdr_init();
1213     int rc = pldm_entity_association_pdr_add_check(tree, repo, false, 1);
1214     ASSERT_EQ(rc, 0);
1215 
1216     EXPECT_EQ(pldm_pdr_get_record_count(repo), 6u);
1217 
1218     uint32_t currRecHandle{};
1219     uint32_t nextRecHandle{};
1220     uint8_t* data = nullptr;
1221     uint32_t size{};
1222     uint32_t commonSize = sizeof(struct pldm_pdr_hdr) + sizeof(uint16_t) +
1223                           sizeof(uint8_t) + sizeof(pldm_entity) +
1224                           sizeof(uint8_t);
1225 
1226     pldm_pdr_find_record(repo, currRecHandle, &data, &size, &nextRecHandle);
1227     EXPECT_EQ(size, commonSize + (pldm_entity_get_num_children(
1228                                       l1, PLDM_ENTITY_ASSOCIAION_LOGICAL) *
1229                                   sizeof(pldm_entity)));
1230     uint8_t* start = data;
1231     pldm_pdr_hdr* hdr = reinterpret_cast<pldm_pdr_hdr*>(start);
1232     EXPECT_EQ(le32toh(hdr->record_handle), 1u);
1233     EXPECT_EQ(hdr->type, PLDM_PDR_ENTITY_ASSOCIATION);
1234     EXPECT_EQ(le16toh(hdr->length), size - sizeof(struct pldm_pdr_hdr));
1235     start += sizeof(pldm_pdr_hdr);
1236     uint16_t* containerId = reinterpret_cast<uint16_t*>(start);
1237     EXPECT_EQ(le16toh(*containerId), 1u);
1238     start += sizeof(uint16_t);
1239     EXPECT_EQ(*start, PLDM_ENTITY_ASSOCIAION_LOGICAL);
1240     start += sizeof(uint8_t);
1241     pldm_entity* entity = reinterpret_cast<pldm_entity*>(start);
1242     EXPECT_EQ(le16toh(entity->entity_type), 1u);
1243     EXPECT_EQ(le16toh(entity->entity_instance_num), 1u);
1244     EXPECT_EQ(le16toh(entity->entity_container_id), 0u);
1245     start += sizeof(pldm_entity);
1246     EXPECT_EQ(*start,
1247               pldm_entity_get_num_children(l1, PLDM_ENTITY_ASSOCIAION_LOGICAL));
1248     start += sizeof(uint8_t);
1249     entity = reinterpret_cast<pldm_entity*>(start);
1250     EXPECT_EQ(le16toh(entity->entity_type), 3u);
1251     EXPECT_EQ(le16toh(entity->entity_instance_num), 1u);
1252     EXPECT_EQ(le16toh(entity->entity_container_id), 1u);
1253     start += sizeof(pldm_entity);
1254     entity = reinterpret_cast<pldm_entity*>(start);
1255     EXPECT_EQ(le16toh(entity->entity_type), 3u);
1256     EXPECT_EQ(le16toh(entity->entity_instance_num), 2u);
1257     EXPECT_EQ(le16toh(entity->entity_container_id), 1u);
1258 
1259     currRecHandle = nextRecHandle;
1260 
1261     pldm_pdr_find_record(repo, currRecHandle, &data, &size, &nextRecHandle);
1262     EXPECT_EQ(size, commonSize + (pldm_entity_get_num_children(
1263                                       l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL) *
1264                                   sizeof(pldm_entity)));
1265     start = data;
1266     hdr = reinterpret_cast<pldm_pdr_hdr*>(start);
1267     EXPECT_EQ(le32toh(hdr->record_handle), 2u);
1268     EXPECT_EQ(hdr->type, PLDM_PDR_ENTITY_ASSOCIATION);
1269     EXPECT_EQ(le16toh(hdr->length), size - sizeof(struct pldm_pdr_hdr));
1270     start += sizeof(pldm_pdr_hdr);
1271     containerId = reinterpret_cast<uint16_t*>(start);
1272     EXPECT_EQ(le16toh(*containerId), 1u);
1273     start += sizeof(uint16_t);
1274     EXPECT_EQ(*start, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
1275     start += sizeof(uint8_t);
1276     entity = reinterpret_cast<pldm_entity*>(start);
1277     EXPECT_EQ(le16toh(entity->entity_type), 1u);
1278     EXPECT_EQ(le16toh(entity->entity_instance_num), 1u);
1279     EXPECT_EQ(le16toh(entity->entity_container_id), 0u);
1280     start += sizeof(pldm_entity);
1281     EXPECT_EQ(*start, pldm_entity_get_num_children(
1282                           l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL));
1283     start += sizeof(uint8_t);
1284     entity = reinterpret_cast<pldm_entity*>(start);
1285     EXPECT_EQ(le16toh(entity->entity_type), 2u);
1286     EXPECT_EQ(le16toh(entity->entity_instance_num), 1u);
1287     EXPECT_EQ(le16toh(entity->entity_container_id), 1u);
1288     start += sizeof(pldm_entity);
1289     entity = reinterpret_cast<pldm_entity*>(start);
1290     EXPECT_EQ(le16toh(entity->entity_type), 2u);
1291     EXPECT_EQ(le16toh(entity->entity_instance_num), 2u);
1292     EXPECT_EQ(le16toh(entity->entity_container_id), 1u);
1293 
1294     currRecHandle = nextRecHandle;
1295 
1296     pldm_pdr_find_record(repo, currRecHandle, &data, &size, &nextRecHandle);
1297     EXPECT_EQ(size, commonSize + (pldm_entity_get_num_children(
1298                                       l2a, PLDM_ENTITY_ASSOCIAION_LOGICAL) *
1299                                   sizeof(pldm_entity)));
1300     start = data;
1301     hdr = reinterpret_cast<pldm_pdr_hdr*>(start);
1302     EXPECT_EQ(le32toh(hdr->record_handle), 3u);
1303     EXPECT_EQ(hdr->type, PLDM_PDR_ENTITY_ASSOCIATION);
1304     EXPECT_EQ(le16toh(hdr->length), size - sizeof(struct pldm_pdr_hdr));
1305     start += sizeof(pldm_pdr_hdr);
1306     containerId = reinterpret_cast<uint16_t*>(start);
1307     EXPECT_EQ(le16toh(*containerId), 2u);
1308     start += sizeof(uint16_t);
1309     EXPECT_EQ(*start, PLDM_ENTITY_ASSOCIAION_LOGICAL);
1310     start += sizeof(uint8_t);
1311     entity = reinterpret_cast<pldm_entity*>(start);
1312     EXPECT_EQ(le16toh(entity->entity_type), 2u);
1313     EXPECT_EQ(le16toh(entity->entity_instance_num), 1u);
1314     EXPECT_EQ(le16toh(entity->entity_container_id), 1u);
1315     start += sizeof(pldm_entity);
1316     EXPECT_EQ(*start, pldm_entity_get_num_children(
1317                           l2a, PLDM_ENTITY_ASSOCIAION_LOGICAL));
1318     start += sizeof(uint8_t);
1319     entity = reinterpret_cast<pldm_entity*>(start);
1320     EXPECT_EQ(le16toh(entity->entity_type), 5);
1321     EXPECT_EQ(le16toh(entity->entity_instance_num), 2u);
1322     EXPECT_EQ(le16toh(entity->entity_container_id), 2u);
1323     start += sizeof(pldm_entity);
1324     entity = reinterpret_cast<pldm_entity*>(start);
1325     EXPECT_EQ(le16toh(entity->entity_type), 5u);
1326     EXPECT_EQ(le16toh(entity->entity_instance_num), 3u);
1327     EXPECT_EQ(le16toh(entity->entity_container_id), 2u);
1328 
1329     currRecHandle = nextRecHandle;
1330 
1331     pldm_pdr_find_record(repo, currRecHandle, &data, &size, &nextRecHandle);
1332     EXPECT_EQ(size, commonSize + (pldm_entity_get_num_children(
1333                                       l2a, PLDM_ENTITY_ASSOCIAION_PHYSICAL) *
1334                                   sizeof(pldm_entity)));
1335     start = data;
1336     hdr = reinterpret_cast<pldm_pdr_hdr*>(start);
1337     EXPECT_EQ(le32toh(hdr->record_handle), 4u);
1338     EXPECT_EQ(hdr->type, PLDM_PDR_ENTITY_ASSOCIATION);
1339     EXPECT_EQ(le16toh(hdr->length), size - sizeof(struct pldm_pdr_hdr));
1340     start += sizeof(pldm_pdr_hdr);
1341     containerId = reinterpret_cast<uint16_t*>(start);
1342     EXPECT_EQ(le16toh(*containerId), 2u);
1343     start += sizeof(uint16_t);
1344     EXPECT_EQ(*start, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
1345     start += sizeof(uint8_t);
1346     entity = reinterpret_cast<pldm_entity*>(start);
1347     EXPECT_EQ(le16toh(entity->entity_type), 2u);
1348     EXPECT_EQ(le16toh(entity->entity_instance_num), 1u);
1349     EXPECT_EQ(le16toh(entity->entity_container_id), 1u);
1350     start += sizeof(pldm_entity);
1351     EXPECT_EQ(*start, pldm_entity_get_num_children(
1352                           l2a, PLDM_ENTITY_ASSOCIAION_PHYSICAL));
1353     start += sizeof(uint8_t);
1354     entity = reinterpret_cast<pldm_entity*>(start);
1355     EXPECT_EQ(le16toh(entity->entity_type), 4u);
1356     EXPECT_EQ(le16toh(entity->entity_instance_num), 1u);
1357     EXPECT_EQ(le16toh(entity->entity_container_id), 2u);
1358     start += sizeof(pldm_entity);
1359     entity = reinterpret_cast<pldm_entity*>(start);
1360     EXPECT_EQ(le16toh(entity->entity_type), 5u);
1361     EXPECT_EQ(le16toh(entity->entity_instance_num), 1u);
1362     EXPECT_EQ(le16toh(entity->entity_container_id), 2u);
1363 
1364     currRecHandle = nextRecHandle;
1365 
1366     pldm_pdr_find_record(repo, currRecHandle, &data, &size, &nextRecHandle);
1367     EXPECT_EQ(size, commonSize + (pldm_entity_get_num_children(
1368                                       l3a, PLDM_ENTITY_ASSOCIAION_PHYSICAL) *
1369                                   sizeof(pldm_entity)));
1370     start = data;
1371     hdr = reinterpret_cast<pldm_pdr_hdr*>(start);
1372     EXPECT_EQ(le32toh(hdr->record_handle), 5u);
1373     EXPECT_EQ(hdr->type, PLDM_PDR_ENTITY_ASSOCIATION);
1374     EXPECT_EQ(le16toh(hdr->length), size - sizeof(struct pldm_pdr_hdr));
1375     start += sizeof(pldm_pdr_hdr);
1376     containerId = reinterpret_cast<uint16_t*>(start);
1377     EXPECT_EQ(le16toh(*containerId), 3u);
1378     start += sizeof(uint16_t);
1379     EXPECT_EQ(*start, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
1380     start += sizeof(uint8_t);
1381     entity = reinterpret_cast<pldm_entity*>(start);
1382     EXPECT_EQ(le16toh(entity->entity_type), 4u);
1383     EXPECT_EQ(le16toh(entity->entity_instance_num), 1u);
1384     EXPECT_EQ(le16toh(entity->entity_container_id), 2u);
1385     start += sizeof(pldm_entity);
1386     EXPECT_EQ(*start, pldm_entity_get_num_children(
1387                           l3a, PLDM_ENTITY_ASSOCIAION_PHYSICAL));
1388     start += sizeof(uint8_t);
1389     entity = reinterpret_cast<pldm_entity*>(start);
1390     EXPECT_EQ(le16toh(entity->entity_type), 6u);
1391     EXPECT_EQ(le16toh(entity->entity_instance_num), 1u);
1392     EXPECT_EQ(le16toh(entity->entity_container_id), 3u);
1393 
1394     currRecHandle = nextRecHandle;
1395 
1396     pldm_pdr_find_record(repo, currRecHandle, &data, &size, &nextRecHandle);
1397     EXPECT_EQ(size, commonSize + (pldm_entity_get_num_children(
1398                                       l3b, PLDM_ENTITY_ASSOCIAION_LOGICAL) *
1399                                   sizeof(pldm_entity)));
1400     start = data;
1401     hdr = reinterpret_cast<pldm_pdr_hdr*>(start);
1402     EXPECT_EQ(le32toh(hdr->record_handle), 6u);
1403     EXPECT_EQ(hdr->type, PLDM_PDR_ENTITY_ASSOCIATION);
1404     EXPECT_EQ(le16toh(hdr->length), size - sizeof(struct pldm_pdr_hdr));
1405     start += sizeof(pldm_pdr_hdr);
1406     containerId = reinterpret_cast<uint16_t*>(start);
1407     EXPECT_EQ(le16toh(*containerId), 4u);
1408     start += sizeof(uint16_t);
1409     EXPECT_EQ(*start, PLDM_ENTITY_ASSOCIAION_LOGICAL);
1410     start += sizeof(uint8_t);
1411     entity = reinterpret_cast<pldm_entity*>(start);
1412     EXPECT_EQ(le16toh(entity->entity_type), 5u);
1413     EXPECT_EQ(le16toh(entity->entity_instance_num), 1u);
1414     EXPECT_EQ(le16toh(entity->entity_container_id), 2u);
1415     start += sizeof(pldm_entity);
1416     EXPECT_EQ(*start, pldm_entity_get_num_children(
1417                           l3b, PLDM_ENTITY_ASSOCIAION_LOGICAL));
1418     start += sizeof(uint8_t);
1419     entity = reinterpret_cast<pldm_entity*>(start);
1420     EXPECT_EQ(le16toh(entity->entity_type), 7u);
1421     EXPECT_EQ(le16toh(entity->entity_instance_num), 1u);
1422     EXPECT_EQ(le16toh(entity->entity_container_id), 4u);
1423 
1424     EXPECT_EQ(nextRecHandle, 0u);
1425 
1426     pldm_pdr_destroy(repo);
1427     pldm_entity_association_tree_destroy(tree);
1428 }
1429 
1430 TEST(EntityAssociationPDR, testFind)
1431 {
1432     //        1
1433     //        |
1434     //        2--3--4
1435     //        |
1436     //        5--6--7
1437     //        |  |
1438     //        8  9
1439 
1440     pldm_entity entities[9]{};
1441 
1442     entities[0].entity_type = 1;
1443     entities[1].entity_type = 2;
1444     entities[2].entity_type = 2;
1445     entities[3].entity_type = 3;
1446     entities[4].entity_type = 4;
1447     entities[5].entity_type = 5;
1448     entities[6].entity_type = 5;
1449     entities[7].entity_type = 6;
1450     entities[8].entity_type = 7;
1451 
1452     auto tree = pldm_entity_association_tree_init();
1453 
1454     auto l1 = pldm_entity_association_tree_add(
1455         tree, &entities[0], 0xffff, nullptr, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
1456     EXPECT_NE(l1, nullptr);
1457     auto l2a = pldm_entity_association_tree_add(
1458         tree, &entities[1], 0xffff, l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
1459     EXPECT_NE(l2a, nullptr);
1460     auto l2b = pldm_entity_association_tree_add(
1461         tree, &entities[2], 0xffff, l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
1462     EXPECT_NE(l2b, nullptr);
1463     auto l2c = pldm_entity_association_tree_add(
1464         tree, &entities[3], 0xffff, l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
1465     EXPECT_NE(l2c, nullptr);
1466     auto l3a = pldm_entity_association_tree_add(
1467         tree, &entities[4], 0xffff, l2a, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
1468     EXPECT_NE(l3a, nullptr);
1469     auto l3b = pldm_entity_association_tree_add(
1470         tree, &entities[5], 0xffff, l2a, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
1471     EXPECT_NE(l3b, nullptr);
1472     auto l3c = pldm_entity_association_tree_add(
1473         tree, &entities[6], 0xffff, l2a, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
1474     EXPECT_NE(l3c, nullptr);
1475     auto l4a = pldm_entity_association_tree_add(
1476         tree, &entities[7], 0xffff, l3a, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
1477     EXPECT_NE(l4a, nullptr);
1478     auto l4b = pldm_entity_association_tree_add(
1479         tree, &entities[8], 0xffff, l3b, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
1480     EXPECT_NE(l4b, nullptr);
1481 
1482     pldm_entity entity{};
1483 
1484     entity.entity_type = 1;
1485     entity.entity_instance_num = 1;
1486     auto result = pldm_entity_association_tree_find(tree, &entity);
1487     EXPECT_EQ(result, l1);
1488     EXPECT_EQ(entity.entity_container_id, 0);
1489 
1490     entity.entity_type = 2;
1491     entity.entity_instance_num = 1;
1492     result = pldm_entity_association_tree_find(tree, &entity);
1493     EXPECT_EQ(result, l2a);
1494     EXPECT_EQ(entity.entity_container_id, 1);
1495     entity.entity_type = 2;
1496     entity.entity_instance_num = 2;
1497     result = pldm_entity_association_tree_find(tree, &entity);
1498     EXPECT_EQ(result, l2b);
1499     EXPECT_EQ(entity.entity_container_id, 1);
1500     entity.entity_type = 3;
1501     entity.entity_instance_num = 1;
1502     result = pldm_entity_association_tree_find(tree, &entity);
1503     EXPECT_EQ(result, l2c);
1504     EXPECT_EQ(entity.entity_container_id, 1);
1505 
1506     entity.entity_type = 7;
1507     entity.entity_instance_num = 1;
1508     result = pldm_entity_association_tree_find(tree, &entity);
1509     EXPECT_EQ(result, l4b);
1510     EXPECT_EQ(entity.entity_container_id, 4);
1511 
1512     pldm_entity_association_tree_destroy(tree);
1513 }
1514 
1515 TEST(EntityAssociationPDR, testCopyTree)
1516 {
1517     pldm_entity entities[4]{};
1518     entities[0].entity_type = 1;
1519     entities[1].entity_type = 2;
1520     entities[2].entity_type = 2;
1521     entities[3].entity_type = 3;
1522 
1523     auto orgTree = pldm_entity_association_tree_init();
1524     auto newTree = pldm_entity_association_tree_init();
1525     auto l1 =
1526         pldm_entity_association_tree_add(orgTree, &entities[0], 0xffff, nullptr,
1527                                          PLDM_ENTITY_ASSOCIAION_PHYSICAL);
1528     EXPECT_NE(l1, nullptr);
1529     auto l2a = pldm_entity_association_tree_add(
1530         orgTree, &entities[1], 0xffff, l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
1531     EXPECT_NE(l2a, nullptr);
1532     auto l2b = pldm_entity_association_tree_add(
1533         orgTree, &entities[2], 0xffff, l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
1534     EXPECT_NE(l2b, nullptr);
1535     auto l2c = pldm_entity_association_tree_add(
1536         orgTree, &entities[3], 0xffff, l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
1537     EXPECT_NE(l2c, nullptr);
1538     size_t orgNum{};
1539     pldm_entity* orgOut = nullptr;
1540     pldm_entity_association_tree_visit(orgTree, &orgOut, &orgNum);
1541     EXPECT_EQ(orgNum, 4u);
1542 
1543     pldm_entity_association_tree_copy_root(orgTree, newTree);
1544     size_t newNum{};
1545     pldm_entity* newOut = nullptr;
1546     pldm_entity_association_tree_visit(newTree, &newOut, &newNum);
1547     EXPECT_EQ(newNum, orgNum);
1548     EXPECT_EQ(newOut[0].entity_type, 1u);
1549     EXPECT_EQ(newOut[0].entity_instance_num, 1u);
1550     EXPECT_EQ(newOut[0].entity_container_id, 0u);
1551     free(orgOut);
1552     free(newOut);
1553     pldm_entity_association_tree_destroy(orgTree);
1554     pldm_entity_association_tree_destroy(newTree);
1555 }
1556 
1557 TEST(EntityAssociationPDR, testExtract)
1558 {
1559     std::vector<uint8_t> pdr{};
1560     pdr.resize(sizeof(pldm_pdr_hdr) + sizeof(pldm_pdr_entity_association) +
1561                sizeof(pldm_entity) * 4);
1562     pldm_pdr_hdr* hdr = reinterpret_cast<pldm_pdr_hdr*>(pdr.data());
1563     hdr->type = PLDM_PDR_ENTITY_ASSOCIATION;
1564     hdr->length =
1565         htole16(sizeof(pldm_pdr_entity_association) + sizeof(pldm_entity) * 4);
1566 
1567     pldm_pdr_entity_association* e =
1568         reinterpret_cast<pldm_pdr_entity_association*>(pdr.data() +
1569                                                        sizeof(pldm_pdr_hdr));
1570     e->container_id = htole16(1);
1571     e->num_children = 5;
1572     e->container.entity_type = htole16(1);
1573     e->container.entity_instance_num = htole16(1);
1574     e->container.entity_container_id = htole16(0);
1575 
1576     pldm_entity* entity = e->children;
1577     entity->entity_type = htole16(2);
1578     entity->entity_instance_num = htole16(1);
1579     entity->entity_container_id = htole16(1);
1580     ++entity;
1581     entity->entity_type = htole16(3);
1582     entity->entity_instance_num = htole16(1);
1583     entity->entity_container_id = htole16(1);
1584     ++entity;
1585     entity->entity_type = htole16(4);
1586     entity->entity_instance_num = htole16(1);
1587     entity->entity_container_id = htole16(1);
1588     ++entity;
1589     entity->entity_type = htole16(5);
1590     entity->entity_instance_num = htole16(1);
1591     entity->entity_container_id = htole16(1);
1592     ++entity;
1593     entity->entity_type = htole16(6);
1594     entity->entity_instance_num = htole16(1);
1595     entity->entity_container_id = htole16(1);
1596 
1597     size_t num{};
1598     pldm_entity* out = nullptr;
1599     pldm_entity_association_pdr_extract(pdr.data(), pdr.size(), &num, &out);
1600     EXPECT_EQ(num, (unsigned)e->num_children + 1);
1601     EXPECT_EQ(out[0].entity_type, 1u);
1602     EXPECT_EQ(out[0].entity_instance_num, 1u);
1603     EXPECT_EQ(out[0].entity_container_id, 0u);
1604     EXPECT_EQ(out[1].entity_type, 2u);
1605     EXPECT_EQ(out[1].entity_instance_num, 1u);
1606     EXPECT_EQ(out[1].entity_container_id, 1u);
1607     EXPECT_EQ(out[2].entity_type, 3u);
1608     EXPECT_EQ(out[2].entity_instance_num, 1u);
1609     EXPECT_EQ(out[2].entity_container_id, 1u);
1610     EXPECT_EQ(out[3].entity_type, 4u);
1611     EXPECT_EQ(out[3].entity_instance_num, 1u);
1612     EXPECT_EQ(out[3].entity_container_id, 1u);
1613     EXPECT_EQ(out[4].entity_type, 5u);
1614     EXPECT_EQ(out[4].entity_instance_num, 1u);
1615     EXPECT_EQ(out[4].entity_container_id, 1u);
1616     EXPECT_EQ(out[5].entity_type, 6u);
1617     EXPECT_EQ(out[5].entity_instance_num, 1u);
1618     EXPECT_EQ(out[5].entity_container_id, 1u);
1619 
1620     free(out);
1621 }
1622 
1623 TEST(EntityAssociationPDR, testGetChildren)
1624 {
1625     pldm_entity entities[4]{};
1626     entities[0].entity_type = 1;
1627     entities[1].entity_type = 2;
1628     entities[2].entity_type = 2;
1629     entities[3].entity_type = 3;
1630 
1631     auto tree = pldm_entity_association_tree_init();
1632     auto l1 = pldm_entity_association_tree_add(
1633         tree, &entities[0], 0xffff, nullptr, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
1634     EXPECT_NE(l1, nullptr);
1635     auto l2a = pldm_entity_association_tree_add(
1636         tree, &entities[1], 0xffff, l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
1637     EXPECT_NE(l2a, nullptr);
1638     auto l2b = pldm_entity_association_tree_add(
1639         tree, &entities[2], 0xffff, l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
1640     EXPECT_NE(l2b, nullptr);
1641     auto l2c = pldm_entity_association_tree_add(
1642         tree, &entities[3], 0xffff, l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
1643     EXPECT_NE(l2c, nullptr);
1644 
1645     pldm_entity et1;
1646     et1.entity_type = 2;
1647     et1.entity_instance_num = 1;
1648     EXPECT_EQ(true, pldm_is_current_parent_child(l1, &et1));
1649 
1650     pldm_entity et2;
1651     et2.entity_type = 2;
1652     et2.entity_instance_num = 2;
1653     EXPECT_EQ(true, pldm_is_current_parent_child(l1, &et2));
1654 
1655     pldm_entity et3;
1656     et3.entity_type = 2;
1657     et3.entity_instance_num = 3;
1658     EXPECT_EQ(false, pldm_is_current_parent_child(l1, &et3));
1659 
1660     pldm_entity_association_tree_destroy(tree);
1661 }
1662 
1663 TEST(EntityAssociationPDR, testEntityInstanceNumber)
1664 {
1665     pldm_entity entities[9]{};
1666 
1667     entities[0].entity_type = 1;
1668     entities[1].entity_type = 2;
1669     entities[2].entity_type = 2;
1670     entities[3].entity_type = 2;
1671     entities[4].entity_type = 2;
1672     entities[5].entity_type = 2;
1673     entities[6].entity_type = 2;
1674     entities[7].entity_type = 3;
1675     entities[8].entity_type = 3;
1676 
1677     auto tree = pldm_entity_association_tree_init();
1678     auto repo = pldm_pdr_init();
1679 
1680     uint16_t terminusHdl{};
1681     uint16_t entityType{};
1682     uint16_t entityInstanceNum{};
1683     uint16_t containerId{};
1684 
1685     auto node = pldm_entity_association_tree_add(
1686         tree, &entities[0], 0xffff, nullptr, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
1687     EXPECT_NE(node, nullptr);
1688 
1689     auto l1 = pldm_entity_association_tree_add(tree, &entities[1], 63, node,
1690                                                PLDM_ENTITY_ASSOCIAION_PHYSICAL);
1691     uint32_t first = 1;
1692     EXPECT_EQ(pldm_pdr_add_fru_record_set_check(
1693                   repo, 1, 1, entities[1].entity_type,
1694                   entities[1].entity_instance_num,
1695                   entities[1].entity_container_id, &first),
1696               0);
1697     EXPECT_NE(l1, nullptr);
1698     EXPECT_EQ(entities[1].entity_instance_num, 63);
1699     EXPECT_EQ(first, pldm_pdr_get_record_handle(
1700                          repo, pldm_pdr_fru_record_set_find_by_rsi(
1701                                    repo, 1, &terminusHdl, &entityType,
1702                                    &entityInstanceNum, &containerId)));
1703     EXPECT_EQ(entityType, 2);
1704     EXPECT_EQ(entityInstanceNum, 63);
1705 
1706     auto l2 = pldm_entity_association_tree_add(tree, &entities[2], 37, node,
1707                                                PLDM_ENTITY_ASSOCIAION_PHYSICAL);
1708     uint32_t second = 2;
1709     EXPECT_EQ(pldm_pdr_add_fru_record_set_check(
1710                   repo, 1, 2, entities[2].entity_type,
1711                   entities[2].entity_instance_num,
1712                   entities[2].entity_container_id, &second),
1713               0);
1714     EXPECT_NE(l2, nullptr);
1715     EXPECT_EQ(entities[2].entity_instance_num, 37);
1716     EXPECT_EQ(second, pldm_pdr_get_record_handle(
1717                           repo, pldm_pdr_fru_record_set_find_by_rsi(
1718                                     repo, 2, &terminusHdl, &entityType,
1719                                     &entityInstanceNum, &containerId)));
1720     EXPECT_EQ(entityType, 2);
1721     EXPECT_EQ(entityInstanceNum, 37);
1722 
1723     auto l3 = pldm_entity_association_tree_add(tree, &entities[3], 44, node,
1724                                                PLDM_ENTITY_ASSOCIAION_PHYSICAL);
1725     uint32_t third = 3;
1726     EXPECT_EQ(pldm_pdr_add_fru_record_set_check(
1727                   repo, 1, 3, entities[3].entity_type,
1728                   entities[3].entity_instance_num,
1729                   entities[3].entity_container_id, &third),
1730               0);
1731     EXPECT_NE(l3, nullptr);
1732     EXPECT_EQ(entities[3].entity_instance_num, 44);
1733     EXPECT_EQ(third, pldm_pdr_get_record_handle(
1734                          repo, pldm_pdr_fru_record_set_find_by_rsi(
1735                                    repo, 3, &terminusHdl, &entityType,
1736                                    &entityInstanceNum, &containerId)));
1737     EXPECT_EQ(entityType, 2);
1738     EXPECT_EQ(entityInstanceNum, 44);
1739 
1740     auto l4 = pldm_entity_association_tree_add(tree, &entities[4], 89, node,
1741                                                PLDM_ENTITY_ASSOCIAION_PHYSICAL);
1742     uint32_t fourth = 4;
1743     EXPECT_EQ(pldm_pdr_add_fru_record_set_check(
1744                   repo, 1, 4, entities[4].entity_type,
1745                   entities[4].entity_instance_num,
1746                   entities[4].entity_container_id, &fourth),
1747               0);
1748     EXPECT_NE(l4, nullptr);
1749     EXPECT_EQ(entities[4].entity_instance_num, 89);
1750     EXPECT_EQ(fourth, pldm_pdr_get_record_handle(
1751                           repo, pldm_pdr_fru_record_set_find_by_rsi(
1752                                     repo, 4, &terminusHdl, &entityType,
1753                                     &entityInstanceNum, &containerId)));
1754     EXPECT_EQ(entityType, 2);
1755     EXPECT_EQ(entityInstanceNum, 89);
1756 
1757     auto l5 = pldm_entity_association_tree_add(tree, &entities[5], 0xffff, node,
1758                                                PLDM_ENTITY_ASSOCIAION_PHYSICAL);
1759     uint32_t fifth = 5;
1760     EXPECT_EQ(pldm_pdr_add_fru_record_set_check(
1761                   repo, 1, 5, entities[5].entity_type,
1762                   entities[5].entity_instance_num,
1763                   entities[5].entity_container_id, &fifth),
1764               0);
1765     EXPECT_NE(l5, nullptr);
1766     EXPECT_EQ(entities[5].entity_instance_num, 90);
1767     EXPECT_EQ(fifth, pldm_pdr_get_record_handle(
1768                          repo, pldm_pdr_fru_record_set_find_by_rsi(
1769                                    repo, 5, &terminusHdl, &entityType,
1770                                    &entityInstanceNum, &containerId)));
1771     EXPECT_EQ(entityType, 2);
1772     EXPECT_EQ(entityInstanceNum, 90);
1773 
1774     auto l6 = pldm_entity_association_tree_add(tree, &entities[6], 90, node,
1775                                                PLDM_ENTITY_ASSOCIAION_PHYSICAL);
1776     EXPECT_EQ(l6, nullptr);
1777 
1778     auto l7 = pldm_entity_association_tree_add(tree, &entities[7], 100, l1,
1779                                                PLDM_ENTITY_ASSOCIAION_PHYSICAL);
1780     uint32_t seventh = 7;
1781     EXPECT_EQ(pldm_pdr_add_fru_record_set_check(
1782                   repo, 1, 7, entities[7].entity_type,
1783                   entities[7].entity_instance_num,
1784                   entities[7].entity_container_id, &seventh),
1785               0);
1786     EXPECT_NE(l7, nullptr);
1787     EXPECT_EQ(entities[7].entity_instance_num, 100);
1788     EXPECT_EQ(seventh, pldm_pdr_get_record_handle(
1789                            repo, pldm_pdr_fru_record_set_find_by_rsi(
1790                                      repo, 7, &terminusHdl, &entityType,
1791                                      &entityInstanceNum, &containerId)));
1792     EXPECT_EQ(entityType, 3);
1793     EXPECT_EQ(entityInstanceNum, 100);
1794 
1795     auto l8 = pldm_entity_association_tree_add(tree, &entities[8], 100, l2,
1796                                                PLDM_ENTITY_ASSOCIAION_PHYSICAL);
1797     uint32_t eighth = 8;
1798     EXPECT_EQ(pldm_pdr_add_fru_record_set_check(
1799                   repo, 1, 8, entities[8].entity_type,
1800                   entities[8].entity_instance_num,
1801                   entities[8].entity_container_id, &eighth),
1802               0);
1803     EXPECT_NE(l8, nullptr);
1804     EXPECT_EQ(entities[8].entity_instance_num, 100);
1805     EXPECT_EQ(eighth, pldm_pdr_get_record_handle(
1806                           repo, pldm_pdr_fru_record_set_find_by_rsi(
1807                                     repo, 8, &terminusHdl, &entityType,
1808                                     &entityInstanceNum, &containerId)));
1809     EXPECT_EQ(entityType, 3);
1810     EXPECT_EQ(entityInstanceNum, 100);
1811 
1812     pldm_pdr_destroy(repo);
1813     pldm_entity_association_tree_destroy(tree);
1814 }
1815 
1816 #ifdef LIBPLDM_API_TESTING
1817 TEST(EntityAssociationPDR, testFindChildContainerID)
1818 {
1819     pldm_entity entities[3]{};
1820     entities[0].entity_type = 1;
1821     entities[1].entity_type = 2;
1822     entities[2].entity_type = 3;
1823     entities[1].entity_container_id = 2;
1824     entities[1].entity_instance_num = 1;
1825 
1826     auto tree = pldm_entity_association_tree_init();
1827     auto l1 = pldm_entity_association_tree_add_entity(
1828         tree, &entities[0], 0xffff, nullptr, PLDM_ENTITY_ASSOCIAION_LOGICAL,
1829         false, true, 0xffff);
1830 
1831     EXPECT_NE(l1, nullptr);
1832     auto l2 = pldm_entity_association_tree_add_entity(
1833         tree, &entities[1], 0xffff, l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL, false,
1834         false, 0xffff);
1835     EXPECT_NE(l2, nullptr);
1836     auto l3 = pldm_entity_association_tree_add_entity(
1837         tree, &entities[2], 0xffff, l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL, false,
1838         true, 0xffff);
1839     EXPECT_NE(l3, nullptr);
1840 
1841     EXPECT_EQ(pldm_entity_get_num_children(l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL),
1842               2);
1843 
1844     auto repo = pldm_pdr_init();
1845     int rc = pldm_entity_association_pdr_add_check(tree, repo, false, 1);
1846     ASSERT_EQ(rc, 0);
1847 
1848     EXPECT_EQ(pldm_pdr_get_record_count(repo), 1u);
1849 
1850     uint16_t container_id{};
1851     pldm_pdr_find_child_container_id_index_range_exclude(
1852         repo, 1, 1, 0, 0x01000000, 0x01ffffff, &container_id);
1853     EXPECT_EQ(container_id, 2);
1854 
1855     uint16_t container_id1{};
1856     pldm_pdr_find_child_container_id_index_range_exclude(
1857         repo, 1, 1, 0, 0x00000001, 0x00ffffff, &container_id1);
1858     EXPECT_EQ(container_id1, 0);
1859 
1860     pldm_pdr_destroy(repo);
1861     pldm_entity_association_tree_destroy(tree);
1862 }
1863 #endif
1864 
1865 TEST(EntityAssociationPDR, testNodeAddCheck)
1866 {
1867     // pldm_entity entities[4]{};
1868     pldm_entity* entities = (pldm_entity*)malloc(sizeof(pldm_entity) * 4);
1869     entities[0].entity_type = 1;
1870     entities[1].entity_type = 2;
1871     entities[2].entity_type = 2;
1872     entities[3].entity_type = 3;
1873 
1874     auto tree = pldm_entity_association_tree_init();
1875 
1876     auto l1 = pldm_entity_association_tree_add(
1877         tree, &entities[0], 0xffff, nullptr, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
1878     EXPECT_NE(l1, nullptr);
1879     auto l2a = pldm_entity_association_tree_add(
1880         tree, &entities[1], 0xffff, l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
1881     EXPECT_NE(l2a, nullptr);
1882     auto l2b = pldm_entity_association_tree_add(
1883         tree, &entities[2], 0xffff, l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
1884     EXPECT_NE(l2b, nullptr);
1885     auto l2c = pldm_entity_association_tree_add(
1886         tree, &entities[3], 0xffff, l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
1887     EXPECT_NE(l2c, nullptr);
1888 
1889     auto repo = pldm_pdr_init();
1890 
1891     EXPECT_EQ(pldm_entity_association_pdr_add_from_node_with_record_handle(
1892                   l1, repo, &entities, 4, false, 1, 0),
1893               0);
1894     EXPECT_EQ(pldm_entity_association_pdr_add_from_node_with_record_handle(
1895                   l1, repo, &entities, 4, false, 1, 2),
1896               0);
1897     EXPECT_EQ(pldm_entity_association_pdr_add_from_node_with_record_handle(
1898                   l1, repo, &entities, 4, false, 1, 23),
1899               0);
1900     EXPECT_EQ(pldm_entity_association_pdr_add_from_node_with_record_handle(
1901                   l1, repo, &entities, 4, false, 1, 34),
1902               0);
1903 
1904     EXPECT_EQ(pldm_pdr_get_record_count(repo), 4u);
1905 
1906     uint8_t* outData = nullptr;
1907     uint32_t size{};
1908     uint32_t nextRecHdl{};
1909     auto hdl = pldm_pdr_find_record(repo, 0, &outData, &size, &nextRecHdl);
1910     EXPECT_NE(hdl, nullptr);
1911 
1912     outData = nullptr;
1913     auto hdl1 = pldm_pdr_find_record(repo, 2, &outData, &size, &nextRecHdl);
1914     EXPECT_NE(hdl1, nullptr);
1915     pldm_pdr_hdr* hdr = reinterpret_cast<pldm_pdr_hdr*>(outData);
1916     EXPECT_EQ(hdr->record_handle, 2);
1917 
1918     outData = nullptr;
1919     auto hdl2 = pldm_pdr_find_record(repo, 23, &outData, &size, &nextRecHdl);
1920     EXPECT_NE(hdl2, nullptr);
1921     pldm_pdr_hdr* hdr1 = reinterpret_cast<pldm_pdr_hdr*>(outData);
1922     EXPECT_EQ(hdr1->record_handle, 23);
1923 
1924     outData = nullptr;
1925     auto hdl3 = pldm_pdr_find_record(repo, 3, &outData, &size, &nextRecHdl);
1926     EXPECT_EQ(hdl3, nullptr);
1927 
1928     free(entities);
1929     pldm_pdr_destroy(repo);
1930     pldm_entity_association_tree_destroy(tree);
1931 }
1932 
1933 #ifdef LIBPLDM_API_TESTING
1934 TEST(EntityAssociationPDR, testAddContainedEntityRemotePDR)
1935 {
1936     // pldm_entity entities[5]{};
1937     pldm_entity* entities = (pldm_entity*)malloc(sizeof(pldm_entity) * 5);
1938     entities[0].entity_type = 1;
1939     entities[1].entity_type = 2;
1940     entities[2].entity_type = 3;
1941     entities[3].entity_type = 4;
1942     entities[4].entity_type = 5;
1943 
1944     auto tree = pldm_entity_association_tree_init();
1945     auto l1 = pldm_entity_association_tree_add(
1946         tree, &entities[0], 0xffff, nullptr, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
1947     EXPECT_NE(l1, nullptr);
1948     auto l2a = pldm_entity_association_tree_add(
1949         tree, &entities[1], 0xffff, l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
1950     EXPECT_NE(l2a, nullptr);
1951     auto l2b = pldm_entity_association_tree_add(
1952         tree, &entities[2], 0xffff, l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
1953     EXPECT_NE(l2b, nullptr);
1954     auto l2c = pldm_entity_association_tree_add(
1955         tree, &entities[3], 0xffff, l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
1956     EXPECT_NE(l2c, nullptr);
1957     auto l3a = pldm_entity_association_tree_add(
1958         tree, &entities[4], 0xffff, l2a, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
1959     EXPECT_NE(l3a, nullptr);
1960 
1961     auto repo = pldm_pdr_init();
1962 
1963     EXPECT_EQ(pldm_entity_association_pdr_add_from_node_with_record_handle(
1964                   l1, repo, &entities, 5, false, 1, 0),
1965               0);
1966     EXPECT_EQ(pldm_entity_association_pdr_add_from_node_with_record_handle(
1967                   l1, repo, &entities, 5, false, 1, 2),
1968               0);
1969     EXPECT_EQ(pldm_entity_association_pdr_add_from_node_with_record_handle(
1970                   l1, repo, &entities, 5, false, 1, 23),
1971               0);
1972     EXPECT_EQ(pldm_entity_association_pdr_add_from_node_with_record_handle(
1973                   l1, repo, &entities, 5, false, 1, 34),
1974               0);
1975     EXPECT_EQ(pldm_entity_association_pdr_add_from_node_with_record_handle(
1976                   l2a, repo, &entities, 5, false, 1, 3),
1977               0);
1978 
1979     pldm_entity entity1[1];
1980     entity1[0].entity_type = 2;
1981 
1982     EXPECT_EQ(pldm_entity_association_pdr_add_contained_entity_to_remote_pdr(
1983                   repo, &entity1[0], 2),
1984               0);
1985 
1986     free(entities);
1987     pldm_pdr_destroy(repo);
1988     pldm_entity_association_tree_destroy(tree);
1989 }
1990 #endif
1991 
1992 #ifdef LIBPLDM_API_TESTING
1993 TEST(EntityAssociationPDR, testAddContainedEntityNew)
1994 {
1995     // pldm_entity entities[5]{};
1996     pldm_entity* entities = (pldm_entity*)malloc(sizeof(pldm_entity) * 5);
1997     entities[0].entity_type = 1;
1998     entities[1].entity_type = 2;
1999     entities[2].entity_type = 3;
2000     entities[3].entity_type = 4;
2001     entities[4].entity_type = 5;
2002 
2003     auto tree = pldm_entity_association_tree_init();
2004     auto l1 = pldm_entity_association_tree_add(
2005         tree, &entities[0], 0xffff, nullptr, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
2006     EXPECT_NE(l1, nullptr);
2007     auto l2a = pldm_entity_association_tree_add(
2008         tree, &entities[1], 0xffff, l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
2009     EXPECT_NE(l2a, nullptr);
2010     auto l2b = pldm_entity_association_tree_add(
2011         tree, &entities[2], 0xffff, l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
2012     EXPECT_NE(l2b, nullptr);
2013     auto l2c = pldm_entity_association_tree_add(
2014         tree, &entities[3], 0xffff, l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
2015     EXPECT_NE(l2c, nullptr);
2016     auto l3a = pldm_entity_association_tree_add(
2017         tree, &entities[4], 0xffff, l2a, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
2018     EXPECT_NE(l3a, nullptr);
2019 
2020     auto repo = pldm_pdr_init();
2021 
2022     EXPECT_EQ(pldm_entity_association_pdr_add_from_node_with_record_handle(
2023                   l1, repo, &entities, 5, false, 1, 0),
2024               0);
2025     EXPECT_EQ(pldm_entity_association_pdr_add_from_node_with_record_handle(
2026                   l1, repo, &entities, 5, false, 1, 2),
2027               0);
2028     EXPECT_EQ(pldm_entity_association_pdr_add_from_node_with_record_handle(
2029                   l1, repo, &entities, 5, false, 1, 23),
2030               0);
2031     EXPECT_EQ(pldm_entity_association_pdr_add_from_node_with_record_handle(
2032                   l1, repo, &entities, 5, false, 1, 34),
2033               0);
2034     EXPECT_EQ(pldm_entity_association_pdr_add_from_node_with_record_handle(
2035                   l2a, repo, &entities, 5, false, 1, 3),
2036               0);
2037 
2038     uint32_t updated_record_handle = 0;
2039 
2040     pldm_entity entity2[1]{};
2041     entity2[0].entity_type = 4;
2042 
2043     pldm_entity entity3[1]{};
2044     entity3[0].entity_type = 4;
2045 
2046     EXPECT_EQ(pldm_entity_association_pdr_create_new(
2047                   repo, 34, &entity2[0], &entity3[0], &updated_record_handle),
2048               0);
2049 
2050     EXPECT_EQ(updated_record_handle, 35);
2051 
2052     free(entities);
2053     pldm_pdr_destroy(repo);
2054     pldm_entity_association_tree_destroy(tree);
2055 }
2056 #endif
2057