blob: 622ec324d79391c0749eecbeb07680dd34002941 [file] [log] [blame]
Deepak Kodihalli3b02ed82020-02-06 01:18:25 -06001#include <array>
2
3#include "libpldm/pdr.h"
4#include "libpldm/platform.h"
5
6#include <gtest/gtest.h>
7
8TEST(PDRAccess, testInit)
9{
10 auto repo = pldm_pdr_init();
11 EXPECT_EQ(pldm_pdr_get_record_count(repo), 0);
12 EXPECT_EQ(pldm_pdr_get_repo_size(repo), 0);
13 pldm_pdr_destroy(repo);
14}
15
16TEST(PDRUpdate, testAdd)
17{
18 auto repo = pldm_pdr_init();
19
20 std::array<uint8_t, 10> data{};
Deepak Kodihalli87514cc2020-04-16 09:08:38 -050021 auto handle = pldm_pdr_add(repo, data.data(), data.size(), 0, false);
Deepak Kodihalli3b02ed82020-02-06 01:18:25 -060022 EXPECT_EQ(handle, 1);
23 EXPECT_EQ(pldm_pdr_get_record_count(repo), 1);
24 EXPECT_EQ(pldm_pdr_get_repo_size(repo), data.size());
25
Deepak Kodihalli87514cc2020-04-16 09:08:38 -050026 handle = pldm_pdr_add(repo, data.data(), data.size(), 0, false);
Deepak Kodihalli3b02ed82020-02-06 01:18:25 -060027 EXPECT_EQ(handle, 2);
Deepak Kodihalli87514cc2020-04-16 09:08:38 -050028 handle = pldm_pdr_add(repo, data.data(), data.size(), 0, false);
Deepak Kodihalli3b02ed82020-02-06 01:18:25 -060029 EXPECT_EQ(handle, 3);
Deepak Kodihalli87514cc2020-04-16 09:08:38 -050030 handle = pldm_pdr_add(repo, data.data(), data.size(), htole32(0xdeeddeed),
31 false);
Lei YU90ff3ed2020-03-02 11:16:51 +080032 EXPECT_EQ(handle, htole32(0xdeeddeed));
Deepak Kodihalli3b02ed82020-02-06 01:18:25 -060033 EXPECT_EQ(pldm_pdr_get_record_count(repo), 4);
34 EXPECT_EQ(pldm_pdr_get_repo_size(repo), data.size() * 4);
35
36 pldm_pdr_destroy(repo);
37}
38
39TEST(PDRAccess, testGet)
40{
41 auto repo = pldm_pdr_init();
42
43 std::array<uint32_t, 10> in{100, 345, 3, 6, 89, 0, 11, 45, 23434, 123123};
Deepak Kodihalli87514cc2020-04-16 09:08:38 -050044 pldm_pdr_add(repo, reinterpret_cast<uint8_t*>(in.data()), sizeof(in), 1,
45 false);
Deepak Kodihalli3b02ed82020-02-06 01:18:25 -060046 EXPECT_EQ(pldm_pdr_get_record_count(repo), 1);
47 EXPECT_EQ(pldm_pdr_get_repo_size(repo), sizeof(in));
48 uint32_t size{};
49 uint32_t nextRecHdl{};
50 uint8_t* outData = nullptr;
51 auto hdl = pldm_pdr_find_record(repo, 0, &outData, &size, &nextRecHdl);
52 EXPECT_NE(hdl, nullptr);
53 EXPECT_EQ(size, sizeof(in));
54 EXPECT_EQ(nextRecHdl, 0);
55 EXPECT_EQ(memcmp(outData, in.data(), sizeof(in)), 0);
56 outData = nullptr;
57
58 auto hdl2 = pldm_pdr_find_record(repo, 1, &outData, &size, &nextRecHdl);
59 EXPECT_EQ(hdl, hdl2);
60 EXPECT_NE(hdl, nullptr);
61 EXPECT_EQ(size, sizeof(in));
62 EXPECT_EQ(nextRecHdl, 0);
63 EXPECT_EQ(memcmp(outData, in.data(), sizeof(in)), 0);
64 outData = nullptr;
65
Lei YU7cfeb8e2020-02-27 18:24:18 +080066 hdl = pldm_pdr_find_record(repo, htole32(0xdeaddead), &outData, &size,
67 &nextRecHdl);
Deepak Kodihalli3b02ed82020-02-06 01:18:25 -060068 EXPECT_EQ(hdl, nullptr);
69 EXPECT_EQ(size, 0);
70 EXPECT_EQ(nextRecHdl, 0);
71 EXPECT_EQ(outData, nullptr);
72 outData = nullptr;
73
74 std::array<uint32_t, 10> in2{1000, 3450, 30, 60, 890,
75 0, 110, 450, 234034, 123123};
Deepak Kodihalli87514cc2020-04-16 09:08:38 -050076 pldm_pdr_add(repo, reinterpret_cast<uint8_t*>(in2.data()), sizeof(in2), 2,
77 false);
78 pldm_pdr_add(repo, reinterpret_cast<uint8_t*>(in2.data()), sizeof(in2), 3,
79 false);
80 pldm_pdr_add(repo, reinterpret_cast<uint8_t*>(in2.data()), sizeof(in2), 4,
81 true);
Deepak Kodihalli3b02ed82020-02-06 01:18:25 -060082 EXPECT_EQ(pldm_pdr_get_record_count(repo), 4);
83 EXPECT_EQ(pldm_pdr_get_repo_size(repo), sizeof(in2) * 4);
84 hdl = pldm_pdr_find_record(repo, 0, &outData, &size, &nextRecHdl);
85 EXPECT_NE(hdl, nullptr);
86 EXPECT_EQ(size, sizeof(in));
87 EXPECT_EQ(nextRecHdl, 2);
88 EXPECT_EQ(memcmp(outData, in.data(), sizeof(in)), 0);
89 outData = nullptr;
90 hdl2 = pldm_pdr_find_record(repo, 1, &outData, &size, &nextRecHdl);
91 EXPECT_EQ(hdl, hdl2);
92 EXPECT_NE(hdl, nullptr);
93 EXPECT_EQ(size, sizeof(in));
94 EXPECT_EQ(nextRecHdl, 2);
95 EXPECT_EQ(memcmp(outData, in.data(), sizeof(in)), 0);
96 outData = nullptr;
97 hdl = pldm_pdr_find_record(repo, 2, &outData, &size, &nextRecHdl);
98 EXPECT_NE(hdl, nullptr);
99 EXPECT_EQ(size, sizeof(in2));
100 EXPECT_EQ(nextRecHdl, 3);
101 EXPECT_EQ(memcmp(outData, in2.data(), sizeof(in2)), 0);
102 outData = nullptr;
103 hdl = pldm_pdr_find_record(repo, 3, &outData, &size, &nextRecHdl);
104 EXPECT_NE(hdl, nullptr);
Deepak Kodihalli87514cc2020-04-16 09:08:38 -0500105 EXPECT_EQ(pldm_pdr_record_is_remote(hdl), false);
Deepak Kodihalli3b02ed82020-02-06 01:18:25 -0600106 EXPECT_EQ(size, sizeof(in2));
107 EXPECT_EQ(nextRecHdl, 4);
108 EXPECT_EQ(memcmp(outData, in2.data(), sizeof(in2)), 0);
109 outData = nullptr;
110 hdl = pldm_pdr_find_record(repo, 4, &outData, &size, &nextRecHdl);
111 EXPECT_NE(hdl, nullptr);
Deepak Kodihalli87514cc2020-04-16 09:08:38 -0500112 EXPECT_EQ(pldm_pdr_record_is_remote(hdl), true);
Deepak Kodihalli3b02ed82020-02-06 01:18:25 -0600113 EXPECT_EQ(size, sizeof(in2));
114 EXPECT_EQ(nextRecHdl, 0);
115 EXPECT_EQ(memcmp(outData, in2.data(), sizeof(in2)), 0);
116 outData = nullptr;
117
118 pldm_pdr_destroy(repo);
119}
120
121TEST(PDRAccess, testGetNext)
122{
123 auto repo = pldm_pdr_init();
124
125 std::array<uint32_t, 10> in{100, 345, 3, 6, 89, 0, 11, 45, 23434, 123123};
Deepak Kodihalli87514cc2020-04-16 09:08:38 -0500126 pldm_pdr_add(repo, reinterpret_cast<uint8_t*>(in.data()), sizeof(in), 1,
127 false);
Deepak Kodihalli3b02ed82020-02-06 01:18:25 -0600128 EXPECT_EQ(pldm_pdr_get_record_count(repo), 1);
129 EXPECT_EQ(pldm_pdr_get_repo_size(repo), sizeof(in));
130 uint32_t size{};
131 uint32_t nextRecHdl{};
132 uint8_t* outData = nullptr;
133 auto hdl = pldm_pdr_find_record(repo, 0, &outData, &size, &nextRecHdl);
134 EXPECT_NE(hdl, nullptr);
135 EXPECT_EQ(size, sizeof(in));
136 EXPECT_EQ(nextRecHdl, 0);
137 EXPECT_EQ(memcmp(outData, in.data(), sizeof(in)), 0);
138 outData = nullptr;
139
140 std::array<uint32_t, 10> in2{1000, 3450, 30, 60, 890,
141 0, 110, 450, 234034, 123123};
Deepak Kodihalli87514cc2020-04-16 09:08:38 -0500142 pldm_pdr_add(repo, reinterpret_cast<uint8_t*>(in2.data()), sizeof(in2), 2,
143 false);
144 pldm_pdr_add(repo, reinterpret_cast<uint8_t*>(in2.data()), sizeof(in2), 3,
145 false);
146 pldm_pdr_add(repo, reinterpret_cast<uint8_t*>(in2.data()), sizeof(in2), 4,
147 false);
Deepak Kodihalli3b02ed82020-02-06 01:18:25 -0600148 EXPECT_EQ(pldm_pdr_get_record_count(repo), 4);
149 EXPECT_EQ(pldm_pdr_get_repo_size(repo), sizeof(in2) * 4);
150 hdl = pldm_pdr_get_next_record(repo, hdl, &outData, &size, &nextRecHdl);
151 EXPECT_NE(hdl, nullptr);
152 EXPECT_EQ(size, sizeof(in2));
153 EXPECT_EQ(nextRecHdl, 3);
154 EXPECT_EQ(memcmp(outData, in2.data(), sizeof(in2)), 0);
155 outData = nullptr;
156 hdl = pldm_pdr_get_next_record(repo, hdl, &outData, &size, &nextRecHdl);
157 EXPECT_NE(hdl, nullptr);
158 EXPECT_EQ(size, sizeof(in2));
159 EXPECT_EQ(nextRecHdl, 4);
160 EXPECT_EQ(memcmp(outData, in2.data(), sizeof(in2)), 0);
161 outData = nullptr;
162 hdl = pldm_pdr_get_next_record(repo, hdl, &outData, &size, &nextRecHdl);
163 EXPECT_NE(hdl, nullptr);
164 EXPECT_EQ(size, sizeof(in2));
165 EXPECT_EQ(nextRecHdl, 0);
166 EXPECT_EQ(memcmp(outData, in2.data(), sizeof(in2)), 0);
167 outData = nullptr;
168
169 pldm_pdr_destroy(repo);
170}
171
172TEST(PDRAccess, testFindByType)
173{
174 auto repo = pldm_pdr_init();
175
176 std::array<uint8_t, sizeof(pldm_pdr_hdr)> data{};
177 pldm_pdr_hdr* hdr = reinterpret_cast<pldm_pdr_hdr*>(data.data());
178 hdr->type = 1;
Deepak Kodihalli87514cc2020-04-16 09:08:38 -0500179 auto first = pldm_pdr_add(repo, data.data(), data.size(), 0, false);
Deepak Kodihalli3b02ed82020-02-06 01:18:25 -0600180 hdr->type = 2;
Deepak Kodihalli87514cc2020-04-16 09:08:38 -0500181 auto second = pldm_pdr_add(repo, data.data(), data.size(), 0, false);
Deepak Kodihalli3b02ed82020-02-06 01:18:25 -0600182 hdr->type = 3;
Deepak Kodihalli87514cc2020-04-16 09:08:38 -0500183 auto third = pldm_pdr_add(repo, data.data(), data.size(), 0, false);
Deepak Kodihalli3b02ed82020-02-06 01:18:25 -0600184 hdr->type = 4;
Deepak Kodihalli87514cc2020-04-16 09:08:38 -0500185 auto fourth = pldm_pdr_add(repo, data.data(), data.size(), 0, false);
Deepak Kodihalli3b02ed82020-02-06 01:18:25 -0600186
187 uint8_t* outData = nullptr;
188 uint32_t size{};
189 auto firstRec =
190 pldm_pdr_find_record_by_type(repo, 1, nullptr, &outData, &size);
191 EXPECT_EQ(pldm_pdr_get_record_handle(repo, firstRec), first);
192 outData = nullptr;
193 auto secondRec =
194 pldm_pdr_find_record_by_type(repo, 2, nullptr, &outData, &size);
195 EXPECT_EQ(pldm_pdr_get_record_handle(repo, secondRec), second);
196 outData = nullptr;
197 auto thirdRec =
198 pldm_pdr_find_record_by_type(repo, 3, nullptr, &outData, &size);
199 EXPECT_EQ(pldm_pdr_get_record_handle(repo, thirdRec), third);
200 outData = nullptr;
201 auto fourthRec =
202 pldm_pdr_find_record_by_type(repo, 4, nullptr, &outData, &size);
203 EXPECT_EQ(pldm_pdr_get_record_handle(repo, fourthRec), fourth);
204 outData = nullptr;
205 auto fifthRec =
206 pldm_pdr_find_record_by_type(repo, 5, nullptr, &outData, &size);
207 EXPECT_EQ(fifthRec, nullptr);
208 EXPECT_EQ(outData, nullptr);
209 EXPECT_EQ(size, 0);
210
211 auto rec =
212 pldm_pdr_find_record_by_type(repo, 3, secondRec, &outData, &size);
213 EXPECT_EQ(pldm_pdr_get_record_handle(repo, rec), third);
214 outData = nullptr;
215 rec = pldm_pdr_find_record_by_type(repo, 4, secondRec, &outData, &size);
216 EXPECT_EQ(pldm_pdr_get_record_handle(repo, rec), fourth);
217 outData = nullptr;
218 rec = pldm_pdr_find_record_by_type(repo, 2, firstRec, &outData, &size);
219 EXPECT_EQ(pldm_pdr_get_record_handle(repo, rec), second);
220 outData = nullptr;
221
222 pldm_pdr_destroy(repo);
223}
Deepak Kodihallidb914672020-02-07 02:47:45 -0600224
225TEST(PDRUpdate, testAddFruRecordSet)
226{
227 auto repo = pldm_pdr_init();
228
229 auto handle = pldm_pdr_add_fru_record_set(repo, 1, 10, 1, 0, 100);
230 EXPECT_EQ(handle, 1);
231 EXPECT_EQ(pldm_pdr_get_record_count(repo), 1);
232 EXPECT_EQ(pldm_pdr_get_repo_size(repo),
233 sizeof(pldm_pdr_hdr) + sizeof(pldm_pdr_fru_record_set));
234 uint32_t size{};
235 uint32_t nextRecHdl{};
236 uint8_t* outData = nullptr;
237 auto hdl = pldm_pdr_find_record(repo, 0, &outData, &size, &nextRecHdl);
238 EXPECT_NE(hdl, nullptr);
239 EXPECT_EQ(size, sizeof(pldm_pdr_hdr) + sizeof(pldm_pdr_fru_record_set));
240 EXPECT_EQ(nextRecHdl, 0);
241 pldm_pdr_hdr* hdr = reinterpret_cast<pldm_pdr_hdr*>(outData);
242 EXPECT_EQ(hdr->version, 1);
243 EXPECT_EQ(hdr->type, PLDM_PDR_FRU_RECORD_SET);
Deepak Kodihallifb4dd7b2020-03-17 03:27:22 -0500244 EXPECT_EQ(hdr->length, htole16(sizeof(pldm_pdr_fru_record_set)));
245 EXPECT_EQ(hdr->record_handle, htole32(1));
Deepak Kodihallidb914672020-02-07 02:47:45 -0600246 pldm_pdr_fru_record_set* fru = reinterpret_cast<pldm_pdr_fru_record_set*>(
247 outData + sizeof(pldm_pdr_hdr));
Deepak Kodihallifb4dd7b2020-03-17 03:27:22 -0500248 EXPECT_EQ(fru->terminus_handle, htole16(1));
249 EXPECT_EQ(fru->fru_rsi, htole16(10));
250 EXPECT_EQ(fru->entity_type, htole16(1));
251 EXPECT_EQ(fru->entity_instance_num, htole16(0));
252 EXPECT_EQ(fru->container_id, htole16(100));
Deepak Kodihallidb914672020-02-07 02:47:45 -0600253 outData = nullptr;
254
255 handle = pldm_pdr_add_fru_record_set(repo, 2, 11, 2, 1, 101);
256 EXPECT_EQ(handle, 2);
257 EXPECT_EQ(pldm_pdr_get_record_count(repo), 2);
258 EXPECT_EQ(pldm_pdr_get_repo_size(repo),
259 2 * (sizeof(pldm_pdr_hdr) + sizeof(pldm_pdr_fru_record_set)));
260 hdl = pldm_pdr_find_record(repo, 2, &outData, &size, &nextRecHdl);
261 EXPECT_NE(hdl, nullptr);
262 EXPECT_EQ(size, sizeof(pldm_pdr_hdr) + sizeof(pldm_pdr_fru_record_set));
263 EXPECT_EQ(nextRecHdl, 0);
264 hdr = reinterpret_cast<pldm_pdr_hdr*>(outData);
265 EXPECT_EQ(hdr->version, 1);
266 EXPECT_EQ(hdr->type, PLDM_PDR_FRU_RECORD_SET);
Deepak Kodihallifb4dd7b2020-03-17 03:27:22 -0500267 EXPECT_EQ(hdr->length, htole16(sizeof(pldm_pdr_fru_record_set)));
268 EXPECT_EQ(hdr->record_handle, htole32(2));
Deepak Kodihallidb914672020-02-07 02:47:45 -0600269 fru = reinterpret_cast<pldm_pdr_fru_record_set*>(outData +
270 sizeof(pldm_pdr_hdr));
Deepak Kodihallifb4dd7b2020-03-17 03:27:22 -0500271 EXPECT_EQ(fru->terminus_handle, htole16(2));
272 EXPECT_EQ(fru->fru_rsi, htole16(11));
273 EXPECT_EQ(fru->entity_type, htole16(2));
274 EXPECT_EQ(fru->entity_instance_num, htole16(1));
275 EXPECT_EQ(fru->container_id, htole16(101));
Deepak Kodihallidb914672020-02-07 02:47:45 -0600276 outData = nullptr;
277
278 hdl = pldm_pdr_find_record(repo, 1, &outData, &size, &nextRecHdl);
279 EXPECT_NE(hdl, nullptr);
280 EXPECT_EQ(size, sizeof(pldm_pdr_hdr) + sizeof(pldm_pdr_fru_record_set));
281 EXPECT_EQ(nextRecHdl, 2);
282 hdr = reinterpret_cast<pldm_pdr_hdr*>(outData);
283 EXPECT_EQ(hdr->version, 1);
284 EXPECT_EQ(hdr->type, PLDM_PDR_FRU_RECORD_SET);
Deepak Kodihallifb4dd7b2020-03-17 03:27:22 -0500285 EXPECT_EQ(hdr->length, htole16(sizeof(pldm_pdr_fru_record_set)));
286 EXPECT_EQ(hdr->record_handle, htole32(1));
Deepak Kodihallidb914672020-02-07 02:47:45 -0600287 fru = reinterpret_cast<pldm_pdr_fru_record_set*>(outData +
288 sizeof(pldm_pdr_hdr));
Deepak Kodihallifb4dd7b2020-03-17 03:27:22 -0500289 EXPECT_EQ(fru->terminus_handle, htole16(1));
290 EXPECT_EQ(fru->fru_rsi, htole16(10));
291 EXPECT_EQ(fru->entity_type, htole16(1));
292 EXPECT_EQ(fru->entity_instance_num, htole16(0));
293 EXPECT_EQ(fru->container_id, htole16(100));
Deepak Kodihallidb914672020-02-07 02:47:45 -0600294 outData = nullptr;
295
296 pldm_pdr_destroy(repo);
297}
298
299TEST(PDRUpdate, tesFindtFruRecordSet)
300{
301 auto repo = pldm_pdr_init();
302
303 uint16_t terminusHdl{};
304 uint16_t entityType{};
305 uint16_t entityInstanceNum{};
306 uint16_t containerId{};
307 auto first = pldm_pdr_add_fru_record_set(repo, 1, 1, 1, 0, 100);
308 auto second = pldm_pdr_add_fru_record_set(repo, 1, 2, 1, 1, 100);
309 auto third = pldm_pdr_add_fru_record_set(repo, 1, 3, 1, 2, 100);
310 EXPECT_EQ(first, pldm_pdr_get_record_handle(
311 repo, pldm_pdr_fru_record_set_find_by_rsi(
312 repo, 1, &terminusHdl, &entityType,
313 &entityInstanceNum, &containerId)));
314 EXPECT_EQ(second, pldm_pdr_get_record_handle(
315 repo, pldm_pdr_fru_record_set_find_by_rsi(
316 repo, 2, &terminusHdl, &entityType,
317 &entityInstanceNum, &containerId)));
318 EXPECT_EQ(third, pldm_pdr_get_record_handle(
319 repo, pldm_pdr_fru_record_set_find_by_rsi(
320 repo, 3, &terminusHdl, &entityType,
321 &entityInstanceNum, &containerId)));
322 EXPECT_EQ(terminusHdl, 1);
323 EXPECT_EQ(entityType, 1);
324 EXPECT_EQ(entityInstanceNum, 2);
325 EXPECT_EQ(containerId, 100);
326 EXPECT_EQ(nullptr, pldm_pdr_fru_record_set_find_by_rsi(
327 repo, 4, &terminusHdl, &entityType,
328 &entityInstanceNum, &containerId));
329
330 pldm_pdr_destroy(repo);
331}
Deepak Kodihalli05787052020-03-10 01:54:08 -0500332
333TEST(EntityAssociationPDR, testInit)
334{
335 auto tree = pldm_entity_association_tree_init();
336 EXPECT_NE(tree, nullptr);
337 pldm_entity_association_tree_destroy(tree);
338}
339
340TEST(EntityAssociationPDR, testBuild)
341{
342 // 1
343 // |
344 // 2--3--4
345 // |
346 // 5--6--7
347 // | |
348 // 9 8
349
350 pldm_entity entities[9]{};
351
352 entities[0].entity_type = 1;
353 entities[1].entity_type = 2;
354 entities[2].entity_type = 2;
355 entities[3].entity_type = 3;
356 entities[4].entity_type = 4;
357 entities[5].entity_type = 5;
358 entities[6].entity_type = 5;
359 entities[7].entity_type = 6;
360 entities[8].entity_type = 7;
361
362 auto tree = pldm_entity_association_tree_init();
363
364 auto l1 = pldm_entity_association_tree_add(tree, &entities[0], nullptr,
365 PLDM_ENTITY_ASSOCIAION_PHYSICAL);
366 EXPECT_NE(l1, nullptr);
367 auto l2a = pldm_entity_association_tree_add(
368 tree, &entities[1], l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
369 EXPECT_NE(l2a, nullptr);
370 auto l2b = pldm_entity_association_tree_add(
371 tree, &entities[2], l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
372 EXPECT_NE(l2b, nullptr);
373 auto l2c = pldm_entity_association_tree_add(
374 tree, &entities[3], l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
375 EXPECT_NE(l2c, nullptr);
376 auto l3a = pldm_entity_association_tree_add(
377 tree, &entities[4], l2a, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
378 EXPECT_NE(l3a, nullptr);
379 auto l3b = pldm_entity_association_tree_add(
380 tree, &entities[5], l2a, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
381 EXPECT_NE(l3b, nullptr);
382 auto l3c = pldm_entity_association_tree_add(
383 tree, &entities[6], l2a, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
384 EXPECT_NE(l3b, nullptr);
385 auto l4a = pldm_entity_association_tree_add(
386 tree, &entities[7], l3a, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
387 EXPECT_NE(l4a, nullptr);
388 auto l4b = pldm_entity_association_tree_add(
389 tree, &entities[8], l3b, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
390 EXPECT_NE(l4b, nullptr);
391
392 EXPECT_EQ(pldm_entity_is_node_parent(l1), true);
393 EXPECT_EQ(pldm_entity_is_node_parent(l2a), true);
394 EXPECT_EQ(pldm_entity_is_node_parent(l3a), true);
395 EXPECT_EQ(pldm_entity_is_node_parent(l3b), true);
396
397 EXPECT_EQ(pldm_entity_is_node_parent(l2b), false);
398 EXPECT_EQ(pldm_entity_is_node_parent(l2c), false);
399 EXPECT_EQ(pldm_entity_is_node_parent(l3c), false);
400 EXPECT_EQ(pldm_entity_is_node_parent(l4a), false);
401 EXPECT_EQ(pldm_entity_is_node_parent(l4b), false);
402
403 size_t num{};
404 pldm_entity* out = nullptr;
405 pldm_entity_association_tree_visit(tree, &out, &num);
406 EXPECT_EQ(num, 9);
407
408 EXPECT_EQ(out[0].entity_type, 1);
409 EXPECT_EQ(out[0].entity_instance_num, 1);
410 EXPECT_EQ(out[0].entity_container_id, 0);
411
412 EXPECT_EQ(out[1].entity_type, 2);
413 EXPECT_EQ(out[1].entity_instance_num, 1);
414 EXPECT_EQ(out[1].entity_container_id, 1);
415 EXPECT_EQ(out[2].entity_type, 2);
416 EXPECT_EQ(out[2].entity_instance_num, 2);
417 EXPECT_EQ(out[2].entity_container_id, 1);
418 EXPECT_EQ(out[3].entity_type, 3);
419 EXPECT_EQ(out[3].entity_instance_num, 1);
420 EXPECT_EQ(out[3].entity_container_id, 1);
421
422 EXPECT_EQ(out[4].entity_type, 4);
423 EXPECT_EQ(out[4].entity_instance_num, 1);
424 EXPECT_EQ(out[4].entity_container_id, 2);
425 EXPECT_EQ(out[5].entity_type, 5);
426 EXPECT_EQ(out[5].entity_instance_num, 1);
427 EXPECT_EQ(out[5].entity_container_id, 2);
428 EXPECT_EQ(out[6].entity_type, 5);
429 EXPECT_EQ(out[6].entity_instance_num, 2);
430 EXPECT_EQ(out[6].entity_container_id, 2);
431
432 EXPECT_EQ(out[7].entity_type, 7);
433 EXPECT_EQ(out[7].entity_instance_num, 1);
434 EXPECT_EQ(out[7].entity_container_id, 4);
435 EXPECT_EQ(out[8].entity_type, 6);
436 EXPECT_EQ(out[8].entity_instance_num, 1);
437 EXPECT_EQ(out[8].entity_container_id, 3);
438
439 free(out);
440 pldm_entity_association_tree_destroy(tree);
441}
442
443TEST(EntityAssociationPDR, testSpecialTrees)
444{
445 pldm_entity entities[3]{};
446
447 entities[0].entity_type = 1;
448 entities[1].entity_type = 2;
449 entities[2].entity_type = 1;
450
451 // A
452 auto tree = pldm_entity_association_tree_init();
453 auto node = pldm_entity_association_tree_add(
454 tree, &entities[0], nullptr, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
455 EXPECT_NE(node, nullptr);
456 size_t num{};
457 pldm_entity* out = nullptr;
458 pldm_entity_association_tree_visit(tree, &out, &num);
459 EXPECT_EQ(num, 1);
460 EXPECT_EQ(out[0].entity_type, 1);
461 EXPECT_EQ(out[0].entity_instance_num, 1);
462 EXPECT_EQ(out[0].entity_container_id, 0);
463 free(out);
464 pldm_entity_association_tree_destroy(tree);
465
466 // A-A-A
467 tree = pldm_entity_association_tree_init();
468 node = pldm_entity_association_tree_add(tree, &entities[0], nullptr,
469 PLDM_ENTITY_ASSOCIAION_PHYSICAL);
470 EXPECT_NE(node, nullptr);
471 node = pldm_entity_association_tree_add(tree, &entities[1], nullptr,
472 PLDM_ENTITY_ASSOCIAION_PHYSICAL);
473 EXPECT_NE(node, nullptr);
474 node = pldm_entity_association_tree_add(tree, &entities[2], nullptr,
475 PLDM_ENTITY_ASSOCIAION_PHYSICAL);
476 EXPECT_NE(node, nullptr);
477 pldm_entity_association_tree_visit(tree, &out, &num);
478 EXPECT_EQ(num, 3);
479 EXPECT_EQ(out[0].entity_type, 1);
480 EXPECT_EQ(out[0].entity_instance_num, 1);
481 EXPECT_EQ(out[0].entity_container_id, 0);
482 EXPECT_EQ(out[1].entity_type, 1);
483 EXPECT_EQ(out[1].entity_instance_num, 2);
484 EXPECT_EQ(out[1].entity_container_id, 0);
485 EXPECT_EQ(out[2].entity_type, 2);
486 EXPECT_EQ(out[2].entity_instance_num, 1);
487 EXPECT_EQ(out[2].entity_container_id, 0);
488 free(out);
489 pldm_entity_association_tree_destroy(tree);
490
491 // A
492 // |
493 // A
494 // |
495 // A
496 tree = pldm_entity_association_tree_init();
497 node = pldm_entity_association_tree_add(tree, &entities[0], nullptr,
498 PLDM_ENTITY_ASSOCIAION_PHYSICAL);
499 EXPECT_NE(node, nullptr);
500 auto node1 = pldm_entity_association_tree_add(
501 tree, &entities[1], node, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
502 EXPECT_NE(node1, nullptr);
503 auto node2 = pldm_entity_association_tree_add(
504 tree, &entities[2], node1, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
505 EXPECT_NE(node2, nullptr);
506 pldm_entity_association_tree_visit(tree, &out, &num);
507 EXPECT_EQ(num, 3);
508 EXPECT_EQ(out[0].entity_type, 1);
509 EXPECT_EQ(out[0].entity_instance_num, 1);
510 EXPECT_EQ(out[0].entity_container_id, 0);
511 EXPECT_EQ(out[1].entity_type, 2);
512 EXPECT_EQ(out[1].entity_instance_num, 1);
513 EXPECT_EQ(out[1].entity_container_id, 1);
514 EXPECT_EQ(out[2].entity_type, 1);
515 EXPECT_EQ(out[2].entity_instance_num, 1);
516 EXPECT_EQ(out[2].entity_container_id, 2);
517 free(out);
518 pldm_entity_association_tree_destroy(tree);
519
520 // A-A
521 // |
522 // A-A
523 tree = pldm_entity_association_tree_init();
524 node = pldm_entity_association_tree_add(tree, &entities[0], nullptr,
525 PLDM_ENTITY_ASSOCIAION_PHYSICAL);
526 EXPECT_NE(node, nullptr);
527 node = pldm_entity_association_tree_add(tree, &entities[0], nullptr,
528 PLDM_ENTITY_ASSOCIAION_PHYSICAL);
529 EXPECT_NE(node, nullptr);
530 node1 = pldm_entity_association_tree_add(tree, &entities[1], node,
531 PLDM_ENTITY_ASSOCIAION_PHYSICAL);
532 EXPECT_NE(node1, nullptr);
533 node2 = pldm_entity_association_tree_add(tree, &entities[2], node,
534 PLDM_ENTITY_ASSOCIAION_PHYSICAL);
535 EXPECT_NE(node2, nullptr);
536 pldm_entity_association_tree_visit(tree, &out, &num);
537 EXPECT_EQ(num, 4);
538 EXPECT_EQ(out[0].entity_type, 1);
539 EXPECT_EQ(out[0].entity_instance_num, 1);
540 EXPECT_EQ(out[0].entity_container_id, 0);
541 EXPECT_EQ(out[1].entity_type, 1);
542 EXPECT_EQ(out[1].entity_instance_num, 2);
543 EXPECT_EQ(out[1].entity_container_id, 0);
544 EXPECT_EQ(out[2].entity_type, 2);
545 EXPECT_EQ(out[2].entity_instance_num, 1);
546 EXPECT_EQ(out[2].entity_container_id, 1);
547 EXPECT_EQ(out[3].entity_type, 1);
548 EXPECT_EQ(out[3].entity_instance_num, 1);
549 EXPECT_EQ(out[3].entity_container_id, 1);
550 free(out);
551 pldm_entity_association_tree_destroy(tree);
552}
Deepak Kodihalli0a738f02020-03-10 01:56:21 -0500553
554TEST(EntityAssociationPDR, testPDR)
555{
556 // e = entity type, c = container id, i = instance num
557
558 // INPUT
559 // 1(e=1)--1a(e=2)
560 // |
561 // 2(e=2)--3(e=2)--4(e=2)--5(e=3)
562 // |
563 // 6(e=4)--7(e=5)--8(e=5)--9(e=5)
564 // | |
565 // 11(e=6) 10(e=7)
566
567 // Expected OUTPUT
568 // 1(e=1,c=0,i=1)
569 // |
570 // 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)
571 // |
572 // 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)
573 // | |
574 // 10(e=6,c=3,i=1) 11(e=7,c=4,i=1)
575 pldm_entity entities[11]{};
576
577 entities[0].entity_type = 1;
578 entities[1].entity_type = 2;
579 entities[2].entity_type = 3;
580 entities[3].entity_type = 2;
581 entities[4].entity_type = 3;
582 entities[5].entity_type = 4;
583 entities[6].entity_type = 5;
584 entities[7].entity_type = 5;
585 entities[8].entity_type = 5;
586 entities[9].entity_type = 6;
587 entities[10].entity_type = 7;
588
589 auto tree = pldm_entity_association_tree_init();
590
591 auto l1 = pldm_entity_association_tree_add(tree, &entities[0], nullptr,
592 PLDM_ENTITY_ASSOCIAION_PHYSICAL);
593 EXPECT_NE(l1, nullptr);
594 auto l1a = pldm_entity_association_tree_add(
595 tree, &entities[1], nullptr, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
596 EXPECT_NE(l1a, nullptr);
597
598 auto l2a = pldm_entity_association_tree_add(
599 tree, &entities[1], l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
600 EXPECT_NE(l2a, nullptr);
601 auto l2b = pldm_entity_association_tree_add(tree, &entities[2], l1,
602 PLDM_ENTITY_ASSOCIAION_LOGICAL);
603 EXPECT_NE(l2b, nullptr);
604 auto l2c = pldm_entity_association_tree_add(
605 tree, &entities[3], l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
606 EXPECT_NE(l2c, nullptr);
607 auto l2d = pldm_entity_association_tree_add(tree, &entities[4], l1,
608 PLDM_ENTITY_ASSOCIAION_LOGICAL);
609 EXPECT_NE(l2d, nullptr);
610
611 auto l3a = pldm_entity_association_tree_add(
612 tree, &entities[5], l2a, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
613 EXPECT_NE(l3a, nullptr);
614 auto l3b = pldm_entity_association_tree_add(
615 tree, &entities[6], l2a, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
616 EXPECT_NE(l3b, nullptr);
617 auto l3c = pldm_entity_association_tree_add(tree, &entities[7], l2a,
618 PLDM_ENTITY_ASSOCIAION_LOGICAL);
619 EXPECT_NE(l3c, nullptr);
620 auto l3d = pldm_entity_association_tree_add(tree, &entities[8], l2a,
621 PLDM_ENTITY_ASSOCIAION_LOGICAL);
622 EXPECT_NE(l3d, nullptr);
623
624 auto l4a = pldm_entity_association_tree_add(
625 tree, &entities[9], l3a, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
626 EXPECT_NE(l4a, nullptr);
627 auto l4b = pldm_entity_association_tree_add(tree, &entities[10], l3b,
628 PLDM_ENTITY_ASSOCIAION_LOGICAL);
629 EXPECT_NE(l4b, nullptr);
630
631 EXPECT_EQ(pldm_entity_get_num_children(l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL),
632 2);
633 EXPECT_EQ(pldm_entity_get_num_children(l1, PLDM_ENTITY_ASSOCIAION_LOGICAL),
634 2);
635 EXPECT_EQ(
636 pldm_entity_get_num_children(l2a, PLDM_ENTITY_ASSOCIAION_PHYSICAL), 2);
637 EXPECT_EQ(
638 pldm_entity_get_num_children(l3b, PLDM_ENTITY_ASSOCIAION_PHYSICAL), 0);
639 EXPECT_EQ(pldm_entity_get_num_children(l3b, PLDM_ENTITY_ASSOCIAION_LOGICAL),
640 1);
641
642 auto repo = pldm_pdr_init();
Deepak Kodihalli87514cc2020-04-16 09:08:38 -0500643 pldm_entity_association_pdr_add(tree, repo, false);
Deepak Kodihalli0a738f02020-03-10 01:56:21 -0500644
645 EXPECT_EQ(pldm_pdr_get_record_count(repo), 6);
646
647 uint32_t currRecHandle{};
648 uint32_t nextRecHandle{};
649 uint8_t* data = nullptr;
650 uint32_t size{};
651 uint32_t commonSize = sizeof(struct pldm_pdr_hdr) + sizeof(uint16_t) +
652 sizeof(uint8_t) + sizeof(pldm_entity) +
653 sizeof(uint8_t);
654
655 pldm_pdr_find_record(repo, currRecHandle, &data, &size, &nextRecHandle);
656 EXPECT_EQ(size, commonSize + (pldm_entity_get_num_children(
657 l1, PLDM_ENTITY_ASSOCIAION_LOGICAL) *
658 sizeof(pldm_entity)));
659 uint8_t* start = data;
660 pldm_pdr_hdr* hdr = reinterpret_cast<pldm_pdr_hdr*>(start);
Deepak Kodihallifb4dd7b2020-03-17 03:27:22 -0500661 EXPECT_EQ(le32toh(hdr->record_handle), 1);
Deepak Kodihalli0a738f02020-03-10 01:56:21 -0500662 EXPECT_EQ(hdr->type, PLDM_PDR_ENTITY_ASSOCIATION);
Deepak Kodihallifb4dd7b2020-03-17 03:27:22 -0500663 EXPECT_EQ(le16toh(hdr->length), size - sizeof(struct pldm_pdr_hdr));
Deepak Kodihalli0a738f02020-03-10 01:56:21 -0500664 start += sizeof(pldm_pdr_hdr);
665 uint16_t* containerId = reinterpret_cast<uint16_t*>(start);
Deepak Kodihallifb4dd7b2020-03-17 03:27:22 -0500666 EXPECT_EQ(le16toh(*containerId), 1);
Deepak Kodihalli0a738f02020-03-10 01:56:21 -0500667 start += sizeof(uint16_t);
668 EXPECT_EQ(*start, PLDM_ENTITY_ASSOCIAION_LOGICAL);
669 start += sizeof(uint8_t);
670 pldm_entity* entity = reinterpret_cast<pldm_entity*>(start);
Deepak Kodihallifb4dd7b2020-03-17 03:27:22 -0500671 EXPECT_EQ(le16toh(entity->entity_type), 1);
672 EXPECT_EQ(le16toh(entity->entity_instance_num), 1);
673 EXPECT_EQ(le16toh(entity->entity_container_id), 0);
Deepak Kodihalli0a738f02020-03-10 01:56:21 -0500674 start += sizeof(pldm_entity);
675 EXPECT_EQ(*start,
676 pldm_entity_get_num_children(l1, PLDM_ENTITY_ASSOCIAION_LOGICAL));
677 start += sizeof(uint8_t);
678 entity = reinterpret_cast<pldm_entity*>(start);
Deepak Kodihallifb4dd7b2020-03-17 03:27:22 -0500679 EXPECT_EQ(le16toh(entity->entity_type), 3);
680 EXPECT_EQ(le16toh(entity->entity_instance_num), 1);
681 EXPECT_EQ(le16toh(entity->entity_container_id), 1);
Deepak Kodihalli0a738f02020-03-10 01:56:21 -0500682 start += sizeof(pldm_entity);
683 entity = reinterpret_cast<pldm_entity*>(start);
Deepak Kodihallifb4dd7b2020-03-17 03:27:22 -0500684 EXPECT_EQ(le16toh(entity->entity_type), 3);
685 EXPECT_EQ(le16toh(entity->entity_instance_num), 2);
686 EXPECT_EQ(le16toh(entity->entity_container_id), 1);
Deepak Kodihalli0a738f02020-03-10 01:56:21 -0500687 start += sizeof(pldm_entity);
688
689 currRecHandle = nextRecHandle;
690
691 pldm_pdr_find_record(repo, currRecHandle, &data, &size, &nextRecHandle);
692 EXPECT_EQ(size, commonSize + (pldm_entity_get_num_children(
693 l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL) *
694 sizeof(pldm_entity)));
695 start = data;
696 hdr = reinterpret_cast<pldm_pdr_hdr*>(start);
Deepak Kodihallifb4dd7b2020-03-17 03:27:22 -0500697 EXPECT_EQ(le32toh(hdr->record_handle), 2);
Deepak Kodihalli0a738f02020-03-10 01:56:21 -0500698 EXPECT_EQ(hdr->type, PLDM_PDR_ENTITY_ASSOCIATION);
Deepak Kodihallifb4dd7b2020-03-17 03:27:22 -0500699 EXPECT_EQ(le16toh(hdr->length), size - sizeof(struct pldm_pdr_hdr));
Deepak Kodihalli0a738f02020-03-10 01:56:21 -0500700 start += sizeof(pldm_pdr_hdr);
701 containerId = reinterpret_cast<uint16_t*>(start);
Deepak Kodihallifb4dd7b2020-03-17 03:27:22 -0500702 EXPECT_EQ(le16toh(*containerId), 1);
Deepak Kodihalli0a738f02020-03-10 01:56:21 -0500703 start += sizeof(uint16_t);
704 EXPECT_EQ(*start, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
705 start += sizeof(uint8_t);
706 entity = reinterpret_cast<pldm_entity*>(start);
Deepak Kodihallifb4dd7b2020-03-17 03:27:22 -0500707 EXPECT_EQ(le16toh(entity->entity_type), 1);
708 EXPECT_EQ(le16toh(entity->entity_instance_num), 1);
709 EXPECT_EQ(le16toh(entity->entity_container_id), 0);
Deepak Kodihalli0a738f02020-03-10 01:56:21 -0500710 start += sizeof(pldm_entity);
711 EXPECT_EQ(*start, pldm_entity_get_num_children(
712 l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL));
713 start += sizeof(uint8_t);
714 entity = reinterpret_cast<pldm_entity*>(start);
Deepak Kodihallifb4dd7b2020-03-17 03:27:22 -0500715 EXPECT_EQ(le16toh(entity->entity_type), 2);
716 EXPECT_EQ(le16toh(entity->entity_instance_num), 1);
717 EXPECT_EQ(le16toh(entity->entity_container_id), 1);
Deepak Kodihalli0a738f02020-03-10 01:56:21 -0500718 start += sizeof(pldm_entity);
719 entity = reinterpret_cast<pldm_entity*>(start);
Deepak Kodihallifb4dd7b2020-03-17 03:27:22 -0500720 EXPECT_EQ(le16toh(entity->entity_type), 2);
721 EXPECT_EQ(le16toh(entity->entity_instance_num), 2);
722 EXPECT_EQ(le16toh(entity->entity_container_id), 1);
Deepak Kodihalli0a738f02020-03-10 01:56:21 -0500723 start += sizeof(pldm_entity);
724
725 currRecHandle = nextRecHandle;
726
727 pldm_pdr_find_record(repo, currRecHandle, &data, &size, &nextRecHandle);
728 EXPECT_EQ(size, commonSize + (pldm_entity_get_num_children(
729 l2a, PLDM_ENTITY_ASSOCIAION_LOGICAL) *
730 sizeof(pldm_entity)));
731 start = data;
732 hdr = reinterpret_cast<pldm_pdr_hdr*>(start);
Deepak Kodihallifb4dd7b2020-03-17 03:27:22 -0500733 EXPECT_EQ(le32toh(hdr->record_handle), 3);
Deepak Kodihalli0a738f02020-03-10 01:56:21 -0500734 EXPECT_EQ(hdr->type, PLDM_PDR_ENTITY_ASSOCIATION);
Deepak Kodihallifb4dd7b2020-03-17 03:27:22 -0500735 EXPECT_EQ(le16toh(hdr->length), size - sizeof(struct pldm_pdr_hdr));
Deepak Kodihalli0a738f02020-03-10 01:56:21 -0500736 start += sizeof(pldm_pdr_hdr);
737 containerId = reinterpret_cast<uint16_t*>(start);
Deepak Kodihallifb4dd7b2020-03-17 03:27:22 -0500738 EXPECT_EQ(le16toh(*containerId), 2);
Deepak Kodihalli0a738f02020-03-10 01:56:21 -0500739 start += sizeof(uint16_t);
740 EXPECT_EQ(*start, PLDM_ENTITY_ASSOCIAION_LOGICAL);
741 start += sizeof(uint8_t);
742 entity = reinterpret_cast<pldm_entity*>(start);
Deepak Kodihallifb4dd7b2020-03-17 03:27:22 -0500743 EXPECT_EQ(le16toh(entity->entity_type), 2);
744 EXPECT_EQ(le16toh(entity->entity_instance_num), 1);
745 EXPECT_EQ(le16toh(entity->entity_container_id), 1);
Deepak Kodihalli0a738f02020-03-10 01:56:21 -0500746 start += sizeof(pldm_entity);
747 EXPECT_EQ(*start, pldm_entity_get_num_children(
748 l2a, PLDM_ENTITY_ASSOCIAION_LOGICAL));
749 start += sizeof(uint8_t);
750 entity = reinterpret_cast<pldm_entity*>(start);
Deepak Kodihallifb4dd7b2020-03-17 03:27:22 -0500751 EXPECT_EQ(le16toh(entity->entity_type), 5);
752 EXPECT_EQ(le16toh(entity->entity_instance_num), 2);
753 EXPECT_EQ(le16toh(entity->entity_container_id), 2);
Deepak Kodihalli0a738f02020-03-10 01:56:21 -0500754 start += sizeof(pldm_entity);
755 entity = reinterpret_cast<pldm_entity*>(start);
Deepak Kodihallifb4dd7b2020-03-17 03:27:22 -0500756 EXPECT_EQ(le16toh(entity->entity_type), 5);
757 EXPECT_EQ(le16toh(entity->entity_instance_num), 3);
758 EXPECT_EQ(le16toh(entity->entity_container_id), 2);
Deepak Kodihalli0a738f02020-03-10 01:56:21 -0500759 start += sizeof(pldm_entity);
760
761 currRecHandle = nextRecHandle;
762
763 pldm_pdr_find_record(repo, currRecHandle, &data, &size, &nextRecHandle);
764 EXPECT_EQ(size, commonSize + (pldm_entity_get_num_children(
765 l2a, PLDM_ENTITY_ASSOCIAION_PHYSICAL) *
766 sizeof(pldm_entity)));
767 start = data;
768 hdr = reinterpret_cast<pldm_pdr_hdr*>(start);
Deepak Kodihallifb4dd7b2020-03-17 03:27:22 -0500769 EXPECT_EQ(le32toh(hdr->record_handle), 4);
Deepak Kodihalli0a738f02020-03-10 01:56:21 -0500770 EXPECT_EQ(hdr->type, PLDM_PDR_ENTITY_ASSOCIATION);
Deepak Kodihallifb4dd7b2020-03-17 03:27:22 -0500771 EXPECT_EQ(le16toh(hdr->length), size - sizeof(struct pldm_pdr_hdr));
Deepak Kodihalli0a738f02020-03-10 01:56:21 -0500772 start += sizeof(pldm_pdr_hdr);
773 containerId = reinterpret_cast<uint16_t*>(start);
Deepak Kodihallifb4dd7b2020-03-17 03:27:22 -0500774 EXPECT_EQ(le16toh(*containerId), 2);
Deepak Kodihalli0a738f02020-03-10 01:56:21 -0500775 start += sizeof(uint16_t);
776 EXPECT_EQ(*start, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
777 start += sizeof(uint8_t);
778 entity = reinterpret_cast<pldm_entity*>(start);
Deepak Kodihallifb4dd7b2020-03-17 03:27:22 -0500779 EXPECT_EQ(le16toh(entity->entity_type), 2);
780 EXPECT_EQ(le16toh(entity->entity_instance_num), 1);
781 EXPECT_EQ(le16toh(entity->entity_container_id), 1);
Deepak Kodihalli0a738f02020-03-10 01:56:21 -0500782 start += sizeof(pldm_entity);
783 EXPECT_EQ(*start, pldm_entity_get_num_children(
784 l2a, PLDM_ENTITY_ASSOCIAION_PHYSICAL));
785 start += sizeof(uint8_t);
786 entity = reinterpret_cast<pldm_entity*>(start);
Deepak Kodihallifb4dd7b2020-03-17 03:27:22 -0500787 EXPECT_EQ(le16toh(entity->entity_type), 4);
788 EXPECT_EQ(le16toh(entity->entity_instance_num), 1);
789 EXPECT_EQ(le16toh(entity->entity_container_id), 2);
Deepak Kodihalli0a738f02020-03-10 01:56:21 -0500790 start += sizeof(pldm_entity);
791 entity = reinterpret_cast<pldm_entity*>(start);
Deepak Kodihallifb4dd7b2020-03-17 03:27:22 -0500792 EXPECT_EQ(le16toh(entity->entity_type), 5);
793 EXPECT_EQ(le16toh(entity->entity_instance_num), 1);
794 EXPECT_EQ(le16toh(entity->entity_container_id), 2);
Deepak Kodihalli0a738f02020-03-10 01:56:21 -0500795 start += sizeof(pldm_entity);
796
797 currRecHandle = nextRecHandle;
798
799 pldm_pdr_find_record(repo, currRecHandle, &data, &size, &nextRecHandle);
800 EXPECT_EQ(size, commonSize + (pldm_entity_get_num_children(
801 l3a, PLDM_ENTITY_ASSOCIAION_PHYSICAL) *
802 sizeof(pldm_entity)));
803 start = data;
804 hdr = reinterpret_cast<pldm_pdr_hdr*>(start);
Deepak Kodihallifb4dd7b2020-03-17 03:27:22 -0500805 EXPECT_EQ(le32toh(hdr->record_handle), 5);
Deepak Kodihalli0a738f02020-03-10 01:56:21 -0500806 EXPECT_EQ(hdr->type, PLDM_PDR_ENTITY_ASSOCIATION);
Deepak Kodihallifb4dd7b2020-03-17 03:27:22 -0500807 EXPECT_EQ(le16toh(hdr->length), size - sizeof(struct pldm_pdr_hdr));
Deepak Kodihalli0a738f02020-03-10 01:56:21 -0500808 start += sizeof(pldm_pdr_hdr);
809 containerId = reinterpret_cast<uint16_t*>(start);
Deepak Kodihallifb4dd7b2020-03-17 03:27:22 -0500810 EXPECT_EQ(le16toh(*containerId), 3);
Deepak Kodihalli0a738f02020-03-10 01:56:21 -0500811 start += sizeof(uint16_t);
812 EXPECT_EQ(*start, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
813 start += sizeof(uint8_t);
814 entity = reinterpret_cast<pldm_entity*>(start);
Deepak Kodihallifb4dd7b2020-03-17 03:27:22 -0500815 EXPECT_EQ(le16toh(entity->entity_type), 4);
816 EXPECT_EQ(le16toh(entity->entity_instance_num), 1);
817 EXPECT_EQ(le16toh(entity->entity_container_id), 2);
Deepak Kodihalli0a738f02020-03-10 01:56:21 -0500818 start += sizeof(pldm_entity);
819 EXPECT_EQ(*start, pldm_entity_get_num_children(
820 l3a, PLDM_ENTITY_ASSOCIAION_PHYSICAL));
821 start += sizeof(uint8_t);
822 entity = reinterpret_cast<pldm_entity*>(start);
Deepak Kodihallifb4dd7b2020-03-17 03:27:22 -0500823 EXPECT_EQ(le16toh(entity->entity_type), 6);
824 EXPECT_EQ(le16toh(entity->entity_instance_num), 1);
825 EXPECT_EQ(le16toh(entity->entity_container_id), 3);
Deepak Kodihalli0a738f02020-03-10 01:56:21 -0500826 start += sizeof(pldm_entity);
827
828 currRecHandle = nextRecHandle;
829
830 pldm_pdr_find_record(repo, currRecHandle, &data, &size, &nextRecHandle);
831 EXPECT_EQ(size, commonSize + (pldm_entity_get_num_children(
832 l3b, PLDM_ENTITY_ASSOCIAION_LOGICAL) *
833 sizeof(pldm_entity)));
834 start = data;
835 hdr = reinterpret_cast<pldm_pdr_hdr*>(start);
Deepak Kodihallifb4dd7b2020-03-17 03:27:22 -0500836 EXPECT_EQ(le32toh(hdr->record_handle), 6);
Deepak Kodihalli0a738f02020-03-10 01:56:21 -0500837 EXPECT_EQ(hdr->type, PLDM_PDR_ENTITY_ASSOCIATION);
Deepak Kodihallifb4dd7b2020-03-17 03:27:22 -0500838 EXPECT_EQ(le16toh(hdr->length), size - sizeof(struct pldm_pdr_hdr));
Deepak Kodihalli0a738f02020-03-10 01:56:21 -0500839 start += sizeof(pldm_pdr_hdr);
840 containerId = reinterpret_cast<uint16_t*>(start);
Deepak Kodihallifb4dd7b2020-03-17 03:27:22 -0500841 EXPECT_EQ(le16toh(*containerId), 4);
Deepak Kodihalli0a738f02020-03-10 01:56:21 -0500842 start += sizeof(uint16_t);
843 EXPECT_EQ(*start, PLDM_ENTITY_ASSOCIAION_LOGICAL);
844 start += sizeof(uint8_t);
845 entity = reinterpret_cast<pldm_entity*>(start);
Deepak Kodihallifb4dd7b2020-03-17 03:27:22 -0500846 EXPECT_EQ(le16toh(entity->entity_type), 5);
847 EXPECT_EQ(le16toh(entity->entity_instance_num), 1);
848 EXPECT_EQ(le16toh(entity->entity_container_id), 2);
Deepak Kodihalli0a738f02020-03-10 01:56:21 -0500849 start += sizeof(pldm_entity);
850 EXPECT_EQ(*start, pldm_entity_get_num_children(
851 l3b, PLDM_ENTITY_ASSOCIAION_LOGICAL));
852 start += sizeof(uint8_t);
853 entity = reinterpret_cast<pldm_entity*>(start);
Deepak Kodihallifb4dd7b2020-03-17 03:27:22 -0500854 EXPECT_EQ(le16toh(entity->entity_type), 7);
855 EXPECT_EQ(le16toh(entity->entity_instance_num), 1);
856 EXPECT_EQ(le16toh(entity->entity_container_id), 4);
Deepak Kodihalli0a738f02020-03-10 01:56:21 -0500857
858 EXPECT_EQ(nextRecHandle, 0);
859
860 pldm_pdr_destroy(repo);
861 pldm_entity_association_tree_destroy(tree);
862}
Deepak Kodihalli3b28ba82020-03-30 07:39:47 -0500863
864TEST(EntityAssociationPDR, testFind)
865{
866 // 1
867 // |
868 // 2--3--4
869 // |
870 // 5--6--7
871 // | |
872 // 8 9
873
874 pldm_entity entities[9]{};
875
876 entities[0].entity_type = 1;
877 entities[1].entity_type = 2;
878 entities[2].entity_type = 2;
879 entities[3].entity_type = 3;
880 entities[4].entity_type = 4;
881 entities[5].entity_type = 5;
882 entities[6].entity_type = 5;
883 entities[7].entity_type = 6;
884 entities[8].entity_type = 7;
885
886 auto tree = pldm_entity_association_tree_init();
887
888 auto l1 = pldm_entity_association_tree_add(tree, &entities[0], nullptr,
889 PLDM_ENTITY_ASSOCIAION_PHYSICAL);
890 EXPECT_NE(l1, nullptr);
891 auto l2a = pldm_entity_association_tree_add(
892 tree, &entities[1], l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
893 EXPECT_NE(l2a, nullptr);
894 auto l2b = pldm_entity_association_tree_add(
895 tree, &entities[2], l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
896 EXPECT_NE(l2b, nullptr);
897 auto l2c = pldm_entity_association_tree_add(
898 tree, &entities[3], l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
899 EXPECT_NE(l2c, nullptr);
900 auto l3a = pldm_entity_association_tree_add(
901 tree, &entities[4], l2a, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
902 EXPECT_NE(l3a, nullptr);
903 auto l3b = pldm_entity_association_tree_add(
904 tree, &entities[5], l2a, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
905 EXPECT_NE(l3b, nullptr);
906 auto l3c = pldm_entity_association_tree_add(
907 tree, &entities[6], l2a, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
908 EXPECT_NE(l3c, nullptr);
909 auto l4a = pldm_entity_association_tree_add(
910 tree, &entities[7], l3a, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
911 EXPECT_NE(l4a, nullptr);
912 auto l4b = pldm_entity_association_tree_add(
913 tree, &entities[8], l3b, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
914 EXPECT_NE(l4b, nullptr);
915
916 pldm_entity entity{};
917
918 entity.entity_type = 1;
919 entity.entity_instance_num = 1;
920 auto result = pldm_entity_association_tree_find(tree, &entity);
921 EXPECT_EQ(result, l1);
922 EXPECT_EQ(entity.entity_container_id, 0);
923
924 entity.entity_type = 2;
925 entity.entity_instance_num = 1;
926 result = pldm_entity_association_tree_find(tree, &entity);
927 EXPECT_EQ(result, l2a);
928 EXPECT_EQ(entity.entity_container_id, 1);
929 entity.entity_type = 2;
930 entity.entity_instance_num = 2;
931 result = pldm_entity_association_tree_find(tree, &entity);
932 EXPECT_EQ(result, l2b);
933 EXPECT_EQ(entity.entity_container_id, 1);
934 entity.entity_type = 3;
935 entity.entity_instance_num = 1;
936 result = pldm_entity_association_tree_find(tree, &entity);
937 EXPECT_EQ(result, l2c);
938 EXPECT_EQ(entity.entity_container_id, 1);
939
940 entity.entity_type = 7;
941 entity.entity_instance_num = 1;
942 result = pldm_entity_association_tree_find(tree, &entity);
943 EXPECT_EQ(result, l4b);
944 EXPECT_EQ(entity.entity_container_id, 4);
945
946 pldm_entity_association_tree_destroy(tree);
947}
948
949TEST(EntityAssociationPDR, testExtract)
950{
951 std::vector<uint8_t> pdr{};
952 pdr.resize(sizeof(pldm_pdr_hdr) + sizeof(pldm_pdr_entity_association) +
953 sizeof(pldm_entity) * 4);
954 pldm_pdr_hdr* hdr = reinterpret_cast<pldm_pdr_hdr*>(pdr.data());
955 hdr->type = PLDM_PDR_ENTITY_ASSOCIATION;
956 hdr->length =
957 htole16(sizeof(pldm_pdr_entity_association) + sizeof(pldm_entity) * 4);
958
959 pldm_pdr_entity_association* e =
960 reinterpret_cast<pldm_pdr_entity_association*>(pdr.data() +
961 sizeof(pldm_pdr_hdr));
962 e->container_id = htole16(1);
963 e->num_children = 5;
964 e->container.entity_type = htole16(1);
965 e->container.entity_instance_num = htole16(1);
966 e->container.entity_container_id = htole16(0);
967
968 pldm_entity* entity = e->children;
969 entity->entity_type = htole16(2);
970 entity->entity_instance_num = htole16(1);
971 entity->entity_container_id = htole16(1);
972 ++entity;
973 entity->entity_type = htole16(3);
974 entity->entity_instance_num = htole16(1);
975 entity->entity_container_id = htole16(1);
976 ++entity;
977 entity->entity_type = htole16(4);
978 entity->entity_instance_num = htole16(1);
979 entity->entity_container_id = htole16(1);
980 ++entity;
981 entity->entity_type = htole16(5);
982 entity->entity_instance_num = htole16(1);
983 entity->entity_container_id = htole16(1);
984 ++entity;
985 entity->entity_type = htole16(6);
986 entity->entity_instance_num = htole16(1);
987 entity->entity_container_id = htole16(1);
988
989 size_t num{};
990 pldm_entity* out = nullptr;
991 pldm_entity_association_pdr_extract(pdr.data(), pdr.size(), &num, &out);
992 EXPECT_EQ(num, e->num_children + 1);
993 EXPECT_EQ(out[0].entity_type, 1);
994 EXPECT_EQ(out[0].entity_instance_num, 1);
995 EXPECT_EQ(out[0].entity_container_id, 0);
996 EXPECT_EQ(out[1].entity_type, 2);
997 EXPECT_EQ(out[1].entity_instance_num, 1);
998 EXPECT_EQ(out[1].entity_container_id, 1);
999 EXPECT_EQ(out[2].entity_type, 3);
1000 EXPECT_EQ(out[2].entity_instance_num, 1);
1001 EXPECT_EQ(out[2].entity_container_id, 1);
1002 EXPECT_EQ(out[3].entity_type, 4);
1003 EXPECT_EQ(out[3].entity_instance_num, 1);
1004 EXPECT_EQ(out[3].entity_container_id, 1);
1005 EXPECT_EQ(out[4].entity_type, 5);
1006 EXPECT_EQ(out[4].entity_instance_num, 1);
1007 EXPECT_EQ(out[4].entity_container_id, 1);
1008 EXPECT_EQ(out[5].entity_type, 6);
1009 EXPECT_EQ(out[5].entity_instance_num, 1);
1010 EXPECT_EQ(out[5].entity_container_id, 1);
1011
1012 free(out);
1013}