blob: 610bed28e9049cee8d98223cfa969cb6f317f3c9 [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
722TEST(PDRAccess, testGetTerminusHandle)
723{
724
725 auto repo = pldm_pdr_init();
726
727 pldm_pdr_hdr hdr;
728
729 hdr.type = 1;
730 uint16_t firstTerminusHandle = 1;
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +0930731 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Andrew Jefferyf309c482024-09-07 18:45:41 +0300732 EXPECT_EQ(pldm_pdr_add(repo, reinterpret_cast<const uint8_t*>(&hdr),
733 sizeof(hdr), false, firstTerminusHandle, NULL),
Pavithra Barithaya274732f2024-07-05 16:03:01 +0530734 0);
735
736 hdr.type = 2;
737 uint16_t secondTerminusHandle = 2;
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +0930738 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Andrew Jefferyf309c482024-09-07 18:45:41 +0300739 EXPECT_EQ(pldm_pdr_add(repo, reinterpret_cast<const uint8_t*>(&hdr),
740 sizeof(hdr), true, secondTerminusHandle, NULL),
Pavithra Barithaya274732f2024-07-05 16:03:01 +0530741 0);
742
743 hdr.type = 3;
744 uint16_t thirdTerminusHandle = 3;
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +0930745 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Andrew Jefferyf309c482024-09-07 18:45:41 +0300746 EXPECT_EQ(pldm_pdr_add(repo, reinterpret_cast<const uint8_t*>(&hdr),
747 sizeof(hdr), true, thirdTerminusHandle, NULL),
Pavithra Barithaya274732f2024-07-05 16:03:01 +0530748 0);
749
750 uint8_t* outData = nullptr;
751 uint32_t size{};
752
753 auto firstRec =
754 pldm_pdr_find_record_by_type(repo, 1, nullptr, &outData, &size);
755 EXPECT_EQ(pldm_pdr_get_terminus_handle(repo, firstRec),
756 firstTerminusHandle);
757 outData = nullptr;
758
759 auto secondRec =
760 pldm_pdr_find_record_by_type(repo, 2, nullptr, &outData, &size);
761 EXPECT_EQ(pldm_pdr_get_terminus_handle(repo, secondRec),
762 secondTerminusHandle);
763 outData = nullptr;
764
765 auto thirdRec =
766 pldm_pdr_find_record_by_type(repo, 3, nullptr, &outData, &size);
767 EXPECT_EQ(pldm_pdr_get_terminus_handle(repo, thirdRec),
768 thirdTerminusHandle);
769 outData = nullptr;
770
771 pldm_pdr_destroy(repo);
772}
773#endif
774
Pavithra Barithaya5192e2e2025-02-26 16:50:06 +0530775TEST(PDRAccess, testRemoveByRecordHandle)
776{
777 std::array<uint8_t, sizeof(pldm_pdr_hdr)> data{};
778
779 auto repo = pldm_pdr_init();
780 uint32_t first = 0;
781 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), false, 1, &first),
782 0);
783
784 uint32_t second = 0;
785 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), false, 1, &second),
786 0);
787
788 uint32_t third = 0;
789 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), false, 1, &third),
790 0);
791
792 EXPECT_EQ(pldm_pdr_get_record_count(repo), 3u);
793
794 int rc = pldm_pdr_delete_by_record_handle(repo, 1, false);
795 EXPECT_EQ(rc, 0);
796 EXPECT_EQ(pldm_pdr_get_record_count(repo), 2u);
797
798 rc = pldm_pdr_delete_by_record_handle(repo, 2, false);
799 EXPECT_EQ(rc, 0);
800 EXPECT_EQ(pldm_pdr_get_record_count(repo), 1u);
801
802 pldm_pdr_destroy(repo);
803}
Pavithra Barithaya5192e2e2025-02-26 16:50:06 +0530804
Andrew Jeffery9c766792022-08-10 23:12:49 +0930805TEST(EntityAssociationPDR, testInit)
806{
807 auto tree = pldm_entity_association_tree_init();
808 EXPECT_NE(tree, nullptr);
809 pldm_entity_association_tree_destroy(tree);
810}
811
812TEST(EntityAssociationPDR, testBuild)
813{
814 // 1
815 // |
816 // 2--3--4
817 // |
818 // 5--6--7
819 // | |
820 // 9 8
821
822 pldm_entity entities[9]{};
823
824 entities[0].entity_type = 1;
825 entities[1].entity_type = 2;
826 entities[2].entity_type = 2;
827 entities[3].entity_type = 3;
828 entities[4].entity_type = 4;
829 entities[5].entity_type = 5;
830 entities[6].entity_type = 5;
831 entities[7].entity_type = 6;
832 entities[8].entity_type = 7;
833
834 auto tree = pldm_entity_association_tree_init();
835
836 auto l1 = pldm_entity_association_tree_add(
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -0600837 tree, &entities[0], 0xffff, nullptr, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
Andrew Jeffery9c766792022-08-10 23:12:49 +0930838 EXPECT_NE(l1, nullptr);
839 auto l2a = pldm_entity_association_tree_add(
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -0600840 tree, &entities[1], 0xffff, l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
Andrew Jeffery9c766792022-08-10 23:12:49 +0930841 EXPECT_NE(l2a, nullptr);
842 auto l2b = pldm_entity_association_tree_add(
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -0600843 tree, &entities[2], 0xffff, l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
Andrew Jeffery9c766792022-08-10 23:12:49 +0930844 EXPECT_NE(l2b, nullptr);
845 auto l2c = pldm_entity_association_tree_add(
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -0600846 tree, &entities[3], 0xffff, l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
Andrew Jeffery9c766792022-08-10 23:12:49 +0930847 EXPECT_NE(l2c, nullptr);
848 auto l3a = pldm_entity_association_tree_add(
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -0600849 tree, &entities[4], 0xffff, l2a, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
Andrew Jeffery9c766792022-08-10 23:12:49 +0930850 EXPECT_NE(l3a, nullptr);
851 auto l3b = pldm_entity_association_tree_add(
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -0600852 tree, &entities[5], 0xffff, l2a, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
Andrew Jeffery9c766792022-08-10 23:12:49 +0930853 EXPECT_NE(l3b, nullptr);
854 auto l3c = pldm_entity_association_tree_add(
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -0600855 tree, &entities[6], 0xffff, l2a, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
Andrew Jeffery9c766792022-08-10 23:12:49 +0930856 EXPECT_NE(l3b, nullptr);
857 auto l4a = pldm_entity_association_tree_add(
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -0600858 tree, &entities[7], 0xffff, l3a, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
Andrew Jeffery9c766792022-08-10 23:12:49 +0930859 EXPECT_NE(l4a, nullptr);
860 auto l4b = pldm_entity_association_tree_add(
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -0600861 tree, &entities[8], 0xffff, l3b, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
Andrew Jeffery9c766792022-08-10 23:12:49 +0930862 EXPECT_NE(l4b, nullptr);
863
864 EXPECT_EQ(pldm_entity_is_node_parent(l1), true);
865 EXPECT_EQ(pldm_entity_is_node_parent(l2a), true);
866 EXPECT_EQ(pldm_entity_is_node_parent(l3a), true);
867 EXPECT_EQ(pldm_entity_is_node_parent(l3b), true);
868
869 EXPECT_EQ(pldm_entity_is_node_parent(l2b), false);
870 EXPECT_EQ(pldm_entity_is_node_parent(l2c), false);
871 EXPECT_EQ(pldm_entity_is_node_parent(l3c), false);
872 EXPECT_EQ(pldm_entity_is_node_parent(l4a), false);
873 EXPECT_EQ(pldm_entity_is_node_parent(l4b), false);
874
875 EXPECT_EQ(pldm_entity_is_exist_parent(l1), false);
876
877 pldm_entity nodeL1 = pldm_entity_extract(l1);
878 pldm_entity parentL2a = pldm_entity_get_parent(l2a);
879 pldm_entity parentL2b = pldm_entity_get_parent(l2b);
880 pldm_entity parentL2c = pldm_entity_get_parent(l2c);
881 EXPECT_EQ(pldm_entity_is_exist_parent(l2a), true);
882 EXPECT_EQ(pldm_entity_is_exist_parent(l2b), true);
883 EXPECT_EQ(pldm_entity_is_exist_parent(l2c), true);
884 EXPECT_EQ(parentL2a.entity_type, nodeL1.entity_type);
885 EXPECT_EQ(parentL2a.entity_instance_num, nodeL1.entity_instance_num);
886 EXPECT_EQ(parentL2a.entity_container_id, nodeL1.entity_container_id);
887 EXPECT_EQ(parentL2b.entity_type, nodeL1.entity_type);
888 EXPECT_EQ(parentL2b.entity_instance_num, nodeL1.entity_instance_num);
889 EXPECT_EQ(parentL2b.entity_container_id, nodeL1.entity_container_id);
890 EXPECT_EQ(parentL2c.entity_type, nodeL1.entity_type);
891 EXPECT_EQ(parentL2c.entity_instance_num, nodeL1.entity_instance_num);
892 EXPECT_EQ(parentL2c.entity_container_id, nodeL1.entity_container_id);
893
894 pldm_entity nodeL2a = pldm_entity_extract(l2a);
895 pldm_entity parentL3a = pldm_entity_get_parent(l3a);
896 pldm_entity parentL3b = pldm_entity_get_parent(l3b);
897 pldm_entity parentL3c = pldm_entity_get_parent(l3c);
898 EXPECT_EQ(pldm_entity_is_exist_parent(l3a), true);
899 EXPECT_EQ(pldm_entity_is_exist_parent(l3b), true);
900 EXPECT_EQ(pldm_entity_is_exist_parent(l3c), true);
901 EXPECT_EQ(parentL3a.entity_type, nodeL2a.entity_type);
902 EXPECT_EQ(parentL3a.entity_instance_num, nodeL2a.entity_instance_num);
903 EXPECT_EQ(parentL3a.entity_container_id, nodeL2a.entity_container_id);
904 EXPECT_EQ(parentL3b.entity_type, nodeL2a.entity_type);
905 EXPECT_EQ(parentL3b.entity_instance_num, nodeL2a.entity_instance_num);
906 EXPECT_EQ(parentL3b.entity_container_id, nodeL2a.entity_container_id);
907 EXPECT_EQ(parentL3c.entity_type, nodeL2a.entity_type);
908 EXPECT_EQ(parentL3c.entity_instance_num, nodeL2a.entity_instance_num);
909 EXPECT_EQ(parentL3c.entity_container_id, nodeL2a.entity_container_id);
910
911 pldm_entity nodeL3a = pldm_entity_extract(l3a);
912 pldm_entity parentL4a = pldm_entity_get_parent(l4a);
913 EXPECT_EQ(pldm_entity_is_exist_parent(l4a), true);
914 EXPECT_EQ(parentL4a.entity_type, nodeL3a.entity_type);
915 EXPECT_EQ(parentL4a.entity_instance_num, nodeL3a.entity_instance_num);
916 EXPECT_EQ(parentL4a.entity_container_id, nodeL3a.entity_container_id);
917
918 pldm_entity nodeL3b = pldm_entity_extract(l3b);
919 pldm_entity parentL4b = pldm_entity_get_parent(l4b);
920 EXPECT_EQ(pldm_entity_is_exist_parent(l4b), true);
921 EXPECT_EQ(parentL4b.entity_type, nodeL3b.entity_type);
922 EXPECT_EQ(parentL4b.entity_instance_num, nodeL3b.entity_instance_num);
923 EXPECT_EQ(parentL4b.entity_container_id, nodeL3b.entity_container_id);
924
925 size_t num{};
926 pldm_entity* out = nullptr;
927 pldm_entity_association_tree_visit(tree, &out, &num);
928 EXPECT_EQ(num, 9u);
929
930 EXPECT_EQ(out[0].entity_type, 1u);
931 EXPECT_EQ(out[0].entity_instance_num, 1u);
932 EXPECT_EQ(out[0].entity_container_id, 0u);
933
934 EXPECT_EQ(out[1].entity_type, 2u);
935 EXPECT_EQ(out[1].entity_instance_num, 1u);
936 EXPECT_EQ(out[1].entity_container_id, 1u);
937 EXPECT_EQ(out[2].entity_type, 2u);
938 EXPECT_EQ(out[2].entity_instance_num, 2u);
939 EXPECT_EQ(out[2].entity_container_id, 1u);
940 EXPECT_EQ(out[3].entity_type, 3u);
941 EXPECT_EQ(out[3].entity_instance_num, 1u);
942 EXPECT_EQ(out[3].entity_container_id, 1u);
943
944 EXPECT_EQ(out[4].entity_type, 4u);
945 EXPECT_EQ(out[4].entity_instance_num, 1u);
946 EXPECT_EQ(out[4].entity_container_id, 2u);
947 EXPECT_EQ(out[5].entity_type, 5u);
948 EXPECT_EQ(out[5].entity_instance_num, 1u);
949 EXPECT_EQ(out[5].entity_container_id, 2u);
950 EXPECT_EQ(out[6].entity_type, 5u);
951 EXPECT_EQ(out[6].entity_instance_num, 2u);
952 EXPECT_EQ(out[6].entity_container_id, 2u);
953
954 EXPECT_EQ(out[7].entity_type, 7u);
955 EXPECT_EQ(out[7].entity_instance_num, 1u);
956 EXPECT_EQ(out[7].entity_container_id, 4u);
957 EXPECT_EQ(out[8].entity_type, 6u);
958 EXPECT_EQ(out[8].entity_instance_num, 1u);
959 EXPECT_EQ(out[8].entity_container_id, 3u);
960
961 free(out);
962
963 pldm_entity p1 = pldm_entity_extract(l1);
964 EXPECT_EQ(p1.entity_type, 1u);
965 EXPECT_EQ(p1.entity_instance_num, 1u);
966 EXPECT_EQ(p1.entity_container_id, 0u);
967
968 pldm_entity p2a = pldm_entity_extract(l2a);
969 EXPECT_EQ(p2a.entity_type, 2u);
970 EXPECT_EQ(p2a.entity_instance_num, 1u);
971 EXPECT_EQ(p2a.entity_container_id, 1u);
972 pldm_entity p2b = pldm_entity_extract(l2b);
973 EXPECT_EQ(p2b.entity_type, 2u);
974 EXPECT_EQ(p2b.entity_instance_num, 2u);
975 EXPECT_EQ(p2b.entity_container_id, 1u);
976 pldm_entity p2c = pldm_entity_extract(l2c);
977 EXPECT_EQ(p2c.entity_type, 3u);
978 EXPECT_EQ(p2c.entity_instance_num, 1u);
979 EXPECT_EQ(p2c.entity_container_id, 1u);
980
981 pldm_entity p3a = pldm_entity_extract(l3a);
982 EXPECT_EQ(p3a.entity_type, 4u);
983 EXPECT_EQ(p3a.entity_instance_num, 1u);
984 EXPECT_EQ(p3a.entity_container_id, 2u);
985 pldm_entity p3b = pldm_entity_extract(l3b);
986 EXPECT_EQ(p3b.entity_type, 5u);
987 EXPECT_EQ(p3b.entity_instance_num, 1u);
988 EXPECT_EQ(p3b.entity_container_id, 2u);
989 pldm_entity p3c = pldm_entity_extract(l3c);
990 EXPECT_EQ(p3c.entity_type, 5u);
991 EXPECT_EQ(p3c.entity_instance_num, 2u);
992 EXPECT_EQ(p3c.entity_container_id, 2u);
993
994 pldm_entity p4a = pldm_entity_extract(l4a);
995 EXPECT_EQ(p4a.entity_type, 6u);
996 EXPECT_EQ(p4a.entity_instance_num, 1u);
997 EXPECT_EQ(p4a.entity_container_id, 3u);
998 pldm_entity p4b = pldm_entity_extract(l4b);
999 EXPECT_EQ(p4b.entity_type, 7u);
1000 EXPECT_EQ(p4b.entity_instance_num, 1u);
1001 EXPECT_EQ(p4b.entity_container_id, 4u);
1002
1003 pldm_entity_association_tree_destroy(tree);
1004}
1005
Pavithra Barithaya9947f9d2023-05-18 05:20:24 -05001006#if LIBPLDM_API_TESTING
1007TEST(EntityAssociationPDR, findAndAddRemotePDR)
1008{
1009 // Tree - 1
1010 //
1011 // 11521(1,0)
1012 // |
1013 // 45 (1,1)
1014 // |
1015 // 64 (1,2)
1016 // |
1017 // ------------------
1018 // | |
1019 // 67(0,3) 67(1,3)
1020 // | |
1021 // 135(0,4) 135(0,5)
1022 // | |
1023 // 32903(0,6) 32903(0,7)
1024
1025 pldm_entity entities[9]{};
1026 entities[0].entity_type = 11521;
1027 entities[1].entity_type = 45;
1028 entities[2].entity_type = 64;
1029 entities[3].entity_type = 67;
1030 entities[4].entity_type = 67;
1031 entities[5].entity_type = 135;
1032 entities[5].entity_container_id = 2;
1033 entities[6].entity_type = 135;
1034 entities[6].entity_container_id = 3;
1035 entities[7].entity_type = 32903;
1036 entities[8].entity_type = 32903;
1037 auto tree = pldm_entity_association_tree_init();
1038 auto l1 = pldm_entity_association_tree_add_entity(
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06001039 tree, &entities[0], 0xffff, nullptr, PLDM_ENTITY_ASSOCIAION_LOGICAL,
1040 false, true, 0xffff);
Pavithra Barithaya9947f9d2023-05-18 05:20:24 -05001041 EXPECT_NE(l1, nullptr);
1042 auto l2 = pldm_entity_association_tree_add_entity(
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06001043 tree, &entities[1], 0xffff, l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL, false,
1044 false, 0xffff);
Pavithra Barithaya9947f9d2023-05-18 05:20:24 -05001045 EXPECT_NE(l2, nullptr);
1046 auto l3 = pldm_entity_association_tree_add_entity(
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06001047 tree, &entities[2], 0xffff, l2, PLDM_ENTITY_ASSOCIAION_PHYSICAL, false,
1048 true, 0xffff);
Pavithra Barithaya9947f9d2023-05-18 05:20:24 -05001049 EXPECT_NE(l3, nullptr);
1050 auto l4a = pldm_entity_association_tree_add_entity(
1051 tree, &entities[3], 0, l3, PLDM_ENTITY_ASSOCIAION_PHYSICAL, false,
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06001052 false, 0xffff);
Pavithra Barithaya9947f9d2023-05-18 05:20:24 -05001053 EXPECT_NE(l4a, nullptr);
1054 auto l4b = pldm_entity_association_tree_add_entity(
1055 tree, &entities[4], 1, l3, PLDM_ENTITY_ASSOCIAION_PHYSICAL, true, true,
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06001056 0xffff);
Pavithra Barithaya9947f9d2023-05-18 05:20:24 -05001057 EXPECT_NE(l4b, nullptr);
1058 auto l5a = pldm_entity_association_tree_add_entity(
1059 tree, &entities[5], 0, l4a, PLDM_ENTITY_ASSOCIAION_PHYSICAL, false,
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06001060 false, 0xffff);
Pavithra Barithaya9947f9d2023-05-18 05:20:24 -05001061 EXPECT_NE(l5a, nullptr);
1062 auto l5b = pldm_entity_association_tree_add_entity(
1063 tree, &entities[6], 0, l4b, PLDM_ENTITY_ASSOCIAION_PHYSICAL, false,
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06001064 false, 0xffff);
Pavithra Barithaya9947f9d2023-05-18 05:20:24 -05001065 EXPECT_NE(l5b, nullptr);
1066 pldm_entity entity{};
1067 entity.entity_type = 135;
1068 entity.entity_instance_num = 0;
1069 entity.entity_container_id = 2;
1070 auto result1 = pldm_entity_association_tree_find(tree, &entity);
1071 EXPECT_EQ(result1, l5a);
1072 EXPECT_EQ(entities[5].entity_container_id, 2);
1073 auto l6a = pldm_entity_association_tree_add_entity(
1074 tree, &entities[7], 0, result1, PLDM_ENTITY_ASSOCIAION_PHYSICAL, false,
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06001075 false, 0xffff);
Pavithra Barithaya9947f9d2023-05-18 05:20:24 -05001076 EXPECT_NE(l6a, nullptr);
1077 entity.entity_type = 135;
1078 entity.entity_instance_num = 0;
1079 entity.entity_container_id = 3;
1080 auto result2 = pldm_entity_association_tree_find(tree, &entity);
1081 EXPECT_NE(result2, l5b);
1082 EXPECT_EQ(entities[6].entity_container_id, 3);
1083 auto l7a = pldm_entity_association_tree_add_entity(
1084 tree, &entities[8], 0, result2, PLDM_ENTITY_ASSOCIAION_PHYSICAL, false,
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06001085 false, 0xffff);
Pavithra Barithaya9947f9d2023-05-18 05:20:24 -05001086 EXPECT_EQ(l7a, nullptr);
1087 pldm_entity_association_tree_destroy(tree);
1088}
1089#endif
1090
Andrew Jeffery9c766792022-08-10 23:12:49 +09301091TEST(EntityAssociationPDR, testSpecialTrees)
1092{
1093 pldm_entity entities[3]{};
1094
1095 entities[0].entity_type = 1;
1096 entities[1].entity_type = 2;
1097 entities[2].entity_type = 1;
1098
1099 // A
1100 auto tree = pldm_entity_association_tree_init();
1101 auto node = pldm_entity_association_tree_add(
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06001102 tree, &entities[0], 0xffff, nullptr, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
Andrew Jeffery9c766792022-08-10 23:12:49 +09301103 EXPECT_NE(node, nullptr);
1104 size_t num{};
1105 pldm_entity* out = nullptr;
1106 pldm_entity_association_tree_visit(tree, &out, &num);
1107 EXPECT_EQ(num, 1u);
1108 EXPECT_EQ(out[0].entity_type, 1u);
1109 EXPECT_EQ(out[0].entity_instance_num, 1u);
1110 EXPECT_EQ(out[0].entity_container_id, 0u);
1111 free(out);
1112 pldm_entity_association_tree_destroy(tree);
1113
1114 // A-A-A
1115 tree = pldm_entity_association_tree_init();
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06001116 node = pldm_entity_association_tree_add(tree, &entities[0], 0xffff, nullptr,
Andrew Jeffery9c766792022-08-10 23:12:49 +09301117 PLDM_ENTITY_ASSOCIAION_PHYSICAL);
1118 EXPECT_NE(node, nullptr);
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06001119 node = pldm_entity_association_tree_add(tree, &entities[1], 0xffff, nullptr,
Andrew Jeffery9c766792022-08-10 23:12:49 +09301120 PLDM_ENTITY_ASSOCIAION_PHYSICAL);
1121 EXPECT_NE(node, nullptr);
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06001122 node = pldm_entity_association_tree_add(tree, &entities[2], 0xffff, nullptr,
Andrew Jeffery9c766792022-08-10 23:12:49 +09301123 PLDM_ENTITY_ASSOCIAION_PHYSICAL);
1124 EXPECT_NE(node, nullptr);
1125 pldm_entity_association_tree_visit(tree, &out, &num);
1126 EXPECT_EQ(num, 3u);
1127 EXPECT_EQ(out[0].entity_type, 1u);
1128 EXPECT_EQ(out[0].entity_instance_num, 1u);
1129 EXPECT_EQ(out[0].entity_container_id, 0u);
1130 EXPECT_EQ(out[1].entity_type, 1u);
1131 EXPECT_EQ(out[1].entity_instance_num, 2u);
1132 EXPECT_EQ(out[1].entity_container_id, 0u);
1133 EXPECT_EQ(out[2].entity_type, 2u);
1134 EXPECT_EQ(out[2].entity_instance_num, 1u);
1135 EXPECT_EQ(out[2].entity_container_id, 0u);
1136 free(out);
1137 pldm_entity_association_tree_destroy(tree);
1138
1139 // A
1140 // |
1141 // A
1142 // |
1143 // A
1144 tree = pldm_entity_association_tree_init();
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06001145 node = pldm_entity_association_tree_add(tree, &entities[0], 0xffff, nullptr,
Andrew Jeffery9c766792022-08-10 23:12:49 +09301146 PLDM_ENTITY_ASSOCIAION_PHYSICAL);
1147 EXPECT_NE(node, nullptr);
1148 auto node1 = pldm_entity_association_tree_add(
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06001149 tree, &entities[1], 0xffff, node, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
Andrew Jeffery9c766792022-08-10 23:12:49 +09301150 EXPECT_NE(node1, nullptr);
1151 auto node2 = pldm_entity_association_tree_add(
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06001152 tree, &entities[2], 0xffff, node1, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
Andrew Jeffery9c766792022-08-10 23:12:49 +09301153 EXPECT_NE(node2, nullptr);
1154 pldm_entity_association_tree_visit(tree, &out, &num);
1155 EXPECT_EQ(num, 3u);
1156 EXPECT_EQ(out[0].entity_type, 1u);
1157 EXPECT_EQ(out[0].entity_instance_num, 1u);
1158 EXPECT_EQ(out[0].entity_container_id, 0u);
1159 EXPECT_EQ(out[1].entity_type, 2u);
1160 EXPECT_EQ(out[1].entity_instance_num, 1u);
1161 EXPECT_EQ(out[1].entity_container_id, 1u);
1162 EXPECT_EQ(out[2].entity_type, 1u);
1163 EXPECT_EQ(out[2].entity_instance_num, 1u);
1164 EXPECT_EQ(out[2].entity_container_id, 2u);
1165 free(out);
1166 pldm_entity_association_tree_destroy(tree);
1167
1168 // A-A
1169 // |
1170 // A-A
1171 tree = pldm_entity_association_tree_init();
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06001172 node = pldm_entity_association_tree_add(tree, &entities[0], 0xffff, nullptr,
Andrew Jeffery9c766792022-08-10 23:12:49 +09301173 PLDM_ENTITY_ASSOCIAION_PHYSICAL);
1174 EXPECT_NE(node, nullptr);
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06001175 node = pldm_entity_association_tree_add(tree, &entities[0], 0xffff, nullptr,
Andrew Jeffery9c766792022-08-10 23:12:49 +09301176 PLDM_ENTITY_ASSOCIAION_PHYSICAL);
1177 EXPECT_NE(node, nullptr);
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06001178 node1 = pldm_entity_association_tree_add(tree, &entities[1], 0xffff, node,
Andrew Jeffery9c766792022-08-10 23:12:49 +09301179 PLDM_ENTITY_ASSOCIAION_PHYSICAL);
1180 EXPECT_NE(node1, nullptr);
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06001181 node2 = pldm_entity_association_tree_add(tree, &entities[2], 0xffff, node,
Andrew Jeffery9c766792022-08-10 23:12:49 +09301182 PLDM_ENTITY_ASSOCIAION_PHYSICAL);
1183 EXPECT_NE(node2, nullptr);
1184 pldm_entity_association_tree_visit(tree, &out, &num);
1185 EXPECT_EQ(num, 4u);
1186 EXPECT_EQ(out[0].entity_type, 1u);
1187 EXPECT_EQ(out[0].entity_instance_num, 1u);
1188 EXPECT_EQ(out[0].entity_container_id, 0u);
1189 EXPECT_EQ(out[1].entity_type, 1u);
1190 EXPECT_EQ(out[1].entity_instance_num, 2u);
1191 EXPECT_EQ(out[1].entity_container_id, 0u);
1192 EXPECT_EQ(out[2].entity_type, 2u);
1193 EXPECT_EQ(out[2].entity_instance_num, 1u);
1194 EXPECT_EQ(out[2].entity_container_id, 1u);
1195 EXPECT_EQ(out[3].entity_type, 1u);
1196 EXPECT_EQ(out[3].entity_instance_num, 1u);
1197 EXPECT_EQ(out[3].entity_container_id, 1u);
1198 free(out);
1199 pldm_entity_association_tree_destroy(tree);
1200}
1201
1202TEST(EntityAssociationPDR, testPDR)
1203{
1204 // e = entity type, c = container id, i = instance num
1205
1206 // INPUT
1207 // 1(e=1)--1a(e=2)
1208 // |
1209 // 2(e=2)--3(e=2)--4(e=2)--5(e=3)
1210 // |
1211 // 6(e=4)--7(e=5)--8(e=5)--9(e=5)
1212 // | |
1213 // 11(e=6) 10(e=7)
1214
1215 // Expected OUTPUT
1216 // 1(e=1,c=0,i=1)
1217 // |
1218 // 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)
1219 // |
1220 // 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)
1221 // | |
1222 // 10(e=6,c=3,i=1) 11(e=7,c=4,i=1)
1223 pldm_entity entities[11]{};
1224
1225 entities[0].entity_type = 1;
1226 entities[1].entity_type = 2;
1227 entities[2].entity_type = 3;
1228 entities[3].entity_type = 2;
1229 entities[4].entity_type = 3;
1230 entities[5].entity_type = 4;
1231 entities[6].entity_type = 5;
1232 entities[7].entity_type = 5;
1233 entities[8].entity_type = 5;
1234 entities[9].entity_type = 6;
1235 entities[10].entity_type = 7;
1236
1237 auto tree = pldm_entity_association_tree_init();
1238
1239 auto l1 = pldm_entity_association_tree_add(
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06001240 tree, &entities[0], 0xffff, nullptr, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
Andrew Jeffery9c766792022-08-10 23:12:49 +09301241 EXPECT_NE(l1, nullptr);
1242 auto l1a = pldm_entity_association_tree_add(
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06001243 tree, &entities[1], 0xffff, nullptr, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
Andrew Jeffery9c766792022-08-10 23:12:49 +09301244 EXPECT_NE(l1a, nullptr);
1245
1246 auto l2a = pldm_entity_association_tree_add(
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06001247 tree, &entities[1], 0xffff, l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
Andrew Jeffery9c766792022-08-10 23:12:49 +09301248 EXPECT_NE(l2a, nullptr);
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06001249 auto l2b = pldm_entity_association_tree_add(tree, &entities[2], 0xffff, l1,
Andrew Jeffery9c766792022-08-10 23:12:49 +09301250 PLDM_ENTITY_ASSOCIAION_LOGICAL);
1251 EXPECT_NE(l2b, nullptr);
1252 auto l2c = pldm_entity_association_tree_add(
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06001253 tree, &entities[3], 0xffff, l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
Andrew Jeffery9c766792022-08-10 23:12:49 +09301254 EXPECT_NE(l2c, nullptr);
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06001255 auto l2d = pldm_entity_association_tree_add(tree, &entities[4], 0xffff, l1,
Andrew Jeffery9c766792022-08-10 23:12:49 +09301256 PLDM_ENTITY_ASSOCIAION_LOGICAL);
1257 EXPECT_NE(l2d, nullptr);
1258
1259 auto l3a = pldm_entity_association_tree_add(
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06001260 tree, &entities[5], 0xffff, l2a, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
Andrew Jeffery9c766792022-08-10 23:12:49 +09301261 EXPECT_NE(l3a, nullptr);
1262 auto l3b = pldm_entity_association_tree_add(
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06001263 tree, &entities[6], 0xffff, l2a, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
Andrew Jeffery9c766792022-08-10 23:12:49 +09301264 EXPECT_NE(l3b, nullptr);
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06001265 auto l3c = pldm_entity_association_tree_add(tree, &entities[7], 0xffff, l2a,
Andrew Jeffery9c766792022-08-10 23:12:49 +09301266 PLDM_ENTITY_ASSOCIAION_LOGICAL);
1267 EXPECT_NE(l3c, nullptr);
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06001268 auto l3d = pldm_entity_association_tree_add(tree, &entities[8], 0xffff, l2a,
Andrew Jeffery9c766792022-08-10 23:12:49 +09301269 PLDM_ENTITY_ASSOCIAION_LOGICAL);
1270 EXPECT_NE(l3d, nullptr);
1271
1272 auto l4a = pldm_entity_association_tree_add(
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06001273 tree, &entities[9], 0xffff, l3a, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
Andrew Jeffery9c766792022-08-10 23:12:49 +09301274 EXPECT_NE(l4a, nullptr);
1275 auto l4b = pldm_entity_association_tree_add(
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06001276 tree, &entities[10], 0xffff, l3b, PLDM_ENTITY_ASSOCIAION_LOGICAL);
Andrew Jeffery9c766792022-08-10 23:12:49 +09301277 EXPECT_NE(l4b, nullptr);
1278
1279 EXPECT_EQ(pldm_entity_get_num_children(l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL),
1280 2);
1281 EXPECT_EQ(pldm_entity_get_num_children(l1, PLDM_ENTITY_ASSOCIAION_LOGICAL),
1282 2);
1283 EXPECT_EQ(
1284 pldm_entity_get_num_children(l2a, PLDM_ENTITY_ASSOCIAION_PHYSICAL), 2);
1285 EXPECT_EQ(
1286 pldm_entity_get_num_children(l3b, PLDM_ENTITY_ASSOCIAION_PHYSICAL), 0);
1287 EXPECT_EQ(pldm_entity_get_num_children(l3b, PLDM_ENTITY_ASSOCIAION_LOGICAL),
1288 1);
1289
1290 auto repo = pldm_pdr_init();
Andrew Jefferyd72ea4b2024-06-24 21:33:33 +09301291 int rc = pldm_entity_association_pdr_add(tree, repo, false, 1);
Andrew Jeffery255f6542023-08-10 15:46:54 +09301292 ASSERT_EQ(rc, 0);
Andrew Jeffery9c766792022-08-10 23:12:49 +09301293
1294 EXPECT_EQ(pldm_pdr_get_record_count(repo), 6u);
1295
1296 uint32_t currRecHandle{};
1297 uint32_t nextRecHandle{};
1298 uint8_t* data = nullptr;
1299 uint32_t size{};
1300 uint32_t commonSize = sizeof(struct pldm_pdr_hdr) + sizeof(uint16_t) +
1301 sizeof(uint8_t) + sizeof(pldm_entity) +
1302 sizeof(uint8_t);
1303
1304 pldm_pdr_find_record(repo, currRecHandle, &data, &size, &nextRecHandle);
1305 EXPECT_EQ(size, commonSize + (pldm_entity_get_num_children(
1306 l1, PLDM_ENTITY_ASSOCIAION_LOGICAL) *
1307 sizeof(pldm_entity)));
1308 uint8_t* start = data;
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +09301309 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Andrew Jeffery9c766792022-08-10 23:12:49 +09301310 pldm_pdr_hdr* hdr = reinterpret_cast<pldm_pdr_hdr*>(start);
1311 EXPECT_EQ(le32toh(hdr->record_handle), 1u);
1312 EXPECT_EQ(hdr->type, PLDM_PDR_ENTITY_ASSOCIATION);
1313 EXPECT_EQ(le16toh(hdr->length), size - sizeof(struct pldm_pdr_hdr));
1314 start += sizeof(pldm_pdr_hdr);
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +09301315 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Andrew Jeffery9c766792022-08-10 23:12:49 +09301316 uint16_t* containerId = reinterpret_cast<uint16_t*>(start);
1317 EXPECT_EQ(le16toh(*containerId), 1u);
1318 start += sizeof(uint16_t);
1319 EXPECT_EQ(*start, PLDM_ENTITY_ASSOCIAION_LOGICAL);
1320 start += sizeof(uint8_t);
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +09301321 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Andrew Jeffery9c766792022-08-10 23:12:49 +09301322 pldm_entity* entity = reinterpret_cast<pldm_entity*>(start);
1323 EXPECT_EQ(le16toh(entity->entity_type), 1u);
1324 EXPECT_EQ(le16toh(entity->entity_instance_num), 1u);
1325 EXPECT_EQ(le16toh(entity->entity_container_id), 0u);
1326 start += sizeof(pldm_entity);
1327 EXPECT_EQ(*start,
1328 pldm_entity_get_num_children(l1, PLDM_ENTITY_ASSOCIAION_LOGICAL));
1329 start += sizeof(uint8_t);
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +09301330 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Andrew Jeffery9c766792022-08-10 23:12:49 +09301331 entity = reinterpret_cast<pldm_entity*>(start);
1332 EXPECT_EQ(le16toh(entity->entity_type), 3u);
1333 EXPECT_EQ(le16toh(entity->entity_instance_num), 1u);
1334 EXPECT_EQ(le16toh(entity->entity_container_id), 1u);
1335 start += sizeof(pldm_entity);
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +09301336 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Andrew Jeffery9c766792022-08-10 23:12:49 +09301337 entity = reinterpret_cast<pldm_entity*>(start);
1338 EXPECT_EQ(le16toh(entity->entity_type), 3u);
1339 EXPECT_EQ(le16toh(entity->entity_instance_num), 2u);
1340 EXPECT_EQ(le16toh(entity->entity_container_id), 1u);
Andrew Jeffery9c766792022-08-10 23:12:49 +09301341
1342 currRecHandle = nextRecHandle;
1343
1344 pldm_pdr_find_record(repo, currRecHandle, &data, &size, &nextRecHandle);
1345 EXPECT_EQ(size, commonSize + (pldm_entity_get_num_children(
1346 l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL) *
1347 sizeof(pldm_entity)));
1348 start = data;
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +09301349 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Andrew Jeffery9c766792022-08-10 23:12:49 +09301350 hdr = reinterpret_cast<pldm_pdr_hdr*>(start);
1351 EXPECT_EQ(le32toh(hdr->record_handle), 2u);
1352 EXPECT_EQ(hdr->type, PLDM_PDR_ENTITY_ASSOCIATION);
1353 EXPECT_EQ(le16toh(hdr->length), size - sizeof(struct pldm_pdr_hdr));
1354 start += sizeof(pldm_pdr_hdr);
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +09301355 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Andrew Jeffery9c766792022-08-10 23:12:49 +09301356 containerId = reinterpret_cast<uint16_t*>(start);
1357 EXPECT_EQ(le16toh(*containerId), 1u);
1358 start += sizeof(uint16_t);
1359 EXPECT_EQ(*start, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
1360 start += sizeof(uint8_t);
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +09301361 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Andrew Jeffery9c766792022-08-10 23:12:49 +09301362 entity = reinterpret_cast<pldm_entity*>(start);
1363 EXPECT_EQ(le16toh(entity->entity_type), 1u);
1364 EXPECT_EQ(le16toh(entity->entity_instance_num), 1u);
1365 EXPECT_EQ(le16toh(entity->entity_container_id), 0u);
1366 start += sizeof(pldm_entity);
1367 EXPECT_EQ(*start, pldm_entity_get_num_children(
1368 l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL));
1369 start += sizeof(uint8_t);
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +09301370 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Andrew Jeffery9c766792022-08-10 23:12:49 +09301371 entity = reinterpret_cast<pldm_entity*>(start);
1372 EXPECT_EQ(le16toh(entity->entity_type), 2u);
1373 EXPECT_EQ(le16toh(entity->entity_instance_num), 1u);
1374 EXPECT_EQ(le16toh(entity->entity_container_id), 1u);
1375 start += sizeof(pldm_entity);
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +09301376 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Andrew Jeffery9c766792022-08-10 23:12:49 +09301377 entity = reinterpret_cast<pldm_entity*>(start);
1378 EXPECT_EQ(le16toh(entity->entity_type), 2u);
1379 EXPECT_EQ(le16toh(entity->entity_instance_num), 2u);
1380 EXPECT_EQ(le16toh(entity->entity_container_id), 1u);
Andrew Jeffery9c766792022-08-10 23:12:49 +09301381
1382 currRecHandle = nextRecHandle;
1383
1384 pldm_pdr_find_record(repo, currRecHandle, &data, &size, &nextRecHandle);
1385 EXPECT_EQ(size, commonSize + (pldm_entity_get_num_children(
1386 l2a, PLDM_ENTITY_ASSOCIAION_LOGICAL) *
1387 sizeof(pldm_entity)));
1388 start = data;
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +09301389 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Andrew Jeffery9c766792022-08-10 23:12:49 +09301390 hdr = reinterpret_cast<pldm_pdr_hdr*>(start);
1391 EXPECT_EQ(le32toh(hdr->record_handle), 3u);
1392 EXPECT_EQ(hdr->type, PLDM_PDR_ENTITY_ASSOCIATION);
1393 EXPECT_EQ(le16toh(hdr->length), size - sizeof(struct pldm_pdr_hdr));
1394 start += sizeof(pldm_pdr_hdr);
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +09301395 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Andrew Jeffery9c766792022-08-10 23:12:49 +09301396 containerId = reinterpret_cast<uint16_t*>(start);
1397 EXPECT_EQ(le16toh(*containerId), 2u);
1398 start += sizeof(uint16_t);
1399 EXPECT_EQ(*start, PLDM_ENTITY_ASSOCIAION_LOGICAL);
1400 start += sizeof(uint8_t);
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +09301401 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Andrew Jeffery9c766792022-08-10 23:12:49 +09301402 entity = reinterpret_cast<pldm_entity*>(start);
1403 EXPECT_EQ(le16toh(entity->entity_type), 2u);
1404 EXPECT_EQ(le16toh(entity->entity_instance_num), 1u);
1405 EXPECT_EQ(le16toh(entity->entity_container_id), 1u);
1406 start += sizeof(pldm_entity);
1407 EXPECT_EQ(*start, pldm_entity_get_num_children(
1408 l2a, PLDM_ENTITY_ASSOCIAION_LOGICAL));
1409 start += sizeof(uint8_t);
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +09301410 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Andrew Jeffery9c766792022-08-10 23:12:49 +09301411 entity = reinterpret_cast<pldm_entity*>(start);
1412 EXPECT_EQ(le16toh(entity->entity_type), 5);
1413 EXPECT_EQ(le16toh(entity->entity_instance_num), 2u);
1414 EXPECT_EQ(le16toh(entity->entity_container_id), 2u);
1415 start += sizeof(pldm_entity);
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +09301416 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Andrew Jeffery9c766792022-08-10 23:12:49 +09301417 entity = reinterpret_cast<pldm_entity*>(start);
1418 EXPECT_EQ(le16toh(entity->entity_type), 5u);
1419 EXPECT_EQ(le16toh(entity->entity_instance_num), 3u);
1420 EXPECT_EQ(le16toh(entity->entity_container_id), 2u);
Andrew Jeffery9c766792022-08-10 23:12:49 +09301421
1422 currRecHandle = nextRecHandle;
1423
1424 pldm_pdr_find_record(repo, currRecHandle, &data, &size, &nextRecHandle);
1425 EXPECT_EQ(size, commonSize + (pldm_entity_get_num_children(
1426 l2a, PLDM_ENTITY_ASSOCIAION_PHYSICAL) *
1427 sizeof(pldm_entity)));
1428 start = data;
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +09301429 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Andrew Jeffery9c766792022-08-10 23:12:49 +09301430 hdr = reinterpret_cast<pldm_pdr_hdr*>(start);
1431 EXPECT_EQ(le32toh(hdr->record_handle), 4u);
1432 EXPECT_EQ(hdr->type, PLDM_PDR_ENTITY_ASSOCIATION);
1433 EXPECT_EQ(le16toh(hdr->length), size - sizeof(struct pldm_pdr_hdr));
1434 start += sizeof(pldm_pdr_hdr);
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +09301435 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Andrew Jeffery9c766792022-08-10 23:12:49 +09301436 containerId = reinterpret_cast<uint16_t*>(start);
1437 EXPECT_EQ(le16toh(*containerId), 2u);
1438 start += sizeof(uint16_t);
1439 EXPECT_EQ(*start, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
1440 start += sizeof(uint8_t);
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +09301441 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Andrew Jeffery9c766792022-08-10 23:12:49 +09301442 entity = reinterpret_cast<pldm_entity*>(start);
1443 EXPECT_EQ(le16toh(entity->entity_type), 2u);
1444 EXPECT_EQ(le16toh(entity->entity_instance_num), 1u);
1445 EXPECT_EQ(le16toh(entity->entity_container_id), 1u);
1446 start += sizeof(pldm_entity);
1447 EXPECT_EQ(*start, pldm_entity_get_num_children(
1448 l2a, PLDM_ENTITY_ASSOCIAION_PHYSICAL));
1449 start += sizeof(uint8_t);
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +09301450 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Andrew Jeffery9c766792022-08-10 23:12:49 +09301451 entity = reinterpret_cast<pldm_entity*>(start);
1452 EXPECT_EQ(le16toh(entity->entity_type), 4u);
1453 EXPECT_EQ(le16toh(entity->entity_instance_num), 1u);
1454 EXPECT_EQ(le16toh(entity->entity_container_id), 2u);
1455 start += sizeof(pldm_entity);
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +09301456 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Andrew Jeffery9c766792022-08-10 23:12:49 +09301457 entity = reinterpret_cast<pldm_entity*>(start);
1458 EXPECT_EQ(le16toh(entity->entity_type), 5u);
1459 EXPECT_EQ(le16toh(entity->entity_instance_num), 1u);
1460 EXPECT_EQ(le16toh(entity->entity_container_id), 2u);
Andrew Jeffery9c766792022-08-10 23:12:49 +09301461
1462 currRecHandle = nextRecHandle;
1463
1464 pldm_pdr_find_record(repo, currRecHandle, &data, &size, &nextRecHandle);
1465 EXPECT_EQ(size, commonSize + (pldm_entity_get_num_children(
1466 l3a, PLDM_ENTITY_ASSOCIAION_PHYSICAL) *
1467 sizeof(pldm_entity)));
1468 start = data;
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +09301469 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Andrew Jeffery9c766792022-08-10 23:12:49 +09301470 hdr = reinterpret_cast<pldm_pdr_hdr*>(start);
1471 EXPECT_EQ(le32toh(hdr->record_handle), 5u);
1472 EXPECT_EQ(hdr->type, PLDM_PDR_ENTITY_ASSOCIATION);
1473 EXPECT_EQ(le16toh(hdr->length), size - sizeof(struct pldm_pdr_hdr));
1474 start += sizeof(pldm_pdr_hdr);
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +09301475 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Andrew Jeffery9c766792022-08-10 23:12:49 +09301476 containerId = reinterpret_cast<uint16_t*>(start);
1477 EXPECT_EQ(le16toh(*containerId), 3u);
1478 start += sizeof(uint16_t);
1479 EXPECT_EQ(*start, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
1480 start += sizeof(uint8_t);
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +09301481 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Andrew Jeffery9c766792022-08-10 23:12:49 +09301482 entity = reinterpret_cast<pldm_entity*>(start);
1483 EXPECT_EQ(le16toh(entity->entity_type), 4u);
1484 EXPECT_EQ(le16toh(entity->entity_instance_num), 1u);
1485 EXPECT_EQ(le16toh(entity->entity_container_id), 2u);
1486 start += sizeof(pldm_entity);
1487 EXPECT_EQ(*start, pldm_entity_get_num_children(
1488 l3a, PLDM_ENTITY_ASSOCIAION_PHYSICAL));
1489 start += sizeof(uint8_t);
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +09301490 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Andrew Jeffery9c766792022-08-10 23:12:49 +09301491 entity = reinterpret_cast<pldm_entity*>(start);
1492 EXPECT_EQ(le16toh(entity->entity_type), 6u);
1493 EXPECT_EQ(le16toh(entity->entity_instance_num), 1u);
1494 EXPECT_EQ(le16toh(entity->entity_container_id), 3u);
Andrew Jeffery9c766792022-08-10 23:12:49 +09301495
1496 currRecHandle = nextRecHandle;
1497
1498 pldm_pdr_find_record(repo, currRecHandle, &data, &size, &nextRecHandle);
1499 EXPECT_EQ(size, commonSize + (pldm_entity_get_num_children(
1500 l3b, PLDM_ENTITY_ASSOCIAION_LOGICAL) *
1501 sizeof(pldm_entity)));
1502 start = data;
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +09301503 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Andrew Jeffery9c766792022-08-10 23:12:49 +09301504 hdr = reinterpret_cast<pldm_pdr_hdr*>(start);
1505 EXPECT_EQ(le32toh(hdr->record_handle), 6u);
1506 EXPECT_EQ(hdr->type, PLDM_PDR_ENTITY_ASSOCIATION);
1507 EXPECT_EQ(le16toh(hdr->length), size - sizeof(struct pldm_pdr_hdr));
1508 start += sizeof(pldm_pdr_hdr);
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +09301509 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Andrew Jeffery9c766792022-08-10 23:12:49 +09301510 containerId = reinterpret_cast<uint16_t*>(start);
1511 EXPECT_EQ(le16toh(*containerId), 4u);
1512 start += sizeof(uint16_t);
1513 EXPECT_EQ(*start, PLDM_ENTITY_ASSOCIAION_LOGICAL);
1514 start += sizeof(uint8_t);
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +09301515 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Andrew Jeffery9c766792022-08-10 23:12:49 +09301516 entity = reinterpret_cast<pldm_entity*>(start);
1517 EXPECT_EQ(le16toh(entity->entity_type), 5u);
1518 EXPECT_EQ(le16toh(entity->entity_instance_num), 1u);
1519 EXPECT_EQ(le16toh(entity->entity_container_id), 2u);
1520 start += sizeof(pldm_entity);
1521 EXPECT_EQ(*start, pldm_entity_get_num_children(
1522 l3b, PLDM_ENTITY_ASSOCIAION_LOGICAL));
1523 start += sizeof(uint8_t);
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +09301524 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Andrew Jeffery9c766792022-08-10 23:12:49 +09301525 entity = reinterpret_cast<pldm_entity*>(start);
1526 EXPECT_EQ(le16toh(entity->entity_type), 7u);
1527 EXPECT_EQ(le16toh(entity->entity_instance_num), 1u);
1528 EXPECT_EQ(le16toh(entity->entity_container_id), 4u);
1529
1530 EXPECT_EQ(nextRecHandle, 0u);
1531
1532 pldm_pdr_destroy(repo);
1533 pldm_entity_association_tree_destroy(tree);
1534}
1535
Archana Kakanibc40dd52024-08-02 00:10:44 -05001536TEST(EntityAssociationPDR, testPDRWithRecordHandle)
1537{
1538 // e = entity type, c = container id, i = instance num
1539
1540 // INPUT
1541 // 1(e=1)
1542 // |
1543 // 2(e=2)--3(e=2)
1544
1545 // Expected OUTPUT
1546 // 1(e=1,c=0,i=1)
1547 // |
1548 // 2(e=2,c=1,i=1)--3(e=2,c=1,i=2)
1549
1550 pldm_entity entities[3] = {{1, 1, 0}, {2, 1, 1}, {3, 1, 1}};
1551 pldm_entity_test testEntities[3] = {{1, 1, 0}, {2, 1, 1}, {3, 1, 1}};
1552
1553 auto tree = pldm_entity_association_tree_init();
1554
1555 auto l1 = pldm_entity_association_tree_add(
1556 tree, &entities[0], 0xffff, nullptr, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
1557 ASSERT_NE(l1, nullptr);
1558
1559 auto l2a = pldm_entity_association_tree_add(
1560 tree, &entities[1], 0xffff, l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
1561 ASSERT_NE(l2a, nullptr);
1562 pldm_entity_association_tree_add(tree, &entities[2], 0xffff, l1,
1563 PLDM_ENTITY_ASSOCIAION_LOGICAL);
1564 auto repo = pldm_pdr_init();
1565 pldm_entity* l_entities = entities;
1566
1567 pldm_entity_node* node = nullptr;
1568 pldm_find_entity_ref_in_tree(tree, entities[0], &node);
1569
1570 ASSERT_NE(node, nullptr);
1571
1572 int numEntities = 3;
1573 pldm_entity_association_pdr_add_from_node_with_record_handle(
1574 node, repo, &l_entities, numEntities, true, 1, (10));
1575
1576 EXPECT_EQ(pldm_pdr_get_record_count(repo), 2u);
1577
1578 uint32_t currRecHandle{};
1579 uint32_t nextRecHandle{};
1580 uint8_t* data = nullptr;
1581 uint32_t size{};
1582
1583 pldm_pdr_find_record(repo, currRecHandle, &data, &size, &nextRecHandle);
1584
1585 struct pldm_msgbuf _buf;
1586 struct pldm_msgbuf* buf = &_buf;
1587
1588 auto rc =
1589 pldm_msgbuf_init_errno(buf,
1590 (sizeof(struct pldm_pdr_hdr) +
1591 sizeof(struct pldm_pdr_entity_association)),
1592 data, size);
1593 ASSERT_EQ(rc, 0);
1594
1595 pldm_association_pdr_test association_pdr = pldm_association_pdr_test{
1596 10,
1597 1,
1598 PLDM_PDR_ENTITY_ASSOCIATION,
1599 1,
1600 static_cast<uint16_t>(size - sizeof(struct pldm_pdr_hdr)),
1601 1,
1602 PLDM_ENTITY_ASSOCIAION_LOGICAL,
1603 1};
1604
1605 verifyEntityAssociationPdr(buf, association_pdr, testEntities[0],
1606 testEntities[2]);
1607
1608 currRecHandle = nextRecHandle;
1609 pldm_pdr_find_record(repo, currRecHandle, &data, &size, &nextRecHandle);
1610 rc = pldm_msgbuf_init_errno(buf,
1611 (sizeof(struct pldm_pdr_hdr) +
1612 sizeof(struct pldm_pdr_entity_association)),
1613 data, size);
1614 ASSERT_EQ(rc, 0);
1615
1616 pldm_association_pdr_test association_pdr1 = pldm_association_pdr_test{
1617 11,
1618 1,
1619 PLDM_PDR_ENTITY_ASSOCIATION,
1620 1,
1621 static_cast<uint16_t>(size - sizeof(struct pldm_pdr_hdr)),
1622 1,
1623 PLDM_ENTITY_ASSOCIAION_PHYSICAL,
1624 1};
1625
1626 verifyEntityAssociationPdr(buf, association_pdr1, testEntities[0],
1627 testEntities[1]);
1628
1629 pldm_pdr_destroy(repo);
1630 pldm_entity_association_tree_destroy(tree);
1631}
1632
Andrew Jeffery9c766792022-08-10 23:12:49 +09301633TEST(EntityAssociationPDR, testFind)
1634{
1635 // 1
1636 // |
1637 // 2--3--4
1638 // |
1639 // 5--6--7
1640 // | |
1641 // 8 9
1642
1643 pldm_entity entities[9]{};
1644
1645 entities[0].entity_type = 1;
1646 entities[1].entity_type = 2;
1647 entities[2].entity_type = 2;
1648 entities[3].entity_type = 3;
1649 entities[4].entity_type = 4;
1650 entities[5].entity_type = 5;
1651 entities[6].entity_type = 5;
1652 entities[7].entity_type = 6;
1653 entities[8].entity_type = 7;
1654
1655 auto tree = pldm_entity_association_tree_init();
1656
1657 auto l1 = pldm_entity_association_tree_add(
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06001658 tree, &entities[0], 0xffff, nullptr, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
Andrew Jeffery9c766792022-08-10 23:12:49 +09301659 EXPECT_NE(l1, nullptr);
1660 auto l2a = pldm_entity_association_tree_add(
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06001661 tree, &entities[1], 0xffff, l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
Andrew Jeffery9c766792022-08-10 23:12:49 +09301662 EXPECT_NE(l2a, nullptr);
1663 auto l2b = pldm_entity_association_tree_add(
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06001664 tree, &entities[2], 0xffff, l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
Andrew Jeffery9c766792022-08-10 23:12:49 +09301665 EXPECT_NE(l2b, nullptr);
1666 auto l2c = pldm_entity_association_tree_add(
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06001667 tree, &entities[3], 0xffff, l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
Andrew Jeffery9c766792022-08-10 23:12:49 +09301668 EXPECT_NE(l2c, nullptr);
1669 auto l3a = pldm_entity_association_tree_add(
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06001670 tree, &entities[4], 0xffff, l2a, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
Andrew Jeffery9c766792022-08-10 23:12:49 +09301671 EXPECT_NE(l3a, nullptr);
1672 auto l3b = pldm_entity_association_tree_add(
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06001673 tree, &entities[5], 0xffff, l2a, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
Andrew Jeffery9c766792022-08-10 23:12:49 +09301674 EXPECT_NE(l3b, nullptr);
1675 auto l3c = pldm_entity_association_tree_add(
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06001676 tree, &entities[6], 0xffff, l2a, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
Andrew Jeffery9c766792022-08-10 23:12:49 +09301677 EXPECT_NE(l3c, nullptr);
1678 auto l4a = pldm_entity_association_tree_add(
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06001679 tree, &entities[7], 0xffff, l3a, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
Andrew Jeffery9c766792022-08-10 23:12:49 +09301680 EXPECT_NE(l4a, nullptr);
1681 auto l4b = pldm_entity_association_tree_add(
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06001682 tree, &entities[8], 0xffff, l3b, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
Andrew Jeffery9c766792022-08-10 23:12:49 +09301683 EXPECT_NE(l4b, nullptr);
1684
1685 pldm_entity entity{};
1686
1687 entity.entity_type = 1;
1688 entity.entity_instance_num = 1;
1689 auto result = pldm_entity_association_tree_find(tree, &entity);
1690 EXPECT_EQ(result, l1);
1691 EXPECT_EQ(entity.entity_container_id, 0);
1692
1693 entity.entity_type = 2;
1694 entity.entity_instance_num = 1;
1695 result = pldm_entity_association_tree_find(tree, &entity);
1696 EXPECT_EQ(result, l2a);
1697 EXPECT_EQ(entity.entity_container_id, 1);
1698 entity.entity_type = 2;
1699 entity.entity_instance_num = 2;
1700 result = pldm_entity_association_tree_find(tree, &entity);
1701 EXPECT_EQ(result, l2b);
1702 EXPECT_EQ(entity.entity_container_id, 1);
1703 entity.entity_type = 3;
1704 entity.entity_instance_num = 1;
1705 result = pldm_entity_association_tree_find(tree, &entity);
1706 EXPECT_EQ(result, l2c);
1707 EXPECT_EQ(entity.entity_container_id, 1);
1708
1709 entity.entity_type = 7;
1710 entity.entity_instance_num = 1;
1711 result = pldm_entity_association_tree_find(tree, &entity);
1712 EXPECT_EQ(result, l4b);
1713 EXPECT_EQ(entity.entity_container_id, 4);
1714
1715 pldm_entity_association_tree_destroy(tree);
1716}
1717
Andrew Jeffery60582152024-09-22 21:16:38 +09301718#ifdef LIBPLDM_API_TESTING
Andrew Jeffery9c766792022-08-10 23:12:49 +09301719TEST(EntityAssociationPDR, testCopyTree)
1720{
1721 pldm_entity entities[4]{};
Andrew Jeffery60582152024-09-22 21:16:38 +09301722 int rc;
1723
Andrew Jeffery9c766792022-08-10 23:12:49 +09301724 entities[0].entity_type = 1;
1725 entities[1].entity_type = 2;
1726 entities[2].entity_type = 2;
1727 entities[3].entity_type = 3;
1728
1729 auto orgTree = pldm_entity_association_tree_init();
1730 auto newTree = pldm_entity_association_tree_init();
1731 auto l1 =
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06001732 pldm_entity_association_tree_add(orgTree, &entities[0], 0xffff, nullptr,
Andrew Jeffery9c766792022-08-10 23:12:49 +09301733 PLDM_ENTITY_ASSOCIAION_PHYSICAL);
1734 EXPECT_NE(l1, nullptr);
1735 auto l2a = pldm_entity_association_tree_add(
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06001736 orgTree, &entities[1], 0xffff, l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
Andrew Jeffery9c766792022-08-10 23:12:49 +09301737 EXPECT_NE(l2a, nullptr);
1738 auto l2b = pldm_entity_association_tree_add(
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06001739 orgTree, &entities[2], 0xffff, l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
Andrew Jeffery9c766792022-08-10 23:12:49 +09301740 EXPECT_NE(l2b, nullptr);
1741 auto l2c = pldm_entity_association_tree_add(
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06001742 orgTree, &entities[3], 0xffff, l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
Andrew Jeffery9c766792022-08-10 23:12:49 +09301743 EXPECT_NE(l2c, nullptr);
1744 size_t orgNum{};
1745 pldm_entity* orgOut = nullptr;
1746 pldm_entity_association_tree_visit(orgTree, &orgOut, &orgNum);
1747 EXPECT_EQ(orgNum, 4u);
1748
Andrew Jeffery60582152024-09-22 21:16:38 +09301749 rc = pldm_entity_association_tree_copy_root_check(orgTree, newTree);
1750 ASSERT_EQ(rc, 0);
Andrew Jeffery9c766792022-08-10 23:12:49 +09301751 size_t newNum{};
1752 pldm_entity* newOut = nullptr;
1753 pldm_entity_association_tree_visit(newTree, &newOut, &newNum);
1754 EXPECT_EQ(newNum, orgNum);
1755 EXPECT_EQ(newOut[0].entity_type, 1u);
1756 EXPECT_EQ(newOut[0].entity_instance_num, 1u);
1757 EXPECT_EQ(newOut[0].entity_container_id, 0u);
1758 free(orgOut);
1759 free(newOut);
1760 pldm_entity_association_tree_destroy(orgTree);
1761 pldm_entity_association_tree_destroy(newTree);
1762}
Andrew Jeffery60582152024-09-22 21:16:38 +09301763#endif
Andrew Jeffery9c766792022-08-10 23:12:49 +09301764
1765TEST(EntityAssociationPDR, testExtract)
1766{
1767 std::vector<uint8_t> pdr{};
1768 pdr.resize(sizeof(pldm_pdr_hdr) + sizeof(pldm_pdr_entity_association) +
Archana Kakanibc40dd52024-08-02 00:10:44 -05001769 sizeof(pldm_entity) * 4);
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +09301770 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Andrew Jeffery9c766792022-08-10 23:12:49 +09301771 pldm_pdr_hdr* hdr = reinterpret_cast<pldm_pdr_hdr*>(pdr.data());
1772 hdr->type = PLDM_PDR_ENTITY_ASSOCIATION;
1773 hdr->length =
Archana Kakanibc40dd52024-08-02 00:10:44 -05001774 htole16(sizeof(pldm_pdr_entity_association) + sizeof(pldm_entity) * 4);
Andrew Jeffery9c766792022-08-10 23:12:49 +09301775
1776 pldm_pdr_entity_association* e =
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +09301777 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Andrew Jeffery9c766792022-08-10 23:12:49 +09301778 reinterpret_cast<pldm_pdr_entity_association*>(pdr.data() +
1779 sizeof(pldm_pdr_hdr));
1780 e->container_id = htole16(1);
1781 e->num_children = 5;
1782 e->container.entity_type = htole16(1);
1783 e->container.entity_instance_num = htole16(1);
1784 e->container.entity_container_id = htole16(0);
1785
1786 pldm_entity* entity = e->children;
1787 entity->entity_type = htole16(2);
1788 entity->entity_instance_num = htole16(1);
1789 entity->entity_container_id = htole16(1);
1790 ++entity;
1791 entity->entity_type = htole16(3);
1792 entity->entity_instance_num = htole16(1);
1793 entity->entity_container_id = htole16(1);
1794 ++entity;
1795 entity->entity_type = htole16(4);
1796 entity->entity_instance_num = htole16(1);
1797 entity->entity_container_id = htole16(1);
1798 ++entity;
1799 entity->entity_type = htole16(5);
1800 entity->entity_instance_num = htole16(1);
1801 entity->entity_container_id = htole16(1);
1802 ++entity;
1803 entity->entity_type = htole16(6);
1804 entity->entity_instance_num = htole16(1);
1805 entity->entity_container_id = htole16(1);
1806
1807 size_t num{};
1808 pldm_entity* out = nullptr;
1809 pldm_entity_association_pdr_extract(pdr.data(), pdr.size(), &num, &out);
1810 EXPECT_EQ(num, (unsigned)e->num_children + 1);
1811 EXPECT_EQ(out[0].entity_type, 1u);
1812 EXPECT_EQ(out[0].entity_instance_num, 1u);
1813 EXPECT_EQ(out[0].entity_container_id, 0u);
1814 EXPECT_EQ(out[1].entity_type, 2u);
1815 EXPECT_EQ(out[1].entity_instance_num, 1u);
1816 EXPECT_EQ(out[1].entity_container_id, 1u);
1817 EXPECT_EQ(out[2].entity_type, 3u);
1818 EXPECT_EQ(out[2].entity_instance_num, 1u);
1819 EXPECT_EQ(out[2].entity_container_id, 1u);
1820 EXPECT_EQ(out[3].entity_type, 4u);
1821 EXPECT_EQ(out[3].entity_instance_num, 1u);
1822 EXPECT_EQ(out[3].entity_container_id, 1u);
1823 EXPECT_EQ(out[4].entity_type, 5u);
1824 EXPECT_EQ(out[4].entity_instance_num, 1u);
1825 EXPECT_EQ(out[4].entity_container_id, 1u);
1826 EXPECT_EQ(out[5].entity_type, 6u);
1827 EXPECT_EQ(out[5].entity_instance_num, 1u);
1828 EXPECT_EQ(out[5].entity_container_id, 1u);
1829
1830 free(out);
1831}
1832
1833TEST(EntityAssociationPDR, testGetChildren)
1834{
1835 pldm_entity entities[4]{};
1836 entities[0].entity_type = 1;
1837 entities[1].entity_type = 2;
1838 entities[2].entity_type = 2;
1839 entities[3].entity_type = 3;
1840
1841 auto tree = pldm_entity_association_tree_init();
1842 auto l1 = pldm_entity_association_tree_add(
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06001843 tree, &entities[0], 0xffff, nullptr, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
Andrew Jeffery9c766792022-08-10 23:12:49 +09301844 EXPECT_NE(l1, nullptr);
1845 auto l2a = pldm_entity_association_tree_add(
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06001846 tree, &entities[1], 0xffff, l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
Andrew Jeffery9c766792022-08-10 23:12:49 +09301847 EXPECT_NE(l2a, nullptr);
1848 auto l2b = pldm_entity_association_tree_add(
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06001849 tree, &entities[2], 0xffff, l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
Andrew Jeffery9c766792022-08-10 23:12:49 +09301850 EXPECT_NE(l2b, nullptr);
1851 auto l2c = pldm_entity_association_tree_add(
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06001852 tree, &entities[3], 0xffff, l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
Andrew Jeffery9c766792022-08-10 23:12:49 +09301853 EXPECT_NE(l2c, nullptr);
1854
1855 pldm_entity et1;
1856 et1.entity_type = 2;
1857 et1.entity_instance_num = 1;
1858 EXPECT_EQ(true, pldm_is_current_parent_child(l1, &et1));
1859
1860 pldm_entity et2;
1861 et2.entity_type = 2;
1862 et2.entity_instance_num = 2;
1863 EXPECT_EQ(true, pldm_is_current_parent_child(l1, &et2));
1864
1865 pldm_entity et3;
1866 et3.entity_type = 2;
1867 et3.entity_instance_num = 3;
1868 EXPECT_EQ(false, pldm_is_current_parent_child(l1, &et3));
1869
1870 pldm_entity_association_tree_destroy(tree);
1871}
1872
1873TEST(EntityAssociationPDR, testEntityInstanceNumber)
1874{
1875 pldm_entity entities[9]{};
1876
1877 entities[0].entity_type = 1;
1878 entities[1].entity_type = 2;
1879 entities[2].entity_type = 2;
1880 entities[3].entity_type = 2;
1881 entities[4].entity_type = 2;
1882 entities[5].entity_type = 2;
1883 entities[6].entity_type = 2;
1884 entities[7].entity_type = 3;
1885 entities[8].entity_type = 3;
1886
1887 auto tree = pldm_entity_association_tree_init();
1888 auto repo = pldm_pdr_init();
1889
1890 uint16_t terminusHdl{};
1891 uint16_t entityType{};
1892 uint16_t entityInstanceNum{};
1893 uint16_t containerId{};
1894
1895 auto node = pldm_entity_association_tree_add(
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06001896 tree, &entities[0], 0xffff, nullptr, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
Andrew Jeffery9c766792022-08-10 23:12:49 +09301897 EXPECT_NE(node, nullptr);
1898
1899 auto l1 = pldm_entity_association_tree_add(tree, &entities[1], 63, node,
1900 PLDM_ENTITY_ASSOCIAION_PHYSICAL);
Andrew Jeffery14d29842023-07-17 15:29:32 +09301901 uint32_t first = 1;
Andrew Jefferye7f55112024-06-20 16:16:01 +09301902 EXPECT_EQ(pldm_pdr_add_fru_record_set(repo, 1, 1, entities[1].entity_type,
1903 entities[1].entity_instance_num,
1904 entities[1].entity_container_id,
1905 &first),
Andrew Jeffery14d29842023-07-17 15:29:32 +09301906 0);
Andrew Jeffery9c766792022-08-10 23:12:49 +09301907 EXPECT_NE(l1, nullptr);
1908 EXPECT_EQ(entities[1].entity_instance_num, 63);
1909 EXPECT_EQ(first, pldm_pdr_get_record_handle(
1910 repo, pldm_pdr_fru_record_set_find_by_rsi(
1911 repo, 1, &terminusHdl, &entityType,
1912 &entityInstanceNum, &containerId)));
1913 EXPECT_EQ(entityType, 2);
1914 EXPECT_EQ(entityInstanceNum, 63);
1915
1916 auto l2 = pldm_entity_association_tree_add(tree, &entities[2], 37, node,
1917 PLDM_ENTITY_ASSOCIAION_PHYSICAL);
Andrew Jeffery14d29842023-07-17 15:29:32 +09301918 uint32_t second = 2;
Andrew Jefferye7f55112024-06-20 16:16:01 +09301919 EXPECT_EQ(pldm_pdr_add_fru_record_set(repo, 1, 2, entities[2].entity_type,
1920 entities[2].entity_instance_num,
1921 entities[2].entity_container_id,
1922 &second),
Andrew Jeffery14d29842023-07-17 15:29:32 +09301923 0);
Andrew Jeffery9c766792022-08-10 23:12:49 +09301924 EXPECT_NE(l2, nullptr);
1925 EXPECT_EQ(entities[2].entity_instance_num, 37);
1926 EXPECT_EQ(second, pldm_pdr_get_record_handle(
1927 repo, pldm_pdr_fru_record_set_find_by_rsi(
1928 repo, 2, &terminusHdl, &entityType,
1929 &entityInstanceNum, &containerId)));
1930 EXPECT_EQ(entityType, 2);
1931 EXPECT_EQ(entityInstanceNum, 37);
1932
1933 auto l3 = pldm_entity_association_tree_add(tree, &entities[3], 44, node,
1934 PLDM_ENTITY_ASSOCIAION_PHYSICAL);
Andrew Jeffery14d29842023-07-17 15:29:32 +09301935 uint32_t third = 3;
Andrew Jefferye7f55112024-06-20 16:16:01 +09301936 EXPECT_EQ(pldm_pdr_add_fru_record_set(repo, 1, 3, entities[3].entity_type,
1937 entities[3].entity_instance_num,
1938 entities[3].entity_container_id,
1939 &third),
Andrew Jeffery14d29842023-07-17 15:29:32 +09301940 0);
Andrew Jeffery9c766792022-08-10 23:12:49 +09301941 EXPECT_NE(l3, nullptr);
1942 EXPECT_EQ(entities[3].entity_instance_num, 44);
1943 EXPECT_EQ(third, pldm_pdr_get_record_handle(
1944 repo, pldm_pdr_fru_record_set_find_by_rsi(
1945 repo, 3, &terminusHdl, &entityType,
1946 &entityInstanceNum, &containerId)));
1947 EXPECT_EQ(entityType, 2);
1948 EXPECT_EQ(entityInstanceNum, 44);
1949
1950 auto l4 = pldm_entity_association_tree_add(tree, &entities[4], 89, node,
1951 PLDM_ENTITY_ASSOCIAION_PHYSICAL);
Andrew Jeffery14d29842023-07-17 15:29:32 +09301952 uint32_t fourth = 4;
Andrew Jefferye7f55112024-06-20 16:16:01 +09301953 EXPECT_EQ(pldm_pdr_add_fru_record_set(repo, 1, 4, entities[4].entity_type,
1954 entities[4].entity_instance_num,
1955 entities[4].entity_container_id,
1956 &fourth),
Andrew Jeffery14d29842023-07-17 15:29:32 +09301957 0);
Andrew Jeffery9c766792022-08-10 23:12:49 +09301958 EXPECT_NE(l4, nullptr);
1959 EXPECT_EQ(entities[4].entity_instance_num, 89);
1960 EXPECT_EQ(fourth, pldm_pdr_get_record_handle(
1961 repo, pldm_pdr_fru_record_set_find_by_rsi(
1962 repo, 4, &terminusHdl, &entityType,
1963 &entityInstanceNum, &containerId)));
1964 EXPECT_EQ(entityType, 2);
1965 EXPECT_EQ(entityInstanceNum, 89);
1966
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06001967 auto l5 = pldm_entity_association_tree_add(tree, &entities[5], 0xffff, node,
Andrew Jeffery9c766792022-08-10 23:12:49 +09301968 PLDM_ENTITY_ASSOCIAION_PHYSICAL);
Andrew Jeffery14d29842023-07-17 15:29:32 +09301969 uint32_t fifth = 5;
Andrew Jefferye7f55112024-06-20 16:16:01 +09301970 EXPECT_EQ(pldm_pdr_add_fru_record_set(repo, 1, 5, entities[5].entity_type,
1971 entities[5].entity_instance_num,
1972 entities[5].entity_container_id,
1973 &fifth),
Andrew Jeffery14d29842023-07-17 15:29:32 +09301974 0);
Andrew Jeffery9c766792022-08-10 23:12:49 +09301975 EXPECT_NE(l5, nullptr);
1976 EXPECT_EQ(entities[5].entity_instance_num, 90);
1977 EXPECT_EQ(fifth, pldm_pdr_get_record_handle(
1978 repo, pldm_pdr_fru_record_set_find_by_rsi(
1979 repo, 5, &terminusHdl, &entityType,
1980 &entityInstanceNum, &containerId)));
1981 EXPECT_EQ(entityType, 2);
1982 EXPECT_EQ(entityInstanceNum, 90);
1983
1984 auto l6 = pldm_entity_association_tree_add(tree, &entities[6], 90, node,
1985 PLDM_ENTITY_ASSOCIAION_PHYSICAL);
1986 EXPECT_EQ(l6, nullptr);
1987
1988 auto l7 = pldm_entity_association_tree_add(tree, &entities[7], 100, l1,
1989 PLDM_ENTITY_ASSOCIAION_PHYSICAL);
Andrew Jeffery14d29842023-07-17 15:29:32 +09301990 uint32_t seventh = 7;
Andrew Jefferye7f55112024-06-20 16:16:01 +09301991 EXPECT_EQ(pldm_pdr_add_fru_record_set(repo, 1, 7, entities[7].entity_type,
1992 entities[7].entity_instance_num,
1993 entities[7].entity_container_id,
1994 &seventh),
Andrew Jeffery14d29842023-07-17 15:29:32 +09301995 0);
Andrew Jeffery9c766792022-08-10 23:12:49 +09301996 EXPECT_NE(l7, nullptr);
1997 EXPECT_EQ(entities[7].entity_instance_num, 100);
1998 EXPECT_EQ(seventh, pldm_pdr_get_record_handle(
1999 repo, pldm_pdr_fru_record_set_find_by_rsi(
2000 repo, 7, &terminusHdl, &entityType,
2001 &entityInstanceNum, &containerId)));
2002 EXPECT_EQ(entityType, 3);
2003 EXPECT_EQ(entityInstanceNum, 100);
2004
2005 auto l8 = pldm_entity_association_tree_add(tree, &entities[8], 100, l2,
2006 PLDM_ENTITY_ASSOCIAION_PHYSICAL);
Andrew Jeffery14d29842023-07-17 15:29:32 +09302007 uint32_t eighth = 8;
Andrew Jefferye7f55112024-06-20 16:16:01 +09302008 EXPECT_EQ(pldm_pdr_add_fru_record_set(repo, 1, 8, entities[8].entity_type,
2009 entities[8].entity_instance_num,
2010 entities[8].entity_container_id,
2011 &eighth),
Andrew Jeffery14d29842023-07-17 15:29:32 +09302012 0);
Andrew Jeffery9c766792022-08-10 23:12:49 +09302013 EXPECT_NE(l8, nullptr);
2014 EXPECT_EQ(entities[8].entity_instance_num, 100);
2015 EXPECT_EQ(eighth, pldm_pdr_get_record_handle(
2016 repo, pldm_pdr_fru_record_set_find_by_rsi(
2017 repo, 8, &terminusHdl, &entityType,
2018 &entityInstanceNum, &containerId)));
2019 EXPECT_EQ(entityType, 3);
2020 EXPECT_EQ(entityInstanceNum, 100);
2021
2022 pldm_pdr_destroy(repo);
2023 pldm_entity_association_tree_destroy(tree);
2024}
Pavithra Barithaya5dc02572023-05-19 09:24:36 -05002025
Andrew Jeffery14a5fe82023-06-26 15:31:37 +09302026#ifdef LIBPLDM_API_TESTING
Pavithra Barithaya8cf70452023-06-22 04:36:19 -05002027TEST(EntityAssociationPDR, testFindChildContainerID)
Pavithra Barithaya5dc02572023-05-19 09:24:36 -05002028{
2029 pldm_entity entities[3]{};
2030 entities[0].entity_type = 1;
2031 entities[1].entity_type = 2;
2032 entities[2].entity_type = 3;
2033 entities[1].entity_container_id = 2;
2034 entities[1].entity_instance_num = 1;
2035
2036 auto tree = pldm_entity_association_tree_init();
2037 auto l1 = pldm_entity_association_tree_add_entity(
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06002038 tree, &entities[0], 0xffff, nullptr, PLDM_ENTITY_ASSOCIAION_LOGICAL,
2039 false, true, 0xffff);
Pavithra Barithaya5dc02572023-05-19 09:24:36 -05002040
2041 EXPECT_NE(l1, nullptr);
2042 auto l2 = pldm_entity_association_tree_add_entity(
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06002043 tree, &entities[1], 0xffff, l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL, false,
2044 false, 0xffff);
Pavithra Barithaya5dc02572023-05-19 09:24:36 -05002045 EXPECT_NE(l2, nullptr);
2046 auto l3 = pldm_entity_association_tree_add_entity(
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06002047 tree, &entities[2], 0xffff, l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL, false,
2048 true, 0xffff);
Pavithra Barithaya5dc02572023-05-19 09:24:36 -05002049 EXPECT_NE(l3, nullptr);
2050
2051 EXPECT_EQ(pldm_entity_get_num_children(l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL),
2052 2);
2053
2054 auto repo = pldm_pdr_init();
Andrew Jefferyd72ea4b2024-06-24 21:33:33 +09302055 int rc = pldm_entity_association_pdr_add(tree, repo, false, 1);
Andrew Jeffery255f6542023-08-10 15:46:54 +09302056 ASSERT_EQ(rc, 0);
Pavithra Barithaya5dc02572023-05-19 09:24:36 -05002057
2058 EXPECT_EQ(pldm_pdr_get_record_count(repo), 1u);
2059
2060 uint16_t container_id{};
Pavithra Barithaya8cf70452023-06-22 04:36:19 -05002061 pldm_pdr_find_child_container_id_index_range_exclude(
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06002062 repo, 1, 1, 0, 0x01000000, 0x01ffffff, &container_id);
Pavithra Barithaya5dc02572023-05-19 09:24:36 -05002063 EXPECT_EQ(container_id, 2);
2064
2065 uint16_t container_id1{};
Pavithra Barithaya8cf70452023-06-22 04:36:19 -05002066 pldm_pdr_find_child_container_id_index_range_exclude(
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06002067 repo, 1, 1, 0, 0x00000001, 0x00ffffff, &container_id1);
Pavithra Barithaya5dc02572023-05-19 09:24:36 -05002068 EXPECT_EQ(container_id1, 0);
2069
2070 pldm_pdr_destroy(repo);
2071 pldm_entity_association_tree_destroy(tree);
2072}
Andrew Jeffery14a5fe82023-06-26 15:31:37 +09302073#endif
Pavithra Barithaya39eb3222023-11-17 03:30:27 -06002074
2075TEST(EntityAssociationPDR, testNodeAddCheck)
2076{
2077 // pldm_entity entities[4]{};
2078 pldm_entity* entities = (pldm_entity*)malloc(sizeof(pldm_entity) * 4);
2079 entities[0].entity_type = 1;
2080 entities[1].entity_type = 2;
2081 entities[2].entity_type = 2;
2082 entities[3].entity_type = 3;
2083
2084 auto tree = pldm_entity_association_tree_init();
2085
2086 auto l1 = pldm_entity_association_tree_add(
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06002087 tree, &entities[0], 0xffff, nullptr, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
Pavithra Barithaya39eb3222023-11-17 03:30:27 -06002088 EXPECT_NE(l1, nullptr);
2089 auto l2a = pldm_entity_association_tree_add(
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06002090 tree, &entities[1], 0xffff, l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
Pavithra Barithaya39eb3222023-11-17 03:30:27 -06002091 EXPECT_NE(l2a, nullptr);
2092 auto l2b = pldm_entity_association_tree_add(
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06002093 tree, &entities[2], 0xffff, l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
Pavithra Barithaya39eb3222023-11-17 03:30:27 -06002094 EXPECT_NE(l2b, nullptr);
2095 auto l2c = pldm_entity_association_tree_add(
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06002096 tree, &entities[3], 0xffff, l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
Pavithra Barithaya39eb3222023-11-17 03:30:27 -06002097 EXPECT_NE(l2c, nullptr);
2098
2099 auto repo = pldm_pdr_init();
2100
2101 EXPECT_EQ(pldm_entity_association_pdr_add_from_node_with_record_handle(
2102 l1, repo, &entities, 4, false, 1, 0),
2103 0);
2104 EXPECT_EQ(pldm_entity_association_pdr_add_from_node_with_record_handle(
2105 l1, repo, &entities, 4, false, 1, 2),
2106 0);
2107 EXPECT_EQ(pldm_entity_association_pdr_add_from_node_with_record_handle(
2108 l1, repo, &entities, 4, false, 1, 23),
2109 0);
2110 EXPECT_EQ(pldm_entity_association_pdr_add_from_node_with_record_handle(
2111 l1, repo, &entities, 4, false, 1, 34),
2112 0);
2113
2114 EXPECT_EQ(pldm_pdr_get_record_count(repo), 4u);
2115
2116 uint8_t* outData = nullptr;
2117 uint32_t size{};
2118 uint32_t nextRecHdl{};
2119 auto hdl = pldm_pdr_find_record(repo, 0, &outData, &size, &nextRecHdl);
2120 EXPECT_NE(hdl, nullptr);
2121
2122 outData = nullptr;
2123 auto hdl1 = pldm_pdr_find_record(repo, 2, &outData, &size, &nextRecHdl);
2124 EXPECT_NE(hdl1, nullptr);
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +09302125 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Pavithra Barithaya39eb3222023-11-17 03:30:27 -06002126 pldm_pdr_hdr* hdr = reinterpret_cast<pldm_pdr_hdr*>(outData);
2127 EXPECT_EQ(hdr->record_handle, 2);
2128
2129 outData = nullptr;
2130 auto hdl2 = pldm_pdr_find_record(repo, 23, &outData, &size, &nextRecHdl);
2131 EXPECT_NE(hdl2, nullptr);
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +09302132 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Pavithra Barithaya39eb3222023-11-17 03:30:27 -06002133 pldm_pdr_hdr* hdr1 = reinterpret_cast<pldm_pdr_hdr*>(outData);
2134 EXPECT_EQ(hdr1->record_handle, 23);
2135
2136 outData = nullptr;
2137 auto hdl3 = pldm_pdr_find_record(repo, 3, &outData, &size, &nextRecHdl);
2138 EXPECT_EQ(hdl3, nullptr);
2139
2140 free(entities);
2141 pldm_pdr_destroy(repo);
2142 pldm_entity_association_tree_destroy(tree);
2143}
Varsha Kaverappa37552b92024-02-12 05:06:06 -06002144
Andrew Jeffery1111a972024-06-03 13:39:18 +09302145#ifdef LIBPLDM_API_TESTING
Varsha Kaverappa37552b92024-02-12 05:06:06 -06002146TEST(EntityAssociationPDR, testAddContainedEntityRemotePDR)
2147{
2148 // pldm_entity entities[5]{};
2149 pldm_entity* entities = (pldm_entity*)malloc(sizeof(pldm_entity) * 5);
2150 entities[0].entity_type = 1;
2151 entities[1].entity_type = 2;
2152 entities[2].entity_type = 3;
2153 entities[3].entity_type = 4;
2154 entities[4].entity_type = 5;
2155
2156 auto tree = pldm_entity_association_tree_init();
2157 auto l1 = pldm_entity_association_tree_add(
2158 tree, &entities[0], 0xffff, nullptr, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
2159 EXPECT_NE(l1, nullptr);
2160 auto l2a = pldm_entity_association_tree_add(
2161 tree, &entities[1], 0xffff, l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
2162 EXPECT_NE(l2a, nullptr);
2163 auto l2b = pldm_entity_association_tree_add(
2164 tree, &entities[2], 0xffff, l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
2165 EXPECT_NE(l2b, nullptr);
2166 auto l2c = pldm_entity_association_tree_add(
2167 tree, &entities[3], 0xffff, l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
2168 EXPECT_NE(l2c, nullptr);
2169 auto l3a = pldm_entity_association_tree_add(
2170 tree, &entities[4], 0xffff, l2a, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
2171 EXPECT_NE(l3a, nullptr);
2172
2173 auto repo = pldm_pdr_init();
2174
2175 EXPECT_EQ(pldm_entity_association_pdr_add_from_node_with_record_handle(
2176 l1, repo, &entities, 5, false, 1, 0),
2177 0);
2178 EXPECT_EQ(pldm_entity_association_pdr_add_from_node_with_record_handle(
2179 l1, repo, &entities, 5, false, 1, 2),
2180 0);
2181 EXPECT_EQ(pldm_entity_association_pdr_add_from_node_with_record_handle(
2182 l1, repo, &entities, 5, false, 1, 23),
2183 0);
2184 EXPECT_EQ(pldm_entity_association_pdr_add_from_node_with_record_handle(
2185 l1, repo, &entities, 5, false, 1, 34),
2186 0);
2187 EXPECT_EQ(pldm_entity_association_pdr_add_from_node_with_record_handle(
2188 l2a, repo, &entities, 5, false, 1, 3),
2189 0);
2190
2191 pldm_entity entity1[1];
2192 entity1[0].entity_type = 2;
2193
2194 EXPECT_EQ(pldm_entity_association_pdr_add_contained_entity_to_remote_pdr(
2195 repo, &entity1[0], 2),
2196 0);
2197
2198 free(entities);
2199 pldm_pdr_destroy(repo);
2200 pldm_entity_association_tree_destroy(tree);
2201}
Andrew Jeffery1111a972024-06-03 13:39:18 +09302202#endif
Varsha Kaverappa37552b92024-02-12 05:06:06 -06002203
Andrew Jeffery1111a972024-06-03 13:39:18 +09302204#ifdef LIBPLDM_API_TESTING
Varsha Kaverappa37552b92024-02-12 05:06:06 -06002205TEST(EntityAssociationPDR, testAddContainedEntityNew)
2206{
2207 // pldm_entity entities[5]{};
2208 pldm_entity* entities = (pldm_entity*)malloc(sizeof(pldm_entity) * 5);
2209 entities[0].entity_type = 1;
2210 entities[1].entity_type = 2;
2211 entities[2].entity_type = 3;
2212 entities[3].entity_type = 4;
2213 entities[4].entity_type = 5;
2214
2215 auto tree = pldm_entity_association_tree_init();
2216 auto l1 = pldm_entity_association_tree_add(
2217 tree, &entities[0], 0xffff, nullptr, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
2218 EXPECT_NE(l1, nullptr);
2219 auto l2a = pldm_entity_association_tree_add(
2220 tree, &entities[1], 0xffff, l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
2221 EXPECT_NE(l2a, nullptr);
2222 auto l2b = pldm_entity_association_tree_add(
2223 tree, &entities[2], 0xffff, l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
2224 EXPECT_NE(l2b, nullptr);
2225 auto l2c = pldm_entity_association_tree_add(
2226 tree, &entities[3], 0xffff, l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
2227 EXPECT_NE(l2c, nullptr);
2228 auto l3a = pldm_entity_association_tree_add(
2229 tree, &entities[4], 0xffff, l2a, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
2230 EXPECT_NE(l3a, nullptr);
2231
2232 auto repo = pldm_pdr_init();
2233
2234 EXPECT_EQ(pldm_entity_association_pdr_add_from_node_with_record_handle(
2235 l1, repo, &entities, 5, false, 1, 0),
2236 0);
2237 EXPECT_EQ(pldm_entity_association_pdr_add_from_node_with_record_handle(
2238 l1, repo, &entities, 5, false, 1, 2),
2239 0);
2240 EXPECT_EQ(pldm_entity_association_pdr_add_from_node_with_record_handle(
2241 l1, repo, &entities, 5, false, 1, 23),
2242 0);
2243 EXPECT_EQ(pldm_entity_association_pdr_add_from_node_with_record_handle(
2244 l1, repo, &entities, 5, false, 1, 34),
2245 0);
2246 EXPECT_EQ(pldm_entity_association_pdr_add_from_node_with_record_handle(
2247 l2a, repo, &entities, 5, false, 1, 3),
2248 0);
2249
2250 uint32_t updated_record_handle = 0;
2251
2252 pldm_entity entity2[1]{};
2253 entity2[0].entity_type = 4;
2254
2255 pldm_entity entity3[1]{};
2256 entity3[0].entity_type = 4;
2257
2258 EXPECT_EQ(pldm_entity_association_pdr_create_new(
2259 repo, 34, &entity2[0], &entity3[0], &updated_record_handle),
2260 0);
2261
2262 EXPECT_EQ(updated_record_handle, 35);
2263
2264 free(entities);
2265 pldm_pdr_destroy(repo);
2266 pldm_entity_association_tree_destroy(tree);
2267}
Andrew Jeffery1111a972024-06-03 13:39:18 +09302268#endif
Varsha Kaverappab31e4c62024-06-25 06:45:46 -05002269
2270#ifdef LIBPLDM_API_TESTING
2271TEST(EntityAssociationPDR, testRemoveContainedEntity)
2272{
2273 struct pldm_entity entities[4] = {
2274 {.entity_type = 1, .entity_instance_num = 1, .entity_container_id = 2},
2275 {.entity_type = 2, .entity_instance_num = 1, .entity_container_id = 2},
2276 {.entity_type = 3, .entity_instance_num = 3, .entity_container_id = 3},
2277 {.entity_type = 4, .entity_instance_num = 1, .entity_container_id = 2}};
2278 struct pldm_entity* base = entities;
2279
2280 auto tree = pldm_entity_association_tree_init();
2281 auto l1 = pldm_entity_association_tree_add_entity(
2282 tree, &entities[0], 0xffff, nullptr, PLDM_ENTITY_ASSOCIAION_LOGICAL,
2283 false, true, 0xffff);
2284
2285 EXPECT_NE(l1, nullptr);
2286 auto l2 = pldm_entity_association_tree_add_entity(
2287 tree, &entities[1], 0xffff, l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL, false,
2288 false, 0xffff);
2289 EXPECT_NE(l2, nullptr);
2290 auto l3 = pldm_entity_association_tree_add_entity(
2291 tree, &entities[2], 0xffff, l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL, false,
2292 true, 0xffff);
2293 EXPECT_NE(l3, nullptr);
2294 auto l4 = pldm_entity_association_tree_add_entity(
2295 tree, &entities[3], 0xffff, l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL, false,
2296 true, 0xffff);
2297 EXPECT_NE(l4, nullptr);
2298
2299 EXPECT_EQ(pldm_entity_get_num_children(l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL),
2300 3);
2301
2302 auto repo = pldm_pdr_init();
2303
2304 EXPECT_EQ(pldm_entity_association_pdr_add_from_node_with_record_handle(
2305 l1, repo, &base, 4, false, 1, 3),
2306 0);
2307
2308 EXPECT_EQ(pldm_pdr_get_record_count(repo), 1u);
2309
Archana Kakani94e2d752024-12-12 08:22:55 -06002310 // Remove first contained entity from the entity association PDR
Varsha Kaverappab31e4c62024-06-25 06:45:46 -05002311 uint32_t removed_record_handle{};
2312 struct pldm_entity entity[1] = {
Archana Kakani94e2d752024-12-12 08:22:55 -06002313 {.entity_type = 4, .entity_instance_num = 1, .entity_container_id = 2}};
Varsha Kaverappab31e4c62024-06-25 06:45:46 -05002314
2315 EXPECT_EQ(pldm_entity_association_pdr_remove_contained_entity(
2316 repo, entity, false, &removed_record_handle),
2317 0);
2318 EXPECT_EQ(removed_record_handle, 3);
2319
Archana Kakani94e2d752024-12-12 08:22:55 -06002320 // Remove second contained entity from the entity association PDR
2321 removed_record_handle = 0;
2322 EXPECT_EQ(pldm_entity_association_pdr_remove_contained_entity(
2323 repo, &entities[1], false, &removed_record_handle),
2324 0);
2325 EXPECT_EQ(removed_record_handle, 3);
2326
2327 // Remove third contained entity from the entity association PDR
2328 removed_record_handle = 0;
2329 EXPECT_EQ(pldm_entity_association_pdr_remove_contained_entity(
2330 repo, &entities[2], false, &removed_record_handle),
2331 0);
2332 EXPECT_EQ(removed_record_handle, 3);
2333
2334 // As all the contained entities are removed the entity association PDR
2335 // also gets deleted
2336 EXPECT_EQ(pldm_pdr_get_record_count(repo), 0u);
2337
Varsha Kaverappab31e4c62024-06-25 06:45:46 -05002338 pldm_pdr_destroy(repo);
2339 pldm_entity_association_tree_destroy(tree);
2340}
2341#endif
Varsha Kaverappa8b53ad92024-06-15 06:36:06 -05002342
2343#ifdef LIBPLDM_API_TESTING
2344TEST(PDRUpdate, testRemoveFruRecord)
2345{
2346 auto repo = pldm_pdr_init();
2347
2348 uint32_t record_handle = 1;
2349 int rc = pldm_pdr_add_fru_record_set(repo, 1, 1, 1, 0, 100, &record_handle);
2350 EXPECT_EQ(rc, 0);
2351 record_handle = 2;
2352 rc = pldm_pdr_add_fru_record_set(repo, 1, 2, 1, 1, 100, &record_handle);
2353 EXPECT_EQ(rc, 0);
2354 record_handle = 3;
2355 rc = pldm_pdr_add_fru_record_set(repo, 1, 3, 1, 2, 100, &record_handle);
2356 EXPECT_EQ(rc, 0);
2357 EXPECT_EQ(pldm_pdr_get_record_count(repo), 3);
2358
2359 uint32_t removed_record_handle{};
2360 rc = pldm_pdr_remove_fru_record_set_by_rsi(repo, 2, false,
2361 &removed_record_handle);
2362 EXPECT_EQ(rc, 0);
2363 EXPECT_EQ(removed_record_handle, 2);
2364 EXPECT_EQ(pldm_pdr_get_record_count(repo), 2);
2365
2366 uint16_t terminusHdl{};
2367 uint16_t entityType{};
2368 uint16_t entityInstanceNum{};
2369 uint16_t containerId{};
2370 auto record = pldm_pdr_fru_record_set_find_by_rsi(
2371 repo, 1, &terminusHdl, &entityType, &entityInstanceNum, &containerId);
2372 EXPECT_NE(record, nullptr);
2373 record_handle = pldm_pdr_get_record_handle(repo, record);
2374 EXPECT_EQ(record_handle, 1);
2375
2376 record = pldm_pdr_fru_record_set_find_by_rsi(
2377 repo, 3, &terminusHdl, &entityType, &entityInstanceNum, &containerId);
2378 EXPECT_NE(record, nullptr);
2379 record_handle = pldm_pdr_get_record_handle(repo, record);
2380 EXPECT_EQ(record_handle, 3);
2381
2382 record = pldm_pdr_fru_record_set_find_by_rsi(
2383 repo, 2, &terminusHdl, &entityType, &entityInstanceNum, &containerId);
2384 EXPECT_EQ(record, nullptr);
2385
2386 rc = pldm_pdr_remove_fru_record_set_by_rsi(repo, 1, false,
2387 &removed_record_handle);
2388 EXPECT_EQ(rc, 0);
2389 EXPECT_EQ(removed_record_handle, 1);
2390
2391 // remove the same record again
2392 removed_record_handle = 5;
2393 rc = pldm_pdr_remove_fru_record_set_by_rsi(repo, 1, false,
2394 &removed_record_handle);
2395 EXPECT_EQ(rc, 0);
2396 EXPECT_NE(removed_record_handle, 1);
2397 EXPECT_EQ(removed_record_handle, 5);
2398
2399 rc = pldm_pdr_remove_fru_record_set_by_rsi(repo, 3, false,
2400 &removed_record_handle);
2401 EXPECT_EQ(rc, 0);
2402 EXPECT_EQ(removed_record_handle, 3);
2403
2404 EXPECT_EQ(pldm_pdr_get_record_count(repo), 0);
2405
2406 pldm_pdr_destroy(repo);
2407}
2408#endif