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