blob: e6a43f0a45de755d21386ce706f34020f6cd2e23 [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;
Andrew Jefferye7f55112024-06-20 16:16:01 +0930484 EXPECT_EQ(pldm_pdr_add_fru_record_set(repo, 1, 10, 1, 0, 100, &handle), 0);
Andrew Jeffery9c766792022-08-10 23:12:49 +0930485 EXPECT_EQ(handle, 1u);
486 EXPECT_EQ(pldm_pdr_get_record_count(repo), 1u);
487 EXPECT_EQ(pldm_pdr_get_repo_size(repo),
488 sizeof(pldm_pdr_hdr) + sizeof(pldm_pdr_fru_record_set));
489 uint32_t size{};
490 uint32_t nextRecHdl{};
491 uint8_t* outData = nullptr;
492 auto hdl = pldm_pdr_find_record(repo, 0, &outData, &size, &nextRecHdl);
493 EXPECT_NE(hdl, nullptr);
494 EXPECT_EQ(size, sizeof(pldm_pdr_hdr) + sizeof(pldm_pdr_fru_record_set));
495 EXPECT_EQ(nextRecHdl, 0u);
496 pldm_pdr_hdr* hdr = reinterpret_cast<pldm_pdr_hdr*>(outData);
497 EXPECT_EQ(hdr->version, 1u);
498 EXPECT_EQ(hdr->type, PLDM_PDR_FRU_RECORD_SET);
499 EXPECT_EQ(hdr->length, htole16(sizeof(pldm_pdr_fru_record_set)));
500 EXPECT_EQ(hdr->record_handle, htole32(1));
501 pldm_pdr_fru_record_set* fru = reinterpret_cast<pldm_pdr_fru_record_set*>(
502 outData + sizeof(pldm_pdr_hdr));
503 EXPECT_EQ(fru->terminus_handle, htole16(1));
504 EXPECT_EQ(fru->fru_rsi, htole16(10));
505 EXPECT_EQ(fru->entity_type, htole16(1));
506 EXPECT_EQ(fru->entity_instance_num, htole16(0));
507 EXPECT_EQ(fru->container_id, htole16(100));
508 outData = nullptr;
509
Andrew Jeffery14d29842023-07-17 15:29:32 +0930510 handle = 0;
Andrew Jefferye7f55112024-06-20 16:16:01 +0930511 EXPECT_EQ(pldm_pdr_add_fru_record_set(repo, 2, 11, 2, 1, 101, &handle), 0);
Andrew Jeffery9c766792022-08-10 23:12:49 +0930512 EXPECT_EQ(handle, 2u);
513 EXPECT_EQ(pldm_pdr_get_record_count(repo), 2u);
514 EXPECT_EQ(pldm_pdr_get_repo_size(repo),
515 2 * (sizeof(pldm_pdr_hdr) + sizeof(pldm_pdr_fru_record_set)));
516 hdl = pldm_pdr_find_record(repo, 2, &outData, &size, &nextRecHdl);
517 EXPECT_NE(hdl, nullptr);
518 EXPECT_EQ(size, sizeof(pldm_pdr_hdr) + sizeof(pldm_pdr_fru_record_set));
519 EXPECT_EQ(nextRecHdl, 0u);
520 hdr = reinterpret_cast<pldm_pdr_hdr*>(outData);
521 EXPECT_EQ(hdr->version, 1u);
522 EXPECT_EQ(hdr->type, PLDM_PDR_FRU_RECORD_SET);
523 EXPECT_EQ(hdr->length, htole16(sizeof(pldm_pdr_fru_record_set)));
524 EXPECT_EQ(hdr->record_handle, htole32(2));
525 fru = reinterpret_cast<pldm_pdr_fru_record_set*>(outData +
526 sizeof(pldm_pdr_hdr));
527 EXPECT_EQ(fru->terminus_handle, htole16(2));
528 EXPECT_EQ(fru->fru_rsi, htole16(11));
529 EXPECT_EQ(fru->entity_type, htole16(2));
530 EXPECT_EQ(fru->entity_instance_num, htole16(1));
531 EXPECT_EQ(fru->container_id, htole16(101));
532 outData = nullptr;
533
534 hdl = pldm_pdr_find_record(repo, 1, &outData, &size, &nextRecHdl);
535 EXPECT_NE(hdl, nullptr);
536 EXPECT_EQ(size, sizeof(pldm_pdr_hdr) + sizeof(pldm_pdr_fru_record_set));
537 EXPECT_EQ(nextRecHdl, 2u);
538 hdr = reinterpret_cast<pldm_pdr_hdr*>(outData);
539 EXPECT_EQ(hdr->version, 1u);
540 EXPECT_EQ(hdr->type, PLDM_PDR_FRU_RECORD_SET);
541 EXPECT_EQ(hdr->length, htole16(sizeof(pldm_pdr_fru_record_set)));
542 EXPECT_EQ(hdr->record_handle, htole32(1));
543 fru = reinterpret_cast<pldm_pdr_fru_record_set*>(outData +
544 sizeof(pldm_pdr_hdr));
545 EXPECT_EQ(fru->terminus_handle, htole16(1));
546 EXPECT_EQ(fru->fru_rsi, htole16(10));
547 EXPECT_EQ(fru->entity_type, htole16(1));
548 EXPECT_EQ(fru->entity_instance_num, htole16(0));
549 EXPECT_EQ(fru->container_id, htole16(100));
550 outData = nullptr;
551
552 pldm_pdr_destroy(repo);
553}
554
555TEST(PDRUpdate, tesFindtFruRecordSet)
556{
557 auto repo = pldm_pdr_init();
558
559 uint16_t terminusHdl{};
560 uint16_t entityType{};
561 uint16_t entityInstanceNum{};
562 uint16_t containerId{};
Andrew Jeffery14d29842023-07-17 15:29:32 +0930563 uint32_t first = 1;
Andrew Jefferye7f55112024-06-20 16:16:01 +0930564 EXPECT_EQ(pldm_pdr_add_fru_record_set(repo, 1, 1, 1, 0, 100, &first), 0);
Andrew Jeffery14d29842023-07-17 15:29:32 +0930565 uint32_t second = 2;
Andrew Jefferye7f55112024-06-20 16:16:01 +0930566 EXPECT_EQ(pldm_pdr_add_fru_record_set(repo, 1, 2, 1, 1, 100, &second), 0);
Andrew Jeffery14d29842023-07-17 15:29:32 +0930567 uint32_t third = 3;
Andrew Jefferye7f55112024-06-20 16:16:01 +0930568 EXPECT_EQ(pldm_pdr_add_fru_record_set(repo, 1, 3, 1, 2, 100, &third), 0);
Andrew Jeffery9c766792022-08-10 23:12:49 +0930569 EXPECT_EQ(first, pldm_pdr_get_record_handle(
570 repo, pldm_pdr_fru_record_set_find_by_rsi(
571 repo, 1, &terminusHdl, &entityType,
572 &entityInstanceNum, &containerId)));
573 EXPECT_EQ(second, pldm_pdr_get_record_handle(
574 repo, pldm_pdr_fru_record_set_find_by_rsi(
575 repo, 2, &terminusHdl, &entityType,
576 &entityInstanceNum, &containerId)));
577 EXPECT_EQ(third, pldm_pdr_get_record_handle(
578 repo, pldm_pdr_fru_record_set_find_by_rsi(
579 repo, 3, &terminusHdl, &entityType,
580 &entityInstanceNum, &containerId)));
581 EXPECT_EQ(terminusHdl, 1u);
582 EXPECT_EQ(entityType, 1u);
583 EXPECT_EQ(entityInstanceNum, 2u);
584 EXPECT_EQ(containerId, 100u);
585 EXPECT_EQ(nullptr, pldm_pdr_fru_record_set_find_by_rsi(
586 repo, 4, &terminusHdl, &entityType,
587 &entityInstanceNum, &containerId));
588
589 pldm_pdr_destroy(repo);
590}
591
Pavithra Barithaya4d694342023-05-19 08:04:41 -0500592#ifdef LIBPLDM_API_TESTING
593TEST(PDRUpdate, testFindLastInRange)
594{
595 auto repo = pldm_pdr_init();
596
597 std::array<uint8_t, 10> data{};
Andrew Jefferyc79a5df2023-07-17 15:09:21 +0930598 uint32_t handle1 = 0;
Andrew Jefferyfae36412024-06-20 06:35:51 +0000599 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), false, 1, &handle1),
600 0);
Andrew Jefferyc79a5df2023-07-17 15:09:21 +0930601 uint32_t handle2 = 23;
Andrew Jefferyfae36412024-06-20 06:35:51 +0000602 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), false, 1, &handle2),
603 0);
Andrew Jefferyc79a5df2023-07-17 15:09:21 +0930604 uint32_t handle3 = 77;
Andrew Jefferyfae36412024-06-20 06:35:51 +0000605 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), false, 1, &handle3),
606 0);
Andrew Jefferyc79a5df2023-07-17 15:09:21 +0930607 uint32_t handle4 = 16777325;
Andrew Jefferyfae36412024-06-20 06:35:51 +0000608 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), true, 1, &handle4),
609 0);
Andrew Jefferyc79a5df2023-07-17 15:09:21 +0930610 uint32_t handle5 = 16777344;
Andrew Jefferyfae36412024-06-20 06:35:51 +0000611 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), true, 1, &handle5),
612 0);
Pavithra Barithaya4d694342023-05-19 08:04:41 -0500613
614 auto rec1 = pldm_pdr_find_last_in_range(repo, 0, 100);
615 auto rec2 = pldm_pdr_find_last_in_range(repo, 16777300, 33554431);
616 EXPECT_NE(rec1, nullptr);
617 EXPECT_NE(rec2, nullptr);
618 EXPECT_NE(handle1, pldm_pdr_get_record_handle(repo, rec1));
619 EXPECT_NE(handle2, pldm_pdr_get_record_handle(repo, rec1));
620 EXPECT_EQ(handle3, pldm_pdr_get_record_handle(repo, rec1));
621 EXPECT_NE(handle4, pldm_pdr_get_record_handle(repo, rec2));
622 EXPECT_EQ(handle5, pldm_pdr_get_record_handle(repo, rec2));
623
624 pldm_pdr_destroy(repo);
625}
626#endif
627
Pavithra Barithaya274732f2024-07-05 16:03:01 +0530628#ifdef LIBPLDM_API_TESTING
629TEST(PDRAccess, testGetTerminusHandle)
630{
631
632 auto repo = pldm_pdr_init();
633
634 pldm_pdr_hdr hdr;
635
636 hdr.type = 1;
637 uint16_t firstTerminusHandle = 1;
Andrew Jefferyf309c482024-09-07 18:45:41 +0300638 EXPECT_EQ(pldm_pdr_add(repo, reinterpret_cast<const uint8_t*>(&hdr),
639 sizeof(hdr), false, firstTerminusHandle, NULL),
Pavithra Barithaya274732f2024-07-05 16:03:01 +0530640 0);
641
642 hdr.type = 2;
643 uint16_t secondTerminusHandle = 2;
Andrew Jefferyf309c482024-09-07 18:45:41 +0300644 EXPECT_EQ(pldm_pdr_add(repo, reinterpret_cast<const uint8_t*>(&hdr),
645 sizeof(hdr), true, secondTerminusHandle, NULL),
Pavithra Barithaya274732f2024-07-05 16:03:01 +0530646 0);
647
648 hdr.type = 3;
649 uint16_t thirdTerminusHandle = 3;
Andrew Jefferyf309c482024-09-07 18:45:41 +0300650 EXPECT_EQ(pldm_pdr_add(repo, reinterpret_cast<const uint8_t*>(&hdr),
651 sizeof(hdr), true, thirdTerminusHandle, NULL),
Pavithra Barithaya274732f2024-07-05 16:03:01 +0530652 0);
653
654 uint8_t* outData = nullptr;
655 uint32_t size{};
656
657 auto firstRec =
658 pldm_pdr_find_record_by_type(repo, 1, nullptr, &outData, &size);
659 EXPECT_EQ(pldm_pdr_get_terminus_handle(repo, firstRec),
660 firstTerminusHandle);
661 outData = nullptr;
662
663 auto secondRec =
664 pldm_pdr_find_record_by_type(repo, 2, nullptr, &outData, &size);
665 EXPECT_EQ(pldm_pdr_get_terminus_handle(repo, secondRec),
666 secondTerminusHandle);
667 outData = nullptr;
668
669 auto thirdRec =
670 pldm_pdr_find_record_by_type(repo, 3, nullptr, &outData, &size);
671 EXPECT_EQ(pldm_pdr_get_terminus_handle(repo, thirdRec),
672 thirdTerminusHandle);
673 outData = nullptr;
674
675 pldm_pdr_destroy(repo);
676}
677#endif
678
Andrew Jeffery9c766792022-08-10 23:12:49 +0930679TEST(EntityAssociationPDR, testInit)
680{
681 auto tree = pldm_entity_association_tree_init();
682 EXPECT_NE(tree, nullptr);
683 pldm_entity_association_tree_destroy(tree);
684}
685
686TEST(EntityAssociationPDR, testBuild)
687{
688 // 1
689 // |
690 // 2--3--4
691 // |
692 // 5--6--7
693 // | |
694 // 9 8
695
696 pldm_entity entities[9]{};
697
698 entities[0].entity_type = 1;
699 entities[1].entity_type = 2;
700 entities[2].entity_type = 2;
701 entities[3].entity_type = 3;
702 entities[4].entity_type = 4;
703 entities[5].entity_type = 5;
704 entities[6].entity_type = 5;
705 entities[7].entity_type = 6;
706 entities[8].entity_type = 7;
707
708 auto tree = pldm_entity_association_tree_init();
709
710 auto l1 = pldm_entity_association_tree_add(
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -0600711 tree, &entities[0], 0xffff, nullptr, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
Andrew Jeffery9c766792022-08-10 23:12:49 +0930712 EXPECT_NE(l1, nullptr);
713 auto l2a = pldm_entity_association_tree_add(
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -0600714 tree, &entities[1], 0xffff, l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
Andrew Jeffery9c766792022-08-10 23:12:49 +0930715 EXPECT_NE(l2a, nullptr);
716 auto l2b = pldm_entity_association_tree_add(
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -0600717 tree, &entities[2], 0xffff, l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
Andrew Jeffery9c766792022-08-10 23:12:49 +0930718 EXPECT_NE(l2b, nullptr);
719 auto l2c = pldm_entity_association_tree_add(
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -0600720 tree, &entities[3], 0xffff, l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
Andrew Jeffery9c766792022-08-10 23:12:49 +0930721 EXPECT_NE(l2c, nullptr);
722 auto l3a = pldm_entity_association_tree_add(
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -0600723 tree, &entities[4], 0xffff, l2a, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
Andrew Jeffery9c766792022-08-10 23:12:49 +0930724 EXPECT_NE(l3a, nullptr);
725 auto l3b = pldm_entity_association_tree_add(
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -0600726 tree, &entities[5], 0xffff, l2a, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
Andrew Jeffery9c766792022-08-10 23:12:49 +0930727 EXPECT_NE(l3b, nullptr);
728 auto l3c = pldm_entity_association_tree_add(
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -0600729 tree, &entities[6], 0xffff, l2a, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
Andrew Jeffery9c766792022-08-10 23:12:49 +0930730 EXPECT_NE(l3b, nullptr);
731 auto l4a = pldm_entity_association_tree_add(
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -0600732 tree, &entities[7], 0xffff, l3a, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
Andrew Jeffery9c766792022-08-10 23:12:49 +0930733 EXPECT_NE(l4a, nullptr);
734 auto l4b = pldm_entity_association_tree_add(
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -0600735 tree, &entities[8], 0xffff, l3b, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
Andrew Jeffery9c766792022-08-10 23:12:49 +0930736 EXPECT_NE(l4b, nullptr);
737
738 EXPECT_EQ(pldm_entity_is_node_parent(l1), true);
739 EXPECT_EQ(pldm_entity_is_node_parent(l2a), true);
740 EXPECT_EQ(pldm_entity_is_node_parent(l3a), true);
741 EXPECT_EQ(pldm_entity_is_node_parent(l3b), true);
742
743 EXPECT_EQ(pldm_entity_is_node_parent(l2b), false);
744 EXPECT_EQ(pldm_entity_is_node_parent(l2c), false);
745 EXPECT_EQ(pldm_entity_is_node_parent(l3c), false);
746 EXPECT_EQ(pldm_entity_is_node_parent(l4a), false);
747 EXPECT_EQ(pldm_entity_is_node_parent(l4b), false);
748
749 EXPECT_EQ(pldm_entity_is_exist_parent(l1), false);
750
751 pldm_entity nodeL1 = pldm_entity_extract(l1);
752 pldm_entity parentL2a = pldm_entity_get_parent(l2a);
753 pldm_entity parentL2b = pldm_entity_get_parent(l2b);
754 pldm_entity parentL2c = pldm_entity_get_parent(l2c);
755 EXPECT_EQ(pldm_entity_is_exist_parent(l2a), true);
756 EXPECT_EQ(pldm_entity_is_exist_parent(l2b), true);
757 EXPECT_EQ(pldm_entity_is_exist_parent(l2c), true);
758 EXPECT_EQ(parentL2a.entity_type, nodeL1.entity_type);
759 EXPECT_EQ(parentL2a.entity_instance_num, nodeL1.entity_instance_num);
760 EXPECT_EQ(parentL2a.entity_container_id, nodeL1.entity_container_id);
761 EXPECT_EQ(parentL2b.entity_type, nodeL1.entity_type);
762 EXPECT_EQ(parentL2b.entity_instance_num, nodeL1.entity_instance_num);
763 EXPECT_EQ(parentL2b.entity_container_id, nodeL1.entity_container_id);
764 EXPECT_EQ(parentL2c.entity_type, nodeL1.entity_type);
765 EXPECT_EQ(parentL2c.entity_instance_num, nodeL1.entity_instance_num);
766 EXPECT_EQ(parentL2c.entity_container_id, nodeL1.entity_container_id);
767
768 pldm_entity nodeL2a = pldm_entity_extract(l2a);
769 pldm_entity parentL3a = pldm_entity_get_parent(l3a);
770 pldm_entity parentL3b = pldm_entity_get_parent(l3b);
771 pldm_entity parentL3c = pldm_entity_get_parent(l3c);
772 EXPECT_EQ(pldm_entity_is_exist_parent(l3a), true);
773 EXPECT_EQ(pldm_entity_is_exist_parent(l3b), true);
774 EXPECT_EQ(pldm_entity_is_exist_parent(l3c), true);
775 EXPECT_EQ(parentL3a.entity_type, nodeL2a.entity_type);
776 EXPECT_EQ(parentL3a.entity_instance_num, nodeL2a.entity_instance_num);
777 EXPECT_EQ(parentL3a.entity_container_id, nodeL2a.entity_container_id);
778 EXPECT_EQ(parentL3b.entity_type, nodeL2a.entity_type);
779 EXPECT_EQ(parentL3b.entity_instance_num, nodeL2a.entity_instance_num);
780 EXPECT_EQ(parentL3b.entity_container_id, nodeL2a.entity_container_id);
781 EXPECT_EQ(parentL3c.entity_type, nodeL2a.entity_type);
782 EXPECT_EQ(parentL3c.entity_instance_num, nodeL2a.entity_instance_num);
783 EXPECT_EQ(parentL3c.entity_container_id, nodeL2a.entity_container_id);
784
785 pldm_entity nodeL3a = pldm_entity_extract(l3a);
786 pldm_entity parentL4a = pldm_entity_get_parent(l4a);
787 EXPECT_EQ(pldm_entity_is_exist_parent(l4a), true);
788 EXPECT_EQ(parentL4a.entity_type, nodeL3a.entity_type);
789 EXPECT_EQ(parentL4a.entity_instance_num, nodeL3a.entity_instance_num);
790 EXPECT_EQ(parentL4a.entity_container_id, nodeL3a.entity_container_id);
791
792 pldm_entity nodeL3b = pldm_entity_extract(l3b);
793 pldm_entity parentL4b = pldm_entity_get_parent(l4b);
794 EXPECT_EQ(pldm_entity_is_exist_parent(l4b), true);
795 EXPECT_EQ(parentL4b.entity_type, nodeL3b.entity_type);
796 EXPECT_EQ(parentL4b.entity_instance_num, nodeL3b.entity_instance_num);
797 EXPECT_EQ(parentL4b.entity_container_id, nodeL3b.entity_container_id);
798
799 size_t num{};
800 pldm_entity* out = nullptr;
801 pldm_entity_association_tree_visit(tree, &out, &num);
802 EXPECT_EQ(num, 9u);
803
804 EXPECT_EQ(out[0].entity_type, 1u);
805 EXPECT_EQ(out[0].entity_instance_num, 1u);
806 EXPECT_EQ(out[0].entity_container_id, 0u);
807
808 EXPECT_EQ(out[1].entity_type, 2u);
809 EXPECT_EQ(out[1].entity_instance_num, 1u);
810 EXPECT_EQ(out[1].entity_container_id, 1u);
811 EXPECT_EQ(out[2].entity_type, 2u);
812 EXPECT_EQ(out[2].entity_instance_num, 2u);
813 EXPECT_EQ(out[2].entity_container_id, 1u);
814 EXPECT_EQ(out[3].entity_type, 3u);
815 EXPECT_EQ(out[3].entity_instance_num, 1u);
816 EXPECT_EQ(out[3].entity_container_id, 1u);
817
818 EXPECT_EQ(out[4].entity_type, 4u);
819 EXPECT_EQ(out[4].entity_instance_num, 1u);
820 EXPECT_EQ(out[4].entity_container_id, 2u);
821 EXPECT_EQ(out[5].entity_type, 5u);
822 EXPECT_EQ(out[5].entity_instance_num, 1u);
823 EXPECT_EQ(out[5].entity_container_id, 2u);
824 EXPECT_EQ(out[6].entity_type, 5u);
825 EXPECT_EQ(out[6].entity_instance_num, 2u);
826 EXPECT_EQ(out[6].entity_container_id, 2u);
827
828 EXPECT_EQ(out[7].entity_type, 7u);
829 EXPECT_EQ(out[7].entity_instance_num, 1u);
830 EXPECT_EQ(out[7].entity_container_id, 4u);
831 EXPECT_EQ(out[8].entity_type, 6u);
832 EXPECT_EQ(out[8].entity_instance_num, 1u);
833 EXPECT_EQ(out[8].entity_container_id, 3u);
834
835 free(out);
836
837 pldm_entity p1 = pldm_entity_extract(l1);
838 EXPECT_EQ(p1.entity_type, 1u);
839 EXPECT_EQ(p1.entity_instance_num, 1u);
840 EXPECT_EQ(p1.entity_container_id, 0u);
841
842 pldm_entity p2a = pldm_entity_extract(l2a);
843 EXPECT_EQ(p2a.entity_type, 2u);
844 EXPECT_EQ(p2a.entity_instance_num, 1u);
845 EXPECT_EQ(p2a.entity_container_id, 1u);
846 pldm_entity p2b = pldm_entity_extract(l2b);
847 EXPECT_EQ(p2b.entity_type, 2u);
848 EXPECT_EQ(p2b.entity_instance_num, 2u);
849 EXPECT_EQ(p2b.entity_container_id, 1u);
850 pldm_entity p2c = pldm_entity_extract(l2c);
851 EXPECT_EQ(p2c.entity_type, 3u);
852 EXPECT_EQ(p2c.entity_instance_num, 1u);
853 EXPECT_EQ(p2c.entity_container_id, 1u);
854
855 pldm_entity p3a = pldm_entity_extract(l3a);
856 EXPECT_EQ(p3a.entity_type, 4u);
857 EXPECT_EQ(p3a.entity_instance_num, 1u);
858 EXPECT_EQ(p3a.entity_container_id, 2u);
859 pldm_entity p3b = pldm_entity_extract(l3b);
860 EXPECT_EQ(p3b.entity_type, 5u);
861 EXPECT_EQ(p3b.entity_instance_num, 1u);
862 EXPECT_EQ(p3b.entity_container_id, 2u);
863 pldm_entity p3c = pldm_entity_extract(l3c);
864 EXPECT_EQ(p3c.entity_type, 5u);
865 EXPECT_EQ(p3c.entity_instance_num, 2u);
866 EXPECT_EQ(p3c.entity_container_id, 2u);
867
868 pldm_entity p4a = pldm_entity_extract(l4a);
869 EXPECT_EQ(p4a.entity_type, 6u);
870 EXPECT_EQ(p4a.entity_instance_num, 1u);
871 EXPECT_EQ(p4a.entity_container_id, 3u);
872 pldm_entity p4b = pldm_entity_extract(l4b);
873 EXPECT_EQ(p4b.entity_type, 7u);
874 EXPECT_EQ(p4b.entity_instance_num, 1u);
875 EXPECT_EQ(p4b.entity_container_id, 4u);
876
877 pldm_entity_association_tree_destroy(tree);
878}
879
Pavithra Barithaya9947f9d2023-05-18 05:20:24 -0500880#if LIBPLDM_API_TESTING
881TEST(EntityAssociationPDR, findAndAddRemotePDR)
882{
883 // Tree - 1
884 //
885 // 11521(1,0)
886 // |
887 // 45 (1,1)
888 // |
889 // 64 (1,2)
890 // |
891 // ------------------
892 // | |
893 // 67(0,3) 67(1,3)
894 // | |
895 // 135(0,4) 135(0,5)
896 // | |
897 // 32903(0,6) 32903(0,7)
898
899 pldm_entity entities[9]{};
900 entities[0].entity_type = 11521;
901 entities[1].entity_type = 45;
902 entities[2].entity_type = 64;
903 entities[3].entity_type = 67;
904 entities[4].entity_type = 67;
905 entities[5].entity_type = 135;
906 entities[5].entity_container_id = 2;
907 entities[6].entity_type = 135;
908 entities[6].entity_container_id = 3;
909 entities[7].entity_type = 32903;
910 entities[8].entity_type = 32903;
911 auto tree = pldm_entity_association_tree_init();
912 auto l1 = pldm_entity_association_tree_add_entity(
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -0600913 tree, &entities[0], 0xffff, nullptr, PLDM_ENTITY_ASSOCIAION_LOGICAL,
914 false, true, 0xffff);
Pavithra Barithaya9947f9d2023-05-18 05:20:24 -0500915 EXPECT_NE(l1, nullptr);
916 auto l2 = pldm_entity_association_tree_add_entity(
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -0600917 tree, &entities[1], 0xffff, l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL, false,
918 false, 0xffff);
Pavithra Barithaya9947f9d2023-05-18 05:20:24 -0500919 EXPECT_NE(l2, nullptr);
920 auto l3 = pldm_entity_association_tree_add_entity(
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -0600921 tree, &entities[2], 0xffff, l2, PLDM_ENTITY_ASSOCIAION_PHYSICAL, false,
922 true, 0xffff);
Pavithra Barithaya9947f9d2023-05-18 05:20:24 -0500923 EXPECT_NE(l3, nullptr);
924 auto l4a = pldm_entity_association_tree_add_entity(
925 tree, &entities[3], 0, l3, PLDM_ENTITY_ASSOCIAION_PHYSICAL, false,
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -0600926 false, 0xffff);
Pavithra Barithaya9947f9d2023-05-18 05:20:24 -0500927 EXPECT_NE(l4a, nullptr);
928 auto l4b = pldm_entity_association_tree_add_entity(
929 tree, &entities[4], 1, l3, PLDM_ENTITY_ASSOCIAION_PHYSICAL, true, true,
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -0600930 0xffff);
Pavithra Barithaya9947f9d2023-05-18 05:20:24 -0500931 EXPECT_NE(l4b, nullptr);
932 auto l5a = pldm_entity_association_tree_add_entity(
933 tree, &entities[5], 0, l4a, PLDM_ENTITY_ASSOCIAION_PHYSICAL, false,
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -0600934 false, 0xffff);
Pavithra Barithaya9947f9d2023-05-18 05:20:24 -0500935 EXPECT_NE(l5a, nullptr);
936 auto l5b = pldm_entity_association_tree_add_entity(
937 tree, &entities[6], 0, l4b, PLDM_ENTITY_ASSOCIAION_PHYSICAL, false,
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -0600938 false, 0xffff);
Pavithra Barithaya9947f9d2023-05-18 05:20:24 -0500939 EXPECT_NE(l5b, nullptr);
940 pldm_entity entity{};
941 entity.entity_type = 135;
942 entity.entity_instance_num = 0;
943 entity.entity_container_id = 2;
944 auto result1 = pldm_entity_association_tree_find(tree, &entity);
945 EXPECT_EQ(result1, l5a);
946 EXPECT_EQ(entities[5].entity_container_id, 2);
947 auto l6a = pldm_entity_association_tree_add_entity(
948 tree, &entities[7], 0, result1, PLDM_ENTITY_ASSOCIAION_PHYSICAL, false,
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -0600949 false, 0xffff);
Pavithra Barithaya9947f9d2023-05-18 05:20:24 -0500950 EXPECT_NE(l6a, nullptr);
951 entity.entity_type = 135;
952 entity.entity_instance_num = 0;
953 entity.entity_container_id = 3;
954 auto result2 = pldm_entity_association_tree_find(tree, &entity);
955 EXPECT_NE(result2, l5b);
956 EXPECT_EQ(entities[6].entity_container_id, 3);
957 auto l7a = pldm_entity_association_tree_add_entity(
958 tree, &entities[8], 0, result2, PLDM_ENTITY_ASSOCIAION_PHYSICAL, false,
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -0600959 false, 0xffff);
Pavithra Barithaya9947f9d2023-05-18 05:20:24 -0500960 EXPECT_EQ(l7a, nullptr);
961 pldm_entity_association_tree_destroy(tree);
962}
963#endif
964
Andrew Jeffery9c766792022-08-10 23:12:49 +0930965TEST(EntityAssociationPDR, testSpecialTrees)
966{
967 pldm_entity entities[3]{};
968
969 entities[0].entity_type = 1;
970 entities[1].entity_type = 2;
971 entities[2].entity_type = 1;
972
973 // A
974 auto tree = pldm_entity_association_tree_init();
975 auto node = pldm_entity_association_tree_add(
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -0600976 tree, &entities[0], 0xffff, nullptr, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
Andrew Jeffery9c766792022-08-10 23:12:49 +0930977 EXPECT_NE(node, nullptr);
978 size_t num{};
979 pldm_entity* out = nullptr;
980 pldm_entity_association_tree_visit(tree, &out, &num);
981 EXPECT_EQ(num, 1u);
982 EXPECT_EQ(out[0].entity_type, 1u);
983 EXPECT_EQ(out[0].entity_instance_num, 1u);
984 EXPECT_EQ(out[0].entity_container_id, 0u);
985 free(out);
986 pldm_entity_association_tree_destroy(tree);
987
988 // A-A-A
989 tree = pldm_entity_association_tree_init();
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -0600990 node = pldm_entity_association_tree_add(tree, &entities[0], 0xffff, nullptr,
Andrew Jeffery9c766792022-08-10 23:12:49 +0930991 PLDM_ENTITY_ASSOCIAION_PHYSICAL);
992 EXPECT_NE(node, nullptr);
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -0600993 node = pldm_entity_association_tree_add(tree, &entities[1], 0xffff, nullptr,
Andrew Jeffery9c766792022-08-10 23:12:49 +0930994 PLDM_ENTITY_ASSOCIAION_PHYSICAL);
995 EXPECT_NE(node, nullptr);
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -0600996 node = pldm_entity_association_tree_add(tree, &entities[2], 0xffff, nullptr,
Andrew Jeffery9c766792022-08-10 23:12:49 +0930997 PLDM_ENTITY_ASSOCIAION_PHYSICAL);
998 EXPECT_NE(node, nullptr);
999 pldm_entity_association_tree_visit(tree, &out, &num);
1000 EXPECT_EQ(num, 3u);
1001 EXPECT_EQ(out[0].entity_type, 1u);
1002 EXPECT_EQ(out[0].entity_instance_num, 1u);
1003 EXPECT_EQ(out[0].entity_container_id, 0u);
1004 EXPECT_EQ(out[1].entity_type, 1u);
1005 EXPECT_EQ(out[1].entity_instance_num, 2u);
1006 EXPECT_EQ(out[1].entity_container_id, 0u);
1007 EXPECT_EQ(out[2].entity_type, 2u);
1008 EXPECT_EQ(out[2].entity_instance_num, 1u);
1009 EXPECT_EQ(out[2].entity_container_id, 0u);
1010 free(out);
1011 pldm_entity_association_tree_destroy(tree);
1012
1013 // A
1014 // |
1015 // A
1016 // |
1017 // A
1018 tree = pldm_entity_association_tree_init();
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06001019 node = pldm_entity_association_tree_add(tree, &entities[0], 0xffff, nullptr,
Andrew Jeffery9c766792022-08-10 23:12:49 +09301020 PLDM_ENTITY_ASSOCIAION_PHYSICAL);
1021 EXPECT_NE(node, nullptr);
1022 auto node1 = pldm_entity_association_tree_add(
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06001023 tree, &entities[1], 0xffff, node, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
Andrew Jeffery9c766792022-08-10 23:12:49 +09301024 EXPECT_NE(node1, nullptr);
1025 auto node2 = pldm_entity_association_tree_add(
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06001026 tree, &entities[2], 0xffff, node1, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
Andrew Jeffery9c766792022-08-10 23:12:49 +09301027 EXPECT_NE(node2, nullptr);
1028 pldm_entity_association_tree_visit(tree, &out, &num);
1029 EXPECT_EQ(num, 3u);
1030 EXPECT_EQ(out[0].entity_type, 1u);
1031 EXPECT_EQ(out[0].entity_instance_num, 1u);
1032 EXPECT_EQ(out[0].entity_container_id, 0u);
1033 EXPECT_EQ(out[1].entity_type, 2u);
1034 EXPECT_EQ(out[1].entity_instance_num, 1u);
1035 EXPECT_EQ(out[1].entity_container_id, 1u);
1036 EXPECT_EQ(out[2].entity_type, 1u);
1037 EXPECT_EQ(out[2].entity_instance_num, 1u);
1038 EXPECT_EQ(out[2].entity_container_id, 2u);
1039 free(out);
1040 pldm_entity_association_tree_destroy(tree);
1041
1042 // A-A
1043 // |
1044 // A-A
1045 tree = pldm_entity_association_tree_init();
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06001046 node = pldm_entity_association_tree_add(tree, &entities[0], 0xffff, nullptr,
Andrew Jeffery9c766792022-08-10 23:12:49 +09301047 PLDM_ENTITY_ASSOCIAION_PHYSICAL);
1048 EXPECT_NE(node, nullptr);
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06001049 node = pldm_entity_association_tree_add(tree, &entities[0], 0xffff, nullptr,
Andrew Jeffery9c766792022-08-10 23:12:49 +09301050 PLDM_ENTITY_ASSOCIAION_PHYSICAL);
1051 EXPECT_NE(node, nullptr);
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06001052 node1 = pldm_entity_association_tree_add(tree, &entities[1], 0xffff, node,
Andrew Jeffery9c766792022-08-10 23:12:49 +09301053 PLDM_ENTITY_ASSOCIAION_PHYSICAL);
1054 EXPECT_NE(node1, nullptr);
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06001055 node2 = pldm_entity_association_tree_add(tree, &entities[2], 0xffff, node,
Andrew Jeffery9c766792022-08-10 23:12:49 +09301056 PLDM_ENTITY_ASSOCIAION_PHYSICAL);
1057 EXPECT_NE(node2, nullptr);
1058 pldm_entity_association_tree_visit(tree, &out, &num);
1059 EXPECT_EQ(num, 4u);
1060 EXPECT_EQ(out[0].entity_type, 1u);
1061 EXPECT_EQ(out[0].entity_instance_num, 1u);
1062 EXPECT_EQ(out[0].entity_container_id, 0u);
1063 EXPECT_EQ(out[1].entity_type, 1u);
1064 EXPECT_EQ(out[1].entity_instance_num, 2u);
1065 EXPECT_EQ(out[1].entity_container_id, 0u);
1066 EXPECT_EQ(out[2].entity_type, 2u);
1067 EXPECT_EQ(out[2].entity_instance_num, 1u);
1068 EXPECT_EQ(out[2].entity_container_id, 1u);
1069 EXPECT_EQ(out[3].entity_type, 1u);
1070 EXPECT_EQ(out[3].entity_instance_num, 1u);
1071 EXPECT_EQ(out[3].entity_container_id, 1u);
1072 free(out);
1073 pldm_entity_association_tree_destroy(tree);
1074}
1075
1076TEST(EntityAssociationPDR, testPDR)
1077{
1078 // e = entity type, c = container id, i = instance num
1079
1080 // INPUT
1081 // 1(e=1)--1a(e=2)
1082 // |
1083 // 2(e=2)--3(e=2)--4(e=2)--5(e=3)
1084 // |
1085 // 6(e=4)--7(e=5)--8(e=5)--9(e=5)
1086 // | |
1087 // 11(e=6) 10(e=7)
1088
1089 // Expected OUTPUT
1090 // 1(e=1,c=0,i=1)
1091 // |
1092 // 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)
1093 // |
1094 // 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)
1095 // | |
1096 // 10(e=6,c=3,i=1) 11(e=7,c=4,i=1)
1097 pldm_entity entities[11]{};
1098
1099 entities[0].entity_type = 1;
1100 entities[1].entity_type = 2;
1101 entities[2].entity_type = 3;
1102 entities[3].entity_type = 2;
1103 entities[4].entity_type = 3;
1104 entities[5].entity_type = 4;
1105 entities[6].entity_type = 5;
1106 entities[7].entity_type = 5;
1107 entities[8].entity_type = 5;
1108 entities[9].entity_type = 6;
1109 entities[10].entity_type = 7;
1110
1111 auto tree = pldm_entity_association_tree_init();
1112
1113 auto l1 = pldm_entity_association_tree_add(
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06001114 tree, &entities[0], 0xffff, nullptr, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
Andrew Jeffery9c766792022-08-10 23:12:49 +09301115 EXPECT_NE(l1, nullptr);
1116 auto l1a = pldm_entity_association_tree_add(
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06001117 tree, &entities[1], 0xffff, nullptr, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
Andrew Jeffery9c766792022-08-10 23:12:49 +09301118 EXPECT_NE(l1a, nullptr);
1119
1120 auto l2a = pldm_entity_association_tree_add(
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06001121 tree, &entities[1], 0xffff, l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
Andrew Jeffery9c766792022-08-10 23:12:49 +09301122 EXPECT_NE(l2a, nullptr);
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06001123 auto l2b = pldm_entity_association_tree_add(tree, &entities[2], 0xffff, l1,
Andrew Jeffery9c766792022-08-10 23:12:49 +09301124 PLDM_ENTITY_ASSOCIAION_LOGICAL);
1125 EXPECT_NE(l2b, nullptr);
1126 auto l2c = pldm_entity_association_tree_add(
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06001127 tree, &entities[3], 0xffff, l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
Andrew Jeffery9c766792022-08-10 23:12:49 +09301128 EXPECT_NE(l2c, nullptr);
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06001129 auto l2d = pldm_entity_association_tree_add(tree, &entities[4], 0xffff, l1,
Andrew Jeffery9c766792022-08-10 23:12:49 +09301130 PLDM_ENTITY_ASSOCIAION_LOGICAL);
1131 EXPECT_NE(l2d, nullptr);
1132
1133 auto l3a = pldm_entity_association_tree_add(
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06001134 tree, &entities[5], 0xffff, l2a, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
Andrew Jeffery9c766792022-08-10 23:12:49 +09301135 EXPECT_NE(l3a, nullptr);
1136 auto l3b = pldm_entity_association_tree_add(
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06001137 tree, &entities[6], 0xffff, l2a, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
Andrew Jeffery9c766792022-08-10 23:12:49 +09301138 EXPECT_NE(l3b, nullptr);
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06001139 auto l3c = pldm_entity_association_tree_add(tree, &entities[7], 0xffff, l2a,
Andrew Jeffery9c766792022-08-10 23:12:49 +09301140 PLDM_ENTITY_ASSOCIAION_LOGICAL);
1141 EXPECT_NE(l3c, nullptr);
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06001142 auto l3d = pldm_entity_association_tree_add(tree, &entities[8], 0xffff, l2a,
Andrew Jeffery9c766792022-08-10 23:12:49 +09301143 PLDM_ENTITY_ASSOCIAION_LOGICAL);
1144 EXPECT_NE(l3d, nullptr);
1145
1146 auto l4a = pldm_entity_association_tree_add(
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06001147 tree, &entities[9], 0xffff, l3a, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
Andrew Jeffery9c766792022-08-10 23:12:49 +09301148 EXPECT_NE(l4a, nullptr);
1149 auto l4b = pldm_entity_association_tree_add(
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06001150 tree, &entities[10], 0xffff, l3b, PLDM_ENTITY_ASSOCIAION_LOGICAL);
Andrew Jeffery9c766792022-08-10 23:12:49 +09301151 EXPECT_NE(l4b, nullptr);
1152
1153 EXPECT_EQ(pldm_entity_get_num_children(l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL),
1154 2);
1155 EXPECT_EQ(pldm_entity_get_num_children(l1, PLDM_ENTITY_ASSOCIAION_LOGICAL),
1156 2);
1157 EXPECT_EQ(
1158 pldm_entity_get_num_children(l2a, PLDM_ENTITY_ASSOCIAION_PHYSICAL), 2);
1159 EXPECT_EQ(
1160 pldm_entity_get_num_children(l3b, PLDM_ENTITY_ASSOCIAION_PHYSICAL), 0);
1161 EXPECT_EQ(pldm_entity_get_num_children(l3b, PLDM_ENTITY_ASSOCIAION_LOGICAL),
1162 1);
1163
1164 auto repo = pldm_pdr_init();
Andrew Jefferyd72ea4b2024-06-24 21:33:33 +09301165 int rc = pldm_entity_association_pdr_add(tree, repo, false, 1);
Andrew Jeffery255f6542023-08-10 15:46:54 +09301166 ASSERT_EQ(rc, 0);
Andrew Jeffery9c766792022-08-10 23:12:49 +09301167
1168 EXPECT_EQ(pldm_pdr_get_record_count(repo), 6u);
1169
1170 uint32_t currRecHandle{};
1171 uint32_t nextRecHandle{};
1172 uint8_t* data = nullptr;
1173 uint32_t size{};
1174 uint32_t commonSize = sizeof(struct pldm_pdr_hdr) + sizeof(uint16_t) +
1175 sizeof(uint8_t) + sizeof(pldm_entity) +
1176 sizeof(uint8_t);
1177
1178 pldm_pdr_find_record(repo, currRecHandle, &data, &size, &nextRecHandle);
1179 EXPECT_EQ(size, commonSize + (pldm_entity_get_num_children(
1180 l1, PLDM_ENTITY_ASSOCIAION_LOGICAL) *
1181 sizeof(pldm_entity)));
1182 uint8_t* start = data;
1183 pldm_pdr_hdr* hdr = reinterpret_cast<pldm_pdr_hdr*>(start);
1184 EXPECT_EQ(le32toh(hdr->record_handle), 1u);
1185 EXPECT_EQ(hdr->type, PLDM_PDR_ENTITY_ASSOCIATION);
1186 EXPECT_EQ(le16toh(hdr->length), size - sizeof(struct pldm_pdr_hdr));
1187 start += sizeof(pldm_pdr_hdr);
1188 uint16_t* containerId = reinterpret_cast<uint16_t*>(start);
1189 EXPECT_EQ(le16toh(*containerId), 1u);
1190 start += sizeof(uint16_t);
1191 EXPECT_EQ(*start, PLDM_ENTITY_ASSOCIAION_LOGICAL);
1192 start += sizeof(uint8_t);
1193 pldm_entity* entity = reinterpret_cast<pldm_entity*>(start);
1194 EXPECT_EQ(le16toh(entity->entity_type), 1u);
1195 EXPECT_EQ(le16toh(entity->entity_instance_num), 1u);
1196 EXPECT_EQ(le16toh(entity->entity_container_id), 0u);
1197 start += sizeof(pldm_entity);
1198 EXPECT_EQ(*start,
1199 pldm_entity_get_num_children(l1, PLDM_ENTITY_ASSOCIAION_LOGICAL));
1200 start += sizeof(uint8_t);
1201 entity = reinterpret_cast<pldm_entity*>(start);
1202 EXPECT_EQ(le16toh(entity->entity_type), 3u);
1203 EXPECT_EQ(le16toh(entity->entity_instance_num), 1u);
1204 EXPECT_EQ(le16toh(entity->entity_container_id), 1u);
1205 start += sizeof(pldm_entity);
1206 entity = reinterpret_cast<pldm_entity*>(start);
1207 EXPECT_EQ(le16toh(entity->entity_type), 3u);
1208 EXPECT_EQ(le16toh(entity->entity_instance_num), 2u);
1209 EXPECT_EQ(le16toh(entity->entity_container_id), 1u);
Andrew Jeffery9c766792022-08-10 23:12:49 +09301210
1211 currRecHandle = nextRecHandle;
1212
1213 pldm_pdr_find_record(repo, currRecHandle, &data, &size, &nextRecHandle);
1214 EXPECT_EQ(size, commonSize + (pldm_entity_get_num_children(
1215 l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL) *
1216 sizeof(pldm_entity)));
1217 start = data;
1218 hdr = reinterpret_cast<pldm_pdr_hdr*>(start);
1219 EXPECT_EQ(le32toh(hdr->record_handle), 2u);
1220 EXPECT_EQ(hdr->type, PLDM_PDR_ENTITY_ASSOCIATION);
1221 EXPECT_EQ(le16toh(hdr->length), size - sizeof(struct pldm_pdr_hdr));
1222 start += sizeof(pldm_pdr_hdr);
1223 containerId = reinterpret_cast<uint16_t*>(start);
1224 EXPECT_EQ(le16toh(*containerId), 1u);
1225 start += sizeof(uint16_t);
1226 EXPECT_EQ(*start, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
1227 start += sizeof(uint8_t);
1228 entity = reinterpret_cast<pldm_entity*>(start);
1229 EXPECT_EQ(le16toh(entity->entity_type), 1u);
1230 EXPECT_EQ(le16toh(entity->entity_instance_num), 1u);
1231 EXPECT_EQ(le16toh(entity->entity_container_id), 0u);
1232 start += sizeof(pldm_entity);
1233 EXPECT_EQ(*start, pldm_entity_get_num_children(
1234 l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL));
1235 start += sizeof(uint8_t);
1236 entity = reinterpret_cast<pldm_entity*>(start);
1237 EXPECT_EQ(le16toh(entity->entity_type), 2u);
1238 EXPECT_EQ(le16toh(entity->entity_instance_num), 1u);
1239 EXPECT_EQ(le16toh(entity->entity_container_id), 1u);
1240 start += sizeof(pldm_entity);
1241 entity = reinterpret_cast<pldm_entity*>(start);
1242 EXPECT_EQ(le16toh(entity->entity_type), 2u);
1243 EXPECT_EQ(le16toh(entity->entity_instance_num), 2u);
1244 EXPECT_EQ(le16toh(entity->entity_container_id), 1u);
Andrew Jeffery9c766792022-08-10 23:12:49 +09301245
1246 currRecHandle = nextRecHandle;
1247
1248 pldm_pdr_find_record(repo, currRecHandle, &data, &size, &nextRecHandle);
1249 EXPECT_EQ(size, commonSize + (pldm_entity_get_num_children(
1250 l2a, PLDM_ENTITY_ASSOCIAION_LOGICAL) *
1251 sizeof(pldm_entity)));
1252 start = data;
1253 hdr = reinterpret_cast<pldm_pdr_hdr*>(start);
1254 EXPECT_EQ(le32toh(hdr->record_handle), 3u);
1255 EXPECT_EQ(hdr->type, PLDM_PDR_ENTITY_ASSOCIATION);
1256 EXPECT_EQ(le16toh(hdr->length), size - sizeof(struct pldm_pdr_hdr));
1257 start += sizeof(pldm_pdr_hdr);
1258 containerId = reinterpret_cast<uint16_t*>(start);
1259 EXPECT_EQ(le16toh(*containerId), 2u);
1260 start += sizeof(uint16_t);
1261 EXPECT_EQ(*start, PLDM_ENTITY_ASSOCIAION_LOGICAL);
1262 start += sizeof(uint8_t);
1263 entity = reinterpret_cast<pldm_entity*>(start);
1264 EXPECT_EQ(le16toh(entity->entity_type), 2u);
1265 EXPECT_EQ(le16toh(entity->entity_instance_num), 1u);
1266 EXPECT_EQ(le16toh(entity->entity_container_id), 1u);
1267 start += sizeof(pldm_entity);
1268 EXPECT_EQ(*start, pldm_entity_get_num_children(
1269 l2a, PLDM_ENTITY_ASSOCIAION_LOGICAL));
1270 start += sizeof(uint8_t);
1271 entity = reinterpret_cast<pldm_entity*>(start);
1272 EXPECT_EQ(le16toh(entity->entity_type), 5);
1273 EXPECT_EQ(le16toh(entity->entity_instance_num), 2u);
1274 EXPECT_EQ(le16toh(entity->entity_container_id), 2u);
1275 start += sizeof(pldm_entity);
1276 entity = reinterpret_cast<pldm_entity*>(start);
1277 EXPECT_EQ(le16toh(entity->entity_type), 5u);
1278 EXPECT_EQ(le16toh(entity->entity_instance_num), 3u);
1279 EXPECT_EQ(le16toh(entity->entity_container_id), 2u);
Andrew Jeffery9c766792022-08-10 23:12:49 +09301280
1281 currRecHandle = nextRecHandle;
1282
1283 pldm_pdr_find_record(repo, currRecHandle, &data, &size, &nextRecHandle);
1284 EXPECT_EQ(size, commonSize + (pldm_entity_get_num_children(
1285 l2a, PLDM_ENTITY_ASSOCIAION_PHYSICAL) *
1286 sizeof(pldm_entity)));
1287 start = data;
1288 hdr = reinterpret_cast<pldm_pdr_hdr*>(start);
1289 EXPECT_EQ(le32toh(hdr->record_handle), 4u);
1290 EXPECT_EQ(hdr->type, PLDM_PDR_ENTITY_ASSOCIATION);
1291 EXPECT_EQ(le16toh(hdr->length), size - sizeof(struct pldm_pdr_hdr));
1292 start += sizeof(pldm_pdr_hdr);
1293 containerId = reinterpret_cast<uint16_t*>(start);
1294 EXPECT_EQ(le16toh(*containerId), 2u);
1295 start += sizeof(uint16_t);
1296 EXPECT_EQ(*start, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
1297 start += sizeof(uint8_t);
1298 entity = reinterpret_cast<pldm_entity*>(start);
1299 EXPECT_EQ(le16toh(entity->entity_type), 2u);
1300 EXPECT_EQ(le16toh(entity->entity_instance_num), 1u);
1301 EXPECT_EQ(le16toh(entity->entity_container_id), 1u);
1302 start += sizeof(pldm_entity);
1303 EXPECT_EQ(*start, pldm_entity_get_num_children(
1304 l2a, PLDM_ENTITY_ASSOCIAION_PHYSICAL));
1305 start += sizeof(uint8_t);
1306 entity = reinterpret_cast<pldm_entity*>(start);
1307 EXPECT_EQ(le16toh(entity->entity_type), 4u);
1308 EXPECT_EQ(le16toh(entity->entity_instance_num), 1u);
1309 EXPECT_EQ(le16toh(entity->entity_container_id), 2u);
1310 start += sizeof(pldm_entity);
1311 entity = reinterpret_cast<pldm_entity*>(start);
1312 EXPECT_EQ(le16toh(entity->entity_type), 5u);
1313 EXPECT_EQ(le16toh(entity->entity_instance_num), 1u);
1314 EXPECT_EQ(le16toh(entity->entity_container_id), 2u);
Andrew Jeffery9c766792022-08-10 23:12:49 +09301315
1316 currRecHandle = nextRecHandle;
1317
1318 pldm_pdr_find_record(repo, currRecHandle, &data, &size, &nextRecHandle);
1319 EXPECT_EQ(size, commonSize + (pldm_entity_get_num_children(
1320 l3a, PLDM_ENTITY_ASSOCIAION_PHYSICAL) *
1321 sizeof(pldm_entity)));
1322 start = data;
1323 hdr = reinterpret_cast<pldm_pdr_hdr*>(start);
1324 EXPECT_EQ(le32toh(hdr->record_handle), 5u);
1325 EXPECT_EQ(hdr->type, PLDM_PDR_ENTITY_ASSOCIATION);
1326 EXPECT_EQ(le16toh(hdr->length), size - sizeof(struct pldm_pdr_hdr));
1327 start += sizeof(pldm_pdr_hdr);
1328 containerId = reinterpret_cast<uint16_t*>(start);
1329 EXPECT_EQ(le16toh(*containerId), 3u);
1330 start += sizeof(uint16_t);
1331 EXPECT_EQ(*start, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
1332 start += sizeof(uint8_t);
1333 entity = reinterpret_cast<pldm_entity*>(start);
1334 EXPECT_EQ(le16toh(entity->entity_type), 4u);
1335 EXPECT_EQ(le16toh(entity->entity_instance_num), 1u);
1336 EXPECT_EQ(le16toh(entity->entity_container_id), 2u);
1337 start += sizeof(pldm_entity);
1338 EXPECT_EQ(*start, pldm_entity_get_num_children(
1339 l3a, PLDM_ENTITY_ASSOCIAION_PHYSICAL));
1340 start += sizeof(uint8_t);
1341 entity = reinterpret_cast<pldm_entity*>(start);
1342 EXPECT_EQ(le16toh(entity->entity_type), 6u);
1343 EXPECT_EQ(le16toh(entity->entity_instance_num), 1u);
1344 EXPECT_EQ(le16toh(entity->entity_container_id), 3u);
Andrew Jeffery9c766792022-08-10 23:12:49 +09301345
1346 currRecHandle = nextRecHandle;
1347
1348 pldm_pdr_find_record(repo, currRecHandle, &data, &size, &nextRecHandle);
1349 EXPECT_EQ(size, commonSize + (pldm_entity_get_num_children(
1350 l3b, PLDM_ENTITY_ASSOCIAION_LOGICAL) *
1351 sizeof(pldm_entity)));
1352 start = data;
1353 hdr = reinterpret_cast<pldm_pdr_hdr*>(start);
1354 EXPECT_EQ(le32toh(hdr->record_handle), 6u);
1355 EXPECT_EQ(hdr->type, PLDM_PDR_ENTITY_ASSOCIATION);
1356 EXPECT_EQ(le16toh(hdr->length), size - sizeof(struct pldm_pdr_hdr));
1357 start += sizeof(pldm_pdr_hdr);
1358 containerId = reinterpret_cast<uint16_t*>(start);
1359 EXPECT_EQ(le16toh(*containerId), 4u);
1360 start += sizeof(uint16_t);
1361 EXPECT_EQ(*start, PLDM_ENTITY_ASSOCIAION_LOGICAL);
1362 start += sizeof(uint8_t);
1363 entity = reinterpret_cast<pldm_entity*>(start);
1364 EXPECT_EQ(le16toh(entity->entity_type), 5u);
1365 EXPECT_EQ(le16toh(entity->entity_instance_num), 1u);
1366 EXPECT_EQ(le16toh(entity->entity_container_id), 2u);
1367 start += sizeof(pldm_entity);
1368 EXPECT_EQ(*start, pldm_entity_get_num_children(
1369 l3b, PLDM_ENTITY_ASSOCIAION_LOGICAL));
1370 start += sizeof(uint8_t);
1371 entity = reinterpret_cast<pldm_entity*>(start);
1372 EXPECT_EQ(le16toh(entity->entity_type), 7u);
1373 EXPECT_EQ(le16toh(entity->entity_instance_num), 1u);
1374 EXPECT_EQ(le16toh(entity->entity_container_id), 4u);
1375
1376 EXPECT_EQ(nextRecHandle, 0u);
1377
1378 pldm_pdr_destroy(repo);
1379 pldm_entity_association_tree_destroy(tree);
1380}
1381
1382TEST(EntityAssociationPDR, testFind)
1383{
1384 // 1
1385 // |
1386 // 2--3--4
1387 // |
1388 // 5--6--7
1389 // | |
1390 // 8 9
1391
1392 pldm_entity entities[9]{};
1393
1394 entities[0].entity_type = 1;
1395 entities[1].entity_type = 2;
1396 entities[2].entity_type = 2;
1397 entities[3].entity_type = 3;
1398 entities[4].entity_type = 4;
1399 entities[5].entity_type = 5;
1400 entities[6].entity_type = 5;
1401 entities[7].entity_type = 6;
1402 entities[8].entity_type = 7;
1403
1404 auto tree = pldm_entity_association_tree_init();
1405
1406 auto l1 = pldm_entity_association_tree_add(
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06001407 tree, &entities[0], 0xffff, nullptr, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
Andrew Jeffery9c766792022-08-10 23:12:49 +09301408 EXPECT_NE(l1, nullptr);
1409 auto l2a = pldm_entity_association_tree_add(
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06001410 tree, &entities[1], 0xffff, l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
Andrew Jeffery9c766792022-08-10 23:12:49 +09301411 EXPECT_NE(l2a, nullptr);
1412 auto l2b = pldm_entity_association_tree_add(
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06001413 tree, &entities[2], 0xffff, l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
Andrew Jeffery9c766792022-08-10 23:12:49 +09301414 EXPECT_NE(l2b, nullptr);
1415 auto l2c = pldm_entity_association_tree_add(
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06001416 tree, &entities[3], 0xffff, l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
Andrew Jeffery9c766792022-08-10 23:12:49 +09301417 EXPECT_NE(l2c, nullptr);
1418 auto l3a = pldm_entity_association_tree_add(
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06001419 tree, &entities[4], 0xffff, l2a, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
Andrew Jeffery9c766792022-08-10 23:12:49 +09301420 EXPECT_NE(l3a, nullptr);
1421 auto l3b = pldm_entity_association_tree_add(
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06001422 tree, &entities[5], 0xffff, l2a, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
Andrew Jeffery9c766792022-08-10 23:12:49 +09301423 EXPECT_NE(l3b, nullptr);
1424 auto l3c = pldm_entity_association_tree_add(
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06001425 tree, &entities[6], 0xffff, l2a, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
Andrew Jeffery9c766792022-08-10 23:12:49 +09301426 EXPECT_NE(l3c, nullptr);
1427 auto l4a = pldm_entity_association_tree_add(
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06001428 tree, &entities[7], 0xffff, l3a, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
Andrew Jeffery9c766792022-08-10 23:12:49 +09301429 EXPECT_NE(l4a, nullptr);
1430 auto l4b = pldm_entity_association_tree_add(
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06001431 tree, &entities[8], 0xffff, l3b, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
Andrew Jeffery9c766792022-08-10 23:12:49 +09301432 EXPECT_NE(l4b, nullptr);
1433
1434 pldm_entity entity{};
1435
1436 entity.entity_type = 1;
1437 entity.entity_instance_num = 1;
1438 auto result = pldm_entity_association_tree_find(tree, &entity);
1439 EXPECT_EQ(result, l1);
1440 EXPECT_EQ(entity.entity_container_id, 0);
1441
1442 entity.entity_type = 2;
1443 entity.entity_instance_num = 1;
1444 result = pldm_entity_association_tree_find(tree, &entity);
1445 EXPECT_EQ(result, l2a);
1446 EXPECT_EQ(entity.entity_container_id, 1);
1447 entity.entity_type = 2;
1448 entity.entity_instance_num = 2;
1449 result = pldm_entity_association_tree_find(tree, &entity);
1450 EXPECT_EQ(result, l2b);
1451 EXPECT_EQ(entity.entity_container_id, 1);
1452 entity.entity_type = 3;
1453 entity.entity_instance_num = 1;
1454 result = pldm_entity_association_tree_find(tree, &entity);
1455 EXPECT_EQ(result, l2c);
1456 EXPECT_EQ(entity.entity_container_id, 1);
1457
1458 entity.entity_type = 7;
1459 entity.entity_instance_num = 1;
1460 result = pldm_entity_association_tree_find(tree, &entity);
1461 EXPECT_EQ(result, l4b);
1462 EXPECT_EQ(entity.entity_container_id, 4);
1463
1464 pldm_entity_association_tree_destroy(tree);
1465}
1466
1467TEST(EntityAssociationPDR, testCopyTree)
1468{
1469 pldm_entity entities[4]{};
1470 entities[0].entity_type = 1;
1471 entities[1].entity_type = 2;
1472 entities[2].entity_type = 2;
1473 entities[3].entity_type = 3;
1474
1475 auto orgTree = pldm_entity_association_tree_init();
1476 auto newTree = pldm_entity_association_tree_init();
1477 auto l1 =
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06001478 pldm_entity_association_tree_add(orgTree, &entities[0], 0xffff, nullptr,
Andrew Jeffery9c766792022-08-10 23:12:49 +09301479 PLDM_ENTITY_ASSOCIAION_PHYSICAL);
1480 EXPECT_NE(l1, nullptr);
1481 auto l2a = pldm_entity_association_tree_add(
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06001482 orgTree, &entities[1], 0xffff, l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
Andrew Jeffery9c766792022-08-10 23:12:49 +09301483 EXPECT_NE(l2a, nullptr);
1484 auto l2b = pldm_entity_association_tree_add(
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06001485 orgTree, &entities[2], 0xffff, l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
Andrew Jeffery9c766792022-08-10 23:12:49 +09301486 EXPECT_NE(l2b, nullptr);
1487 auto l2c = pldm_entity_association_tree_add(
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06001488 orgTree, &entities[3], 0xffff, l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
Andrew Jeffery9c766792022-08-10 23:12:49 +09301489 EXPECT_NE(l2c, nullptr);
1490 size_t orgNum{};
1491 pldm_entity* orgOut = nullptr;
1492 pldm_entity_association_tree_visit(orgTree, &orgOut, &orgNum);
1493 EXPECT_EQ(orgNum, 4u);
1494
1495 pldm_entity_association_tree_copy_root(orgTree, newTree);
1496 size_t newNum{};
1497 pldm_entity* newOut = nullptr;
1498 pldm_entity_association_tree_visit(newTree, &newOut, &newNum);
1499 EXPECT_EQ(newNum, orgNum);
1500 EXPECT_EQ(newOut[0].entity_type, 1u);
1501 EXPECT_EQ(newOut[0].entity_instance_num, 1u);
1502 EXPECT_EQ(newOut[0].entity_container_id, 0u);
1503 free(orgOut);
1504 free(newOut);
1505 pldm_entity_association_tree_destroy(orgTree);
1506 pldm_entity_association_tree_destroy(newTree);
1507}
1508
1509TEST(EntityAssociationPDR, testExtract)
1510{
1511 std::vector<uint8_t> pdr{};
1512 pdr.resize(sizeof(pldm_pdr_hdr) + sizeof(pldm_pdr_entity_association) +
1513 sizeof(pldm_entity) * 4);
1514 pldm_pdr_hdr* hdr = reinterpret_cast<pldm_pdr_hdr*>(pdr.data());
1515 hdr->type = PLDM_PDR_ENTITY_ASSOCIATION;
1516 hdr->length =
1517 htole16(sizeof(pldm_pdr_entity_association) + sizeof(pldm_entity) * 4);
1518
1519 pldm_pdr_entity_association* e =
1520 reinterpret_cast<pldm_pdr_entity_association*>(pdr.data() +
1521 sizeof(pldm_pdr_hdr));
1522 e->container_id = htole16(1);
1523 e->num_children = 5;
1524 e->container.entity_type = htole16(1);
1525 e->container.entity_instance_num = htole16(1);
1526 e->container.entity_container_id = htole16(0);
1527
1528 pldm_entity* entity = e->children;
1529 entity->entity_type = htole16(2);
1530 entity->entity_instance_num = htole16(1);
1531 entity->entity_container_id = htole16(1);
1532 ++entity;
1533 entity->entity_type = htole16(3);
1534 entity->entity_instance_num = htole16(1);
1535 entity->entity_container_id = htole16(1);
1536 ++entity;
1537 entity->entity_type = htole16(4);
1538 entity->entity_instance_num = htole16(1);
1539 entity->entity_container_id = htole16(1);
1540 ++entity;
1541 entity->entity_type = htole16(5);
1542 entity->entity_instance_num = htole16(1);
1543 entity->entity_container_id = htole16(1);
1544 ++entity;
1545 entity->entity_type = htole16(6);
1546 entity->entity_instance_num = htole16(1);
1547 entity->entity_container_id = htole16(1);
1548
1549 size_t num{};
1550 pldm_entity* out = nullptr;
1551 pldm_entity_association_pdr_extract(pdr.data(), pdr.size(), &num, &out);
1552 EXPECT_EQ(num, (unsigned)e->num_children + 1);
1553 EXPECT_EQ(out[0].entity_type, 1u);
1554 EXPECT_EQ(out[0].entity_instance_num, 1u);
1555 EXPECT_EQ(out[0].entity_container_id, 0u);
1556 EXPECT_EQ(out[1].entity_type, 2u);
1557 EXPECT_EQ(out[1].entity_instance_num, 1u);
1558 EXPECT_EQ(out[1].entity_container_id, 1u);
1559 EXPECT_EQ(out[2].entity_type, 3u);
1560 EXPECT_EQ(out[2].entity_instance_num, 1u);
1561 EXPECT_EQ(out[2].entity_container_id, 1u);
1562 EXPECT_EQ(out[3].entity_type, 4u);
1563 EXPECT_EQ(out[3].entity_instance_num, 1u);
1564 EXPECT_EQ(out[3].entity_container_id, 1u);
1565 EXPECT_EQ(out[4].entity_type, 5u);
1566 EXPECT_EQ(out[4].entity_instance_num, 1u);
1567 EXPECT_EQ(out[4].entity_container_id, 1u);
1568 EXPECT_EQ(out[5].entity_type, 6u);
1569 EXPECT_EQ(out[5].entity_instance_num, 1u);
1570 EXPECT_EQ(out[5].entity_container_id, 1u);
1571
1572 free(out);
1573}
1574
1575TEST(EntityAssociationPDR, testGetChildren)
1576{
1577 pldm_entity entities[4]{};
1578 entities[0].entity_type = 1;
1579 entities[1].entity_type = 2;
1580 entities[2].entity_type = 2;
1581 entities[3].entity_type = 3;
1582
1583 auto tree = pldm_entity_association_tree_init();
1584 auto l1 = pldm_entity_association_tree_add(
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06001585 tree, &entities[0], 0xffff, nullptr, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
Andrew Jeffery9c766792022-08-10 23:12:49 +09301586 EXPECT_NE(l1, nullptr);
1587 auto l2a = pldm_entity_association_tree_add(
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06001588 tree, &entities[1], 0xffff, l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
Andrew Jeffery9c766792022-08-10 23:12:49 +09301589 EXPECT_NE(l2a, nullptr);
1590 auto l2b = pldm_entity_association_tree_add(
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06001591 tree, &entities[2], 0xffff, l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
Andrew Jeffery9c766792022-08-10 23:12:49 +09301592 EXPECT_NE(l2b, nullptr);
1593 auto l2c = pldm_entity_association_tree_add(
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06001594 tree, &entities[3], 0xffff, l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
Andrew Jeffery9c766792022-08-10 23:12:49 +09301595 EXPECT_NE(l2c, nullptr);
1596
1597 pldm_entity et1;
1598 et1.entity_type = 2;
1599 et1.entity_instance_num = 1;
1600 EXPECT_EQ(true, pldm_is_current_parent_child(l1, &et1));
1601
1602 pldm_entity et2;
1603 et2.entity_type = 2;
1604 et2.entity_instance_num = 2;
1605 EXPECT_EQ(true, pldm_is_current_parent_child(l1, &et2));
1606
1607 pldm_entity et3;
1608 et3.entity_type = 2;
1609 et3.entity_instance_num = 3;
1610 EXPECT_EQ(false, pldm_is_current_parent_child(l1, &et3));
1611
1612 pldm_entity_association_tree_destroy(tree);
1613}
1614
1615TEST(EntityAssociationPDR, testEntityInstanceNumber)
1616{
1617 pldm_entity entities[9]{};
1618
1619 entities[0].entity_type = 1;
1620 entities[1].entity_type = 2;
1621 entities[2].entity_type = 2;
1622 entities[3].entity_type = 2;
1623 entities[4].entity_type = 2;
1624 entities[5].entity_type = 2;
1625 entities[6].entity_type = 2;
1626 entities[7].entity_type = 3;
1627 entities[8].entity_type = 3;
1628
1629 auto tree = pldm_entity_association_tree_init();
1630 auto repo = pldm_pdr_init();
1631
1632 uint16_t terminusHdl{};
1633 uint16_t entityType{};
1634 uint16_t entityInstanceNum{};
1635 uint16_t containerId{};
1636
1637 auto node = pldm_entity_association_tree_add(
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06001638 tree, &entities[0], 0xffff, nullptr, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
Andrew Jeffery9c766792022-08-10 23:12:49 +09301639 EXPECT_NE(node, nullptr);
1640
1641 auto l1 = pldm_entity_association_tree_add(tree, &entities[1], 63, node,
1642 PLDM_ENTITY_ASSOCIAION_PHYSICAL);
Andrew Jeffery14d29842023-07-17 15:29:32 +09301643 uint32_t first = 1;
Andrew Jefferye7f55112024-06-20 16:16:01 +09301644 EXPECT_EQ(pldm_pdr_add_fru_record_set(repo, 1, 1, entities[1].entity_type,
1645 entities[1].entity_instance_num,
1646 entities[1].entity_container_id,
1647 &first),
Andrew Jeffery14d29842023-07-17 15:29:32 +09301648 0);
Andrew Jeffery9c766792022-08-10 23:12:49 +09301649 EXPECT_NE(l1, nullptr);
1650 EXPECT_EQ(entities[1].entity_instance_num, 63);
1651 EXPECT_EQ(first, pldm_pdr_get_record_handle(
1652 repo, pldm_pdr_fru_record_set_find_by_rsi(
1653 repo, 1, &terminusHdl, &entityType,
1654 &entityInstanceNum, &containerId)));
1655 EXPECT_EQ(entityType, 2);
1656 EXPECT_EQ(entityInstanceNum, 63);
1657
1658 auto l2 = pldm_entity_association_tree_add(tree, &entities[2], 37, node,
1659 PLDM_ENTITY_ASSOCIAION_PHYSICAL);
Andrew Jeffery14d29842023-07-17 15:29:32 +09301660 uint32_t second = 2;
Andrew Jefferye7f55112024-06-20 16:16:01 +09301661 EXPECT_EQ(pldm_pdr_add_fru_record_set(repo, 1, 2, entities[2].entity_type,
1662 entities[2].entity_instance_num,
1663 entities[2].entity_container_id,
1664 &second),
Andrew Jeffery14d29842023-07-17 15:29:32 +09301665 0);
Andrew Jeffery9c766792022-08-10 23:12:49 +09301666 EXPECT_NE(l2, nullptr);
1667 EXPECT_EQ(entities[2].entity_instance_num, 37);
1668 EXPECT_EQ(second, pldm_pdr_get_record_handle(
1669 repo, pldm_pdr_fru_record_set_find_by_rsi(
1670 repo, 2, &terminusHdl, &entityType,
1671 &entityInstanceNum, &containerId)));
1672 EXPECT_EQ(entityType, 2);
1673 EXPECT_EQ(entityInstanceNum, 37);
1674
1675 auto l3 = pldm_entity_association_tree_add(tree, &entities[3], 44, node,
1676 PLDM_ENTITY_ASSOCIAION_PHYSICAL);
Andrew Jeffery14d29842023-07-17 15:29:32 +09301677 uint32_t third = 3;
Andrew Jefferye7f55112024-06-20 16:16:01 +09301678 EXPECT_EQ(pldm_pdr_add_fru_record_set(repo, 1, 3, entities[3].entity_type,
1679 entities[3].entity_instance_num,
1680 entities[3].entity_container_id,
1681 &third),
Andrew Jeffery14d29842023-07-17 15:29:32 +09301682 0);
Andrew Jeffery9c766792022-08-10 23:12:49 +09301683 EXPECT_NE(l3, nullptr);
1684 EXPECT_EQ(entities[3].entity_instance_num, 44);
1685 EXPECT_EQ(third, pldm_pdr_get_record_handle(
1686 repo, pldm_pdr_fru_record_set_find_by_rsi(
1687 repo, 3, &terminusHdl, &entityType,
1688 &entityInstanceNum, &containerId)));
1689 EXPECT_EQ(entityType, 2);
1690 EXPECT_EQ(entityInstanceNum, 44);
1691
1692 auto l4 = pldm_entity_association_tree_add(tree, &entities[4], 89, node,
1693 PLDM_ENTITY_ASSOCIAION_PHYSICAL);
Andrew Jeffery14d29842023-07-17 15:29:32 +09301694 uint32_t fourth = 4;
Andrew Jefferye7f55112024-06-20 16:16:01 +09301695 EXPECT_EQ(pldm_pdr_add_fru_record_set(repo, 1, 4, entities[4].entity_type,
1696 entities[4].entity_instance_num,
1697 entities[4].entity_container_id,
1698 &fourth),
Andrew Jeffery14d29842023-07-17 15:29:32 +09301699 0);
Andrew Jeffery9c766792022-08-10 23:12:49 +09301700 EXPECT_NE(l4, nullptr);
1701 EXPECT_EQ(entities[4].entity_instance_num, 89);
1702 EXPECT_EQ(fourth, pldm_pdr_get_record_handle(
1703 repo, pldm_pdr_fru_record_set_find_by_rsi(
1704 repo, 4, &terminusHdl, &entityType,
1705 &entityInstanceNum, &containerId)));
1706 EXPECT_EQ(entityType, 2);
1707 EXPECT_EQ(entityInstanceNum, 89);
1708
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06001709 auto l5 = pldm_entity_association_tree_add(tree, &entities[5], 0xffff, node,
Andrew Jeffery9c766792022-08-10 23:12:49 +09301710 PLDM_ENTITY_ASSOCIAION_PHYSICAL);
Andrew Jeffery14d29842023-07-17 15:29:32 +09301711 uint32_t fifth = 5;
Andrew Jefferye7f55112024-06-20 16:16:01 +09301712 EXPECT_EQ(pldm_pdr_add_fru_record_set(repo, 1, 5, entities[5].entity_type,
1713 entities[5].entity_instance_num,
1714 entities[5].entity_container_id,
1715 &fifth),
Andrew Jeffery14d29842023-07-17 15:29:32 +09301716 0);
Andrew Jeffery9c766792022-08-10 23:12:49 +09301717 EXPECT_NE(l5, nullptr);
1718 EXPECT_EQ(entities[5].entity_instance_num, 90);
1719 EXPECT_EQ(fifth, pldm_pdr_get_record_handle(
1720 repo, pldm_pdr_fru_record_set_find_by_rsi(
1721 repo, 5, &terminusHdl, &entityType,
1722 &entityInstanceNum, &containerId)));
1723 EXPECT_EQ(entityType, 2);
1724 EXPECT_EQ(entityInstanceNum, 90);
1725
1726 auto l6 = pldm_entity_association_tree_add(tree, &entities[6], 90, node,
1727 PLDM_ENTITY_ASSOCIAION_PHYSICAL);
1728 EXPECT_EQ(l6, nullptr);
1729
1730 auto l7 = pldm_entity_association_tree_add(tree, &entities[7], 100, l1,
1731 PLDM_ENTITY_ASSOCIAION_PHYSICAL);
Andrew Jeffery14d29842023-07-17 15:29:32 +09301732 uint32_t seventh = 7;
Andrew Jefferye7f55112024-06-20 16:16:01 +09301733 EXPECT_EQ(pldm_pdr_add_fru_record_set(repo, 1, 7, entities[7].entity_type,
1734 entities[7].entity_instance_num,
1735 entities[7].entity_container_id,
1736 &seventh),
Andrew Jeffery14d29842023-07-17 15:29:32 +09301737 0);
Andrew Jeffery9c766792022-08-10 23:12:49 +09301738 EXPECT_NE(l7, nullptr);
1739 EXPECT_EQ(entities[7].entity_instance_num, 100);
1740 EXPECT_EQ(seventh, pldm_pdr_get_record_handle(
1741 repo, pldm_pdr_fru_record_set_find_by_rsi(
1742 repo, 7, &terminusHdl, &entityType,
1743 &entityInstanceNum, &containerId)));
1744 EXPECT_EQ(entityType, 3);
1745 EXPECT_EQ(entityInstanceNum, 100);
1746
1747 auto l8 = pldm_entity_association_tree_add(tree, &entities[8], 100, l2,
1748 PLDM_ENTITY_ASSOCIAION_PHYSICAL);
Andrew Jeffery14d29842023-07-17 15:29:32 +09301749 uint32_t eighth = 8;
Andrew Jefferye7f55112024-06-20 16:16:01 +09301750 EXPECT_EQ(pldm_pdr_add_fru_record_set(repo, 1, 8, entities[8].entity_type,
1751 entities[8].entity_instance_num,
1752 entities[8].entity_container_id,
1753 &eighth),
Andrew Jeffery14d29842023-07-17 15:29:32 +09301754 0);
Andrew Jeffery9c766792022-08-10 23:12:49 +09301755 EXPECT_NE(l8, nullptr);
1756 EXPECT_EQ(entities[8].entity_instance_num, 100);
1757 EXPECT_EQ(eighth, pldm_pdr_get_record_handle(
1758 repo, pldm_pdr_fru_record_set_find_by_rsi(
1759 repo, 8, &terminusHdl, &entityType,
1760 &entityInstanceNum, &containerId)));
1761 EXPECT_EQ(entityType, 3);
1762 EXPECT_EQ(entityInstanceNum, 100);
1763
1764 pldm_pdr_destroy(repo);
1765 pldm_entity_association_tree_destroy(tree);
1766}
Pavithra Barithaya5dc02572023-05-19 09:24:36 -05001767
Andrew Jeffery14a5fe82023-06-26 15:31:37 +09301768#ifdef LIBPLDM_API_TESTING
Pavithra Barithaya8cf70452023-06-22 04:36:19 -05001769TEST(EntityAssociationPDR, testFindChildContainerID)
Pavithra Barithaya5dc02572023-05-19 09:24:36 -05001770{
1771 pldm_entity entities[3]{};
1772 entities[0].entity_type = 1;
1773 entities[1].entity_type = 2;
1774 entities[2].entity_type = 3;
1775 entities[1].entity_container_id = 2;
1776 entities[1].entity_instance_num = 1;
1777
1778 auto tree = pldm_entity_association_tree_init();
1779 auto l1 = pldm_entity_association_tree_add_entity(
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06001780 tree, &entities[0], 0xffff, nullptr, PLDM_ENTITY_ASSOCIAION_LOGICAL,
1781 false, true, 0xffff);
Pavithra Barithaya5dc02572023-05-19 09:24:36 -05001782
1783 EXPECT_NE(l1, nullptr);
1784 auto l2 = pldm_entity_association_tree_add_entity(
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06001785 tree, &entities[1], 0xffff, l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL, false,
1786 false, 0xffff);
Pavithra Barithaya5dc02572023-05-19 09:24:36 -05001787 EXPECT_NE(l2, nullptr);
1788 auto l3 = pldm_entity_association_tree_add_entity(
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06001789 tree, &entities[2], 0xffff, l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL, false,
1790 true, 0xffff);
Pavithra Barithaya5dc02572023-05-19 09:24:36 -05001791 EXPECT_NE(l3, nullptr);
1792
1793 EXPECT_EQ(pldm_entity_get_num_children(l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL),
1794 2);
1795
1796 auto repo = pldm_pdr_init();
Andrew Jefferyd72ea4b2024-06-24 21:33:33 +09301797 int rc = pldm_entity_association_pdr_add(tree, repo, false, 1);
Andrew Jeffery255f6542023-08-10 15:46:54 +09301798 ASSERT_EQ(rc, 0);
Pavithra Barithaya5dc02572023-05-19 09:24:36 -05001799
1800 EXPECT_EQ(pldm_pdr_get_record_count(repo), 1u);
1801
1802 uint16_t container_id{};
Pavithra Barithaya8cf70452023-06-22 04:36:19 -05001803 pldm_pdr_find_child_container_id_index_range_exclude(
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06001804 repo, 1, 1, 0, 0x01000000, 0x01ffffff, &container_id);
Pavithra Barithaya5dc02572023-05-19 09:24:36 -05001805 EXPECT_EQ(container_id, 2);
1806
1807 uint16_t container_id1{};
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, 0x00000001, 0x00ffffff, &container_id1);
Pavithra Barithaya5dc02572023-05-19 09:24:36 -05001810 EXPECT_EQ(container_id1, 0);
1811
1812 pldm_pdr_destroy(repo);
1813 pldm_entity_association_tree_destroy(tree);
1814}
Andrew Jeffery14a5fe82023-06-26 15:31:37 +09301815#endif
Pavithra Barithaya39eb3222023-11-17 03:30:27 -06001816
1817TEST(EntityAssociationPDR, testNodeAddCheck)
1818{
1819 // pldm_entity entities[4]{};
1820 pldm_entity* entities = (pldm_entity*)malloc(sizeof(pldm_entity) * 4);
1821 entities[0].entity_type = 1;
1822 entities[1].entity_type = 2;
1823 entities[2].entity_type = 2;
1824 entities[3].entity_type = 3;
1825
1826 auto tree = pldm_entity_association_tree_init();
1827
1828 auto l1 = pldm_entity_association_tree_add(
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06001829 tree, &entities[0], 0xffff, nullptr, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
Pavithra Barithaya39eb3222023-11-17 03:30:27 -06001830 EXPECT_NE(l1, nullptr);
1831 auto l2a = pldm_entity_association_tree_add(
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06001832 tree, &entities[1], 0xffff, l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
Pavithra Barithaya39eb3222023-11-17 03:30:27 -06001833 EXPECT_NE(l2a, nullptr);
1834 auto l2b = pldm_entity_association_tree_add(
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06001835 tree, &entities[2], 0xffff, l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
Pavithra Barithaya39eb3222023-11-17 03:30:27 -06001836 EXPECT_NE(l2b, nullptr);
1837 auto l2c = pldm_entity_association_tree_add(
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06001838 tree, &entities[3], 0xffff, l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
Pavithra Barithaya39eb3222023-11-17 03:30:27 -06001839 EXPECT_NE(l2c, nullptr);
1840
1841 auto repo = pldm_pdr_init();
1842
1843 EXPECT_EQ(pldm_entity_association_pdr_add_from_node_with_record_handle(
1844 l1, repo, &entities, 4, false, 1, 0),
1845 0);
1846 EXPECT_EQ(pldm_entity_association_pdr_add_from_node_with_record_handle(
1847 l1, repo, &entities, 4, false, 1, 2),
1848 0);
1849 EXPECT_EQ(pldm_entity_association_pdr_add_from_node_with_record_handle(
1850 l1, repo, &entities, 4, false, 1, 23),
1851 0);
1852 EXPECT_EQ(pldm_entity_association_pdr_add_from_node_with_record_handle(
1853 l1, repo, &entities, 4, false, 1, 34),
1854 0);
1855
1856 EXPECT_EQ(pldm_pdr_get_record_count(repo), 4u);
1857
1858 uint8_t* outData = nullptr;
1859 uint32_t size{};
1860 uint32_t nextRecHdl{};
1861 auto hdl = pldm_pdr_find_record(repo, 0, &outData, &size, &nextRecHdl);
1862 EXPECT_NE(hdl, nullptr);
1863
1864 outData = nullptr;
1865 auto hdl1 = pldm_pdr_find_record(repo, 2, &outData, &size, &nextRecHdl);
1866 EXPECT_NE(hdl1, nullptr);
1867 pldm_pdr_hdr* hdr = reinterpret_cast<pldm_pdr_hdr*>(outData);
1868 EXPECT_EQ(hdr->record_handle, 2);
1869
1870 outData = nullptr;
1871 auto hdl2 = pldm_pdr_find_record(repo, 23, &outData, &size, &nextRecHdl);
1872 EXPECT_NE(hdl2, nullptr);
1873 pldm_pdr_hdr* hdr1 = reinterpret_cast<pldm_pdr_hdr*>(outData);
1874 EXPECT_EQ(hdr1->record_handle, 23);
1875
1876 outData = nullptr;
1877 auto hdl3 = pldm_pdr_find_record(repo, 3, &outData, &size, &nextRecHdl);
1878 EXPECT_EQ(hdl3, nullptr);
1879
1880 free(entities);
1881 pldm_pdr_destroy(repo);
1882 pldm_entity_association_tree_destroy(tree);
1883}
Varsha Kaverappa37552b92024-02-12 05:06:06 -06001884
Andrew Jeffery1111a972024-06-03 13:39:18 +09301885#ifdef LIBPLDM_API_TESTING
Varsha Kaverappa37552b92024-02-12 05:06:06 -06001886TEST(EntityAssociationPDR, testAddContainedEntityRemotePDR)
1887{
1888 // pldm_entity entities[5]{};
1889 pldm_entity* entities = (pldm_entity*)malloc(sizeof(pldm_entity) * 5);
1890 entities[0].entity_type = 1;
1891 entities[1].entity_type = 2;
1892 entities[2].entity_type = 3;
1893 entities[3].entity_type = 4;
1894 entities[4].entity_type = 5;
1895
1896 auto tree = pldm_entity_association_tree_init();
1897 auto l1 = pldm_entity_association_tree_add(
1898 tree, &entities[0], 0xffff, nullptr, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
1899 EXPECT_NE(l1, nullptr);
1900 auto l2a = pldm_entity_association_tree_add(
1901 tree, &entities[1], 0xffff, l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
1902 EXPECT_NE(l2a, nullptr);
1903 auto l2b = pldm_entity_association_tree_add(
1904 tree, &entities[2], 0xffff, l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
1905 EXPECT_NE(l2b, nullptr);
1906 auto l2c = pldm_entity_association_tree_add(
1907 tree, &entities[3], 0xffff, l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
1908 EXPECT_NE(l2c, nullptr);
1909 auto l3a = pldm_entity_association_tree_add(
1910 tree, &entities[4], 0xffff, l2a, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
1911 EXPECT_NE(l3a, nullptr);
1912
1913 auto repo = pldm_pdr_init();
1914
1915 EXPECT_EQ(pldm_entity_association_pdr_add_from_node_with_record_handle(
1916 l1, repo, &entities, 5, false, 1, 0),
1917 0);
1918 EXPECT_EQ(pldm_entity_association_pdr_add_from_node_with_record_handle(
1919 l1, repo, &entities, 5, false, 1, 2),
1920 0);
1921 EXPECT_EQ(pldm_entity_association_pdr_add_from_node_with_record_handle(
1922 l1, repo, &entities, 5, false, 1, 23),
1923 0);
1924 EXPECT_EQ(pldm_entity_association_pdr_add_from_node_with_record_handle(
1925 l1, repo, &entities, 5, false, 1, 34),
1926 0);
1927 EXPECT_EQ(pldm_entity_association_pdr_add_from_node_with_record_handle(
1928 l2a, repo, &entities, 5, false, 1, 3),
1929 0);
1930
1931 pldm_entity entity1[1];
1932 entity1[0].entity_type = 2;
1933
1934 EXPECT_EQ(pldm_entity_association_pdr_add_contained_entity_to_remote_pdr(
1935 repo, &entity1[0], 2),
1936 0);
1937
1938 free(entities);
1939 pldm_pdr_destroy(repo);
1940 pldm_entity_association_tree_destroy(tree);
1941}
Andrew Jeffery1111a972024-06-03 13:39:18 +09301942#endif
Varsha Kaverappa37552b92024-02-12 05:06:06 -06001943
Andrew Jeffery1111a972024-06-03 13:39:18 +09301944#ifdef LIBPLDM_API_TESTING
Varsha Kaverappa37552b92024-02-12 05:06:06 -06001945TEST(EntityAssociationPDR, testAddContainedEntityNew)
1946{
1947 // pldm_entity entities[5]{};
1948 pldm_entity* entities = (pldm_entity*)malloc(sizeof(pldm_entity) * 5);
1949 entities[0].entity_type = 1;
1950 entities[1].entity_type = 2;
1951 entities[2].entity_type = 3;
1952 entities[3].entity_type = 4;
1953 entities[4].entity_type = 5;
1954
1955 auto tree = pldm_entity_association_tree_init();
1956 auto l1 = pldm_entity_association_tree_add(
1957 tree, &entities[0], 0xffff, nullptr, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
1958 EXPECT_NE(l1, nullptr);
1959 auto l2a = pldm_entity_association_tree_add(
1960 tree, &entities[1], 0xffff, l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
1961 EXPECT_NE(l2a, nullptr);
1962 auto l2b = pldm_entity_association_tree_add(
1963 tree, &entities[2], 0xffff, l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
1964 EXPECT_NE(l2b, nullptr);
1965 auto l2c = pldm_entity_association_tree_add(
1966 tree, &entities[3], 0xffff, l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
1967 EXPECT_NE(l2c, nullptr);
1968 auto l3a = pldm_entity_association_tree_add(
1969 tree, &entities[4], 0xffff, l2a, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
1970 EXPECT_NE(l3a, nullptr);
1971
1972 auto repo = pldm_pdr_init();
1973
1974 EXPECT_EQ(pldm_entity_association_pdr_add_from_node_with_record_handle(
1975 l1, repo, &entities, 5, false, 1, 0),
1976 0);
1977 EXPECT_EQ(pldm_entity_association_pdr_add_from_node_with_record_handle(
1978 l1, repo, &entities, 5, false, 1, 2),
1979 0);
1980 EXPECT_EQ(pldm_entity_association_pdr_add_from_node_with_record_handle(
1981 l1, repo, &entities, 5, false, 1, 23),
1982 0);
1983 EXPECT_EQ(pldm_entity_association_pdr_add_from_node_with_record_handle(
1984 l1, repo, &entities, 5, false, 1, 34),
1985 0);
1986 EXPECT_EQ(pldm_entity_association_pdr_add_from_node_with_record_handle(
1987 l2a, repo, &entities, 5, false, 1, 3),
1988 0);
1989
1990 uint32_t updated_record_handle = 0;
1991
1992 pldm_entity entity2[1]{};
1993 entity2[0].entity_type = 4;
1994
1995 pldm_entity entity3[1]{};
1996 entity3[0].entity_type = 4;
1997
1998 EXPECT_EQ(pldm_entity_association_pdr_create_new(
1999 repo, 34, &entity2[0], &entity3[0], &updated_record_handle),
2000 0);
2001
2002 EXPECT_EQ(updated_record_handle, 35);
2003
2004 free(entities);
2005 pldm_pdr_destroy(repo);
2006 pldm_entity_association_tree_destroy(tree);
2007}
Andrew Jeffery1111a972024-06-03 13:39:18 +09302008#endif
Varsha Kaverappab31e4c62024-06-25 06:45:46 -05002009
2010#ifdef LIBPLDM_API_TESTING
2011TEST(EntityAssociationPDR, testRemoveContainedEntity)
2012{
2013 struct pldm_entity entities[4] = {
2014 {.entity_type = 1, .entity_instance_num = 1, .entity_container_id = 2},
2015 {.entity_type = 2, .entity_instance_num = 1, .entity_container_id = 2},
2016 {.entity_type = 3, .entity_instance_num = 3, .entity_container_id = 3},
2017 {.entity_type = 4, .entity_instance_num = 1, .entity_container_id = 2}};
2018 struct pldm_entity* base = entities;
2019
2020 auto tree = pldm_entity_association_tree_init();
2021 auto l1 = pldm_entity_association_tree_add_entity(
2022 tree, &entities[0], 0xffff, nullptr, PLDM_ENTITY_ASSOCIAION_LOGICAL,
2023 false, true, 0xffff);
2024
2025 EXPECT_NE(l1, nullptr);
2026 auto l2 = pldm_entity_association_tree_add_entity(
2027 tree, &entities[1], 0xffff, l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL, false,
2028 false, 0xffff);
2029 EXPECT_NE(l2, nullptr);
2030 auto l3 = pldm_entity_association_tree_add_entity(
2031 tree, &entities[2], 0xffff, l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL, false,
2032 true, 0xffff);
2033 EXPECT_NE(l3, nullptr);
2034 auto l4 = pldm_entity_association_tree_add_entity(
2035 tree, &entities[3], 0xffff, l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL, false,
2036 true, 0xffff);
2037 EXPECT_NE(l4, nullptr);
2038
2039 EXPECT_EQ(pldm_entity_get_num_children(l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL),
2040 3);
2041
2042 auto repo = pldm_pdr_init();
2043
2044 EXPECT_EQ(pldm_entity_association_pdr_add_from_node_with_record_handle(
2045 l1, repo, &base, 4, false, 1, 3),
2046 0);
2047
2048 EXPECT_EQ(pldm_pdr_get_record_count(repo), 1u);
2049
2050 uint32_t removed_record_handle{};
2051 struct pldm_entity entity[1] = {
2052 {.entity_type = 2, .entity_instance_num = 1, .entity_container_id = 2}};
2053
2054 EXPECT_EQ(pldm_entity_association_pdr_remove_contained_entity(
2055 repo, entity, false, &removed_record_handle),
2056 0);
2057 EXPECT_EQ(removed_record_handle, 3);
2058
2059 pldm_pdr_destroy(repo);
2060 pldm_entity_association_tree_destroy(tree);
2061}
2062#endif