blob: 0894a3f088b36eacc015ee96d3ab13162c346348 [file] [log] [blame]
Manojkiran Eda9a8e4972022-11-28 16:38:21 +05301#include <endian.h>
Andrew Jefferyefb40062023-11-10 13:48:39 +10302#include <libpldm/pdr.h>
3#include <libpldm/platform.h>
Manojkiran Eda9a8e4972022-11-28 16:38:21 +05304
Andrew Jeffery9c766792022-08-10 23:12:49 +09305#include <array>
Manojkiran Eda9a8e4972022-11-28 16:38:21 +05306#include <cstdint>
Andrew Jeffery5a706072023-04-05 19:45:31 +09307#include <cstdlib>
8#include <cstring>
Manojkiran Eda9a8e4972022-11-28 16:38:21 +05309#include <vector>
Andrew Jeffery9c766792022-08-10 23:12:49 +093010
Andrew Jeffery9c766792022-08-10 23:12:49 +093011#include <gtest/gtest.h>
12
13TEST(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
21TEST(PDRUpdate, testAdd)
22{
23 auto repo = pldm_pdr_init();
24
25 std::array<uint8_t, 10> data{};
Andrew Jefferyc79a5df2023-07-17 15:09:21 +093026 uint32_t handle = 0;
Andrew Jefferyfae36412024-06-20 06:35:51 +000027 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), false, 1, &handle),
28 0);
Andrew Jeffery9c766792022-08-10 23:12:49 +093029 EXPECT_EQ(handle, 1u);
30 EXPECT_EQ(pldm_pdr_get_record_count(repo), 1u);
31 EXPECT_EQ(pldm_pdr_get_repo_size(repo), data.size());
32
Andrew Jefferyc79a5df2023-07-17 15:09:21 +093033 handle = 0;
Andrew Jefferyfae36412024-06-20 06:35:51 +000034 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), false, 1, &handle),
35 0);
Andrew Jeffery9c766792022-08-10 23:12:49 +093036 EXPECT_EQ(handle, 2u);
Andrew Jefferyc79a5df2023-07-17 15:09:21 +093037
38 handle = 0;
Andrew Jefferyfae36412024-06-20 06:35:51 +000039 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), false, 1, &handle),
40 0);
Andrew Jeffery9c766792022-08-10 23:12:49 +093041 EXPECT_EQ(handle, 3u);
Andrew Jefferyc79a5df2023-07-17 15:09:21 +093042
43 handle = 0xdeeddeedu;
Andrew Jefferyfae36412024-06-20 06:35:51 +000044 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), false, 1, &handle),
45 0);
Andrew Jefferyc79a5df2023-07-17 15:09:21 +093046 EXPECT_EQ(handle, 0xdeeddeed);
Andrew Jeffery9c766792022-08-10 23:12:49 +093047 EXPECT_EQ(pldm_pdr_get_record_count(repo), 4u);
48 EXPECT_EQ(pldm_pdr_get_repo_size(repo), data.size() * 4u);
49
50 pldm_pdr_destroy(repo);
51}
52
53TEST(PDRRemoveByTerminus, testRemoveByTerminus)
54{
55 std::array<uint8_t, 10> data{};
56
57 auto repo = pldm_pdr_init();
Andrew Jefferyc79a5df2023-07-17 15:09:21 +093058
Andrew Jefferyfae36412024-06-20 06:35:51 +000059 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), false, 1, NULL), 0);
Andrew Jeffery9c766792022-08-10 23:12:49 +093060 pldm_pdr_remove_pdrs_by_terminus_handle(repo, 1);
61 EXPECT_EQ(pldm_pdr_get_record_count(repo), 0u);
62 pldm_pdr_destroy(repo);
63
64 repo = pldm_pdr_init();
Andrew Jefferyfae36412024-06-20 06:35:51 +000065 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), true, 2, NULL), 0);
66 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), true, 1, NULL), 0);
Andrew Jeffery9c766792022-08-10 23:12:49 +093067 EXPECT_EQ(pldm_pdr_get_record_count(repo), 2u);
68 pldm_pdr_remove_pdrs_by_terminus_handle(repo, 1);
69 EXPECT_EQ(pldm_pdr_get_record_count(repo), 1u);
70 pldm_pdr_destroy(repo);
71
72 repo = pldm_pdr_init();
Andrew Jefferyfae36412024-06-20 06:35:51 +000073 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), true, 1, NULL), 0);
74 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), true, 2, NULL), 0);
75 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), true, 2, NULL), 0);
Andrew Jeffery9c766792022-08-10 23:12:49 +093076 EXPECT_EQ(pldm_pdr_get_record_count(repo), 3u);
77 pldm_pdr_remove_pdrs_by_terminus_handle(repo, 2);
78 EXPECT_EQ(pldm_pdr_get_record_count(repo), 1u);
79 pldm_pdr_destroy(repo);
80
81 repo = pldm_pdr_init();
Andrew Jefferyfae36412024-06-20 06:35:51 +000082 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), true, 1, NULL), 0);
83 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), false, 2, NULL), 0);
84 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), true, 1, NULL), 0);
Andrew Jeffery9c766792022-08-10 23:12:49 +093085 EXPECT_EQ(pldm_pdr_get_record_count(repo), 3u);
86 pldm_pdr_remove_remote_pdrs(repo);
87 EXPECT_EQ(pldm_pdr_get_record_count(repo), 1u);
88 pldm_pdr_remove_pdrs_by_terminus_handle(repo, 1);
89 EXPECT_EQ(pldm_pdr_get_record_count(repo), 1u);
90 pldm_pdr_remove_pdrs_by_terminus_handle(repo, 2);
91 EXPECT_EQ(pldm_pdr_get_record_count(repo), 0u);
92 pldm_pdr_destroy(repo);
93}
94
95TEST(PDRUpdate, testRemove)
96{
97 std::array<uint8_t, 10> data{};
98
99 auto repo = pldm_pdr_init();
100 pldm_pdr_remove_remote_pdrs(repo);
101 EXPECT_EQ(pldm_pdr_get_record_count(repo), 0u);
102 pldm_pdr_destroy(repo);
103
104 repo = pldm_pdr_init();
Andrew Jefferyfae36412024-06-20 06:35:51 +0000105 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), true, 1, NULL), 0);
Andrew Jeffery9c766792022-08-10 23:12:49 +0930106 pldm_pdr_remove_remote_pdrs(repo);
107 EXPECT_EQ(pldm_pdr_get_record_count(repo), 0u);
108 pldm_pdr_destroy(repo);
109
110 repo = pldm_pdr_init();
Andrew Jefferyfae36412024-06-20 06:35:51 +0000111 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), false, 1, NULL), 0);
Andrew Jeffery9c766792022-08-10 23:12:49 +0930112 pldm_pdr_remove_remote_pdrs(repo);
113 EXPECT_EQ(pldm_pdr_get_record_count(repo), 1u);
114 pldm_pdr_destroy(repo);
115
116 repo = pldm_pdr_init();
Andrew Jefferyfae36412024-06-20 06:35:51 +0000117 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), false, 1, NULL), 0);
118 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), true, 1, NULL), 0);
Andrew Jeffery9c766792022-08-10 23:12:49 +0930119 pldm_pdr_remove_remote_pdrs(repo);
120 EXPECT_EQ(pldm_pdr_get_record_count(repo), 1u);
121 pldm_pdr_destroy(repo);
122
123 repo = pldm_pdr_init();
Andrew Jefferyfae36412024-06-20 06:35:51 +0000124 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), true, 1, NULL), 0);
125 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), false, 1, NULL), 0);
Andrew Jeffery9c766792022-08-10 23:12:49 +0930126 pldm_pdr_remove_remote_pdrs(repo);
127 EXPECT_EQ(pldm_pdr_get_record_count(repo), 1u);
128 pldm_pdr_destroy(repo);
129
130 repo = pldm_pdr_init();
Andrew Jefferyfae36412024-06-20 06:35:51 +0000131 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), true, 1, NULL), 0);
132 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), true, 1, NULL), 0);
133 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), true, 1, NULL), 0);
134 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), true, 1, NULL), 0);
Andrew Jeffery9c766792022-08-10 23:12:49 +0930135 pldm_pdr_remove_remote_pdrs(repo);
136 EXPECT_EQ(pldm_pdr_get_record_count(repo), 0u);
Andrew Jefferyfae36412024-06-20 06:35:51 +0000137 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), true, 1, NULL), 0);
138 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), false, 1, NULL), 0);
Andrew Jeffery9c766792022-08-10 23:12:49 +0930139 EXPECT_EQ(pldm_pdr_get_record_count(repo), 2u);
140 pldm_pdr_destroy(repo);
141
142 repo = pldm_pdr_init();
Andrew Jefferyfae36412024-06-20 06:35:51 +0000143 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), false, 1, NULL), 0);
144 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), false, 1, NULL), 0);
145 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), false, 1, NULL), 0);
146 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), false, 1, NULL), 0);
Andrew Jeffery9c766792022-08-10 23:12:49 +0930147 pldm_pdr_remove_remote_pdrs(repo);
148 EXPECT_EQ(pldm_pdr_get_record_count(repo), 4u);
Andrew Jefferyfae36412024-06-20 06:35:51 +0000149 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), true, 1, NULL), 0);
150 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), false, 1, NULL), 0);
Andrew Jeffery9c766792022-08-10 23:12:49 +0930151 EXPECT_EQ(pldm_pdr_get_record_count(repo), 6u);
152 pldm_pdr_destroy(repo);
153
154 repo = pldm_pdr_init();
Andrew Jefferyfae36412024-06-20 06:35:51 +0000155 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), true, 1, NULL), 0);
156 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), false, 1, NULL), 0);
157 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), false, 1, NULL), 0);
158 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), false, 1, NULL), 0);
Andrew Jeffery9c766792022-08-10 23:12:49 +0930159 pldm_pdr_remove_remote_pdrs(repo);
160 EXPECT_EQ(pldm_pdr_get_record_count(repo), 3u);
Andrew Jefferyfae36412024-06-20 06:35:51 +0000161 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), true, 1, NULL), 0);
162 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), false, 1, NULL), 0);
Andrew Jeffery9c766792022-08-10 23:12:49 +0930163 EXPECT_EQ(pldm_pdr_get_record_count(repo), 5u);
164 pldm_pdr_destroy(repo);
165
166 repo = pldm_pdr_init();
Andrew Jefferyfae36412024-06-20 06:35:51 +0000167 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), false, 1, NULL), 0);
168 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), false, 1, NULL), 0);
169 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), false, 1, NULL), 0);
170 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), true, 1, NULL), 0);
Andrew Jeffery9c766792022-08-10 23:12:49 +0930171 pldm_pdr_remove_remote_pdrs(repo);
172 EXPECT_EQ(pldm_pdr_get_record_count(repo), 3u);
Andrew Jefferyfae36412024-06-20 06:35:51 +0000173 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), true, 1, NULL), 0);
174 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), false, 1, NULL), 0);
Andrew Jeffery9c766792022-08-10 23:12:49 +0930175 EXPECT_EQ(pldm_pdr_get_record_count(repo), 5u);
176 pldm_pdr_destroy(repo);
177
178 repo = pldm_pdr_init();
Andrew Jefferyfae36412024-06-20 06:35:51 +0000179 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), true, 1, NULL), 0);
180 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), false, 1, NULL), 0);
181 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), true, 1, NULL), 0);
182 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), false, 1, NULL), 0);
Andrew Jeffery9c766792022-08-10 23:12:49 +0930183 pldm_pdr_remove_remote_pdrs(repo);
184 EXPECT_EQ(pldm_pdr_get_record_count(repo), 2u);
Andrew Jefferyfae36412024-06-20 06:35:51 +0000185 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), false, 1, NULL), 0);
186 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), true, 1, NULL), 0);
Andrew Jeffery9c766792022-08-10 23:12:49 +0930187 EXPECT_EQ(pldm_pdr_get_record_count(repo), 4u);
188 pldm_pdr_destroy(repo);
189
190 repo = pldm_pdr_init();
Andrew Jefferyfae36412024-06-20 06:35:51 +0000191 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), false, 1, NULL), 0);
192 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), false, 1, NULL), 0);
193 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), false, 1, NULL), 0);
194 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), true, 1, NULL), 0);
Andrew Jeffery9c766792022-08-10 23:12:49 +0930195 pldm_pdr_remove_remote_pdrs(repo);
196 EXPECT_EQ(pldm_pdr_get_record_count(repo), 3u);
Andrew Jefferyfae36412024-06-20 06:35:51 +0000197 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), false, 1, NULL), 0);
198 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), true, 1, NULL), 0);
Andrew Jeffery9c766792022-08-10 23:12:49 +0930199 EXPECT_EQ(pldm_pdr_get_record_count(repo), 5u);
200 pldm_pdr_destroy(repo);
201
202 repo = pldm_pdr_init();
Andrew Jefferyfae36412024-06-20 06:35:51 +0000203 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), false, 1, NULL), 0);
204 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), true, 1, NULL), 0);
205 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), false, 1, NULL), 0);
206 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), true, 1, NULL), 0);
Andrew Jeffery9c766792022-08-10 23:12:49 +0930207 pldm_pdr_remove_remote_pdrs(repo);
208 EXPECT_EQ(pldm_pdr_get_record_count(repo), 2u);
Andrew Jefferyfae36412024-06-20 06:35:51 +0000209 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), false, 1, NULL), 0);
210 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), true, 1, NULL), 0);
Andrew Jeffery9c766792022-08-10 23:12:49 +0930211 EXPECT_EQ(pldm_pdr_get_record_count(repo), 4u);
212 pldm_pdr_destroy(repo);
213
214 repo = pldm_pdr_init();
Andrew Jefferyfae36412024-06-20 06:35:51 +0000215 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), true, 1, NULL), 0);
216 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), true, 1, NULL), 0);
217 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), true, 1, NULL), 0);
218 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), false, 1, NULL), 0);
Andrew Jeffery9c766792022-08-10 23:12:49 +0930219 pldm_pdr_remove_remote_pdrs(repo);
220 EXPECT_EQ(pldm_pdr_get_record_count(repo), 1u);
Andrew Jefferyfae36412024-06-20 06:35:51 +0000221 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), false, 1, NULL), 0);
222 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), true, 1, NULL), 0);
Andrew Jeffery9c766792022-08-10 23:12:49 +0930223 EXPECT_EQ(pldm_pdr_get_record_count(repo), 3u);
224 pldm_pdr_destroy(repo);
225
226 repo = pldm_pdr_init();
Andrew Jefferyfae36412024-06-20 06:35:51 +0000227 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), false, 1, NULL), 0);
228 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), true, 1, NULL), 0);
229 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), true, 1, NULL), 0);
230 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), true, 1, NULL), 0);
Andrew Jeffery9c766792022-08-10 23:12:49 +0930231 pldm_pdr_remove_remote_pdrs(repo);
232 EXPECT_EQ(pldm_pdr_get_record_count(repo), 1u);
Andrew Jefferyfae36412024-06-20 06:35:51 +0000233 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), false, 1, NULL), 0);
234 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), true, 1, NULL), 0);
Andrew Jeffery9c766792022-08-10 23:12:49 +0930235 EXPECT_EQ(pldm_pdr_get_record_count(repo), 3u);
236 pldm_pdr_destroy(repo);
237
238 repo = pldm_pdr_init();
Andrew Jefferyfae36412024-06-20 06:35:51 +0000239 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), false, 1, NULL), 0);
240 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), true, 1, NULL), 0);
241 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), true, 1, NULL), 0);
242 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), false, 1, NULL), 0);
Andrew Jeffery9c766792022-08-10 23:12:49 +0930243 pldm_pdr_remove_remote_pdrs(repo);
244 EXPECT_EQ(pldm_pdr_get_record_count(repo), 2u);
Andrew Jefferyfae36412024-06-20 06:35:51 +0000245 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), false, 1, NULL), 0);
246 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), true, 1, NULL), 0);
Andrew Jeffery9c766792022-08-10 23:12:49 +0930247 EXPECT_EQ(pldm_pdr_get_record_count(repo), 4u);
248 pldm_pdr_destroy(repo);
249
250 repo = pldm_pdr_init();
Andrew Jefferyfae36412024-06-20 06:35:51 +0000251 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), true, 1, NULL), 0);
252 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), false, 1, NULL), 0);
253 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), false, 1, NULL), 0);
254 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), true, 1, NULL), 0);
Andrew Jeffery9c766792022-08-10 23:12:49 +0930255 pldm_pdr_remove_remote_pdrs(repo);
256 EXPECT_EQ(pldm_pdr_get_record_count(repo), 2u);
Andrew Jefferyc79a5df2023-07-17 15:09:21 +0930257 uint32_t handle = 0;
Andrew Jefferyfae36412024-06-20 06:35:51 +0000258 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), false, 1, &handle),
259 0);
Andrew Jeffery9c766792022-08-10 23:12:49 +0930260 EXPECT_EQ(handle, 3u);
Andrew Jefferyc79a5df2023-07-17 15:09:21 +0930261 handle = 0;
Andrew Jefferyfae36412024-06-20 06:35:51 +0000262 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), true, 1, &handle),
263 0);
Andrew Jeffery9c766792022-08-10 23:12:49 +0930264 EXPECT_EQ(handle, 4u);
265 EXPECT_EQ(pldm_pdr_get_record_count(repo), 4u);
266 pldm_pdr_destroy(repo);
267}
268
269TEST(PDRAccess, testGet)
270{
271 auto repo = pldm_pdr_init();
272
273 std::array<uint32_t, 10> in{100, 345, 3, 6, 89, 0, 11, 45, 23434, 123123};
Andrew Jefferyc79a5df2023-07-17 15:09:21 +0930274 uint32_t handle = 1;
Andrew Jefferyfae36412024-06-20 06:35:51 +0000275 EXPECT_EQ(pldm_pdr_add(repo, reinterpret_cast<uint8_t*>(in.data()),
276 sizeof(in), false, 1, &handle),
Andrew Jefferyc79a5df2023-07-17 15:09:21 +0930277 0);
Andrew Jeffery9c766792022-08-10 23:12:49 +0930278 EXPECT_EQ(pldm_pdr_get_record_count(repo), 1u);
279 EXPECT_EQ(pldm_pdr_get_repo_size(repo), sizeof(in));
280 uint32_t size{};
281 uint32_t nextRecHdl{};
282 uint8_t* outData = nullptr;
283 auto hdl = pldm_pdr_find_record(repo, 0, &outData, &size, &nextRecHdl);
284 EXPECT_NE(hdl, nullptr);
285 EXPECT_EQ(size, sizeof(in));
286 EXPECT_EQ(nextRecHdl, 0u);
287 EXPECT_EQ(memcmp(outData, in.data(), sizeof(in)), 0);
288 outData = nullptr;
289
290 auto hdl2 = pldm_pdr_find_record(repo, 1, &outData, &size, &nextRecHdl);
291 EXPECT_EQ(hdl, hdl2);
292 EXPECT_NE(hdl, nullptr);
293 EXPECT_EQ(size, sizeof(in));
294 EXPECT_EQ(nextRecHdl, 0u);
295 EXPECT_EQ(memcmp(outData, in.data(), sizeof(in)), 0);
296 outData = nullptr;
297
298 hdl = pldm_pdr_find_record(repo, htole32(0xdeaddead), &outData, &size,
299 &nextRecHdl);
300 EXPECT_EQ(hdl, nullptr);
301 EXPECT_EQ(size, 0u);
302 EXPECT_EQ(nextRecHdl, 0u);
303 EXPECT_EQ(outData, nullptr);
304 outData = nullptr;
305
306 std::array<uint32_t, 10> in2{1000, 3450, 30, 60, 890,
307 0, 110, 450, 234034, 123123};
Andrew Jefferyc79a5df2023-07-17 15:09:21 +0930308 handle = 2;
Andrew Jefferyfae36412024-06-20 06:35:51 +0000309 EXPECT_EQ(pldm_pdr_add(repo, reinterpret_cast<uint8_t*>(in2.data()),
310 sizeof(in2), false, 1, &handle),
Andrew Jefferyc79a5df2023-07-17 15:09:21 +0930311 0);
312 handle = 3;
Andrew Jefferyfae36412024-06-20 06:35:51 +0000313 EXPECT_EQ(pldm_pdr_add(repo, reinterpret_cast<uint8_t*>(in2.data()),
314 sizeof(in2), false, 1, &handle),
Andrew Jefferyc79a5df2023-07-17 15:09:21 +0930315 0);
316 handle = 4;
Andrew Jefferyfae36412024-06-20 06:35:51 +0000317 EXPECT_EQ(pldm_pdr_add(repo, reinterpret_cast<uint8_t*>(in2.data()),
318 sizeof(in2), true, 1, &handle),
Andrew Jefferyc79a5df2023-07-17 15:09:21 +0930319 0);
Andrew Jeffery9c766792022-08-10 23:12:49 +0930320 EXPECT_EQ(pldm_pdr_get_record_count(repo), 4u);
321 EXPECT_EQ(pldm_pdr_get_repo_size(repo), sizeof(in2) * 4);
322 hdl = pldm_pdr_find_record(repo, 0, &outData, &size, &nextRecHdl);
323 EXPECT_NE(hdl, nullptr);
324 EXPECT_EQ(size, sizeof(in));
325 EXPECT_EQ(nextRecHdl, 2u);
326 EXPECT_EQ(memcmp(outData, in.data(), sizeof(in)), 0);
327 outData = nullptr;
328 hdl2 = pldm_pdr_find_record(repo, 1, &outData, &size, &nextRecHdl);
329 EXPECT_EQ(hdl, hdl2);
330 EXPECT_NE(hdl, nullptr);
331 EXPECT_EQ(size, sizeof(in));
332 EXPECT_EQ(nextRecHdl, 2u);
333 EXPECT_EQ(memcmp(outData, in.data(), sizeof(in)), 0);
334 outData = nullptr;
335 hdl = pldm_pdr_find_record(repo, 2, &outData, &size, &nextRecHdl);
336 EXPECT_NE(hdl, nullptr);
337 EXPECT_EQ(size, sizeof(in2));
338 EXPECT_EQ(nextRecHdl, 3u);
339 EXPECT_EQ(memcmp(outData, in2.data(), sizeof(in2)), 0);
340 outData = nullptr;
341 hdl = pldm_pdr_find_record(repo, 3, &outData, &size, &nextRecHdl);
342 EXPECT_NE(hdl, nullptr);
343 EXPECT_EQ(pldm_pdr_record_is_remote(hdl), false);
344 EXPECT_EQ(size, sizeof(in2));
345 EXPECT_EQ(nextRecHdl, 4u);
346 EXPECT_EQ(memcmp(outData, in2.data(), sizeof(in2)), 0);
347 outData = nullptr;
348 hdl = pldm_pdr_find_record(repo, 4, &outData, &size, &nextRecHdl);
349 EXPECT_NE(hdl, nullptr);
350 EXPECT_EQ(pldm_pdr_record_is_remote(hdl), true);
351 EXPECT_EQ(size, sizeof(in2));
352 EXPECT_EQ(nextRecHdl, 0u);
353 EXPECT_EQ(memcmp(outData, in2.data(), sizeof(in2)), 0);
354 outData = nullptr;
355
356 pldm_pdr_destroy(repo);
357}
358
359TEST(PDRAccess, testGetNext)
360{
361 auto repo = pldm_pdr_init();
362
363 std::array<uint32_t, 10> in{100, 345, 3, 6, 89, 0, 11, 45, 23434, 123123};
Andrew Jefferyc79a5df2023-07-17 15:09:21 +0930364 uint32_t handle = 1;
Andrew Jefferyfae36412024-06-20 06:35:51 +0000365 EXPECT_EQ(pldm_pdr_add(repo, reinterpret_cast<uint8_t*>(in.data()),
366 sizeof(in), false, 1, &handle),
Andrew Jefferyc79a5df2023-07-17 15:09:21 +0930367 0);
Andrew Jeffery9c766792022-08-10 23:12:49 +0930368 EXPECT_EQ(pldm_pdr_get_record_count(repo), 1u);
369 EXPECT_EQ(pldm_pdr_get_repo_size(repo), sizeof(in));
370 uint32_t size{};
371 uint32_t nextRecHdl{};
372 uint8_t* outData = nullptr;
373 auto hdl = pldm_pdr_find_record(repo, 0, &outData, &size, &nextRecHdl);
374 EXPECT_NE(hdl, nullptr);
375 EXPECT_EQ(size, sizeof(in));
376 EXPECT_EQ(nextRecHdl, 0u);
377 EXPECT_EQ(memcmp(outData, in.data(), sizeof(in)), 0);
378 outData = nullptr;
379
380 std::array<uint32_t, 10> in2{1000, 3450, 30, 60, 890,
381 0, 110, 450, 234034, 123123};
Andrew Jefferyc79a5df2023-07-17 15:09:21 +0930382 handle = 2;
Andrew Jefferyfae36412024-06-20 06:35:51 +0000383 EXPECT_EQ(pldm_pdr_add(repo, reinterpret_cast<uint8_t*>(in2.data()),
384 sizeof(in2), false, 1, &handle),
Andrew Jefferyc79a5df2023-07-17 15:09:21 +0930385 0);
386 handle = 3;
Andrew Jefferyfae36412024-06-20 06:35:51 +0000387 EXPECT_EQ(pldm_pdr_add(repo, reinterpret_cast<uint8_t*>(in2.data()),
388 sizeof(in2), false, 1, &handle),
Andrew Jefferyc79a5df2023-07-17 15:09:21 +0930389 0);
390 handle = 4;
Andrew Jefferyfae36412024-06-20 06:35:51 +0000391 EXPECT_EQ(pldm_pdr_add(repo, reinterpret_cast<uint8_t*>(in2.data()),
392 sizeof(in2), false, 1, &handle),
Andrew Jefferyc79a5df2023-07-17 15:09:21 +0930393 0);
Andrew Jeffery9c766792022-08-10 23:12:49 +0930394 EXPECT_EQ(pldm_pdr_get_record_count(repo), 4u);
395 EXPECT_EQ(pldm_pdr_get_repo_size(repo), sizeof(in2) * 4);
396 hdl = pldm_pdr_get_next_record(repo, hdl, &outData, &size, &nextRecHdl);
397 EXPECT_NE(hdl, nullptr);
398 EXPECT_EQ(size, sizeof(in2));
399 EXPECT_EQ(nextRecHdl, 3u);
400 EXPECT_EQ(memcmp(outData, in2.data(), sizeof(in2)), 0);
401 outData = nullptr;
402 hdl = pldm_pdr_get_next_record(repo, hdl, &outData, &size, &nextRecHdl);
403 EXPECT_NE(hdl, nullptr);
404 EXPECT_EQ(size, sizeof(in2));
405 EXPECT_EQ(nextRecHdl, 4u);
406 EXPECT_EQ(memcmp(outData, in2.data(), sizeof(in2)), 0);
407 outData = nullptr;
408 hdl = pldm_pdr_get_next_record(repo, hdl, &outData, &size, &nextRecHdl);
409 EXPECT_NE(hdl, nullptr);
410 EXPECT_EQ(size, sizeof(in2));
411 EXPECT_EQ(nextRecHdl, 0u);
412 EXPECT_EQ(memcmp(outData, in2.data(), sizeof(in2)), 0);
413 outData = nullptr;
414
415 pldm_pdr_destroy(repo);
416}
417
418TEST(PDRAccess, testFindByType)
419{
420 auto repo = pldm_pdr_init();
421
422 std::array<uint8_t, sizeof(pldm_pdr_hdr)> data{};
423 pldm_pdr_hdr* hdr = reinterpret_cast<pldm_pdr_hdr*>(data.data());
424 hdr->type = 1;
Andrew Jefferyc79a5df2023-07-17 15:09:21 +0930425 uint32_t first = 0;
Andrew Jefferyfae36412024-06-20 06:35:51 +0000426 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), false, 1, &first),
427 0);
Andrew Jeffery9c766792022-08-10 23:12:49 +0930428 hdr->type = 2;
Andrew Jefferyc79a5df2023-07-17 15:09:21 +0930429 uint32_t second = 0;
Andrew Jefferyfae36412024-06-20 06:35:51 +0000430 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), false, 1, &second),
431 0);
Andrew Jeffery9c766792022-08-10 23:12:49 +0930432 hdr->type = 3;
Andrew Jefferyc79a5df2023-07-17 15:09:21 +0930433 uint32_t third = 0;
Andrew Jefferyfae36412024-06-20 06:35:51 +0000434 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), false, 1, &third),
435 0);
Andrew Jeffery9c766792022-08-10 23:12:49 +0930436 hdr->type = 4;
Andrew Jefferyc79a5df2023-07-17 15:09:21 +0930437 uint32_t fourth = 0;
Andrew Jefferyfae36412024-06-20 06:35:51 +0000438 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), false, 1, &fourth),
439 0);
Andrew Jeffery9c766792022-08-10 23:12:49 +0930440
441 uint8_t* outData = nullptr;
442 uint32_t size{};
443 auto firstRec =
444 pldm_pdr_find_record_by_type(repo, 1, nullptr, &outData, &size);
445 EXPECT_EQ(pldm_pdr_get_record_handle(repo, firstRec), first);
446 outData = nullptr;
447 auto secondRec =
448 pldm_pdr_find_record_by_type(repo, 2, nullptr, &outData, &size);
449 EXPECT_EQ(pldm_pdr_get_record_handle(repo, secondRec), second);
450 outData = nullptr;
451 auto thirdRec =
452 pldm_pdr_find_record_by_type(repo, 3, nullptr, &outData, &size);
453 EXPECT_EQ(pldm_pdr_get_record_handle(repo, thirdRec), third);
454 outData = nullptr;
455 auto fourthRec =
456 pldm_pdr_find_record_by_type(repo, 4, nullptr, &outData, &size);
457 EXPECT_EQ(pldm_pdr_get_record_handle(repo, fourthRec), fourth);
458 outData = nullptr;
459 auto fifthRec =
460 pldm_pdr_find_record_by_type(repo, 5, nullptr, &outData, &size);
461 EXPECT_EQ(fifthRec, nullptr);
462 EXPECT_EQ(outData, nullptr);
463 EXPECT_EQ(size, 0u);
464
465 auto rec =
466 pldm_pdr_find_record_by_type(repo, 3, secondRec, &outData, &size);
467 EXPECT_EQ(pldm_pdr_get_record_handle(repo, rec), third);
468 outData = nullptr;
469 rec = pldm_pdr_find_record_by_type(repo, 4, secondRec, &outData, &size);
470 EXPECT_EQ(pldm_pdr_get_record_handle(repo, rec), fourth);
471 outData = nullptr;
472 rec = pldm_pdr_find_record_by_type(repo, 2, firstRec, &outData, &size);
473 EXPECT_EQ(pldm_pdr_get_record_handle(repo, rec), second);
474 outData = nullptr;
475
476 pldm_pdr_destroy(repo);
477}
478
479TEST(PDRUpdate, testAddFruRecordSet)
480{
481 auto repo = pldm_pdr_init();
482
Andrew Jeffery14d29842023-07-17 15:29:32 +0930483 uint32_t handle = 0;
484 EXPECT_EQ(
485 pldm_pdr_add_fru_record_set_check(repo, 1, 10, 1, 0, 100, &handle), 0);
Andrew Jeffery9c766792022-08-10 23:12:49 +0930486 EXPECT_EQ(handle, 1u);
487 EXPECT_EQ(pldm_pdr_get_record_count(repo), 1u);
488 EXPECT_EQ(pldm_pdr_get_repo_size(repo),
489 sizeof(pldm_pdr_hdr) + sizeof(pldm_pdr_fru_record_set));
490 uint32_t size{};
491 uint32_t nextRecHdl{};
492 uint8_t* outData = nullptr;
493 auto hdl = pldm_pdr_find_record(repo, 0, &outData, &size, &nextRecHdl);
494 EXPECT_NE(hdl, nullptr);
495 EXPECT_EQ(size, sizeof(pldm_pdr_hdr) + sizeof(pldm_pdr_fru_record_set));
496 EXPECT_EQ(nextRecHdl, 0u);
497 pldm_pdr_hdr* hdr = reinterpret_cast<pldm_pdr_hdr*>(outData);
498 EXPECT_EQ(hdr->version, 1u);
499 EXPECT_EQ(hdr->type, PLDM_PDR_FRU_RECORD_SET);
500 EXPECT_EQ(hdr->length, htole16(sizeof(pldm_pdr_fru_record_set)));
501 EXPECT_EQ(hdr->record_handle, htole32(1));
502 pldm_pdr_fru_record_set* fru = reinterpret_cast<pldm_pdr_fru_record_set*>(
503 outData + sizeof(pldm_pdr_hdr));
504 EXPECT_EQ(fru->terminus_handle, htole16(1));
505 EXPECT_EQ(fru->fru_rsi, htole16(10));
506 EXPECT_EQ(fru->entity_type, htole16(1));
507 EXPECT_EQ(fru->entity_instance_num, htole16(0));
508 EXPECT_EQ(fru->container_id, htole16(100));
509 outData = nullptr;
510
Andrew Jeffery14d29842023-07-17 15:29:32 +0930511 handle = 0;
512 EXPECT_EQ(
513 pldm_pdr_add_fru_record_set_check(repo, 2, 11, 2, 1, 101, &handle), 0);
Andrew Jeffery9c766792022-08-10 23:12:49 +0930514 EXPECT_EQ(handle, 2u);
515 EXPECT_EQ(pldm_pdr_get_record_count(repo), 2u);
516 EXPECT_EQ(pldm_pdr_get_repo_size(repo),
517 2 * (sizeof(pldm_pdr_hdr) + sizeof(pldm_pdr_fru_record_set)));
518 hdl = pldm_pdr_find_record(repo, 2, &outData, &size, &nextRecHdl);
519 EXPECT_NE(hdl, nullptr);
520 EXPECT_EQ(size, sizeof(pldm_pdr_hdr) + sizeof(pldm_pdr_fru_record_set));
521 EXPECT_EQ(nextRecHdl, 0u);
522 hdr = reinterpret_cast<pldm_pdr_hdr*>(outData);
523 EXPECT_EQ(hdr->version, 1u);
524 EXPECT_EQ(hdr->type, PLDM_PDR_FRU_RECORD_SET);
525 EXPECT_EQ(hdr->length, htole16(sizeof(pldm_pdr_fru_record_set)));
526 EXPECT_EQ(hdr->record_handle, htole32(2));
527 fru = reinterpret_cast<pldm_pdr_fru_record_set*>(outData +
528 sizeof(pldm_pdr_hdr));
529 EXPECT_EQ(fru->terminus_handle, htole16(2));
530 EXPECT_EQ(fru->fru_rsi, htole16(11));
531 EXPECT_EQ(fru->entity_type, htole16(2));
532 EXPECT_EQ(fru->entity_instance_num, htole16(1));
533 EXPECT_EQ(fru->container_id, htole16(101));
534 outData = nullptr;
535
536 hdl = pldm_pdr_find_record(repo, 1, &outData, &size, &nextRecHdl);
537 EXPECT_NE(hdl, nullptr);
538 EXPECT_EQ(size, sizeof(pldm_pdr_hdr) + sizeof(pldm_pdr_fru_record_set));
539 EXPECT_EQ(nextRecHdl, 2u);
540 hdr = reinterpret_cast<pldm_pdr_hdr*>(outData);
541 EXPECT_EQ(hdr->version, 1u);
542 EXPECT_EQ(hdr->type, PLDM_PDR_FRU_RECORD_SET);
543 EXPECT_EQ(hdr->length, htole16(sizeof(pldm_pdr_fru_record_set)));
544 EXPECT_EQ(hdr->record_handle, htole32(1));
545 fru = reinterpret_cast<pldm_pdr_fru_record_set*>(outData +
546 sizeof(pldm_pdr_hdr));
547 EXPECT_EQ(fru->terminus_handle, htole16(1));
548 EXPECT_EQ(fru->fru_rsi, htole16(10));
549 EXPECT_EQ(fru->entity_type, htole16(1));
550 EXPECT_EQ(fru->entity_instance_num, htole16(0));
551 EXPECT_EQ(fru->container_id, htole16(100));
552 outData = nullptr;
553
554 pldm_pdr_destroy(repo);
555}
556
557TEST(PDRUpdate, tesFindtFruRecordSet)
558{
559 auto repo = pldm_pdr_init();
560
561 uint16_t terminusHdl{};
562 uint16_t entityType{};
563 uint16_t entityInstanceNum{};
564 uint16_t containerId{};
Andrew Jeffery14d29842023-07-17 15:29:32 +0930565 uint32_t first = 1;
566 EXPECT_EQ(pldm_pdr_add_fru_record_set_check(repo, 1, 1, 1, 0, 100, &first),
567 0);
568 uint32_t second = 2;
569 EXPECT_EQ(pldm_pdr_add_fru_record_set_check(repo, 1, 2, 1, 1, 100, &second),
570 0);
571 uint32_t third = 3;
572 EXPECT_EQ(pldm_pdr_add_fru_record_set_check(repo, 1, 3, 1, 2, 100, &third),
573 0);
Andrew Jeffery9c766792022-08-10 23:12:49 +0930574 EXPECT_EQ(first, pldm_pdr_get_record_handle(
575 repo, pldm_pdr_fru_record_set_find_by_rsi(
576 repo, 1, &terminusHdl, &entityType,
577 &entityInstanceNum, &containerId)));
578 EXPECT_EQ(second, pldm_pdr_get_record_handle(
579 repo, pldm_pdr_fru_record_set_find_by_rsi(
580 repo, 2, &terminusHdl, &entityType,
581 &entityInstanceNum, &containerId)));
582 EXPECT_EQ(third, pldm_pdr_get_record_handle(
583 repo, pldm_pdr_fru_record_set_find_by_rsi(
584 repo, 3, &terminusHdl, &entityType,
585 &entityInstanceNum, &containerId)));
586 EXPECT_EQ(terminusHdl, 1u);
587 EXPECT_EQ(entityType, 1u);
588 EXPECT_EQ(entityInstanceNum, 2u);
589 EXPECT_EQ(containerId, 100u);
590 EXPECT_EQ(nullptr, pldm_pdr_fru_record_set_find_by_rsi(
591 repo, 4, &terminusHdl, &entityType,
592 &entityInstanceNum, &containerId));
593
594 pldm_pdr_destroy(repo);
595}
596
Pavithra Barithaya4d694342023-05-19 08:04:41 -0500597#ifdef LIBPLDM_API_TESTING
598TEST(PDRUpdate, testFindLastInRange)
599{
600 auto repo = pldm_pdr_init();
601
602 std::array<uint8_t, 10> data{};
Andrew Jefferyc79a5df2023-07-17 15:09:21 +0930603 uint32_t handle1 = 0;
Andrew Jefferyfae36412024-06-20 06:35:51 +0000604 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), false, 1, &handle1),
605 0);
Andrew Jefferyc79a5df2023-07-17 15:09:21 +0930606 uint32_t handle2 = 23;
Andrew Jefferyfae36412024-06-20 06:35:51 +0000607 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), false, 1, &handle2),
608 0);
Andrew Jefferyc79a5df2023-07-17 15:09:21 +0930609 uint32_t handle3 = 77;
Andrew Jefferyfae36412024-06-20 06:35:51 +0000610 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), false, 1, &handle3),
611 0);
Andrew Jefferyc79a5df2023-07-17 15:09:21 +0930612 uint32_t handle4 = 16777325;
Andrew Jefferyfae36412024-06-20 06:35:51 +0000613 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), true, 1, &handle4),
614 0);
Andrew Jefferyc79a5df2023-07-17 15:09:21 +0930615 uint32_t handle5 = 16777344;
Andrew Jefferyfae36412024-06-20 06:35:51 +0000616 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), true, 1, &handle5),
617 0);
Pavithra Barithaya4d694342023-05-19 08:04:41 -0500618
619 auto rec1 = pldm_pdr_find_last_in_range(repo, 0, 100);
620 auto rec2 = pldm_pdr_find_last_in_range(repo, 16777300, 33554431);
621 EXPECT_NE(rec1, nullptr);
622 EXPECT_NE(rec2, nullptr);
623 EXPECT_NE(handle1, pldm_pdr_get_record_handle(repo, rec1));
624 EXPECT_NE(handle2, pldm_pdr_get_record_handle(repo, rec1));
625 EXPECT_EQ(handle3, pldm_pdr_get_record_handle(repo, rec1));
626 EXPECT_NE(handle4, pldm_pdr_get_record_handle(repo, rec2));
627 EXPECT_EQ(handle5, pldm_pdr_get_record_handle(repo, rec2));
628
629 pldm_pdr_destroy(repo);
630}
631#endif
632
Pavithra Barithaya274732f2024-07-05 16:03:01 +0530633#ifdef LIBPLDM_API_TESTING
634TEST(PDRAccess, testGetTerminusHandle)
635{
636
637 auto repo = pldm_pdr_init();
638
639 pldm_pdr_hdr hdr;
640
641 hdr.type = 1;
642 uint16_t firstTerminusHandle = 1;
643 EXPECT_EQ(pldm_pdr_add_check(repo, reinterpret_cast<const uint8_t*>(&hdr),
644 sizeof(hdr), false, firstTerminusHandle, NULL),
645 0);
646
647 hdr.type = 2;
648 uint16_t secondTerminusHandle = 2;
649 EXPECT_EQ(pldm_pdr_add_check(repo, reinterpret_cast<const uint8_t*>(&hdr),
650 sizeof(hdr), true, secondTerminusHandle, NULL),
651 0);
652
653 hdr.type = 3;
654 uint16_t thirdTerminusHandle = 3;
655 EXPECT_EQ(pldm_pdr_add_check(repo, reinterpret_cast<const uint8_t*>(&hdr),
656 sizeof(hdr), true, thirdTerminusHandle, NULL),
657 0);
658
659 uint8_t* outData = nullptr;
660 uint32_t size{};
661
662 auto firstRec =
663 pldm_pdr_find_record_by_type(repo, 1, nullptr, &outData, &size);
664 EXPECT_EQ(pldm_pdr_get_terminus_handle(repo, firstRec),
665 firstTerminusHandle);
666 outData = nullptr;
667
668 auto secondRec =
669 pldm_pdr_find_record_by_type(repo, 2, nullptr, &outData, &size);
670 EXPECT_EQ(pldm_pdr_get_terminus_handle(repo, secondRec),
671 secondTerminusHandle);
672 outData = nullptr;
673
674 auto thirdRec =
675 pldm_pdr_find_record_by_type(repo, 3, nullptr, &outData, &size);
676 EXPECT_EQ(pldm_pdr_get_terminus_handle(repo, thirdRec),
677 thirdTerminusHandle);
678 outData = nullptr;
679
680 pldm_pdr_destroy(repo);
681}
682#endif
683
Andrew Jeffery9c766792022-08-10 23:12:49 +0930684TEST(EntityAssociationPDR, testInit)
685{
686 auto tree = pldm_entity_association_tree_init();
687 EXPECT_NE(tree, nullptr);
688 pldm_entity_association_tree_destroy(tree);
689}
690
691TEST(EntityAssociationPDR, testBuild)
692{
693 // 1
694 // |
695 // 2--3--4
696 // |
697 // 5--6--7
698 // | |
699 // 9 8
700
701 pldm_entity entities[9]{};
702
703 entities[0].entity_type = 1;
704 entities[1].entity_type = 2;
705 entities[2].entity_type = 2;
706 entities[3].entity_type = 3;
707 entities[4].entity_type = 4;
708 entities[5].entity_type = 5;
709 entities[6].entity_type = 5;
710 entities[7].entity_type = 6;
711 entities[8].entity_type = 7;
712
713 auto tree = pldm_entity_association_tree_init();
714
715 auto l1 = pldm_entity_association_tree_add(
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -0600716 tree, &entities[0], 0xffff, nullptr, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
Andrew Jeffery9c766792022-08-10 23:12:49 +0930717 EXPECT_NE(l1, nullptr);
718 auto l2a = pldm_entity_association_tree_add(
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -0600719 tree, &entities[1], 0xffff, l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
Andrew Jeffery9c766792022-08-10 23:12:49 +0930720 EXPECT_NE(l2a, nullptr);
721 auto l2b = pldm_entity_association_tree_add(
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -0600722 tree, &entities[2], 0xffff, l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
Andrew Jeffery9c766792022-08-10 23:12:49 +0930723 EXPECT_NE(l2b, nullptr);
724 auto l2c = pldm_entity_association_tree_add(
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -0600725 tree, &entities[3], 0xffff, l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
Andrew Jeffery9c766792022-08-10 23:12:49 +0930726 EXPECT_NE(l2c, nullptr);
727 auto l3a = pldm_entity_association_tree_add(
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -0600728 tree, &entities[4], 0xffff, l2a, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
Andrew Jeffery9c766792022-08-10 23:12:49 +0930729 EXPECT_NE(l3a, nullptr);
730 auto l3b = pldm_entity_association_tree_add(
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -0600731 tree, &entities[5], 0xffff, l2a, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
Andrew Jeffery9c766792022-08-10 23:12:49 +0930732 EXPECT_NE(l3b, nullptr);
733 auto l3c = pldm_entity_association_tree_add(
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -0600734 tree, &entities[6], 0xffff, l2a, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
Andrew Jeffery9c766792022-08-10 23:12:49 +0930735 EXPECT_NE(l3b, nullptr);
736 auto l4a = pldm_entity_association_tree_add(
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -0600737 tree, &entities[7], 0xffff, l3a, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
Andrew Jeffery9c766792022-08-10 23:12:49 +0930738 EXPECT_NE(l4a, nullptr);
739 auto l4b = pldm_entity_association_tree_add(
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -0600740 tree, &entities[8], 0xffff, l3b, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
Andrew Jeffery9c766792022-08-10 23:12:49 +0930741 EXPECT_NE(l4b, nullptr);
742
743 EXPECT_EQ(pldm_entity_is_node_parent(l1), true);
744 EXPECT_EQ(pldm_entity_is_node_parent(l2a), true);
745 EXPECT_EQ(pldm_entity_is_node_parent(l3a), true);
746 EXPECT_EQ(pldm_entity_is_node_parent(l3b), true);
747
748 EXPECT_EQ(pldm_entity_is_node_parent(l2b), false);
749 EXPECT_EQ(pldm_entity_is_node_parent(l2c), false);
750 EXPECT_EQ(pldm_entity_is_node_parent(l3c), false);
751 EXPECT_EQ(pldm_entity_is_node_parent(l4a), false);
752 EXPECT_EQ(pldm_entity_is_node_parent(l4b), false);
753
754 EXPECT_EQ(pldm_entity_is_exist_parent(l1), false);
755
756 pldm_entity nodeL1 = pldm_entity_extract(l1);
757 pldm_entity parentL2a = pldm_entity_get_parent(l2a);
758 pldm_entity parentL2b = pldm_entity_get_parent(l2b);
759 pldm_entity parentL2c = pldm_entity_get_parent(l2c);
760 EXPECT_EQ(pldm_entity_is_exist_parent(l2a), true);
761 EXPECT_EQ(pldm_entity_is_exist_parent(l2b), true);
762 EXPECT_EQ(pldm_entity_is_exist_parent(l2c), true);
763 EXPECT_EQ(parentL2a.entity_type, nodeL1.entity_type);
764 EXPECT_EQ(parentL2a.entity_instance_num, nodeL1.entity_instance_num);
765 EXPECT_EQ(parentL2a.entity_container_id, nodeL1.entity_container_id);
766 EXPECT_EQ(parentL2b.entity_type, nodeL1.entity_type);
767 EXPECT_EQ(parentL2b.entity_instance_num, nodeL1.entity_instance_num);
768 EXPECT_EQ(parentL2b.entity_container_id, nodeL1.entity_container_id);
769 EXPECT_EQ(parentL2c.entity_type, nodeL1.entity_type);
770 EXPECT_EQ(parentL2c.entity_instance_num, nodeL1.entity_instance_num);
771 EXPECT_EQ(parentL2c.entity_container_id, nodeL1.entity_container_id);
772
773 pldm_entity nodeL2a = pldm_entity_extract(l2a);
774 pldm_entity parentL3a = pldm_entity_get_parent(l3a);
775 pldm_entity parentL3b = pldm_entity_get_parent(l3b);
776 pldm_entity parentL3c = pldm_entity_get_parent(l3c);
777 EXPECT_EQ(pldm_entity_is_exist_parent(l3a), true);
778 EXPECT_EQ(pldm_entity_is_exist_parent(l3b), true);
779 EXPECT_EQ(pldm_entity_is_exist_parent(l3c), true);
780 EXPECT_EQ(parentL3a.entity_type, nodeL2a.entity_type);
781 EXPECT_EQ(parentL3a.entity_instance_num, nodeL2a.entity_instance_num);
782 EXPECT_EQ(parentL3a.entity_container_id, nodeL2a.entity_container_id);
783 EXPECT_EQ(parentL3b.entity_type, nodeL2a.entity_type);
784 EXPECT_EQ(parentL3b.entity_instance_num, nodeL2a.entity_instance_num);
785 EXPECT_EQ(parentL3b.entity_container_id, nodeL2a.entity_container_id);
786 EXPECT_EQ(parentL3c.entity_type, nodeL2a.entity_type);
787 EXPECT_EQ(parentL3c.entity_instance_num, nodeL2a.entity_instance_num);
788 EXPECT_EQ(parentL3c.entity_container_id, nodeL2a.entity_container_id);
789
790 pldm_entity nodeL3a = pldm_entity_extract(l3a);
791 pldm_entity parentL4a = pldm_entity_get_parent(l4a);
792 EXPECT_EQ(pldm_entity_is_exist_parent(l4a), true);
793 EXPECT_EQ(parentL4a.entity_type, nodeL3a.entity_type);
794 EXPECT_EQ(parentL4a.entity_instance_num, nodeL3a.entity_instance_num);
795 EXPECT_EQ(parentL4a.entity_container_id, nodeL3a.entity_container_id);
796
797 pldm_entity nodeL3b = pldm_entity_extract(l3b);
798 pldm_entity parentL4b = pldm_entity_get_parent(l4b);
799 EXPECT_EQ(pldm_entity_is_exist_parent(l4b), true);
800 EXPECT_EQ(parentL4b.entity_type, nodeL3b.entity_type);
801 EXPECT_EQ(parentL4b.entity_instance_num, nodeL3b.entity_instance_num);
802 EXPECT_EQ(parentL4b.entity_container_id, nodeL3b.entity_container_id);
803
804 size_t num{};
805 pldm_entity* out = nullptr;
806 pldm_entity_association_tree_visit(tree, &out, &num);
807 EXPECT_EQ(num, 9u);
808
809 EXPECT_EQ(out[0].entity_type, 1u);
810 EXPECT_EQ(out[0].entity_instance_num, 1u);
811 EXPECT_EQ(out[0].entity_container_id, 0u);
812
813 EXPECT_EQ(out[1].entity_type, 2u);
814 EXPECT_EQ(out[1].entity_instance_num, 1u);
815 EXPECT_EQ(out[1].entity_container_id, 1u);
816 EXPECT_EQ(out[2].entity_type, 2u);
817 EXPECT_EQ(out[2].entity_instance_num, 2u);
818 EXPECT_EQ(out[2].entity_container_id, 1u);
819 EXPECT_EQ(out[3].entity_type, 3u);
820 EXPECT_EQ(out[3].entity_instance_num, 1u);
821 EXPECT_EQ(out[3].entity_container_id, 1u);
822
823 EXPECT_EQ(out[4].entity_type, 4u);
824 EXPECT_EQ(out[4].entity_instance_num, 1u);
825 EXPECT_EQ(out[4].entity_container_id, 2u);
826 EXPECT_EQ(out[5].entity_type, 5u);
827 EXPECT_EQ(out[5].entity_instance_num, 1u);
828 EXPECT_EQ(out[5].entity_container_id, 2u);
829 EXPECT_EQ(out[6].entity_type, 5u);
830 EXPECT_EQ(out[6].entity_instance_num, 2u);
831 EXPECT_EQ(out[6].entity_container_id, 2u);
832
833 EXPECT_EQ(out[7].entity_type, 7u);
834 EXPECT_EQ(out[7].entity_instance_num, 1u);
835 EXPECT_EQ(out[7].entity_container_id, 4u);
836 EXPECT_EQ(out[8].entity_type, 6u);
837 EXPECT_EQ(out[8].entity_instance_num, 1u);
838 EXPECT_EQ(out[8].entity_container_id, 3u);
839
840 free(out);
841
842 pldm_entity p1 = pldm_entity_extract(l1);
843 EXPECT_EQ(p1.entity_type, 1u);
844 EXPECT_EQ(p1.entity_instance_num, 1u);
845 EXPECT_EQ(p1.entity_container_id, 0u);
846
847 pldm_entity p2a = pldm_entity_extract(l2a);
848 EXPECT_EQ(p2a.entity_type, 2u);
849 EXPECT_EQ(p2a.entity_instance_num, 1u);
850 EXPECT_EQ(p2a.entity_container_id, 1u);
851 pldm_entity p2b = pldm_entity_extract(l2b);
852 EXPECT_EQ(p2b.entity_type, 2u);
853 EXPECT_EQ(p2b.entity_instance_num, 2u);
854 EXPECT_EQ(p2b.entity_container_id, 1u);
855 pldm_entity p2c = pldm_entity_extract(l2c);
856 EXPECT_EQ(p2c.entity_type, 3u);
857 EXPECT_EQ(p2c.entity_instance_num, 1u);
858 EXPECT_EQ(p2c.entity_container_id, 1u);
859
860 pldm_entity p3a = pldm_entity_extract(l3a);
861 EXPECT_EQ(p3a.entity_type, 4u);
862 EXPECT_EQ(p3a.entity_instance_num, 1u);
863 EXPECT_EQ(p3a.entity_container_id, 2u);
864 pldm_entity p3b = pldm_entity_extract(l3b);
865 EXPECT_EQ(p3b.entity_type, 5u);
866 EXPECT_EQ(p3b.entity_instance_num, 1u);
867 EXPECT_EQ(p3b.entity_container_id, 2u);
868 pldm_entity p3c = pldm_entity_extract(l3c);
869 EXPECT_EQ(p3c.entity_type, 5u);
870 EXPECT_EQ(p3c.entity_instance_num, 2u);
871 EXPECT_EQ(p3c.entity_container_id, 2u);
872
873 pldm_entity p4a = pldm_entity_extract(l4a);
874 EXPECT_EQ(p4a.entity_type, 6u);
875 EXPECT_EQ(p4a.entity_instance_num, 1u);
876 EXPECT_EQ(p4a.entity_container_id, 3u);
877 pldm_entity p4b = pldm_entity_extract(l4b);
878 EXPECT_EQ(p4b.entity_type, 7u);
879 EXPECT_EQ(p4b.entity_instance_num, 1u);
880 EXPECT_EQ(p4b.entity_container_id, 4u);
881
882 pldm_entity_association_tree_destroy(tree);
883}
884
Pavithra Barithaya9947f9d2023-05-18 05:20:24 -0500885#if LIBPLDM_API_TESTING
886TEST(EntityAssociationPDR, findAndAddRemotePDR)
887{
888 // Tree - 1
889 //
890 // 11521(1,0)
891 // |
892 // 45 (1,1)
893 // |
894 // 64 (1,2)
895 // |
896 // ------------------
897 // | |
898 // 67(0,3) 67(1,3)
899 // | |
900 // 135(0,4) 135(0,5)
901 // | |
902 // 32903(0,6) 32903(0,7)
903
904 pldm_entity entities[9]{};
905 entities[0].entity_type = 11521;
906 entities[1].entity_type = 45;
907 entities[2].entity_type = 64;
908 entities[3].entity_type = 67;
909 entities[4].entity_type = 67;
910 entities[5].entity_type = 135;
911 entities[5].entity_container_id = 2;
912 entities[6].entity_type = 135;
913 entities[6].entity_container_id = 3;
914 entities[7].entity_type = 32903;
915 entities[8].entity_type = 32903;
916 auto tree = pldm_entity_association_tree_init();
917 auto l1 = pldm_entity_association_tree_add_entity(
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -0600918 tree, &entities[0], 0xffff, nullptr, PLDM_ENTITY_ASSOCIAION_LOGICAL,
919 false, true, 0xffff);
Pavithra Barithaya9947f9d2023-05-18 05:20:24 -0500920 EXPECT_NE(l1, nullptr);
921 auto l2 = pldm_entity_association_tree_add_entity(
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -0600922 tree, &entities[1], 0xffff, l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL, false,
923 false, 0xffff);
Pavithra Barithaya9947f9d2023-05-18 05:20:24 -0500924 EXPECT_NE(l2, nullptr);
925 auto l3 = pldm_entity_association_tree_add_entity(
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -0600926 tree, &entities[2], 0xffff, l2, PLDM_ENTITY_ASSOCIAION_PHYSICAL, false,
927 true, 0xffff);
Pavithra Barithaya9947f9d2023-05-18 05:20:24 -0500928 EXPECT_NE(l3, nullptr);
929 auto l4a = pldm_entity_association_tree_add_entity(
930 tree, &entities[3], 0, l3, PLDM_ENTITY_ASSOCIAION_PHYSICAL, false,
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -0600931 false, 0xffff);
Pavithra Barithaya9947f9d2023-05-18 05:20:24 -0500932 EXPECT_NE(l4a, nullptr);
933 auto l4b = pldm_entity_association_tree_add_entity(
934 tree, &entities[4], 1, l3, PLDM_ENTITY_ASSOCIAION_PHYSICAL, true, true,
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -0600935 0xffff);
Pavithra Barithaya9947f9d2023-05-18 05:20:24 -0500936 EXPECT_NE(l4b, nullptr);
937 auto l5a = pldm_entity_association_tree_add_entity(
938 tree, &entities[5], 0, l4a, PLDM_ENTITY_ASSOCIAION_PHYSICAL, false,
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -0600939 false, 0xffff);
Pavithra Barithaya9947f9d2023-05-18 05:20:24 -0500940 EXPECT_NE(l5a, nullptr);
941 auto l5b = pldm_entity_association_tree_add_entity(
942 tree, &entities[6], 0, l4b, PLDM_ENTITY_ASSOCIAION_PHYSICAL, false,
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -0600943 false, 0xffff);
Pavithra Barithaya9947f9d2023-05-18 05:20:24 -0500944 EXPECT_NE(l5b, nullptr);
945 pldm_entity entity{};
946 entity.entity_type = 135;
947 entity.entity_instance_num = 0;
948 entity.entity_container_id = 2;
949 auto result1 = pldm_entity_association_tree_find(tree, &entity);
950 EXPECT_EQ(result1, l5a);
951 EXPECT_EQ(entities[5].entity_container_id, 2);
952 auto l6a = pldm_entity_association_tree_add_entity(
953 tree, &entities[7], 0, result1, PLDM_ENTITY_ASSOCIAION_PHYSICAL, false,
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -0600954 false, 0xffff);
Pavithra Barithaya9947f9d2023-05-18 05:20:24 -0500955 EXPECT_NE(l6a, nullptr);
956 entity.entity_type = 135;
957 entity.entity_instance_num = 0;
958 entity.entity_container_id = 3;
959 auto result2 = pldm_entity_association_tree_find(tree, &entity);
960 EXPECT_NE(result2, l5b);
961 EXPECT_EQ(entities[6].entity_container_id, 3);
962 auto l7a = pldm_entity_association_tree_add_entity(
963 tree, &entities[8], 0, result2, PLDM_ENTITY_ASSOCIAION_PHYSICAL, false,
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -0600964 false, 0xffff);
Pavithra Barithaya9947f9d2023-05-18 05:20:24 -0500965 EXPECT_EQ(l7a, nullptr);
966 pldm_entity_association_tree_destroy(tree);
967}
968#endif
969
Andrew Jeffery9c766792022-08-10 23:12:49 +0930970TEST(EntityAssociationPDR, testSpecialTrees)
971{
972 pldm_entity entities[3]{};
973
974 entities[0].entity_type = 1;
975 entities[1].entity_type = 2;
976 entities[2].entity_type = 1;
977
978 // A
979 auto tree = pldm_entity_association_tree_init();
980 auto node = pldm_entity_association_tree_add(
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -0600981 tree, &entities[0], 0xffff, nullptr, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
Andrew Jeffery9c766792022-08-10 23:12:49 +0930982 EXPECT_NE(node, nullptr);
983 size_t num{};
984 pldm_entity* out = nullptr;
985 pldm_entity_association_tree_visit(tree, &out, &num);
986 EXPECT_EQ(num, 1u);
987 EXPECT_EQ(out[0].entity_type, 1u);
988 EXPECT_EQ(out[0].entity_instance_num, 1u);
989 EXPECT_EQ(out[0].entity_container_id, 0u);
990 free(out);
991 pldm_entity_association_tree_destroy(tree);
992
993 // A-A-A
994 tree = pldm_entity_association_tree_init();
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -0600995 node = pldm_entity_association_tree_add(tree, &entities[0], 0xffff, nullptr,
Andrew Jeffery9c766792022-08-10 23:12:49 +0930996 PLDM_ENTITY_ASSOCIAION_PHYSICAL);
997 EXPECT_NE(node, nullptr);
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -0600998 node = pldm_entity_association_tree_add(tree, &entities[1], 0xffff, nullptr,
Andrew Jeffery9c766792022-08-10 23:12:49 +0930999 PLDM_ENTITY_ASSOCIAION_PHYSICAL);
1000 EXPECT_NE(node, nullptr);
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06001001 node = pldm_entity_association_tree_add(tree, &entities[2], 0xffff, nullptr,
Andrew Jeffery9c766792022-08-10 23:12:49 +09301002 PLDM_ENTITY_ASSOCIAION_PHYSICAL);
1003 EXPECT_NE(node, nullptr);
1004 pldm_entity_association_tree_visit(tree, &out, &num);
1005 EXPECT_EQ(num, 3u);
1006 EXPECT_EQ(out[0].entity_type, 1u);
1007 EXPECT_EQ(out[0].entity_instance_num, 1u);
1008 EXPECT_EQ(out[0].entity_container_id, 0u);
1009 EXPECT_EQ(out[1].entity_type, 1u);
1010 EXPECT_EQ(out[1].entity_instance_num, 2u);
1011 EXPECT_EQ(out[1].entity_container_id, 0u);
1012 EXPECT_EQ(out[2].entity_type, 2u);
1013 EXPECT_EQ(out[2].entity_instance_num, 1u);
1014 EXPECT_EQ(out[2].entity_container_id, 0u);
1015 free(out);
1016 pldm_entity_association_tree_destroy(tree);
1017
1018 // A
1019 // |
1020 // A
1021 // |
1022 // A
1023 tree = pldm_entity_association_tree_init();
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06001024 node = pldm_entity_association_tree_add(tree, &entities[0], 0xffff, nullptr,
Andrew Jeffery9c766792022-08-10 23:12:49 +09301025 PLDM_ENTITY_ASSOCIAION_PHYSICAL);
1026 EXPECT_NE(node, nullptr);
1027 auto node1 = pldm_entity_association_tree_add(
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06001028 tree, &entities[1], 0xffff, node, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
Andrew Jeffery9c766792022-08-10 23:12:49 +09301029 EXPECT_NE(node1, nullptr);
1030 auto node2 = pldm_entity_association_tree_add(
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06001031 tree, &entities[2], 0xffff, node1, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
Andrew Jeffery9c766792022-08-10 23:12:49 +09301032 EXPECT_NE(node2, nullptr);
1033 pldm_entity_association_tree_visit(tree, &out, &num);
1034 EXPECT_EQ(num, 3u);
1035 EXPECT_EQ(out[0].entity_type, 1u);
1036 EXPECT_EQ(out[0].entity_instance_num, 1u);
1037 EXPECT_EQ(out[0].entity_container_id, 0u);
1038 EXPECT_EQ(out[1].entity_type, 2u);
1039 EXPECT_EQ(out[1].entity_instance_num, 1u);
1040 EXPECT_EQ(out[1].entity_container_id, 1u);
1041 EXPECT_EQ(out[2].entity_type, 1u);
1042 EXPECT_EQ(out[2].entity_instance_num, 1u);
1043 EXPECT_EQ(out[2].entity_container_id, 2u);
1044 free(out);
1045 pldm_entity_association_tree_destroy(tree);
1046
1047 // A-A
1048 // |
1049 // A-A
1050 tree = pldm_entity_association_tree_init();
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06001051 node = pldm_entity_association_tree_add(tree, &entities[0], 0xffff, nullptr,
Andrew Jeffery9c766792022-08-10 23:12:49 +09301052 PLDM_ENTITY_ASSOCIAION_PHYSICAL);
1053 EXPECT_NE(node, nullptr);
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06001054 node = pldm_entity_association_tree_add(tree, &entities[0], 0xffff, nullptr,
Andrew Jeffery9c766792022-08-10 23:12:49 +09301055 PLDM_ENTITY_ASSOCIAION_PHYSICAL);
1056 EXPECT_NE(node, nullptr);
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06001057 node1 = pldm_entity_association_tree_add(tree, &entities[1], 0xffff, node,
Andrew Jeffery9c766792022-08-10 23:12:49 +09301058 PLDM_ENTITY_ASSOCIAION_PHYSICAL);
1059 EXPECT_NE(node1, nullptr);
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06001060 node2 = pldm_entity_association_tree_add(tree, &entities[2], 0xffff, node,
Andrew Jeffery9c766792022-08-10 23:12:49 +09301061 PLDM_ENTITY_ASSOCIAION_PHYSICAL);
1062 EXPECT_NE(node2, nullptr);
1063 pldm_entity_association_tree_visit(tree, &out, &num);
1064 EXPECT_EQ(num, 4u);
1065 EXPECT_EQ(out[0].entity_type, 1u);
1066 EXPECT_EQ(out[0].entity_instance_num, 1u);
1067 EXPECT_EQ(out[0].entity_container_id, 0u);
1068 EXPECT_EQ(out[1].entity_type, 1u);
1069 EXPECT_EQ(out[1].entity_instance_num, 2u);
1070 EXPECT_EQ(out[1].entity_container_id, 0u);
1071 EXPECT_EQ(out[2].entity_type, 2u);
1072 EXPECT_EQ(out[2].entity_instance_num, 1u);
1073 EXPECT_EQ(out[2].entity_container_id, 1u);
1074 EXPECT_EQ(out[3].entity_type, 1u);
1075 EXPECT_EQ(out[3].entity_instance_num, 1u);
1076 EXPECT_EQ(out[3].entity_container_id, 1u);
1077 free(out);
1078 pldm_entity_association_tree_destroy(tree);
1079}
1080
1081TEST(EntityAssociationPDR, testPDR)
1082{
1083 // e = entity type, c = container id, i = instance num
1084
1085 // INPUT
1086 // 1(e=1)--1a(e=2)
1087 // |
1088 // 2(e=2)--3(e=2)--4(e=2)--5(e=3)
1089 // |
1090 // 6(e=4)--7(e=5)--8(e=5)--9(e=5)
1091 // | |
1092 // 11(e=6) 10(e=7)
1093
1094 // Expected OUTPUT
1095 // 1(e=1,c=0,i=1)
1096 // |
1097 // 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)
1098 // |
1099 // 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)
1100 // | |
1101 // 10(e=6,c=3,i=1) 11(e=7,c=4,i=1)
1102 pldm_entity entities[11]{};
1103
1104 entities[0].entity_type = 1;
1105 entities[1].entity_type = 2;
1106 entities[2].entity_type = 3;
1107 entities[3].entity_type = 2;
1108 entities[4].entity_type = 3;
1109 entities[5].entity_type = 4;
1110 entities[6].entity_type = 5;
1111 entities[7].entity_type = 5;
1112 entities[8].entity_type = 5;
1113 entities[9].entity_type = 6;
1114 entities[10].entity_type = 7;
1115
1116 auto tree = pldm_entity_association_tree_init();
1117
1118 auto l1 = pldm_entity_association_tree_add(
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06001119 tree, &entities[0], 0xffff, nullptr, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
Andrew Jeffery9c766792022-08-10 23:12:49 +09301120 EXPECT_NE(l1, nullptr);
1121 auto l1a = pldm_entity_association_tree_add(
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06001122 tree, &entities[1], 0xffff, nullptr, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
Andrew Jeffery9c766792022-08-10 23:12:49 +09301123 EXPECT_NE(l1a, nullptr);
1124
1125 auto l2a = pldm_entity_association_tree_add(
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06001126 tree, &entities[1], 0xffff, l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
Andrew Jeffery9c766792022-08-10 23:12:49 +09301127 EXPECT_NE(l2a, nullptr);
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06001128 auto l2b = pldm_entity_association_tree_add(tree, &entities[2], 0xffff, l1,
Andrew Jeffery9c766792022-08-10 23:12:49 +09301129 PLDM_ENTITY_ASSOCIAION_LOGICAL);
1130 EXPECT_NE(l2b, nullptr);
1131 auto l2c = pldm_entity_association_tree_add(
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06001132 tree, &entities[3], 0xffff, l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
Andrew Jeffery9c766792022-08-10 23:12:49 +09301133 EXPECT_NE(l2c, nullptr);
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06001134 auto l2d = pldm_entity_association_tree_add(tree, &entities[4], 0xffff, l1,
Andrew Jeffery9c766792022-08-10 23:12:49 +09301135 PLDM_ENTITY_ASSOCIAION_LOGICAL);
1136 EXPECT_NE(l2d, nullptr);
1137
1138 auto l3a = pldm_entity_association_tree_add(
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06001139 tree, &entities[5], 0xffff, l2a, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
Andrew Jeffery9c766792022-08-10 23:12:49 +09301140 EXPECT_NE(l3a, nullptr);
1141 auto l3b = pldm_entity_association_tree_add(
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06001142 tree, &entities[6], 0xffff, l2a, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
Andrew Jeffery9c766792022-08-10 23:12:49 +09301143 EXPECT_NE(l3b, nullptr);
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06001144 auto l3c = pldm_entity_association_tree_add(tree, &entities[7], 0xffff, l2a,
Andrew Jeffery9c766792022-08-10 23:12:49 +09301145 PLDM_ENTITY_ASSOCIAION_LOGICAL);
1146 EXPECT_NE(l3c, nullptr);
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06001147 auto l3d = pldm_entity_association_tree_add(tree, &entities[8], 0xffff, l2a,
Andrew Jeffery9c766792022-08-10 23:12:49 +09301148 PLDM_ENTITY_ASSOCIAION_LOGICAL);
1149 EXPECT_NE(l3d, nullptr);
1150
1151 auto l4a = pldm_entity_association_tree_add(
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06001152 tree, &entities[9], 0xffff, l3a, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
Andrew Jeffery9c766792022-08-10 23:12:49 +09301153 EXPECT_NE(l4a, nullptr);
1154 auto l4b = pldm_entity_association_tree_add(
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06001155 tree, &entities[10], 0xffff, l3b, PLDM_ENTITY_ASSOCIAION_LOGICAL);
Andrew Jeffery9c766792022-08-10 23:12:49 +09301156 EXPECT_NE(l4b, nullptr);
1157
1158 EXPECT_EQ(pldm_entity_get_num_children(l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL),
1159 2);
1160 EXPECT_EQ(pldm_entity_get_num_children(l1, PLDM_ENTITY_ASSOCIAION_LOGICAL),
1161 2);
1162 EXPECT_EQ(
1163 pldm_entity_get_num_children(l2a, PLDM_ENTITY_ASSOCIAION_PHYSICAL), 2);
1164 EXPECT_EQ(
1165 pldm_entity_get_num_children(l3b, PLDM_ENTITY_ASSOCIAION_PHYSICAL), 0);
1166 EXPECT_EQ(pldm_entity_get_num_children(l3b, PLDM_ENTITY_ASSOCIAION_LOGICAL),
1167 1);
1168
1169 auto repo = pldm_pdr_init();
Andrew Jeffery255f6542023-08-10 15:46:54 +09301170 int rc = pldm_entity_association_pdr_add_check(tree, repo, false, 1);
1171 ASSERT_EQ(rc, 0);
Andrew Jeffery9c766792022-08-10 23:12:49 +09301172
1173 EXPECT_EQ(pldm_pdr_get_record_count(repo), 6u);
1174
1175 uint32_t currRecHandle{};
1176 uint32_t nextRecHandle{};
1177 uint8_t* data = nullptr;
1178 uint32_t size{};
1179 uint32_t commonSize = sizeof(struct pldm_pdr_hdr) + sizeof(uint16_t) +
1180 sizeof(uint8_t) + sizeof(pldm_entity) +
1181 sizeof(uint8_t);
1182
1183 pldm_pdr_find_record(repo, currRecHandle, &data, &size, &nextRecHandle);
1184 EXPECT_EQ(size, commonSize + (pldm_entity_get_num_children(
1185 l1, PLDM_ENTITY_ASSOCIAION_LOGICAL) *
1186 sizeof(pldm_entity)));
1187 uint8_t* start = data;
1188 pldm_pdr_hdr* hdr = reinterpret_cast<pldm_pdr_hdr*>(start);
1189 EXPECT_EQ(le32toh(hdr->record_handle), 1u);
1190 EXPECT_EQ(hdr->type, PLDM_PDR_ENTITY_ASSOCIATION);
1191 EXPECT_EQ(le16toh(hdr->length), size - sizeof(struct pldm_pdr_hdr));
1192 start += sizeof(pldm_pdr_hdr);
1193 uint16_t* containerId = reinterpret_cast<uint16_t*>(start);
1194 EXPECT_EQ(le16toh(*containerId), 1u);
1195 start += sizeof(uint16_t);
1196 EXPECT_EQ(*start, PLDM_ENTITY_ASSOCIAION_LOGICAL);
1197 start += sizeof(uint8_t);
1198 pldm_entity* entity = reinterpret_cast<pldm_entity*>(start);
1199 EXPECT_EQ(le16toh(entity->entity_type), 1u);
1200 EXPECT_EQ(le16toh(entity->entity_instance_num), 1u);
1201 EXPECT_EQ(le16toh(entity->entity_container_id), 0u);
1202 start += sizeof(pldm_entity);
1203 EXPECT_EQ(*start,
1204 pldm_entity_get_num_children(l1, PLDM_ENTITY_ASSOCIAION_LOGICAL));
1205 start += sizeof(uint8_t);
1206 entity = reinterpret_cast<pldm_entity*>(start);
1207 EXPECT_EQ(le16toh(entity->entity_type), 3u);
1208 EXPECT_EQ(le16toh(entity->entity_instance_num), 1u);
1209 EXPECT_EQ(le16toh(entity->entity_container_id), 1u);
1210 start += sizeof(pldm_entity);
1211 entity = reinterpret_cast<pldm_entity*>(start);
1212 EXPECT_EQ(le16toh(entity->entity_type), 3u);
1213 EXPECT_EQ(le16toh(entity->entity_instance_num), 2u);
1214 EXPECT_EQ(le16toh(entity->entity_container_id), 1u);
Andrew Jeffery9c766792022-08-10 23:12:49 +09301215
1216 currRecHandle = nextRecHandle;
1217
1218 pldm_pdr_find_record(repo, currRecHandle, &data, &size, &nextRecHandle);
1219 EXPECT_EQ(size, commonSize + (pldm_entity_get_num_children(
1220 l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL) *
1221 sizeof(pldm_entity)));
1222 start = data;
1223 hdr = reinterpret_cast<pldm_pdr_hdr*>(start);
1224 EXPECT_EQ(le32toh(hdr->record_handle), 2u);
1225 EXPECT_EQ(hdr->type, PLDM_PDR_ENTITY_ASSOCIATION);
1226 EXPECT_EQ(le16toh(hdr->length), size - sizeof(struct pldm_pdr_hdr));
1227 start += sizeof(pldm_pdr_hdr);
1228 containerId = reinterpret_cast<uint16_t*>(start);
1229 EXPECT_EQ(le16toh(*containerId), 1u);
1230 start += sizeof(uint16_t);
1231 EXPECT_EQ(*start, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
1232 start += sizeof(uint8_t);
1233 entity = reinterpret_cast<pldm_entity*>(start);
1234 EXPECT_EQ(le16toh(entity->entity_type), 1u);
1235 EXPECT_EQ(le16toh(entity->entity_instance_num), 1u);
1236 EXPECT_EQ(le16toh(entity->entity_container_id), 0u);
1237 start += sizeof(pldm_entity);
1238 EXPECT_EQ(*start, pldm_entity_get_num_children(
1239 l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL));
1240 start += sizeof(uint8_t);
1241 entity = reinterpret_cast<pldm_entity*>(start);
1242 EXPECT_EQ(le16toh(entity->entity_type), 2u);
1243 EXPECT_EQ(le16toh(entity->entity_instance_num), 1u);
1244 EXPECT_EQ(le16toh(entity->entity_container_id), 1u);
1245 start += sizeof(pldm_entity);
1246 entity = reinterpret_cast<pldm_entity*>(start);
1247 EXPECT_EQ(le16toh(entity->entity_type), 2u);
1248 EXPECT_EQ(le16toh(entity->entity_instance_num), 2u);
1249 EXPECT_EQ(le16toh(entity->entity_container_id), 1u);
Andrew Jeffery9c766792022-08-10 23:12:49 +09301250
1251 currRecHandle = nextRecHandle;
1252
1253 pldm_pdr_find_record(repo, currRecHandle, &data, &size, &nextRecHandle);
1254 EXPECT_EQ(size, commonSize + (pldm_entity_get_num_children(
1255 l2a, PLDM_ENTITY_ASSOCIAION_LOGICAL) *
1256 sizeof(pldm_entity)));
1257 start = data;
1258 hdr = reinterpret_cast<pldm_pdr_hdr*>(start);
1259 EXPECT_EQ(le32toh(hdr->record_handle), 3u);
1260 EXPECT_EQ(hdr->type, PLDM_PDR_ENTITY_ASSOCIATION);
1261 EXPECT_EQ(le16toh(hdr->length), size - sizeof(struct pldm_pdr_hdr));
1262 start += sizeof(pldm_pdr_hdr);
1263 containerId = reinterpret_cast<uint16_t*>(start);
1264 EXPECT_EQ(le16toh(*containerId), 2u);
1265 start += sizeof(uint16_t);
1266 EXPECT_EQ(*start, PLDM_ENTITY_ASSOCIAION_LOGICAL);
1267 start += sizeof(uint8_t);
1268 entity = reinterpret_cast<pldm_entity*>(start);
1269 EXPECT_EQ(le16toh(entity->entity_type), 2u);
1270 EXPECT_EQ(le16toh(entity->entity_instance_num), 1u);
1271 EXPECT_EQ(le16toh(entity->entity_container_id), 1u);
1272 start += sizeof(pldm_entity);
1273 EXPECT_EQ(*start, pldm_entity_get_num_children(
1274 l2a, PLDM_ENTITY_ASSOCIAION_LOGICAL));
1275 start += sizeof(uint8_t);
1276 entity = reinterpret_cast<pldm_entity*>(start);
1277 EXPECT_EQ(le16toh(entity->entity_type), 5);
1278 EXPECT_EQ(le16toh(entity->entity_instance_num), 2u);
1279 EXPECT_EQ(le16toh(entity->entity_container_id), 2u);
1280 start += sizeof(pldm_entity);
1281 entity = reinterpret_cast<pldm_entity*>(start);
1282 EXPECT_EQ(le16toh(entity->entity_type), 5u);
1283 EXPECT_EQ(le16toh(entity->entity_instance_num), 3u);
1284 EXPECT_EQ(le16toh(entity->entity_container_id), 2u);
Andrew Jeffery9c766792022-08-10 23:12:49 +09301285
1286 currRecHandle = nextRecHandle;
1287
1288 pldm_pdr_find_record(repo, currRecHandle, &data, &size, &nextRecHandle);
1289 EXPECT_EQ(size, commonSize + (pldm_entity_get_num_children(
1290 l2a, PLDM_ENTITY_ASSOCIAION_PHYSICAL) *
1291 sizeof(pldm_entity)));
1292 start = data;
1293 hdr = reinterpret_cast<pldm_pdr_hdr*>(start);
1294 EXPECT_EQ(le32toh(hdr->record_handle), 4u);
1295 EXPECT_EQ(hdr->type, PLDM_PDR_ENTITY_ASSOCIATION);
1296 EXPECT_EQ(le16toh(hdr->length), size - sizeof(struct pldm_pdr_hdr));
1297 start += sizeof(pldm_pdr_hdr);
1298 containerId = reinterpret_cast<uint16_t*>(start);
1299 EXPECT_EQ(le16toh(*containerId), 2u);
1300 start += sizeof(uint16_t);
1301 EXPECT_EQ(*start, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
1302 start += sizeof(uint8_t);
1303 entity = reinterpret_cast<pldm_entity*>(start);
1304 EXPECT_EQ(le16toh(entity->entity_type), 2u);
1305 EXPECT_EQ(le16toh(entity->entity_instance_num), 1u);
1306 EXPECT_EQ(le16toh(entity->entity_container_id), 1u);
1307 start += sizeof(pldm_entity);
1308 EXPECT_EQ(*start, pldm_entity_get_num_children(
1309 l2a, PLDM_ENTITY_ASSOCIAION_PHYSICAL));
1310 start += sizeof(uint8_t);
1311 entity = reinterpret_cast<pldm_entity*>(start);
1312 EXPECT_EQ(le16toh(entity->entity_type), 4u);
1313 EXPECT_EQ(le16toh(entity->entity_instance_num), 1u);
1314 EXPECT_EQ(le16toh(entity->entity_container_id), 2u);
1315 start += sizeof(pldm_entity);
1316 entity = reinterpret_cast<pldm_entity*>(start);
1317 EXPECT_EQ(le16toh(entity->entity_type), 5u);
1318 EXPECT_EQ(le16toh(entity->entity_instance_num), 1u);
1319 EXPECT_EQ(le16toh(entity->entity_container_id), 2u);
Andrew Jeffery9c766792022-08-10 23:12:49 +09301320
1321 currRecHandle = nextRecHandle;
1322
1323 pldm_pdr_find_record(repo, currRecHandle, &data, &size, &nextRecHandle);
1324 EXPECT_EQ(size, commonSize + (pldm_entity_get_num_children(
1325 l3a, PLDM_ENTITY_ASSOCIAION_PHYSICAL) *
1326 sizeof(pldm_entity)));
1327 start = data;
1328 hdr = reinterpret_cast<pldm_pdr_hdr*>(start);
1329 EXPECT_EQ(le32toh(hdr->record_handle), 5u);
1330 EXPECT_EQ(hdr->type, PLDM_PDR_ENTITY_ASSOCIATION);
1331 EXPECT_EQ(le16toh(hdr->length), size - sizeof(struct pldm_pdr_hdr));
1332 start += sizeof(pldm_pdr_hdr);
1333 containerId = reinterpret_cast<uint16_t*>(start);
1334 EXPECT_EQ(le16toh(*containerId), 3u);
1335 start += sizeof(uint16_t);
1336 EXPECT_EQ(*start, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
1337 start += sizeof(uint8_t);
1338 entity = reinterpret_cast<pldm_entity*>(start);
1339 EXPECT_EQ(le16toh(entity->entity_type), 4u);
1340 EXPECT_EQ(le16toh(entity->entity_instance_num), 1u);
1341 EXPECT_EQ(le16toh(entity->entity_container_id), 2u);
1342 start += sizeof(pldm_entity);
1343 EXPECT_EQ(*start, pldm_entity_get_num_children(
1344 l3a, PLDM_ENTITY_ASSOCIAION_PHYSICAL));
1345 start += sizeof(uint8_t);
1346 entity = reinterpret_cast<pldm_entity*>(start);
1347 EXPECT_EQ(le16toh(entity->entity_type), 6u);
1348 EXPECT_EQ(le16toh(entity->entity_instance_num), 1u);
1349 EXPECT_EQ(le16toh(entity->entity_container_id), 3u);
Andrew Jeffery9c766792022-08-10 23:12:49 +09301350
1351 currRecHandle = nextRecHandle;
1352
1353 pldm_pdr_find_record(repo, currRecHandle, &data, &size, &nextRecHandle);
1354 EXPECT_EQ(size, commonSize + (pldm_entity_get_num_children(
1355 l3b, PLDM_ENTITY_ASSOCIAION_LOGICAL) *
1356 sizeof(pldm_entity)));
1357 start = data;
1358 hdr = reinterpret_cast<pldm_pdr_hdr*>(start);
1359 EXPECT_EQ(le32toh(hdr->record_handle), 6u);
1360 EXPECT_EQ(hdr->type, PLDM_PDR_ENTITY_ASSOCIATION);
1361 EXPECT_EQ(le16toh(hdr->length), size - sizeof(struct pldm_pdr_hdr));
1362 start += sizeof(pldm_pdr_hdr);
1363 containerId = reinterpret_cast<uint16_t*>(start);
1364 EXPECT_EQ(le16toh(*containerId), 4u);
1365 start += sizeof(uint16_t);
1366 EXPECT_EQ(*start, PLDM_ENTITY_ASSOCIAION_LOGICAL);
1367 start += sizeof(uint8_t);
1368 entity = reinterpret_cast<pldm_entity*>(start);
1369 EXPECT_EQ(le16toh(entity->entity_type), 5u);
1370 EXPECT_EQ(le16toh(entity->entity_instance_num), 1u);
1371 EXPECT_EQ(le16toh(entity->entity_container_id), 2u);
1372 start += sizeof(pldm_entity);
1373 EXPECT_EQ(*start, pldm_entity_get_num_children(
1374 l3b, PLDM_ENTITY_ASSOCIAION_LOGICAL));
1375 start += sizeof(uint8_t);
1376 entity = reinterpret_cast<pldm_entity*>(start);
1377 EXPECT_EQ(le16toh(entity->entity_type), 7u);
1378 EXPECT_EQ(le16toh(entity->entity_instance_num), 1u);
1379 EXPECT_EQ(le16toh(entity->entity_container_id), 4u);
1380
1381 EXPECT_EQ(nextRecHandle, 0u);
1382
1383 pldm_pdr_destroy(repo);
1384 pldm_entity_association_tree_destroy(tree);
1385}
1386
1387TEST(EntityAssociationPDR, testFind)
1388{
1389 // 1
1390 // |
1391 // 2--3--4
1392 // |
1393 // 5--6--7
1394 // | |
1395 // 8 9
1396
1397 pldm_entity entities[9]{};
1398
1399 entities[0].entity_type = 1;
1400 entities[1].entity_type = 2;
1401 entities[2].entity_type = 2;
1402 entities[3].entity_type = 3;
1403 entities[4].entity_type = 4;
1404 entities[5].entity_type = 5;
1405 entities[6].entity_type = 5;
1406 entities[7].entity_type = 6;
1407 entities[8].entity_type = 7;
1408
1409 auto tree = pldm_entity_association_tree_init();
1410
1411 auto l1 = pldm_entity_association_tree_add(
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06001412 tree, &entities[0], 0xffff, nullptr, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
Andrew Jeffery9c766792022-08-10 23:12:49 +09301413 EXPECT_NE(l1, nullptr);
1414 auto l2a = pldm_entity_association_tree_add(
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06001415 tree, &entities[1], 0xffff, l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
Andrew Jeffery9c766792022-08-10 23:12:49 +09301416 EXPECT_NE(l2a, nullptr);
1417 auto l2b = pldm_entity_association_tree_add(
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06001418 tree, &entities[2], 0xffff, l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
Andrew Jeffery9c766792022-08-10 23:12:49 +09301419 EXPECT_NE(l2b, nullptr);
1420 auto l2c = pldm_entity_association_tree_add(
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06001421 tree, &entities[3], 0xffff, l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
Andrew Jeffery9c766792022-08-10 23:12:49 +09301422 EXPECT_NE(l2c, nullptr);
1423 auto l3a = pldm_entity_association_tree_add(
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06001424 tree, &entities[4], 0xffff, l2a, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
Andrew Jeffery9c766792022-08-10 23:12:49 +09301425 EXPECT_NE(l3a, nullptr);
1426 auto l3b = pldm_entity_association_tree_add(
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06001427 tree, &entities[5], 0xffff, l2a, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
Andrew Jeffery9c766792022-08-10 23:12:49 +09301428 EXPECT_NE(l3b, nullptr);
1429 auto l3c = pldm_entity_association_tree_add(
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06001430 tree, &entities[6], 0xffff, l2a, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
Andrew Jeffery9c766792022-08-10 23:12:49 +09301431 EXPECT_NE(l3c, nullptr);
1432 auto l4a = pldm_entity_association_tree_add(
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06001433 tree, &entities[7], 0xffff, l3a, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
Andrew Jeffery9c766792022-08-10 23:12:49 +09301434 EXPECT_NE(l4a, nullptr);
1435 auto l4b = pldm_entity_association_tree_add(
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06001436 tree, &entities[8], 0xffff, l3b, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
Andrew Jeffery9c766792022-08-10 23:12:49 +09301437 EXPECT_NE(l4b, nullptr);
1438
1439 pldm_entity entity{};
1440
1441 entity.entity_type = 1;
1442 entity.entity_instance_num = 1;
1443 auto result = pldm_entity_association_tree_find(tree, &entity);
1444 EXPECT_EQ(result, l1);
1445 EXPECT_EQ(entity.entity_container_id, 0);
1446
1447 entity.entity_type = 2;
1448 entity.entity_instance_num = 1;
1449 result = pldm_entity_association_tree_find(tree, &entity);
1450 EXPECT_EQ(result, l2a);
1451 EXPECT_EQ(entity.entity_container_id, 1);
1452 entity.entity_type = 2;
1453 entity.entity_instance_num = 2;
1454 result = pldm_entity_association_tree_find(tree, &entity);
1455 EXPECT_EQ(result, l2b);
1456 EXPECT_EQ(entity.entity_container_id, 1);
1457 entity.entity_type = 3;
1458 entity.entity_instance_num = 1;
1459 result = pldm_entity_association_tree_find(tree, &entity);
1460 EXPECT_EQ(result, l2c);
1461 EXPECT_EQ(entity.entity_container_id, 1);
1462
1463 entity.entity_type = 7;
1464 entity.entity_instance_num = 1;
1465 result = pldm_entity_association_tree_find(tree, &entity);
1466 EXPECT_EQ(result, l4b);
1467 EXPECT_EQ(entity.entity_container_id, 4);
1468
1469 pldm_entity_association_tree_destroy(tree);
1470}
1471
1472TEST(EntityAssociationPDR, testCopyTree)
1473{
1474 pldm_entity entities[4]{};
1475 entities[0].entity_type = 1;
1476 entities[1].entity_type = 2;
1477 entities[2].entity_type = 2;
1478 entities[3].entity_type = 3;
1479
1480 auto orgTree = pldm_entity_association_tree_init();
1481 auto newTree = pldm_entity_association_tree_init();
1482 auto l1 =
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06001483 pldm_entity_association_tree_add(orgTree, &entities[0], 0xffff, nullptr,
Andrew Jeffery9c766792022-08-10 23:12:49 +09301484 PLDM_ENTITY_ASSOCIAION_PHYSICAL);
1485 EXPECT_NE(l1, nullptr);
1486 auto l2a = pldm_entity_association_tree_add(
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06001487 orgTree, &entities[1], 0xffff, l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
Andrew Jeffery9c766792022-08-10 23:12:49 +09301488 EXPECT_NE(l2a, nullptr);
1489 auto l2b = pldm_entity_association_tree_add(
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06001490 orgTree, &entities[2], 0xffff, l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
Andrew Jeffery9c766792022-08-10 23:12:49 +09301491 EXPECT_NE(l2b, nullptr);
1492 auto l2c = pldm_entity_association_tree_add(
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06001493 orgTree, &entities[3], 0xffff, l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
Andrew Jeffery9c766792022-08-10 23:12:49 +09301494 EXPECT_NE(l2c, nullptr);
1495 size_t orgNum{};
1496 pldm_entity* orgOut = nullptr;
1497 pldm_entity_association_tree_visit(orgTree, &orgOut, &orgNum);
1498 EXPECT_EQ(orgNum, 4u);
1499
1500 pldm_entity_association_tree_copy_root(orgTree, newTree);
1501 size_t newNum{};
1502 pldm_entity* newOut = nullptr;
1503 pldm_entity_association_tree_visit(newTree, &newOut, &newNum);
1504 EXPECT_EQ(newNum, orgNum);
1505 EXPECT_EQ(newOut[0].entity_type, 1u);
1506 EXPECT_EQ(newOut[0].entity_instance_num, 1u);
1507 EXPECT_EQ(newOut[0].entity_container_id, 0u);
1508 free(orgOut);
1509 free(newOut);
1510 pldm_entity_association_tree_destroy(orgTree);
1511 pldm_entity_association_tree_destroy(newTree);
1512}
1513
1514TEST(EntityAssociationPDR, testExtract)
1515{
1516 std::vector<uint8_t> pdr{};
1517 pdr.resize(sizeof(pldm_pdr_hdr) + sizeof(pldm_pdr_entity_association) +
1518 sizeof(pldm_entity) * 4);
1519 pldm_pdr_hdr* hdr = reinterpret_cast<pldm_pdr_hdr*>(pdr.data());
1520 hdr->type = PLDM_PDR_ENTITY_ASSOCIATION;
1521 hdr->length =
1522 htole16(sizeof(pldm_pdr_entity_association) + sizeof(pldm_entity) * 4);
1523
1524 pldm_pdr_entity_association* e =
1525 reinterpret_cast<pldm_pdr_entity_association*>(pdr.data() +
1526 sizeof(pldm_pdr_hdr));
1527 e->container_id = htole16(1);
1528 e->num_children = 5;
1529 e->container.entity_type = htole16(1);
1530 e->container.entity_instance_num = htole16(1);
1531 e->container.entity_container_id = htole16(0);
1532
1533 pldm_entity* entity = e->children;
1534 entity->entity_type = htole16(2);
1535 entity->entity_instance_num = htole16(1);
1536 entity->entity_container_id = htole16(1);
1537 ++entity;
1538 entity->entity_type = htole16(3);
1539 entity->entity_instance_num = htole16(1);
1540 entity->entity_container_id = htole16(1);
1541 ++entity;
1542 entity->entity_type = htole16(4);
1543 entity->entity_instance_num = htole16(1);
1544 entity->entity_container_id = htole16(1);
1545 ++entity;
1546 entity->entity_type = htole16(5);
1547 entity->entity_instance_num = htole16(1);
1548 entity->entity_container_id = htole16(1);
1549 ++entity;
1550 entity->entity_type = htole16(6);
1551 entity->entity_instance_num = htole16(1);
1552 entity->entity_container_id = htole16(1);
1553
1554 size_t num{};
1555 pldm_entity* out = nullptr;
1556 pldm_entity_association_pdr_extract(pdr.data(), pdr.size(), &num, &out);
1557 EXPECT_EQ(num, (unsigned)e->num_children + 1);
1558 EXPECT_EQ(out[0].entity_type, 1u);
1559 EXPECT_EQ(out[0].entity_instance_num, 1u);
1560 EXPECT_EQ(out[0].entity_container_id, 0u);
1561 EXPECT_EQ(out[1].entity_type, 2u);
1562 EXPECT_EQ(out[1].entity_instance_num, 1u);
1563 EXPECT_EQ(out[1].entity_container_id, 1u);
1564 EXPECT_EQ(out[2].entity_type, 3u);
1565 EXPECT_EQ(out[2].entity_instance_num, 1u);
1566 EXPECT_EQ(out[2].entity_container_id, 1u);
1567 EXPECT_EQ(out[3].entity_type, 4u);
1568 EXPECT_EQ(out[3].entity_instance_num, 1u);
1569 EXPECT_EQ(out[3].entity_container_id, 1u);
1570 EXPECT_EQ(out[4].entity_type, 5u);
1571 EXPECT_EQ(out[4].entity_instance_num, 1u);
1572 EXPECT_EQ(out[4].entity_container_id, 1u);
1573 EXPECT_EQ(out[5].entity_type, 6u);
1574 EXPECT_EQ(out[5].entity_instance_num, 1u);
1575 EXPECT_EQ(out[5].entity_container_id, 1u);
1576
1577 free(out);
1578}
1579
1580TEST(EntityAssociationPDR, testGetChildren)
1581{
1582 pldm_entity entities[4]{};
1583 entities[0].entity_type = 1;
1584 entities[1].entity_type = 2;
1585 entities[2].entity_type = 2;
1586 entities[3].entity_type = 3;
1587
1588 auto tree = pldm_entity_association_tree_init();
1589 auto l1 = pldm_entity_association_tree_add(
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06001590 tree, &entities[0], 0xffff, nullptr, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
Andrew Jeffery9c766792022-08-10 23:12:49 +09301591 EXPECT_NE(l1, nullptr);
1592 auto l2a = pldm_entity_association_tree_add(
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06001593 tree, &entities[1], 0xffff, l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
Andrew Jeffery9c766792022-08-10 23:12:49 +09301594 EXPECT_NE(l2a, nullptr);
1595 auto l2b = pldm_entity_association_tree_add(
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06001596 tree, &entities[2], 0xffff, l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
Andrew Jeffery9c766792022-08-10 23:12:49 +09301597 EXPECT_NE(l2b, nullptr);
1598 auto l2c = pldm_entity_association_tree_add(
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06001599 tree, &entities[3], 0xffff, l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
Andrew Jeffery9c766792022-08-10 23:12:49 +09301600 EXPECT_NE(l2c, nullptr);
1601
1602 pldm_entity et1;
1603 et1.entity_type = 2;
1604 et1.entity_instance_num = 1;
1605 EXPECT_EQ(true, pldm_is_current_parent_child(l1, &et1));
1606
1607 pldm_entity et2;
1608 et2.entity_type = 2;
1609 et2.entity_instance_num = 2;
1610 EXPECT_EQ(true, pldm_is_current_parent_child(l1, &et2));
1611
1612 pldm_entity et3;
1613 et3.entity_type = 2;
1614 et3.entity_instance_num = 3;
1615 EXPECT_EQ(false, pldm_is_current_parent_child(l1, &et3));
1616
1617 pldm_entity_association_tree_destroy(tree);
1618}
1619
1620TEST(EntityAssociationPDR, testEntityInstanceNumber)
1621{
1622 pldm_entity entities[9]{};
1623
1624 entities[0].entity_type = 1;
1625 entities[1].entity_type = 2;
1626 entities[2].entity_type = 2;
1627 entities[3].entity_type = 2;
1628 entities[4].entity_type = 2;
1629 entities[5].entity_type = 2;
1630 entities[6].entity_type = 2;
1631 entities[7].entity_type = 3;
1632 entities[8].entity_type = 3;
1633
1634 auto tree = pldm_entity_association_tree_init();
1635 auto repo = pldm_pdr_init();
1636
1637 uint16_t terminusHdl{};
1638 uint16_t entityType{};
1639 uint16_t entityInstanceNum{};
1640 uint16_t containerId{};
1641
1642 auto node = pldm_entity_association_tree_add(
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06001643 tree, &entities[0], 0xffff, nullptr, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
Andrew Jeffery9c766792022-08-10 23:12:49 +09301644 EXPECT_NE(node, nullptr);
1645
1646 auto l1 = pldm_entity_association_tree_add(tree, &entities[1], 63, node,
1647 PLDM_ENTITY_ASSOCIAION_PHYSICAL);
Andrew Jeffery14d29842023-07-17 15:29:32 +09301648 uint32_t first = 1;
1649 EXPECT_EQ(pldm_pdr_add_fru_record_set_check(
1650 repo, 1, 1, entities[1].entity_type,
1651 entities[1].entity_instance_num,
1652 entities[1].entity_container_id, &first),
1653 0);
Andrew Jeffery9c766792022-08-10 23:12:49 +09301654 EXPECT_NE(l1, nullptr);
1655 EXPECT_EQ(entities[1].entity_instance_num, 63);
1656 EXPECT_EQ(first, pldm_pdr_get_record_handle(
1657 repo, pldm_pdr_fru_record_set_find_by_rsi(
1658 repo, 1, &terminusHdl, &entityType,
1659 &entityInstanceNum, &containerId)));
1660 EXPECT_EQ(entityType, 2);
1661 EXPECT_EQ(entityInstanceNum, 63);
1662
1663 auto l2 = pldm_entity_association_tree_add(tree, &entities[2], 37, node,
1664 PLDM_ENTITY_ASSOCIAION_PHYSICAL);
Andrew Jeffery14d29842023-07-17 15:29:32 +09301665 uint32_t second = 2;
1666 EXPECT_EQ(pldm_pdr_add_fru_record_set_check(
1667 repo, 1, 2, entities[2].entity_type,
1668 entities[2].entity_instance_num,
1669 entities[2].entity_container_id, &second),
1670 0);
Andrew Jeffery9c766792022-08-10 23:12:49 +09301671 EXPECT_NE(l2, nullptr);
1672 EXPECT_EQ(entities[2].entity_instance_num, 37);
1673 EXPECT_EQ(second, pldm_pdr_get_record_handle(
1674 repo, pldm_pdr_fru_record_set_find_by_rsi(
1675 repo, 2, &terminusHdl, &entityType,
1676 &entityInstanceNum, &containerId)));
1677 EXPECT_EQ(entityType, 2);
1678 EXPECT_EQ(entityInstanceNum, 37);
1679
1680 auto l3 = pldm_entity_association_tree_add(tree, &entities[3], 44, node,
1681 PLDM_ENTITY_ASSOCIAION_PHYSICAL);
Andrew Jeffery14d29842023-07-17 15:29:32 +09301682 uint32_t third = 3;
1683 EXPECT_EQ(pldm_pdr_add_fru_record_set_check(
1684 repo, 1, 3, entities[3].entity_type,
1685 entities[3].entity_instance_num,
1686 entities[3].entity_container_id, &third),
1687 0);
Andrew Jeffery9c766792022-08-10 23:12:49 +09301688 EXPECT_NE(l3, nullptr);
1689 EXPECT_EQ(entities[3].entity_instance_num, 44);
1690 EXPECT_EQ(third, pldm_pdr_get_record_handle(
1691 repo, pldm_pdr_fru_record_set_find_by_rsi(
1692 repo, 3, &terminusHdl, &entityType,
1693 &entityInstanceNum, &containerId)));
1694 EXPECT_EQ(entityType, 2);
1695 EXPECT_EQ(entityInstanceNum, 44);
1696
1697 auto l4 = pldm_entity_association_tree_add(tree, &entities[4], 89, node,
1698 PLDM_ENTITY_ASSOCIAION_PHYSICAL);
Andrew Jeffery14d29842023-07-17 15:29:32 +09301699 uint32_t fourth = 4;
1700 EXPECT_EQ(pldm_pdr_add_fru_record_set_check(
1701 repo, 1, 4, entities[4].entity_type,
1702 entities[4].entity_instance_num,
1703 entities[4].entity_container_id, &fourth),
1704 0);
Andrew Jeffery9c766792022-08-10 23:12:49 +09301705 EXPECT_NE(l4, nullptr);
1706 EXPECT_EQ(entities[4].entity_instance_num, 89);
1707 EXPECT_EQ(fourth, pldm_pdr_get_record_handle(
1708 repo, pldm_pdr_fru_record_set_find_by_rsi(
1709 repo, 4, &terminusHdl, &entityType,
1710 &entityInstanceNum, &containerId)));
1711 EXPECT_EQ(entityType, 2);
1712 EXPECT_EQ(entityInstanceNum, 89);
1713
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06001714 auto l5 = pldm_entity_association_tree_add(tree, &entities[5], 0xffff, node,
Andrew Jeffery9c766792022-08-10 23:12:49 +09301715 PLDM_ENTITY_ASSOCIAION_PHYSICAL);
Andrew Jeffery14d29842023-07-17 15:29:32 +09301716 uint32_t fifth = 5;
1717 EXPECT_EQ(pldm_pdr_add_fru_record_set_check(
1718 repo, 1, 5, entities[5].entity_type,
1719 entities[5].entity_instance_num,
1720 entities[5].entity_container_id, &fifth),
1721 0);
Andrew Jeffery9c766792022-08-10 23:12:49 +09301722 EXPECT_NE(l5, nullptr);
1723 EXPECT_EQ(entities[5].entity_instance_num, 90);
1724 EXPECT_EQ(fifth, pldm_pdr_get_record_handle(
1725 repo, pldm_pdr_fru_record_set_find_by_rsi(
1726 repo, 5, &terminusHdl, &entityType,
1727 &entityInstanceNum, &containerId)));
1728 EXPECT_EQ(entityType, 2);
1729 EXPECT_EQ(entityInstanceNum, 90);
1730
1731 auto l6 = pldm_entity_association_tree_add(tree, &entities[6], 90, node,
1732 PLDM_ENTITY_ASSOCIAION_PHYSICAL);
1733 EXPECT_EQ(l6, nullptr);
1734
1735 auto l7 = pldm_entity_association_tree_add(tree, &entities[7], 100, l1,
1736 PLDM_ENTITY_ASSOCIAION_PHYSICAL);
Andrew Jeffery14d29842023-07-17 15:29:32 +09301737 uint32_t seventh = 7;
1738 EXPECT_EQ(pldm_pdr_add_fru_record_set_check(
1739 repo, 1, 7, entities[7].entity_type,
1740 entities[7].entity_instance_num,
1741 entities[7].entity_container_id, &seventh),
1742 0);
Andrew Jeffery9c766792022-08-10 23:12:49 +09301743 EXPECT_NE(l7, nullptr);
1744 EXPECT_EQ(entities[7].entity_instance_num, 100);
1745 EXPECT_EQ(seventh, pldm_pdr_get_record_handle(
1746 repo, pldm_pdr_fru_record_set_find_by_rsi(
1747 repo, 7, &terminusHdl, &entityType,
1748 &entityInstanceNum, &containerId)));
1749 EXPECT_EQ(entityType, 3);
1750 EXPECT_EQ(entityInstanceNum, 100);
1751
1752 auto l8 = pldm_entity_association_tree_add(tree, &entities[8], 100, l2,
1753 PLDM_ENTITY_ASSOCIAION_PHYSICAL);
Andrew Jeffery14d29842023-07-17 15:29:32 +09301754 uint32_t eighth = 8;
1755 EXPECT_EQ(pldm_pdr_add_fru_record_set_check(
1756 repo, 1, 8, entities[8].entity_type,
1757 entities[8].entity_instance_num,
1758 entities[8].entity_container_id, &eighth),
1759 0);
Andrew Jeffery9c766792022-08-10 23:12:49 +09301760 EXPECT_NE(l8, nullptr);
1761 EXPECT_EQ(entities[8].entity_instance_num, 100);
1762 EXPECT_EQ(eighth, pldm_pdr_get_record_handle(
1763 repo, pldm_pdr_fru_record_set_find_by_rsi(
1764 repo, 8, &terminusHdl, &entityType,
1765 &entityInstanceNum, &containerId)));
1766 EXPECT_EQ(entityType, 3);
1767 EXPECT_EQ(entityInstanceNum, 100);
1768
1769 pldm_pdr_destroy(repo);
1770 pldm_entity_association_tree_destroy(tree);
1771}
Pavithra Barithaya5dc02572023-05-19 09:24:36 -05001772
Andrew Jeffery14a5fe82023-06-26 15:31:37 +09301773#ifdef LIBPLDM_API_TESTING
Pavithra Barithaya8cf70452023-06-22 04:36:19 -05001774TEST(EntityAssociationPDR, testFindChildContainerID)
Pavithra Barithaya5dc02572023-05-19 09:24:36 -05001775{
1776 pldm_entity entities[3]{};
1777 entities[0].entity_type = 1;
1778 entities[1].entity_type = 2;
1779 entities[2].entity_type = 3;
1780 entities[1].entity_container_id = 2;
1781 entities[1].entity_instance_num = 1;
1782
1783 auto tree = pldm_entity_association_tree_init();
1784 auto l1 = pldm_entity_association_tree_add_entity(
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06001785 tree, &entities[0], 0xffff, nullptr, PLDM_ENTITY_ASSOCIAION_LOGICAL,
1786 false, true, 0xffff);
Pavithra Barithaya5dc02572023-05-19 09:24:36 -05001787
1788 EXPECT_NE(l1, nullptr);
1789 auto l2 = pldm_entity_association_tree_add_entity(
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06001790 tree, &entities[1], 0xffff, l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL, false,
1791 false, 0xffff);
Pavithra Barithaya5dc02572023-05-19 09:24:36 -05001792 EXPECT_NE(l2, nullptr);
1793 auto l3 = pldm_entity_association_tree_add_entity(
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06001794 tree, &entities[2], 0xffff, l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL, false,
1795 true, 0xffff);
Pavithra Barithaya5dc02572023-05-19 09:24:36 -05001796 EXPECT_NE(l3, nullptr);
1797
1798 EXPECT_EQ(pldm_entity_get_num_children(l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL),
1799 2);
1800
1801 auto repo = pldm_pdr_init();
Andrew Jeffery255f6542023-08-10 15:46:54 +09301802 int rc = pldm_entity_association_pdr_add_check(tree, repo, false, 1);
1803 ASSERT_EQ(rc, 0);
Pavithra Barithaya5dc02572023-05-19 09:24:36 -05001804
1805 EXPECT_EQ(pldm_pdr_get_record_count(repo), 1u);
1806
1807 uint16_t container_id{};
Pavithra Barithaya8cf70452023-06-22 04:36:19 -05001808 pldm_pdr_find_child_container_id_index_range_exclude(
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06001809 repo, 1, 1, 0, 0x01000000, 0x01ffffff, &container_id);
Pavithra Barithaya5dc02572023-05-19 09:24:36 -05001810 EXPECT_EQ(container_id, 2);
1811
1812 uint16_t container_id1{};
Pavithra Barithaya8cf70452023-06-22 04:36:19 -05001813 pldm_pdr_find_child_container_id_index_range_exclude(
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06001814 repo, 1, 1, 0, 0x00000001, 0x00ffffff, &container_id1);
Pavithra Barithaya5dc02572023-05-19 09:24:36 -05001815 EXPECT_EQ(container_id1, 0);
1816
1817 pldm_pdr_destroy(repo);
1818 pldm_entity_association_tree_destroy(tree);
1819}
Andrew Jeffery14a5fe82023-06-26 15:31:37 +09301820#endif
Pavithra Barithaya39eb3222023-11-17 03:30:27 -06001821
1822TEST(EntityAssociationPDR, testNodeAddCheck)
1823{
1824 // pldm_entity entities[4]{};
1825 pldm_entity* entities = (pldm_entity*)malloc(sizeof(pldm_entity) * 4);
1826 entities[0].entity_type = 1;
1827 entities[1].entity_type = 2;
1828 entities[2].entity_type = 2;
1829 entities[3].entity_type = 3;
1830
1831 auto tree = pldm_entity_association_tree_init();
1832
1833 auto l1 = pldm_entity_association_tree_add(
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06001834 tree, &entities[0], 0xffff, nullptr, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
Pavithra Barithaya39eb3222023-11-17 03:30:27 -06001835 EXPECT_NE(l1, nullptr);
1836 auto l2a = pldm_entity_association_tree_add(
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06001837 tree, &entities[1], 0xffff, l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
Pavithra Barithaya39eb3222023-11-17 03:30:27 -06001838 EXPECT_NE(l2a, nullptr);
1839 auto l2b = pldm_entity_association_tree_add(
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06001840 tree, &entities[2], 0xffff, l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
Pavithra Barithaya39eb3222023-11-17 03:30:27 -06001841 EXPECT_NE(l2b, nullptr);
1842 auto l2c = pldm_entity_association_tree_add(
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06001843 tree, &entities[3], 0xffff, l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
Pavithra Barithaya39eb3222023-11-17 03:30:27 -06001844 EXPECT_NE(l2c, nullptr);
1845
1846 auto repo = pldm_pdr_init();
1847
1848 EXPECT_EQ(pldm_entity_association_pdr_add_from_node_with_record_handle(
1849 l1, repo, &entities, 4, false, 1, 0),
1850 0);
1851 EXPECT_EQ(pldm_entity_association_pdr_add_from_node_with_record_handle(
1852 l1, repo, &entities, 4, false, 1, 2),
1853 0);
1854 EXPECT_EQ(pldm_entity_association_pdr_add_from_node_with_record_handle(
1855 l1, repo, &entities, 4, false, 1, 23),
1856 0);
1857 EXPECT_EQ(pldm_entity_association_pdr_add_from_node_with_record_handle(
1858 l1, repo, &entities, 4, false, 1, 34),
1859 0);
1860
1861 EXPECT_EQ(pldm_pdr_get_record_count(repo), 4u);
1862
1863 uint8_t* outData = nullptr;
1864 uint32_t size{};
1865 uint32_t nextRecHdl{};
1866 auto hdl = pldm_pdr_find_record(repo, 0, &outData, &size, &nextRecHdl);
1867 EXPECT_NE(hdl, nullptr);
1868
1869 outData = nullptr;
1870 auto hdl1 = pldm_pdr_find_record(repo, 2, &outData, &size, &nextRecHdl);
1871 EXPECT_NE(hdl1, nullptr);
1872 pldm_pdr_hdr* hdr = reinterpret_cast<pldm_pdr_hdr*>(outData);
1873 EXPECT_EQ(hdr->record_handle, 2);
1874
1875 outData = nullptr;
1876 auto hdl2 = pldm_pdr_find_record(repo, 23, &outData, &size, &nextRecHdl);
1877 EXPECT_NE(hdl2, nullptr);
1878 pldm_pdr_hdr* hdr1 = reinterpret_cast<pldm_pdr_hdr*>(outData);
1879 EXPECT_EQ(hdr1->record_handle, 23);
1880
1881 outData = nullptr;
1882 auto hdl3 = pldm_pdr_find_record(repo, 3, &outData, &size, &nextRecHdl);
1883 EXPECT_EQ(hdl3, nullptr);
1884
1885 free(entities);
1886 pldm_pdr_destroy(repo);
1887 pldm_entity_association_tree_destroy(tree);
1888}
Varsha Kaverappa37552b92024-02-12 05:06:06 -06001889
Andrew Jeffery1111a972024-06-03 13:39:18 +09301890#ifdef LIBPLDM_API_TESTING
Varsha Kaverappa37552b92024-02-12 05:06:06 -06001891TEST(EntityAssociationPDR, testAddContainedEntityRemotePDR)
1892{
1893 // pldm_entity entities[5]{};
1894 pldm_entity* entities = (pldm_entity*)malloc(sizeof(pldm_entity) * 5);
1895 entities[0].entity_type = 1;
1896 entities[1].entity_type = 2;
1897 entities[2].entity_type = 3;
1898 entities[3].entity_type = 4;
1899 entities[4].entity_type = 5;
1900
1901 auto tree = pldm_entity_association_tree_init();
1902 auto l1 = pldm_entity_association_tree_add(
1903 tree, &entities[0], 0xffff, nullptr, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
1904 EXPECT_NE(l1, nullptr);
1905 auto l2a = pldm_entity_association_tree_add(
1906 tree, &entities[1], 0xffff, l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
1907 EXPECT_NE(l2a, nullptr);
1908 auto l2b = pldm_entity_association_tree_add(
1909 tree, &entities[2], 0xffff, l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
1910 EXPECT_NE(l2b, nullptr);
1911 auto l2c = pldm_entity_association_tree_add(
1912 tree, &entities[3], 0xffff, l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
1913 EXPECT_NE(l2c, nullptr);
1914 auto l3a = pldm_entity_association_tree_add(
1915 tree, &entities[4], 0xffff, l2a, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
1916 EXPECT_NE(l3a, nullptr);
1917
1918 auto repo = pldm_pdr_init();
1919
1920 EXPECT_EQ(pldm_entity_association_pdr_add_from_node_with_record_handle(
1921 l1, repo, &entities, 5, false, 1, 0),
1922 0);
1923 EXPECT_EQ(pldm_entity_association_pdr_add_from_node_with_record_handle(
1924 l1, repo, &entities, 5, false, 1, 2),
1925 0);
1926 EXPECT_EQ(pldm_entity_association_pdr_add_from_node_with_record_handle(
1927 l1, repo, &entities, 5, false, 1, 23),
1928 0);
1929 EXPECT_EQ(pldm_entity_association_pdr_add_from_node_with_record_handle(
1930 l1, repo, &entities, 5, false, 1, 34),
1931 0);
1932 EXPECT_EQ(pldm_entity_association_pdr_add_from_node_with_record_handle(
1933 l2a, repo, &entities, 5, false, 1, 3),
1934 0);
1935
1936 pldm_entity entity1[1];
1937 entity1[0].entity_type = 2;
1938
1939 EXPECT_EQ(pldm_entity_association_pdr_add_contained_entity_to_remote_pdr(
1940 repo, &entity1[0], 2),
1941 0);
1942
1943 free(entities);
1944 pldm_pdr_destroy(repo);
1945 pldm_entity_association_tree_destroy(tree);
1946}
Andrew Jeffery1111a972024-06-03 13:39:18 +09301947#endif
Varsha Kaverappa37552b92024-02-12 05:06:06 -06001948
Andrew Jeffery1111a972024-06-03 13:39:18 +09301949#ifdef LIBPLDM_API_TESTING
Varsha Kaverappa37552b92024-02-12 05:06:06 -06001950TEST(EntityAssociationPDR, testAddContainedEntityNew)
1951{
1952 // pldm_entity entities[5]{};
1953 pldm_entity* entities = (pldm_entity*)malloc(sizeof(pldm_entity) * 5);
1954 entities[0].entity_type = 1;
1955 entities[1].entity_type = 2;
1956 entities[2].entity_type = 3;
1957 entities[3].entity_type = 4;
1958 entities[4].entity_type = 5;
1959
1960 auto tree = pldm_entity_association_tree_init();
1961 auto l1 = pldm_entity_association_tree_add(
1962 tree, &entities[0], 0xffff, nullptr, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
1963 EXPECT_NE(l1, nullptr);
1964 auto l2a = pldm_entity_association_tree_add(
1965 tree, &entities[1], 0xffff, l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
1966 EXPECT_NE(l2a, nullptr);
1967 auto l2b = pldm_entity_association_tree_add(
1968 tree, &entities[2], 0xffff, l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
1969 EXPECT_NE(l2b, nullptr);
1970 auto l2c = pldm_entity_association_tree_add(
1971 tree, &entities[3], 0xffff, l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
1972 EXPECT_NE(l2c, nullptr);
1973 auto l3a = pldm_entity_association_tree_add(
1974 tree, &entities[4], 0xffff, l2a, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
1975 EXPECT_NE(l3a, nullptr);
1976
1977 auto repo = pldm_pdr_init();
1978
1979 EXPECT_EQ(pldm_entity_association_pdr_add_from_node_with_record_handle(
1980 l1, repo, &entities, 5, false, 1, 0),
1981 0);
1982 EXPECT_EQ(pldm_entity_association_pdr_add_from_node_with_record_handle(
1983 l1, repo, &entities, 5, false, 1, 2),
1984 0);
1985 EXPECT_EQ(pldm_entity_association_pdr_add_from_node_with_record_handle(
1986 l1, repo, &entities, 5, false, 1, 23),
1987 0);
1988 EXPECT_EQ(pldm_entity_association_pdr_add_from_node_with_record_handle(
1989 l1, repo, &entities, 5, false, 1, 34),
1990 0);
1991 EXPECT_EQ(pldm_entity_association_pdr_add_from_node_with_record_handle(
1992 l2a, repo, &entities, 5, false, 1, 3),
1993 0);
1994
1995 uint32_t updated_record_handle = 0;
1996
1997 pldm_entity entity2[1]{};
1998 entity2[0].entity_type = 4;
1999
2000 pldm_entity entity3[1]{};
2001 entity3[0].entity_type = 4;
2002
2003 EXPECT_EQ(pldm_entity_association_pdr_create_new(
2004 repo, 34, &entity2[0], &entity3[0], &updated_record_handle),
2005 0);
2006
2007 EXPECT_EQ(updated_record_handle, 35);
2008
2009 free(entities);
2010 pldm_pdr_destroy(repo);
2011 pldm_entity_association_tree_destroy(tree);
2012}
Andrew Jeffery1111a972024-06-03 13:39:18 +09302013#endif