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