xref: /openbmc/libpldm/tests/dsp/pdr.cpp (revision 70d21c97f21e910f5beab62229668cfa698cfb51)
148761c62SAndrew Jeffery #include <endian.h>
248761c62SAndrew Jeffery #include <libpldm/pdr.h>
348761c62SAndrew Jeffery #include <libpldm/platform.h>
494e2d754SArchana Kakani #include <msgbuf.h>
548761c62SAndrew Jeffery 
648761c62SAndrew Jeffery #include <array>
748761c62SAndrew Jeffery #include <cstdint>
848761c62SAndrew Jeffery #include <cstdlib>
948761c62SAndrew Jeffery #include <cstring>
1048761c62SAndrew Jeffery #include <vector>
1148761c62SAndrew Jeffery 
1248761c62SAndrew Jeffery #include <gtest/gtest.h>
1348761c62SAndrew Jeffery 
14bc40dd5aSArchana Kakani typedef struct pldm_association_pdr_test
15bc40dd5aSArchana Kakani {
16bc40dd5aSArchana Kakani     uint32_t record_handle;
17bc40dd5aSArchana Kakani     uint8_t version;
18bc40dd5aSArchana Kakani     uint8_t type;
19bc40dd5aSArchana Kakani     uint16_t record_change_num;
20bc40dd5aSArchana Kakani     uint16_t length;
21bc40dd5aSArchana Kakani     uint16_t container_id;
22bc40dd5aSArchana Kakani     uint8_t association_type;
23bc40dd5aSArchana Kakani     uint8_t num_children;
24bc40dd5aSArchana Kakani 
operator ==pldm_association_pdr_test25bc40dd5aSArchana Kakani     inline bool operator==(pldm_association_pdr_test pdr) const
26bc40dd5aSArchana Kakani     {
27bc40dd5aSArchana Kakani         return (record_handle == pdr.record_handle) && (type == pdr.type) &&
28bc40dd5aSArchana Kakani                (length == pdr.length) && (container_id == pdr.container_id) &&
29bc40dd5aSArchana Kakani                (association_type == pdr.association_type) &&
30bc40dd5aSArchana Kakani                (num_children == pdr.num_children);
31bc40dd5aSArchana Kakani     }
32bc40dd5aSArchana Kakani } pldm_association_pdr_test;
33bc40dd5aSArchana Kakani 
34bc40dd5aSArchana Kakani typedef struct pldm_entity_test
35bc40dd5aSArchana Kakani {
36bc40dd5aSArchana Kakani     uint16_t entity_type;
37bc40dd5aSArchana Kakani     uint16_t entity_instance_num;
38bc40dd5aSArchana Kakani     uint16_t entity_container_id;
39bc40dd5aSArchana Kakani 
operator ==pldm_entity_test40bc40dd5aSArchana Kakani     inline bool operator==(pldm_entity_test entity) const
41bc40dd5aSArchana Kakani     {
42bc40dd5aSArchana Kakani         return (entity_type == entity.entity_type) &&
43bc40dd5aSArchana Kakani                (entity_instance_num == entity.entity_instance_num) &&
44bc40dd5aSArchana Kakani                (entity_container_id == entity.entity_container_id);
45bc40dd5aSArchana Kakani     }
46bc40dd5aSArchana Kakani } pldm_entity_test;
47bc40dd5aSArchana Kakani 
getEntity(struct pldm_msgbuf * buf,pldm_entity_test & entity)48bc40dd5aSArchana Kakani static void getEntity(struct pldm_msgbuf* buf, pldm_entity_test& entity)
49bc40dd5aSArchana Kakani {
50bc40dd5aSArchana Kakani     pldm_msgbuf_extract_uint16(buf, entity.entity_type);
51bc40dd5aSArchana Kakani     pldm_msgbuf_extract_uint16(buf, entity.entity_instance_num);
52bc40dd5aSArchana Kakani     pldm_msgbuf_extract_uint16(buf, entity.entity_container_id);
53bc40dd5aSArchana Kakani }
54bc40dd5aSArchana Kakani 
55bc40dd5aSArchana Kakani static void
getAssociationPdrDetails(struct pldm_msgbuf * buf,pldm_association_pdr_test & association_pdr_test)56bc40dd5aSArchana Kakani     getAssociationPdrDetails(struct pldm_msgbuf* buf,
57bc40dd5aSArchana Kakani                              pldm_association_pdr_test& association_pdr_test)
58bc40dd5aSArchana Kakani {
59bc40dd5aSArchana Kakani     pldm_msgbuf_extract_uint32(buf, association_pdr_test.record_handle);
60bc40dd5aSArchana Kakani     pldm_msgbuf_extract_uint8(buf, association_pdr_test.version);
61bc40dd5aSArchana Kakani     pldm_msgbuf_extract_uint8(buf, association_pdr_test.type);
62bc40dd5aSArchana Kakani     pldm_msgbuf_extract_uint16(buf, association_pdr_test.record_change_num);
63bc40dd5aSArchana Kakani     pldm_msgbuf_extract_uint16(buf, association_pdr_test.length);
64bc40dd5aSArchana Kakani 
65bc40dd5aSArchana Kakani     pldm_msgbuf_extract_uint16(buf, association_pdr_test.container_id);
66bc40dd5aSArchana Kakani     pldm_msgbuf_extract_uint8(buf, association_pdr_test.association_type);
67bc40dd5aSArchana Kakani }
68bc40dd5aSArchana Kakani 
69bc40dd5aSArchana Kakani static void
verifyEntityAssociationPdr(struct pldm_msgbuf * buf,const pldm_association_pdr_test & association_pdr,const pldm_entity_test & container_entity1,const pldm_entity_test & child_entity1)70bc40dd5aSArchana Kakani     verifyEntityAssociationPdr(struct pldm_msgbuf* buf,
71bc40dd5aSArchana Kakani                                const pldm_association_pdr_test& association_pdr,
72bc40dd5aSArchana Kakani                                const pldm_entity_test& container_entity1,
73bc40dd5aSArchana Kakani                                const pldm_entity_test& child_entity1)
74bc40dd5aSArchana Kakani {
75bc40dd5aSArchana Kakani     struct pldm_entity_test container_entity = {};
76bc40dd5aSArchana Kakani     struct pldm_entity_test child_entity = {};
77bc40dd5aSArchana Kakani     pldm_association_pdr_test association_pdr_test{};
78bc40dd5aSArchana Kakani 
79bc40dd5aSArchana Kakani     getAssociationPdrDetails(buf, association_pdr_test);
80bc40dd5aSArchana Kakani     getEntity(buf, container_entity);
81bc40dd5aSArchana Kakani     pldm_msgbuf_extract_uint8(buf, association_pdr_test.num_children);
82bc40dd5aSArchana Kakani     getEntity(buf, child_entity);
83bc40dd5aSArchana Kakani 
84*70d21c97SAndrew Jeffery     ASSERT_EQ(pldm_msgbuf_complete_consumed(buf), 0);
85bc40dd5aSArchana Kakani 
86bc40dd5aSArchana Kakani     EXPECT_TRUE(association_pdr_test == association_pdr);
87bc40dd5aSArchana Kakani     EXPECT_TRUE(container_entity == container_entity1);
88bc40dd5aSArchana Kakani     EXPECT_TRUE(child_entity == child_entity1);
89bc40dd5aSArchana Kakani }
90bc40dd5aSArchana Kakani 
TEST(PDRAccess,testInit)9148761c62SAndrew Jeffery TEST(PDRAccess, testInit)
9248761c62SAndrew Jeffery {
9348761c62SAndrew Jeffery     auto repo = pldm_pdr_init();
9448761c62SAndrew Jeffery     EXPECT_EQ(pldm_pdr_get_record_count(repo), 0u);
9548761c62SAndrew Jeffery     EXPECT_EQ(pldm_pdr_get_repo_size(repo), 0u);
9648761c62SAndrew Jeffery     pldm_pdr_destroy(repo);
9748761c62SAndrew Jeffery }
9848761c62SAndrew Jeffery 
TEST(PDRUpdate,testAdd)9948761c62SAndrew Jeffery TEST(PDRUpdate, testAdd)
10048761c62SAndrew Jeffery {
10148761c62SAndrew Jeffery     auto repo = pldm_pdr_init();
10248761c62SAndrew Jeffery 
10348761c62SAndrew Jeffery     std::array<uint8_t, 10> data{};
10448761c62SAndrew Jeffery     uint32_t handle = 0;
105fae3641dSAndrew Jeffery     EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), false, 1, &handle),
10648761c62SAndrew Jeffery               0);
10748761c62SAndrew Jeffery     EXPECT_EQ(handle, 1u);
10848761c62SAndrew Jeffery     EXPECT_EQ(pldm_pdr_get_record_count(repo), 1u);
10948761c62SAndrew Jeffery     EXPECT_EQ(pldm_pdr_get_repo_size(repo), data.size());
11048761c62SAndrew Jeffery 
11148761c62SAndrew Jeffery     handle = 0;
112fae3641dSAndrew Jeffery     EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), false, 1, &handle),
11348761c62SAndrew Jeffery               0);
11448761c62SAndrew Jeffery     EXPECT_EQ(handle, 2u);
11548761c62SAndrew Jeffery 
11648761c62SAndrew Jeffery     handle = 0;
117fae3641dSAndrew Jeffery     EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), false, 1, &handle),
11848761c62SAndrew Jeffery               0);
11948761c62SAndrew Jeffery     EXPECT_EQ(handle, 3u);
12048761c62SAndrew Jeffery 
12148761c62SAndrew Jeffery     handle = 0xdeeddeedu;
122fae3641dSAndrew Jeffery     EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), false, 1, &handle),
12348761c62SAndrew Jeffery               0);
12448761c62SAndrew Jeffery     EXPECT_EQ(handle, 0xdeeddeed);
12548761c62SAndrew Jeffery     EXPECT_EQ(pldm_pdr_get_record_count(repo), 4u);
12648761c62SAndrew Jeffery     EXPECT_EQ(pldm_pdr_get_repo_size(repo), data.size() * 4u);
12748761c62SAndrew Jeffery 
12848761c62SAndrew Jeffery     pldm_pdr_destroy(repo);
12948761c62SAndrew Jeffery }
13048761c62SAndrew Jeffery 
TEST(PDRRemoveByTerminus,testRemoveByTerminus)13148761c62SAndrew Jeffery TEST(PDRRemoveByTerminus, testRemoveByTerminus)
13248761c62SAndrew Jeffery {
13348761c62SAndrew Jeffery     std::array<uint8_t, 10> data{};
13448761c62SAndrew Jeffery 
13548761c62SAndrew Jeffery     auto repo = pldm_pdr_init();
13648761c62SAndrew Jeffery 
137fae3641dSAndrew Jeffery     EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), false, 1, NULL), 0);
13848761c62SAndrew Jeffery     pldm_pdr_remove_pdrs_by_terminus_handle(repo, 1);
13948761c62SAndrew Jeffery     EXPECT_EQ(pldm_pdr_get_record_count(repo), 0u);
14048761c62SAndrew Jeffery     pldm_pdr_destroy(repo);
14148761c62SAndrew Jeffery 
14248761c62SAndrew Jeffery     repo = pldm_pdr_init();
143fae3641dSAndrew Jeffery     EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), true, 2, NULL), 0);
144fae3641dSAndrew Jeffery     EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), true, 1, NULL), 0);
14548761c62SAndrew Jeffery     EXPECT_EQ(pldm_pdr_get_record_count(repo), 2u);
14648761c62SAndrew Jeffery     pldm_pdr_remove_pdrs_by_terminus_handle(repo, 1);
14748761c62SAndrew Jeffery     EXPECT_EQ(pldm_pdr_get_record_count(repo), 1u);
14848761c62SAndrew Jeffery     pldm_pdr_destroy(repo);
14948761c62SAndrew Jeffery 
15048761c62SAndrew Jeffery     repo = pldm_pdr_init();
151fae3641dSAndrew Jeffery     EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), true, 1, NULL), 0);
152fae3641dSAndrew Jeffery     EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), true, 2, NULL), 0);
153fae3641dSAndrew Jeffery     EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), true, 2, NULL), 0);
15448761c62SAndrew Jeffery     EXPECT_EQ(pldm_pdr_get_record_count(repo), 3u);
15548761c62SAndrew Jeffery     pldm_pdr_remove_pdrs_by_terminus_handle(repo, 2);
15648761c62SAndrew Jeffery     EXPECT_EQ(pldm_pdr_get_record_count(repo), 1u);
15748761c62SAndrew Jeffery     pldm_pdr_destroy(repo);
15848761c62SAndrew Jeffery 
15948761c62SAndrew Jeffery     repo = pldm_pdr_init();
160fae3641dSAndrew Jeffery     EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), true, 1, NULL), 0);
161fae3641dSAndrew Jeffery     EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), false, 2, NULL), 0);
162fae3641dSAndrew Jeffery     EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), true, 1, NULL), 0);
16348761c62SAndrew Jeffery     EXPECT_EQ(pldm_pdr_get_record_count(repo), 3u);
16448761c62SAndrew Jeffery     pldm_pdr_remove_remote_pdrs(repo);
16548761c62SAndrew Jeffery     EXPECT_EQ(pldm_pdr_get_record_count(repo), 1u);
16648761c62SAndrew Jeffery     pldm_pdr_remove_pdrs_by_terminus_handle(repo, 1);
16748761c62SAndrew Jeffery     EXPECT_EQ(pldm_pdr_get_record_count(repo), 1u);
16848761c62SAndrew Jeffery     pldm_pdr_remove_pdrs_by_terminus_handle(repo, 2);
16948761c62SAndrew Jeffery     EXPECT_EQ(pldm_pdr_get_record_count(repo), 0u);
17048761c62SAndrew Jeffery     pldm_pdr_destroy(repo);
17148761c62SAndrew Jeffery }
17248761c62SAndrew Jeffery 
TEST(PDRUpdate,testRemove)17348761c62SAndrew Jeffery TEST(PDRUpdate, testRemove)
17448761c62SAndrew Jeffery {
17548761c62SAndrew Jeffery     std::array<uint8_t, 10> data{};
17648761c62SAndrew Jeffery 
17748761c62SAndrew Jeffery     auto repo = pldm_pdr_init();
17848761c62SAndrew Jeffery     pldm_pdr_remove_remote_pdrs(repo);
17948761c62SAndrew Jeffery     EXPECT_EQ(pldm_pdr_get_record_count(repo), 0u);
18048761c62SAndrew Jeffery     pldm_pdr_destroy(repo);
18148761c62SAndrew Jeffery 
18248761c62SAndrew Jeffery     repo = pldm_pdr_init();
183fae3641dSAndrew Jeffery     EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), true, 1, NULL), 0);
18448761c62SAndrew Jeffery     pldm_pdr_remove_remote_pdrs(repo);
18548761c62SAndrew Jeffery     EXPECT_EQ(pldm_pdr_get_record_count(repo), 0u);
18648761c62SAndrew Jeffery     pldm_pdr_destroy(repo);
18748761c62SAndrew Jeffery 
18848761c62SAndrew Jeffery     repo = pldm_pdr_init();
189fae3641dSAndrew Jeffery     EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), false, 1, NULL), 0);
19048761c62SAndrew Jeffery     pldm_pdr_remove_remote_pdrs(repo);
19148761c62SAndrew Jeffery     EXPECT_EQ(pldm_pdr_get_record_count(repo), 1u);
19248761c62SAndrew Jeffery     pldm_pdr_destroy(repo);
19348761c62SAndrew Jeffery 
19448761c62SAndrew Jeffery     repo = pldm_pdr_init();
195fae3641dSAndrew Jeffery     EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), false, 1, NULL), 0);
196fae3641dSAndrew Jeffery     EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), true, 1, NULL), 0);
19748761c62SAndrew Jeffery     pldm_pdr_remove_remote_pdrs(repo);
19848761c62SAndrew Jeffery     EXPECT_EQ(pldm_pdr_get_record_count(repo), 1u);
19948761c62SAndrew Jeffery     pldm_pdr_destroy(repo);
20048761c62SAndrew Jeffery 
20148761c62SAndrew Jeffery     repo = pldm_pdr_init();
202fae3641dSAndrew Jeffery     EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), true, 1, NULL), 0);
203fae3641dSAndrew Jeffery     EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), false, 1, NULL), 0);
20448761c62SAndrew Jeffery     pldm_pdr_remove_remote_pdrs(repo);
20548761c62SAndrew Jeffery     EXPECT_EQ(pldm_pdr_get_record_count(repo), 1u);
20648761c62SAndrew Jeffery     pldm_pdr_destroy(repo);
20748761c62SAndrew Jeffery 
20848761c62SAndrew Jeffery     repo = pldm_pdr_init();
209fae3641dSAndrew Jeffery     EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), true, 1, NULL), 0);
210fae3641dSAndrew Jeffery     EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), true, 1, NULL), 0);
211fae3641dSAndrew Jeffery     EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), true, 1, NULL), 0);
212fae3641dSAndrew Jeffery     EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), true, 1, NULL), 0);
21348761c62SAndrew Jeffery     pldm_pdr_remove_remote_pdrs(repo);
21448761c62SAndrew Jeffery     EXPECT_EQ(pldm_pdr_get_record_count(repo), 0u);
215fae3641dSAndrew Jeffery     EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), true, 1, NULL), 0);
216fae3641dSAndrew Jeffery     EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), false, 1, NULL), 0);
21748761c62SAndrew Jeffery     EXPECT_EQ(pldm_pdr_get_record_count(repo), 2u);
21848761c62SAndrew Jeffery     pldm_pdr_destroy(repo);
21948761c62SAndrew Jeffery 
22048761c62SAndrew Jeffery     repo = pldm_pdr_init();
221fae3641dSAndrew Jeffery     EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), false, 1, NULL), 0);
222fae3641dSAndrew Jeffery     EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), false, 1, NULL), 0);
223fae3641dSAndrew Jeffery     EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), false, 1, NULL), 0);
224fae3641dSAndrew Jeffery     EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), false, 1, NULL), 0);
22548761c62SAndrew Jeffery     pldm_pdr_remove_remote_pdrs(repo);
22648761c62SAndrew Jeffery     EXPECT_EQ(pldm_pdr_get_record_count(repo), 4u);
227fae3641dSAndrew Jeffery     EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), true, 1, NULL), 0);
228fae3641dSAndrew Jeffery     EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), false, 1, NULL), 0);
22948761c62SAndrew Jeffery     EXPECT_EQ(pldm_pdr_get_record_count(repo), 6u);
23048761c62SAndrew Jeffery     pldm_pdr_destroy(repo);
23148761c62SAndrew Jeffery 
23248761c62SAndrew Jeffery     repo = pldm_pdr_init();
233fae3641dSAndrew Jeffery     EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), true, 1, NULL), 0);
234fae3641dSAndrew Jeffery     EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), false, 1, NULL), 0);
235fae3641dSAndrew Jeffery     EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), false, 1, NULL), 0);
236fae3641dSAndrew Jeffery     EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), false, 1, NULL), 0);
23748761c62SAndrew Jeffery     pldm_pdr_remove_remote_pdrs(repo);
23848761c62SAndrew Jeffery     EXPECT_EQ(pldm_pdr_get_record_count(repo), 3u);
239fae3641dSAndrew Jeffery     EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), true, 1, NULL), 0);
240fae3641dSAndrew Jeffery     EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), false, 1, NULL), 0);
24148761c62SAndrew Jeffery     EXPECT_EQ(pldm_pdr_get_record_count(repo), 5u);
24248761c62SAndrew Jeffery     pldm_pdr_destroy(repo);
24348761c62SAndrew Jeffery 
24448761c62SAndrew Jeffery     repo = pldm_pdr_init();
245fae3641dSAndrew Jeffery     EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), false, 1, NULL), 0);
246fae3641dSAndrew Jeffery     EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), false, 1, NULL), 0);
247fae3641dSAndrew Jeffery     EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), false, 1, NULL), 0);
248fae3641dSAndrew Jeffery     EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), true, 1, NULL), 0);
24948761c62SAndrew Jeffery     pldm_pdr_remove_remote_pdrs(repo);
25048761c62SAndrew Jeffery     EXPECT_EQ(pldm_pdr_get_record_count(repo), 3u);
251fae3641dSAndrew Jeffery     EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), true, 1, NULL), 0);
252fae3641dSAndrew Jeffery     EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), false, 1, NULL), 0);
25348761c62SAndrew Jeffery     EXPECT_EQ(pldm_pdr_get_record_count(repo), 5u);
25448761c62SAndrew Jeffery     pldm_pdr_destroy(repo);
25548761c62SAndrew Jeffery 
25648761c62SAndrew Jeffery     repo = pldm_pdr_init();
257fae3641dSAndrew Jeffery     EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), true, 1, NULL), 0);
258fae3641dSAndrew Jeffery     EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), false, 1, NULL), 0);
259fae3641dSAndrew Jeffery     EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), true, 1, NULL), 0);
260fae3641dSAndrew Jeffery     EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), false, 1, NULL), 0);
26148761c62SAndrew Jeffery     pldm_pdr_remove_remote_pdrs(repo);
26248761c62SAndrew Jeffery     EXPECT_EQ(pldm_pdr_get_record_count(repo), 2u);
263fae3641dSAndrew Jeffery     EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), false, 1, NULL), 0);
264fae3641dSAndrew Jeffery     EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), true, 1, NULL), 0);
26548761c62SAndrew Jeffery     EXPECT_EQ(pldm_pdr_get_record_count(repo), 4u);
26648761c62SAndrew Jeffery     pldm_pdr_destroy(repo);
26748761c62SAndrew Jeffery 
26848761c62SAndrew Jeffery     repo = pldm_pdr_init();
269fae3641dSAndrew Jeffery     EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), false, 1, NULL), 0);
270fae3641dSAndrew Jeffery     EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), false, 1, NULL), 0);
271fae3641dSAndrew Jeffery     EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), false, 1, NULL), 0);
272fae3641dSAndrew Jeffery     EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), true, 1, NULL), 0);
27348761c62SAndrew Jeffery     pldm_pdr_remove_remote_pdrs(repo);
27448761c62SAndrew Jeffery     EXPECT_EQ(pldm_pdr_get_record_count(repo), 3u);
275fae3641dSAndrew Jeffery     EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), false, 1, NULL), 0);
276fae3641dSAndrew Jeffery     EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), true, 1, NULL), 0);
27748761c62SAndrew Jeffery     EXPECT_EQ(pldm_pdr_get_record_count(repo), 5u);
27848761c62SAndrew Jeffery     pldm_pdr_destroy(repo);
27948761c62SAndrew Jeffery 
28048761c62SAndrew Jeffery     repo = pldm_pdr_init();
281fae3641dSAndrew Jeffery     EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), false, 1, NULL), 0);
282fae3641dSAndrew Jeffery     EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), true, 1, NULL), 0);
283fae3641dSAndrew Jeffery     EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), false, 1, NULL), 0);
284fae3641dSAndrew Jeffery     EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), true, 1, NULL), 0);
28548761c62SAndrew Jeffery     pldm_pdr_remove_remote_pdrs(repo);
28648761c62SAndrew Jeffery     EXPECT_EQ(pldm_pdr_get_record_count(repo), 2u);
287fae3641dSAndrew Jeffery     EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), false, 1, NULL), 0);
288fae3641dSAndrew Jeffery     EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), true, 1, NULL), 0);
28948761c62SAndrew Jeffery     EXPECT_EQ(pldm_pdr_get_record_count(repo), 4u);
29048761c62SAndrew Jeffery     pldm_pdr_destroy(repo);
29148761c62SAndrew Jeffery 
29248761c62SAndrew Jeffery     repo = pldm_pdr_init();
293fae3641dSAndrew Jeffery     EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), true, 1, NULL), 0);
294fae3641dSAndrew Jeffery     EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), true, 1, NULL), 0);
295fae3641dSAndrew Jeffery     EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), true, 1, NULL), 0);
296fae3641dSAndrew Jeffery     EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), false, 1, NULL), 0);
29748761c62SAndrew Jeffery     pldm_pdr_remove_remote_pdrs(repo);
29848761c62SAndrew Jeffery     EXPECT_EQ(pldm_pdr_get_record_count(repo), 1u);
299fae3641dSAndrew Jeffery     EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), false, 1, NULL), 0);
300fae3641dSAndrew Jeffery     EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), true, 1, NULL), 0);
30148761c62SAndrew Jeffery     EXPECT_EQ(pldm_pdr_get_record_count(repo), 3u);
30248761c62SAndrew Jeffery     pldm_pdr_destroy(repo);
30348761c62SAndrew Jeffery 
30448761c62SAndrew Jeffery     repo = pldm_pdr_init();
305fae3641dSAndrew Jeffery     EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), false, 1, NULL), 0);
306fae3641dSAndrew Jeffery     EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), true, 1, NULL), 0);
307fae3641dSAndrew Jeffery     EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), true, 1, NULL), 0);
308fae3641dSAndrew Jeffery     EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), true, 1, NULL), 0);
30948761c62SAndrew Jeffery     pldm_pdr_remove_remote_pdrs(repo);
31048761c62SAndrew Jeffery     EXPECT_EQ(pldm_pdr_get_record_count(repo), 1u);
311fae3641dSAndrew Jeffery     EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), false, 1, NULL), 0);
312fae3641dSAndrew Jeffery     EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), true, 1, NULL), 0);
31348761c62SAndrew Jeffery     EXPECT_EQ(pldm_pdr_get_record_count(repo), 3u);
31448761c62SAndrew Jeffery     pldm_pdr_destroy(repo);
31548761c62SAndrew Jeffery 
31648761c62SAndrew Jeffery     repo = pldm_pdr_init();
317fae3641dSAndrew Jeffery     EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), false, 1, NULL), 0);
318fae3641dSAndrew Jeffery     EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), true, 1, NULL), 0);
319fae3641dSAndrew Jeffery     EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), true, 1, NULL), 0);
320fae3641dSAndrew Jeffery     EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), false, 1, NULL), 0);
32148761c62SAndrew Jeffery     pldm_pdr_remove_remote_pdrs(repo);
32248761c62SAndrew Jeffery     EXPECT_EQ(pldm_pdr_get_record_count(repo), 2u);
323fae3641dSAndrew Jeffery     EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), false, 1, NULL), 0);
324fae3641dSAndrew Jeffery     EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), true, 1, NULL), 0);
32548761c62SAndrew Jeffery     EXPECT_EQ(pldm_pdr_get_record_count(repo), 4u);
32648761c62SAndrew Jeffery     pldm_pdr_destroy(repo);
32748761c62SAndrew Jeffery 
32848761c62SAndrew Jeffery     repo = pldm_pdr_init();
329fae3641dSAndrew Jeffery     EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), true, 1, NULL), 0);
330fae3641dSAndrew Jeffery     EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), false, 1, NULL), 0);
331fae3641dSAndrew Jeffery     EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), false, 1, NULL), 0);
332fae3641dSAndrew Jeffery     EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), true, 1, NULL), 0);
33348761c62SAndrew Jeffery     pldm_pdr_remove_remote_pdrs(repo);
33448761c62SAndrew Jeffery     EXPECT_EQ(pldm_pdr_get_record_count(repo), 2u);
33548761c62SAndrew Jeffery     uint32_t handle = 0;
336fae3641dSAndrew Jeffery     EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), false, 1, &handle),
33748761c62SAndrew Jeffery               0);
33848761c62SAndrew Jeffery     EXPECT_EQ(handle, 3u);
33948761c62SAndrew Jeffery     handle = 0;
340fae3641dSAndrew Jeffery     EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), true, 1, &handle),
34148761c62SAndrew Jeffery               0);
34248761c62SAndrew Jeffery     EXPECT_EQ(handle, 4u);
34348761c62SAndrew Jeffery     EXPECT_EQ(pldm_pdr_get_record_count(repo), 4u);
34448761c62SAndrew Jeffery     pldm_pdr_destroy(repo);
34548761c62SAndrew Jeffery }
34648761c62SAndrew Jeffery 
TEST(PDRAccess,testGet)34748761c62SAndrew Jeffery TEST(PDRAccess, testGet)
34848761c62SAndrew Jeffery {
34948761c62SAndrew Jeffery     auto repo = pldm_pdr_init();
35048761c62SAndrew Jeffery 
35148761c62SAndrew Jeffery     std::array<uint32_t, 10> in{100, 345, 3, 6, 89, 0, 11, 45, 23434, 123123};
35248761c62SAndrew Jeffery     uint32_t handle = 1;
353d0ba43afSAndrew Jeffery     // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
354fae3641dSAndrew Jeffery     EXPECT_EQ(pldm_pdr_add(repo, reinterpret_cast<uint8_t*>(in.data()),
35548761c62SAndrew Jeffery                            sizeof(in), false, 1, &handle),
35648761c62SAndrew Jeffery               0);
35748761c62SAndrew Jeffery     EXPECT_EQ(pldm_pdr_get_record_count(repo), 1u);
35848761c62SAndrew Jeffery     EXPECT_EQ(pldm_pdr_get_repo_size(repo), sizeof(in));
35948761c62SAndrew Jeffery     uint32_t size{};
36048761c62SAndrew Jeffery     uint32_t nextRecHdl{};
36148761c62SAndrew Jeffery     uint8_t* outData = nullptr;
36248761c62SAndrew Jeffery     auto hdl = pldm_pdr_find_record(repo, 0, &outData, &size, &nextRecHdl);
36348761c62SAndrew Jeffery     EXPECT_NE(hdl, nullptr);
36448761c62SAndrew Jeffery     EXPECT_EQ(size, sizeof(in));
36548761c62SAndrew Jeffery     EXPECT_EQ(nextRecHdl, 0u);
36648761c62SAndrew Jeffery     EXPECT_EQ(memcmp(outData, in.data(), sizeof(in)), 0);
36748761c62SAndrew Jeffery     outData = nullptr;
36848761c62SAndrew Jeffery 
36948761c62SAndrew Jeffery     auto hdl2 = pldm_pdr_find_record(repo, 1, &outData, &size, &nextRecHdl);
37048761c62SAndrew Jeffery     EXPECT_EQ(hdl, hdl2);
37148761c62SAndrew Jeffery     EXPECT_NE(hdl, nullptr);
37248761c62SAndrew Jeffery     EXPECT_EQ(size, sizeof(in));
37348761c62SAndrew Jeffery     EXPECT_EQ(nextRecHdl, 0u);
37448761c62SAndrew Jeffery     EXPECT_EQ(memcmp(outData, in.data(), sizeof(in)), 0);
37548761c62SAndrew Jeffery     outData = nullptr;
37648761c62SAndrew Jeffery 
37748761c62SAndrew Jeffery     hdl = pldm_pdr_find_record(repo, htole32(0xdeaddead), &outData, &size,
37848761c62SAndrew Jeffery                                &nextRecHdl);
37948761c62SAndrew Jeffery     EXPECT_EQ(hdl, nullptr);
38048761c62SAndrew Jeffery     EXPECT_EQ(size, 0u);
38148761c62SAndrew Jeffery     EXPECT_EQ(nextRecHdl, 0u);
38248761c62SAndrew Jeffery     EXPECT_EQ(outData, nullptr);
38348761c62SAndrew Jeffery     outData = nullptr;
38448761c62SAndrew Jeffery 
38548761c62SAndrew Jeffery     std::array<uint32_t, 10> in2{1000, 3450, 30,  60,     890,
38648761c62SAndrew Jeffery                                  0,    110,  450, 234034, 123123};
38748761c62SAndrew Jeffery     handle = 2;
388d0ba43afSAndrew Jeffery     // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
389fae3641dSAndrew Jeffery     EXPECT_EQ(pldm_pdr_add(repo, reinterpret_cast<uint8_t*>(in2.data()),
39048761c62SAndrew Jeffery                            sizeof(in2), false, 1, &handle),
39148761c62SAndrew Jeffery               0);
39248761c62SAndrew Jeffery     handle = 3;
393d0ba43afSAndrew Jeffery     // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
394fae3641dSAndrew Jeffery     EXPECT_EQ(pldm_pdr_add(repo, reinterpret_cast<uint8_t*>(in2.data()),
39548761c62SAndrew Jeffery                            sizeof(in2), false, 1, &handle),
39648761c62SAndrew Jeffery               0);
39748761c62SAndrew Jeffery     handle = 4;
398d0ba43afSAndrew Jeffery     // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
399fae3641dSAndrew Jeffery     EXPECT_EQ(pldm_pdr_add(repo, reinterpret_cast<uint8_t*>(in2.data()),
40048761c62SAndrew Jeffery                            sizeof(in2), true, 1, &handle),
40148761c62SAndrew Jeffery               0);
40248761c62SAndrew Jeffery     EXPECT_EQ(pldm_pdr_get_record_count(repo), 4u);
40348761c62SAndrew Jeffery     EXPECT_EQ(pldm_pdr_get_repo_size(repo), sizeof(in2) * 4);
40448761c62SAndrew Jeffery     hdl = pldm_pdr_find_record(repo, 0, &outData, &size, &nextRecHdl);
40548761c62SAndrew Jeffery     EXPECT_NE(hdl, nullptr);
40648761c62SAndrew Jeffery     EXPECT_EQ(size, sizeof(in));
40748761c62SAndrew Jeffery     EXPECT_EQ(nextRecHdl, 2u);
40848761c62SAndrew Jeffery     EXPECT_EQ(memcmp(outData, in.data(), sizeof(in)), 0);
40948761c62SAndrew Jeffery     outData = nullptr;
41048761c62SAndrew Jeffery     hdl2 = pldm_pdr_find_record(repo, 1, &outData, &size, &nextRecHdl);
41148761c62SAndrew Jeffery     EXPECT_EQ(hdl, hdl2);
41248761c62SAndrew Jeffery     EXPECT_NE(hdl, nullptr);
41348761c62SAndrew Jeffery     EXPECT_EQ(size, sizeof(in));
41448761c62SAndrew Jeffery     EXPECT_EQ(nextRecHdl, 2u);
41548761c62SAndrew Jeffery     EXPECT_EQ(memcmp(outData, in.data(), sizeof(in)), 0);
41648761c62SAndrew Jeffery     outData = nullptr;
41748761c62SAndrew Jeffery     hdl = pldm_pdr_find_record(repo, 2, &outData, &size, &nextRecHdl);
41848761c62SAndrew Jeffery     EXPECT_NE(hdl, nullptr);
41948761c62SAndrew Jeffery     EXPECT_EQ(size, sizeof(in2));
42048761c62SAndrew Jeffery     EXPECT_EQ(nextRecHdl, 3u);
42148761c62SAndrew Jeffery     EXPECT_EQ(memcmp(outData, in2.data(), sizeof(in2)), 0);
42248761c62SAndrew Jeffery     outData = nullptr;
42348761c62SAndrew Jeffery     hdl = pldm_pdr_find_record(repo, 3, &outData, &size, &nextRecHdl);
42448761c62SAndrew Jeffery     EXPECT_NE(hdl, nullptr);
42548761c62SAndrew Jeffery     EXPECT_EQ(pldm_pdr_record_is_remote(hdl), false);
42648761c62SAndrew Jeffery     EXPECT_EQ(size, sizeof(in2));
42748761c62SAndrew Jeffery     EXPECT_EQ(nextRecHdl, 4u);
42848761c62SAndrew Jeffery     EXPECT_EQ(memcmp(outData, in2.data(), sizeof(in2)), 0);
42948761c62SAndrew Jeffery     outData = nullptr;
43048761c62SAndrew Jeffery     hdl = pldm_pdr_find_record(repo, 4, &outData, &size, &nextRecHdl);
43148761c62SAndrew Jeffery     EXPECT_NE(hdl, nullptr);
43248761c62SAndrew Jeffery     EXPECT_EQ(pldm_pdr_record_is_remote(hdl), true);
43348761c62SAndrew Jeffery     EXPECT_EQ(size, sizeof(in2));
43448761c62SAndrew Jeffery     EXPECT_EQ(nextRecHdl, 0u);
43548761c62SAndrew Jeffery     EXPECT_EQ(memcmp(outData, in2.data(), sizeof(in2)), 0);
43648761c62SAndrew Jeffery     outData = nullptr;
43748761c62SAndrew Jeffery 
43848761c62SAndrew Jeffery     pldm_pdr_destroy(repo);
43948761c62SAndrew Jeffery }
44048761c62SAndrew Jeffery 
TEST(PDRAccess,testGetNext)44148761c62SAndrew Jeffery TEST(PDRAccess, testGetNext)
44248761c62SAndrew Jeffery {
44348761c62SAndrew Jeffery     auto repo = pldm_pdr_init();
44448761c62SAndrew Jeffery 
44548761c62SAndrew Jeffery     std::array<uint32_t, 10> in{100, 345, 3, 6, 89, 0, 11, 45, 23434, 123123};
44648761c62SAndrew Jeffery     uint32_t handle = 1;
447d0ba43afSAndrew Jeffery     // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
448fae3641dSAndrew Jeffery     EXPECT_EQ(pldm_pdr_add(repo, reinterpret_cast<uint8_t*>(in.data()),
44948761c62SAndrew Jeffery                            sizeof(in), false, 1, &handle),
45048761c62SAndrew Jeffery               0);
45148761c62SAndrew Jeffery     EXPECT_EQ(pldm_pdr_get_record_count(repo), 1u);
45248761c62SAndrew Jeffery     EXPECT_EQ(pldm_pdr_get_repo_size(repo), sizeof(in));
45348761c62SAndrew Jeffery     uint32_t size{};
45448761c62SAndrew Jeffery     uint32_t nextRecHdl{};
45548761c62SAndrew Jeffery     uint8_t* outData = nullptr;
45648761c62SAndrew Jeffery     auto hdl = pldm_pdr_find_record(repo, 0, &outData, &size, &nextRecHdl);
45748761c62SAndrew Jeffery     EXPECT_NE(hdl, nullptr);
45848761c62SAndrew Jeffery     EXPECT_EQ(size, sizeof(in));
45948761c62SAndrew Jeffery     EXPECT_EQ(nextRecHdl, 0u);
46048761c62SAndrew Jeffery     EXPECT_EQ(memcmp(outData, in.data(), sizeof(in)), 0);
46148761c62SAndrew Jeffery     outData = nullptr;
46248761c62SAndrew Jeffery 
46348761c62SAndrew Jeffery     std::array<uint32_t, 10> in2{1000, 3450, 30,  60,     890,
46448761c62SAndrew Jeffery                                  0,    110,  450, 234034, 123123};
46548761c62SAndrew Jeffery     handle = 2;
466d0ba43afSAndrew Jeffery     // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
467fae3641dSAndrew Jeffery     EXPECT_EQ(pldm_pdr_add(repo, reinterpret_cast<uint8_t*>(in2.data()),
46848761c62SAndrew Jeffery                            sizeof(in2), false, 1, &handle),
46948761c62SAndrew Jeffery               0);
47048761c62SAndrew Jeffery     handle = 3;
471d0ba43afSAndrew Jeffery     // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
472fae3641dSAndrew Jeffery     EXPECT_EQ(pldm_pdr_add(repo, reinterpret_cast<uint8_t*>(in2.data()),
47348761c62SAndrew Jeffery                            sizeof(in2), false, 1, &handle),
47448761c62SAndrew Jeffery               0);
47548761c62SAndrew Jeffery     handle = 4;
476d0ba43afSAndrew Jeffery     // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
477fae3641dSAndrew Jeffery     EXPECT_EQ(pldm_pdr_add(repo, reinterpret_cast<uint8_t*>(in2.data()),
47848761c62SAndrew Jeffery                            sizeof(in2), false, 1, &handle),
47948761c62SAndrew Jeffery               0);
48048761c62SAndrew Jeffery     EXPECT_EQ(pldm_pdr_get_record_count(repo), 4u);
48148761c62SAndrew Jeffery     EXPECT_EQ(pldm_pdr_get_repo_size(repo), sizeof(in2) * 4);
48248761c62SAndrew Jeffery     hdl = pldm_pdr_get_next_record(repo, hdl, &outData, &size, &nextRecHdl);
48348761c62SAndrew Jeffery     EXPECT_NE(hdl, nullptr);
48448761c62SAndrew Jeffery     EXPECT_EQ(size, sizeof(in2));
48548761c62SAndrew Jeffery     EXPECT_EQ(nextRecHdl, 3u);
48648761c62SAndrew Jeffery     EXPECT_EQ(memcmp(outData, in2.data(), sizeof(in2)), 0);
48748761c62SAndrew Jeffery     outData = nullptr;
48848761c62SAndrew Jeffery     hdl = pldm_pdr_get_next_record(repo, hdl, &outData, &size, &nextRecHdl);
48948761c62SAndrew Jeffery     EXPECT_NE(hdl, nullptr);
49048761c62SAndrew Jeffery     EXPECT_EQ(size, sizeof(in2));
49148761c62SAndrew Jeffery     EXPECT_EQ(nextRecHdl, 4u);
49248761c62SAndrew Jeffery     EXPECT_EQ(memcmp(outData, in2.data(), sizeof(in2)), 0);
49348761c62SAndrew Jeffery     outData = nullptr;
49448761c62SAndrew Jeffery     hdl = pldm_pdr_get_next_record(repo, hdl, &outData, &size, &nextRecHdl);
49548761c62SAndrew Jeffery     EXPECT_NE(hdl, nullptr);
49648761c62SAndrew Jeffery     EXPECT_EQ(size, sizeof(in2));
49748761c62SAndrew Jeffery     EXPECT_EQ(nextRecHdl, 0u);
49848761c62SAndrew Jeffery     EXPECT_EQ(memcmp(outData, in2.data(), sizeof(in2)), 0);
49948761c62SAndrew Jeffery     outData = nullptr;
50048761c62SAndrew Jeffery 
50148761c62SAndrew Jeffery     pldm_pdr_destroy(repo);
50248761c62SAndrew Jeffery }
50348761c62SAndrew Jeffery 
TEST(PDRAccess,testFindByType)50448761c62SAndrew Jeffery TEST(PDRAccess, testFindByType)
50548761c62SAndrew Jeffery {
50648761c62SAndrew Jeffery     auto repo = pldm_pdr_init();
50748761c62SAndrew Jeffery 
50848761c62SAndrew Jeffery     std::array<uint8_t, sizeof(pldm_pdr_hdr)> data{};
509d0ba43afSAndrew Jeffery     // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
51048761c62SAndrew Jeffery     pldm_pdr_hdr* hdr = reinterpret_cast<pldm_pdr_hdr*>(data.data());
51148761c62SAndrew Jeffery     hdr->type = 1;
51248761c62SAndrew Jeffery     uint32_t first = 0;
513fae3641dSAndrew Jeffery     EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), false, 1, &first),
51448761c62SAndrew Jeffery               0);
51548761c62SAndrew Jeffery     hdr->type = 2;
51648761c62SAndrew Jeffery     uint32_t second = 0;
517fae3641dSAndrew Jeffery     EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), false, 1, &second),
51848761c62SAndrew Jeffery               0);
51948761c62SAndrew Jeffery     hdr->type = 3;
52048761c62SAndrew Jeffery     uint32_t third = 0;
521fae3641dSAndrew Jeffery     EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), false, 1, &third),
52248761c62SAndrew Jeffery               0);
52348761c62SAndrew Jeffery     hdr->type = 4;
52448761c62SAndrew Jeffery     uint32_t fourth = 0;
525fae3641dSAndrew Jeffery     EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), false, 1, &fourth),
52648761c62SAndrew Jeffery               0);
52748761c62SAndrew Jeffery 
52848761c62SAndrew Jeffery     uint8_t* outData = nullptr;
52948761c62SAndrew Jeffery     uint32_t size{};
53048761c62SAndrew Jeffery     auto firstRec =
53148761c62SAndrew Jeffery         pldm_pdr_find_record_by_type(repo, 1, nullptr, &outData, &size);
53248761c62SAndrew Jeffery     EXPECT_EQ(pldm_pdr_get_record_handle(repo, firstRec), first);
53348761c62SAndrew Jeffery     outData = nullptr;
53448761c62SAndrew Jeffery     auto secondRec =
53548761c62SAndrew Jeffery         pldm_pdr_find_record_by_type(repo, 2, nullptr, &outData, &size);
53648761c62SAndrew Jeffery     EXPECT_EQ(pldm_pdr_get_record_handle(repo, secondRec), second);
53748761c62SAndrew Jeffery     outData = nullptr;
53848761c62SAndrew Jeffery     auto thirdRec =
53948761c62SAndrew Jeffery         pldm_pdr_find_record_by_type(repo, 3, nullptr, &outData, &size);
54048761c62SAndrew Jeffery     EXPECT_EQ(pldm_pdr_get_record_handle(repo, thirdRec), third);
54148761c62SAndrew Jeffery     outData = nullptr;
54248761c62SAndrew Jeffery     auto fourthRec =
54348761c62SAndrew Jeffery         pldm_pdr_find_record_by_type(repo, 4, nullptr, &outData, &size);
54448761c62SAndrew Jeffery     EXPECT_EQ(pldm_pdr_get_record_handle(repo, fourthRec), fourth);
54548761c62SAndrew Jeffery     outData = nullptr;
54648761c62SAndrew Jeffery     auto fifthRec =
54748761c62SAndrew Jeffery         pldm_pdr_find_record_by_type(repo, 5, nullptr, &outData, &size);
54848761c62SAndrew Jeffery     EXPECT_EQ(fifthRec, nullptr);
54948761c62SAndrew Jeffery     EXPECT_EQ(outData, nullptr);
55048761c62SAndrew Jeffery     EXPECT_EQ(size, 0u);
55148761c62SAndrew Jeffery 
55248761c62SAndrew Jeffery     auto rec =
55348761c62SAndrew Jeffery         pldm_pdr_find_record_by_type(repo, 3, secondRec, &outData, &size);
55448761c62SAndrew Jeffery     EXPECT_EQ(pldm_pdr_get_record_handle(repo, rec), third);
55548761c62SAndrew Jeffery     outData = nullptr;
55648761c62SAndrew Jeffery     rec = pldm_pdr_find_record_by_type(repo, 4, secondRec, &outData, &size);
55748761c62SAndrew Jeffery     EXPECT_EQ(pldm_pdr_get_record_handle(repo, rec), fourth);
55848761c62SAndrew Jeffery     outData = nullptr;
55948761c62SAndrew Jeffery     rec = pldm_pdr_find_record_by_type(repo, 2, firstRec, &outData, &size);
56048761c62SAndrew Jeffery     EXPECT_EQ(pldm_pdr_get_record_handle(repo, rec), second);
56148761c62SAndrew Jeffery     outData = nullptr;
56248761c62SAndrew Jeffery 
56348761c62SAndrew Jeffery     pldm_pdr_destroy(repo);
56448761c62SAndrew Jeffery }
56548761c62SAndrew Jeffery 
TEST(PDRUpdate,testAddFruRecordSet)56648761c62SAndrew Jeffery TEST(PDRUpdate, testAddFruRecordSet)
56748761c62SAndrew Jeffery {
56848761c62SAndrew Jeffery     auto repo = pldm_pdr_init();
56948761c62SAndrew Jeffery 
57048761c62SAndrew Jeffery     uint32_t handle = 0;
571e7f55113SAndrew Jeffery     EXPECT_EQ(pldm_pdr_add_fru_record_set(repo, 1, 10, 1, 0, 100, &handle), 0);
57248761c62SAndrew Jeffery     EXPECT_EQ(handle, 1u);
57348761c62SAndrew Jeffery     EXPECT_EQ(pldm_pdr_get_record_count(repo), 1u);
57448761c62SAndrew Jeffery     EXPECT_EQ(pldm_pdr_get_repo_size(repo),
57548761c62SAndrew Jeffery               sizeof(pldm_pdr_hdr) + sizeof(pldm_pdr_fru_record_set));
57648761c62SAndrew Jeffery     uint32_t size{};
57748761c62SAndrew Jeffery     uint32_t nextRecHdl{};
57848761c62SAndrew Jeffery     uint8_t* outData = nullptr;
57948761c62SAndrew Jeffery     auto hdl = pldm_pdr_find_record(repo, 0, &outData, &size, &nextRecHdl);
58048761c62SAndrew Jeffery     EXPECT_NE(hdl, nullptr);
58148761c62SAndrew Jeffery     EXPECT_EQ(size, sizeof(pldm_pdr_hdr) + sizeof(pldm_pdr_fru_record_set));
58248761c62SAndrew Jeffery     EXPECT_EQ(nextRecHdl, 0u);
583d0ba43afSAndrew Jeffery     // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
58448761c62SAndrew Jeffery     pldm_pdr_hdr* hdr = reinterpret_cast<pldm_pdr_hdr*>(outData);
58548761c62SAndrew Jeffery     EXPECT_EQ(hdr->version, 1u);
58648761c62SAndrew Jeffery     EXPECT_EQ(hdr->type, PLDM_PDR_FRU_RECORD_SET);
58748761c62SAndrew Jeffery     EXPECT_EQ(hdr->length, htole16(sizeof(pldm_pdr_fru_record_set)));
58848761c62SAndrew Jeffery     EXPECT_EQ(hdr->record_handle, htole32(1));
589d0ba43afSAndrew Jeffery     // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
59048761c62SAndrew Jeffery     pldm_pdr_fru_record_set* fru = reinterpret_cast<pldm_pdr_fru_record_set*>(
59148761c62SAndrew Jeffery         outData + sizeof(pldm_pdr_hdr));
59248761c62SAndrew Jeffery     EXPECT_EQ(fru->terminus_handle, htole16(1));
59348761c62SAndrew Jeffery     EXPECT_EQ(fru->fru_rsi, htole16(10));
59448761c62SAndrew Jeffery     EXPECT_EQ(fru->entity_type, htole16(1));
59548761c62SAndrew Jeffery     EXPECT_EQ(fru->entity_instance_num, htole16(0));
59648761c62SAndrew Jeffery     EXPECT_EQ(fru->container_id, htole16(100));
59748761c62SAndrew Jeffery     outData = nullptr;
59848761c62SAndrew Jeffery 
59948761c62SAndrew Jeffery     handle = 0;
600e7f55113SAndrew Jeffery     EXPECT_EQ(pldm_pdr_add_fru_record_set(repo, 2, 11, 2, 1, 101, &handle), 0);
60148761c62SAndrew Jeffery     EXPECT_EQ(handle, 2u);
60248761c62SAndrew Jeffery     EXPECT_EQ(pldm_pdr_get_record_count(repo), 2u);
60348761c62SAndrew Jeffery     EXPECT_EQ(pldm_pdr_get_repo_size(repo),
60448761c62SAndrew Jeffery               2 * (sizeof(pldm_pdr_hdr) + sizeof(pldm_pdr_fru_record_set)));
60548761c62SAndrew Jeffery     hdl = pldm_pdr_find_record(repo, 2, &outData, &size, &nextRecHdl);
60648761c62SAndrew Jeffery     EXPECT_NE(hdl, nullptr);
60748761c62SAndrew Jeffery     EXPECT_EQ(size, sizeof(pldm_pdr_hdr) + sizeof(pldm_pdr_fru_record_set));
60848761c62SAndrew Jeffery     EXPECT_EQ(nextRecHdl, 0u);
609d0ba43afSAndrew Jeffery     // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
61048761c62SAndrew Jeffery     hdr = reinterpret_cast<pldm_pdr_hdr*>(outData);
61148761c62SAndrew Jeffery     EXPECT_EQ(hdr->version, 1u);
61248761c62SAndrew Jeffery     EXPECT_EQ(hdr->type, PLDM_PDR_FRU_RECORD_SET);
61348761c62SAndrew Jeffery     EXPECT_EQ(hdr->length, htole16(sizeof(pldm_pdr_fru_record_set)));
61448761c62SAndrew Jeffery     EXPECT_EQ(hdr->record_handle, htole32(2));
615d0ba43afSAndrew Jeffery     // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
61648761c62SAndrew Jeffery     fru = reinterpret_cast<pldm_pdr_fru_record_set*>(outData +
61748761c62SAndrew Jeffery                                                      sizeof(pldm_pdr_hdr));
61848761c62SAndrew Jeffery     EXPECT_EQ(fru->terminus_handle, htole16(2));
61948761c62SAndrew Jeffery     EXPECT_EQ(fru->fru_rsi, htole16(11));
62048761c62SAndrew Jeffery     EXPECT_EQ(fru->entity_type, htole16(2));
62148761c62SAndrew Jeffery     EXPECT_EQ(fru->entity_instance_num, htole16(1));
62248761c62SAndrew Jeffery     EXPECT_EQ(fru->container_id, htole16(101));
62348761c62SAndrew Jeffery     outData = nullptr;
62448761c62SAndrew Jeffery 
62548761c62SAndrew Jeffery     hdl = pldm_pdr_find_record(repo, 1, &outData, &size, &nextRecHdl);
62648761c62SAndrew Jeffery     EXPECT_NE(hdl, nullptr);
62748761c62SAndrew Jeffery     EXPECT_EQ(size, sizeof(pldm_pdr_hdr) + sizeof(pldm_pdr_fru_record_set));
62848761c62SAndrew Jeffery     EXPECT_EQ(nextRecHdl, 2u);
629d0ba43afSAndrew Jeffery     // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
63048761c62SAndrew Jeffery     hdr = reinterpret_cast<pldm_pdr_hdr*>(outData);
63148761c62SAndrew Jeffery     EXPECT_EQ(hdr->version, 1u);
63248761c62SAndrew Jeffery     EXPECT_EQ(hdr->type, PLDM_PDR_FRU_RECORD_SET);
63348761c62SAndrew Jeffery     EXPECT_EQ(hdr->length, htole16(sizeof(pldm_pdr_fru_record_set)));
63448761c62SAndrew Jeffery     EXPECT_EQ(hdr->record_handle, htole32(1));
635d0ba43afSAndrew Jeffery     // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
63648761c62SAndrew Jeffery     fru = reinterpret_cast<pldm_pdr_fru_record_set*>(outData +
63748761c62SAndrew Jeffery                                                      sizeof(pldm_pdr_hdr));
63848761c62SAndrew Jeffery     EXPECT_EQ(fru->terminus_handle, htole16(1));
63948761c62SAndrew Jeffery     EXPECT_EQ(fru->fru_rsi, htole16(10));
64048761c62SAndrew Jeffery     EXPECT_EQ(fru->entity_type, htole16(1));
64148761c62SAndrew Jeffery     EXPECT_EQ(fru->entity_instance_num, htole16(0));
64248761c62SAndrew Jeffery     EXPECT_EQ(fru->container_id, htole16(100));
64348761c62SAndrew Jeffery     outData = nullptr;
64448761c62SAndrew Jeffery 
64548761c62SAndrew Jeffery     pldm_pdr_destroy(repo);
64648761c62SAndrew Jeffery }
64748761c62SAndrew Jeffery 
TEST(PDRUpdate,tesFindtFruRecordSet)64848761c62SAndrew Jeffery TEST(PDRUpdate, tesFindtFruRecordSet)
64948761c62SAndrew Jeffery {
65048761c62SAndrew Jeffery     auto repo = pldm_pdr_init();
65148761c62SAndrew Jeffery 
65248761c62SAndrew Jeffery     uint16_t terminusHdl{};
65348761c62SAndrew Jeffery     uint16_t entityType{};
65448761c62SAndrew Jeffery     uint16_t entityInstanceNum{};
65548761c62SAndrew Jeffery     uint16_t containerId{};
65648761c62SAndrew Jeffery     uint32_t first = 1;
657e7f55113SAndrew Jeffery     EXPECT_EQ(pldm_pdr_add_fru_record_set(repo, 1, 1, 1, 0, 100, &first), 0);
65848761c62SAndrew Jeffery     uint32_t second = 2;
659e7f55113SAndrew Jeffery     EXPECT_EQ(pldm_pdr_add_fru_record_set(repo, 1, 2, 1, 1, 100, &second), 0);
66048761c62SAndrew Jeffery     uint32_t third = 3;
661e7f55113SAndrew Jeffery     EXPECT_EQ(pldm_pdr_add_fru_record_set(repo, 1, 3, 1, 2, 100, &third), 0);
66248761c62SAndrew Jeffery     EXPECT_EQ(first, pldm_pdr_get_record_handle(
66348761c62SAndrew Jeffery                          repo, pldm_pdr_fru_record_set_find_by_rsi(
66448761c62SAndrew Jeffery                                    repo, 1, &terminusHdl, &entityType,
66548761c62SAndrew Jeffery                                    &entityInstanceNum, &containerId)));
66648761c62SAndrew Jeffery     EXPECT_EQ(second, pldm_pdr_get_record_handle(
66748761c62SAndrew Jeffery                           repo, pldm_pdr_fru_record_set_find_by_rsi(
66848761c62SAndrew Jeffery                                     repo, 2, &terminusHdl, &entityType,
66948761c62SAndrew Jeffery                                     &entityInstanceNum, &containerId)));
67048761c62SAndrew Jeffery     EXPECT_EQ(third, pldm_pdr_get_record_handle(
67148761c62SAndrew Jeffery                          repo, pldm_pdr_fru_record_set_find_by_rsi(
67248761c62SAndrew Jeffery                                    repo, 3, &terminusHdl, &entityType,
67348761c62SAndrew Jeffery                                    &entityInstanceNum, &containerId)));
67448761c62SAndrew Jeffery     EXPECT_EQ(terminusHdl, 1u);
67548761c62SAndrew Jeffery     EXPECT_EQ(entityType, 1u);
67648761c62SAndrew Jeffery     EXPECT_EQ(entityInstanceNum, 2u);
67748761c62SAndrew Jeffery     EXPECT_EQ(containerId, 100u);
67848761c62SAndrew Jeffery     EXPECT_EQ(nullptr, pldm_pdr_fru_record_set_find_by_rsi(
67948761c62SAndrew Jeffery                            repo, 4, &terminusHdl, &entityType,
68048761c62SAndrew Jeffery                            &entityInstanceNum, &containerId));
68148761c62SAndrew Jeffery 
68248761c62SAndrew Jeffery     pldm_pdr_destroy(repo);
68348761c62SAndrew Jeffery }
68448761c62SAndrew Jeffery 
68548761c62SAndrew Jeffery #ifdef LIBPLDM_API_TESTING
TEST(PDRUpdate,testFindLastInRange)68648761c62SAndrew Jeffery TEST(PDRUpdate, testFindLastInRange)
68748761c62SAndrew Jeffery {
68848761c62SAndrew Jeffery     auto repo = pldm_pdr_init();
68948761c62SAndrew Jeffery 
69048761c62SAndrew Jeffery     std::array<uint8_t, 10> data{};
69148761c62SAndrew Jeffery     uint32_t handle1 = 0;
692fae3641dSAndrew Jeffery     EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), false, 1, &handle1),
69348761c62SAndrew Jeffery               0);
69448761c62SAndrew Jeffery     uint32_t handle2 = 23;
695fae3641dSAndrew Jeffery     EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), false, 1, &handle2),
69648761c62SAndrew Jeffery               0);
69748761c62SAndrew Jeffery     uint32_t handle3 = 77;
698fae3641dSAndrew Jeffery     EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), false, 1, &handle3),
69948761c62SAndrew Jeffery               0);
70048761c62SAndrew Jeffery     uint32_t handle4 = 16777325;
701fae3641dSAndrew Jeffery     EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), true, 1, &handle4),
70248761c62SAndrew Jeffery               0);
70348761c62SAndrew Jeffery     uint32_t handle5 = 16777344;
704fae3641dSAndrew Jeffery     EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), true, 1, &handle5),
70548761c62SAndrew Jeffery               0);
70648761c62SAndrew Jeffery 
70748761c62SAndrew Jeffery     auto rec1 = pldm_pdr_find_last_in_range(repo, 0, 100);
70848761c62SAndrew Jeffery     auto rec2 = pldm_pdr_find_last_in_range(repo, 16777300, 33554431);
70948761c62SAndrew Jeffery     EXPECT_NE(rec1, nullptr);
71048761c62SAndrew Jeffery     EXPECT_NE(rec2, nullptr);
71148761c62SAndrew Jeffery     EXPECT_NE(handle1, pldm_pdr_get_record_handle(repo, rec1));
71248761c62SAndrew Jeffery     EXPECT_NE(handle2, pldm_pdr_get_record_handle(repo, rec1));
71348761c62SAndrew Jeffery     EXPECT_EQ(handle3, pldm_pdr_get_record_handle(repo, rec1));
71448761c62SAndrew Jeffery     EXPECT_NE(handle4, pldm_pdr_get_record_handle(repo, rec2));
71548761c62SAndrew Jeffery     EXPECT_EQ(handle5, pldm_pdr_get_record_handle(repo, rec2));
71648761c62SAndrew Jeffery 
71748761c62SAndrew Jeffery     pldm_pdr_destroy(repo);
71848761c62SAndrew Jeffery }
71948761c62SAndrew Jeffery #endif
72048761c62SAndrew Jeffery 
721274732fcSPavithra Barithaya #ifdef LIBPLDM_API_TESTING
TEST(PDRAccess,testGetTerminusHandle)722274732fcSPavithra Barithaya TEST(PDRAccess, testGetTerminusHandle)
723274732fcSPavithra Barithaya {
724274732fcSPavithra Barithaya 
725274732fcSPavithra Barithaya     auto repo = pldm_pdr_init();
726274732fcSPavithra Barithaya 
727274732fcSPavithra Barithaya     pldm_pdr_hdr hdr;
728274732fcSPavithra Barithaya 
729274732fcSPavithra Barithaya     hdr.type = 1;
730274732fcSPavithra Barithaya     uint16_t firstTerminusHandle = 1;
731d0ba43afSAndrew Jeffery     // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
732f309c48dSAndrew Jeffery     EXPECT_EQ(pldm_pdr_add(repo, reinterpret_cast<const uint8_t*>(&hdr),
733274732fcSPavithra Barithaya                            sizeof(hdr), false, firstTerminusHandle, NULL),
734274732fcSPavithra Barithaya               0);
735274732fcSPavithra Barithaya 
736274732fcSPavithra Barithaya     hdr.type = 2;
737274732fcSPavithra Barithaya     uint16_t secondTerminusHandle = 2;
738d0ba43afSAndrew Jeffery     // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
739f309c48dSAndrew Jeffery     EXPECT_EQ(pldm_pdr_add(repo, reinterpret_cast<const uint8_t*>(&hdr),
740274732fcSPavithra Barithaya                            sizeof(hdr), true, secondTerminusHandle, NULL),
741274732fcSPavithra Barithaya               0);
742274732fcSPavithra Barithaya 
743274732fcSPavithra Barithaya     hdr.type = 3;
744274732fcSPavithra Barithaya     uint16_t thirdTerminusHandle = 3;
745d0ba43afSAndrew Jeffery     // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
746f309c48dSAndrew Jeffery     EXPECT_EQ(pldm_pdr_add(repo, reinterpret_cast<const uint8_t*>(&hdr),
747274732fcSPavithra Barithaya                            sizeof(hdr), true, thirdTerminusHandle, NULL),
748274732fcSPavithra Barithaya               0);
749274732fcSPavithra Barithaya 
750274732fcSPavithra Barithaya     uint8_t* outData = nullptr;
751274732fcSPavithra Barithaya     uint32_t size{};
752274732fcSPavithra Barithaya 
753274732fcSPavithra Barithaya     auto firstRec =
754274732fcSPavithra Barithaya         pldm_pdr_find_record_by_type(repo, 1, nullptr, &outData, &size);
755274732fcSPavithra Barithaya     EXPECT_EQ(pldm_pdr_get_terminus_handle(repo, firstRec),
756274732fcSPavithra Barithaya               firstTerminusHandle);
757274732fcSPavithra Barithaya     outData = nullptr;
758274732fcSPavithra Barithaya 
759274732fcSPavithra Barithaya     auto secondRec =
760274732fcSPavithra Barithaya         pldm_pdr_find_record_by_type(repo, 2, nullptr, &outData, &size);
761274732fcSPavithra Barithaya     EXPECT_EQ(pldm_pdr_get_terminus_handle(repo, secondRec),
762274732fcSPavithra Barithaya               secondTerminusHandle);
763274732fcSPavithra Barithaya     outData = nullptr;
764274732fcSPavithra Barithaya 
765274732fcSPavithra Barithaya     auto thirdRec =
766274732fcSPavithra Barithaya         pldm_pdr_find_record_by_type(repo, 3, nullptr, &outData, &size);
767274732fcSPavithra Barithaya     EXPECT_EQ(pldm_pdr_get_terminus_handle(repo, thirdRec),
768274732fcSPavithra Barithaya               thirdTerminusHandle);
769274732fcSPavithra Barithaya     outData = nullptr;
770274732fcSPavithra Barithaya 
771274732fcSPavithra Barithaya     pldm_pdr_destroy(repo);
772274732fcSPavithra Barithaya }
773274732fcSPavithra Barithaya #endif
774274732fcSPavithra Barithaya 
7755192e2e2SPavithra Barithaya #ifdef LIBPLDM_API_TESTING
TEST(PDRAccess,testRemoveByRecordHandle)7765192e2e2SPavithra Barithaya TEST(PDRAccess, testRemoveByRecordHandle)
7775192e2e2SPavithra Barithaya {
7785192e2e2SPavithra Barithaya     std::array<uint8_t, sizeof(pldm_pdr_hdr)> data{};
7795192e2e2SPavithra Barithaya 
7805192e2e2SPavithra Barithaya     auto repo = pldm_pdr_init();
7815192e2e2SPavithra Barithaya     uint32_t first = 0;
7825192e2e2SPavithra Barithaya     EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), false, 1, &first),
7835192e2e2SPavithra Barithaya               0);
7845192e2e2SPavithra Barithaya 
7855192e2e2SPavithra Barithaya     uint32_t second = 0;
7865192e2e2SPavithra Barithaya     EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), false, 1, &second),
7875192e2e2SPavithra Barithaya               0);
7885192e2e2SPavithra Barithaya 
7895192e2e2SPavithra Barithaya     uint32_t third = 0;
7905192e2e2SPavithra Barithaya     EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), false, 1, &third),
7915192e2e2SPavithra Barithaya               0);
7925192e2e2SPavithra Barithaya 
7935192e2e2SPavithra Barithaya     EXPECT_EQ(pldm_pdr_get_record_count(repo), 3u);
7945192e2e2SPavithra Barithaya 
7955192e2e2SPavithra Barithaya     int rc = pldm_pdr_delete_by_record_handle(repo, 1, false);
7965192e2e2SPavithra Barithaya     EXPECT_EQ(rc, 0);
7975192e2e2SPavithra Barithaya     EXPECT_EQ(pldm_pdr_get_record_count(repo), 2u);
7985192e2e2SPavithra Barithaya 
7995192e2e2SPavithra Barithaya     rc = pldm_pdr_delete_by_record_handle(repo, 2, false);
8005192e2e2SPavithra Barithaya     EXPECT_EQ(rc, 0);
8015192e2e2SPavithra Barithaya     EXPECT_EQ(pldm_pdr_get_record_count(repo), 1u);
8025192e2e2SPavithra Barithaya 
8035192e2e2SPavithra Barithaya     pldm_pdr_destroy(repo);
8045192e2e2SPavithra Barithaya }
8055192e2e2SPavithra Barithaya #endif
8065192e2e2SPavithra Barithaya 
TEST(EntityAssociationPDR,testInit)80748761c62SAndrew Jeffery TEST(EntityAssociationPDR, testInit)
80848761c62SAndrew Jeffery {
80948761c62SAndrew Jeffery     auto tree = pldm_entity_association_tree_init();
81048761c62SAndrew Jeffery     EXPECT_NE(tree, nullptr);
81148761c62SAndrew Jeffery     pldm_entity_association_tree_destroy(tree);
81248761c62SAndrew Jeffery }
81348761c62SAndrew Jeffery 
TEST(EntityAssociationPDR,testBuild)81448761c62SAndrew Jeffery TEST(EntityAssociationPDR, testBuild)
81548761c62SAndrew Jeffery {
81648761c62SAndrew Jeffery     //        1
81748761c62SAndrew Jeffery     //        |
81848761c62SAndrew Jeffery     //        2--3--4
81948761c62SAndrew Jeffery     //        |
82048761c62SAndrew Jeffery     //        5--6--7
82148761c62SAndrew Jeffery     //        |  |
82248761c62SAndrew Jeffery     //        9  8
82348761c62SAndrew Jeffery 
82448761c62SAndrew Jeffery     pldm_entity entities[9]{};
82548761c62SAndrew Jeffery 
82648761c62SAndrew Jeffery     entities[0].entity_type = 1;
82748761c62SAndrew Jeffery     entities[1].entity_type = 2;
82848761c62SAndrew Jeffery     entities[2].entity_type = 2;
82948761c62SAndrew Jeffery     entities[3].entity_type = 3;
83048761c62SAndrew Jeffery     entities[4].entity_type = 4;
83148761c62SAndrew Jeffery     entities[5].entity_type = 5;
83248761c62SAndrew Jeffery     entities[6].entity_type = 5;
83348761c62SAndrew Jeffery     entities[7].entity_type = 6;
83448761c62SAndrew Jeffery     entities[8].entity_type = 7;
83548761c62SAndrew Jeffery 
83648761c62SAndrew Jeffery     auto tree = pldm_entity_association_tree_init();
83748761c62SAndrew Jeffery 
83848761c62SAndrew Jeffery     auto l1 = pldm_entity_association_tree_add(
83948761c62SAndrew Jeffery         tree, &entities[0], 0xffff, nullptr, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
84048761c62SAndrew Jeffery     EXPECT_NE(l1, nullptr);
84148761c62SAndrew Jeffery     auto l2a = pldm_entity_association_tree_add(
84248761c62SAndrew Jeffery         tree, &entities[1], 0xffff, l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
84348761c62SAndrew Jeffery     EXPECT_NE(l2a, nullptr);
84448761c62SAndrew Jeffery     auto l2b = pldm_entity_association_tree_add(
84548761c62SAndrew Jeffery         tree, &entities[2], 0xffff, l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
84648761c62SAndrew Jeffery     EXPECT_NE(l2b, nullptr);
84748761c62SAndrew Jeffery     auto l2c = pldm_entity_association_tree_add(
84848761c62SAndrew Jeffery         tree, &entities[3], 0xffff, l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
84948761c62SAndrew Jeffery     EXPECT_NE(l2c, nullptr);
85048761c62SAndrew Jeffery     auto l3a = pldm_entity_association_tree_add(
85148761c62SAndrew Jeffery         tree, &entities[4], 0xffff, l2a, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
85248761c62SAndrew Jeffery     EXPECT_NE(l3a, nullptr);
85348761c62SAndrew Jeffery     auto l3b = pldm_entity_association_tree_add(
85448761c62SAndrew Jeffery         tree, &entities[5], 0xffff, l2a, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
85548761c62SAndrew Jeffery     EXPECT_NE(l3b, nullptr);
85648761c62SAndrew Jeffery     auto l3c = pldm_entity_association_tree_add(
85748761c62SAndrew Jeffery         tree, &entities[6], 0xffff, l2a, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
85848761c62SAndrew Jeffery     EXPECT_NE(l3b, nullptr);
85948761c62SAndrew Jeffery     auto l4a = pldm_entity_association_tree_add(
86048761c62SAndrew Jeffery         tree, &entities[7], 0xffff, l3a, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
86148761c62SAndrew Jeffery     EXPECT_NE(l4a, nullptr);
86248761c62SAndrew Jeffery     auto l4b = pldm_entity_association_tree_add(
86348761c62SAndrew Jeffery         tree, &entities[8], 0xffff, l3b, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
86448761c62SAndrew Jeffery     EXPECT_NE(l4b, nullptr);
86548761c62SAndrew Jeffery 
86648761c62SAndrew Jeffery     EXPECT_EQ(pldm_entity_is_node_parent(l1), true);
86748761c62SAndrew Jeffery     EXPECT_EQ(pldm_entity_is_node_parent(l2a), true);
86848761c62SAndrew Jeffery     EXPECT_EQ(pldm_entity_is_node_parent(l3a), true);
86948761c62SAndrew Jeffery     EXPECT_EQ(pldm_entity_is_node_parent(l3b), true);
87048761c62SAndrew Jeffery 
87148761c62SAndrew Jeffery     EXPECT_EQ(pldm_entity_is_node_parent(l2b), false);
87248761c62SAndrew Jeffery     EXPECT_EQ(pldm_entity_is_node_parent(l2c), false);
87348761c62SAndrew Jeffery     EXPECT_EQ(pldm_entity_is_node_parent(l3c), false);
87448761c62SAndrew Jeffery     EXPECT_EQ(pldm_entity_is_node_parent(l4a), false);
87548761c62SAndrew Jeffery     EXPECT_EQ(pldm_entity_is_node_parent(l4b), false);
87648761c62SAndrew Jeffery 
87748761c62SAndrew Jeffery     EXPECT_EQ(pldm_entity_is_exist_parent(l1), false);
87848761c62SAndrew Jeffery 
87948761c62SAndrew Jeffery     pldm_entity nodeL1 = pldm_entity_extract(l1);
88048761c62SAndrew Jeffery     pldm_entity parentL2a = pldm_entity_get_parent(l2a);
88148761c62SAndrew Jeffery     pldm_entity parentL2b = pldm_entity_get_parent(l2b);
88248761c62SAndrew Jeffery     pldm_entity parentL2c = pldm_entity_get_parent(l2c);
88348761c62SAndrew Jeffery     EXPECT_EQ(pldm_entity_is_exist_parent(l2a), true);
88448761c62SAndrew Jeffery     EXPECT_EQ(pldm_entity_is_exist_parent(l2b), true);
88548761c62SAndrew Jeffery     EXPECT_EQ(pldm_entity_is_exist_parent(l2c), true);
88648761c62SAndrew Jeffery     EXPECT_EQ(parentL2a.entity_type, nodeL1.entity_type);
88748761c62SAndrew Jeffery     EXPECT_EQ(parentL2a.entity_instance_num, nodeL1.entity_instance_num);
88848761c62SAndrew Jeffery     EXPECT_EQ(parentL2a.entity_container_id, nodeL1.entity_container_id);
88948761c62SAndrew Jeffery     EXPECT_EQ(parentL2b.entity_type, nodeL1.entity_type);
89048761c62SAndrew Jeffery     EXPECT_EQ(parentL2b.entity_instance_num, nodeL1.entity_instance_num);
89148761c62SAndrew Jeffery     EXPECT_EQ(parentL2b.entity_container_id, nodeL1.entity_container_id);
89248761c62SAndrew Jeffery     EXPECT_EQ(parentL2c.entity_type, nodeL1.entity_type);
89348761c62SAndrew Jeffery     EXPECT_EQ(parentL2c.entity_instance_num, nodeL1.entity_instance_num);
89448761c62SAndrew Jeffery     EXPECT_EQ(parentL2c.entity_container_id, nodeL1.entity_container_id);
89548761c62SAndrew Jeffery 
89648761c62SAndrew Jeffery     pldm_entity nodeL2a = pldm_entity_extract(l2a);
89748761c62SAndrew Jeffery     pldm_entity parentL3a = pldm_entity_get_parent(l3a);
89848761c62SAndrew Jeffery     pldm_entity parentL3b = pldm_entity_get_parent(l3b);
89948761c62SAndrew Jeffery     pldm_entity parentL3c = pldm_entity_get_parent(l3c);
90048761c62SAndrew Jeffery     EXPECT_EQ(pldm_entity_is_exist_parent(l3a), true);
90148761c62SAndrew Jeffery     EXPECT_EQ(pldm_entity_is_exist_parent(l3b), true);
90248761c62SAndrew Jeffery     EXPECT_EQ(pldm_entity_is_exist_parent(l3c), true);
90348761c62SAndrew Jeffery     EXPECT_EQ(parentL3a.entity_type, nodeL2a.entity_type);
90448761c62SAndrew Jeffery     EXPECT_EQ(parentL3a.entity_instance_num, nodeL2a.entity_instance_num);
90548761c62SAndrew Jeffery     EXPECT_EQ(parentL3a.entity_container_id, nodeL2a.entity_container_id);
90648761c62SAndrew Jeffery     EXPECT_EQ(parentL3b.entity_type, nodeL2a.entity_type);
90748761c62SAndrew Jeffery     EXPECT_EQ(parentL3b.entity_instance_num, nodeL2a.entity_instance_num);
90848761c62SAndrew Jeffery     EXPECT_EQ(parentL3b.entity_container_id, nodeL2a.entity_container_id);
90948761c62SAndrew Jeffery     EXPECT_EQ(parentL3c.entity_type, nodeL2a.entity_type);
91048761c62SAndrew Jeffery     EXPECT_EQ(parentL3c.entity_instance_num, nodeL2a.entity_instance_num);
91148761c62SAndrew Jeffery     EXPECT_EQ(parentL3c.entity_container_id, nodeL2a.entity_container_id);
91248761c62SAndrew Jeffery 
91348761c62SAndrew Jeffery     pldm_entity nodeL3a = pldm_entity_extract(l3a);
91448761c62SAndrew Jeffery     pldm_entity parentL4a = pldm_entity_get_parent(l4a);
91548761c62SAndrew Jeffery     EXPECT_EQ(pldm_entity_is_exist_parent(l4a), true);
91648761c62SAndrew Jeffery     EXPECT_EQ(parentL4a.entity_type, nodeL3a.entity_type);
91748761c62SAndrew Jeffery     EXPECT_EQ(parentL4a.entity_instance_num, nodeL3a.entity_instance_num);
91848761c62SAndrew Jeffery     EXPECT_EQ(parentL4a.entity_container_id, nodeL3a.entity_container_id);
91948761c62SAndrew Jeffery 
92048761c62SAndrew Jeffery     pldm_entity nodeL3b = pldm_entity_extract(l3b);
92148761c62SAndrew Jeffery     pldm_entity parentL4b = pldm_entity_get_parent(l4b);
92248761c62SAndrew Jeffery     EXPECT_EQ(pldm_entity_is_exist_parent(l4b), true);
92348761c62SAndrew Jeffery     EXPECT_EQ(parentL4b.entity_type, nodeL3b.entity_type);
92448761c62SAndrew Jeffery     EXPECT_EQ(parentL4b.entity_instance_num, nodeL3b.entity_instance_num);
92548761c62SAndrew Jeffery     EXPECT_EQ(parentL4b.entity_container_id, nodeL3b.entity_container_id);
92648761c62SAndrew Jeffery 
92748761c62SAndrew Jeffery     size_t num{};
92848761c62SAndrew Jeffery     pldm_entity* out = nullptr;
92948761c62SAndrew Jeffery     pldm_entity_association_tree_visit(tree, &out, &num);
93048761c62SAndrew Jeffery     EXPECT_EQ(num, 9u);
93148761c62SAndrew Jeffery 
93248761c62SAndrew Jeffery     EXPECT_EQ(out[0].entity_type, 1u);
93348761c62SAndrew Jeffery     EXPECT_EQ(out[0].entity_instance_num, 1u);
93448761c62SAndrew Jeffery     EXPECT_EQ(out[0].entity_container_id, 0u);
93548761c62SAndrew Jeffery 
93648761c62SAndrew Jeffery     EXPECT_EQ(out[1].entity_type, 2u);
93748761c62SAndrew Jeffery     EXPECT_EQ(out[1].entity_instance_num, 1u);
93848761c62SAndrew Jeffery     EXPECT_EQ(out[1].entity_container_id, 1u);
93948761c62SAndrew Jeffery     EXPECT_EQ(out[2].entity_type, 2u);
94048761c62SAndrew Jeffery     EXPECT_EQ(out[2].entity_instance_num, 2u);
94148761c62SAndrew Jeffery     EXPECT_EQ(out[2].entity_container_id, 1u);
94248761c62SAndrew Jeffery     EXPECT_EQ(out[3].entity_type, 3u);
94348761c62SAndrew Jeffery     EXPECT_EQ(out[3].entity_instance_num, 1u);
94448761c62SAndrew Jeffery     EXPECT_EQ(out[3].entity_container_id, 1u);
94548761c62SAndrew Jeffery 
94648761c62SAndrew Jeffery     EXPECT_EQ(out[4].entity_type, 4u);
94748761c62SAndrew Jeffery     EXPECT_EQ(out[4].entity_instance_num, 1u);
94848761c62SAndrew Jeffery     EXPECT_EQ(out[4].entity_container_id, 2u);
94948761c62SAndrew Jeffery     EXPECT_EQ(out[5].entity_type, 5u);
95048761c62SAndrew Jeffery     EXPECT_EQ(out[5].entity_instance_num, 1u);
95148761c62SAndrew Jeffery     EXPECT_EQ(out[5].entity_container_id, 2u);
95248761c62SAndrew Jeffery     EXPECT_EQ(out[6].entity_type, 5u);
95348761c62SAndrew Jeffery     EXPECT_EQ(out[6].entity_instance_num, 2u);
95448761c62SAndrew Jeffery     EXPECT_EQ(out[6].entity_container_id, 2u);
95548761c62SAndrew Jeffery 
95648761c62SAndrew Jeffery     EXPECT_EQ(out[7].entity_type, 7u);
95748761c62SAndrew Jeffery     EXPECT_EQ(out[7].entity_instance_num, 1u);
95848761c62SAndrew Jeffery     EXPECT_EQ(out[7].entity_container_id, 4u);
95948761c62SAndrew Jeffery     EXPECT_EQ(out[8].entity_type, 6u);
96048761c62SAndrew Jeffery     EXPECT_EQ(out[8].entity_instance_num, 1u);
96148761c62SAndrew Jeffery     EXPECT_EQ(out[8].entity_container_id, 3u);
96248761c62SAndrew Jeffery 
96348761c62SAndrew Jeffery     free(out);
96448761c62SAndrew Jeffery 
96548761c62SAndrew Jeffery     pldm_entity p1 = pldm_entity_extract(l1);
96648761c62SAndrew Jeffery     EXPECT_EQ(p1.entity_type, 1u);
96748761c62SAndrew Jeffery     EXPECT_EQ(p1.entity_instance_num, 1u);
96848761c62SAndrew Jeffery     EXPECT_EQ(p1.entity_container_id, 0u);
96948761c62SAndrew Jeffery 
97048761c62SAndrew Jeffery     pldm_entity p2a = pldm_entity_extract(l2a);
97148761c62SAndrew Jeffery     EXPECT_EQ(p2a.entity_type, 2u);
97248761c62SAndrew Jeffery     EXPECT_EQ(p2a.entity_instance_num, 1u);
97348761c62SAndrew Jeffery     EXPECT_EQ(p2a.entity_container_id, 1u);
97448761c62SAndrew Jeffery     pldm_entity p2b = pldm_entity_extract(l2b);
97548761c62SAndrew Jeffery     EXPECT_EQ(p2b.entity_type, 2u);
97648761c62SAndrew Jeffery     EXPECT_EQ(p2b.entity_instance_num, 2u);
97748761c62SAndrew Jeffery     EXPECT_EQ(p2b.entity_container_id, 1u);
97848761c62SAndrew Jeffery     pldm_entity p2c = pldm_entity_extract(l2c);
97948761c62SAndrew Jeffery     EXPECT_EQ(p2c.entity_type, 3u);
98048761c62SAndrew Jeffery     EXPECT_EQ(p2c.entity_instance_num, 1u);
98148761c62SAndrew Jeffery     EXPECT_EQ(p2c.entity_container_id, 1u);
98248761c62SAndrew Jeffery 
98348761c62SAndrew Jeffery     pldm_entity p3a = pldm_entity_extract(l3a);
98448761c62SAndrew Jeffery     EXPECT_EQ(p3a.entity_type, 4u);
98548761c62SAndrew Jeffery     EXPECT_EQ(p3a.entity_instance_num, 1u);
98648761c62SAndrew Jeffery     EXPECT_EQ(p3a.entity_container_id, 2u);
98748761c62SAndrew Jeffery     pldm_entity p3b = pldm_entity_extract(l3b);
98848761c62SAndrew Jeffery     EXPECT_EQ(p3b.entity_type, 5u);
98948761c62SAndrew Jeffery     EXPECT_EQ(p3b.entity_instance_num, 1u);
99048761c62SAndrew Jeffery     EXPECT_EQ(p3b.entity_container_id, 2u);
99148761c62SAndrew Jeffery     pldm_entity p3c = pldm_entity_extract(l3c);
99248761c62SAndrew Jeffery     EXPECT_EQ(p3c.entity_type, 5u);
99348761c62SAndrew Jeffery     EXPECT_EQ(p3c.entity_instance_num, 2u);
99448761c62SAndrew Jeffery     EXPECT_EQ(p3c.entity_container_id, 2u);
99548761c62SAndrew Jeffery 
99648761c62SAndrew Jeffery     pldm_entity p4a = pldm_entity_extract(l4a);
99748761c62SAndrew Jeffery     EXPECT_EQ(p4a.entity_type, 6u);
99848761c62SAndrew Jeffery     EXPECT_EQ(p4a.entity_instance_num, 1u);
99948761c62SAndrew Jeffery     EXPECT_EQ(p4a.entity_container_id, 3u);
100048761c62SAndrew Jeffery     pldm_entity p4b = pldm_entity_extract(l4b);
100148761c62SAndrew Jeffery     EXPECT_EQ(p4b.entity_type, 7u);
100248761c62SAndrew Jeffery     EXPECT_EQ(p4b.entity_instance_num, 1u);
100348761c62SAndrew Jeffery     EXPECT_EQ(p4b.entity_container_id, 4u);
100448761c62SAndrew Jeffery 
100548761c62SAndrew Jeffery     pldm_entity_association_tree_destroy(tree);
100648761c62SAndrew Jeffery }
100748761c62SAndrew Jeffery 
100848761c62SAndrew Jeffery #if LIBPLDM_API_TESTING
TEST(EntityAssociationPDR,findAndAddRemotePDR)100948761c62SAndrew Jeffery TEST(EntityAssociationPDR, findAndAddRemotePDR)
101048761c62SAndrew Jeffery {
101148761c62SAndrew Jeffery     //         Tree - 1
101248761c62SAndrew Jeffery     //
101348761c62SAndrew Jeffery     //        11521(1,0)
101448761c62SAndrew Jeffery     //             |
101548761c62SAndrew Jeffery     //          45 (1,1)
101648761c62SAndrew Jeffery     //             |
101748761c62SAndrew Jeffery     //          64 (1,2)
101848761c62SAndrew Jeffery     //             |
101948761c62SAndrew Jeffery     //    ------------------
102048761c62SAndrew Jeffery     //    |                 |
102148761c62SAndrew Jeffery     //  67(0,3)           67(1,3)
102248761c62SAndrew Jeffery     //    |                 |
102348761c62SAndrew Jeffery     // 135(0,4)          135(0,5)
102448761c62SAndrew Jeffery     //    |                 |
102548761c62SAndrew Jeffery     // 32903(0,6)         32903(0,7)
102648761c62SAndrew Jeffery 
102748761c62SAndrew Jeffery     pldm_entity entities[9]{};
102848761c62SAndrew Jeffery     entities[0].entity_type = 11521;
102948761c62SAndrew Jeffery     entities[1].entity_type = 45;
103048761c62SAndrew Jeffery     entities[2].entity_type = 64;
103148761c62SAndrew Jeffery     entities[3].entity_type = 67;
103248761c62SAndrew Jeffery     entities[4].entity_type = 67;
103348761c62SAndrew Jeffery     entities[5].entity_type = 135;
103448761c62SAndrew Jeffery     entities[5].entity_container_id = 2;
103548761c62SAndrew Jeffery     entities[6].entity_type = 135;
103648761c62SAndrew Jeffery     entities[6].entity_container_id = 3;
103748761c62SAndrew Jeffery     entities[7].entity_type = 32903;
103848761c62SAndrew Jeffery     entities[8].entity_type = 32903;
103948761c62SAndrew Jeffery     auto tree = pldm_entity_association_tree_init();
104048761c62SAndrew Jeffery     auto l1 = pldm_entity_association_tree_add_entity(
104148761c62SAndrew Jeffery         tree, &entities[0], 0xffff, nullptr, PLDM_ENTITY_ASSOCIAION_LOGICAL,
104248761c62SAndrew Jeffery         false, true, 0xffff);
104348761c62SAndrew Jeffery     EXPECT_NE(l1, nullptr);
104448761c62SAndrew Jeffery     auto l2 = pldm_entity_association_tree_add_entity(
104548761c62SAndrew Jeffery         tree, &entities[1], 0xffff, l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL, false,
104648761c62SAndrew Jeffery         false, 0xffff);
104748761c62SAndrew Jeffery     EXPECT_NE(l2, nullptr);
104848761c62SAndrew Jeffery     auto l3 = pldm_entity_association_tree_add_entity(
104948761c62SAndrew Jeffery         tree, &entities[2], 0xffff, l2, PLDM_ENTITY_ASSOCIAION_PHYSICAL, false,
105048761c62SAndrew Jeffery         true, 0xffff);
105148761c62SAndrew Jeffery     EXPECT_NE(l3, nullptr);
105248761c62SAndrew Jeffery     auto l4a = pldm_entity_association_tree_add_entity(
105348761c62SAndrew Jeffery         tree, &entities[3], 0, l3, PLDM_ENTITY_ASSOCIAION_PHYSICAL, false,
105448761c62SAndrew Jeffery         false, 0xffff);
105548761c62SAndrew Jeffery     EXPECT_NE(l4a, nullptr);
105648761c62SAndrew Jeffery     auto l4b = pldm_entity_association_tree_add_entity(
105748761c62SAndrew Jeffery         tree, &entities[4], 1, l3, PLDM_ENTITY_ASSOCIAION_PHYSICAL, true, true,
105848761c62SAndrew Jeffery         0xffff);
105948761c62SAndrew Jeffery     EXPECT_NE(l4b, nullptr);
106048761c62SAndrew Jeffery     auto l5a = pldm_entity_association_tree_add_entity(
106148761c62SAndrew Jeffery         tree, &entities[5], 0, l4a, PLDM_ENTITY_ASSOCIAION_PHYSICAL, false,
106248761c62SAndrew Jeffery         false, 0xffff);
106348761c62SAndrew Jeffery     EXPECT_NE(l5a, nullptr);
106448761c62SAndrew Jeffery     auto l5b = pldm_entity_association_tree_add_entity(
106548761c62SAndrew Jeffery         tree, &entities[6], 0, l4b, PLDM_ENTITY_ASSOCIAION_PHYSICAL, false,
106648761c62SAndrew Jeffery         false, 0xffff);
106748761c62SAndrew Jeffery     EXPECT_NE(l5b, nullptr);
106848761c62SAndrew Jeffery     pldm_entity entity{};
106948761c62SAndrew Jeffery     entity.entity_type = 135;
107048761c62SAndrew Jeffery     entity.entity_instance_num = 0;
107148761c62SAndrew Jeffery     entity.entity_container_id = 2;
107248761c62SAndrew Jeffery     auto result1 = pldm_entity_association_tree_find(tree, &entity);
107348761c62SAndrew Jeffery     EXPECT_EQ(result1, l5a);
107448761c62SAndrew Jeffery     EXPECT_EQ(entities[5].entity_container_id, 2);
107548761c62SAndrew Jeffery     auto l6a = pldm_entity_association_tree_add_entity(
107648761c62SAndrew Jeffery         tree, &entities[7], 0, result1, PLDM_ENTITY_ASSOCIAION_PHYSICAL, false,
107748761c62SAndrew Jeffery         false, 0xffff);
107848761c62SAndrew Jeffery     EXPECT_NE(l6a, nullptr);
107948761c62SAndrew Jeffery     entity.entity_type = 135;
108048761c62SAndrew Jeffery     entity.entity_instance_num = 0;
108148761c62SAndrew Jeffery     entity.entity_container_id = 3;
108248761c62SAndrew Jeffery     auto result2 = pldm_entity_association_tree_find(tree, &entity);
108348761c62SAndrew Jeffery     EXPECT_NE(result2, l5b);
108448761c62SAndrew Jeffery     EXPECT_EQ(entities[6].entity_container_id, 3);
108548761c62SAndrew Jeffery     auto l7a = pldm_entity_association_tree_add_entity(
108648761c62SAndrew Jeffery         tree, &entities[8], 0, result2, PLDM_ENTITY_ASSOCIAION_PHYSICAL, false,
108748761c62SAndrew Jeffery         false, 0xffff);
108848761c62SAndrew Jeffery     EXPECT_EQ(l7a, nullptr);
108948761c62SAndrew Jeffery     pldm_entity_association_tree_destroy(tree);
109048761c62SAndrew Jeffery }
109148761c62SAndrew Jeffery #endif
109248761c62SAndrew Jeffery 
TEST(EntityAssociationPDR,testSpecialTrees)109348761c62SAndrew Jeffery TEST(EntityAssociationPDR, testSpecialTrees)
109448761c62SAndrew Jeffery {
109548761c62SAndrew Jeffery     pldm_entity entities[3]{};
109648761c62SAndrew Jeffery 
109748761c62SAndrew Jeffery     entities[0].entity_type = 1;
109848761c62SAndrew Jeffery     entities[1].entity_type = 2;
109948761c62SAndrew Jeffery     entities[2].entity_type = 1;
110048761c62SAndrew Jeffery 
110148761c62SAndrew Jeffery     // A
110248761c62SAndrew Jeffery     auto tree = pldm_entity_association_tree_init();
110348761c62SAndrew Jeffery     auto node = pldm_entity_association_tree_add(
110448761c62SAndrew Jeffery         tree, &entities[0], 0xffff, nullptr, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
110548761c62SAndrew Jeffery     EXPECT_NE(node, nullptr);
110648761c62SAndrew Jeffery     size_t num{};
110748761c62SAndrew Jeffery     pldm_entity* out = nullptr;
110848761c62SAndrew Jeffery     pldm_entity_association_tree_visit(tree, &out, &num);
110948761c62SAndrew Jeffery     EXPECT_EQ(num, 1u);
111048761c62SAndrew Jeffery     EXPECT_EQ(out[0].entity_type, 1u);
111148761c62SAndrew Jeffery     EXPECT_EQ(out[0].entity_instance_num, 1u);
111248761c62SAndrew Jeffery     EXPECT_EQ(out[0].entity_container_id, 0u);
111348761c62SAndrew Jeffery     free(out);
111448761c62SAndrew Jeffery     pldm_entity_association_tree_destroy(tree);
111548761c62SAndrew Jeffery 
111648761c62SAndrew Jeffery     // A-A-A
111748761c62SAndrew Jeffery     tree = pldm_entity_association_tree_init();
111848761c62SAndrew Jeffery     node = pldm_entity_association_tree_add(tree, &entities[0], 0xffff, nullptr,
111948761c62SAndrew Jeffery                                             PLDM_ENTITY_ASSOCIAION_PHYSICAL);
112048761c62SAndrew Jeffery     EXPECT_NE(node, nullptr);
112148761c62SAndrew Jeffery     node = pldm_entity_association_tree_add(tree, &entities[1], 0xffff, nullptr,
112248761c62SAndrew Jeffery                                             PLDM_ENTITY_ASSOCIAION_PHYSICAL);
112348761c62SAndrew Jeffery     EXPECT_NE(node, nullptr);
112448761c62SAndrew Jeffery     node = pldm_entity_association_tree_add(tree, &entities[2], 0xffff, nullptr,
112548761c62SAndrew Jeffery                                             PLDM_ENTITY_ASSOCIAION_PHYSICAL);
112648761c62SAndrew Jeffery     EXPECT_NE(node, nullptr);
112748761c62SAndrew Jeffery     pldm_entity_association_tree_visit(tree, &out, &num);
112848761c62SAndrew Jeffery     EXPECT_EQ(num, 3u);
112948761c62SAndrew Jeffery     EXPECT_EQ(out[0].entity_type, 1u);
113048761c62SAndrew Jeffery     EXPECT_EQ(out[0].entity_instance_num, 1u);
113148761c62SAndrew Jeffery     EXPECT_EQ(out[0].entity_container_id, 0u);
113248761c62SAndrew Jeffery     EXPECT_EQ(out[1].entity_type, 1u);
113348761c62SAndrew Jeffery     EXPECT_EQ(out[1].entity_instance_num, 2u);
113448761c62SAndrew Jeffery     EXPECT_EQ(out[1].entity_container_id, 0u);
113548761c62SAndrew Jeffery     EXPECT_EQ(out[2].entity_type, 2u);
113648761c62SAndrew Jeffery     EXPECT_EQ(out[2].entity_instance_num, 1u);
113748761c62SAndrew Jeffery     EXPECT_EQ(out[2].entity_container_id, 0u);
113848761c62SAndrew Jeffery     free(out);
113948761c62SAndrew Jeffery     pldm_entity_association_tree_destroy(tree);
114048761c62SAndrew Jeffery 
114148761c62SAndrew Jeffery     // A
114248761c62SAndrew Jeffery     // |
114348761c62SAndrew Jeffery     // A
114448761c62SAndrew Jeffery     // |
114548761c62SAndrew Jeffery     // A
114648761c62SAndrew Jeffery     tree = pldm_entity_association_tree_init();
114748761c62SAndrew Jeffery     node = pldm_entity_association_tree_add(tree, &entities[0], 0xffff, nullptr,
114848761c62SAndrew Jeffery                                             PLDM_ENTITY_ASSOCIAION_PHYSICAL);
114948761c62SAndrew Jeffery     EXPECT_NE(node, nullptr);
115048761c62SAndrew Jeffery     auto node1 = pldm_entity_association_tree_add(
115148761c62SAndrew Jeffery         tree, &entities[1], 0xffff, node, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
115248761c62SAndrew Jeffery     EXPECT_NE(node1, nullptr);
115348761c62SAndrew Jeffery     auto node2 = pldm_entity_association_tree_add(
115448761c62SAndrew Jeffery         tree, &entities[2], 0xffff, node1, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
115548761c62SAndrew Jeffery     EXPECT_NE(node2, nullptr);
115648761c62SAndrew Jeffery     pldm_entity_association_tree_visit(tree, &out, &num);
115748761c62SAndrew Jeffery     EXPECT_EQ(num, 3u);
115848761c62SAndrew Jeffery     EXPECT_EQ(out[0].entity_type, 1u);
115948761c62SAndrew Jeffery     EXPECT_EQ(out[0].entity_instance_num, 1u);
116048761c62SAndrew Jeffery     EXPECT_EQ(out[0].entity_container_id, 0u);
116148761c62SAndrew Jeffery     EXPECT_EQ(out[1].entity_type, 2u);
116248761c62SAndrew Jeffery     EXPECT_EQ(out[1].entity_instance_num, 1u);
116348761c62SAndrew Jeffery     EXPECT_EQ(out[1].entity_container_id, 1u);
116448761c62SAndrew Jeffery     EXPECT_EQ(out[2].entity_type, 1u);
116548761c62SAndrew Jeffery     EXPECT_EQ(out[2].entity_instance_num, 1u);
116648761c62SAndrew Jeffery     EXPECT_EQ(out[2].entity_container_id, 2u);
116748761c62SAndrew Jeffery     free(out);
116848761c62SAndrew Jeffery     pldm_entity_association_tree_destroy(tree);
116948761c62SAndrew Jeffery 
117048761c62SAndrew Jeffery     // A-A
117148761c62SAndrew Jeffery     //   |
117248761c62SAndrew Jeffery     //   A-A
117348761c62SAndrew Jeffery     tree = pldm_entity_association_tree_init();
117448761c62SAndrew Jeffery     node = pldm_entity_association_tree_add(tree, &entities[0], 0xffff, nullptr,
117548761c62SAndrew Jeffery                                             PLDM_ENTITY_ASSOCIAION_PHYSICAL);
117648761c62SAndrew Jeffery     EXPECT_NE(node, nullptr);
117748761c62SAndrew Jeffery     node = pldm_entity_association_tree_add(tree, &entities[0], 0xffff, nullptr,
117848761c62SAndrew Jeffery                                             PLDM_ENTITY_ASSOCIAION_PHYSICAL);
117948761c62SAndrew Jeffery     EXPECT_NE(node, nullptr);
118048761c62SAndrew Jeffery     node1 = pldm_entity_association_tree_add(tree, &entities[1], 0xffff, node,
118148761c62SAndrew Jeffery                                              PLDM_ENTITY_ASSOCIAION_PHYSICAL);
118248761c62SAndrew Jeffery     EXPECT_NE(node1, nullptr);
118348761c62SAndrew Jeffery     node2 = pldm_entity_association_tree_add(tree, &entities[2], 0xffff, node,
118448761c62SAndrew Jeffery                                              PLDM_ENTITY_ASSOCIAION_PHYSICAL);
118548761c62SAndrew Jeffery     EXPECT_NE(node2, nullptr);
118648761c62SAndrew Jeffery     pldm_entity_association_tree_visit(tree, &out, &num);
118748761c62SAndrew Jeffery     EXPECT_EQ(num, 4u);
118848761c62SAndrew Jeffery     EXPECT_EQ(out[0].entity_type, 1u);
118948761c62SAndrew Jeffery     EXPECT_EQ(out[0].entity_instance_num, 1u);
119048761c62SAndrew Jeffery     EXPECT_EQ(out[0].entity_container_id, 0u);
119148761c62SAndrew Jeffery     EXPECT_EQ(out[1].entity_type, 1u);
119248761c62SAndrew Jeffery     EXPECT_EQ(out[1].entity_instance_num, 2u);
119348761c62SAndrew Jeffery     EXPECT_EQ(out[1].entity_container_id, 0u);
119448761c62SAndrew Jeffery     EXPECT_EQ(out[2].entity_type, 2u);
119548761c62SAndrew Jeffery     EXPECT_EQ(out[2].entity_instance_num, 1u);
119648761c62SAndrew Jeffery     EXPECT_EQ(out[2].entity_container_id, 1u);
119748761c62SAndrew Jeffery     EXPECT_EQ(out[3].entity_type, 1u);
119848761c62SAndrew Jeffery     EXPECT_EQ(out[3].entity_instance_num, 1u);
119948761c62SAndrew Jeffery     EXPECT_EQ(out[3].entity_container_id, 1u);
120048761c62SAndrew Jeffery     free(out);
120148761c62SAndrew Jeffery     pldm_entity_association_tree_destroy(tree);
120248761c62SAndrew Jeffery }
120348761c62SAndrew Jeffery 
TEST(EntityAssociationPDR,testPDR)120448761c62SAndrew Jeffery TEST(EntityAssociationPDR, testPDR)
120548761c62SAndrew Jeffery {
120648761c62SAndrew Jeffery     // e = entity type, c = container id, i = instance num
120748761c62SAndrew Jeffery 
120848761c62SAndrew Jeffery     //        INPUT
120948761c62SAndrew Jeffery     //        1(e=1)--1a(e=2)
121048761c62SAndrew Jeffery     //        |
121148761c62SAndrew Jeffery     //        2(e=2)--3(e=2)--4(e=2)--5(e=3)
121248761c62SAndrew Jeffery     //        |
121348761c62SAndrew Jeffery     //        6(e=4)--7(e=5)--8(e=5)--9(e=5)
121448761c62SAndrew Jeffery     //        |       |
121548761c62SAndrew Jeffery     //        11(e=6) 10(e=7)
121648761c62SAndrew Jeffery 
121748761c62SAndrew Jeffery     //        Expected OUTPUT
121848761c62SAndrew Jeffery     //        1(e=1,c=0,i=1)
121948761c62SAndrew Jeffery     //        |
122048761c62SAndrew Jeffery     //        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)
122148761c62SAndrew Jeffery     //        |
122248761c62SAndrew Jeffery     //        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)
122348761c62SAndrew Jeffery     //        |               |
122448761c62SAndrew Jeffery     //        10(e=6,c=3,i=1) 11(e=7,c=4,i=1)
122548761c62SAndrew Jeffery     pldm_entity entities[11]{};
122648761c62SAndrew Jeffery 
122748761c62SAndrew Jeffery     entities[0].entity_type = 1;
122848761c62SAndrew Jeffery     entities[1].entity_type = 2;
122948761c62SAndrew Jeffery     entities[2].entity_type = 3;
123048761c62SAndrew Jeffery     entities[3].entity_type = 2;
123148761c62SAndrew Jeffery     entities[4].entity_type = 3;
123248761c62SAndrew Jeffery     entities[5].entity_type = 4;
123348761c62SAndrew Jeffery     entities[6].entity_type = 5;
123448761c62SAndrew Jeffery     entities[7].entity_type = 5;
123548761c62SAndrew Jeffery     entities[8].entity_type = 5;
123648761c62SAndrew Jeffery     entities[9].entity_type = 6;
123748761c62SAndrew Jeffery     entities[10].entity_type = 7;
123848761c62SAndrew Jeffery 
123948761c62SAndrew Jeffery     auto tree = pldm_entity_association_tree_init();
124048761c62SAndrew Jeffery 
124148761c62SAndrew Jeffery     auto l1 = pldm_entity_association_tree_add(
124248761c62SAndrew Jeffery         tree, &entities[0], 0xffff, nullptr, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
124348761c62SAndrew Jeffery     EXPECT_NE(l1, nullptr);
124448761c62SAndrew Jeffery     auto l1a = pldm_entity_association_tree_add(
124548761c62SAndrew Jeffery         tree, &entities[1], 0xffff, nullptr, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
124648761c62SAndrew Jeffery     EXPECT_NE(l1a, nullptr);
124748761c62SAndrew Jeffery 
124848761c62SAndrew Jeffery     auto l2a = pldm_entity_association_tree_add(
124948761c62SAndrew Jeffery         tree, &entities[1], 0xffff, l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
125048761c62SAndrew Jeffery     EXPECT_NE(l2a, nullptr);
125148761c62SAndrew Jeffery     auto l2b = pldm_entity_association_tree_add(tree, &entities[2], 0xffff, l1,
125248761c62SAndrew Jeffery                                                 PLDM_ENTITY_ASSOCIAION_LOGICAL);
125348761c62SAndrew Jeffery     EXPECT_NE(l2b, nullptr);
125448761c62SAndrew Jeffery     auto l2c = pldm_entity_association_tree_add(
125548761c62SAndrew Jeffery         tree, &entities[3], 0xffff, l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
125648761c62SAndrew Jeffery     EXPECT_NE(l2c, nullptr);
125748761c62SAndrew Jeffery     auto l2d = pldm_entity_association_tree_add(tree, &entities[4], 0xffff, l1,
125848761c62SAndrew Jeffery                                                 PLDM_ENTITY_ASSOCIAION_LOGICAL);
125948761c62SAndrew Jeffery     EXPECT_NE(l2d, nullptr);
126048761c62SAndrew Jeffery 
126148761c62SAndrew Jeffery     auto l3a = pldm_entity_association_tree_add(
126248761c62SAndrew Jeffery         tree, &entities[5], 0xffff, l2a, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
126348761c62SAndrew Jeffery     EXPECT_NE(l3a, nullptr);
126448761c62SAndrew Jeffery     auto l3b = pldm_entity_association_tree_add(
126548761c62SAndrew Jeffery         tree, &entities[6], 0xffff, l2a, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
126648761c62SAndrew Jeffery     EXPECT_NE(l3b, nullptr);
126748761c62SAndrew Jeffery     auto l3c = pldm_entity_association_tree_add(tree, &entities[7], 0xffff, l2a,
126848761c62SAndrew Jeffery                                                 PLDM_ENTITY_ASSOCIAION_LOGICAL);
126948761c62SAndrew Jeffery     EXPECT_NE(l3c, nullptr);
127048761c62SAndrew Jeffery     auto l3d = pldm_entity_association_tree_add(tree, &entities[8], 0xffff, l2a,
127148761c62SAndrew Jeffery                                                 PLDM_ENTITY_ASSOCIAION_LOGICAL);
127248761c62SAndrew Jeffery     EXPECT_NE(l3d, nullptr);
127348761c62SAndrew Jeffery 
127448761c62SAndrew Jeffery     auto l4a = pldm_entity_association_tree_add(
127548761c62SAndrew Jeffery         tree, &entities[9], 0xffff, l3a, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
127648761c62SAndrew Jeffery     EXPECT_NE(l4a, nullptr);
127748761c62SAndrew Jeffery     auto l4b = pldm_entity_association_tree_add(
127848761c62SAndrew Jeffery         tree, &entities[10], 0xffff, l3b, PLDM_ENTITY_ASSOCIAION_LOGICAL);
127948761c62SAndrew Jeffery     EXPECT_NE(l4b, nullptr);
128048761c62SAndrew Jeffery 
128148761c62SAndrew Jeffery     EXPECT_EQ(pldm_entity_get_num_children(l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL),
128248761c62SAndrew Jeffery               2);
128348761c62SAndrew Jeffery     EXPECT_EQ(pldm_entity_get_num_children(l1, PLDM_ENTITY_ASSOCIAION_LOGICAL),
128448761c62SAndrew Jeffery               2);
128548761c62SAndrew Jeffery     EXPECT_EQ(
128648761c62SAndrew Jeffery         pldm_entity_get_num_children(l2a, PLDM_ENTITY_ASSOCIAION_PHYSICAL), 2);
128748761c62SAndrew Jeffery     EXPECT_EQ(
128848761c62SAndrew Jeffery         pldm_entity_get_num_children(l3b, PLDM_ENTITY_ASSOCIAION_PHYSICAL), 0);
128948761c62SAndrew Jeffery     EXPECT_EQ(pldm_entity_get_num_children(l3b, PLDM_ENTITY_ASSOCIAION_LOGICAL),
129048761c62SAndrew Jeffery               1);
129148761c62SAndrew Jeffery 
129248761c62SAndrew Jeffery     auto repo = pldm_pdr_init();
1293d72ea4b8SAndrew Jeffery     int rc = pldm_entity_association_pdr_add(tree, repo, false, 1);
129448761c62SAndrew Jeffery     ASSERT_EQ(rc, 0);
129548761c62SAndrew Jeffery 
129648761c62SAndrew Jeffery     EXPECT_EQ(pldm_pdr_get_record_count(repo), 6u);
129748761c62SAndrew Jeffery 
129848761c62SAndrew Jeffery     uint32_t currRecHandle{};
129948761c62SAndrew Jeffery     uint32_t nextRecHandle{};
130048761c62SAndrew Jeffery     uint8_t* data = nullptr;
130148761c62SAndrew Jeffery     uint32_t size{};
130248761c62SAndrew Jeffery     uint32_t commonSize = sizeof(struct pldm_pdr_hdr) + sizeof(uint16_t) +
130348761c62SAndrew Jeffery                           sizeof(uint8_t) + sizeof(pldm_entity) +
130448761c62SAndrew Jeffery                           sizeof(uint8_t);
130548761c62SAndrew Jeffery 
130648761c62SAndrew Jeffery     pldm_pdr_find_record(repo, currRecHandle, &data, &size, &nextRecHandle);
130748761c62SAndrew Jeffery     EXPECT_EQ(size, commonSize + (pldm_entity_get_num_children(
130848761c62SAndrew Jeffery                                       l1, PLDM_ENTITY_ASSOCIAION_LOGICAL) *
130948761c62SAndrew Jeffery                                   sizeof(pldm_entity)));
131048761c62SAndrew Jeffery     uint8_t* start = data;
1311d0ba43afSAndrew Jeffery     // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
131248761c62SAndrew Jeffery     pldm_pdr_hdr* hdr = reinterpret_cast<pldm_pdr_hdr*>(start);
131348761c62SAndrew Jeffery     EXPECT_EQ(le32toh(hdr->record_handle), 1u);
131448761c62SAndrew Jeffery     EXPECT_EQ(hdr->type, PLDM_PDR_ENTITY_ASSOCIATION);
131548761c62SAndrew Jeffery     EXPECT_EQ(le16toh(hdr->length), size - sizeof(struct pldm_pdr_hdr));
131648761c62SAndrew Jeffery     start += sizeof(pldm_pdr_hdr);
1317d0ba43afSAndrew Jeffery     // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
131848761c62SAndrew Jeffery     uint16_t* containerId = reinterpret_cast<uint16_t*>(start);
131948761c62SAndrew Jeffery     EXPECT_EQ(le16toh(*containerId), 1u);
132048761c62SAndrew Jeffery     start += sizeof(uint16_t);
132148761c62SAndrew Jeffery     EXPECT_EQ(*start, PLDM_ENTITY_ASSOCIAION_LOGICAL);
132248761c62SAndrew Jeffery     start += sizeof(uint8_t);
1323d0ba43afSAndrew Jeffery     // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
132448761c62SAndrew Jeffery     pldm_entity* entity = reinterpret_cast<pldm_entity*>(start);
132548761c62SAndrew Jeffery     EXPECT_EQ(le16toh(entity->entity_type), 1u);
132648761c62SAndrew Jeffery     EXPECT_EQ(le16toh(entity->entity_instance_num), 1u);
132748761c62SAndrew Jeffery     EXPECT_EQ(le16toh(entity->entity_container_id), 0u);
132848761c62SAndrew Jeffery     start += sizeof(pldm_entity);
132948761c62SAndrew Jeffery     EXPECT_EQ(*start,
133048761c62SAndrew Jeffery               pldm_entity_get_num_children(l1, PLDM_ENTITY_ASSOCIAION_LOGICAL));
133148761c62SAndrew Jeffery     start += sizeof(uint8_t);
1332d0ba43afSAndrew Jeffery     // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
133348761c62SAndrew Jeffery     entity = reinterpret_cast<pldm_entity*>(start);
133448761c62SAndrew Jeffery     EXPECT_EQ(le16toh(entity->entity_type), 3u);
133548761c62SAndrew Jeffery     EXPECT_EQ(le16toh(entity->entity_instance_num), 1u);
133648761c62SAndrew Jeffery     EXPECT_EQ(le16toh(entity->entity_container_id), 1u);
133748761c62SAndrew Jeffery     start += sizeof(pldm_entity);
1338d0ba43afSAndrew Jeffery     // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
133948761c62SAndrew Jeffery     entity = reinterpret_cast<pldm_entity*>(start);
134048761c62SAndrew Jeffery     EXPECT_EQ(le16toh(entity->entity_type), 3u);
134148761c62SAndrew Jeffery     EXPECT_EQ(le16toh(entity->entity_instance_num), 2u);
134248761c62SAndrew Jeffery     EXPECT_EQ(le16toh(entity->entity_container_id), 1u);
134348761c62SAndrew Jeffery 
134448761c62SAndrew Jeffery     currRecHandle = nextRecHandle;
134548761c62SAndrew Jeffery 
134648761c62SAndrew Jeffery     pldm_pdr_find_record(repo, currRecHandle, &data, &size, &nextRecHandle);
134748761c62SAndrew Jeffery     EXPECT_EQ(size, commonSize + (pldm_entity_get_num_children(
134848761c62SAndrew Jeffery                                       l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL) *
134948761c62SAndrew Jeffery                                   sizeof(pldm_entity)));
135048761c62SAndrew Jeffery     start = data;
1351d0ba43afSAndrew Jeffery     // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
135248761c62SAndrew Jeffery     hdr = reinterpret_cast<pldm_pdr_hdr*>(start);
135348761c62SAndrew Jeffery     EXPECT_EQ(le32toh(hdr->record_handle), 2u);
135448761c62SAndrew Jeffery     EXPECT_EQ(hdr->type, PLDM_PDR_ENTITY_ASSOCIATION);
135548761c62SAndrew Jeffery     EXPECT_EQ(le16toh(hdr->length), size - sizeof(struct pldm_pdr_hdr));
135648761c62SAndrew Jeffery     start += sizeof(pldm_pdr_hdr);
1357d0ba43afSAndrew Jeffery     // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
135848761c62SAndrew Jeffery     containerId = reinterpret_cast<uint16_t*>(start);
135948761c62SAndrew Jeffery     EXPECT_EQ(le16toh(*containerId), 1u);
136048761c62SAndrew Jeffery     start += sizeof(uint16_t);
136148761c62SAndrew Jeffery     EXPECT_EQ(*start, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
136248761c62SAndrew Jeffery     start += sizeof(uint8_t);
1363d0ba43afSAndrew Jeffery     // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
136448761c62SAndrew Jeffery     entity = reinterpret_cast<pldm_entity*>(start);
136548761c62SAndrew Jeffery     EXPECT_EQ(le16toh(entity->entity_type), 1u);
136648761c62SAndrew Jeffery     EXPECT_EQ(le16toh(entity->entity_instance_num), 1u);
136748761c62SAndrew Jeffery     EXPECT_EQ(le16toh(entity->entity_container_id), 0u);
136848761c62SAndrew Jeffery     start += sizeof(pldm_entity);
136948761c62SAndrew Jeffery     EXPECT_EQ(*start, pldm_entity_get_num_children(
137048761c62SAndrew Jeffery                           l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL));
137148761c62SAndrew Jeffery     start += sizeof(uint8_t);
1372d0ba43afSAndrew Jeffery     // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
137348761c62SAndrew Jeffery     entity = reinterpret_cast<pldm_entity*>(start);
137448761c62SAndrew Jeffery     EXPECT_EQ(le16toh(entity->entity_type), 2u);
137548761c62SAndrew Jeffery     EXPECT_EQ(le16toh(entity->entity_instance_num), 1u);
137648761c62SAndrew Jeffery     EXPECT_EQ(le16toh(entity->entity_container_id), 1u);
137748761c62SAndrew Jeffery     start += sizeof(pldm_entity);
1378d0ba43afSAndrew Jeffery     // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
137948761c62SAndrew Jeffery     entity = reinterpret_cast<pldm_entity*>(start);
138048761c62SAndrew Jeffery     EXPECT_EQ(le16toh(entity->entity_type), 2u);
138148761c62SAndrew Jeffery     EXPECT_EQ(le16toh(entity->entity_instance_num), 2u);
138248761c62SAndrew Jeffery     EXPECT_EQ(le16toh(entity->entity_container_id), 1u);
138348761c62SAndrew Jeffery 
138448761c62SAndrew Jeffery     currRecHandle = nextRecHandle;
138548761c62SAndrew Jeffery 
138648761c62SAndrew Jeffery     pldm_pdr_find_record(repo, currRecHandle, &data, &size, &nextRecHandle);
138748761c62SAndrew Jeffery     EXPECT_EQ(size, commonSize + (pldm_entity_get_num_children(
138848761c62SAndrew Jeffery                                       l2a, PLDM_ENTITY_ASSOCIAION_LOGICAL) *
138948761c62SAndrew Jeffery                                   sizeof(pldm_entity)));
139048761c62SAndrew Jeffery     start = data;
1391d0ba43afSAndrew Jeffery     // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
139248761c62SAndrew Jeffery     hdr = reinterpret_cast<pldm_pdr_hdr*>(start);
139348761c62SAndrew Jeffery     EXPECT_EQ(le32toh(hdr->record_handle), 3u);
139448761c62SAndrew Jeffery     EXPECT_EQ(hdr->type, PLDM_PDR_ENTITY_ASSOCIATION);
139548761c62SAndrew Jeffery     EXPECT_EQ(le16toh(hdr->length), size - sizeof(struct pldm_pdr_hdr));
139648761c62SAndrew Jeffery     start += sizeof(pldm_pdr_hdr);
1397d0ba43afSAndrew Jeffery     // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
139848761c62SAndrew Jeffery     containerId = reinterpret_cast<uint16_t*>(start);
139948761c62SAndrew Jeffery     EXPECT_EQ(le16toh(*containerId), 2u);
140048761c62SAndrew Jeffery     start += sizeof(uint16_t);
140148761c62SAndrew Jeffery     EXPECT_EQ(*start, PLDM_ENTITY_ASSOCIAION_LOGICAL);
140248761c62SAndrew Jeffery     start += sizeof(uint8_t);
1403d0ba43afSAndrew Jeffery     // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
140448761c62SAndrew Jeffery     entity = reinterpret_cast<pldm_entity*>(start);
140548761c62SAndrew Jeffery     EXPECT_EQ(le16toh(entity->entity_type), 2u);
140648761c62SAndrew Jeffery     EXPECT_EQ(le16toh(entity->entity_instance_num), 1u);
140748761c62SAndrew Jeffery     EXPECT_EQ(le16toh(entity->entity_container_id), 1u);
140848761c62SAndrew Jeffery     start += sizeof(pldm_entity);
140948761c62SAndrew Jeffery     EXPECT_EQ(*start, pldm_entity_get_num_children(
141048761c62SAndrew Jeffery                           l2a, PLDM_ENTITY_ASSOCIAION_LOGICAL));
141148761c62SAndrew Jeffery     start += sizeof(uint8_t);
1412d0ba43afSAndrew Jeffery     // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
141348761c62SAndrew Jeffery     entity = reinterpret_cast<pldm_entity*>(start);
141448761c62SAndrew Jeffery     EXPECT_EQ(le16toh(entity->entity_type), 5);
141548761c62SAndrew Jeffery     EXPECT_EQ(le16toh(entity->entity_instance_num), 2u);
141648761c62SAndrew Jeffery     EXPECT_EQ(le16toh(entity->entity_container_id), 2u);
141748761c62SAndrew Jeffery     start += sizeof(pldm_entity);
1418d0ba43afSAndrew Jeffery     // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
141948761c62SAndrew Jeffery     entity = reinterpret_cast<pldm_entity*>(start);
142048761c62SAndrew Jeffery     EXPECT_EQ(le16toh(entity->entity_type), 5u);
142148761c62SAndrew Jeffery     EXPECT_EQ(le16toh(entity->entity_instance_num), 3u);
142248761c62SAndrew Jeffery     EXPECT_EQ(le16toh(entity->entity_container_id), 2u);
142348761c62SAndrew Jeffery 
142448761c62SAndrew Jeffery     currRecHandle = nextRecHandle;
142548761c62SAndrew Jeffery 
142648761c62SAndrew Jeffery     pldm_pdr_find_record(repo, currRecHandle, &data, &size, &nextRecHandle);
142748761c62SAndrew Jeffery     EXPECT_EQ(size, commonSize + (pldm_entity_get_num_children(
142848761c62SAndrew Jeffery                                       l2a, PLDM_ENTITY_ASSOCIAION_PHYSICAL) *
142948761c62SAndrew Jeffery                                   sizeof(pldm_entity)));
143048761c62SAndrew Jeffery     start = data;
1431d0ba43afSAndrew Jeffery     // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
143248761c62SAndrew Jeffery     hdr = reinterpret_cast<pldm_pdr_hdr*>(start);
143348761c62SAndrew Jeffery     EXPECT_EQ(le32toh(hdr->record_handle), 4u);
143448761c62SAndrew Jeffery     EXPECT_EQ(hdr->type, PLDM_PDR_ENTITY_ASSOCIATION);
143548761c62SAndrew Jeffery     EXPECT_EQ(le16toh(hdr->length), size - sizeof(struct pldm_pdr_hdr));
143648761c62SAndrew Jeffery     start += sizeof(pldm_pdr_hdr);
1437d0ba43afSAndrew Jeffery     // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
143848761c62SAndrew Jeffery     containerId = reinterpret_cast<uint16_t*>(start);
143948761c62SAndrew Jeffery     EXPECT_EQ(le16toh(*containerId), 2u);
144048761c62SAndrew Jeffery     start += sizeof(uint16_t);
144148761c62SAndrew Jeffery     EXPECT_EQ(*start, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
144248761c62SAndrew Jeffery     start += sizeof(uint8_t);
1443d0ba43afSAndrew Jeffery     // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
144448761c62SAndrew Jeffery     entity = reinterpret_cast<pldm_entity*>(start);
144548761c62SAndrew Jeffery     EXPECT_EQ(le16toh(entity->entity_type), 2u);
144648761c62SAndrew Jeffery     EXPECT_EQ(le16toh(entity->entity_instance_num), 1u);
144748761c62SAndrew Jeffery     EXPECT_EQ(le16toh(entity->entity_container_id), 1u);
144848761c62SAndrew Jeffery     start += sizeof(pldm_entity);
144948761c62SAndrew Jeffery     EXPECT_EQ(*start, pldm_entity_get_num_children(
145048761c62SAndrew Jeffery                           l2a, PLDM_ENTITY_ASSOCIAION_PHYSICAL));
145148761c62SAndrew Jeffery     start += sizeof(uint8_t);
1452d0ba43afSAndrew Jeffery     // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
145348761c62SAndrew Jeffery     entity = reinterpret_cast<pldm_entity*>(start);
145448761c62SAndrew Jeffery     EXPECT_EQ(le16toh(entity->entity_type), 4u);
145548761c62SAndrew Jeffery     EXPECT_EQ(le16toh(entity->entity_instance_num), 1u);
145648761c62SAndrew Jeffery     EXPECT_EQ(le16toh(entity->entity_container_id), 2u);
145748761c62SAndrew Jeffery     start += sizeof(pldm_entity);
1458d0ba43afSAndrew Jeffery     // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
145948761c62SAndrew Jeffery     entity = reinterpret_cast<pldm_entity*>(start);
146048761c62SAndrew Jeffery     EXPECT_EQ(le16toh(entity->entity_type), 5u);
146148761c62SAndrew Jeffery     EXPECT_EQ(le16toh(entity->entity_instance_num), 1u);
146248761c62SAndrew Jeffery     EXPECT_EQ(le16toh(entity->entity_container_id), 2u);
146348761c62SAndrew Jeffery 
146448761c62SAndrew Jeffery     currRecHandle = nextRecHandle;
146548761c62SAndrew Jeffery 
146648761c62SAndrew Jeffery     pldm_pdr_find_record(repo, currRecHandle, &data, &size, &nextRecHandle);
146748761c62SAndrew Jeffery     EXPECT_EQ(size, commonSize + (pldm_entity_get_num_children(
146848761c62SAndrew Jeffery                                       l3a, PLDM_ENTITY_ASSOCIAION_PHYSICAL) *
146948761c62SAndrew Jeffery                                   sizeof(pldm_entity)));
147048761c62SAndrew Jeffery     start = data;
1471d0ba43afSAndrew Jeffery     // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
147248761c62SAndrew Jeffery     hdr = reinterpret_cast<pldm_pdr_hdr*>(start);
147348761c62SAndrew Jeffery     EXPECT_EQ(le32toh(hdr->record_handle), 5u);
147448761c62SAndrew Jeffery     EXPECT_EQ(hdr->type, PLDM_PDR_ENTITY_ASSOCIATION);
147548761c62SAndrew Jeffery     EXPECT_EQ(le16toh(hdr->length), size - sizeof(struct pldm_pdr_hdr));
147648761c62SAndrew Jeffery     start += sizeof(pldm_pdr_hdr);
1477d0ba43afSAndrew Jeffery     // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
147848761c62SAndrew Jeffery     containerId = reinterpret_cast<uint16_t*>(start);
147948761c62SAndrew Jeffery     EXPECT_EQ(le16toh(*containerId), 3u);
148048761c62SAndrew Jeffery     start += sizeof(uint16_t);
148148761c62SAndrew Jeffery     EXPECT_EQ(*start, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
148248761c62SAndrew Jeffery     start += sizeof(uint8_t);
1483d0ba43afSAndrew Jeffery     // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
148448761c62SAndrew Jeffery     entity = reinterpret_cast<pldm_entity*>(start);
148548761c62SAndrew Jeffery     EXPECT_EQ(le16toh(entity->entity_type), 4u);
148648761c62SAndrew Jeffery     EXPECT_EQ(le16toh(entity->entity_instance_num), 1u);
148748761c62SAndrew Jeffery     EXPECT_EQ(le16toh(entity->entity_container_id), 2u);
148848761c62SAndrew Jeffery     start += sizeof(pldm_entity);
148948761c62SAndrew Jeffery     EXPECT_EQ(*start, pldm_entity_get_num_children(
149048761c62SAndrew Jeffery                           l3a, PLDM_ENTITY_ASSOCIAION_PHYSICAL));
149148761c62SAndrew Jeffery     start += sizeof(uint8_t);
1492d0ba43afSAndrew Jeffery     // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
149348761c62SAndrew Jeffery     entity = reinterpret_cast<pldm_entity*>(start);
149448761c62SAndrew Jeffery     EXPECT_EQ(le16toh(entity->entity_type), 6u);
149548761c62SAndrew Jeffery     EXPECT_EQ(le16toh(entity->entity_instance_num), 1u);
149648761c62SAndrew Jeffery     EXPECT_EQ(le16toh(entity->entity_container_id), 3u);
149748761c62SAndrew Jeffery 
149848761c62SAndrew Jeffery     currRecHandle = nextRecHandle;
149948761c62SAndrew Jeffery 
150048761c62SAndrew Jeffery     pldm_pdr_find_record(repo, currRecHandle, &data, &size, &nextRecHandle);
150148761c62SAndrew Jeffery     EXPECT_EQ(size, commonSize + (pldm_entity_get_num_children(
150248761c62SAndrew Jeffery                                       l3b, PLDM_ENTITY_ASSOCIAION_LOGICAL) *
150348761c62SAndrew Jeffery                                   sizeof(pldm_entity)));
150448761c62SAndrew Jeffery     start = data;
1505d0ba43afSAndrew Jeffery     // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
150648761c62SAndrew Jeffery     hdr = reinterpret_cast<pldm_pdr_hdr*>(start);
150748761c62SAndrew Jeffery     EXPECT_EQ(le32toh(hdr->record_handle), 6u);
150848761c62SAndrew Jeffery     EXPECT_EQ(hdr->type, PLDM_PDR_ENTITY_ASSOCIATION);
150948761c62SAndrew Jeffery     EXPECT_EQ(le16toh(hdr->length), size - sizeof(struct pldm_pdr_hdr));
151048761c62SAndrew Jeffery     start += sizeof(pldm_pdr_hdr);
1511d0ba43afSAndrew Jeffery     // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
151248761c62SAndrew Jeffery     containerId = reinterpret_cast<uint16_t*>(start);
151348761c62SAndrew Jeffery     EXPECT_EQ(le16toh(*containerId), 4u);
151448761c62SAndrew Jeffery     start += sizeof(uint16_t);
151548761c62SAndrew Jeffery     EXPECT_EQ(*start, PLDM_ENTITY_ASSOCIAION_LOGICAL);
151648761c62SAndrew Jeffery     start += sizeof(uint8_t);
1517d0ba43afSAndrew Jeffery     // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
151848761c62SAndrew Jeffery     entity = reinterpret_cast<pldm_entity*>(start);
151948761c62SAndrew Jeffery     EXPECT_EQ(le16toh(entity->entity_type), 5u);
152048761c62SAndrew Jeffery     EXPECT_EQ(le16toh(entity->entity_instance_num), 1u);
152148761c62SAndrew Jeffery     EXPECT_EQ(le16toh(entity->entity_container_id), 2u);
152248761c62SAndrew Jeffery     start += sizeof(pldm_entity);
152348761c62SAndrew Jeffery     EXPECT_EQ(*start, pldm_entity_get_num_children(
152448761c62SAndrew Jeffery                           l3b, PLDM_ENTITY_ASSOCIAION_LOGICAL));
152548761c62SAndrew Jeffery     start += sizeof(uint8_t);
1526d0ba43afSAndrew Jeffery     // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
152748761c62SAndrew Jeffery     entity = reinterpret_cast<pldm_entity*>(start);
152848761c62SAndrew Jeffery     EXPECT_EQ(le16toh(entity->entity_type), 7u);
152948761c62SAndrew Jeffery     EXPECT_EQ(le16toh(entity->entity_instance_num), 1u);
153048761c62SAndrew Jeffery     EXPECT_EQ(le16toh(entity->entity_container_id), 4u);
153148761c62SAndrew Jeffery 
153248761c62SAndrew Jeffery     EXPECT_EQ(nextRecHandle, 0u);
153348761c62SAndrew Jeffery 
153448761c62SAndrew Jeffery     pldm_pdr_destroy(repo);
153548761c62SAndrew Jeffery     pldm_entity_association_tree_destroy(tree);
153648761c62SAndrew Jeffery }
153748761c62SAndrew Jeffery 
TEST(EntityAssociationPDR,testPDRWithRecordHandle)1538bc40dd5aSArchana Kakani TEST(EntityAssociationPDR, testPDRWithRecordHandle)
1539bc40dd5aSArchana Kakani {
1540bc40dd5aSArchana Kakani     // e = entity type, c = container id, i = instance num
1541bc40dd5aSArchana Kakani 
1542bc40dd5aSArchana Kakani     //        INPUT
1543bc40dd5aSArchana Kakani     //        1(e=1)
1544bc40dd5aSArchana Kakani     //        |
1545bc40dd5aSArchana Kakani     //        2(e=2)--3(e=2)
1546bc40dd5aSArchana Kakani 
1547bc40dd5aSArchana Kakani     //        Expected OUTPUT
1548bc40dd5aSArchana Kakani     //        1(e=1,c=0,i=1)
1549bc40dd5aSArchana Kakani     //        |
1550bc40dd5aSArchana Kakani     //        2(e=2,c=1,i=1)--3(e=2,c=1,i=2)
1551bc40dd5aSArchana Kakani 
1552bc40dd5aSArchana Kakani     pldm_entity entities[3] = {{1, 1, 0}, {2, 1, 1}, {3, 1, 1}};
1553bc40dd5aSArchana Kakani     pldm_entity_test testEntities[3] = {{1, 1, 0}, {2, 1, 1}, {3, 1, 1}};
1554bc40dd5aSArchana Kakani 
1555bc40dd5aSArchana Kakani     auto tree = pldm_entity_association_tree_init();
1556bc40dd5aSArchana Kakani 
1557bc40dd5aSArchana Kakani     auto l1 = pldm_entity_association_tree_add(
1558bc40dd5aSArchana Kakani         tree, &entities[0], 0xffff, nullptr, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
1559bc40dd5aSArchana Kakani     ASSERT_NE(l1, nullptr);
1560bc40dd5aSArchana Kakani 
1561bc40dd5aSArchana Kakani     auto l2a = pldm_entity_association_tree_add(
1562bc40dd5aSArchana Kakani         tree, &entities[1], 0xffff, l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
1563bc40dd5aSArchana Kakani     ASSERT_NE(l2a, nullptr);
1564bc40dd5aSArchana Kakani     pldm_entity_association_tree_add(tree, &entities[2], 0xffff, l1,
1565bc40dd5aSArchana Kakani                                      PLDM_ENTITY_ASSOCIAION_LOGICAL);
1566bc40dd5aSArchana Kakani     auto repo = pldm_pdr_init();
1567bc40dd5aSArchana Kakani     pldm_entity* l_entities = entities;
1568bc40dd5aSArchana Kakani 
1569bc40dd5aSArchana Kakani     pldm_entity_node* node = nullptr;
1570bc40dd5aSArchana Kakani     pldm_find_entity_ref_in_tree(tree, entities[0], &node);
1571bc40dd5aSArchana Kakani 
1572bc40dd5aSArchana Kakani     ASSERT_NE(node, nullptr);
1573bc40dd5aSArchana Kakani 
1574bc40dd5aSArchana Kakani     int numEntities = 3;
1575bc40dd5aSArchana Kakani     pldm_entity_association_pdr_add_from_node_with_record_handle(
1576bc40dd5aSArchana Kakani         node, repo, &l_entities, numEntities, true, 1, (10));
1577bc40dd5aSArchana Kakani 
1578bc40dd5aSArchana Kakani     EXPECT_EQ(pldm_pdr_get_record_count(repo), 2u);
1579bc40dd5aSArchana Kakani 
1580bc40dd5aSArchana Kakani     uint32_t currRecHandle{};
1581bc40dd5aSArchana Kakani     uint32_t nextRecHandle{};
1582bc40dd5aSArchana Kakani     uint8_t* data = nullptr;
1583bc40dd5aSArchana Kakani     uint32_t size{};
1584bc40dd5aSArchana Kakani 
1585bc40dd5aSArchana Kakani     pldm_pdr_find_record(repo, currRecHandle, &data, &size, &nextRecHandle);
1586bc40dd5aSArchana Kakani 
1587bc40dd5aSArchana Kakani     struct pldm_msgbuf _buf;
1588bc40dd5aSArchana Kakani     struct pldm_msgbuf* buf = &_buf;
1589bc40dd5aSArchana Kakani 
1590bc40dd5aSArchana Kakani     auto rc =
1591bc40dd5aSArchana Kakani         pldm_msgbuf_init_errno(buf,
1592bc40dd5aSArchana Kakani                                (sizeof(struct pldm_pdr_hdr) +
1593bc40dd5aSArchana Kakani                                 sizeof(struct pldm_pdr_entity_association)),
1594bc40dd5aSArchana Kakani                                data, size);
1595bc40dd5aSArchana Kakani     ASSERT_EQ(rc, 0);
1596bc40dd5aSArchana Kakani 
1597bc40dd5aSArchana Kakani     pldm_association_pdr_test association_pdr = pldm_association_pdr_test{
1598bc40dd5aSArchana Kakani         10,
1599bc40dd5aSArchana Kakani         1,
1600bc40dd5aSArchana Kakani         PLDM_PDR_ENTITY_ASSOCIATION,
1601bc40dd5aSArchana Kakani         1,
1602bc40dd5aSArchana Kakani         static_cast<uint16_t>(size - sizeof(struct pldm_pdr_hdr)),
1603bc40dd5aSArchana Kakani         1,
1604bc40dd5aSArchana Kakani         PLDM_ENTITY_ASSOCIAION_LOGICAL,
1605bc40dd5aSArchana Kakani         1};
1606bc40dd5aSArchana Kakani 
1607bc40dd5aSArchana Kakani     verifyEntityAssociationPdr(buf, association_pdr, testEntities[0],
1608bc40dd5aSArchana Kakani                                testEntities[2]);
1609bc40dd5aSArchana Kakani 
1610bc40dd5aSArchana Kakani     currRecHandle = nextRecHandle;
1611bc40dd5aSArchana Kakani     pldm_pdr_find_record(repo, currRecHandle, &data, &size, &nextRecHandle);
1612bc40dd5aSArchana Kakani     rc = pldm_msgbuf_init_errno(buf,
1613bc40dd5aSArchana Kakani                                 (sizeof(struct pldm_pdr_hdr) +
1614bc40dd5aSArchana Kakani                                  sizeof(struct pldm_pdr_entity_association)),
1615bc40dd5aSArchana Kakani                                 data, size);
1616bc40dd5aSArchana Kakani     ASSERT_EQ(rc, 0);
1617bc40dd5aSArchana Kakani 
1618bc40dd5aSArchana Kakani     pldm_association_pdr_test association_pdr1 = pldm_association_pdr_test{
1619bc40dd5aSArchana Kakani         11,
1620bc40dd5aSArchana Kakani         1,
1621bc40dd5aSArchana Kakani         PLDM_PDR_ENTITY_ASSOCIATION,
1622bc40dd5aSArchana Kakani         1,
1623bc40dd5aSArchana Kakani         static_cast<uint16_t>(size - sizeof(struct pldm_pdr_hdr)),
1624bc40dd5aSArchana Kakani         1,
1625bc40dd5aSArchana Kakani         PLDM_ENTITY_ASSOCIAION_PHYSICAL,
1626bc40dd5aSArchana Kakani         1};
1627bc40dd5aSArchana Kakani 
1628bc40dd5aSArchana Kakani     verifyEntityAssociationPdr(buf, association_pdr1, testEntities[0],
1629bc40dd5aSArchana Kakani                                testEntities[1]);
1630bc40dd5aSArchana Kakani 
1631bc40dd5aSArchana Kakani     pldm_pdr_destroy(repo);
1632bc40dd5aSArchana Kakani     pldm_entity_association_tree_destroy(tree);
1633bc40dd5aSArchana Kakani }
1634bc40dd5aSArchana Kakani 
TEST(EntityAssociationPDR,testFind)163548761c62SAndrew Jeffery TEST(EntityAssociationPDR, testFind)
163648761c62SAndrew Jeffery {
163748761c62SAndrew Jeffery     //        1
163848761c62SAndrew Jeffery     //        |
163948761c62SAndrew Jeffery     //        2--3--4
164048761c62SAndrew Jeffery     //        |
164148761c62SAndrew Jeffery     //        5--6--7
164248761c62SAndrew Jeffery     //        |  |
164348761c62SAndrew Jeffery     //        8  9
164448761c62SAndrew Jeffery 
164548761c62SAndrew Jeffery     pldm_entity entities[9]{};
164648761c62SAndrew Jeffery 
164748761c62SAndrew Jeffery     entities[0].entity_type = 1;
164848761c62SAndrew Jeffery     entities[1].entity_type = 2;
164948761c62SAndrew Jeffery     entities[2].entity_type = 2;
165048761c62SAndrew Jeffery     entities[3].entity_type = 3;
165148761c62SAndrew Jeffery     entities[4].entity_type = 4;
165248761c62SAndrew Jeffery     entities[5].entity_type = 5;
165348761c62SAndrew Jeffery     entities[6].entity_type = 5;
165448761c62SAndrew Jeffery     entities[7].entity_type = 6;
165548761c62SAndrew Jeffery     entities[8].entity_type = 7;
165648761c62SAndrew Jeffery 
165748761c62SAndrew Jeffery     auto tree = pldm_entity_association_tree_init();
165848761c62SAndrew Jeffery 
165948761c62SAndrew Jeffery     auto l1 = pldm_entity_association_tree_add(
166048761c62SAndrew Jeffery         tree, &entities[0], 0xffff, nullptr, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
166148761c62SAndrew Jeffery     EXPECT_NE(l1, nullptr);
166248761c62SAndrew Jeffery     auto l2a = pldm_entity_association_tree_add(
166348761c62SAndrew Jeffery         tree, &entities[1], 0xffff, l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
166448761c62SAndrew Jeffery     EXPECT_NE(l2a, nullptr);
166548761c62SAndrew Jeffery     auto l2b = pldm_entity_association_tree_add(
166648761c62SAndrew Jeffery         tree, &entities[2], 0xffff, l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
166748761c62SAndrew Jeffery     EXPECT_NE(l2b, nullptr);
166848761c62SAndrew Jeffery     auto l2c = pldm_entity_association_tree_add(
166948761c62SAndrew Jeffery         tree, &entities[3], 0xffff, l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
167048761c62SAndrew Jeffery     EXPECT_NE(l2c, nullptr);
167148761c62SAndrew Jeffery     auto l3a = pldm_entity_association_tree_add(
167248761c62SAndrew Jeffery         tree, &entities[4], 0xffff, l2a, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
167348761c62SAndrew Jeffery     EXPECT_NE(l3a, nullptr);
167448761c62SAndrew Jeffery     auto l3b = pldm_entity_association_tree_add(
167548761c62SAndrew Jeffery         tree, &entities[5], 0xffff, l2a, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
167648761c62SAndrew Jeffery     EXPECT_NE(l3b, nullptr);
167748761c62SAndrew Jeffery     auto l3c = pldm_entity_association_tree_add(
167848761c62SAndrew Jeffery         tree, &entities[6], 0xffff, l2a, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
167948761c62SAndrew Jeffery     EXPECT_NE(l3c, nullptr);
168048761c62SAndrew Jeffery     auto l4a = pldm_entity_association_tree_add(
168148761c62SAndrew Jeffery         tree, &entities[7], 0xffff, l3a, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
168248761c62SAndrew Jeffery     EXPECT_NE(l4a, nullptr);
168348761c62SAndrew Jeffery     auto l4b = pldm_entity_association_tree_add(
168448761c62SAndrew Jeffery         tree, &entities[8], 0xffff, l3b, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
168548761c62SAndrew Jeffery     EXPECT_NE(l4b, nullptr);
168648761c62SAndrew Jeffery 
168748761c62SAndrew Jeffery     pldm_entity entity{};
168848761c62SAndrew Jeffery 
168948761c62SAndrew Jeffery     entity.entity_type = 1;
169048761c62SAndrew Jeffery     entity.entity_instance_num = 1;
169148761c62SAndrew Jeffery     auto result = pldm_entity_association_tree_find(tree, &entity);
169248761c62SAndrew Jeffery     EXPECT_EQ(result, l1);
169348761c62SAndrew Jeffery     EXPECT_EQ(entity.entity_container_id, 0);
169448761c62SAndrew Jeffery 
169548761c62SAndrew Jeffery     entity.entity_type = 2;
169648761c62SAndrew Jeffery     entity.entity_instance_num = 1;
169748761c62SAndrew Jeffery     result = pldm_entity_association_tree_find(tree, &entity);
169848761c62SAndrew Jeffery     EXPECT_EQ(result, l2a);
169948761c62SAndrew Jeffery     EXPECT_EQ(entity.entity_container_id, 1);
170048761c62SAndrew Jeffery     entity.entity_type = 2;
170148761c62SAndrew Jeffery     entity.entity_instance_num = 2;
170248761c62SAndrew Jeffery     result = pldm_entity_association_tree_find(tree, &entity);
170348761c62SAndrew Jeffery     EXPECT_EQ(result, l2b);
170448761c62SAndrew Jeffery     EXPECT_EQ(entity.entity_container_id, 1);
170548761c62SAndrew Jeffery     entity.entity_type = 3;
170648761c62SAndrew Jeffery     entity.entity_instance_num = 1;
170748761c62SAndrew Jeffery     result = pldm_entity_association_tree_find(tree, &entity);
170848761c62SAndrew Jeffery     EXPECT_EQ(result, l2c);
170948761c62SAndrew Jeffery     EXPECT_EQ(entity.entity_container_id, 1);
171048761c62SAndrew Jeffery 
171148761c62SAndrew Jeffery     entity.entity_type = 7;
171248761c62SAndrew Jeffery     entity.entity_instance_num = 1;
171348761c62SAndrew Jeffery     result = pldm_entity_association_tree_find(tree, &entity);
171448761c62SAndrew Jeffery     EXPECT_EQ(result, l4b);
171548761c62SAndrew Jeffery     EXPECT_EQ(entity.entity_container_id, 4);
171648761c62SAndrew Jeffery 
171748761c62SAndrew Jeffery     pldm_entity_association_tree_destroy(tree);
171848761c62SAndrew Jeffery }
171948761c62SAndrew Jeffery 
172060582150SAndrew Jeffery #ifdef LIBPLDM_API_TESTING
TEST(EntityAssociationPDR,testCopyTree)172148761c62SAndrew Jeffery TEST(EntityAssociationPDR, testCopyTree)
172248761c62SAndrew Jeffery {
172348761c62SAndrew Jeffery     pldm_entity entities[4]{};
172460582150SAndrew Jeffery     int rc;
172560582150SAndrew Jeffery 
172648761c62SAndrew Jeffery     entities[0].entity_type = 1;
172748761c62SAndrew Jeffery     entities[1].entity_type = 2;
172848761c62SAndrew Jeffery     entities[2].entity_type = 2;
172948761c62SAndrew Jeffery     entities[3].entity_type = 3;
173048761c62SAndrew Jeffery 
173148761c62SAndrew Jeffery     auto orgTree = pldm_entity_association_tree_init();
173248761c62SAndrew Jeffery     auto newTree = pldm_entity_association_tree_init();
173348761c62SAndrew Jeffery     auto l1 =
173448761c62SAndrew Jeffery         pldm_entity_association_tree_add(orgTree, &entities[0], 0xffff, nullptr,
173548761c62SAndrew Jeffery                                          PLDM_ENTITY_ASSOCIAION_PHYSICAL);
173648761c62SAndrew Jeffery     EXPECT_NE(l1, nullptr);
173748761c62SAndrew Jeffery     auto l2a = pldm_entity_association_tree_add(
173848761c62SAndrew Jeffery         orgTree, &entities[1], 0xffff, l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
173948761c62SAndrew Jeffery     EXPECT_NE(l2a, nullptr);
174048761c62SAndrew Jeffery     auto l2b = pldm_entity_association_tree_add(
174148761c62SAndrew Jeffery         orgTree, &entities[2], 0xffff, l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
174248761c62SAndrew Jeffery     EXPECT_NE(l2b, nullptr);
174348761c62SAndrew Jeffery     auto l2c = pldm_entity_association_tree_add(
174448761c62SAndrew Jeffery         orgTree, &entities[3], 0xffff, l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
174548761c62SAndrew Jeffery     EXPECT_NE(l2c, nullptr);
174648761c62SAndrew Jeffery     size_t orgNum{};
174748761c62SAndrew Jeffery     pldm_entity* orgOut = nullptr;
174848761c62SAndrew Jeffery     pldm_entity_association_tree_visit(orgTree, &orgOut, &orgNum);
174948761c62SAndrew Jeffery     EXPECT_EQ(orgNum, 4u);
175048761c62SAndrew Jeffery 
175160582150SAndrew Jeffery     rc = pldm_entity_association_tree_copy_root_check(orgTree, newTree);
175260582150SAndrew Jeffery     ASSERT_EQ(rc, 0);
175348761c62SAndrew Jeffery     size_t newNum{};
175448761c62SAndrew Jeffery     pldm_entity* newOut = nullptr;
175548761c62SAndrew Jeffery     pldm_entity_association_tree_visit(newTree, &newOut, &newNum);
175648761c62SAndrew Jeffery     EXPECT_EQ(newNum, orgNum);
175748761c62SAndrew Jeffery     EXPECT_EQ(newOut[0].entity_type, 1u);
175848761c62SAndrew Jeffery     EXPECT_EQ(newOut[0].entity_instance_num, 1u);
175948761c62SAndrew Jeffery     EXPECT_EQ(newOut[0].entity_container_id, 0u);
176048761c62SAndrew Jeffery     free(orgOut);
176148761c62SAndrew Jeffery     free(newOut);
176248761c62SAndrew Jeffery     pldm_entity_association_tree_destroy(orgTree);
176348761c62SAndrew Jeffery     pldm_entity_association_tree_destroy(newTree);
176448761c62SAndrew Jeffery }
176560582150SAndrew Jeffery #endif
176648761c62SAndrew Jeffery 
TEST(EntityAssociationPDR,testExtract)176748761c62SAndrew Jeffery TEST(EntityAssociationPDR, testExtract)
176848761c62SAndrew Jeffery {
176948761c62SAndrew Jeffery     std::vector<uint8_t> pdr{};
177048761c62SAndrew Jeffery     pdr.resize(sizeof(pldm_pdr_hdr) + sizeof(pldm_pdr_entity_association) +
1771bc40dd5aSArchana Kakani                sizeof(pldm_entity) * 4);
1772d0ba43afSAndrew Jeffery     // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
177348761c62SAndrew Jeffery     pldm_pdr_hdr* hdr = reinterpret_cast<pldm_pdr_hdr*>(pdr.data());
177448761c62SAndrew Jeffery     hdr->type = PLDM_PDR_ENTITY_ASSOCIATION;
177548761c62SAndrew Jeffery     hdr->length =
1776bc40dd5aSArchana Kakani         htole16(sizeof(pldm_pdr_entity_association) + sizeof(pldm_entity) * 4);
177748761c62SAndrew Jeffery 
177848761c62SAndrew Jeffery     pldm_pdr_entity_association* e =
1779d0ba43afSAndrew Jeffery         // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
178048761c62SAndrew Jeffery         reinterpret_cast<pldm_pdr_entity_association*>(pdr.data() +
178148761c62SAndrew Jeffery                                                        sizeof(pldm_pdr_hdr));
178248761c62SAndrew Jeffery     e->container_id = htole16(1);
178348761c62SAndrew Jeffery     e->num_children = 5;
178448761c62SAndrew Jeffery     e->container.entity_type = htole16(1);
178548761c62SAndrew Jeffery     e->container.entity_instance_num = htole16(1);
178648761c62SAndrew Jeffery     e->container.entity_container_id = htole16(0);
178748761c62SAndrew Jeffery 
178848761c62SAndrew Jeffery     pldm_entity* entity = e->children;
178948761c62SAndrew Jeffery     entity->entity_type = htole16(2);
179048761c62SAndrew Jeffery     entity->entity_instance_num = htole16(1);
179148761c62SAndrew Jeffery     entity->entity_container_id = htole16(1);
179248761c62SAndrew Jeffery     ++entity;
179348761c62SAndrew Jeffery     entity->entity_type = htole16(3);
179448761c62SAndrew Jeffery     entity->entity_instance_num = htole16(1);
179548761c62SAndrew Jeffery     entity->entity_container_id = htole16(1);
179648761c62SAndrew Jeffery     ++entity;
179748761c62SAndrew Jeffery     entity->entity_type = htole16(4);
179848761c62SAndrew Jeffery     entity->entity_instance_num = htole16(1);
179948761c62SAndrew Jeffery     entity->entity_container_id = htole16(1);
180048761c62SAndrew Jeffery     ++entity;
180148761c62SAndrew Jeffery     entity->entity_type = htole16(5);
180248761c62SAndrew Jeffery     entity->entity_instance_num = htole16(1);
180348761c62SAndrew Jeffery     entity->entity_container_id = htole16(1);
180448761c62SAndrew Jeffery     ++entity;
180548761c62SAndrew Jeffery     entity->entity_type = htole16(6);
180648761c62SAndrew Jeffery     entity->entity_instance_num = htole16(1);
180748761c62SAndrew Jeffery     entity->entity_container_id = htole16(1);
180848761c62SAndrew Jeffery 
180948761c62SAndrew Jeffery     size_t num{};
181048761c62SAndrew Jeffery     pldm_entity* out = nullptr;
181148761c62SAndrew Jeffery     pldm_entity_association_pdr_extract(pdr.data(), pdr.size(), &num, &out);
181248761c62SAndrew Jeffery     EXPECT_EQ(num, (unsigned)e->num_children + 1);
181348761c62SAndrew Jeffery     EXPECT_EQ(out[0].entity_type, 1u);
181448761c62SAndrew Jeffery     EXPECT_EQ(out[0].entity_instance_num, 1u);
181548761c62SAndrew Jeffery     EXPECT_EQ(out[0].entity_container_id, 0u);
181648761c62SAndrew Jeffery     EXPECT_EQ(out[1].entity_type, 2u);
181748761c62SAndrew Jeffery     EXPECT_EQ(out[1].entity_instance_num, 1u);
181848761c62SAndrew Jeffery     EXPECT_EQ(out[1].entity_container_id, 1u);
181948761c62SAndrew Jeffery     EXPECT_EQ(out[2].entity_type, 3u);
182048761c62SAndrew Jeffery     EXPECT_EQ(out[2].entity_instance_num, 1u);
182148761c62SAndrew Jeffery     EXPECT_EQ(out[2].entity_container_id, 1u);
182248761c62SAndrew Jeffery     EXPECT_EQ(out[3].entity_type, 4u);
182348761c62SAndrew Jeffery     EXPECT_EQ(out[3].entity_instance_num, 1u);
182448761c62SAndrew Jeffery     EXPECT_EQ(out[3].entity_container_id, 1u);
182548761c62SAndrew Jeffery     EXPECT_EQ(out[4].entity_type, 5u);
182648761c62SAndrew Jeffery     EXPECT_EQ(out[4].entity_instance_num, 1u);
182748761c62SAndrew Jeffery     EXPECT_EQ(out[4].entity_container_id, 1u);
182848761c62SAndrew Jeffery     EXPECT_EQ(out[5].entity_type, 6u);
182948761c62SAndrew Jeffery     EXPECT_EQ(out[5].entity_instance_num, 1u);
183048761c62SAndrew Jeffery     EXPECT_EQ(out[5].entity_container_id, 1u);
183148761c62SAndrew Jeffery 
183248761c62SAndrew Jeffery     free(out);
183348761c62SAndrew Jeffery }
183448761c62SAndrew Jeffery 
TEST(EntityAssociationPDR,testGetChildren)183548761c62SAndrew Jeffery TEST(EntityAssociationPDR, testGetChildren)
183648761c62SAndrew Jeffery {
183748761c62SAndrew Jeffery     pldm_entity entities[4]{};
183848761c62SAndrew Jeffery     entities[0].entity_type = 1;
183948761c62SAndrew Jeffery     entities[1].entity_type = 2;
184048761c62SAndrew Jeffery     entities[2].entity_type = 2;
184148761c62SAndrew Jeffery     entities[3].entity_type = 3;
184248761c62SAndrew Jeffery 
184348761c62SAndrew Jeffery     auto tree = pldm_entity_association_tree_init();
184448761c62SAndrew Jeffery     auto l1 = pldm_entity_association_tree_add(
184548761c62SAndrew Jeffery         tree, &entities[0], 0xffff, nullptr, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
184648761c62SAndrew Jeffery     EXPECT_NE(l1, nullptr);
184748761c62SAndrew Jeffery     auto l2a = pldm_entity_association_tree_add(
184848761c62SAndrew Jeffery         tree, &entities[1], 0xffff, l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
184948761c62SAndrew Jeffery     EXPECT_NE(l2a, nullptr);
185048761c62SAndrew Jeffery     auto l2b = pldm_entity_association_tree_add(
185148761c62SAndrew Jeffery         tree, &entities[2], 0xffff, l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
185248761c62SAndrew Jeffery     EXPECT_NE(l2b, nullptr);
185348761c62SAndrew Jeffery     auto l2c = pldm_entity_association_tree_add(
185448761c62SAndrew Jeffery         tree, &entities[3], 0xffff, l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
185548761c62SAndrew Jeffery     EXPECT_NE(l2c, nullptr);
185648761c62SAndrew Jeffery 
185748761c62SAndrew Jeffery     pldm_entity et1;
185848761c62SAndrew Jeffery     et1.entity_type = 2;
185948761c62SAndrew Jeffery     et1.entity_instance_num = 1;
186048761c62SAndrew Jeffery     EXPECT_EQ(true, pldm_is_current_parent_child(l1, &et1));
186148761c62SAndrew Jeffery 
186248761c62SAndrew Jeffery     pldm_entity et2;
186348761c62SAndrew Jeffery     et2.entity_type = 2;
186448761c62SAndrew Jeffery     et2.entity_instance_num = 2;
186548761c62SAndrew Jeffery     EXPECT_EQ(true, pldm_is_current_parent_child(l1, &et2));
186648761c62SAndrew Jeffery 
186748761c62SAndrew Jeffery     pldm_entity et3;
186848761c62SAndrew Jeffery     et3.entity_type = 2;
186948761c62SAndrew Jeffery     et3.entity_instance_num = 3;
187048761c62SAndrew Jeffery     EXPECT_EQ(false, pldm_is_current_parent_child(l1, &et3));
187148761c62SAndrew Jeffery 
187248761c62SAndrew Jeffery     pldm_entity_association_tree_destroy(tree);
187348761c62SAndrew Jeffery }
187448761c62SAndrew Jeffery 
TEST(EntityAssociationPDR,testEntityInstanceNumber)187548761c62SAndrew Jeffery TEST(EntityAssociationPDR, testEntityInstanceNumber)
187648761c62SAndrew Jeffery {
187748761c62SAndrew Jeffery     pldm_entity entities[9]{};
187848761c62SAndrew Jeffery 
187948761c62SAndrew Jeffery     entities[0].entity_type = 1;
188048761c62SAndrew Jeffery     entities[1].entity_type = 2;
188148761c62SAndrew Jeffery     entities[2].entity_type = 2;
188248761c62SAndrew Jeffery     entities[3].entity_type = 2;
188348761c62SAndrew Jeffery     entities[4].entity_type = 2;
188448761c62SAndrew Jeffery     entities[5].entity_type = 2;
188548761c62SAndrew Jeffery     entities[6].entity_type = 2;
188648761c62SAndrew Jeffery     entities[7].entity_type = 3;
188748761c62SAndrew Jeffery     entities[8].entity_type = 3;
188848761c62SAndrew Jeffery 
188948761c62SAndrew Jeffery     auto tree = pldm_entity_association_tree_init();
189048761c62SAndrew Jeffery     auto repo = pldm_pdr_init();
189148761c62SAndrew Jeffery 
189248761c62SAndrew Jeffery     uint16_t terminusHdl{};
189348761c62SAndrew Jeffery     uint16_t entityType{};
189448761c62SAndrew Jeffery     uint16_t entityInstanceNum{};
189548761c62SAndrew Jeffery     uint16_t containerId{};
189648761c62SAndrew Jeffery 
189748761c62SAndrew Jeffery     auto node = pldm_entity_association_tree_add(
189848761c62SAndrew Jeffery         tree, &entities[0], 0xffff, nullptr, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
189948761c62SAndrew Jeffery     EXPECT_NE(node, nullptr);
190048761c62SAndrew Jeffery 
190148761c62SAndrew Jeffery     auto l1 = pldm_entity_association_tree_add(tree, &entities[1], 63, node,
190248761c62SAndrew Jeffery                                                PLDM_ENTITY_ASSOCIAION_PHYSICAL);
190348761c62SAndrew Jeffery     uint32_t first = 1;
1904e7f55113SAndrew Jeffery     EXPECT_EQ(pldm_pdr_add_fru_record_set(repo, 1, 1, entities[1].entity_type,
190548761c62SAndrew Jeffery                                           entities[1].entity_instance_num,
1906e7f55113SAndrew Jeffery                                           entities[1].entity_container_id,
1907e7f55113SAndrew Jeffery                                           &first),
190848761c62SAndrew Jeffery               0);
190948761c62SAndrew Jeffery     EXPECT_NE(l1, nullptr);
191048761c62SAndrew Jeffery     EXPECT_EQ(entities[1].entity_instance_num, 63);
191148761c62SAndrew Jeffery     EXPECT_EQ(first, pldm_pdr_get_record_handle(
191248761c62SAndrew Jeffery                          repo, pldm_pdr_fru_record_set_find_by_rsi(
191348761c62SAndrew Jeffery                                    repo, 1, &terminusHdl, &entityType,
191448761c62SAndrew Jeffery                                    &entityInstanceNum, &containerId)));
191548761c62SAndrew Jeffery     EXPECT_EQ(entityType, 2);
191648761c62SAndrew Jeffery     EXPECT_EQ(entityInstanceNum, 63);
191748761c62SAndrew Jeffery 
191848761c62SAndrew Jeffery     auto l2 = pldm_entity_association_tree_add(tree, &entities[2], 37, node,
191948761c62SAndrew Jeffery                                                PLDM_ENTITY_ASSOCIAION_PHYSICAL);
192048761c62SAndrew Jeffery     uint32_t second = 2;
1921e7f55113SAndrew Jeffery     EXPECT_EQ(pldm_pdr_add_fru_record_set(repo, 1, 2, entities[2].entity_type,
192248761c62SAndrew Jeffery                                           entities[2].entity_instance_num,
1923e7f55113SAndrew Jeffery                                           entities[2].entity_container_id,
1924e7f55113SAndrew Jeffery                                           &second),
192548761c62SAndrew Jeffery               0);
192648761c62SAndrew Jeffery     EXPECT_NE(l2, nullptr);
192748761c62SAndrew Jeffery     EXPECT_EQ(entities[2].entity_instance_num, 37);
192848761c62SAndrew Jeffery     EXPECT_EQ(second, pldm_pdr_get_record_handle(
192948761c62SAndrew Jeffery                           repo, pldm_pdr_fru_record_set_find_by_rsi(
193048761c62SAndrew Jeffery                                     repo, 2, &terminusHdl, &entityType,
193148761c62SAndrew Jeffery                                     &entityInstanceNum, &containerId)));
193248761c62SAndrew Jeffery     EXPECT_EQ(entityType, 2);
193348761c62SAndrew Jeffery     EXPECT_EQ(entityInstanceNum, 37);
193448761c62SAndrew Jeffery 
193548761c62SAndrew Jeffery     auto l3 = pldm_entity_association_tree_add(tree, &entities[3], 44, node,
193648761c62SAndrew Jeffery                                                PLDM_ENTITY_ASSOCIAION_PHYSICAL);
193748761c62SAndrew Jeffery     uint32_t third = 3;
1938e7f55113SAndrew Jeffery     EXPECT_EQ(pldm_pdr_add_fru_record_set(repo, 1, 3, entities[3].entity_type,
193948761c62SAndrew Jeffery                                           entities[3].entity_instance_num,
1940e7f55113SAndrew Jeffery                                           entities[3].entity_container_id,
1941e7f55113SAndrew Jeffery                                           &third),
194248761c62SAndrew Jeffery               0);
194348761c62SAndrew Jeffery     EXPECT_NE(l3, nullptr);
194448761c62SAndrew Jeffery     EXPECT_EQ(entities[3].entity_instance_num, 44);
194548761c62SAndrew Jeffery     EXPECT_EQ(third, pldm_pdr_get_record_handle(
194648761c62SAndrew Jeffery                          repo, pldm_pdr_fru_record_set_find_by_rsi(
194748761c62SAndrew Jeffery                                    repo, 3, &terminusHdl, &entityType,
194848761c62SAndrew Jeffery                                    &entityInstanceNum, &containerId)));
194948761c62SAndrew Jeffery     EXPECT_EQ(entityType, 2);
195048761c62SAndrew Jeffery     EXPECT_EQ(entityInstanceNum, 44);
195148761c62SAndrew Jeffery 
195248761c62SAndrew Jeffery     auto l4 = pldm_entity_association_tree_add(tree, &entities[4], 89, node,
195348761c62SAndrew Jeffery                                                PLDM_ENTITY_ASSOCIAION_PHYSICAL);
195448761c62SAndrew Jeffery     uint32_t fourth = 4;
1955e7f55113SAndrew Jeffery     EXPECT_EQ(pldm_pdr_add_fru_record_set(repo, 1, 4, entities[4].entity_type,
195648761c62SAndrew Jeffery                                           entities[4].entity_instance_num,
1957e7f55113SAndrew Jeffery                                           entities[4].entity_container_id,
1958e7f55113SAndrew Jeffery                                           &fourth),
195948761c62SAndrew Jeffery               0);
196048761c62SAndrew Jeffery     EXPECT_NE(l4, nullptr);
196148761c62SAndrew Jeffery     EXPECT_EQ(entities[4].entity_instance_num, 89);
196248761c62SAndrew Jeffery     EXPECT_EQ(fourth, pldm_pdr_get_record_handle(
196348761c62SAndrew Jeffery                           repo, pldm_pdr_fru_record_set_find_by_rsi(
196448761c62SAndrew Jeffery                                     repo, 4, &terminusHdl, &entityType,
196548761c62SAndrew Jeffery                                     &entityInstanceNum, &containerId)));
196648761c62SAndrew Jeffery     EXPECT_EQ(entityType, 2);
196748761c62SAndrew Jeffery     EXPECT_EQ(entityInstanceNum, 89);
196848761c62SAndrew Jeffery 
196948761c62SAndrew Jeffery     auto l5 = pldm_entity_association_tree_add(tree, &entities[5], 0xffff, node,
197048761c62SAndrew Jeffery                                                PLDM_ENTITY_ASSOCIAION_PHYSICAL);
197148761c62SAndrew Jeffery     uint32_t fifth = 5;
1972e7f55113SAndrew Jeffery     EXPECT_EQ(pldm_pdr_add_fru_record_set(repo, 1, 5, entities[5].entity_type,
197348761c62SAndrew Jeffery                                           entities[5].entity_instance_num,
1974e7f55113SAndrew Jeffery                                           entities[5].entity_container_id,
1975e7f55113SAndrew Jeffery                                           &fifth),
197648761c62SAndrew Jeffery               0);
197748761c62SAndrew Jeffery     EXPECT_NE(l5, nullptr);
197848761c62SAndrew Jeffery     EXPECT_EQ(entities[5].entity_instance_num, 90);
197948761c62SAndrew Jeffery     EXPECT_EQ(fifth, pldm_pdr_get_record_handle(
198048761c62SAndrew Jeffery                          repo, pldm_pdr_fru_record_set_find_by_rsi(
198148761c62SAndrew Jeffery                                    repo, 5, &terminusHdl, &entityType,
198248761c62SAndrew Jeffery                                    &entityInstanceNum, &containerId)));
198348761c62SAndrew Jeffery     EXPECT_EQ(entityType, 2);
198448761c62SAndrew Jeffery     EXPECT_EQ(entityInstanceNum, 90);
198548761c62SAndrew Jeffery 
198648761c62SAndrew Jeffery     auto l6 = pldm_entity_association_tree_add(tree, &entities[6], 90, node,
198748761c62SAndrew Jeffery                                                PLDM_ENTITY_ASSOCIAION_PHYSICAL);
198848761c62SAndrew Jeffery     EXPECT_EQ(l6, nullptr);
198948761c62SAndrew Jeffery 
199048761c62SAndrew Jeffery     auto l7 = pldm_entity_association_tree_add(tree, &entities[7], 100, l1,
199148761c62SAndrew Jeffery                                                PLDM_ENTITY_ASSOCIAION_PHYSICAL);
199248761c62SAndrew Jeffery     uint32_t seventh = 7;
1993e7f55113SAndrew Jeffery     EXPECT_EQ(pldm_pdr_add_fru_record_set(repo, 1, 7, entities[7].entity_type,
199448761c62SAndrew Jeffery                                           entities[7].entity_instance_num,
1995e7f55113SAndrew Jeffery                                           entities[7].entity_container_id,
1996e7f55113SAndrew Jeffery                                           &seventh),
199748761c62SAndrew Jeffery               0);
199848761c62SAndrew Jeffery     EXPECT_NE(l7, nullptr);
199948761c62SAndrew Jeffery     EXPECT_EQ(entities[7].entity_instance_num, 100);
200048761c62SAndrew Jeffery     EXPECT_EQ(seventh, pldm_pdr_get_record_handle(
200148761c62SAndrew Jeffery                            repo, pldm_pdr_fru_record_set_find_by_rsi(
200248761c62SAndrew Jeffery                                      repo, 7, &terminusHdl, &entityType,
200348761c62SAndrew Jeffery                                      &entityInstanceNum, &containerId)));
200448761c62SAndrew Jeffery     EXPECT_EQ(entityType, 3);
200548761c62SAndrew Jeffery     EXPECT_EQ(entityInstanceNum, 100);
200648761c62SAndrew Jeffery 
200748761c62SAndrew Jeffery     auto l8 = pldm_entity_association_tree_add(tree, &entities[8], 100, l2,
200848761c62SAndrew Jeffery                                                PLDM_ENTITY_ASSOCIAION_PHYSICAL);
200948761c62SAndrew Jeffery     uint32_t eighth = 8;
2010e7f55113SAndrew Jeffery     EXPECT_EQ(pldm_pdr_add_fru_record_set(repo, 1, 8, entities[8].entity_type,
201148761c62SAndrew Jeffery                                           entities[8].entity_instance_num,
2012e7f55113SAndrew Jeffery                                           entities[8].entity_container_id,
2013e7f55113SAndrew Jeffery                                           &eighth),
201448761c62SAndrew Jeffery               0);
201548761c62SAndrew Jeffery     EXPECT_NE(l8, nullptr);
201648761c62SAndrew Jeffery     EXPECT_EQ(entities[8].entity_instance_num, 100);
201748761c62SAndrew Jeffery     EXPECT_EQ(eighth, pldm_pdr_get_record_handle(
201848761c62SAndrew Jeffery                           repo, pldm_pdr_fru_record_set_find_by_rsi(
201948761c62SAndrew Jeffery                                     repo, 8, &terminusHdl, &entityType,
202048761c62SAndrew Jeffery                                     &entityInstanceNum, &containerId)));
202148761c62SAndrew Jeffery     EXPECT_EQ(entityType, 3);
202248761c62SAndrew Jeffery     EXPECT_EQ(entityInstanceNum, 100);
202348761c62SAndrew Jeffery 
202448761c62SAndrew Jeffery     pldm_pdr_destroy(repo);
202548761c62SAndrew Jeffery     pldm_entity_association_tree_destroy(tree);
202648761c62SAndrew Jeffery }
202748761c62SAndrew Jeffery 
202848761c62SAndrew Jeffery #ifdef LIBPLDM_API_TESTING
TEST(EntityAssociationPDR,testFindChildContainerID)202948761c62SAndrew Jeffery TEST(EntityAssociationPDR, testFindChildContainerID)
203048761c62SAndrew Jeffery {
203148761c62SAndrew Jeffery     pldm_entity entities[3]{};
203248761c62SAndrew Jeffery     entities[0].entity_type = 1;
203348761c62SAndrew Jeffery     entities[1].entity_type = 2;
203448761c62SAndrew Jeffery     entities[2].entity_type = 3;
203548761c62SAndrew Jeffery     entities[1].entity_container_id = 2;
203648761c62SAndrew Jeffery     entities[1].entity_instance_num = 1;
203748761c62SAndrew Jeffery 
203848761c62SAndrew Jeffery     auto tree = pldm_entity_association_tree_init();
203948761c62SAndrew Jeffery     auto l1 = pldm_entity_association_tree_add_entity(
204048761c62SAndrew Jeffery         tree, &entities[0], 0xffff, nullptr, PLDM_ENTITY_ASSOCIAION_LOGICAL,
204148761c62SAndrew Jeffery         false, true, 0xffff);
204248761c62SAndrew Jeffery 
204348761c62SAndrew Jeffery     EXPECT_NE(l1, nullptr);
204448761c62SAndrew Jeffery     auto l2 = pldm_entity_association_tree_add_entity(
204548761c62SAndrew Jeffery         tree, &entities[1], 0xffff, l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL, false,
204648761c62SAndrew Jeffery         false, 0xffff);
204748761c62SAndrew Jeffery     EXPECT_NE(l2, nullptr);
204848761c62SAndrew Jeffery     auto l3 = pldm_entity_association_tree_add_entity(
204948761c62SAndrew Jeffery         tree, &entities[2], 0xffff, l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL, false,
205048761c62SAndrew Jeffery         true, 0xffff);
205148761c62SAndrew Jeffery     EXPECT_NE(l3, nullptr);
205248761c62SAndrew Jeffery 
205348761c62SAndrew Jeffery     EXPECT_EQ(pldm_entity_get_num_children(l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL),
205448761c62SAndrew Jeffery               2);
205548761c62SAndrew Jeffery 
205648761c62SAndrew Jeffery     auto repo = pldm_pdr_init();
2057d72ea4b8SAndrew Jeffery     int rc = pldm_entity_association_pdr_add(tree, repo, false, 1);
205848761c62SAndrew Jeffery     ASSERT_EQ(rc, 0);
205948761c62SAndrew Jeffery 
206048761c62SAndrew Jeffery     EXPECT_EQ(pldm_pdr_get_record_count(repo), 1u);
206148761c62SAndrew Jeffery 
206248761c62SAndrew Jeffery     uint16_t container_id{};
206348761c62SAndrew Jeffery     pldm_pdr_find_child_container_id_index_range_exclude(
206448761c62SAndrew Jeffery         repo, 1, 1, 0, 0x01000000, 0x01ffffff, &container_id);
206548761c62SAndrew Jeffery     EXPECT_EQ(container_id, 2);
206648761c62SAndrew Jeffery 
206748761c62SAndrew Jeffery     uint16_t container_id1{};
206848761c62SAndrew Jeffery     pldm_pdr_find_child_container_id_index_range_exclude(
206948761c62SAndrew Jeffery         repo, 1, 1, 0, 0x00000001, 0x00ffffff, &container_id1);
207048761c62SAndrew Jeffery     EXPECT_EQ(container_id1, 0);
207148761c62SAndrew Jeffery 
207248761c62SAndrew Jeffery     pldm_pdr_destroy(repo);
207348761c62SAndrew Jeffery     pldm_entity_association_tree_destroy(tree);
207448761c62SAndrew Jeffery }
207548761c62SAndrew Jeffery #endif
207648761c62SAndrew Jeffery 
TEST(EntityAssociationPDR,testNodeAddCheck)207748761c62SAndrew Jeffery TEST(EntityAssociationPDR, testNodeAddCheck)
207848761c62SAndrew Jeffery {
207948761c62SAndrew Jeffery     // pldm_entity entities[4]{};
208048761c62SAndrew Jeffery     pldm_entity* entities = (pldm_entity*)malloc(sizeof(pldm_entity) * 4);
208148761c62SAndrew Jeffery     entities[0].entity_type = 1;
208248761c62SAndrew Jeffery     entities[1].entity_type = 2;
208348761c62SAndrew Jeffery     entities[2].entity_type = 2;
208448761c62SAndrew Jeffery     entities[3].entity_type = 3;
208548761c62SAndrew Jeffery 
208648761c62SAndrew Jeffery     auto tree = pldm_entity_association_tree_init();
208748761c62SAndrew Jeffery 
208848761c62SAndrew Jeffery     auto l1 = pldm_entity_association_tree_add(
208948761c62SAndrew Jeffery         tree, &entities[0], 0xffff, nullptr, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
209048761c62SAndrew Jeffery     EXPECT_NE(l1, nullptr);
209148761c62SAndrew Jeffery     auto l2a = pldm_entity_association_tree_add(
209248761c62SAndrew Jeffery         tree, &entities[1], 0xffff, l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
209348761c62SAndrew Jeffery     EXPECT_NE(l2a, nullptr);
209448761c62SAndrew Jeffery     auto l2b = pldm_entity_association_tree_add(
209548761c62SAndrew Jeffery         tree, &entities[2], 0xffff, l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
209648761c62SAndrew Jeffery     EXPECT_NE(l2b, nullptr);
209748761c62SAndrew Jeffery     auto l2c = pldm_entity_association_tree_add(
209848761c62SAndrew Jeffery         tree, &entities[3], 0xffff, l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
209948761c62SAndrew Jeffery     EXPECT_NE(l2c, nullptr);
210048761c62SAndrew Jeffery 
210148761c62SAndrew Jeffery     auto repo = pldm_pdr_init();
210248761c62SAndrew Jeffery 
210348761c62SAndrew Jeffery     EXPECT_EQ(pldm_entity_association_pdr_add_from_node_with_record_handle(
210448761c62SAndrew Jeffery                   l1, repo, &entities, 4, false, 1, 0),
210548761c62SAndrew Jeffery               0);
210648761c62SAndrew Jeffery     EXPECT_EQ(pldm_entity_association_pdr_add_from_node_with_record_handle(
210748761c62SAndrew Jeffery                   l1, repo, &entities, 4, false, 1, 2),
210848761c62SAndrew Jeffery               0);
210948761c62SAndrew Jeffery     EXPECT_EQ(pldm_entity_association_pdr_add_from_node_with_record_handle(
211048761c62SAndrew Jeffery                   l1, repo, &entities, 4, false, 1, 23),
211148761c62SAndrew Jeffery               0);
211248761c62SAndrew Jeffery     EXPECT_EQ(pldm_entity_association_pdr_add_from_node_with_record_handle(
211348761c62SAndrew Jeffery                   l1, repo, &entities, 4, false, 1, 34),
211448761c62SAndrew Jeffery               0);
211548761c62SAndrew Jeffery 
211648761c62SAndrew Jeffery     EXPECT_EQ(pldm_pdr_get_record_count(repo), 4u);
211748761c62SAndrew Jeffery 
211848761c62SAndrew Jeffery     uint8_t* outData = nullptr;
211948761c62SAndrew Jeffery     uint32_t size{};
212048761c62SAndrew Jeffery     uint32_t nextRecHdl{};
212148761c62SAndrew Jeffery     auto hdl = pldm_pdr_find_record(repo, 0, &outData, &size, &nextRecHdl);
212248761c62SAndrew Jeffery     EXPECT_NE(hdl, nullptr);
212348761c62SAndrew Jeffery 
212448761c62SAndrew Jeffery     outData = nullptr;
212548761c62SAndrew Jeffery     auto hdl1 = pldm_pdr_find_record(repo, 2, &outData, &size, &nextRecHdl);
212648761c62SAndrew Jeffery     EXPECT_NE(hdl1, nullptr);
2127d0ba43afSAndrew Jeffery     // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
212848761c62SAndrew Jeffery     pldm_pdr_hdr* hdr = reinterpret_cast<pldm_pdr_hdr*>(outData);
212948761c62SAndrew Jeffery     EXPECT_EQ(hdr->record_handle, 2);
213048761c62SAndrew Jeffery 
213148761c62SAndrew Jeffery     outData = nullptr;
213248761c62SAndrew Jeffery     auto hdl2 = pldm_pdr_find_record(repo, 23, &outData, &size, &nextRecHdl);
213348761c62SAndrew Jeffery     EXPECT_NE(hdl2, nullptr);
2134d0ba43afSAndrew Jeffery     // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
213548761c62SAndrew Jeffery     pldm_pdr_hdr* hdr1 = reinterpret_cast<pldm_pdr_hdr*>(outData);
213648761c62SAndrew Jeffery     EXPECT_EQ(hdr1->record_handle, 23);
213748761c62SAndrew Jeffery 
213848761c62SAndrew Jeffery     outData = nullptr;
213948761c62SAndrew Jeffery     auto hdl3 = pldm_pdr_find_record(repo, 3, &outData, &size, &nextRecHdl);
214048761c62SAndrew Jeffery     EXPECT_EQ(hdl3, nullptr);
214148761c62SAndrew Jeffery 
214248761c62SAndrew Jeffery     free(entities);
214348761c62SAndrew Jeffery     pldm_pdr_destroy(repo);
214448761c62SAndrew Jeffery     pldm_entity_association_tree_destroy(tree);
214548761c62SAndrew Jeffery }
214648761c62SAndrew Jeffery 
214748761c62SAndrew Jeffery #ifdef LIBPLDM_API_TESTING
TEST(EntityAssociationPDR,testAddContainedEntityRemotePDR)214848761c62SAndrew Jeffery TEST(EntityAssociationPDR, testAddContainedEntityRemotePDR)
214948761c62SAndrew Jeffery {
215048761c62SAndrew Jeffery     // pldm_entity entities[5]{};
215148761c62SAndrew Jeffery     pldm_entity* entities = (pldm_entity*)malloc(sizeof(pldm_entity) * 5);
215248761c62SAndrew Jeffery     entities[0].entity_type = 1;
215348761c62SAndrew Jeffery     entities[1].entity_type = 2;
215448761c62SAndrew Jeffery     entities[2].entity_type = 3;
215548761c62SAndrew Jeffery     entities[3].entity_type = 4;
215648761c62SAndrew Jeffery     entities[4].entity_type = 5;
215748761c62SAndrew Jeffery 
215848761c62SAndrew Jeffery     auto tree = pldm_entity_association_tree_init();
215948761c62SAndrew Jeffery     auto l1 = pldm_entity_association_tree_add(
216048761c62SAndrew Jeffery         tree, &entities[0], 0xffff, nullptr, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
216148761c62SAndrew Jeffery     EXPECT_NE(l1, nullptr);
216248761c62SAndrew Jeffery     auto l2a = pldm_entity_association_tree_add(
216348761c62SAndrew Jeffery         tree, &entities[1], 0xffff, l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
216448761c62SAndrew Jeffery     EXPECT_NE(l2a, nullptr);
216548761c62SAndrew Jeffery     auto l2b = pldm_entity_association_tree_add(
216648761c62SAndrew Jeffery         tree, &entities[2], 0xffff, l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
216748761c62SAndrew Jeffery     EXPECT_NE(l2b, nullptr);
216848761c62SAndrew Jeffery     auto l2c = pldm_entity_association_tree_add(
216948761c62SAndrew Jeffery         tree, &entities[3], 0xffff, l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
217048761c62SAndrew Jeffery     EXPECT_NE(l2c, nullptr);
217148761c62SAndrew Jeffery     auto l3a = pldm_entity_association_tree_add(
217248761c62SAndrew Jeffery         tree, &entities[4], 0xffff, l2a, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
217348761c62SAndrew Jeffery     EXPECT_NE(l3a, nullptr);
217448761c62SAndrew Jeffery 
217548761c62SAndrew Jeffery     auto repo = pldm_pdr_init();
217648761c62SAndrew Jeffery 
217748761c62SAndrew Jeffery     EXPECT_EQ(pldm_entity_association_pdr_add_from_node_with_record_handle(
217848761c62SAndrew Jeffery                   l1, repo, &entities, 5, false, 1, 0),
217948761c62SAndrew Jeffery               0);
218048761c62SAndrew Jeffery     EXPECT_EQ(pldm_entity_association_pdr_add_from_node_with_record_handle(
218148761c62SAndrew Jeffery                   l1, repo, &entities, 5, false, 1, 2),
218248761c62SAndrew Jeffery               0);
218348761c62SAndrew Jeffery     EXPECT_EQ(pldm_entity_association_pdr_add_from_node_with_record_handle(
218448761c62SAndrew Jeffery                   l1, repo, &entities, 5, false, 1, 23),
218548761c62SAndrew Jeffery               0);
218648761c62SAndrew Jeffery     EXPECT_EQ(pldm_entity_association_pdr_add_from_node_with_record_handle(
218748761c62SAndrew Jeffery                   l1, repo, &entities, 5, false, 1, 34),
218848761c62SAndrew Jeffery               0);
218948761c62SAndrew Jeffery     EXPECT_EQ(pldm_entity_association_pdr_add_from_node_with_record_handle(
219048761c62SAndrew Jeffery                   l2a, repo, &entities, 5, false, 1, 3),
219148761c62SAndrew Jeffery               0);
219248761c62SAndrew Jeffery 
219348761c62SAndrew Jeffery     pldm_entity entity1[1];
219448761c62SAndrew Jeffery     entity1[0].entity_type = 2;
219548761c62SAndrew Jeffery 
219648761c62SAndrew Jeffery     EXPECT_EQ(pldm_entity_association_pdr_add_contained_entity_to_remote_pdr(
219748761c62SAndrew Jeffery                   repo, &entity1[0], 2),
219848761c62SAndrew Jeffery               0);
219948761c62SAndrew Jeffery 
220048761c62SAndrew Jeffery     free(entities);
220148761c62SAndrew Jeffery     pldm_pdr_destroy(repo);
220248761c62SAndrew Jeffery     pldm_entity_association_tree_destroy(tree);
220348761c62SAndrew Jeffery }
220448761c62SAndrew Jeffery #endif
220548761c62SAndrew Jeffery 
220648761c62SAndrew Jeffery #ifdef LIBPLDM_API_TESTING
TEST(EntityAssociationPDR,testAddContainedEntityNew)220748761c62SAndrew Jeffery TEST(EntityAssociationPDR, testAddContainedEntityNew)
220848761c62SAndrew Jeffery {
220948761c62SAndrew Jeffery     // pldm_entity entities[5]{};
221048761c62SAndrew Jeffery     pldm_entity* entities = (pldm_entity*)malloc(sizeof(pldm_entity) * 5);
221148761c62SAndrew Jeffery     entities[0].entity_type = 1;
221248761c62SAndrew Jeffery     entities[1].entity_type = 2;
221348761c62SAndrew Jeffery     entities[2].entity_type = 3;
221448761c62SAndrew Jeffery     entities[3].entity_type = 4;
221548761c62SAndrew Jeffery     entities[4].entity_type = 5;
221648761c62SAndrew Jeffery 
221748761c62SAndrew Jeffery     auto tree = pldm_entity_association_tree_init();
221848761c62SAndrew Jeffery     auto l1 = pldm_entity_association_tree_add(
221948761c62SAndrew Jeffery         tree, &entities[0], 0xffff, nullptr, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
222048761c62SAndrew Jeffery     EXPECT_NE(l1, nullptr);
222148761c62SAndrew Jeffery     auto l2a = pldm_entity_association_tree_add(
222248761c62SAndrew Jeffery         tree, &entities[1], 0xffff, l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
222348761c62SAndrew Jeffery     EXPECT_NE(l2a, nullptr);
222448761c62SAndrew Jeffery     auto l2b = pldm_entity_association_tree_add(
222548761c62SAndrew Jeffery         tree, &entities[2], 0xffff, l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
222648761c62SAndrew Jeffery     EXPECT_NE(l2b, nullptr);
222748761c62SAndrew Jeffery     auto l2c = pldm_entity_association_tree_add(
222848761c62SAndrew Jeffery         tree, &entities[3], 0xffff, l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
222948761c62SAndrew Jeffery     EXPECT_NE(l2c, nullptr);
223048761c62SAndrew Jeffery     auto l3a = pldm_entity_association_tree_add(
223148761c62SAndrew Jeffery         tree, &entities[4], 0xffff, l2a, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
223248761c62SAndrew Jeffery     EXPECT_NE(l3a, nullptr);
223348761c62SAndrew Jeffery 
223448761c62SAndrew Jeffery     auto repo = pldm_pdr_init();
223548761c62SAndrew Jeffery 
223648761c62SAndrew Jeffery     EXPECT_EQ(pldm_entity_association_pdr_add_from_node_with_record_handle(
223748761c62SAndrew Jeffery                   l1, repo, &entities, 5, false, 1, 0),
223848761c62SAndrew Jeffery               0);
223948761c62SAndrew Jeffery     EXPECT_EQ(pldm_entity_association_pdr_add_from_node_with_record_handle(
224048761c62SAndrew Jeffery                   l1, repo, &entities, 5, false, 1, 2),
224148761c62SAndrew Jeffery               0);
224248761c62SAndrew Jeffery     EXPECT_EQ(pldm_entity_association_pdr_add_from_node_with_record_handle(
224348761c62SAndrew Jeffery                   l1, repo, &entities, 5, false, 1, 23),
224448761c62SAndrew Jeffery               0);
224548761c62SAndrew Jeffery     EXPECT_EQ(pldm_entity_association_pdr_add_from_node_with_record_handle(
224648761c62SAndrew Jeffery                   l1, repo, &entities, 5, false, 1, 34),
224748761c62SAndrew Jeffery               0);
224848761c62SAndrew Jeffery     EXPECT_EQ(pldm_entity_association_pdr_add_from_node_with_record_handle(
224948761c62SAndrew Jeffery                   l2a, repo, &entities, 5, false, 1, 3),
225048761c62SAndrew Jeffery               0);
225148761c62SAndrew Jeffery 
225248761c62SAndrew Jeffery     uint32_t updated_record_handle = 0;
225348761c62SAndrew Jeffery 
225448761c62SAndrew Jeffery     pldm_entity entity2[1]{};
225548761c62SAndrew Jeffery     entity2[0].entity_type = 4;
225648761c62SAndrew Jeffery 
225748761c62SAndrew Jeffery     pldm_entity entity3[1]{};
225848761c62SAndrew Jeffery     entity3[0].entity_type = 4;
225948761c62SAndrew Jeffery 
226048761c62SAndrew Jeffery     EXPECT_EQ(pldm_entity_association_pdr_create_new(
226148761c62SAndrew Jeffery                   repo, 34, &entity2[0], &entity3[0], &updated_record_handle),
226248761c62SAndrew Jeffery               0);
226348761c62SAndrew Jeffery 
226448761c62SAndrew Jeffery     EXPECT_EQ(updated_record_handle, 35);
226548761c62SAndrew Jeffery 
226648761c62SAndrew Jeffery     free(entities);
226748761c62SAndrew Jeffery     pldm_pdr_destroy(repo);
226848761c62SAndrew Jeffery     pldm_entity_association_tree_destroy(tree);
226948761c62SAndrew Jeffery }
227048761c62SAndrew Jeffery #endif
2271b31e4c6cSVarsha Kaverappa 
2272b31e4c6cSVarsha Kaverappa #ifdef LIBPLDM_API_TESTING
TEST(EntityAssociationPDR,testRemoveContainedEntity)2273b31e4c6cSVarsha Kaverappa TEST(EntityAssociationPDR, testRemoveContainedEntity)
2274b31e4c6cSVarsha Kaverappa {
2275b31e4c6cSVarsha Kaverappa     struct pldm_entity entities[4] = {
2276b31e4c6cSVarsha Kaverappa         {.entity_type = 1, .entity_instance_num = 1, .entity_container_id = 2},
2277b31e4c6cSVarsha Kaverappa         {.entity_type = 2, .entity_instance_num = 1, .entity_container_id = 2},
2278b31e4c6cSVarsha Kaverappa         {.entity_type = 3, .entity_instance_num = 3, .entity_container_id = 3},
2279b31e4c6cSVarsha Kaverappa         {.entity_type = 4, .entity_instance_num = 1, .entity_container_id = 2}};
2280b31e4c6cSVarsha Kaverappa     struct pldm_entity* base = entities;
2281b31e4c6cSVarsha Kaverappa 
2282b31e4c6cSVarsha Kaverappa     auto tree = pldm_entity_association_tree_init();
2283b31e4c6cSVarsha Kaverappa     auto l1 = pldm_entity_association_tree_add_entity(
2284b31e4c6cSVarsha Kaverappa         tree, &entities[0], 0xffff, nullptr, PLDM_ENTITY_ASSOCIAION_LOGICAL,
2285b31e4c6cSVarsha Kaverappa         false, true, 0xffff);
2286b31e4c6cSVarsha Kaverappa 
2287b31e4c6cSVarsha Kaverappa     EXPECT_NE(l1, nullptr);
2288b31e4c6cSVarsha Kaverappa     auto l2 = pldm_entity_association_tree_add_entity(
2289b31e4c6cSVarsha Kaverappa         tree, &entities[1], 0xffff, l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL, false,
2290b31e4c6cSVarsha Kaverappa         false, 0xffff);
2291b31e4c6cSVarsha Kaverappa     EXPECT_NE(l2, nullptr);
2292b31e4c6cSVarsha Kaverappa     auto l3 = pldm_entity_association_tree_add_entity(
2293b31e4c6cSVarsha Kaverappa         tree, &entities[2], 0xffff, l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL, false,
2294b31e4c6cSVarsha Kaverappa         true, 0xffff);
2295b31e4c6cSVarsha Kaverappa     EXPECT_NE(l3, nullptr);
2296b31e4c6cSVarsha Kaverappa     auto l4 = pldm_entity_association_tree_add_entity(
2297b31e4c6cSVarsha Kaverappa         tree, &entities[3], 0xffff, l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL, false,
2298b31e4c6cSVarsha Kaverappa         true, 0xffff);
2299b31e4c6cSVarsha Kaverappa     EXPECT_NE(l4, nullptr);
2300b31e4c6cSVarsha Kaverappa 
2301b31e4c6cSVarsha Kaverappa     EXPECT_EQ(pldm_entity_get_num_children(l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL),
2302b31e4c6cSVarsha Kaverappa               3);
2303b31e4c6cSVarsha Kaverappa 
2304b31e4c6cSVarsha Kaverappa     auto repo = pldm_pdr_init();
2305b31e4c6cSVarsha Kaverappa 
2306b31e4c6cSVarsha Kaverappa     EXPECT_EQ(pldm_entity_association_pdr_add_from_node_with_record_handle(
2307b31e4c6cSVarsha Kaverappa                   l1, repo, &base, 4, false, 1, 3),
2308b31e4c6cSVarsha Kaverappa               0);
2309b31e4c6cSVarsha Kaverappa 
2310b31e4c6cSVarsha Kaverappa     EXPECT_EQ(pldm_pdr_get_record_count(repo), 1u);
2311b31e4c6cSVarsha Kaverappa 
231294e2d754SArchana Kakani     // Remove first contained entity from the entity association PDR
2313b31e4c6cSVarsha Kaverappa     uint32_t removed_record_handle{};
2314b31e4c6cSVarsha Kaverappa     struct pldm_entity entity[1] = {
231594e2d754SArchana Kakani         {.entity_type = 4, .entity_instance_num = 1, .entity_container_id = 2}};
2316b31e4c6cSVarsha Kaverappa 
2317b31e4c6cSVarsha Kaverappa     EXPECT_EQ(pldm_entity_association_pdr_remove_contained_entity(
2318b31e4c6cSVarsha Kaverappa                   repo, entity, false, &removed_record_handle),
2319b31e4c6cSVarsha Kaverappa               0);
2320b31e4c6cSVarsha Kaverappa     EXPECT_EQ(removed_record_handle, 3);
2321b31e4c6cSVarsha Kaverappa 
232294e2d754SArchana Kakani     // Remove second contained entity from the entity association PDR
232394e2d754SArchana Kakani     removed_record_handle = 0;
232494e2d754SArchana Kakani     EXPECT_EQ(pldm_entity_association_pdr_remove_contained_entity(
232594e2d754SArchana Kakani                   repo, &entities[1], false, &removed_record_handle),
232694e2d754SArchana Kakani               0);
232794e2d754SArchana Kakani     EXPECT_EQ(removed_record_handle, 3);
232894e2d754SArchana Kakani 
232994e2d754SArchana Kakani     // Remove third contained entity from the entity association PDR
233094e2d754SArchana Kakani     removed_record_handle = 0;
233194e2d754SArchana Kakani     EXPECT_EQ(pldm_entity_association_pdr_remove_contained_entity(
233294e2d754SArchana Kakani                   repo, &entities[2], false, &removed_record_handle),
233394e2d754SArchana Kakani               0);
233494e2d754SArchana Kakani     EXPECT_EQ(removed_record_handle, 3);
233594e2d754SArchana Kakani 
233694e2d754SArchana Kakani     // As all the contained entities are removed the entity association PDR
233794e2d754SArchana Kakani     // also gets deleted
233894e2d754SArchana Kakani     EXPECT_EQ(pldm_pdr_get_record_count(repo), 0u);
233994e2d754SArchana Kakani 
2340b31e4c6cSVarsha Kaverappa     pldm_pdr_destroy(repo);
2341b31e4c6cSVarsha Kaverappa     pldm_entity_association_tree_destroy(tree);
2342b31e4c6cSVarsha Kaverappa }
2343b31e4c6cSVarsha Kaverappa #endif
23448b53ad9dSVarsha Kaverappa 
23458b53ad9dSVarsha Kaverappa #ifdef LIBPLDM_API_TESTING
TEST(PDRUpdate,testRemoveFruRecord)23468b53ad9dSVarsha Kaverappa TEST(PDRUpdate, testRemoveFruRecord)
23478b53ad9dSVarsha Kaverappa {
23488b53ad9dSVarsha Kaverappa     auto repo = pldm_pdr_init();
23498b53ad9dSVarsha Kaverappa 
23508b53ad9dSVarsha Kaverappa     uint32_t record_handle = 1;
23518b53ad9dSVarsha Kaverappa     int rc = pldm_pdr_add_fru_record_set(repo, 1, 1, 1, 0, 100, &record_handle);
23528b53ad9dSVarsha Kaverappa     EXPECT_EQ(rc, 0);
23538b53ad9dSVarsha Kaverappa     record_handle = 2;
23548b53ad9dSVarsha Kaverappa     rc = pldm_pdr_add_fru_record_set(repo, 1, 2, 1, 1, 100, &record_handle);
23558b53ad9dSVarsha Kaverappa     EXPECT_EQ(rc, 0);
23568b53ad9dSVarsha Kaverappa     record_handle = 3;
23578b53ad9dSVarsha Kaverappa     rc = pldm_pdr_add_fru_record_set(repo, 1, 3, 1, 2, 100, &record_handle);
23588b53ad9dSVarsha Kaverappa     EXPECT_EQ(rc, 0);
23598b53ad9dSVarsha Kaverappa     EXPECT_EQ(pldm_pdr_get_record_count(repo), 3);
23608b53ad9dSVarsha Kaverappa 
23618b53ad9dSVarsha Kaverappa     uint32_t removed_record_handle{};
23628b53ad9dSVarsha Kaverappa     rc = pldm_pdr_remove_fru_record_set_by_rsi(repo, 2, false,
23638b53ad9dSVarsha Kaverappa                                                &removed_record_handle);
23648b53ad9dSVarsha Kaverappa     EXPECT_EQ(rc, 0);
23658b53ad9dSVarsha Kaverappa     EXPECT_EQ(removed_record_handle, 2);
23668b53ad9dSVarsha Kaverappa     EXPECT_EQ(pldm_pdr_get_record_count(repo), 2);
23678b53ad9dSVarsha Kaverappa 
23688b53ad9dSVarsha Kaverappa     uint16_t terminusHdl{};
23698b53ad9dSVarsha Kaverappa     uint16_t entityType{};
23708b53ad9dSVarsha Kaverappa     uint16_t entityInstanceNum{};
23718b53ad9dSVarsha Kaverappa     uint16_t containerId{};
23728b53ad9dSVarsha Kaverappa     auto record = pldm_pdr_fru_record_set_find_by_rsi(
23738b53ad9dSVarsha Kaverappa         repo, 1, &terminusHdl, &entityType, &entityInstanceNum, &containerId);
23748b53ad9dSVarsha Kaverappa     EXPECT_NE(record, nullptr);
23758b53ad9dSVarsha Kaverappa     record_handle = pldm_pdr_get_record_handle(repo, record);
23768b53ad9dSVarsha Kaverappa     EXPECT_EQ(record_handle, 1);
23778b53ad9dSVarsha Kaverappa 
23788b53ad9dSVarsha Kaverappa     record = pldm_pdr_fru_record_set_find_by_rsi(
23798b53ad9dSVarsha Kaverappa         repo, 3, &terminusHdl, &entityType, &entityInstanceNum, &containerId);
23808b53ad9dSVarsha Kaverappa     EXPECT_NE(record, nullptr);
23818b53ad9dSVarsha Kaverappa     record_handle = pldm_pdr_get_record_handle(repo, record);
23828b53ad9dSVarsha Kaverappa     EXPECT_EQ(record_handle, 3);
23838b53ad9dSVarsha Kaverappa 
23848b53ad9dSVarsha Kaverappa     record = pldm_pdr_fru_record_set_find_by_rsi(
23858b53ad9dSVarsha Kaverappa         repo, 2, &terminusHdl, &entityType, &entityInstanceNum, &containerId);
23868b53ad9dSVarsha Kaverappa     EXPECT_EQ(record, nullptr);
23878b53ad9dSVarsha Kaverappa 
23888b53ad9dSVarsha Kaverappa     rc = pldm_pdr_remove_fru_record_set_by_rsi(repo, 1, false,
23898b53ad9dSVarsha Kaverappa                                                &removed_record_handle);
23908b53ad9dSVarsha Kaverappa     EXPECT_EQ(rc, 0);
23918b53ad9dSVarsha Kaverappa     EXPECT_EQ(removed_record_handle, 1);
23928b53ad9dSVarsha Kaverappa 
23938b53ad9dSVarsha Kaverappa     // remove the same record again
23948b53ad9dSVarsha Kaverappa     removed_record_handle = 5;
23958b53ad9dSVarsha Kaverappa     rc = pldm_pdr_remove_fru_record_set_by_rsi(repo, 1, false,
23968b53ad9dSVarsha Kaverappa                                                &removed_record_handle);
23978b53ad9dSVarsha Kaverappa     EXPECT_EQ(rc, 0);
23988b53ad9dSVarsha Kaverappa     EXPECT_NE(removed_record_handle, 1);
23998b53ad9dSVarsha Kaverappa     EXPECT_EQ(removed_record_handle, 5);
24008b53ad9dSVarsha Kaverappa 
24018b53ad9dSVarsha Kaverappa     rc = pldm_pdr_remove_fru_record_set_by_rsi(repo, 3, false,
24028b53ad9dSVarsha Kaverappa                                                &removed_record_handle);
24038b53ad9dSVarsha Kaverappa     EXPECT_EQ(rc, 0);
24048b53ad9dSVarsha Kaverappa     EXPECT_EQ(removed_record_handle, 3);
24058b53ad9dSVarsha Kaverappa 
24068b53ad9dSVarsha Kaverappa     EXPECT_EQ(pldm_pdr_get_record_count(repo), 0);
24078b53ad9dSVarsha Kaverappa 
24088b53ad9dSVarsha Kaverappa     pldm_pdr_destroy(repo);
24098b53ad9dSVarsha Kaverappa }
24108b53ad9dSVarsha Kaverappa #endif
2411