blob: 0d19de263b7e85fa9a6bf35195641dc3f3398aa9 [file] [log] [blame]
Manojkiran Eda9a8e4972022-11-28 16:38:21 +05301#include <endian.h>
Andrew Jefferyefb40062023-11-10 13:48:39 +10302#include <libpldm/pdr.h>
3#include <libpldm/platform.h>
Archana Kakani94e2d752024-12-12 08:22:55 -06004#include <msgbuf.h>
Manojkiran Eda9a8e4972022-11-28 16:38:21 +05305
Andrew Jeffery9c766792022-08-10 23:12:49 +09306#include <array>
Manojkiran Eda9a8e4972022-11-28 16:38:21 +05307#include <cstdint>
Andrew Jeffery5a706072023-04-05 19:45:31 +09308#include <cstdlib>
9#include <cstring>
Manojkiran Eda9a8e4972022-11-28 16:38:21 +053010#include <vector>
Andrew Jeffery9c766792022-08-10 23:12:49 +093011
Andrew Jeffery9c766792022-08-10 23:12:49 +093012#include <gtest/gtest.h>
13
Archana Kakanibc40dd52024-08-02 00:10:44 -050014typedef struct pldm_association_pdr_test
15{
16 uint32_t record_handle;
17 uint8_t version;
18 uint8_t type;
19 uint16_t record_change_num;
20 uint16_t length;
21 uint16_t container_id;
22 uint8_t association_type;
23 uint8_t num_children;
24
25 inline bool operator==(pldm_association_pdr_test pdr) const
26 {
27 return (record_handle == pdr.record_handle) && (type == pdr.type) &&
28 (length == pdr.length) && (container_id == pdr.container_id) &&
29 (association_type == pdr.association_type) &&
30 (num_children == pdr.num_children);
31 }
32} pldm_association_pdr_test;
33
34typedef struct pldm_entity_test
35{
36 uint16_t entity_type;
37 uint16_t entity_instance_num;
38 uint16_t entity_container_id;
39
40 inline bool operator==(pldm_entity_test entity) const
41 {
42 return (entity_type == entity.entity_type) &&
43 (entity_instance_num == entity.entity_instance_num) &&
44 (entity_container_id == entity.entity_container_id);
45 }
46} pldm_entity_test;
47
48static void getEntity(struct pldm_msgbuf* buf, pldm_entity_test& entity)
49{
50 pldm_msgbuf_extract_uint16(buf, entity.entity_type);
51 pldm_msgbuf_extract_uint16(buf, entity.entity_instance_num);
52 pldm_msgbuf_extract_uint16(buf, entity.entity_container_id);
53}
54
55static void
56 getAssociationPdrDetails(struct pldm_msgbuf* buf,
57 pldm_association_pdr_test& association_pdr_test)
58{
59 pldm_msgbuf_extract_uint32(buf, association_pdr_test.record_handle);
60 pldm_msgbuf_extract_uint8(buf, association_pdr_test.version);
61 pldm_msgbuf_extract_uint8(buf, association_pdr_test.type);
62 pldm_msgbuf_extract_uint16(buf, association_pdr_test.record_change_num);
63 pldm_msgbuf_extract_uint16(buf, association_pdr_test.length);
64
65 pldm_msgbuf_extract_uint16(buf, association_pdr_test.container_id);
66 pldm_msgbuf_extract_uint8(buf, association_pdr_test.association_type);
67}
68
69static void
70 verifyEntityAssociationPdr(struct pldm_msgbuf* buf,
71 const pldm_association_pdr_test& association_pdr,
72 const pldm_entity_test& container_entity1,
73 const pldm_entity_test& child_entity1)
74{
75 struct pldm_entity_test container_entity = {};
76 struct pldm_entity_test child_entity = {};
77 pldm_association_pdr_test association_pdr_test{};
78
79 getAssociationPdrDetails(buf, association_pdr_test);
80 getEntity(buf, container_entity);
81 pldm_msgbuf_extract_uint8(buf, association_pdr_test.num_children);
82 getEntity(buf, child_entity);
83
Andrew Jeffery70d21c92025-03-05 12:59:42 +103084 ASSERT_EQ(pldm_msgbuf_complete_consumed(buf), 0);
Archana Kakanibc40dd52024-08-02 00:10:44 -050085
86 EXPECT_TRUE(association_pdr_test == association_pdr);
87 EXPECT_TRUE(container_entity == container_entity1);
88 EXPECT_TRUE(child_entity == child_entity1);
89}
90
Andrew Jeffery9c766792022-08-10 23:12:49 +093091TEST(PDRAccess, testInit)
92{
93 auto repo = pldm_pdr_init();
94 EXPECT_EQ(pldm_pdr_get_record_count(repo), 0u);
95 EXPECT_EQ(pldm_pdr_get_repo_size(repo), 0u);
96 pldm_pdr_destroy(repo);
97}
98
99TEST(PDRUpdate, testAdd)
100{
101 auto repo = pldm_pdr_init();
102
103 std::array<uint8_t, 10> data{};
Andrew Jefferyc79a5df2023-07-17 15:09:21 +0930104 uint32_t handle = 0;
Andrew Jefferyfae36412024-06-20 06:35:51 +0000105 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), false, 1, &handle),
106 0);
Andrew Jeffery9c766792022-08-10 23:12:49 +0930107 EXPECT_EQ(handle, 1u);
108 EXPECT_EQ(pldm_pdr_get_record_count(repo), 1u);
109 EXPECT_EQ(pldm_pdr_get_repo_size(repo), data.size());
110
Andrew Jefferyc79a5df2023-07-17 15:09:21 +0930111 handle = 0;
Andrew Jefferyfae36412024-06-20 06:35:51 +0000112 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), false, 1, &handle),
113 0);
Andrew Jeffery9c766792022-08-10 23:12:49 +0930114 EXPECT_EQ(handle, 2u);
Andrew Jefferyc79a5df2023-07-17 15:09:21 +0930115
116 handle = 0;
Andrew Jefferyfae36412024-06-20 06:35:51 +0000117 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), false, 1, &handle),
118 0);
Andrew Jeffery9c766792022-08-10 23:12:49 +0930119 EXPECT_EQ(handle, 3u);
Andrew Jefferyc79a5df2023-07-17 15:09:21 +0930120
121 handle = 0xdeeddeedu;
Andrew Jefferyfae36412024-06-20 06:35:51 +0000122 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), false, 1, &handle),
123 0);
Andrew Jefferyc79a5df2023-07-17 15:09:21 +0930124 EXPECT_EQ(handle, 0xdeeddeed);
Andrew Jeffery9c766792022-08-10 23:12:49 +0930125 EXPECT_EQ(pldm_pdr_get_record_count(repo), 4u);
126 EXPECT_EQ(pldm_pdr_get_repo_size(repo), data.size() * 4u);
127
128 pldm_pdr_destroy(repo);
129}
130
131TEST(PDRRemoveByTerminus, testRemoveByTerminus)
132{
133 std::array<uint8_t, 10> data{};
134
135 auto repo = pldm_pdr_init();
Andrew Jefferyc79a5df2023-07-17 15:09:21 +0930136
Andrew Jefferyfae36412024-06-20 06:35:51 +0000137 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), false, 1, NULL), 0);
Andrew Jeffery9c766792022-08-10 23:12:49 +0930138 pldm_pdr_remove_pdrs_by_terminus_handle(repo, 1);
139 EXPECT_EQ(pldm_pdr_get_record_count(repo), 0u);
140 pldm_pdr_destroy(repo);
141
142 repo = pldm_pdr_init();
Andrew Jefferyfae36412024-06-20 06:35:51 +0000143 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), true, 2, NULL), 0);
144 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), true, 1, NULL), 0);
Andrew Jeffery9c766792022-08-10 23:12:49 +0930145 EXPECT_EQ(pldm_pdr_get_record_count(repo), 2u);
146 pldm_pdr_remove_pdrs_by_terminus_handle(repo, 1);
147 EXPECT_EQ(pldm_pdr_get_record_count(repo), 1u);
148 pldm_pdr_destroy(repo);
149
150 repo = pldm_pdr_init();
Andrew Jefferyfae36412024-06-20 06:35:51 +0000151 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), true, 1, NULL), 0);
152 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), true, 2, NULL), 0);
153 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), true, 2, NULL), 0);
Andrew Jeffery9c766792022-08-10 23:12:49 +0930154 EXPECT_EQ(pldm_pdr_get_record_count(repo), 3u);
155 pldm_pdr_remove_pdrs_by_terminus_handle(repo, 2);
156 EXPECT_EQ(pldm_pdr_get_record_count(repo), 1u);
157 pldm_pdr_destroy(repo);
158
159 repo = pldm_pdr_init();
Andrew Jefferyfae36412024-06-20 06:35:51 +0000160 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), true, 1, NULL), 0);
161 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), false, 2, NULL), 0);
162 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), true, 1, NULL), 0);
Andrew Jeffery9c766792022-08-10 23:12:49 +0930163 EXPECT_EQ(pldm_pdr_get_record_count(repo), 3u);
164 pldm_pdr_remove_remote_pdrs(repo);
165 EXPECT_EQ(pldm_pdr_get_record_count(repo), 1u);
166 pldm_pdr_remove_pdrs_by_terminus_handle(repo, 1);
167 EXPECT_EQ(pldm_pdr_get_record_count(repo), 1u);
168 pldm_pdr_remove_pdrs_by_terminus_handle(repo, 2);
169 EXPECT_EQ(pldm_pdr_get_record_count(repo), 0u);
170 pldm_pdr_destroy(repo);
171}
172
173TEST(PDRUpdate, testRemove)
174{
175 std::array<uint8_t, 10> data{};
176
177 auto repo = pldm_pdr_init();
178 pldm_pdr_remove_remote_pdrs(repo);
179 EXPECT_EQ(pldm_pdr_get_record_count(repo), 0u);
180 pldm_pdr_destroy(repo);
181
182 repo = pldm_pdr_init();
Andrew Jefferyfae36412024-06-20 06:35:51 +0000183 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), true, 1, NULL), 0);
Andrew Jeffery9c766792022-08-10 23:12:49 +0930184 pldm_pdr_remove_remote_pdrs(repo);
185 EXPECT_EQ(pldm_pdr_get_record_count(repo), 0u);
186 pldm_pdr_destroy(repo);
187
188 repo = pldm_pdr_init();
Andrew Jefferyfae36412024-06-20 06:35:51 +0000189 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), false, 1, NULL), 0);
Andrew Jeffery9c766792022-08-10 23:12:49 +0930190 pldm_pdr_remove_remote_pdrs(repo);
191 EXPECT_EQ(pldm_pdr_get_record_count(repo), 1u);
192 pldm_pdr_destroy(repo);
193
194 repo = pldm_pdr_init();
Andrew Jefferyfae36412024-06-20 06:35:51 +0000195 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), false, 1, NULL), 0);
196 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), true, 1, NULL), 0);
Andrew Jeffery9c766792022-08-10 23:12:49 +0930197 pldm_pdr_remove_remote_pdrs(repo);
198 EXPECT_EQ(pldm_pdr_get_record_count(repo), 1u);
199 pldm_pdr_destroy(repo);
200
201 repo = pldm_pdr_init();
Andrew Jefferyfae36412024-06-20 06:35:51 +0000202 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), true, 1, NULL), 0);
203 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), false, 1, NULL), 0);
Andrew Jeffery9c766792022-08-10 23:12:49 +0930204 pldm_pdr_remove_remote_pdrs(repo);
205 EXPECT_EQ(pldm_pdr_get_record_count(repo), 1u);
206 pldm_pdr_destroy(repo);
207
208 repo = pldm_pdr_init();
Andrew Jefferyfae36412024-06-20 06:35:51 +0000209 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), true, 1, NULL), 0);
210 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), true, 1, NULL), 0);
211 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), true, 1, NULL), 0);
212 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), true, 1, NULL), 0);
Andrew Jeffery9c766792022-08-10 23:12:49 +0930213 pldm_pdr_remove_remote_pdrs(repo);
214 EXPECT_EQ(pldm_pdr_get_record_count(repo), 0u);
Andrew Jefferyfae36412024-06-20 06:35:51 +0000215 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), true, 1, NULL), 0);
216 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), false, 1, NULL), 0);
Andrew Jeffery9c766792022-08-10 23:12:49 +0930217 EXPECT_EQ(pldm_pdr_get_record_count(repo), 2u);
218 pldm_pdr_destroy(repo);
219
220 repo = pldm_pdr_init();
Andrew Jefferyfae36412024-06-20 06:35:51 +0000221 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), false, 1, NULL), 0);
222 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), false, 1, NULL), 0);
223 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), false, 1, NULL), 0);
224 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), false, 1, NULL), 0);
Andrew Jeffery9c766792022-08-10 23:12:49 +0930225 pldm_pdr_remove_remote_pdrs(repo);
226 EXPECT_EQ(pldm_pdr_get_record_count(repo), 4u);
Andrew Jefferyfae36412024-06-20 06:35:51 +0000227 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), true, 1, NULL), 0);
228 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), false, 1, NULL), 0);
Andrew Jeffery9c766792022-08-10 23:12:49 +0930229 EXPECT_EQ(pldm_pdr_get_record_count(repo), 6u);
230 pldm_pdr_destroy(repo);
231
232 repo = pldm_pdr_init();
Andrew Jefferyfae36412024-06-20 06:35:51 +0000233 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), true, 1, NULL), 0);
234 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), false, 1, NULL), 0);
235 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), false, 1, NULL), 0);
236 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), false, 1, NULL), 0);
Andrew Jeffery9c766792022-08-10 23:12:49 +0930237 pldm_pdr_remove_remote_pdrs(repo);
238 EXPECT_EQ(pldm_pdr_get_record_count(repo), 3u);
Andrew Jefferyfae36412024-06-20 06:35:51 +0000239 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), true, 1, NULL), 0);
240 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), false, 1, NULL), 0);
Andrew Jeffery9c766792022-08-10 23:12:49 +0930241 EXPECT_EQ(pldm_pdr_get_record_count(repo), 5u);
242 pldm_pdr_destroy(repo);
243
244 repo = pldm_pdr_init();
Andrew Jefferyfae36412024-06-20 06:35:51 +0000245 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), false, 1, NULL), 0);
246 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), false, 1, NULL), 0);
247 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), false, 1, NULL), 0);
248 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), true, 1, NULL), 0);
Andrew Jeffery9c766792022-08-10 23:12:49 +0930249 pldm_pdr_remove_remote_pdrs(repo);
250 EXPECT_EQ(pldm_pdr_get_record_count(repo), 3u);
Andrew Jefferyfae36412024-06-20 06:35:51 +0000251 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), true, 1, NULL), 0);
252 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), false, 1, NULL), 0);
Andrew Jeffery9c766792022-08-10 23:12:49 +0930253 EXPECT_EQ(pldm_pdr_get_record_count(repo), 5u);
254 pldm_pdr_destroy(repo);
255
256 repo = pldm_pdr_init();
Andrew Jefferyfae36412024-06-20 06:35:51 +0000257 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), true, 1, NULL), 0);
258 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), false, 1, NULL), 0);
259 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), true, 1, NULL), 0);
260 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), false, 1, NULL), 0);
Andrew Jeffery9c766792022-08-10 23:12:49 +0930261 pldm_pdr_remove_remote_pdrs(repo);
262 EXPECT_EQ(pldm_pdr_get_record_count(repo), 2u);
Andrew Jefferyfae36412024-06-20 06:35:51 +0000263 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), false, 1, NULL), 0);
264 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), true, 1, NULL), 0);
Andrew Jeffery9c766792022-08-10 23:12:49 +0930265 EXPECT_EQ(pldm_pdr_get_record_count(repo), 4u);
266 pldm_pdr_destroy(repo);
267
268 repo = pldm_pdr_init();
Andrew Jefferyfae36412024-06-20 06:35:51 +0000269 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), false, 1, NULL), 0);
270 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), false, 1, NULL), 0);
271 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), false, 1, NULL), 0);
272 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), true, 1, NULL), 0);
Andrew Jeffery9c766792022-08-10 23:12:49 +0930273 pldm_pdr_remove_remote_pdrs(repo);
274 EXPECT_EQ(pldm_pdr_get_record_count(repo), 3u);
Andrew Jefferyfae36412024-06-20 06:35:51 +0000275 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), false, 1, NULL), 0);
276 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), true, 1, NULL), 0);
Andrew Jeffery9c766792022-08-10 23:12:49 +0930277 EXPECT_EQ(pldm_pdr_get_record_count(repo), 5u);
278 pldm_pdr_destroy(repo);
279
280 repo = pldm_pdr_init();
Andrew Jefferyfae36412024-06-20 06:35:51 +0000281 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), false, 1, NULL), 0);
282 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), true, 1, NULL), 0);
283 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), false, 1, NULL), 0);
284 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), true, 1, NULL), 0);
Andrew Jeffery9c766792022-08-10 23:12:49 +0930285 pldm_pdr_remove_remote_pdrs(repo);
286 EXPECT_EQ(pldm_pdr_get_record_count(repo), 2u);
Andrew Jefferyfae36412024-06-20 06:35:51 +0000287 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), false, 1, NULL), 0);
288 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), true, 1, NULL), 0);
Andrew Jeffery9c766792022-08-10 23:12:49 +0930289 EXPECT_EQ(pldm_pdr_get_record_count(repo), 4u);
290 pldm_pdr_destroy(repo);
291
292 repo = pldm_pdr_init();
Andrew Jefferyfae36412024-06-20 06:35:51 +0000293 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), true, 1, NULL), 0);
294 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), true, 1, NULL), 0);
295 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), true, 1, NULL), 0);
296 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), false, 1, NULL), 0);
Andrew Jeffery9c766792022-08-10 23:12:49 +0930297 pldm_pdr_remove_remote_pdrs(repo);
298 EXPECT_EQ(pldm_pdr_get_record_count(repo), 1u);
Andrew Jefferyfae36412024-06-20 06:35:51 +0000299 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), false, 1, NULL), 0);
300 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), true, 1, NULL), 0);
Andrew Jeffery9c766792022-08-10 23:12:49 +0930301 EXPECT_EQ(pldm_pdr_get_record_count(repo), 3u);
302 pldm_pdr_destroy(repo);
303
304 repo = pldm_pdr_init();
Andrew Jefferyfae36412024-06-20 06:35:51 +0000305 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), false, 1, NULL), 0);
306 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), true, 1, NULL), 0);
307 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), true, 1, NULL), 0);
308 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), true, 1, NULL), 0);
Andrew Jeffery9c766792022-08-10 23:12:49 +0930309 pldm_pdr_remove_remote_pdrs(repo);
310 EXPECT_EQ(pldm_pdr_get_record_count(repo), 1u);
Andrew Jefferyfae36412024-06-20 06:35:51 +0000311 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), false, 1, NULL), 0);
312 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), true, 1, NULL), 0);
Andrew Jeffery9c766792022-08-10 23:12:49 +0930313 EXPECT_EQ(pldm_pdr_get_record_count(repo), 3u);
314 pldm_pdr_destroy(repo);
315
316 repo = pldm_pdr_init();
Andrew Jefferyfae36412024-06-20 06:35:51 +0000317 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), false, 1, NULL), 0);
318 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), true, 1, NULL), 0);
319 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), true, 1, NULL), 0);
320 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), false, 1, NULL), 0);
Andrew Jeffery9c766792022-08-10 23:12:49 +0930321 pldm_pdr_remove_remote_pdrs(repo);
322 EXPECT_EQ(pldm_pdr_get_record_count(repo), 2u);
Andrew Jefferyfae36412024-06-20 06:35:51 +0000323 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), false, 1, NULL), 0);
324 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), true, 1, NULL), 0);
Andrew Jeffery9c766792022-08-10 23:12:49 +0930325 EXPECT_EQ(pldm_pdr_get_record_count(repo), 4u);
326 pldm_pdr_destroy(repo);
327
328 repo = pldm_pdr_init();
Andrew Jefferyfae36412024-06-20 06:35:51 +0000329 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), true, 1, NULL), 0);
330 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), false, 1, NULL), 0);
331 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), false, 1, NULL), 0);
332 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), true, 1, NULL), 0);
Andrew Jeffery9c766792022-08-10 23:12:49 +0930333 pldm_pdr_remove_remote_pdrs(repo);
334 EXPECT_EQ(pldm_pdr_get_record_count(repo), 2u);
Andrew Jefferyc79a5df2023-07-17 15:09:21 +0930335 uint32_t handle = 0;
Andrew Jefferyfae36412024-06-20 06:35:51 +0000336 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), false, 1, &handle),
337 0);
Andrew Jeffery9c766792022-08-10 23:12:49 +0930338 EXPECT_EQ(handle, 3u);
Andrew Jefferyc79a5df2023-07-17 15:09:21 +0930339 handle = 0;
Andrew Jefferyfae36412024-06-20 06:35:51 +0000340 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), true, 1, &handle),
341 0);
Andrew Jeffery9c766792022-08-10 23:12:49 +0930342 EXPECT_EQ(handle, 4u);
343 EXPECT_EQ(pldm_pdr_get_record_count(repo), 4u);
344 pldm_pdr_destroy(repo);
345}
346
347TEST(PDRAccess, testGet)
348{
349 auto repo = pldm_pdr_init();
350
351 std::array<uint32_t, 10> in{100, 345, 3, 6, 89, 0, 11, 45, 23434, 123123};
Andrew Jefferyc79a5df2023-07-17 15:09:21 +0930352 uint32_t handle = 1;
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +0930353 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Andrew Jefferyfae36412024-06-20 06:35:51 +0000354 EXPECT_EQ(pldm_pdr_add(repo, reinterpret_cast<uint8_t*>(in.data()),
355 sizeof(in), false, 1, &handle),
Andrew Jefferyc79a5df2023-07-17 15:09:21 +0930356 0);
Andrew Jeffery9c766792022-08-10 23:12:49 +0930357 EXPECT_EQ(pldm_pdr_get_record_count(repo), 1u);
358 EXPECT_EQ(pldm_pdr_get_repo_size(repo), sizeof(in));
359 uint32_t size{};
360 uint32_t nextRecHdl{};
361 uint8_t* outData = nullptr;
362 auto hdl = pldm_pdr_find_record(repo, 0, &outData, &size, &nextRecHdl);
363 EXPECT_NE(hdl, nullptr);
364 EXPECT_EQ(size, sizeof(in));
365 EXPECT_EQ(nextRecHdl, 0u);
366 EXPECT_EQ(memcmp(outData, in.data(), sizeof(in)), 0);
367 outData = nullptr;
368
369 auto hdl2 = pldm_pdr_find_record(repo, 1, &outData, &size, &nextRecHdl);
370 EXPECT_EQ(hdl, hdl2);
371 EXPECT_NE(hdl, nullptr);
372 EXPECT_EQ(size, sizeof(in));
373 EXPECT_EQ(nextRecHdl, 0u);
374 EXPECT_EQ(memcmp(outData, in.data(), sizeof(in)), 0);
375 outData = nullptr;
376
377 hdl = pldm_pdr_find_record(repo, htole32(0xdeaddead), &outData, &size,
378 &nextRecHdl);
379 EXPECT_EQ(hdl, nullptr);
380 EXPECT_EQ(size, 0u);
381 EXPECT_EQ(nextRecHdl, 0u);
382 EXPECT_EQ(outData, nullptr);
383 outData = nullptr;
384
385 std::array<uint32_t, 10> in2{1000, 3450, 30, 60, 890,
386 0, 110, 450, 234034, 123123};
Andrew Jefferyc79a5df2023-07-17 15:09:21 +0930387 handle = 2;
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +0930388 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Andrew Jefferyfae36412024-06-20 06:35:51 +0000389 EXPECT_EQ(pldm_pdr_add(repo, reinterpret_cast<uint8_t*>(in2.data()),
390 sizeof(in2), false, 1, &handle),
Andrew Jefferyc79a5df2023-07-17 15:09:21 +0930391 0);
392 handle = 3;
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +0930393 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Andrew Jefferyfae36412024-06-20 06:35:51 +0000394 EXPECT_EQ(pldm_pdr_add(repo, reinterpret_cast<uint8_t*>(in2.data()),
395 sizeof(in2), false, 1, &handle),
Andrew Jefferyc79a5df2023-07-17 15:09:21 +0930396 0);
397 handle = 4;
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +0930398 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Andrew Jefferyfae36412024-06-20 06:35:51 +0000399 EXPECT_EQ(pldm_pdr_add(repo, reinterpret_cast<uint8_t*>(in2.data()),
400 sizeof(in2), true, 1, &handle),
Andrew Jefferyc79a5df2023-07-17 15:09:21 +0930401 0);
Andrew Jeffery9c766792022-08-10 23:12:49 +0930402 EXPECT_EQ(pldm_pdr_get_record_count(repo), 4u);
403 EXPECT_EQ(pldm_pdr_get_repo_size(repo), sizeof(in2) * 4);
404 hdl = pldm_pdr_find_record(repo, 0, &outData, &size, &nextRecHdl);
405 EXPECT_NE(hdl, nullptr);
406 EXPECT_EQ(size, sizeof(in));
407 EXPECT_EQ(nextRecHdl, 2u);
408 EXPECT_EQ(memcmp(outData, in.data(), sizeof(in)), 0);
409 outData = nullptr;
410 hdl2 = pldm_pdr_find_record(repo, 1, &outData, &size, &nextRecHdl);
411 EXPECT_EQ(hdl, hdl2);
412 EXPECT_NE(hdl, nullptr);
413 EXPECT_EQ(size, sizeof(in));
414 EXPECT_EQ(nextRecHdl, 2u);
415 EXPECT_EQ(memcmp(outData, in.data(), sizeof(in)), 0);
416 outData = nullptr;
417 hdl = pldm_pdr_find_record(repo, 2, &outData, &size, &nextRecHdl);
418 EXPECT_NE(hdl, nullptr);
419 EXPECT_EQ(size, sizeof(in2));
420 EXPECT_EQ(nextRecHdl, 3u);
421 EXPECT_EQ(memcmp(outData, in2.data(), sizeof(in2)), 0);
422 outData = nullptr;
423 hdl = pldm_pdr_find_record(repo, 3, &outData, &size, &nextRecHdl);
424 EXPECT_NE(hdl, nullptr);
425 EXPECT_EQ(pldm_pdr_record_is_remote(hdl), false);
426 EXPECT_EQ(size, sizeof(in2));
427 EXPECT_EQ(nextRecHdl, 4u);
428 EXPECT_EQ(memcmp(outData, in2.data(), sizeof(in2)), 0);
429 outData = nullptr;
430 hdl = pldm_pdr_find_record(repo, 4, &outData, &size, &nextRecHdl);
431 EXPECT_NE(hdl, nullptr);
432 EXPECT_EQ(pldm_pdr_record_is_remote(hdl), true);
433 EXPECT_EQ(size, sizeof(in2));
434 EXPECT_EQ(nextRecHdl, 0u);
435 EXPECT_EQ(memcmp(outData, in2.data(), sizeof(in2)), 0);
436 outData = nullptr;
437
438 pldm_pdr_destroy(repo);
439}
440
441TEST(PDRAccess, testGetNext)
442{
443 auto repo = pldm_pdr_init();
444
445 std::array<uint32_t, 10> in{100, 345, 3, 6, 89, 0, 11, 45, 23434, 123123};
Andrew Jefferyc79a5df2023-07-17 15:09:21 +0930446 uint32_t handle = 1;
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +0930447 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Andrew Jefferyfae36412024-06-20 06:35:51 +0000448 EXPECT_EQ(pldm_pdr_add(repo, reinterpret_cast<uint8_t*>(in.data()),
449 sizeof(in), false, 1, &handle),
Andrew Jefferyc79a5df2023-07-17 15:09:21 +0930450 0);
Andrew Jeffery9c766792022-08-10 23:12:49 +0930451 EXPECT_EQ(pldm_pdr_get_record_count(repo), 1u);
452 EXPECT_EQ(pldm_pdr_get_repo_size(repo), sizeof(in));
453 uint32_t size{};
454 uint32_t nextRecHdl{};
455 uint8_t* outData = nullptr;
456 auto hdl = pldm_pdr_find_record(repo, 0, &outData, &size, &nextRecHdl);
457 EXPECT_NE(hdl, nullptr);
458 EXPECT_EQ(size, sizeof(in));
459 EXPECT_EQ(nextRecHdl, 0u);
460 EXPECT_EQ(memcmp(outData, in.data(), sizeof(in)), 0);
461 outData = nullptr;
462
463 std::array<uint32_t, 10> in2{1000, 3450, 30, 60, 890,
464 0, 110, 450, 234034, 123123};
Andrew Jefferyc79a5df2023-07-17 15:09:21 +0930465 handle = 2;
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +0930466 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Andrew Jefferyfae36412024-06-20 06:35:51 +0000467 EXPECT_EQ(pldm_pdr_add(repo, reinterpret_cast<uint8_t*>(in2.data()),
468 sizeof(in2), false, 1, &handle),
Andrew Jefferyc79a5df2023-07-17 15:09:21 +0930469 0);
470 handle = 3;
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +0930471 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Andrew Jefferyfae36412024-06-20 06:35:51 +0000472 EXPECT_EQ(pldm_pdr_add(repo, reinterpret_cast<uint8_t*>(in2.data()),
473 sizeof(in2), false, 1, &handle),
Andrew Jefferyc79a5df2023-07-17 15:09:21 +0930474 0);
475 handle = 4;
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +0930476 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Andrew Jefferyfae36412024-06-20 06:35:51 +0000477 EXPECT_EQ(pldm_pdr_add(repo, reinterpret_cast<uint8_t*>(in2.data()),
478 sizeof(in2), false, 1, &handle),
Andrew Jefferyc79a5df2023-07-17 15:09:21 +0930479 0);
Andrew Jeffery9c766792022-08-10 23:12:49 +0930480 EXPECT_EQ(pldm_pdr_get_record_count(repo), 4u);
481 EXPECT_EQ(pldm_pdr_get_repo_size(repo), sizeof(in2) * 4);
482 hdl = pldm_pdr_get_next_record(repo, hdl, &outData, &size, &nextRecHdl);
483 EXPECT_NE(hdl, nullptr);
484 EXPECT_EQ(size, sizeof(in2));
485 EXPECT_EQ(nextRecHdl, 3u);
486 EXPECT_EQ(memcmp(outData, in2.data(), sizeof(in2)), 0);
487 outData = nullptr;
488 hdl = pldm_pdr_get_next_record(repo, hdl, &outData, &size, &nextRecHdl);
489 EXPECT_NE(hdl, nullptr);
490 EXPECT_EQ(size, sizeof(in2));
491 EXPECT_EQ(nextRecHdl, 4u);
492 EXPECT_EQ(memcmp(outData, in2.data(), sizeof(in2)), 0);
493 outData = nullptr;
494 hdl = pldm_pdr_get_next_record(repo, hdl, &outData, &size, &nextRecHdl);
495 EXPECT_NE(hdl, nullptr);
496 EXPECT_EQ(size, sizeof(in2));
497 EXPECT_EQ(nextRecHdl, 0u);
498 EXPECT_EQ(memcmp(outData, in2.data(), sizeof(in2)), 0);
499 outData = nullptr;
500
501 pldm_pdr_destroy(repo);
502}
503
504TEST(PDRAccess, testFindByType)
505{
506 auto repo = pldm_pdr_init();
507
508 std::array<uint8_t, sizeof(pldm_pdr_hdr)> data{};
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +0930509 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Andrew Jeffery9c766792022-08-10 23:12:49 +0930510 pldm_pdr_hdr* hdr = reinterpret_cast<pldm_pdr_hdr*>(data.data());
511 hdr->type = 1;
Andrew Jefferyc79a5df2023-07-17 15:09:21 +0930512 uint32_t first = 0;
Andrew Jefferyfae36412024-06-20 06:35:51 +0000513 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), false, 1, &first),
514 0);
Andrew Jeffery9c766792022-08-10 23:12:49 +0930515 hdr->type = 2;
Andrew Jefferyc79a5df2023-07-17 15:09:21 +0930516 uint32_t second = 0;
Andrew Jefferyfae36412024-06-20 06:35:51 +0000517 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), false, 1, &second),
518 0);
Andrew Jeffery9c766792022-08-10 23:12:49 +0930519 hdr->type = 3;
Andrew Jefferyc79a5df2023-07-17 15:09:21 +0930520 uint32_t third = 0;
Andrew Jefferyfae36412024-06-20 06:35:51 +0000521 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), false, 1, &third),
522 0);
Andrew Jeffery9c766792022-08-10 23:12:49 +0930523 hdr->type = 4;
Andrew Jefferyc79a5df2023-07-17 15:09:21 +0930524 uint32_t fourth = 0;
Andrew Jefferyfae36412024-06-20 06:35:51 +0000525 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), false, 1, &fourth),
526 0);
Andrew Jeffery9c766792022-08-10 23:12:49 +0930527
528 uint8_t* outData = nullptr;
529 uint32_t size{};
530 auto firstRec =
531 pldm_pdr_find_record_by_type(repo, 1, nullptr, &outData, &size);
532 EXPECT_EQ(pldm_pdr_get_record_handle(repo, firstRec), first);
533 outData = nullptr;
534 auto secondRec =
535 pldm_pdr_find_record_by_type(repo, 2, nullptr, &outData, &size);
536 EXPECT_EQ(pldm_pdr_get_record_handle(repo, secondRec), second);
537 outData = nullptr;
538 auto thirdRec =
539 pldm_pdr_find_record_by_type(repo, 3, nullptr, &outData, &size);
540 EXPECT_EQ(pldm_pdr_get_record_handle(repo, thirdRec), third);
541 outData = nullptr;
542 auto fourthRec =
543 pldm_pdr_find_record_by_type(repo, 4, nullptr, &outData, &size);
544 EXPECT_EQ(pldm_pdr_get_record_handle(repo, fourthRec), fourth);
545 outData = nullptr;
546 auto fifthRec =
547 pldm_pdr_find_record_by_type(repo, 5, nullptr, &outData, &size);
548 EXPECT_EQ(fifthRec, nullptr);
549 EXPECT_EQ(outData, nullptr);
550 EXPECT_EQ(size, 0u);
551
552 auto rec =
553 pldm_pdr_find_record_by_type(repo, 3, secondRec, &outData, &size);
554 EXPECT_EQ(pldm_pdr_get_record_handle(repo, rec), third);
555 outData = nullptr;
556 rec = pldm_pdr_find_record_by_type(repo, 4, secondRec, &outData, &size);
557 EXPECT_EQ(pldm_pdr_get_record_handle(repo, rec), fourth);
558 outData = nullptr;
559 rec = pldm_pdr_find_record_by_type(repo, 2, firstRec, &outData, &size);
560 EXPECT_EQ(pldm_pdr_get_record_handle(repo, rec), second);
561 outData = nullptr;
562
563 pldm_pdr_destroy(repo);
564}
565
566TEST(PDRUpdate, testAddFruRecordSet)
567{
568 auto repo = pldm_pdr_init();
569
Andrew Jeffery14d29842023-07-17 15:29:32 +0930570 uint32_t handle = 0;
Andrew Jefferye7f55112024-06-20 16:16:01 +0930571 EXPECT_EQ(pldm_pdr_add_fru_record_set(repo, 1, 10, 1, 0, 100, &handle), 0);
Andrew Jeffery9c766792022-08-10 23:12:49 +0930572 EXPECT_EQ(handle, 1u);
573 EXPECT_EQ(pldm_pdr_get_record_count(repo), 1u);
574 EXPECT_EQ(pldm_pdr_get_repo_size(repo),
575 sizeof(pldm_pdr_hdr) + sizeof(pldm_pdr_fru_record_set));
576 uint32_t size{};
577 uint32_t nextRecHdl{};
578 uint8_t* outData = nullptr;
579 auto hdl = pldm_pdr_find_record(repo, 0, &outData, &size, &nextRecHdl);
580 EXPECT_NE(hdl, nullptr);
581 EXPECT_EQ(size, sizeof(pldm_pdr_hdr) + sizeof(pldm_pdr_fru_record_set));
582 EXPECT_EQ(nextRecHdl, 0u);
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +0930583 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Andrew Jeffery9c766792022-08-10 23:12:49 +0930584 pldm_pdr_hdr* hdr = reinterpret_cast<pldm_pdr_hdr*>(outData);
585 EXPECT_EQ(hdr->version, 1u);
586 EXPECT_EQ(hdr->type, PLDM_PDR_FRU_RECORD_SET);
587 EXPECT_EQ(hdr->length, htole16(sizeof(pldm_pdr_fru_record_set)));
588 EXPECT_EQ(hdr->record_handle, htole32(1));
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +0930589 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Andrew Jeffery9c766792022-08-10 23:12:49 +0930590 pldm_pdr_fru_record_set* fru = reinterpret_cast<pldm_pdr_fru_record_set*>(
591 outData + sizeof(pldm_pdr_hdr));
592 EXPECT_EQ(fru->terminus_handle, htole16(1));
593 EXPECT_EQ(fru->fru_rsi, htole16(10));
594 EXPECT_EQ(fru->entity_type, htole16(1));
595 EXPECT_EQ(fru->entity_instance_num, htole16(0));
596 EXPECT_EQ(fru->container_id, htole16(100));
597 outData = nullptr;
598
Andrew Jeffery14d29842023-07-17 15:29:32 +0930599 handle = 0;
Andrew Jefferye7f55112024-06-20 16:16:01 +0930600 EXPECT_EQ(pldm_pdr_add_fru_record_set(repo, 2, 11, 2, 1, 101, &handle), 0);
Andrew Jeffery9c766792022-08-10 23:12:49 +0930601 EXPECT_EQ(handle, 2u);
602 EXPECT_EQ(pldm_pdr_get_record_count(repo), 2u);
603 EXPECT_EQ(pldm_pdr_get_repo_size(repo),
604 2 * (sizeof(pldm_pdr_hdr) + sizeof(pldm_pdr_fru_record_set)));
605 hdl = pldm_pdr_find_record(repo, 2, &outData, &size, &nextRecHdl);
606 EXPECT_NE(hdl, nullptr);
607 EXPECT_EQ(size, sizeof(pldm_pdr_hdr) + sizeof(pldm_pdr_fru_record_set));
608 EXPECT_EQ(nextRecHdl, 0u);
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +0930609 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Andrew Jeffery9c766792022-08-10 23:12:49 +0930610 hdr = reinterpret_cast<pldm_pdr_hdr*>(outData);
611 EXPECT_EQ(hdr->version, 1u);
612 EXPECT_EQ(hdr->type, PLDM_PDR_FRU_RECORD_SET);
613 EXPECT_EQ(hdr->length, htole16(sizeof(pldm_pdr_fru_record_set)));
614 EXPECT_EQ(hdr->record_handle, htole32(2));
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +0930615 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Andrew Jeffery9c766792022-08-10 23:12:49 +0930616 fru = reinterpret_cast<pldm_pdr_fru_record_set*>(outData +
617 sizeof(pldm_pdr_hdr));
618 EXPECT_EQ(fru->terminus_handle, htole16(2));
619 EXPECT_EQ(fru->fru_rsi, htole16(11));
620 EXPECT_EQ(fru->entity_type, htole16(2));
621 EXPECT_EQ(fru->entity_instance_num, htole16(1));
622 EXPECT_EQ(fru->container_id, htole16(101));
623 outData = nullptr;
624
625 hdl = pldm_pdr_find_record(repo, 1, &outData, &size, &nextRecHdl);
626 EXPECT_NE(hdl, nullptr);
627 EXPECT_EQ(size, sizeof(pldm_pdr_hdr) + sizeof(pldm_pdr_fru_record_set));
628 EXPECT_EQ(nextRecHdl, 2u);
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +0930629 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Andrew Jeffery9c766792022-08-10 23:12:49 +0930630 hdr = reinterpret_cast<pldm_pdr_hdr*>(outData);
631 EXPECT_EQ(hdr->version, 1u);
632 EXPECT_EQ(hdr->type, PLDM_PDR_FRU_RECORD_SET);
633 EXPECT_EQ(hdr->length, htole16(sizeof(pldm_pdr_fru_record_set)));
634 EXPECT_EQ(hdr->record_handle, htole32(1));
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +0930635 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Andrew Jeffery9c766792022-08-10 23:12:49 +0930636 fru = reinterpret_cast<pldm_pdr_fru_record_set*>(outData +
637 sizeof(pldm_pdr_hdr));
638 EXPECT_EQ(fru->terminus_handle, htole16(1));
639 EXPECT_EQ(fru->fru_rsi, htole16(10));
640 EXPECT_EQ(fru->entity_type, htole16(1));
641 EXPECT_EQ(fru->entity_instance_num, htole16(0));
642 EXPECT_EQ(fru->container_id, htole16(100));
643 outData = nullptr;
644
645 pldm_pdr_destroy(repo);
646}
647
648TEST(PDRUpdate, tesFindtFruRecordSet)
649{
650 auto repo = pldm_pdr_init();
651
652 uint16_t terminusHdl{};
653 uint16_t entityType{};
654 uint16_t entityInstanceNum{};
655 uint16_t containerId{};
Andrew Jeffery14d29842023-07-17 15:29:32 +0930656 uint32_t first = 1;
Andrew Jefferye7f55112024-06-20 16:16:01 +0930657 EXPECT_EQ(pldm_pdr_add_fru_record_set(repo, 1, 1, 1, 0, 100, &first), 0);
Andrew Jeffery14d29842023-07-17 15:29:32 +0930658 uint32_t second = 2;
Andrew Jefferye7f55112024-06-20 16:16:01 +0930659 EXPECT_EQ(pldm_pdr_add_fru_record_set(repo, 1, 2, 1, 1, 100, &second), 0);
Andrew Jeffery14d29842023-07-17 15:29:32 +0930660 uint32_t third = 3;
Andrew Jefferye7f55112024-06-20 16:16:01 +0930661 EXPECT_EQ(pldm_pdr_add_fru_record_set(repo, 1, 3, 1, 2, 100, &third), 0);
Andrew Jeffery9c766792022-08-10 23:12:49 +0930662 EXPECT_EQ(first, pldm_pdr_get_record_handle(
663 repo, pldm_pdr_fru_record_set_find_by_rsi(
664 repo, 1, &terminusHdl, &entityType,
665 &entityInstanceNum, &containerId)));
666 EXPECT_EQ(second, pldm_pdr_get_record_handle(
667 repo, pldm_pdr_fru_record_set_find_by_rsi(
668 repo, 2, &terminusHdl, &entityType,
669 &entityInstanceNum, &containerId)));
670 EXPECT_EQ(third, pldm_pdr_get_record_handle(
671 repo, pldm_pdr_fru_record_set_find_by_rsi(
672 repo, 3, &terminusHdl, &entityType,
673 &entityInstanceNum, &containerId)));
674 EXPECT_EQ(terminusHdl, 1u);
675 EXPECT_EQ(entityType, 1u);
676 EXPECT_EQ(entityInstanceNum, 2u);
677 EXPECT_EQ(containerId, 100u);
678 EXPECT_EQ(nullptr, pldm_pdr_fru_record_set_find_by_rsi(
679 repo, 4, &terminusHdl, &entityType,
680 &entityInstanceNum, &containerId));
681
682 pldm_pdr_destroy(repo);
683}
684
Pavithra Barithaya4d694342023-05-19 08:04:41 -0500685#ifdef LIBPLDM_API_TESTING
686TEST(PDRUpdate, testFindLastInRange)
687{
688 auto repo = pldm_pdr_init();
689
690 std::array<uint8_t, 10> data{};
Andrew Jefferyc79a5df2023-07-17 15:09:21 +0930691 uint32_t handle1 = 0;
Andrew Jefferyfae36412024-06-20 06:35:51 +0000692 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), false, 1, &handle1),
693 0);
Andrew Jefferyc79a5df2023-07-17 15:09:21 +0930694 uint32_t handle2 = 23;
Andrew Jefferyfae36412024-06-20 06:35:51 +0000695 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), false, 1, &handle2),
696 0);
Andrew Jefferyc79a5df2023-07-17 15:09:21 +0930697 uint32_t handle3 = 77;
Andrew Jefferyfae36412024-06-20 06:35:51 +0000698 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), false, 1, &handle3),
699 0);
Andrew Jefferyc79a5df2023-07-17 15:09:21 +0930700 uint32_t handle4 = 16777325;
Andrew Jefferyfae36412024-06-20 06:35:51 +0000701 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), true, 1, &handle4),
702 0);
Andrew Jefferyc79a5df2023-07-17 15:09:21 +0930703 uint32_t handle5 = 16777344;
Andrew Jefferyfae36412024-06-20 06:35:51 +0000704 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), true, 1, &handle5),
705 0);
Pavithra Barithaya4d694342023-05-19 08:04:41 -0500706
707 auto rec1 = pldm_pdr_find_last_in_range(repo, 0, 100);
708 auto rec2 = pldm_pdr_find_last_in_range(repo, 16777300, 33554431);
709 EXPECT_NE(rec1, nullptr);
710 EXPECT_NE(rec2, nullptr);
711 EXPECT_NE(handle1, pldm_pdr_get_record_handle(repo, rec1));
712 EXPECT_NE(handle2, pldm_pdr_get_record_handle(repo, rec1));
713 EXPECT_EQ(handle3, pldm_pdr_get_record_handle(repo, rec1));
714 EXPECT_NE(handle4, pldm_pdr_get_record_handle(repo, rec2));
715 EXPECT_EQ(handle5, pldm_pdr_get_record_handle(repo, rec2));
716
717 pldm_pdr_destroy(repo);
718}
719#endif
720
Pavithra Barithaya274732f2024-07-05 16:03:01 +0530721#ifdef LIBPLDM_API_TESTING
Pavithra Barithayaf0eee362025-02-25 11:52:48 +0530722TEST(PDRAccess, testRemoveBySensorIDDecodeFailure)
723{
724 auto repo = pldm_pdr_init();
725 ASSERT_NE(repo, nullptr);
726
727 // Create a deliberately undersized PDR record
728 size_t invalidPdrSize = sizeof(pldm_state_sensor_pdr) - 4; // Invalid size
729 std::vector<uint8_t> entry(invalidPdrSize, 0);
730 pldm_state_sensor_pdr* pdr = new (entry.data()) pldm_state_sensor_pdr;
731 pdr->hdr.type = PLDM_STATE_SENSOR_PDR;
732 pdr->sensor_id = 50; // random ID
733
734 uint32_t record_handle = 0;
735 EXPECT_EQ(pldm_pdr_add(repo, entry.data(), entry.size(), false, 1,
736 &record_handle),
737 0);
738 // Attempt to delete the malformed record by effecter_id
739 uint32_t removed_record_handle = 0;
740 int rc =
741 pldm_pdr_delete_by_sensor_id(repo, 50, false, &removed_record_handle);
742
743 // We expect a failure from decode_pldm_state_effecter_pdr
744 EXPECT_NE(rc, 0);
745 EXPECT_EQ(pldm_pdr_get_record_count(repo),
746 1u); // Record remains in the repo
747
748 pldm_pdr_destroy(repo);
749}
750#endif
751
752#ifdef LIBPLDM_API_TESTING
753TEST(PDRAccess, testRemoveBySensorID)
754{
755 auto repo = pldm_pdr_init();
756 ASSERT_NE(repo, nullptr);
757
758 size_t pdrSize = 0;
759 pdrSize =
760 sizeof(pldm_state_sensor_pdr) + sizeof(state_sensor_possible_states);
761 std::vector<uint8_t> entry{};
762 entry.resize(pdrSize);
763
764 pldm_state_sensor_pdr* pdr = new (entry.data()) pldm_state_sensor_pdr;
765
766 pdr->hdr.type = PLDM_STATE_SENSOR_PDR;
767 pdr->sensor_id = 1;
768 uint32_t handle = 1;
769 EXPECT_EQ(pldm_pdr_add(repo, entry.data(), entry.size(), false, 1, &handle),
770 0);
771
772 pdr->sensor_id = 2;
773 handle = 2;
774 EXPECT_EQ(pldm_pdr_add(repo, entry.data(), entry.size(), false, 1, &handle),
775 0);
776
777 pdr->sensor_id = 10;
778 handle = 0;
779 EXPECT_EQ(pldm_pdr_add(repo, entry.data(), entry.size(), false, 1, &handle),
780 0);
781
782 pdr->sensor_id = 20;
783 handle = 10;
784 EXPECT_EQ(pldm_pdr_add(repo, entry.data(), entry.size(), false, 1, &handle),
785 0);
786
787 EXPECT_EQ(pldm_pdr_get_record_count(repo), 4u);
788
789 uint32_t removed_record_handle{};
790 int rc =
791 pldm_pdr_delete_by_sensor_id(repo, 1, false, &removed_record_handle);
792 EXPECT_EQ(rc, 0);
793 EXPECT_EQ(removed_record_handle, 1);
794 EXPECT_EQ(pldm_pdr_get_record_count(repo), 3u);
795
796 // Error case where the effceter ID is not present in the repo
797 uint32_t removed_rec_handle{};
798 rc = pldm_pdr_delete_by_sensor_id(repo, 15, false, &removed_rec_handle);
799 EXPECT_EQ(rc, -ENOENT);
800 EXPECT_EQ(removed_rec_handle, 0);
801 EXPECT_EQ(pldm_pdr_get_record_count(repo), 3u);
802
803 rc = pldm_pdr_delete_by_sensor_id(repo, 10, false, &removed_record_handle);
804 EXPECT_EQ(rc, 0);
805 EXPECT_EQ(removed_record_handle, 3);
806 EXPECT_EQ(pldm_pdr_get_record_count(repo), 2u);
807
808 pldm_pdr_destroy(repo);
809}
810#endif
811
812#ifdef LIBPLDM_API_TESTING
Pavithra Barithaya274732f2024-07-05 16:03:01 +0530813TEST(PDRAccess, testGetTerminusHandle)
814{
815
816 auto repo = pldm_pdr_init();
817
818 pldm_pdr_hdr hdr;
819
820 hdr.type = 1;
821 uint16_t firstTerminusHandle = 1;
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +0930822 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Andrew Jefferyf309c482024-09-07 18:45:41 +0300823 EXPECT_EQ(pldm_pdr_add(repo, reinterpret_cast<const uint8_t*>(&hdr),
824 sizeof(hdr), false, firstTerminusHandle, NULL),
Pavithra Barithaya274732f2024-07-05 16:03:01 +0530825 0);
826
827 hdr.type = 2;
828 uint16_t secondTerminusHandle = 2;
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +0930829 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Andrew Jefferyf309c482024-09-07 18:45:41 +0300830 EXPECT_EQ(pldm_pdr_add(repo, reinterpret_cast<const uint8_t*>(&hdr),
831 sizeof(hdr), true, secondTerminusHandle, NULL),
Pavithra Barithaya274732f2024-07-05 16:03:01 +0530832 0);
833
834 hdr.type = 3;
835 uint16_t thirdTerminusHandle = 3;
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +0930836 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Andrew Jefferyf309c482024-09-07 18:45:41 +0300837 EXPECT_EQ(pldm_pdr_add(repo, reinterpret_cast<const uint8_t*>(&hdr),
838 sizeof(hdr), true, thirdTerminusHandle, NULL),
Pavithra Barithaya274732f2024-07-05 16:03:01 +0530839 0);
840
841 uint8_t* outData = nullptr;
842 uint32_t size{};
843
844 auto firstRec =
845 pldm_pdr_find_record_by_type(repo, 1, nullptr, &outData, &size);
846 EXPECT_EQ(pldm_pdr_get_terminus_handle(repo, firstRec),
847 firstTerminusHandle);
848 outData = nullptr;
849
850 auto secondRec =
851 pldm_pdr_find_record_by_type(repo, 2, nullptr, &outData, &size);
852 EXPECT_EQ(pldm_pdr_get_terminus_handle(repo, secondRec),
853 secondTerminusHandle);
854 outData = nullptr;
855
856 auto thirdRec =
857 pldm_pdr_find_record_by_type(repo, 3, nullptr, &outData, &size);
858 EXPECT_EQ(pldm_pdr_get_terminus_handle(repo, thirdRec),
859 thirdTerminusHandle);
860 outData = nullptr;
861
862 pldm_pdr_destroy(repo);
863}
864#endif
865
Pavithra Barithaya5192e2e2025-02-26 16:50:06 +0530866TEST(PDRAccess, testRemoveByRecordHandle)
867{
868 std::array<uint8_t, sizeof(pldm_pdr_hdr)> data{};
869
870 auto repo = pldm_pdr_init();
871 uint32_t first = 0;
872 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), false, 1, &first),
873 0);
874
875 uint32_t second = 0;
876 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), false, 1, &second),
877 0);
878
879 uint32_t third = 0;
880 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), false, 1, &third),
881 0);
882
883 EXPECT_EQ(pldm_pdr_get_record_count(repo), 3u);
884
885 int rc = pldm_pdr_delete_by_record_handle(repo, 1, false);
886 EXPECT_EQ(rc, 0);
887 EXPECT_EQ(pldm_pdr_get_record_count(repo), 2u);
888
889 rc = pldm_pdr_delete_by_record_handle(repo, 2, false);
890 EXPECT_EQ(rc, 0);
891 EXPECT_EQ(pldm_pdr_get_record_count(repo), 1u);
892
893 pldm_pdr_destroy(repo);
894}
Pavithra Barithaya5192e2e2025-02-26 16:50:06 +0530895
Pavithra Barithaya8cfeb472025-02-25 10:43:34 +0530896#ifdef LIBPLDM_API_TESTING
897TEST(PDRAccess, testRemoveByEffecterIDDecodeFailure)
898{
899 auto repo = pldm_pdr_init();
900 ASSERT_NE(repo, nullptr);
901
902 // Create a deliberately undersized PDR record
903 size_t invalidPdrSize = sizeof(pldm_state_effecter_pdr) - 5; // Invalid size
904 std::vector<uint8_t> entry(invalidPdrSize, 0);
905 pldm_state_effecter_pdr* pdr = new (entry.data()) pldm_state_effecter_pdr;
906 pdr->hdr.type = PLDM_STATE_EFFECTER_PDR;
907 pdr->effecter_id = 99; // random ID
908
909 uint32_t record_handle = 0;
910 EXPECT_EQ(pldm_pdr_add(repo, entry.data(), entry.size(), false, 1,
911 &record_handle),
912 0);
913
914 // Attempt to delete the malformed record by effecter_id
915 uint32_t removed_record_handle = 0;
916 int rc =
917 pldm_pdr_delete_by_effecter_id(repo, 99, false, &removed_record_handle);
918
919 // We expect a failure from decode_pldm_state_effecter_pdr
920 EXPECT_NE(rc, 0);
921 EXPECT_EQ(pldm_pdr_get_record_count(repo),
922 1u); // Record remains in the repo
923 pldm_pdr_destroy(repo);
924}
925#endif
926
927#ifdef LIBPLDM_API_TESTING
928TEST(PDRAccess, testRemoveByEffecterID)
929{
930 auto repo = pldm_pdr_init();
931 ASSERT_NE(repo, nullptr);
932
933 size_t pdrSize = 0;
934 pdrSize = sizeof(pldm_state_effecter_pdr) +
935 sizeof(state_effecter_possible_states);
936 std::vector<uint8_t> entry{};
937 entry.resize(pdrSize);
938
939 pldm_state_effecter_pdr* pdr = new (entry.data()) pldm_state_effecter_pdr;
940 pdr->hdr.type = PLDM_STATE_EFFECTER_PDR;
941
942 pdr->effecter_id = 1;
943 uint32_t first = 0;
944 EXPECT_EQ(pldm_pdr_add(repo, entry.data(), entry.size(), false, 1, &first),
945 0);
946
947 pdr->effecter_id = 2;
948 uint32_t second = 0;
949 EXPECT_EQ(pldm_pdr_add(repo, entry.data(), entry.size(), false, 1, &second),
950 0);
951
952 pdr->effecter_id = 10;
953 uint32_t third = 0;
954 EXPECT_EQ(pldm_pdr_add(repo, entry.data(), entry.size(), false, 1, &third),
955 0);
956
957 pdr->effecter_id = 20;
958 uint32_t fourth = 0;
959 EXPECT_EQ(pldm_pdr_add(repo, entry.data(), entry.size(), false, 1, &fourth),
960 0);
961
962 EXPECT_EQ(pldm_pdr_get_record_count(repo), 4u);
963
964 uint32_t removed_record_handle{};
965 int rc =
966 pldm_pdr_delete_by_effecter_id(repo, 1, false, &removed_record_handle);
967 EXPECT_EQ(rc, 0);
968 EXPECT_EQ(removed_record_handle, 1);
969 EXPECT_EQ(pldm_pdr_get_record_count(repo), 3u);
970
971 // Error case where the effceter ID is not present in the repo
972 uint32_t removed_rec_handle{};
973 rc = pldm_pdr_delete_by_effecter_id(repo, 15, false, &removed_rec_handle);
974 EXPECT_EQ(rc, 0);
975 EXPECT_EQ(removed_rec_handle, 0);
976 EXPECT_EQ(pldm_pdr_get_record_count(repo), 3u);
977
978 rc =
979 pldm_pdr_delete_by_effecter_id(repo, 20, false, &removed_record_handle);
980 EXPECT_EQ(rc, 0);
981 EXPECT_EQ(removed_record_handle, 4);
982 EXPECT_EQ(pldm_pdr_get_record_count(repo), 2u);
983
984 pldm_pdr_destroy(repo);
985}
986#endif
987
Andrew Jeffery9c766792022-08-10 23:12:49 +0930988TEST(EntityAssociationPDR, testInit)
989{
990 auto tree = pldm_entity_association_tree_init();
991 EXPECT_NE(tree, nullptr);
992 pldm_entity_association_tree_destroy(tree);
993}
994
995TEST(EntityAssociationPDR, testBuild)
996{
997 // 1
998 // |
999 // 2--3--4
1000 // |
1001 // 5--6--7
1002 // | |
1003 // 9 8
1004
1005 pldm_entity entities[9]{};
1006
1007 entities[0].entity_type = 1;
1008 entities[1].entity_type = 2;
1009 entities[2].entity_type = 2;
1010 entities[3].entity_type = 3;
1011 entities[4].entity_type = 4;
1012 entities[5].entity_type = 5;
1013 entities[6].entity_type = 5;
1014 entities[7].entity_type = 6;
1015 entities[8].entity_type = 7;
1016
1017 auto tree = pldm_entity_association_tree_init();
1018
1019 auto l1 = pldm_entity_association_tree_add(
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06001020 tree, &entities[0], 0xffff, nullptr, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
Andrew Jeffery9c766792022-08-10 23:12:49 +09301021 EXPECT_NE(l1, nullptr);
1022 auto l2a = pldm_entity_association_tree_add(
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06001023 tree, &entities[1], 0xffff, l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
Andrew Jeffery9c766792022-08-10 23:12:49 +09301024 EXPECT_NE(l2a, nullptr);
1025 auto l2b = pldm_entity_association_tree_add(
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06001026 tree, &entities[2], 0xffff, l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
Andrew Jeffery9c766792022-08-10 23:12:49 +09301027 EXPECT_NE(l2b, nullptr);
1028 auto l2c = pldm_entity_association_tree_add(
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06001029 tree, &entities[3], 0xffff, l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
Andrew Jeffery9c766792022-08-10 23:12:49 +09301030 EXPECT_NE(l2c, nullptr);
1031 auto l3a = pldm_entity_association_tree_add(
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06001032 tree, &entities[4], 0xffff, l2a, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
Andrew Jeffery9c766792022-08-10 23:12:49 +09301033 EXPECT_NE(l3a, nullptr);
1034 auto l3b = pldm_entity_association_tree_add(
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06001035 tree, &entities[5], 0xffff, l2a, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
Andrew Jeffery9c766792022-08-10 23:12:49 +09301036 EXPECT_NE(l3b, nullptr);
1037 auto l3c = pldm_entity_association_tree_add(
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06001038 tree, &entities[6], 0xffff, l2a, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
Andrew Jeffery9c766792022-08-10 23:12:49 +09301039 EXPECT_NE(l3b, nullptr);
1040 auto l4a = pldm_entity_association_tree_add(
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06001041 tree, &entities[7], 0xffff, l3a, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
Andrew Jeffery9c766792022-08-10 23:12:49 +09301042 EXPECT_NE(l4a, nullptr);
1043 auto l4b = pldm_entity_association_tree_add(
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06001044 tree, &entities[8], 0xffff, l3b, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
Andrew Jeffery9c766792022-08-10 23:12:49 +09301045 EXPECT_NE(l4b, nullptr);
1046
1047 EXPECT_EQ(pldm_entity_is_node_parent(l1), true);
1048 EXPECT_EQ(pldm_entity_is_node_parent(l2a), true);
1049 EXPECT_EQ(pldm_entity_is_node_parent(l3a), true);
1050 EXPECT_EQ(pldm_entity_is_node_parent(l3b), true);
1051
1052 EXPECT_EQ(pldm_entity_is_node_parent(l2b), false);
1053 EXPECT_EQ(pldm_entity_is_node_parent(l2c), false);
1054 EXPECT_EQ(pldm_entity_is_node_parent(l3c), false);
1055 EXPECT_EQ(pldm_entity_is_node_parent(l4a), false);
1056 EXPECT_EQ(pldm_entity_is_node_parent(l4b), false);
1057
1058 EXPECT_EQ(pldm_entity_is_exist_parent(l1), false);
1059
1060 pldm_entity nodeL1 = pldm_entity_extract(l1);
1061 pldm_entity parentL2a = pldm_entity_get_parent(l2a);
1062 pldm_entity parentL2b = pldm_entity_get_parent(l2b);
1063 pldm_entity parentL2c = pldm_entity_get_parent(l2c);
1064 EXPECT_EQ(pldm_entity_is_exist_parent(l2a), true);
1065 EXPECT_EQ(pldm_entity_is_exist_parent(l2b), true);
1066 EXPECT_EQ(pldm_entity_is_exist_parent(l2c), true);
1067 EXPECT_EQ(parentL2a.entity_type, nodeL1.entity_type);
1068 EXPECT_EQ(parentL2a.entity_instance_num, nodeL1.entity_instance_num);
1069 EXPECT_EQ(parentL2a.entity_container_id, nodeL1.entity_container_id);
1070 EXPECT_EQ(parentL2b.entity_type, nodeL1.entity_type);
1071 EXPECT_EQ(parentL2b.entity_instance_num, nodeL1.entity_instance_num);
1072 EXPECT_EQ(parentL2b.entity_container_id, nodeL1.entity_container_id);
1073 EXPECT_EQ(parentL2c.entity_type, nodeL1.entity_type);
1074 EXPECT_EQ(parentL2c.entity_instance_num, nodeL1.entity_instance_num);
1075 EXPECT_EQ(parentL2c.entity_container_id, nodeL1.entity_container_id);
1076
1077 pldm_entity nodeL2a = pldm_entity_extract(l2a);
1078 pldm_entity parentL3a = pldm_entity_get_parent(l3a);
1079 pldm_entity parentL3b = pldm_entity_get_parent(l3b);
1080 pldm_entity parentL3c = pldm_entity_get_parent(l3c);
1081 EXPECT_EQ(pldm_entity_is_exist_parent(l3a), true);
1082 EXPECT_EQ(pldm_entity_is_exist_parent(l3b), true);
1083 EXPECT_EQ(pldm_entity_is_exist_parent(l3c), true);
1084 EXPECT_EQ(parentL3a.entity_type, nodeL2a.entity_type);
1085 EXPECT_EQ(parentL3a.entity_instance_num, nodeL2a.entity_instance_num);
1086 EXPECT_EQ(parentL3a.entity_container_id, nodeL2a.entity_container_id);
1087 EXPECT_EQ(parentL3b.entity_type, nodeL2a.entity_type);
1088 EXPECT_EQ(parentL3b.entity_instance_num, nodeL2a.entity_instance_num);
1089 EXPECT_EQ(parentL3b.entity_container_id, nodeL2a.entity_container_id);
1090 EXPECT_EQ(parentL3c.entity_type, nodeL2a.entity_type);
1091 EXPECT_EQ(parentL3c.entity_instance_num, nodeL2a.entity_instance_num);
1092 EXPECT_EQ(parentL3c.entity_container_id, nodeL2a.entity_container_id);
1093
1094 pldm_entity nodeL3a = pldm_entity_extract(l3a);
1095 pldm_entity parentL4a = pldm_entity_get_parent(l4a);
1096 EXPECT_EQ(pldm_entity_is_exist_parent(l4a), true);
1097 EXPECT_EQ(parentL4a.entity_type, nodeL3a.entity_type);
1098 EXPECT_EQ(parentL4a.entity_instance_num, nodeL3a.entity_instance_num);
1099 EXPECT_EQ(parentL4a.entity_container_id, nodeL3a.entity_container_id);
1100
1101 pldm_entity nodeL3b = pldm_entity_extract(l3b);
1102 pldm_entity parentL4b = pldm_entity_get_parent(l4b);
1103 EXPECT_EQ(pldm_entity_is_exist_parent(l4b), true);
1104 EXPECT_EQ(parentL4b.entity_type, nodeL3b.entity_type);
1105 EXPECT_EQ(parentL4b.entity_instance_num, nodeL3b.entity_instance_num);
1106 EXPECT_EQ(parentL4b.entity_container_id, nodeL3b.entity_container_id);
1107
1108 size_t num{};
1109 pldm_entity* out = nullptr;
1110 pldm_entity_association_tree_visit(tree, &out, &num);
1111 EXPECT_EQ(num, 9u);
1112
1113 EXPECT_EQ(out[0].entity_type, 1u);
1114 EXPECT_EQ(out[0].entity_instance_num, 1u);
1115 EXPECT_EQ(out[0].entity_container_id, 0u);
1116
1117 EXPECT_EQ(out[1].entity_type, 2u);
1118 EXPECT_EQ(out[1].entity_instance_num, 1u);
1119 EXPECT_EQ(out[1].entity_container_id, 1u);
1120 EXPECT_EQ(out[2].entity_type, 2u);
1121 EXPECT_EQ(out[2].entity_instance_num, 2u);
1122 EXPECT_EQ(out[2].entity_container_id, 1u);
1123 EXPECT_EQ(out[3].entity_type, 3u);
1124 EXPECT_EQ(out[3].entity_instance_num, 1u);
1125 EXPECT_EQ(out[3].entity_container_id, 1u);
1126
1127 EXPECT_EQ(out[4].entity_type, 4u);
1128 EXPECT_EQ(out[4].entity_instance_num, 1u);
1129 EXPECT_EQ(out[4].entity_container_id, 2u);
1130 EXPECT_EQ(out[5].entity_type, 5u);
1131 EXPECT_EQ(out[5].entity_instance_num, 1u);
1132 EXPECT_EQ(out[5].entity_container_id, 2u);
1133 EXPECT_EQ(out[6].entity_type, 5u);
1134 EXPECT_EQ(out[6].entity_instance_num, 2u);
1135 EXPECT_EQ(out[6].entity_container_id, 2u);
1136
1137 EXPECT_EQ(out[7].entity_type, 7u);
1138 EXPECT_EQ(out[7].entity_instance_num, 1u);
1139 EXPECT_EQ(out[7].entity_container_id, 4u);
1140 EXPECT_EQ(out[8].entity_type, 6u);
1141 EXPECT_EQ(out[8].entity_instance_num, 1u);
1142 EXPECT_EQ(out[8].entity_container_id, 3u);
1143
1144 free(out);
1145
1146 pldm_entity p1 = pldm_entity_extract(l1);
1147 EXPECT_EQ(p1.entity_type, 1u);
1148 EXPECT_EQ(p1.entity_instance_num, 1u);
1149 EXPECT_EQ(p1.entity_container_id, 0u);
1150
1151 pldm_entity p2a = pldm_entity_extract(l2a);
1152 EXPECT_EQ(p2a.entity_type, 2u);
1153 EXPECT_EQ(p2a.entity_instance_num, 1u);
1154 EXPECT_EQ(p2a.entity_container_id, 1u);
1155 pldm_entity p2b = pldm_entity_extract(l2b);
1156 EXPECT_EQ(p2b.entity_type, 2u);
1157 EXPECT_EQ(p2b.entity_instance_num, 2u);
1158 EXPECT_EQ(p2b.entity_container_id, 1u);
1159 pldm_entity p2c = pldm_entity_extract(l2c);
1160 EXPECT_EQ(p2c.entity_type, 3u);
1161 EXPECT_EQ(p2c.entity_instance_num, 1u);
1162 EXPECT_EQ(p2c.entity_container_id, 1u);
1163
1164 pldm_entity p3a = pldm_entity_extract(l3a);
1165 EXPECT_EQ(p3a.entity_type, 4u);
1166 EXPECT_EQ(p3a.entity_instance_num, 1u);
1167 EXPECT_EQ(p3a.entity_container_id, 2u);
1168 pldm_entity p3b = pldm_entity_extract(l3b);
1169 EXPECT_EQ(p3b.entity_type, 5u);
1170 EXPECT_EQ(p3b.entity_instance_num, 1u);
1171 EXPECT_EQ(p3b.entity_container_id, 2u);
1172 pldm_entity p3c = pldm_entity_extract(l3c);
1173 EXPECT_EQ(p3c.entity_type, 5u);
1174 EXPECT_EQ(p3c.entity_instance_num, 2u);
1175 EXPECT_EQ(p3c.entity_container_id, 2u);
1176
1177 pldm_entity p4a = pldm_entity_extract(l4a);
1178 EXPECT_EQ(p4a.entity_type, 6u);
1179 EXPECT_EQ(p4a.entity_instance_num, 1u);
1180 EXPECT_EQ(p4a.entity_container_id, 3u);
1181 pldm_entity p4b = pldm_entity_extract(l4b);
1182 EXPECT_EQ(p4b.entity_type, 7u);
1183 EXPECT_EQ(p4b.entity_instance_num, 1u);
1184 EXPECT_EQ(p4b.entity_container_id, 4u);
1185
1186 pldm_entity_association_tree_destroy(tree);
1187}
1188
Pavithra Barithaya9947f9d2023-05-18 05:20:24 -05001189#if LIBPLDM_API_TESTING
1190TEST(EntityAssociationPDR, findAndAddRemotePDR)
1191{
1192 // Tree - 1
1193 //
1194 // 11521(1,0)
1195 // |
1196 // 45 (1,1)
1197 // |
1198 // 64 (1,2)
1199 // |
1200 // ------------------
1201 // | |
1202 // 67(0,3) 67(1,3)
1203 // | |
1204 // 135(0,4) 135(0,5)
1205 // | |
1206 // 32903(0,6) 32903(0,7)
1207
1208 pldm_entity entities[9]{};
1209 entities[0].entity_type = 11521;
1210 entities[1].entity_type = 45;
1211 entities[2].entity_type = 64;
1212 entities[3].entity_type = 67;
1213 entities[4].entity_type = 67;
1214 entities[5].entity_type = 135;
1215 entities[5].entity_container_id = 2;
1216 entities[6].entity_type = 135;
1217 entities[6].entity_container_id = 3;
1218 entities[7].entity_type = 32903;
1219 entities[8].entity_type = 32903;
1220 auto tree = pldm_entity_association_tree_init();
1221 auto l1 = pldm_entity_association_tree_add_entity(
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06001222 tree, &entities[0], 0xffff, nullptr, PLDM_ENTITY_ASSOCIAION_LOGICAL,
1223 false, true, 0xffff);
Pavithra Barithaya9947f9d2023-05-18 05:20:24 -05001224 EXPECT_NE(l1, nullptr);
1225 auto l2 = pldm_entity_association_tree_add_entity(
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06001226 tree, &entities[1], 0xffff, l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL, false,
1227 false, 0xffff);
Pavithra Barithaya9947f9d2023-05-18 05:20:24 -05001228 EXPECT_NE(l2, nullptr);
1229 auto l3 = pldm_entity_association_tree_add_entity(
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06001230 tree, &entities[2], 0xffff, l2, PLDM_ENTITY_ASSOCIAION_PHYSICAL, false,
1231 true, 0xffff);
Pavithra Barithaya9947f9d2023-05-18 05:20:24 -05001232 EXPECT_NE(l3, nullptr);
1233 auto l4a = pldm_entity_association_tree_add_entity(
1234 tree, &entities[3], 0, l3, PLDM_ENTITY_ASSOCIAION_PHYSICAL, false,
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06001235 false, 0xffff);
Pavithra Barithaya9947f9d2023-05-18 05:20:24 -05001236 EXPECT_NE(l4a, nullptr);
1237 auto l4b = pldm_entity_association_tree_add_entity(
1238 tree, &entities[4], 1, l3, PLDM_ENTITY_ASSOCIAION_PHYSICAL, true, true,
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06001239 0xffff);
Pavithra Barithaya9947f9d2023-05-18 05:20:24 -05001240 EXPECT_NE(l4b, nullptr);
1241 auto l5a = pldm_entity_association_tree_add_entity(
1242 tree, &entities[5], 0, l4a, PLDM_ENTITY_ASSOCIAION_PHYSICAL, false,
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06001243 false, 0xffff);
Pavithra Barithaya9947f9d2023-05-18 05:20:24 -05001244 EXPECT_NE(l5a, nullptr);
1245 auto l5b = pldm_entity_association_tree_add_entity(
1246 tree, &entities[6], 0, l4b, PLDM_ENTITY_ASSOCIAION_PHYSICAL, false,
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06001247 false, 0xffff);
Pavithra Barithaya9947f9d2023-05-18 05:20:24 -05001248 EXPECT_NE(l5b, nullptr);
1249 pldm_entity entity{};
1250 entity.entity_type = 135;
1251 entity.entity_instance_num = 0;
1252 entity.entity_container_id = 2;
1253 auto result1 = pldm_entity_association_tree_find(tree, &entity);
1254 EXPECT_EQ(result1, l5a);
1255 EXPECT_EQ(entities[5].entity_container_id, 2);
1256 auto l6a = pldm_entity_association_tree_add_entity(
1257 tree, &entities[7], 0, result1, PLDM_ENTITY_ASSOCIAION_PHYSICAL, false,
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06001258 false, 0xffff);
Pavithra Barithaya9947f9d2023-05-18 05:20:24 -05001259 EXPECT_NE(l6a, nullptr);
1260 entity.entity_type = 135;
1261 entity.entity_instance_num = 0;
1262 entity.entity_container_id = 3;
1263 auto result2 = pldm_entity_association_tree_find(tree, &entity);
1264 EXPECT_NE(result2, l5b);
1265 EXPECT_EQ(entities[6].entity_container_id, 3);
1266 auto l7a = pldm_entity_association_tree_add_entity(
1267 tree, &entities[8], 0, result2, PLDM_ENTITY_ASSOCIAION_PHYSICAL, false,
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06001268 false, 0xffff);
Pavithra Barithaya9947f9d2023-05-18 05:20:24 -05001269 EXPECT_EQ(l7a, nullptr);
1270 pldm_entity_association_tree_destroy(tree);
1271}
1272#endif
1273
Andrew Jeffery9c766792022-08-10 23:12:49 +09301274TEST(EntityAssociationPDR, testSpecialTrees)
1275{
1276 pldm_entity entities[3]{};
1277
1278 entities[0].entity_type = 1;
1279 entities[1].entity_type = 2;
1280 entities[2].entity_type = 1;
1281
1282 // A
1283 auto tree = pldm_entity_association_tree_init();
1284 auto node = pldm_entity_association_tree_add(
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06001285 tree, &entities[0], 0xffff, nullptr, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
Andrew Jeffery9c766792022-08-10 23:12:49 +09301286 EXPECT_NE(node, nullptr);
1287 size_t num{};
1288 pldm_entity* out = nullptr;
1289 pldm_entity_association_tree_visit(tree, &out, &num);
1290 EXPECT_EQ(num, 1u);
1291 EXPECT_EQ(out[0].entity_type, 1u);
1292 EXPECT_EQ(out[0].entity_instance_num, 1u);
1293 EXPECT_EQ(out[0].entity_container_id, 0u);
1294 free(out);
1295 pldm_entity_association_tree_destroy(tree);
1296
1297 // A-A-A
1298 tree = pldm_entity_association_tree_init();
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06001299 node = pldm_entity_association_tree_add(tree, &entities[0], 0xffff, nullptr,
Andrew Jeffery9c766792022-08-10 23:12:49 +09301300 PLDM_ENTITY_ASSOCIAION_PHYSICAL);
1301 EXPECT_NE(node, nullptr);
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06001302 node = pldm_entity_association_tree_add(tree, &entities[1], 0xffff, nullptr,
Andrew Jeffery9c766792022-08-10 23:12:49 +09301303 PLDM_ENTITY_ASSOCIAION_PHYSICAL);
1304 EXPECT_NE(node, nullptr);
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06001305 node = pldm_entity_association_tree_add(tree, &entities[2], 0xffff, nullptr,
Andrew Jeffery9c766792022-08-10 23:12:49 +09301306 PLDM_ENTITY_ASSOCIAION_PHYSICAL);
1307 EXPECT_NE(node, nullptr);
1308 pldm_entity_association_tree_visit(tree, &out, &num);
1309 EXPECT_EQ(num, 3u);
1310 EXPECT_EQ(out[0].entity_type, 1u);
1311 EXPECT_EQ(out[0].entity_instance_num, 1u);
1312 EXPECT_EQ(out[0].entity_container_id, 0u);
1313 EXPECT_EQ(out[1].entity_type, 1u);
1314 EXPECT_EQ(out[1].entity_instance_num, 2u);
1315 EXPECT_EQ(out[1].entity_container_id, 0u);
1316 EXPECT_EQ(out[2].entity_type, 2u);
1317 EXPECT_EQ(out[2].entity_instance_num, 1u);
1318 EXPECT_EQ(out[2].entity_container_id, 0u);
1319 free(out);
1320 pldm_entity_association_tree_destroy(tree);
1321
1322 // A
1323 // |
1324 // A
1325 // |
1326 // A
1327 tree = pldm_entity_association_tree_init();
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06001328 node = pldm_entity_association_tree_add(tree, &entities[0], 0xffff, nullptr,
Andrew Jeffery9c766792022-08-10 23:12:49 +09301329 PLDM_ENTITY_ASSOCIAION_PHYSICAL);
1330 EXPECT_NE(node, nullptr);
1331 auto node1 = pldm_entity_association_tree_add(
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06001332 tree, &entities[1], 0xffff, node, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
Andrew Jeffery9c766792022-08-10 23:12:49 +09301333 EXPECT_NE(node1, nullptr);
1334 auto node2 = pldm_entity_association_tree_add(
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06001335 tree, &entities[2], 0xffff, node1, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
Andrew Jeffery9c766792022-08-10 23:12:49 +09301336 EXPECT_NE(node2, nullptr);
1337 pldm_entity_association_tree_visit(tree, &out, &num);
1338 EXPECT_EQ(num, 3u);
1339 EXPECT_EQ(out[0].entity_type, 1u);
1340 EXPECT_EQ(out[0].entity_instance_num, 1u);
1341 EXPECT_EQ(out[0].entity_container_id, 0u);
1342 EXPECT_EQ(out[1].entity_type, 2u);
1343 EXPECT_EQ(out[1].entity_instance_num, 1u);
1344 EXPECT_EQ(out[1].entity_container_id, 1u);
1345 EXPECT_EQ(out[2].entity_type, 1u);
1346 EXPECT_EQ(out[2].entity_instance_num, 1u);
1347 EXPECT_EQ(out[2].entity_container_id, 2u);
1348 free(out);
1349 pldm_entity_association_tree_destroy(tree);
1350
1351 // A-A
1352 // |
1353 // A-A
1354 tree = pldm_entity_association_tree_init();
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06001355 node = pldm_entity_association_tree_add(tree, &entities[0], 0xffff, nullptr,
Andrew Jeffery9c766792022-08-10 23:12:49 +09301356 PLDM_ENTITY_ASSOCIAION_PHYSICAL);
1357 EXPECT_NE(node, nullptr);
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06001358 node = pldm_entity_association_tree_add(tree, &entities[0], 0xffff, nullptr,
Andrew Jeffery9c766792022-08-10 23:12:49 +09301359 PLDM_ENTITY_ASSOCIAION_PHYSICAL);
1360 EXPECT_NE(node, nullptr);
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06001361 node1 = pldm_entity_association_tree_add(tree, &entities[1], 0xffff, node,
Andrew Jeffery9c766792022-08-10 23:12:49 +09301362 PLDM_ENTITY_ASSOCIAION_PHYSICAL);
1363 EXPECT_NE(node1, nullptr);
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06001364 node2 = pldm_entity_association_tree_add(tree, &entities[2], 0xffff, node,
Andrew Jeffery9c766792022-08-10 23:12:49 +09301365 PLDM_ENTITY_ASSOCIAION_PHYSICAL);
1366 EXPECT_NE(node2, nullptr);
1367 pldm_entity_association_tree_visit(tree, &out, &num);
1368 EXPECT_EQ(num, 4u);
1369 EXPECT_EQ(out[0].entity_type, 1u);
1370 EXPECT_EQ(out[0].entity_instance_num, 1u);
1371 EXPECT_EQ(out[0].entity_container_id, 0u);
1372 EXPECT_EQ(out[1].entity_type, 1u);
1373 EXPECT_EQ(out[1].entity_instance_num, 2u);
1374 EXPECT_EQ(out[1].entity_container_id, 0u);
1375 EXPECT_EQ(out[2].entity_type, 2u);
1376 EXPECT_EQ(out[2].entity_instance_num, 1u);
1377 EXPECT_EQ(out[2].entity_container_id, 1u);
1378 EXPECT_EQ(out[3].entity_type, 1u);
1379 EXPECT_EQ(out[3].entity_instance_num, 1u);
1380 EXPECT_EQ(out[3].entity_container_id, 1u);
1381 free(out);
1382 pldm_entity_association_tree_destroy(tree);
1383}
1384
1385TEST(EntityAssociationPDR, testPDR)
1386{
1387 // e = entity type, c = container id, i = instance num
1388
1389 // INPUT
1390 // 1(e=1)--1a(e=2)
1391 // |
1392 // 2(e=2)--3(e=2)--4(e=2)--5(e=3)
1393 // |
1394 // 6(e=4)--7(e=5)--8(e=5)--9(e=5)
1395 // | |
1396 // 11(e=6) 10(e=7)
1397
1398 // Expected OUTPUT
1399 // 1(e=1,c=0,i=1)
1400 // |
1401 // 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)
1402 // |
1403 // 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)
1404 // | |
1405 // 10(e=6,c=3,i=1) 11(e=7,c=4,i=1)
1406 pldm_entity entities[11]{};
1407
1408 entities[0].entity_type = 1;
1409 entities[1].entity_type = 2;
1410 entities[2].entity_type = 3;
1411 entities[3].entity_type = 2;
1412 entities[4].entity_type = 3;
1413 entities[5].entity_type = 4;
1414 entities[6].entity_type = 5;
1415 entities[7].entity_type = 5;
1416 entities[8].entity_type = 5;
1417 entities[9].entity_type = 6;
1418 entities[10].entity_type = 7;
1419
1420 auto tree = pldm_entity_association_tree_init();
1421
1422 auto l1 = pldm_entity_association_tree_add(
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06001423 tree, &entities[0], 0xffff, nullptr, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
Andrew Jeffery9c766792022-08-10 23:12:49 +09301424 EXPECT_NE(l1, nullptr);
1425 auto l1a = pldm_entity_association_tree_add(
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06001426 tree, &entities[1], 0xffff, nullptr, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
Andrew Jeffery9c766792022-08-10 23:12:49 +09301427 EXPECT_NE(l1a, nullptr);
1428
1429 auto l2a = pldm_entity_association_tree_add(
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06001430 tree, &entities[1], 0xffff, l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
Andrew Jeffery9c766792022-08-10 23:12:49 +09301431 EXPECT_NE(l2a, nullptr);
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06001432 auto l2b = pldm_entity_association_tree_add(tree, &entities[2], 0xffff, l1,
Andrew Jeffery9c766792022-08-10 23:12:49 +09301433 PLDM_ENTITY_ASSOCIAION_LOGICAL);
1434 EXPECT_NE(l2b, nullptr);
1435 auto l2c = pldm_entity_association_tree_add(
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06001436 tree, &entities[3], 0xffff, l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
Andrew Jeffery9c766792022-08-10 23:12:49 +09301437 EXPECT_NE(l2c, nullptr);
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06001438 auto l2d = pldm_entity_association_tree_add(tree, &entities[4], 0xffff, l1,
Andrew Jeffery9c766792022-08-10 23:12:49 +09301439 PLDM_ENTITY_ASSOCIAION_LOGICAL);
1440 EXPECT_NE(l2d, nullptr);
1441
1442 auto l3a = pldm_entity_association_tree_add(
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06001443 tree, &entities[5], 0xffff, l2a, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
Andrew Jeffery9c766792022-08-10 23:12:49 +09301444 EXPECT_NE(l3a, nullptr);
1445 auto l3b = pldm_entity_association_tree_add(
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06001446 tree, &entities[6], 0xffff, l2a, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
Andrew Jeffery9c766792022-08-10 23:12:49 +09301447 EXPECT_NE(l3b, nullptr);
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06001448 auto l3c = pldm_entity_association_tree_add(tree, &entities[7], 0xffff, l2a,
Andrew Jeffery9c766792022-08-10 23:12:49 +09301449 PLDM_ENTITY_ASSOCIAION_LOGICAL);
1450 EXPECT_NE(l3c, nullptr);
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06001451 auto l3d = pldm_entity_association_tree_add(tree, &entities[8], 0xffff, l2a,
Andrew Jeffery9c766792022-08-10 23:12:49 +09301452 PLDM_ENTITY_ASSOCIAION_LOGICAL);
1453 EXPECT_NE(l3d, nullptr);
1454
1455 auto l4a = pldm_entity_association_tree_add(
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06001456 tree, &entities[9], 0xffff, l3a, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
Andrew Jeffery9c766792022-08-10 23:12:49 +09301457 EXPECT_NE(l4a, nullptr);
1458 auto l4b = pldm_entity_association_tree_add(
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06001459 tree, &entities[10], 0xffff, l3b, PLDM_ENTITY_ASSOCIAION_LOGICAL);
Andrew Jeffery9c766792022-08-10 23:12:49 +09301460 EXPECT_NE(l4b, nullptr);
1461
1462 EXPECT_EQ(pldm_entity_get_num_children(l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL),
1463 2);
1464 EXPECT_EQ(pldm_entity_get_num_children(l1, PLDM_ENTITY_ASSOCIAION_LOGICAL),
1465 2);
1466 EXPECT_EQ(
1467 pldm_entity_get_num_children(l2a, PLDM_ENTITY_ASSOCIAION_PHYSICAL), 2);
1468 EXPECT_EQ(
1469 pldm_entity_get_num_children(l3b, PLDM_ENTITY_ASSOCIAION_PHYSICAL), 0);
1470 EXPECT_EQ(pldm_entity_get_num_children(l3b, PLDM_ENTITY_ASSOCIAION_LOGICAL),
1471 1);
1472
1473 auto repo = pldm_pdr_init();
Andrew Jefferyd72ea4b2024-06-24 21:33:33 +09301474 int rc = pldm_entity_association_pdr_add(tree, repo, false, 1);
Andrew Jeffery255f6542023-08-10 15:46:54 +09301475 ASSERT_EQ(rc, 0);
Andrew Jeffery9c766792022-08-10 23:12:49 +09301476
1477 EXPECT_EQ(pldm_pdr_get_record_count(repo), 6u);
1478
1479 uint32_t currRecHandle{};
1480 uint32_t nextRecHandle{};
1481 uint8_t* data = nullptr;
1482 uint32_t size{};
1483 uint32_t commonSize = sizeof(struct pldm_pdr_hdr) + sizeof(uint16_t) +
1484 sizeof(uint8_t) + sizeof(pldm_entity) +
1485 sizeof(uint8_t);
1486
1487 pldm_pdr_find_record(repo, currRecHandle, &data, &size, &nextRecHandle);
1488 EXPECT_EQ(size, commonSize + (pldm_entity_get_num_children(
1489 l1, PLDM_ENTITY_ASSOCIAION_LOGICAL) *
1490 sizeof(pldm_entity)));
1491 uint8_t* start = data;
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +09301492 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Andrew Jeffery9c766792022-08-10 23:12:49 +09301493 pldm_pdr_hdr* hdr = reinterpret_cast<pldm_pdr_hdr*>(start);
1494 EXPECT_EQ(le32toh(hdr->record_handle), 1u);
1495 EXPECT_EQ(hdr->type, PLDM_PDR_ENTITY_ASSOCIATION);
1496 EXPECT_EQ(le16toh(hdr->length), size - sizeof(struct pldm_pdr_hdr));
1497 start += sizeof(pldm_pdr_hdr);
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +09301498 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Andrew Jeffery9c766792022-08-10 23:12:49 +09301499 uint16_t* containerId = reinterpret_cast<uint16_t*>(start);
1500 EXPECT_EQ(le16toh(*containerId), 1u);
1501 start += sizeof(uint16_t);
1502 EXPECT_EQ(*start, PLDM_ENTITY_ASSOCIAION_LOGICAL);
1503 start += sizeof(uint8_t);
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +09301504 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Andrew Jeffery9c766792022-08-10 23:12:49 +09301505 pldm_entity* entity = reinterpret_cast<pldm_entity*>(start);
1506 EXPECT_EQ(le16toh(entity->entity_type), 1u);
1507 EXPECT_EQ(le16toh(entity->entity_instance_num), 1u);
1508 EXPECT_EQ(le16toh(entity->entity_container_id), 0u);
1509 start += sizeof(pldm_entity);
1510 EXPECT_EQ(*start,
1511 pldm_entity_get_num_children(l1, PLDM_ENTITY_ASSOCIAION_LOGICAL));
1512 start += sizeof(uint8_t);
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +09301513 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Andrew Jeffery9c766792022-08-10 23:12:49 +09301514 entity = reinterpret_cast<pldm_entity*>(start);
1515 EXPECT_EQ(le16toh(entity->entity_type), 3u);
1516 EXPECT_EQ(le16toh(entity->entity_instance_num), 1u);
1517 EXPECT_EQ(le16toh(entity->entity_container_id), 1u);
1518 start += sizeof(pldm_entity);
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +09301519 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Andrew Jeffery9c766792022-08-10 23:12:49 +09301520 entity = reinterpret_cast<pldm_entity*>(start);
1521 EXPECT_EQ(le16toh(entity->entity_type), 3u);
1522 EXPECT_EQ(le16toh(entity->entity_instance_num), 2u);
1523 EXPECT_EQ(le16toh(entity->entity_container_id), 1u);
Andrew Jeffery9c766792022-08-10 23:12:49 +09301524
1525 currRecHandle = nextRecHandle;
1526
1527 pldm_pdr_find_record(repo, currRecHandle, &data, &size, &nextRecHandle);
1528 EXPECT_EQ(size, commonSize + (pldm_entity_get_num_children(
1529 l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL) *
1530 sizeof(pldm_entity)));
1531 start = data;
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +09301532 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Andrew Jeffery9c766792022-08-10 23:12:49 +09301533 hdr = reinterpret_cast<pldm_pdr_hdr*>(start);
1534 EXPECT_EQ(le32toh(hdr->record_handle), 2u);
1535 EXPECT_EQ(hdr->type, PLDM_PDR_ENTITY_ASSOCIATION);
1536 EXPECT_EQ(le16toh(hdr->length), size - sizeof(struct pldm_pdr_hdr));
1537 start += sizeof(pldm_pdr_hdr);
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +09301538 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Andrew Jeffery9c766792022-08-10 23:12:49 +09301539 containerId = reinterpret_cast<uint16_t*>(start);
1540 EXPECT_EQ(le16toh(*containerId), 1u);
1541 start += sizeof(uint16_t);
1542 EXPECT_EQ(*start, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
1543 start += sizeof(uint8_t);
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +09301544 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Andrew Jeffery9c766792022-08-10 23:12:49 +09301545 entity = reinterpret_cast<pldm_entity*>(start);
1546 EXPECT_EQ(le16toh(entity->entity_type), 1u);
1547 EXPECT_EQ(le16toh(entity->entity_instance_num), 1u);
1548 EXPECT_EQ(le16toh(entity->entity_container_id), 0u);
1549 start += sizeof(pldm_entity);
1550 EXPECT_EQ(*start, pldm_entity_get_num_children(
1551 l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL));
1552 start += sizeof(uint8_t);
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +09301553 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Andrew Jeffery9c766792022-08-10 23:12:49 +09301554 entity = reinterpret_cast<pldm_entity*>(start);
1555 EXPECT_EQ(le16toh(entity->entity_type), 2u);
1556 EXPECT_EQ(le16toh(entity->entity_instance_num), 1u);
1557 EXPECT_EQ(le16toh(entity->entity_container_id), 1u);
1558 start += sizeof(pldm_entity);
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +09301559 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Andrew Jeffery9c766792022-08-10 23:12:49 +09301560 entity = reinterpret_cast<pldm_entity*>(start);
1561 EXPECT_EQ(le16toh(entity->entity_type), 2u);
1562 EXPECT_EQ(le16toh(entity->entity_instance_num), 2u);
1563 EXPECT_EQ(le16toh(entity->entity_container_id), 1u);
Andrew Jeffery9c766792022-08-10 23:12:49 +09301564
1565 currRecHandle = nextRecHandle;
1566
1567 pldm_pdr_find_record(repo, currRecHandle, &data, &size, &nextRecHandle);
1568 EXPECT_EQ(size, commonSize + (pldm_entity_get_num_children(
1569 l2a, PLDM_ENTITY_ASSOCIAION_LOGICAL) *
1570 sizeof(pldm_entity)));
1571 start = data;
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +09301572 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Andrew Jeffery9c766792022-08-10 23:12:49 +09301573 hdr = reinterpret_cast<pldm_pdr_hdr*>(start);
1574 EXPECT_EQ(le32toh(hdr->record_handle), 3u);
1575 EXPECT_EQ(hdr->type, PLDM_PDR_ENTITY_ASSOCIATION);
1576 EXPECT_EQ(le16toh(hdr->length), size - sizeof(struct pldm_pdr_hdr));
1577 start += sizeof(pldm_pdr_hdr);
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +09301578 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Andrew Jeffery9c766792022-08-10 23:12:49 +09301579 containerId = reinterpret_cast<uint16_t*>(start);
1580 EXPECT_EQ(le16toh(*containerId), 2u);
1581 start += sizeof(uint16_t);
1582 EXPECT_EQ(*start, PLDM_ENTITY_ASSOCIAION_LOGICAL);
1583 start += sizeof(uint8_t);
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +09301584 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Andrew Jeffery9c766792022-08-10 23:12:49 +09301585 entity = reinterpret_cast<pldm_entity*>(start);
1586 EXPECT_EQ(le16toh(entity->entity_type), 2u);
1587 EXPECT_EQ(le16toh(entity->entity_instance_num), 1u);
1588 EXPECT_EQ(le16toh(entity->entity_container_id), 1u);
1589 start += sizeof(pldm_entity);
1590 EXPECT_EQ(*start, pldm_entity_get_num_children(
1591 l2a, PLDM_ENTITY_ASSOCIAION_LOGICAL));
1592 start += sizeof(uint8_t);
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +09301593 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Andrew Jeffery9c766792022-08-10 23:12:49 +09301594 entity = reinterpret_cast<pldm_entity*>(start);
1595 EXPECT_EQ(le16toh(entity->entity_type), 5);
1596 EXPECT_EQ(le16toh(entity->entity_instance_num), 2u);
1597 EXPECT_EQ(le16toh(entity->entity_container_id), 2u);
1598 start += sizeof(pldm_entity);
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +09301599 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Andrew Jeffery9c766792022-08-10 23:12:49 +09301600 entity = reinterpret_cast<pldm_entity*>(start);
1601 EXPECT_EQ(le16toh(entity->entity_type), 5u);
1602 EXPECT_EQ(le16toh(entity->entity_instance_num), 3u);
1603 EXPECT_EQ(le16toh(entity->entity_container_id), 2u);
Andrew Jeffery9c766792022-08-10 23:12:49 +09301604
1605 currRecHandle = nextRecHandle;
1606
1607 pldm_pdr_find_record(repo, currRecHandle, &data, &size, &nextRecHandle);
1608 EXPECT_EQ(size, commonSize + (pldm_entity_get_num_children(
1609 l2a, PLDM_ENTITY_ASSOCIAION_PHYSICAL) *
1610 sizeof(pldm_entity)));
1611 start = data;
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +09301612 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Andrew Jeffery9c766792022-08-10 23:12:49 +09301613 hdr = reinterpret_cast<pldm_pdr_hdr*>(start);
1614 EXPECT_EQ(le32toh(hdr->record_handle), 4u);
1615 EXPECT_EQ(hdr->type, PLDM_PDR_ENTITY_ASSOCIATION);
1616 EXPECT_EQ(le16toh(hdr->length), size - sizeof(struct pldm_pdr_hdr));
1617 start += sizeof(pldm_pdr_hdr);
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +09301618 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Andrew Jeffery9c766792022-08-10 23:12:49 +09301619 containerId = reinterpret_cast<uint16_t*>(start);
1620 EXPECT_EQ(le16toh(*containerId), 2u);
1621 start += sizeof(uint16_t);
1622 EXPECT_EQ(*start, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
1623 start += sizeof(uint8_t);
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +09301624 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Andrew Jeffery9c766792022-08-10 23:12:49 +09301625 entity = reinterpret_cast<pldm_entity*>(start);
1626 EXPECT_EQ(le16toh(entity->entity_type), 2u);
1627 EXPECT_EQ(le16toh(entity->entity_instance_num), 1u);
1628 EXPECT_EQ(le16toh(entity->entity_container_id), 1u);
1629 start += sizeof(pldm_entity);
1630 EXPECT_EQ(*start, pldm_entity_get_num_children(
1631 l2a, PLDM_ENTITY_ASSOCIAION_PHYSICAL));
1632 start += sizeof(uint8_t);
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +09301633 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Andrew Jeffery9c766792022-08-10 23:12:49 +09301634 entity = reinterpret_cast<pldm_entity*>(start);
1635 EXPECT_EQ(le16toh(entity->entity_type), 4u);
1636 EXPECT_EQ(le16toh(entity->entity_instance_num), 1u);
1637 EXPECT_EQ(le16toh(entity->entity_container_id), 2u);
1638 start += sizeof(pldm_entity);
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +09301639 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Andrew Jeffery9c766792022-08-10 23:12:49 +09301640 entity = reinterpret_cast<pldm_entity*>(start);
1641 EXPECT_EQ(le16toh(entity->entity_type), 5u);
1642 EXPECT_EQ(le16toh(entity->entity_instance_num), 1u);
1643 EXPECT_EQ(le16toh(entity->entity_container_id), 2u);
Andrew Jeffery9c766792022-08-10 23:12:49 +09301644
1645 currRecHandle = nextRecHandle;
1646
1647 pldm_pdr_find_record(repo, currRecHandle, &data, &size, &nextRecHandle);
1648 EXPECT_EQ(size, commonSize + (pldm_entity_get_num_children(
1649 l3a, PLDM_ENTITY_ASSOCIAION_PHYSICAL) *
1650 sizeof(pldm_entity)));
1651 start = data;
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +09301652 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Andrew Jeffery9c766792022-08-10 23:12:49 +09301653 hdr = reinterpret_cast<pldm_pdr_hdr*>(start);
1654 EXPECT_EQ(le32toh(hdr->record_handle), 5u);
1655 EXPECT_EQ(hdr->type, PLDM_PDR_ENTITY_ASSOCIATION);
1656 EXPECT_EQ(le16toh(hdr->length), size - sizeof(struct pldm_pdr_hdr));
1657 start += sizeof(pldm_pdr_hdr);
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +09301658 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Andrew Jeffery9c766792022-08-10 23:12:49 +09301659 containerId = reinterpret_cast<uint16_t*>(start);
1660 EXPECT_EQ(le16toh(*containerId), 3u);
1661 start += sizeof(uint16_t);
1662 EXPECT_EQ(*start, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
1663 start += sizeof(uint8_t);
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +09301664 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Andrew Jeffery9c766792022-08-10 23:12:49 +09301665 entity = reinterpret_cast<pldm_entity*>(start);
1666 EXPECT_EQ(le16toh(entity->entity_type), 4u);
1667 EXPECT_EQ(le16toh(entity->entity_instance_num), 1u);
1668 EXPECT_EQ(le16toh(entity->entity_container_id), 2u);
1669 start += sizeof(pldm_entity);
1670 EXPECT_EQ(*start, pldm_entity_get_num_children(
1671 l3a, PLDM_ENTITY_ASSOCIAION_PHYSICAL));
1672 start += sizeof(uint8_t);
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +09301673 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Andrew Jeffery9c766792022-08-10 23:12:49 +09301674 entity = reinterpret_cast<pldm_entity*>(start);
1675 EXPECT_EQ(le16toh(entity->entity_type), 6u);
1676 EXPECT_EQ(le16toh(entity->entity_instance_num), 1u);
1677 EXPECT_EQ(le16toh(entity->entity_container_id), 3u);
Andrew Jeffery9c766792022-08-10 23:12:49 +09301678
1679 currRecHandle = nextRecHandle;
1680
1681 pldm_pdr_find_record(repo, currRecHandle, &data, &size, &nextRecHandle);
1682 EXPECT_EQ(size, commonSize + (pldm_entity_get_num_children(
1683 l3b, PLDM_ENTITY_ASSOCIAION_LOGICAL) *
1684 sizeof(pldm_entity)));
1685 start = data;
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +09301686 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Andrew Jeffery9c766792022-08-10 23:12:49 +09301687 hdr = reinterpret_cast<pldm_pdr_hdr*>(start);
1688 EXPECT_EQ(le32toh(hdr->record_handle), 6u);
1689 EXPECT_EQ(hdr->type, PLDM_PDR_ENTITY_ASSOCIATION);
1690 EXPECT_EQ(le16toh(hdr->length), size - sizeof(struct pldm_pdr_hdr));
1691 start += sizeof(pldm_pdr_hdr);
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +09301692 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Andrew Jeffery9c766792022-08-10 23:12:49 +09301693 containerId = reinterpret_cast<uint16_t*>(start);
1694 EXPECT_EQ(le16toh(*containerId), 4u);
1695 start += sizeof(uint16_t);
1696 EXPECT_EQ(*start, PLDM_ENTITY_ASSOCIAION_LOGICAL);
1697 start += sizeof(uint8_t);
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +09301698 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Andrew Jeffery9c766792022-08-10 23:12:49 +09301699 entity = reinterpret_cast<pldm_entity*>(start);
1700 EXPECT_EQ(le16toh(entity->entity_type), 5u);
1701 EXPECT_EQ(le16toh(entity->entity_instance_num), 1u);
1702 EXPECT_EQ(le16toh(entity->entity_container_id), 2u);
1703 start += sizeof(pldm_entity);
1704 EXPECT_EQ(*start, pldm_entity_get_num_children(
1705 l3b, PLDM_ENTITY_ASSOCIAION_LOGICAL));
1706 start += sizeof(uint8_t);
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +09301707 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Andrew Jeffery9c766792022-08-10 23:12:49 +09301708 entity = reinterpret_cast<pldm_entity*>(start);
1709 EXPECT_EQ(le16toh(entity->entity_type), 7u);
1710 EXPECT_EQ(le16toh(entity->entity_instance_num), 1u);
1711 EXPECT_EQ(le16toh(entity->entity_container_id), 4u);
1712
1713 EXPECT_EQ(nextRecHandle, 0u);
1714
1715 pldm_pdr_destroy(repo);
1716 pldm_entity_association_tree_destroy(tree);
1717}
1718
Archana Kakanibc40dd52024-08-02 00:10:44 -05001719TEST(EntityAssociationPDR, testPDRWithRecordHandle)
1720{
1721 // e = entity type, c = container id, i = instance num
1722
1723 // INPUT
1724 // 1(e=1)
1725 // |
1726 // 2(e=2)--3(e=2)
1727
1728 // Expected OUTPUT
1729 // 1(e=1,c=0,i=1)
1730 // |
1731 // 2(e=2,c=1,i=1)--3(e=2,c=1,i=2)
1732
1733 pldm_entity entities[3] = {{1, 1, 0}, {2, 1, 1}, {3, 1, 1}};
1734 pldm_entity_test testEntities[3] = {{1, 1, 0}, {2, 1, 1}, {3, 1, 1}};
1735
1736 auto tree = pldm_entity_association_tree_init();
1737
1738 auto l1 = pldm_entity_association_tree_add(
1739 tree, &entities[0], 0xffff, nullptr, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
1740 ASSERT_NE(l1, nullptr);
1741
1742 auto l2a = pldm_entity_association_tree_add(
1743 tree, &entities[1], 0xffff, l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
1744 ASSERT_NE(l2a, nullptr);
1745 pldm_entity_association_tree_add(tree, &entities[2], 0xffff, l1,
1746 PLDM_ENTITY_ASSOCIAION_LOGICAL);
1747 auto repo = pldm_pdr_init();
1748 pldm_entity* l_entities = entities;
1749
1750 pldm_entity_node* node = nullptr;
1751 pldm_find_entity_ref_in_tree(tree, entities[0], &node);
1752
1753 ASSERT_NE(node, nullptr);
1754
1755 int numEntities = 3;
1756 pldm_entity_association_pdr_add_from_node_with_record_handle(
1757 node, repo, &l_entities, numEntities, true, 1, (10));
1758
1759 EXPECT_EQ(pldm_pdr_get_record_count(repo), 2u);
1760
1761 uint32_t currRecHandle{};
1762 uint32_t nextRecHandle{};
1763 uint8_t* data = nullptr;
1764 uint32_t size{};
1765
1766 pldm_pdr_find_record(repo, currRecHandle, &data, &size, &nextRecHandle);
1767
1768 struct pldm_msgbuf _buf;
1769 struct pldm_msgbuf* buf = &_buf;
1770
1771 auto rc =
1772 pldm_msgbuf_init_errno(buf,
1773 (sizeof(struct pldm_pdr_hdr) +
1774 sizeof(struct pldm_pdr_entity_association)),
1775 data, size);
1776 ASSERT_EQ(rc, 0);
1777
1778 pldm_association_pdr_test association_pdr = pldm_association_pdr_test{
1779 10,
1780 1,
1781 PLDM_PDR_ENTITY_ASSOCIATION,
1782 1,
1783 static_cast<uint16_t>(size - sizeof(struct pldm_pdr_hdr)),
1784 1,
1785 PLDM_ENTITY_ASSOCIAION_LOGICAL,
1786 1};
1787
1788 verifyEntityAssociationPdr(buf, association_pdr, testEntities[0],
1789 testEntities[2]);
1790
1791 currRecHandle = nextRecHandle;
1792 pldm_pdr_find_record(repo, currRecHandle, &data, &size, &nextRecHandle);
1793 rc = pldm_msgbuf_init_errno(buf,
1794 (sizeof(struct pldm_pdr_hdr) +
1795 sizeof(struct pldm_pdr_entity_association)),
1796 data, size);
1797 ASSERT_EQ(rc, 0);
1798
1799 pldm_association_pdr_test association_pdr1 = pldm_association_pdr_test{
1800 11,
1801 1,
1802 PLDM_PDR_ENTITY_ASSOCIATION,
1803 1,
1804 static_cast<uint16_t>(size - sizeof(struct pldm_pdr_hdr)),
1805 1,
1806 PLDM_ENTITY_ASSOCIAION_PHYSICAL,
1807 1};
1808
1809 verifyEntityAssociationPdr(buf, association_pdr1, testEntities[0],
1810 testEntities[1]);
1811
1812 pldm_pdr_destroy(repo);
1813 pldm_entity_association_tree_destroy(tree);
1814}
1815
Andrew Jeffery9c766792022-08-10 23:12:49 +09301816TEST(EntityAssociationPDR, testFind)
1817{
1818 // 1
1819 // |
1820 // 2--3--4
1821 // |
1822 // 5--6--7
1823 // | |
1824 // 8 9
1825
1826 pldm_entity entities[9]{};
1827
1828 entities[0].entity_type = 1;
1829 entities[1].entity_type = 2;
1830 entities[2].entity_type = 2;
1831 entities[3].entity_type = 3;
1832 entities[4].entity_type = 4;
1833 entities[5].entity_type = 5;
1834 entities[6].entity_type = 5;
1835 entities[7].entity_type = 6;
1836 entities[8].entity_type = 7;
1837
1838 auto tree = pldm_entity_association_tree_init();
1839
1840 auto l1 = pldm_entity_association_tree_add(
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06001841 tree, &entities[0], 0xffff, nullptr, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
Andrew Jeffery9c766792022-08-10 23:12:49 +09301842 EXPECT_NE(l1, nullptr);
1843 auto l2a = pldm_entity_association_tree_add(
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06001844 tree, &entities[1], 0xffff, l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
Andrew Jeffery9c766792022-08-10 23:12:49 +09301845 EXPECT_NE(l2a, nullptr);
1846 auto l2b = pldm_entity_association_tree_add(
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06001847 tree, &entities[2], 0xffff, l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
Andrew Jeffery9c766792022-08-10 23:12:49 +09301848 EXPECT_NE(l2b, nullptr);
1849 auto l2c = pldm_entity_association_tree_add(
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06001850 tree, &entities[3], 0xffff, l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
Andrew Jeffery9c766792022-08-10 23:12:49 +09301851 EXPECT_NE(l2c, nullptr);
1852 auto l3a = pldm_entity_association_tree_add(
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06001853 tree, &entities[4], 0xffff, l2a, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
Andrew Jeffery9c766792022-08-10 23:12:49 +09301854 EXPECT_NE(l3a, nullptr);
1855 auto l3b = pldm_entity_association_tree_add(
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06001856 tree, &entities[5], 0xffff, l2a, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
Andrew Jeffery9c766792022-08-10 23:12:49 +09301857 EXPECT_NE(l3b, nullptr);
1858 auto l3c = pldm_entity_association_tree_add(
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06001859 tree, &entities[6], 0xffff, l2a, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
Andrew Jeffery9c766792022-08-10 23:12:49 +09301860 EXPECT_NE(l3c, nullptr);
1861 auto l4a = pldm_entity_association_tree_add(
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06001862 tree, &entities[7], 0xffff, l3a, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
Andrew Jeffery9c766792022-08-10 23:12:49 +09301863 EXPECT_NE(l4a, nullptr);
1864 auto l4b = pldm_entity_association_tree_add(
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06001865 tree, &entities[8], 0xffff, l3b, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
Andrew Jeffery9c766792022-08-10 23:12:49 +09301866 EXPECT_NE(l4b, nullptr);
1867
1868 pldm_entity entity{};
1869
1870 entity.entity_type = 1;
1871 entity.entity_instance_num = 1;
1872 auto result = pldm_entity_association_tree_find(tree, &entity);
1873 EXPECT_EQ(result, l1);
1874 EXPECT_EQ(entity.entity_container_id, 0);
1875
1876 entity.entity_type = 2;
1877 entity.entity_instance_num = 1;
1878 result = pldm_entity_association_tree_find(tree, &entity);
1879 EXPECT_EQ(result, l2a);
1880 EXPECT_EQ(entity.entity_container_id, 1);
1881 entity.entity_type = 2;
1882 entity.entity_instance_num = 2;
1883 result = pldm_entity_association_tree_find(tree, &entity);
1884 EXPECT_EQ(result, l2b);
1885 EXPECT_EQ(entity.entity_container_id, 1);
1886 entity.entity_type = 3;
1887 entity.entity_instance_num = 1;
1888 result = pldm_entity_association_tree_find(tree, &entity);
1889 EXPECT_EQ(result, l2c);
1890 EXPECT_EQ(entity.entity_container_id, 1);
1891
1892 entity.entity_type = 7;
1893 entity.entity_instance_num = 1;
1894 result = pldm_entity_association_tree_find(tree, &entity);
1895 EXPECT_EQ(result, l4b);
1896 EXPECT_EQ(entity.entity_container_id, 4);
1897
1898 pldm_entity_association_tree_destroy(tree);
1899}
1900
Andrew Jeffery60582152024-09-22 21:16:38 +09301901#ifdef LIBPLDM_API_TESTING
Andrew Jeffery9c766792022-08-10 23:12:49 +09301902TEST(EntityAssociationPDR, testCopyTree)
1903{
1904 pldm_entity entities[4]{};
Andrew Jeffery60582152024-09-22 21:16:38 +09301905 int rc;
1906
Andrew Jeffery9c766792022-08-10 23:12:49 +09301907 entities[0].entity_type = 1;
1908 entities[1].entity_type = 2;
1909 entities[2].entity_type = 2;
1910 entities[3].entity_type = 3;
1911
1912 auto orgTree = pldm_entity_association_tree_init();
1913 auto newTree = pldm_entity_association_tree_init();
1914 auto l1 =
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06001915 pldm_entity_association_tree_add(orgTree, &entities[0], 0xffff, nullptr,
Andrew Jeffery9c766792022-08-10 23:12:49 +09301916 PLDM_ENTITY_ASSOCIAION_PHYSICAL);
1917 EXPECT_NE(l1, nullptr);
1918 auto l2a = pldm_entity_association_tree_add(
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06001919 orgTree, &entities[1], 0xffff, l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
Andrew Jeffery9c766792022-08-10 23:12:49 +09301920 EXPECT_NE(l2a, nullptr);
1921 auto l2b = pldm_entity_association_tree_add(
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06001922 orgTree, &entities[2], 0xffff, l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
Andrew Jeffery9c766792022-08-10 23:12:49 +09301923 EXPECT_NE(l2b, nullptr);
1924 auto l2c = pldm_entity_association_tree_add(
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06001925 orgTree, &entities[3], 0xffff, l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
Andrew Jeffery9c766792022-08-10 23:12:49 +09301926 EXPECT_NE(l2c, nullptr);
1927 size_t orgNum{};
1928 pldm_entity* orgOut = nullptr;
1929 pldm_entity_association_tree_visit(orgTree, &orgOut, &orgNum);
1930 EXPECT_EQ(orgNum, 4u);
1931
Andrew Jeffery60582152024-09-22 21:16:38 +09301932 rc = pldm_entity_association_tree_copy_root_check(orgTree, newTree);
1933 ASSERT_EQ(rc, 0);
Andrew Jeffery9c766792022-08-10 23:12:49 +09301934 size_t newNum{};
1935 pldm_entity* newOut = nullptr;
1936 pldm_entity_association_tree_visit(newTree, &newOut, &newNum);
1937 EXPECT_EQ(newNum, orgNum);
1938 EXPECT_EQ(newOut[0].entity_type, 1u);
1939 EXPECT_EQ(newOut[0].entity_instance_num, 1u);
1940 EXPECT_EQ(newOut[0].entity_container_id, 0u);
1941 free(orgOut);
1942 free(newOut);
1943 pldm_entity_association_tree_destroy(orgTree);
1944 pldm_entity_association_tree_destroy(newTree);
1945}
Andrew Jeffery60582152024-09-22 21:16:38 +09301946#endif
Andrew Jeffery9c766792022-08-10 23:12:49 +09301947
1948TEST(EntityAssociationPDR, testExtract)
1949{
1950 std::vector<uint8_t> pdr{};
1951 pdr.resize(sizeof(pldm_pdr_hdr) + sizeof(pldm_pdr_entity_association) +
Archana Kakanibc40dd52024-08-02 00:10:44 -05001952 sizeof(pldm_entity) * 4);
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +09301953 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Andrew Jeffery9c766792022-08-10 23:12:49 +09301954 pldm_pdr_hdr* hdr = reinterpret_cast<pldm_pdr_hdr*>(pdr.data());
1955 hdr->type = PLDM_PDR_ENTITY_ASSOCIATION;
1956 hdr->length =
Archana Kakanibc40dd52024-08-02 00:10:44 -05001957 htole16(sizeof(pldm_pdr_entity_association) + sizeof(pldm_entity) * 4);
Andrew Jeffery9c766792022-08-10 23:12:49 +09301958
1959 pldm_pdr_entity_association* e =
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +09301960 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Andrew Jeffery9c766792022-08-10 23:12:49 +09301961 reinterpret_cast<pldm_pdr_entity_association*>(pdr.data() +
1962 sizeof(pldm_pdr_hdr));
1963 e->container_id = htole16(1);
1964 e->num_children = 5;
1965 e->container.entity_type = htole16(1);
1966 e->container.entity_instance_num = htole16(1);
1967 e->container.entity_container_id = htole16(0);
1968
1969 pldm_entity* entity = e->children;
1970 entity->entity_type = htole16(2);
1971 entity->entity_instance_num = htole16(1);
1972 entity->entity_container_id = htole16(1);
1973 ++entity;
1974 entity->entity_type = htole16(3);
1975 entity->entity_instance_num = htole16(1);
1976 entity->entity_container_id = htole16(1);
1977 ++entity;
1978 entity->entity_type = htole16(4);
1979 entity->entity_instance_num = htole16(1);
1980 entity->entity_container_id = htole16(1);
1981 ++entity;
1982 entity->entity_type = htole16(5);
1983 entity->entity_instance_num = htole16(1);
1984 entity->entity_container_id = htole16(1);
1985 ++entity;
1986 entity->entity_type = htole16(6);
1987 entity->entity_instance_num = htole16(1);
1988 entity->entity_container_id = htole16(1);
1989
1990 size_t num{};
1991 pldm_entity* out = nullptr;
1992 pldm_entity_association_pdr_extract(pdr.data(), pdr.size(), &num, &out);
1993 EXPECT_EQ(num, (unsigned)e->num_children + 1);
1994 EXPECT_EQ(out[0].entity_type, 1u);
1995 EXPECT_EQ(out[0].entity_instance_num, 1u);
1996 EXPECT_EQ(out[0].entity_container_id, 0u);
1997 EXPECT_EQ(out[1].entity_type, 2u);
1998 EXPECT_EQ(out[1].entity_instance_num, 1u);
1999 EXPECT_EQ(out[1].entity_container_id, 1u);
2000 EXPECT_EQ(out[2].entity_type, 3u);
2001 EXPECT_EQ(out[2].entity_instance_num, 1u);
2002 EXPECT_EQ(out[2].entity_container_id, 1u);
2003 EXPECT_EQ(out[3].entity_type, 4u);
2004 EXPECT_EQ(out[3].entity_instance_num, 1u);
2005 EXPECT_EQ(out[3].entity_container_id, 1u);
2006 EXPECT_EQ(out[4].entity_type, 5u);
2007 EXPECT_EQ(out[4].entity_instance_num, 1u);
2008 EXPECT_EQ(out[4].entity_container_id, 1u);
2009 EXPECT_EQ(out[5].entity_type, 6u);
2010 EXPECT_EQ(out[5].entity_instance_num, 1u);
2011 EXPECT_EQ(out[5].entity_container_id, 1u);
2012
2013 free(out);
2014}
2015
2016TEST(EntityAssociationPDR, testGetChildren)
2017{
2018 pldm_entity entities[4]{};
2019 entities[0].entity_type = 1;
2020 entities[1].entity_type = 2;
2021 entities[2].entity_type = 2;
2022 entities[3].entity_type = 3;
2023
2024 auto tree = pldm_entity_association_tree_init();
2025 auto l1 = pldm_entity_association_tree_add(
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06002026 tree, &entities[0], 0xffff, nullptr, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
Andrew Jeffery9c766792022-08-10 23:12:49 +09302027 EXPECT_NE(l1, nullptr);
2028 auto l2a = pldm_entity_association_tree_add(
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06002029 tree, &entities[1], 0xffff, l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
Andrew Jeffery9c766792022-08-10 23:12:49 +09302030 EXPECT_NE(l2a, nullptr);
2031 auto l2b = pldm_entity_association_tree_add(
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06002032 tree, &entities[2], 0xffff, l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
Andrew Jeffery9c766792022-08-10 23:12:49 +09302033 EXPECT_NE(l2b, nullptr);
2034 auto l2c = pldm_entity_association_tree_add(
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06002035 tree, &entities[3], 0xffff, l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
Andrew Jeffery9c766792022-08-10 23:12:49 +09302036 EXPECT_NE(l2c, nullptr);
2037
2038 pldm_entity et1;
2039 et1.entity_type = 2;
2040 et1.entity_instance_num = 1;
2041 EXPECT_EQ(true, pldm_is_current_parent_child(l1, &et1));
2042
2043 pldm_entity et2;
2044 et2.entity_type = 2;
2045 et2.entity_instance_num = 2;
2046 EXPECT_EQ(true, pldm_is_current_parent_child(l1, &et2));
2047
2048 pldm_entity et3;
2049 et3.entity_type = 2;
2050 et3.entity_instance_num = 3;
2051 EXPECT_EQ(false, pldm_is_current_parent_child(l1, &et3));
2052
2053 pldm_entity_association_tree_destroy(tree);
2054}
2055
2056TEST(EntityAssociationPDR, testEntityInstanceNumber)
2057{
2058 pldm_entity entities[9]{};
2059
2060 entities[0].entity_type = 1;
2061 entities[1].entity_type = 2;
2062 entities[2].entity_type = 2;
2063 entities[3].entity_type = 2;
2064 entities[4].entity_type = 2;
2065 entities[5].entity_type = 2;
2066 entities[6].entity_type = 2;
2067 entities[7].entity_type = 3;
2068 entities[8].entity_type = 3;
2069
2070 auto tree = pldm_entity_association_tree_init();
2071 auto repo = pldm_pdr_init();
2072
2073 uint16_t terminusHdl{};
2074 uint16_t entityType{};
2075 uint16_t entityInstanceNum{};
2076 uint16_t containerId{};
2077
2078 auto node = pldm_entity_association_tree_add(
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06002079 tree, &entities[0], 0xffff, nullptr, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
Andrew Jeffery9c766792022-08-10 23:12:49 +09302080 EXPECT_NE(node, nullptr);
2081
2082 auto l1 = pldm_entity_association_tree_add(tree, &entities[1], 63, node,
2083 PLDM_ENTITY_ASSOCIAION_PHYSICAL);
Andrew Jeffery14d29842023-07-17 15:29:32 +09302084 uint32_t first = 1;
Andrew Jefferye7f55112024-06-20 16:16:01 +09302085 EXPECT_EQ(pldm_pdr_add_fru_record_set(repo, 1, 1, entities[1].entity_type,
2086 entities[1].entity_instance_num,
2087 entities[1].entity_container_id,
2088 &first),
Andrew Jeffery14d29842023-07-17 15:29:32 +09302089 0);
Andrew Jeffery9c766792022-08-10 23:12:49 +09302090 EXPECT_NE(l1, nullptr);
2091 EXPECT_EQ(entities[1].entity_instance_num, 63);
2092 EXPECT_EQ(first, pldm_pdr_get_record_handle(
2093 repo, pldm_pdr_fru_record_set_find_by_rsi(
2094 repo, 1, &terminusHdl, &entityType,
2095 &entityInstanceNum, &containerId)));
2096 EXPECT_EQ(entityType, 2);
2097 EXPECT_EQ(entityInstanceNum, 63);
2098
2099 auto l2 = pldm_entity_association_tree_add(tree, &entities[2], 37, node,
2100 PLDM_ENTITY_ASSOCIAION_PHYSICAL);
Andrew Jeffery14d29842023-07-17 15:29:32 +09302101 uint32_t second = 2;
Andrew Jefferye7f55112024-06-20 16:16:01 +09302102 EXPECT_EQ(pldm_pdr_add_fru_record_set(repo, 1, 2, entities[2].entity_type,
2103 entities[2].entity_instance_num,
2104 entities[2].entity_container_id,
2105 &second),
Andrew Jeffery14d29842023-07-17 15:29:32 +09302106 0);
Andrew Jeffery9c766792022-08-10 23:12:49 +09302107 EXPECT_NE(l2, nullptr);
2108 EXPECT_EQ(entities[2].entity_instance_num, 37);
2109 EXPECT_EQ(second, pldm_pdr_get_record_handle(
2110 repo, pldm_pdr_fru_record_set_find_by_rsi(
2111 repo, 2, &terminusHdl, &entityType,
2112 &entityInstanceNum, &containerId)));
2113 EXPECT_EQ(entityType, 2);
2114 EXPECT_EQ(entityInstanceNum, 37);
2115
2116 auto l3 = pldm_entity_association_tree_add(tree, &entities[3], 44, node,
2117 PLDM_ENTITY_ASSOCIAION_PHYSICAL);
Andrew Jeffery14d29842023-07-17 15:29:32 +09302118 uint32_t third = 3;
Andrew Jefferye7f55112024-06-20 16:16:01 +09302119 EXPECT_EQ(pldm_pdr_add_fru_record_set(repo, 1, 3, entities[3].entity_type,
2120 entities[3].entity_instance_num,
2121 entities[3].entity_container_id,
2122 &third),
Andrew Jeffery14d29842023-07-17 15:29:32 +09302123 0);
Andrew Jeffery9c766792022-08-10 23:12:49 +09302124 EXPECT_NE(l3, nullptr);
2125 EXPECT_EQ(entities[3].entity_instance_num, 44);
2126 EXPECT_EQ(third, pldm_pdr_get_record_handle(
2127 repo, pldm_pdr_fru_record_set_find_by_rsi(
2128 repo, 3, &terminusHdl, &entityType,
2129 &entityInstanceNum, &containerId)));
2130 EXPECT_EQ(entityType, 2);
2131 EXPECT_EQ(entityInstanceNum, 44);
2132
2133 auto l4 = pldm_entity_association_tree_add(tree, &entities[4], 89, node,
2134 PLDM_ENTITY_ASSOCIAION_PHYSICAL);
Andrew Jeffery14d29842023-07-17 15:29:32 +09302135 uint32_t fourth = 4;
Andrew Jefferye7f55112024-06-20 16:16:01 +09302136 EXPECT_EQ(pldm_pdr_add_fru_record_set(repo, 1, 4, entities[4].entity_type,
2137 entities[4].entity_instance_num,
2138 entities[4].entity_container_id,
2139 &fourth),
Andrew Jeffery14d29842023-07-17 15:29:32 +09302140 0);
Andrew Jeffery9c766792022-08-10 23:12:49 +09302141 EXPECT_NE(l4, nullptr);
2142 EXPECT_EQ(entities[4].entity_instance_num, 89);
2143 EXPECT_EQ(fourth, pldm_pdr_get_record_handle(
2144 repo, pldm_pdr_fru_record_set_find_by_rsi(
2145 repo, 4, &terminusHdl, &entityType,
2146 &entityInstanceNum, &containerId)));
2147 EXPECT_EQ(entityType, 2);
2148 EXPECT_EQ(entityInstanceNum, 89);
2149
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06002150 auto l5 = pldm_entity_association_tree_add(tree, &entities[5], 0xffff, node,
Andrew Jeffery9c766792022-08-10 23:12:49 +09302151 PLDM_ENTITY_ASSOCIAION_PHYSICAL);
Andrew Jeffery14d29842023-07-17 15:29:32 +09302152 uint32_t fifth = 5;
Andrew Jefferye7f55112024-06-20 16:16:01 +09302153 EXPECT_EQ(pldm_pdr_add_fru_record_set(repo, 1, 5, entities[5].entity_type,
2154 entities[5].entity_instance_num,
2155 entities[5].entity_container_id,
2156 &fifth),
Andrew Jeffery14d29842023-07-17 15:29:32 +09302157 0);
Andrew Jeffery9c766792022-08-10 23:12:49 +09302158 EXPECT_NE(l5, nullptr);
2159 EXPECT_EQ(entities[5].entity_instance_num, 90);
2160 EXPECT_EQ(fifth, pldm_pdr_get_record_handle(
2161 repo, pldm_pdr_fru_record_set_find_by_rsi(
2162 repo, 5, &terminusHdl, &entityType,
2163 &entityInstanceNum, &containerId)));
2164 EXPECT_EQ(entityType, 2);
2165 EXPECT_EQ(entityInstanceNum, 90);
2166
2167 auto l6 = pldm_entity_association_tree_add(tree, &entities[6], 90, node,
2168 PLDM_ENTITY_ASSOCIAION_PHYSICAL);
2169 EXPECT_EQ(l6, nullptr);
2170
2171 auto l7 = pldm_entity_association_tree_add(tree, &entities[7], 100, l1,
2172 PLDM_ENTITY_ASSOCIAION_PHYSICAL);
Andrew Jeffery14d29842023-07-17 15:29:32 +09302173 uint32_t seventh = 7;
Andrew Jefferye7f55112024-06-20 16:16:01 +09302174 EXPECT_EQ(pldm_pdr_add_fru_record_set(repo, 1, 7, entities[7].entity_type,
2175 entities[7].entity_instance_num,
2176 entities[7].entity_container_id,
2177 &seventh),
Andrew Jeffery14d29842023-07-17 15:29:32 +09302178 0);
Andrew Jeffery9c766792022-08-10 23:12:49 +09302179 EXPECT_NE(l7, nullptr);
2180 EXPECT_EQ(entities[7].entity_instance_num, 100);
2181 EXPECT_EQ(seventh, pldm_pdr_get_record_handle(
2182 repo, pldm_pdr_fru_record_set_find_by_rsi(
2183 repo, 7, &terminusHdl, &entityType,
2184 &entityInstanceNum, &containerId)));
2185 EXPECT_EQ(entityType, 3);
2186 EXPECT_EQ(entityInstanceNum, 100);
2187
2188 auto l8 = pldm_entity_association_tree_add(tree, &entities[8], 100, l2,
2189 PLDM_ENTITY_ASSOCIAION_PHYSICAL);
Andrew Jeffery14d29842023-07-17 15:29:32 +09302190 uint32_t eighth = 8;
Andrew Jefferye7f55112024-06-20 16:16:01 +09302191 EXPECT_EQ(pldm_pdr_add_fru_record_set(repo, 1, 8, entities[8].entity_type,
2192 entities[8].entity_instance_num,
2193 entities[8].entity_container_id,
2194 &eighth),
Andrew Jeffery14d29842023-07-17 15:29:32 +09302195 0);
Andrew Jeffery9c766792022-08-10 23:12:49 +09302196 EXPECT_NE(l8, nullptr);
2197 EXPECT_EQ(entities[8].entity_instance_num, 100);
2198 EXPECT_EQ(eighth, pldm_pdr_get_record_handle(
2199 repo, pldm_pdr_fru_record_set_find_by_rsi(
2200 repo, 8, &terminusHdl, &entityType,
2201 &entityInstanceNum, &containerId)));
2202 EXPECT_EQ(entityType, 3);
2203 EXPECT_EQ(entityInstanceNum, 100);
2204
2205 pldm_pdr_destroy(repo);
2206 pldm_entity_association_tree_destroy(tree);
2207}
Pavithra Barithaya5dc02572023-05-19 09:24:36 -05002208
Andrew Jeffery14a5fe82023-06-26 15:31:37 +09302209#ifdef LIBPLDM_API_TESTING
Pavithra Barithaya8cf70452023-06-22 04:36:19 -05002210TEST(EntityAssociationPDR, testFindChildContainerID)
Pavithra Barithaya5dc02572023-05-19 09:24:36 -05002211{
2212 pldm_entity entities[3]{};
2213 entities[0].entity_type = 1;
2214 entities[1].entity_type = 2;
2215 entities[2].entity_type = 3;
2216 entities[1].entity_container_id = 2;
2217 entities[1].entity_instance_num = 1;
2218
2219 auto tree = pldm_entity_association_tree_init();
2220 auto l1 = pldm_entity_association_tree_add_entity(
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06002221 tree, &entities[0], 0xffff, nullptr, PLDM_ENTITY_ASSOCIAION_LOGICAL,
2222 false, true, 0xffff);
Pavithra Barithaya5dc02572023-05-19 09:24:36 -05002223
2224 EXPECT_NE(l1, nullptr);
2225 auto l2 = pldm_entity_association_tree_add_entity(
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06002226 tree, &entities[1], 0xffff, l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL, false,
2227 false, 0xffff);
Pavithra Barithaya5dc02572023-05-19 09:24:36 -05002228 EXPECT_NE(l2, nullptr);
2229 auto l3 = pldm_entity_association_tree_add_entity(
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06002230 tree, &entities[2], 0xffff, l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL, false,
2231 true, 0xffff);
Pavithra Barithaya5dc02572023-05-19 09:24:36 -05002232 EXPECT_NE(l3, nullptr);
2233
2234 EXPECT_EQ(pldm_entity_get_num_children(l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL),
2235 2);
2236
2237 auto repo = pldm_pdr_init();
Andrew Jefferyd72ea4b2024-06-24 21:33:33 +09302238 int rc = pldm_entity_association_pdr_add(tree, repo, false, 1);
Andrew Jeffery255f6542023-08-10 15:46:54 +09302239 ASSERT_EQ(rc, 0);
Pavithra Barithaya5dc02572023-05-19 09:24:36 -05002240
2241 EXPECT_EQ(pldm_pdr_get_record_count(repo), 1u);
2242
2243 uint16_t container_id{};
Pavithra Barithaya8cf70452023-06-22 04:36:19 -05002244 pldm_pdr_find_child_container_id_index_range_exclude(
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06002245 repo, 1, 1, 0, 0x01000000, 0x01ffffff, &container_id);
Pavithra Barithaya5dc02572023-05-19 09:24:36 -05002246 EXPECT_EQ(container_id, 2);
2247
2248 uint16_t container_id1{};
Pavithra Barithaya8cf70452023-06-22 04:36:19 -05002249 pldm_pdr_find_child_container_id_index_range_exclude(
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06002250 repo, 1, 1, 0, 0x00000001, 0x00ffffff, &container_id1);
Pavithra Barithaya5dc02572023-05-19 09:24:36 -05002251 EXPECT_EQ(container_id1, 0);
2252
2253 pldm_pdr_destroy(repo);
2254 pldm_entity_association_tree_destroy(tree);
2255}
Andrew Jeffery14a5fe82023-06-26 15:31:37 +09302256#endif
Pavithra Barithaya39eb3222023-11-17 03:30:27 -06002257
2258TEST(EntityAssociationPDR, testNodeAddCheck)
2259{
2260 // pldm_entity entities[4]{};
2261 pldm_entity* entities = (pldm_entity*)malloc(sizeof(pldm_entity) * 4);
2262 entities[0].entity_type = 1;
2263 entities[1].entity_type = 2;
2264 entities[2].entity_type = 2;
2265 entities[3].entity_type = 3;
2266
2267 auto tree = pldm_entity_association_tree_init();
2268
2269 auto l1 = pldm_entity_association_tree_add(
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06002270 tree, &entities[0], 0xffff, nullptr, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
Pavithra Barithaya39eb3222023-11-17 03:30:27 -06002271 EXPECT_NE(l1, nullptr);
2272 auto l2a = pldm_entity_association_tree_add(
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06002273 tree, &entities[1], 0xffff, l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
Pavithra Barithaya39eb3222023-11-17 03:30:27 -06002274 EXPECT_NE(l2a, nullptr);
2275 auto l2b = pldm_entity_association_tree_add(
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06002276 tree, &entities[2], 0xffff, l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
Pavithra Barithaya39eb3222023-11-17 03:30:27 -06002277 EXPECT_NE(l2b, nullptr);
2278 auto l2c = pldm_entity_association_tree_add(
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06002279 tree, &entities[3], 0xffff, l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
Pavithra Barithaya39eb3222023-11-17 03:30:27 -06002280 EXPECT_NE(l2c, nullptr);
2281
2282 auto repo = pldm_pdr_init();
2283
2284 EXPECT_EQ(pldm_entity_association_pdr_add_from_node_with_record_handle(
2285 l1, repo, &entities, 4, false, 1, 0),
2286 0);
2287 EXPECT_EQ(pldm_entity_association_pdr_add_from_node_with_record_handle(
2288 l1, repo, &entities, 4, false, 1, 2),
2289 0);
2290 EXPECT_EQ(pldm_entity_association_pdr_add_from_node_with_record_handle(
2291 l1, repo, &entities, 4, false, 1, 23),
2292 0);
2293 EXPECT_EQ(pldm_entity_association_pdr_add_from_node_with_record_handle(
2294 l1, repo, &entities, 4, false, 1, 34),
2295 0);
2296
2297 EXPECT_EQ(pldm_pdr_get_record_count(repo), 4u);
2298
2299 uint8_t* outData = nullptr;
2300 uint32_t size{};
2301 uint32_t nextRecHdl{};
2302 auto hdl = pldm_pdr_find_record(repo, 0, &outData, &size, &nextRecHdl);
2303 EXPECT_NE(hdl, nullptr);
2304
2305 outData = nullptr;
2306 auto hdl1 = pldm_pdr_find_record(repo, 2, &outData, &size, &nextRecHdl);
2307 EXPECT_NE(hdl1, nullptr);
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +09302308 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Pavithra Barithaya39eb3222023-11-17 03:30:27 -06002309 pldm_pdr_hdr* hdr = reinterpret_cast<pldm_pdr_hdr*>(outData);
2310 EXPECT_EQ(hdr->record_handle, 2);
2311
2312 outData = nullptr;
2313 auto hdl2 = pldm_pdr_find_record(repo, 23, &outData, &size, &nextRecHdl);
2314 EXPECT_NE(hdl2, nullptr);
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +09302315 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Pavithra Barithaya39eb3222023-11-17 03:30:27 -06002316 pldm_pdr_hdr* hdr1 = reinterpret_cast<pldm_pdr_hdr*>(outData);
2317 EXPECT_EQ(hdr1->record_handle, 23);
2318
2319 outData = nullptr;
2320 auto hdl3 = pldm_pdr_find_record(repo, 3, &outData, &size, &nextRecHdl);
2321 EXPECT_EQ(hdl3, nullptr);
2322
2323 free(entities);
2324 pldm_pdr_destroy(repo);
2325 pldm_entity_association_tree_destroy(tree);
2326}
Varsha Kaverappa37552b92024-02-12 05:06:06 -06002327
Andrew Jeffery1111a972024-06-03 13:39:18 +09302328#ifdef LIBPLDM_API_TESTING
Varsha Kaverappa37552b92024-02-12 05:06:06 -06002329TEST(EntityAssociationPDR, testAddContainedEntityRemotePDR)
2330{
2331 // pldm_entity entities[5]{};
2332 pldm_entity* entities = (pldm_entity*)malloc(sizeof(pldm_entity) * 5);
2333 entities[0].entity_type = 1;
2334 entities[1].entity_type = 2;
2335 entities[2].entity_type = 3;
2336 entities[3].entity_type = 4;
2337 entities[4].entity_type = 5;
2338
2339 auto tree = pldm_entity_association_tree_init();
2340 auto l1 = pldm_entity_association_tree_add(
2341 tree, &entities[0], 0xffff, nullptr, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
2342 EXPECT_NE(l1, nullptr);
2343 auto l2a = pldm_entity_association_tree_add(
2344 tree, &entities[1], 0xffff, l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
2345 EXPECT_NE(l2a, nullptr);
2346 auto l2b = pldm_entity_association_tree_add(
2347 tree, &entities[2], 0xffff, l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
2348 EXPECT_NE(l2b, nullptr);
2349 auto l2c = pldm_entity_association_tree_add(
2350 tree, &entities[3], 0xffff, l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
2351 EXPECT_NE(l2c, nullptr);
2352 auto l3a = pldm_entity_association_tree_add(
2353 tree, &entities[4], 0xffff, l2a, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
2354 EXPECT_NE(l3a, nullptr);
2355
2356 auto repo = pldm_pdr_init();
2357
2358 EXPECT_EQ(pldm_entity_association_pdr_add_from_node_with_record_handle(
2359 l1, repo, &entities, 5, false, 1, 0),
2360 0);
2361 EXPECT_EQ(pldm_entity_association_pdr_add_from_node_with_record_handle(
2362 l1, repo, &entities, 5, false, 1, 2),
2363 0);
2364 EXPECT_EQ(pldm_entity_association_pdr_add_from_node_with_record_handle(
2365 l1, repo, &entities, 5, false, 1, 23),
2366 0);
2367 EXPECT_EQ(pldm_entity_association_pdr_add_from_node_with_record_handle(
2368 l1, repo, &entities, 5, false, 1, 34),
2369 0);
2370 EXPECT_EQ(pldm_entity_association_pdr_add_from_node_with_record_handle(
2371 l2a, repo, &entities, 5, false, 1, 3),
2372 0);
2373
2374 pldm_entity entity1[1];
2375 entity1[0].entity_type = 2;
2376
2377 EXPECT_EQ(pldm_entity_association_pdr_add_contained_entity_to_remote_pdr(
2378 repo, &entity1[0], 2),
2379 0);
2380
2381 free(entities);
2382 pldm_pdr_destroy(repo);
2383 pldm_entity_association_tree_destroy(tree);
2384}
Andrew Jeffery1111a972024-06-03 13:39:18 +09302385#endif
Varsha Kaverappa37552b92024-02-12 05:06:06 -06002386
Andrew Jeffery1111a972024-06-03 13:39:18 +09302387#ifdef LIBPLDM_API_TESTING
Varsha Kaverappa37552b92024-02-12 05:06:06 -06002388TEST(EntityAssociationPDR, testAddContainedEntityNew)
2389{
2390 // pldm_entity entities[5]{};
2391 pldm_entity* entities = (pldm_entity*)malloc(sizeof(pldm_entity) * 5);
2392 entities[0].entity_type = 1;
2393 entities[1].entity_type = 2;
2394 entities[2].entity_type = 3;
2395 entities[3].entity_type = 4;
2396 entities[4].entity_type = 5;
2397
2398 auto tree = pldm_entity_association_tree_init();
2399 auto l1 = pldm_entity_association_tree_add(
2400 tree, &entities[0], 0xffff, nullptr, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
2401 EXPECT_NE(l1, nullptr);
2402 auto l2a = pldm_entity_association_tree_add(
2403 tree, &entities[1], 0xffff, l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
2404 EXPECT_NE(l2a, nullptr);
2405 auto l2b = pldm_entity_association_tree_add(
2406 tree, &entities[2], 0xffff, l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
2407 EXPECT_NE(l2b, nullptr);
2408 auto l2c = pldm_entity_association_tree_add(
2409 tree, &entities[3], 0xffff, l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
2410 EXPECT_NE(l2c, nullptr);
2411 auto l3a = pldm_entity_association_tree_add(
2412 tree, &entities[4], 0xffff, l2a, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
2413 EXPECT_NE(l3a, nullptr);
2414
2415 auto repo = pldm_pdr_init();
2416
2417 EXPECT_EQ(pldm_entity_association_pdr_add_from_node_with_record_handle(
2418 l1, repo, &entities, 5, false, 1, 0),
2419 0);
2420 EXPECT_EQ(pldm_entity_association_pdr_add_from_node_with_record_handle(
2421 l1, repo, &entities, 5, false, 1, 2),
2422 0);
2423 EXPECT_EQ(pldm_entity_association_pdr_add_from_node_with_record_handle(
2424 l1, repo, &entities, 5, false, 1, 23),
2425 0);
2426 EXPECT_EQ(pldm_entity_association_pdr_add_from_node_with_record_handle(
2427 l1, repo, &entities, 5, false, 1, 34),
2428 0);
2429 EXPECT_EQ(pldm_entity_association_pdr_add_from_node_with_record_handle(
2430 l2a, repo, &entities, 5, false, 1, 3),
2431 0);
2432
2433 uint32_t updated_record_handle = 0;
2434
2435 pldm_entity entity2[1]{};
2436 entity2[0].entity_type = 4;
2437
2438 pldm_entity entity3[1]{};
2439 entity3[0].entity_type = 4;
2440
2441 EXPECT_EQ(pldm_entity_association_pdr_create_new(
2442 repo, 34, &entity2[0], &entity3[0], &updated_record_handle),
2443 0);
2444
2445 EXPECT_EQ(updated_record_handle, 35);
2446
2447 free(entities);
2448 pldm_pdr_destroy(repo);
2449 pldm_entity_association_tree_destroy(tree);
2450}
Andrew Jeffery1111a972024-06-03 13:39:18 +09302451#endif
Varsha Kaverappab31e4c62024-06-25 06:45:46 -05002452
2453#ifdef LIBPLDM_API_TESTING
2454TEST(EntityAssociationPDR, testRemoveContainedEntity)
2455{
2456 struct pldm_entity entities[4] = {
2457 {.entity_type = 1, .entity_instance_num = 1, .entity_container_id = 2},
2458 {.entity_type = 2, .entity_instance_num = 1, .entity_container_id = 2},
2459 {.entity_type = 3, .entity_instance_num = 3, .entity_container_id = 3},
2460 {.entity_type = 4, .entity_instance_num = 1, .entity_container_id = 2}};
2461 struct pldm_entity* base = entities;
2462
2463 auto tree = pldm_entity_association_tree_init();
2464 auto l1 = pldm_entity_association_tree_add_entity(
2465 tree, &entities[0], 0xffff, nullptr, PLDM_ENTITY_ASSOCIAION_LOGICAL,
2466 false, true, 0xffff);
2467
2468 EXPECT_NE(l1, nullptr);
2469 auto l2 = pldm_entity_association_tree_add_entity(
2470 tree, &entities[1], 0xffff, l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL, false,
2471 false, 0xffff);
2472 EXPECT_NE(l2, nullptr);
2473 auto l3 = pldm_entity_association_tree_add_entity(
2474 tree, &entities[2], 0xffff, l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL, false,
2475 true, 0xffff);
2476 EXPECT_NE(l3, nullptr);
2477 auto l4 = pldm_entity_association_tree_add_entity(
2478 tree, &entities[3], 0xffff, l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL, false,
2479 true, 0xffff);
2480 EXPECT_NE(l4, nullptr);
2481
2482 EXPECT_EQ(pldm_entity_get_num_children(l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL),
2483 3);
2484
2485 auto repo = pldm_pdr_init();
2486
2487 EXPECT_EQ(pldm_entity_association_pdr_add_from_node_with_record_handle(
2488 l1, repo, &base, 4, false, 1, 3),
2489 0);
2490
2491 EXPECT_EQ(pldm_pdr_get_record_count(repo), 1u);
2492
Archana Kakani94e2d752024-12-12 08:22:55 -06002493 // Remove first contained entity from the entity association PDR
Varsha Kaverappab31e4c62024-06-25 06:45:46 -05002494 uint32_t removed_record_handle{};
2495 struct pldm_entity entity[1] = {
Archana Kakani94e2d752024-12-12 08:22:55 -06002496 {.entity_type = 4, .entity_instance_num = 1, .entity_container_id = 2}};
Varsha Kaverappab31e4c62024-06-25 06:45:46 -05002497
2498 EXPECT_EQ(pldm_entity_association_pdr_remove_contained_entity(
2499 repo, entity, false, &removed_record_handle),
2500 0);
2501 EXPECT_EQ(removed_record_handle, 3);
2502
Archana Kakani94e2d752024-12-12 08:22:55 -06002503 // Remove second contained entity from the entity association PDR
2504 removed_record_handle = 0;
2505 EXPECT_EQ(pldm_entity_association_pdr_remove_contained_entity(
2506 repo, &entities[1], false, &removed_record_handle),
2507 0);
2508 EXPECT_EQ(removed_record_handle, 3);
2509
2510 // Remove third contained entity from the entity association PDR
2511 removed_record_handle = 0;
2512 EXPECT_EQ(pldm_entity_association_pdr_remove_contained_entity(
2513 repo, &entities[2], false, &removed_record_handle),
2514 0);
2515 EXPECT_EQ(removed_record_handle, 3);
2516
2517 // As all the contained entities are removed the entity association PDR
2518 // also gets deleted
2519 EXPECT_EQ(pldm_pdr_get_record_count(repo), 0u);
2520
Varsha Kaverappab31e4c62024-06-25 06:45:46 -05002521 pldm_pdr_destroy(repo);
2522 pldm_entity_association_tree_destroy(tree);
2523}
2524#endif
Varsha Kaverappa8b53ad92024-06-15 06:36:06 -05002525
2526#ifdef LIBPLDM_API_TESTING
2527TEST(PDRUpdate, testRemoveFruRecord)
2528{
2529 auto repo = pldm_pdr_init();
2530
2531 uint32_t record_handle = 1;
2532 int rc = pldm_pdr_add_fru_record_set(repo, 1, 1, 1, 0, 100, &record_handle);
2533 EXPECT_EQ(rc, 0);
2534 record_handle = 2;
2535 rc = pldm_pdr_add_fru_record_set(repo, 1, 2, 1, 1, 100, &record_handle);
2536 EXPECT_EQ(rc, 0);
2537 record_handle = 3;
2538 rc = pldm_pdr_add_fru_record_set(repo, 1, 3, 1, 2, 100, &record_handle);
2539 EXPECT_EQ(rc, 0);
2540 EXPECT_EQ(pldm_pdr_get_record_count(repo), 3);
2541
2542 uint32_t removed_record_handle{};
2543 rc = pldm_pdr_remove_fru_record_set_by_rsi(repo, 2, false,
2544 &removed_record_handle);
2545 EXPECT_EQ(rc, 0);
2546 EXPECT_EQ(removed_record_handle, 2);
2547 EXPECT_EQ(pldm_pdr_get_record_count(repo), 2);
2548
2549 uint16_t terminusHdl{};
2550 uint16_t entityType{};
2551 uint16_t entityInstanceNum{};
2552 uint16_t containerId{};
2553 auto record = pldm_pdr_fru_record_set_find_by_rsi(
2554 repo, 1, &terminusHdl, &entityType, &entityInstanceNum, &containerId);
2555 EXPECT_NE(record, nullptr);
2556 record_handle = pldm_pdr_get_record_handle(repo, record);
2557 EXPECT_EQ(record_handle, 1);
2558
2559 record = pldm_pdr_fru_record_set_find_by_rsi(
2560 repo, 3, &terminusHdl, &entityType, &entityInstanceNum, &containerId);
2561 EXPECT_NE(record, nullptr);
2562 record_handle = pldm_pdr_get_record_handle(repo, record);
2563 EXPECT_EQ(record_handle, 3);
2564
2565 record = pldm_pdr_fru_record_set_find_by_rsi(
2566 repo, 2, &terminusHdl, &entityType, &entityInstanceNum, &containerId);
2567 EXPECT_EQ(record, nullptr);
2568
2569 rc = pldm_pdr_remove_fru_record_set_by_rsi(repo, 1, false,
2570 &removed_record_handle);
2571 EXPECT_EQ(rc, 0);
2572 EXPECT_EQ(removed_record_handle, 1);
2573
2574 // remove the same record again
2575 removed_record_handle = 5;
2576 rc = pldm_pdr_remove_fru_record_set_by_rsi(repo, 1, false,
2577 &removed_record_handle);
2578 EXPECT_EQ(rc, 0);
2579 EXPECT_NE(removed_record_handle, 1);
2580 EXPECT_EQ(removed_record_handle, 5);
2581
2582 rc = pldm_pdr_remove_fru_record_set_by_rsi(repo, 3, false,
2583 &removed_record_handle);
2584 EXPECT_EQ(rc, 0);
2585 EXPECT_EQ(removed_record_handle, 3);
2586
2587 EXPECT_EQ(pldm_pdr_get_record_count(repo), 0);
2588
2589 pldm_pdr_destroy(repo);
2590}
2591#endif