blob: 2ca79b73404c120bcd4dbdd0b69c1360bd070564 [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>
Archana Kakani94e2d752024-12-12 08:22:55 -06004#include <msgbuf.h>
Manojkiran Eda9a8e4972022-11-28 16:38:21 +05305
Andrew Jeffery9c766792022-08-10 23:12:49 +09306#include <array>
Manojkiran Eda9a8e4972022-11-28 16:38:21 +05307#include <cstdint>
Andrew Jeffery5a706072023-04-05 19:45:31 +09308#include <cstdlib>
9#include <cstring>
Manojkiran Eda9a8e4972022-11-28 16:38:21 +053010#include <vector>
Andrew Jeffery9c766792022-08-10 23:12:49 +093011
Andrew Jeffery9c766792022-08-10 23:12:49 +093012#include <gtest/gtest.h>
13
14TEST(PDRAccess, testInit)
15{
16 auto repo = pldm_pdr_init();
17 EXPECT_EQ(pldm_pdr_get_record_count(repo), 0u);
18 EXPECT_EQ(pldm_pdr_get_repo_size(repo), 0u);
19 pldm_pdr_destroy(repo);
20}
21
22TEST(PDRUpdate, testAdd)
23{
24 auto repo = pldm_pdr_init();
25
26 std::array<uint8_t, 10> data{};
Andrew Jefferyc79a5df2023-07-17 15:09:21 +093027 uint32_t handle = 0;
Andrew Jefferyfae36412024-06-20 06:35:51 +000028 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), false, 1, &handle),
29 0);
Andrew Jeffery9c766792022-08-10 23:12:49 +093030 EXPECT_EQ(handle, 1u);
31 EXPECT_EQ(pldm_pdr_get_record_count(repo), 1u);
32 EXPECT_EQ(pldm_pdr_get_repo_size(repo), data.size());
33
Andrew Jefferyc79a5df2023-07-17 15:09:21 +093034 handle = 0;
Andrew Jefferyfae36412024-06-20 06:35:51 +000035 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), false, 1, &handle),
36 0);
Andrew Jeffery9c766792022-08-10 23:12:49 +093037 EXPECT_EQ(handle, 2u);
Andrew Jefferyc79a5df2023-07-17 15:09:21 +093038
39 handle = 0;
Andrew Jefferyfae36412024-06-20 06:35:51 +000040 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), false, 1, &handle),
41 0);
Andrew Jeffery9c766792022-08-10 23:12:49 +093042 EXPECT_EQ(handle, 3u);
Andrew Jefferyc79a5df2023-07-17 15:09:21 +093043
44 handle = 0xdeeddeedu;
Andrew Jefferyfae36412024-06-20 06:35:51 +000045 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), false, 1, &handle),
46 0);
Andrew Jefferyc79a5df2023-07-17 15:09:21 +093047 EXPECT_EQ(handle, 0xdeeddeed);
Andrew Jeffery9c766792022-08-10 23:12:49 +093048 EXPECT_EQ(pldm_pdr_get_record_count(repo), 4u);
49 EXPECT_EQ(pldm_pdr_get_repo_size(repo), data.size() * 4u);
50
51 pldm_pdr_destroy(repo);
52}
53
54TEST(PDRRemoveByTerminus, testRemoveByTerminus)
55{
56 std::array<uint8_t, 10> data{};
57
58 auto repo = pldm_pdr_init();
Andrew Jefferyc79a5df2023-07-17 15:09:21 +093059
Andrew Jefferyfae36412024-06-20 06:35:51 +000060 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), false, 1, NULL), 0);
Andrew Jeffery9c766792022-08-10 23:12:49 +093061 pldm_pdr_remove_pdrs_by_terminus_handle(repo, 1);
62 EXPECT_EQ(pldm_pdr_get_record_count(repo), 0u);
63 pldm_pdr_destroy(repo);
64
65 repo = pldm_pdr_init();
Andrew Jefferyfae36412024-06-20 06:35:51 +000066 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), true, 2, NULL), 0);
67 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), true, 1, NULL), 0);
Andrew Jeffery9c766792022-08-10 23:12:49 +093068 EXPECT_EQ(pldm_pdr_get_record_count(repo), 2u);
69 pldm_pdr_remove_pdrs_by_terminus_handle(repo, 1);
70 EXPECT_EQ(pldm_pdr_get_record_count(repo), 1u);
71 pldm_pdr_destroy(repo);
72
73 repo = pldm_pdr_init();
Andrew Jefferyfae36412024-06-20 06:35:51 +000074 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), true, 1, NULL), 0);
75 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), true, 2, NULL), 0);
76 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), true, 2, NULL), 0);
Andrew Jeffery9c766792022-08-10 23:12:49 +093077 EXPECT_EQ(pldm_pdr_get_record_count(repo), 3u);
78 pldm_pdr_remove_pdrs_by_terminus_handle(repo, 2);
79 EXPECT_EQ(pldm_pdr_get_record_count(repo), 1u);
80 pldm_pdr_destroy(repo);
81
82 repo = pldm_pdr_init();
Andrew Jefferyfae36412024-06-20 06:35:51 +000083 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), true, 1, NULL), 0);
84 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), false, 2, NULL), 0);
85 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), true, 1, NULL), 0);
Andrew Jeffery9c766792022-08-10 23:12:49 +093086 EXPECT_EQ(pldm_pdr_get_record_count(repo), 3u);
87 pldm_pdr_remove_remote_pdrs(repo);
88 EXPECT_EQ(pldm_pdr_get_record_count(repo), 1u);
89 pldm_pdr_remove_pdrs_by_terminus_handle(repo, 1);
90 EXPECT_EQ(pldm_pdr_get_record_count(repo), 1u);
91 pldm_pdr_remove_pdrs_by_terminus_handle(repo, 2);
92 EXPECT_EQ(pldm_pdr_get_record_count(repo), 0u);
93 pldm_pdr_destroy(repo);
94}
95
96TEST(PDRUpdate, testRemove)
97{
98 std::array<uint8_t, 10> data{};
99
100 auto repo = pldm_pdr_init();
101 pldm_pdr_remove_remote_pdrs(repo);
102 EXPECT_EQ(pldm_pdr_get_record_count(repo), 0u);
103 pldm_pdr_destroy(repo);
104
105 repo = pldm_pdr_init();
Andrew Jefferyfae36412024-06-20 06:35:51 +0000106 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), true, 1, NULL), 0);
Andrew Jeffery9c766792022-08-10 23:12:49 +0930107 pldm_pdr_remove_remote_pdrs(repo);
108 EXPECT_EQ(pldm_pdr_get_record_count(repo), 0u);
109 pldm_pdr_destroy(repo);
110
111 repo = pldm_pdr_init();
Andrew Jefferyfae36412024-06-20 06:35:51 +0000112 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), false, 1, NULL), 0);
Andrew Jeffery9c766792022-08-10 23:12:49 +0930113 pldm_pdr_remove_remote_pdrs(repo);
114 EXPECT_EQ(pldm_pdr_get_record_count(repo), 1u);
115 pldm_pdr_destroy(repo);
116
117 repo = pldm_pdr_init();
Andrew Jefferyfae36412024-06-20 06:35:51 +0000118 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), false, 1, NULL), 0);
119 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), true, 1, NULL), 0);
Andrew Jeffery9c766792022-08-10 23:12:49 +0930120 pldm_pdr_remove_remote_pdrs(repo);
121 EXPECT_EQ(pldm_pdr_get_record_count(repo), 1u);
122 pldm_pdr_destroy(repo);
123
124 repo = pldm_pdr_init();
Andrew Jefferyfae36412024-06-20 06:35:51 +0000125 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), true, 1, NULL), 0);
126 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), false, 1, NULL), 0);
Andrew Jeffery9c766792022-08-10 23:12:49 +0930127 pldm_pdr_remove_remote_pdrs(repo);
128 EXPECT_EQ(pldm_pdr_get_record_count(repo), 1u);
129 pldm_pdr_destroy(repo);
130
131 repo = pldm_pdr_init();
Andrew Jefferyfae36412024-06-20 06:35:51 +0000132 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), true, 1, NULL), 0);
133 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), true, 1, NULL), 0);
134 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), true, 1, NULL), 0);
135 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), true, 1, NULL), 0);
Andrew Jeffery9c766792022-08-10 23:12:49 +0930136 pldm_pdr_remove_remote_pdrs(repo);
137 EXPECT_EQ(pldm_pdr_get_record_count(repo), 0u);
Andrew Jefferyfae36412024-06-20 06:35:51 +0000138 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), true, 1, NULL), 0);
139 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), false, 1, NULL), 0);
Andrew Jeffery9c766792022-08-10 23:12:49 +0930140 EXPECT_EQ(pldm_pdr_get_record_count(repo), 2u);
141 pldm_pdr_destroy(repo);
142
143 repo = pldm_pdr_init();
Andrew Jefferyfae36412024-06-20 06:35:51 +0000144 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), false, 1, NULL), 0);
145 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), false, 1, NULL), 0);
146 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), false, 1, NULL), 0);
147 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), false, 1, NULL), 0);
Andrew Jeffery9c766792022-08-10 23:12:49 +0930148 pldm_pdr_remove_remote_pdrs(repo);
149 EXPECT_EQ(pldm_pdr_get_record_count(repo), 4u);
Andrew Jefferyfae36412024-06-20 06:35:51 +0000150 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), true, 1, NULL), 0);
151 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), false, 1, NULL), 0);
Andrew Jeffery9c766792022-08-10 23:12:49 +0930152 EXPECT_EQ(pldm_pdr_get_record_count(repo), 6u);
153 pldm_pdr_destroy(repo);
154
155 repo = pldm_pdr_init();
Andrew Jefferyfae36412024-06-20 06:35:51 +0000156 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), true, 1, NULL), 0);
157 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), false, 1, NULL), 0);
158 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), false, 1, NULL), 0);
159 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), false, 1, NULL), 0);
Andrew Jeffery9c766792022-08-10 23:12:49 +0930160 pldm_pdr_remove_remote_pdrs(repo);
161 EXPECT_EQ(pldm_pdr_get_record_count(repo), 3u);
Andrew Jefferyfae36412024-06-20 06:35:51 +0000162 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), true, 1, NULL), 0);
163 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), false, 1, NULL), 0);
Andrew Jeffery9c766792022-08-10 23:12:49 +0930164 EXPECT_EQ(pldm_pdr_get_record_count(repo), 5u);
165 pldm_pdr_destroy(repo);
166
167 repo = pldm_pdr_init();
Andrew Jefferyfae36412024-06-20 06:35:51 +0000168 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(), false, 1, NULL), 0);
171 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), true, 1, NULL), 0);
Andrew Jeffery9c766792022-08-10 23:12:49 +0930172 pldm_pdr_remove_remote_pdrs(repo);
173 EXPECT_EQ(pldm_pdr_get_record_count(repo), 3u);
Andrew Jefferyfae36412024-06-20 06:35:51 +0000174 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), true, 1, NULL), 0);
175 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), false, 1, NULL), 0);
Andrew Jeffery9c766792022-08-10 23:12:49 +0930176 EXPECT_EQ(pldm_pdr_get_record_count(repo), 5u);
177 pldm_pdr_destroy(repo);
178
179 repo = pldm_pdr_init();
Andrew Jefferyfae36412024-06-20 06:35:51 +0000180 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), true, 1, NULL), 0);
181 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), false, 1, NULL), 0);
182 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), true, 1, NULL), 0);
183 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), false, 1, NULL), 0);
Andrew Jeffery9c766792022-08-10 23:12:49 +0930184 pldm_pdr_remove_remote_pdrs(repo);
185 EXPECT_EQ(pldm_pdr_get_record_count(repo), 2u);
Andrew Jefferyfae36412024-06-20 06:35:51 +0000186 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), false, 1, NULL), 0);
187 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), true, 1, NULL), 0);
Andrew Jeffery9c766792022-08-10 23:12:49 +0930188 EXPECT_EQ(pldm_pdr_get_record_count(repo), 4u);
189 pldm_pdr_destroy(repo);
190
191 repo = pldm_pdr_init();
Andrew Jefferyfae36412024-06-20 06:35:51 +0000192 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(), false, 1, NULL), 0);
195 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), true, 1, NULL), 0);
Andrew Jeffery9c766792022-08-10 23:12:49 +0930196 pldm_pdr_remove_remote_pdrs(repo);
197 EXPECT_EQ(pldm_pdr_get_record_count(repo), 3u);
Andrew Jefferyfae36412024-06-20 06:35:51 +0000198 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), false, 1, NULL), 0);
199 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), true, 1, NULL), 0);
Andrew Jeffery9c766792022-08-10 23:12:49 +0930200 EXPECT_EQ(pldm_pdr_get_record_count(repo), 5u);
201 pldm_pdr_destroy(repo);
202
203 repo = pldm_pdr_init();
Andrew Jefferyfae36412024-06-20 06:35:51 +0000204 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), false, 1, NULL), 0);
205 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), true, 1, NULL), 0);
206 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), false, 1, NULL), 0);
207 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), true, 1, NULL), 0);
Andrew Jeffery9c766792022-08-10 23:12:49 +0930208 pldm_pdr_remove_remote_pdrs(repo);
209 EXPECT_EQ(pldm_pdr_get_record_count(repo), 2u);
Andrew Jefferyfae36412024-06-20 06:35:51 +0000210 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), false, 1, NULL), 0);
211 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), true, 1, NULL), 0);
Andrew Jeffery9c766792022-08-10 23:12:49 +0930212 EXPECT_EQ(pldm_pdr_get_record_count(repo), 4u);
213 pldm_pdr_destroy(repo);
214
215 repo = pldm_pdr_init();
Andrew Jefferyfae36412024-06-20 06:35:51 +0000216 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(), true, 1, NULL), 0);
219 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), false, 1, NULL), 0);
Andrew Jeffery9c766792022-08-10 23:12:49 +0930220 pldm_pdr_remove_remote_pdrs(repo);
221 EXPECT_EQ(pldm_pdr_get_record_count(repo), 1u);
Andrew Jefferyfae36412024-06-20 06:35:51 +0000222 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), false, 1, NULL), 0);
223 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), true, 1, NULL), 0);
Andrew Jeffery9c766792022-08-10 23:12:49 +0930224 EXPECT_EQ(pldm_pdr_get_record_count(repo), 3u);
225 pldm_pdr_destroy(repo);
226
227 repo = pldm_pdr_init();
Andrew Jefferyfae36412024-06-20 06:35:51 +0000228 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), false, 1, NULL), 0);
229 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), true, 1, NULL), 0);
230 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), true, 1, NULL), 0);
231 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), true, 1, NULL), 0);
Andrew Jeffery9c766792022-08-10 23:12:49 +0930232 pldm_pdr_remove_remote_pdrs(repo);
233 EXPECT_EQ(pldm_pdr_get_record_count(repo), 1u);
Andrew Jefferyfae36412024-06-20 06:35:51 +0000234 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), false, 1, NULL), 0);
235 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), true, 1, NULL), 0);
Andrew Jeffery9c766792022-08-10 23:12:49 +0930236 EXPECT_EQ(pldm_pdr_get_record_count(repo), 3u);
237 pldm_pdr_destroy(repo);
238
239 repo = pldm_pdr_init();
Andrew Jefferyfae36412024-06-20 06:35:51 +0000240 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), false, 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(), true, 1, NULL), 0);
243 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), false, 1, NULL), 0);
Andrew Jeffery9c766792022-08-10 23:12:49 +0930244 pldm_pdr_remove_remote_pdrs(repo);
245 EXPECT_EQ(pldm_pdr_get_record_count(repo), 2u);
Andrew Jefferyfae36412024-06-20 06:35:51 +0000246 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), false, 1, NULL), 0);
247 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), true, 1, NULL), 0);
Andrew Jeffery9c766792022-08-10 23:12:49 +0930248 EXPECT_EQ(pldm_pdr_get_record_count(repo), 4u);
249 pldm_pdr_destroy(repo);
250
251 repo = pldm_pdr_init();
Andrew Jefferyfae36412024-06-20 06:35:51 +0000252 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), true, 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(), false, 1, NULL), 0);
255 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), true, 1, NULL), 0);
Andrew Jeffery9c766792022-08-10 23:12:49 +0930256 pldm_pdr_remove_remote_pdrs(repo);
257 EXPECT_EQ(pldm_pdr_get_record_count(repo), 2u);
Andrew Jefferyc79a5df2023-07-17 15:09:21 +0930258 uint32_t handle = 0;
Andrew Jefferyfae36412024-06-20 06:35:51 +0000259 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), false, 1, &handle),
260 0);
Andrew Jeffery9c766792022-08-10 23:12:49 +0930261 EXPECT_EQ(handle, 3u);
Andrew Jefferyc79a5df2023-07-17 15:09:21 +0930262 handle = 0;
Andrew Jefferyfae36412024-06-20 06:35:51 +0000263 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), true, 1, &handle),
264 0);
Andrew Jeffery9c766792022-08-10 23:12:49 +0930265 EXPECT_EQ(handle, 4u);
266 EXPECT_EQ(pldm_pdr_get_record_count(repo), 4u);
267 pldm_pdr_destroy(repo);
268}
269
270TEST(PDRAccess, testGet)
271{
272 auto repo = pldm_pdr_init();
273
274 std::array<uint32_t, 10> in{100, 345, 3, 6, 89, 0, 11, 45, 23434, 123123};
Andrew Jefferyc79a5df2023-07-17 15:09:21 +0930275 uint32_t handle = 1;
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +0930276 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Andrew Jefferyfae36412024-06-20 06:35:51 +0000277 EXPECT_EQ(pldm_pdr_add(repo, reinterpret_cast<uint8_t*>(in.data()),
278 sizeof(in), false, 1, &handle),
Andrew Jefferyc79a5df2023-07-17 15:09:21 +0930279 0);
Andrew Jeffery9c766792022-08-10 23:12:49 +0930280 EXPECT_EQ(pldm_pdr_get_record_count(repo), 1u);
281 EXPECT_EQ(pldm_pdr_get_repo_size(repo), sizeof(in));
282 uint32_t size{};
283 uint32_t nextRecHdl{};
284 uint8_t* outData = nullptr;
285 auto hdl = pldm_pdr_find_record(repo, 0, &outData, &size, &nextRecHdl);
286 EXPECT_NE(hdl, nullptr);
287 EXPECT_EQ(size, sizeof(in));
288 EXPECT_EQ(nextRecHdl, 0u);
289 EXPECT_EQ(memcmp(outData, in.data(), sizeof(in)), 0);
290 outData = nullptr;
291
292 auto hdl2 = pldm_pdr_find_record(repo, 1, &outData, &size, &nextRecHdl);
293 EXPECT_EQ(hdl, hdl2);
294 EXPECT_NE(hdl, nullptr);
295 EXPECT_EQ(size, sizeof(in));
296 EXPECT_EQ(nextRecHdl, 0u);
297 EXPECT_EQ(memcmp(outData, in.data(), sizeof(in)), 0);
298 outData = nullptr;
299
300 hdl = pldm_pdr_find_record(repo, htole32(0xdeaddead), &outData, &size,
301 &nextRecHdl);
302 EXPECT_EQ(hdl, nullptr);
303 EXPECT_EQ(size, 0u);
304 EXPECT_EQ(nextRecHdl, 0u);
305 EXPECT_EQ(outData, nullptr);
306 outData = nullptr;
307
308 std::array<uint32_t, 10> in2{1000, 3450, 30, 60, 890,
309 0, 110, 450, 234034, 123123};
Andrew Jefferyc79a5df2023-07-17 15:09:21 +0930310 handle = 2;
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +0930311 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Andrew Jefferyfae36412024-06-20 06:35:51 +0000312 EXPECT_EQ(pldm_pdr_add(repo, reinterpret_cast<uint8_t*>(in2.data()),
313 sizeof(in2), false, 1, &handle),
Andrew Jefferyc79a5df2023-07-17 15:09:21 +0930314 0);
315 handle = 3;
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +0930316 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Andrew Jefferyfae36412024-06-20 06:35:51 +0000317 EXPECT_EQ(pldm_pdr_add(repo, reinterpret_cast<uint8_t*>(in2.data()),
318 sizeof(in2), false, 1, &handle),
Andrew Jefferyc79a5df2023-07-17 15:09:21 +0930319 0);
320 handle = 4;
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +0930321 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Andrew Jefferyfae36412024-06-20 06:35:51 +0000322 EXPECT_EQ(pldm_pdr_add(repo, reinterpret_cast<uint8_t*>(in2.data()),
323 sizeof(in2), true, 1, &handle),
Andrew Jefferyc79a5df2023-07-17 15:09:21 +0930324 0);
Andrew Jeffery9c766792022-08-10 23:12:49 +0930325 EXPECT_EQ(pldm_pdr_get_record_count(repo), 4u);
326 EXPECT_EQ(pldm_pdr_get_repo_size(repo), sizeof(in2) * 4);
327 hdl = pldm_pdr_find_record(repo, 0, &outData, &size, &nextRecHdl);
328 EXPECT_NE(hdl, nullptr);
329 EXPECT_EQ(size, sizeof(in));
330 EXPECT_EQ(nextRecHdl, 2u);
331 EXPECT_EQ(memcmp(outData, in.data(), sizeof(in)), 0);
332 outData = nullptr;
333 hdl2 = pldm_pdr_find_record(repo, 1, &outData, &size, &nextRecHdl);
334 EXPECT_EQ(hdl, hdl2);
335 EXPECT_NE(hdl, nullptr);
336 EXPECT_EQ(size, sizeof(in));
337 EXPECT_EQ(nextRecHdl, 2u);
338 EXPECT_EQ(memcmp(outData, in.data(), sizeof(in)), 0);
339 outData = nullptr;
340 hdl = pldm_pdr_find_record(repo, 2, &outData, &size, &nextRecHdl);
341 EXPECT_NE(hdl, nullptr);
342 EXPECT_EQ(size, sizeof(in2));
343 EXPECT_EQ(nextRecHdl, 3u);
344 EXPECT_EQ(memcmp(outData, in2.data(), sizeof(in2)), 0);
345 outData = nullptr;
346 hdl = pldm_pdr_find_record(repo, 3, &outData, &size, &nextRecHdl);
347 EXPECT_NE(hdl, nullptr);
348 EXPECT_EQ(pldm_pdr_record_is_remote(hdl), false);
349 EXPECT_EQ(size, sizeof(in2));
350 EXPECT_EQ(nextRecHdl, 4u);
351 EXPECT_EQ(memcmp(outData, in2.data(), sizeof(in2)), 0);
352 outData = nullptr;
353 hdl = pldm_pdr_find_record(repo, 4, &outData, &size, &nextRecHdl);
354 EXPECT_NE(hdl, nullptr);
355 EXPECT_EQ(pldm_pdr_record_is_remote(hdl), true);
356 EXPECT_EQ(size, sizeof(in2));
357 EXPECT_EQ(nextRecHdl, 0u);
358 EXPECT_EQ(memcmp(outData, in2.data(), sizeof(in2)), 0);
359 outData = nullptr;
360
361 pldm_pdr_destroy(repo);
362}
363
364TEST(PDRAccess, testGetNext)
365{
366 auto repo = pldm_pdr_init();
367
368 std::array<uint32_t, 10> in{100, 345, 3, 6, 89, 0, 11, 45, 23434, 123123};
Andrew Jefferyc79a5df2023-07-17 15:09:21 +0930369 uint32_t handle = 1;
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +0930370 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Andrew Jefferyfae36412024-06-20 06:35:51 +0000371 EXPECT_EQ(pldm_pdr_add(repo, reinterpret_cast<uint8_t*>(in.data()),
372 sizeof(in), false, 1, &handle),
Andrew Jefferyc79a5df2023-07-17 15:09:21 +0930373 0);
Andrew Jeffery9c766792022-08-10 23:12:49 +0930374 EXPECT_EQ(pldm_pdr_get_record_count(repo), 1u);
375 EXPECT_EQ(pldm_pdr_get_repo_size(repo), sizeof(in));
376 uint32_t size{};
377 uint32_t nextRecHdl{};
378 uint8_t* outData = nullptr;
379 auto hdl = pldm_pdr_find_record(repo, 0, &outData, &size, &nextRecHdl);
380 EXPECT_NE(hdl, nullptr);
381 EXPECT_EQ(size, sizeof(in));
382 EXPECT_EQ(nextRecHdl, 0u);
383 EXPECT_EQ(memcmp(outData, in.data(), sizeof(in)), 0);
384 outData = nullptr;
385
386 std::array<uint32_t, 10> in2{1000, 3450, 30, 60, 890,
387 0, 110, 450, 234034, 123123};
Andrew Jefferyc79a5df2023-07-17 15:09:21 +0930388 handle = 2;
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +0930389 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Andrew Jefferyfae36412024-06-20 06:35:51 +0000390 EXPECT_EQ(pldm_pdr_add(repo, reinterpret_cast<uint8_t*>(in2.data()),
391 sizeof(in2), false, 1, &handle),
Andrew Jefferyc79a5df2023-07-17 15:09:21 +0930392 0);
393 handle = 3;
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +0930394 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Andrew Jefferyfae36412024-06-20 06:35:51 +0000395 EXPECT_EQ(pldm_pdr_add(repo, reinterpret_cast<uint8_t*>(in2.data()),
396 sizeof(in2), false, 1, &handle),
Andrew Jefferyc79a5df2023-07-17 15:09:21 +0930397 0);
398 handle = 4;
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +0930399 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Andrew Jefferyfae36412024-06-20 06:35:51 +0000400 EXPECT_EQ(pldm_pdr_add(repo, reinterpret_cast<uint8_t*>(in2.data()),
401 sizeof(in2), false, 1, &handle),
Andrew Jefferyc79a5df2023-07-17 15:09:21 +0930402 0);
Andrew Jeffery9c766792022-08-10 23:12:49 +0930403 EXPECT_EQ(pldm_pdr_get_record_count(repo), 4u);
404 EXPECT_EQ(pldm_pdr_get_repo_size(repo), sizeof(in2) * 4);
405 hdl = pldm_pdr_get_next_record(repo, hdl, &outData, &size, &nextRecHdl);
406 EXPECT_NE(hdl, nullptr);
407 EXPECT_EQ(size, sizeof(in2));
408 EXPECT_EQ(nextRecHdl, 3u);
409 EXPECT_EQ(memcmp(outData, in2.data(), sizeof(in2)), 0);
410 outData = nullptr;
411 hdl = pldm_pdr_get_next_record(repo, hdl, &outData, &size, &nextRecHdl);
412 EXPECT_NE(hdl, nullptr);
413 EXPECT_EQ(size, sizeof(in2));
414 EXPECT_EQ(nextRecHdl, 4u);
415 EXPECT_EQ(memcmp(outData, in2.data(), sizeof(in2)), 0);
416 outData = nullptr;
417 hdl = pldm_pdr_get_next_record(repo, hdl, &outData, &size, &nextRecHdl);
418 EXPECT_NE(hdl, nullptr);
419 EXPECT_EQ(size, sizeof(in2));
420 EXPECT_EQ(nextRecHdl, 0u);
421 EXPECT_EQ(memcmp(outData, in2.data(), sizeof(in2)), 0);
422 outData = nullptr;
423
424 pldm_pdr_destroy(repo);
425}
426
427TEST(PDRAccess, testFindByType)
428{
429 auto repo = pldm_pdr_init();
430
431 std::array<uint8_t, sizeof(pldm_pdr_hdr)> data{};
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +0930432 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Andrew Jeffery9c766792022-08-10 23:12:49 +0930433 pldm_pdr_hdr* hdr = reinterpret_cast<pldm_pdr_hdr*>(data.data());
434 hdr->type = 1;
Andrew Jefferyc79a5df2023-07-17 15:09:21 +0930435 uint32_t first = 0;
Andrew Jefferyfae36412024-06-20 06:35:51 +0000436 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), false, 1, &first),
437 0);
Andrew Jeffery9c766792022-08-10 23:12:49 +0930438 hdr->type = 2;
Andrew Jefferyc79a5df2023-07-17 15:09:21 +0930439 uint32_t second = 0;
Andrew Jefferyfae36412024-06-20 06:35:51 +0000440 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), false, 1, &second),
441 0);
Andrew Jeffery9c766792022-08-10 23:12:49 +0930442 hdr->type = 3;
Andrew Jefferyc79a5df2023-07-17 15:09:21 +0930443 uint32_t third = 0;
Andrew Jefferyfae36412024-06-20 06:35:51 +0000444 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), false, 1, &third),
445 0);
Andrew Jeffery9c766792022-08-10 23:12:49 +0930446 hdr->type = 4;
Andrew Jefferyc79a5df2023-07-17 15:09:21 +0930447 uint32_t fourth = 0;
Andrew Jefferyfae36412024-06-20 06:35:51 +0000448 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), false, 1, &fourth),
449 0);
Andrew Jeffery9c766792022-08-10 23:12:49 +0930450
451 uint8_t* outData = nullptr;
452 uint32_t size{};
453 auto firstRec =
454 pldm_pdr_find_record_by_type(repo, 1, nullptr, &outData, &size);
455 EXPECT_EQ(pldm_pdr_get_record_handle(repo, firstRec), first);
456 outData = nullptr;
457 auto secondRec =
458 pldm_pdr_find_record_by_type(repo, 2, nullptr, &outData, &size);
459 EXPECT_EQ(pldm_pdr_get_record_handle(repo, secondRec), second);
460 outData = nullptr;
461 auto thirdRec =
462 pldm_pdr_find_record_by_type(repo, 3, nullptr, &outData, &size);
463 EXPECT_EQ(pldm_pdr_get_record_handle(repo, thirdRec), third);
464 outData = nullptr;
465 auto fourthRec =
466 pldm_pdr_find_record_by_type(repo, 4, nullptr, &outData, &size);
467 EXPECT_EQ(pldm_pdr_get_record_handle(repo, fourthRec), fourth);
468 outData = nullptr;
469 auto fifthRec =
470 pldm_pdr_find_record_by_type(repo, 5, nullptr, &outData, &size);
471 EXPECT_EQ(fifthRec, nullptr);
472 EXPECT_EQ(outData, nullptr);
473 EXPECT_EQ(size, 0u);
474
475 auto rec =
476 pldm_pdr_find_record_by_type(repo, 3, secondRec, &outData, &size);
477 EXPECT_EQ(pldm_pdr_get_record_handle(repo, rec), third);
478 outData = nullptr;
479 rec = pldm_pdr_find_record_by_type(repo, 4, secondRec, &outData, &size);
480 EXPECT_EQ(pldm_pdr_get_record_handle(repo, rec), fourth);
481 outData = nullptr;
482 rec = pldm_pdr_find_record_by_type(repo, 2, firstRec, &outData, &size);
483 EXPECT_EQ(pldm_pdr_get_record_handle(repo, rec), second);
484 outData = nullptr;
485
486 pldm_pdr_destroy(repo);
487}
488
489TEST(PDRUpdate, testAddFruRecordSet)
490{
491 auto repo = pldm_pdr_init();
492
Andrew Jeffery14d29842023-07-17 15:29:32 +0930493 uint32_t handle = 0;
Andrew Jefferye7f55112024-06-20 16:16:01 +0930494 EXPECT_EQ(pldm_pdr_add_fru_record_set(repo, 1, 10, 1, 0, 100, &handle), 0);
Andrew Jeffery9c766792022-08-10 23:12:49 +0930495 EXPECT_EQ(handle, 1u);
496 EXPECT_EQ(pldm_pdr_get_record_count(repo), 1u);
497 EXPECT_EQ(pldm_pdr_get_repo_size(repo),
498 sizeof(pldm_pdr_hdr) + sizeof(pldm_pdr_fru_record_set));
499 uint32_t size{};
500 uint32_t nextRecHdl{};
501 uint8_t* outData = nullptr;
502 auto hdl = pldm_pdr_find_record(repo, 0, &outData, &size, &nextRecHdl);
503 EXPECT_NE(hdl, nullptr);
504 EXPECT_EQ(size, sizeof(pldm_pdr_hdr) + sizeof(pldm_pdr_fru_record_set));
505 EXPECT_EQ(nextRecHdl, 0u);
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +0930506 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Andrew Jeffery9c766792022-08-10 23:12:49 +0930507 pldm_pdr_hdr* hdr = reinterpret_cast<pldm_pdr_hdr*>(outData);
508 EXPECT_EQ(hdr->version, 1u);
509 EXPECT_EQ(hdr->type, PLDM_PDR_FRU_RECORD_SET);
510 EXPECT_EQ(hdr->length, htole16(sizeof(pldm_pdr_fru_record_set)));
511 EXPECT_EQ(hdr->record_handle, htole32(1));
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +0930512 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Andrew Jeffery9c766792022-08-10 23:12:49 +0930513 pldm_pdr_fru_record_set* fru = reinterpret_cast<pldm_pdr_fru_record_set*>(
514 outData + sizeof(pldm_pdr_hdr));
515 EXPECT_EQ(fru->terminus_handle, htole16(1));
516 EXPECT_EQ(fru->fru_rsi, htole16(10));
517 EXPECT_EQ(fru->entity_type, htole16(1));
518 EXPECT_EQ(fru->entity_instance_num, htole16(0));
519 EXPECT_EQ(fru->container_id, htole16(100));
520 outData = nullptr;
521
Andrew Jeffery14d29842023-07-17 15:29:32 +0930522 handle = 0;
Andrew Jefferye7f55112024-06-20 16:16:01 +0930523 EXPECT_EQ(pldm_pdr_add_fru_record_set(repo, 2, 11, 2, 1, 101, &handle), 0);
Andrew Jeffery9c766792022-08-10 23:12:49 +0930524 EXPECT_EQ(handle, 2u);
525 EXPECT_EQ(pldm_pdr_get_record_count(repo), 2u);
526 EXPECT_EQ(pldm_pdr_get_repo_size(repo),
527 2 * (sizeof(pldm_pdr_hdr) + sizeof(pldm_pdr_fru_record_set)));
528 hdl = pldm_pdr_find_record(repo, 2, &outData, &size, &nextRecHdl);
529 EXPECT_NE(hdl, nullptr);
530 EXPECT_EQ(size, sizeof(pldm_pdr_hdr) + sizeof(pldm_pdr_fru_record_set));
531 EXPECT_EQ(nextRecHdl, 0u);
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +0930532 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Andrew Jeffery9c766792022-08-10 23:12:49 +0930533 hdr = reinterpret_cast<pldm_pdr_hdr*>(outData);
534 EXPECT_EQ(hdr->version, 1u);
535 EXPECT_EQ(hdr->type, PLDM_PDR_FRU_RECORD_SET);
536 EXPECT_EQ(hdr->length, htole16(sizeof(pldm_pdr_fru_record_set)));
537 EXPECT_EQ(hdr->record_handle, htole32(2));
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +0930538 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Andrew Jeffery9c766792022-08-10 23:12:49 +0930539 fru = reinterpret_cast<pldm_pdr_fru_record_set*>(outData +
540 sizeof(pldm_pdr_hdr));
541 EXPECT_EQ(fru->terminus_handle, htole16(2));
542 EXPECT_EQ(fru->fru_rsi, htole16(11));
543 EXPECT_EQ(fru->entity_type, htole16(2));
544 EXPECT_EQ(fru->entity_instance_num, htole16(1));
545 EXPECT_EQ(fru->container_id, htole16(101));
546 outData = nullptr;
547
548 hdl = pldm_pdr_find_record(repo, 1, &outData, &size, &nextRecHdl);
549 EXPECT_NE(hdl, nullptr);
550 EXPECT_EQ(size, sizeof(pldm_pdr_hdr) + sizeof(pldm_pdr_fru_record_set));
551 EXPECT_EQ(nextRecHdl, 2u);
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +0930552 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Andrew Jeffery9c766792022-08-10 23:12:49 +0930553 hdr = reinterpret_cast<pldm_pdr_hdr*>(outData);
554 EXPECT_EQ(hdr->version, 1u);
555 EXPECT_EQ(hdr->type, PLDM_PDR_FRU_RECORD_SET);
556 EXPECT_EQ(hdr->length, htole16(sizeof(pldm_pdr_fru_record_set)));
557 EXPECT_EQ(hdr->record_handle, htole32(1));
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +0930558 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Andrew Jeffery9c766792022-08-10 23:12:49 +0930559 fru = reinterpret_cast<pldm_pdr_fru_record_set*>(outData +
560 sizeof(pldm_pdr_hdr));
561 EXPECT_EQ(fru->terminus_handle, htole16(1));
562 EXPECT_EQ(fru->fru_rsi, htole16(10));
563 EXPECT_EQ(fru->entity_type, htole16(1));
564 EXPECT_EQ(fru->entity_instance_num, htole16(0));
565 EXPECT_EQ(fru->container_id, htole16(100));
566 outData = nullptr;
567
568 pldm_pdr_destroy(repo);
569}
570
571TEST(PDRUpdate, tesFindtFruRecordSet)
572{
573 auto repo = pldm_pdr_init();
574
575 uint16_t terminusHdl{};
576 uint16_t entityType{};
577 uint16_t entityInstanceNum{};
578 uint16_t containerId{};
Andrew Jeffery14d29842023-07-17 15:29:32 +0930579 uint32_t first = 1;
Andrew Jefferye7f55112024-06-20 16:16:01 +0930580 EXPECT_EQ(pldm_pdr_add_fru_record_set(repo, 1, 1, 1, 0, 100, &first), 0);
Andrew Jeffery14d29842023-07-17 15:29:32 +0930581 uint32_t second = 2;
Andrew Jefferye7f55112024-06-20 16:16:01 +0930582 EXPECT_EQ(pldm_pdr_add_fru_record_set(repo, 1, 2, 1, 1, 100, &second), 0);
Andrew Jeffery14d29842023-07-17 15:29:32 +0930583 uint32_t third = 3;
Andrew Jefferye7f55112024-06-20 16:16:01 +0930584 EXPECT_EQ(pldm_pdr_add_fru_record_set(repo, 1, 3, 1, 2, 100, &third), 0);
Andrew Jeffery9c766792022-08-10 23:12:49 +0930585 EXPECT_EQ(first, pldm_pdr_get_record_handle(
586 repo, pldm_pdr_fru_record_set_find_by_rsi(
587 repo, 1, &terminusHdl, &entityType,
588 &entityInstanceNum, &containerId)));
589 EXPECT_EQ(second, pldm_pdr_get_record_handle(
590 repo, pldm_pdr_fru_record_set_find_by_rsi(
591 repo, 2, &terminusHdl, &entityType,
592 &entityInstanceNum, &containerId)));
593 EXPECT_EQ(third, pldm_pdr_get_record_handle(
594 repo, pldm_pdr_fru_record_set_find_by_rsi(
595 repo, 3, &terminusHdl, &entityType,
596 &entityInstanceNum, &containerId)));
597 EXPECT_EQ(terminusHdl, 1u);
598 EXPECT_EQ(entityType, 1u);
599 EXPECT_EQ(entityInstanceNum, 2u);
600 EXPECT_EQ(containerId, 100u);
601 EXPECT_EQ(nullptr, pldm_pdr_fru_record_set_find_by_rsi(
602 repo, 4, &terminusHdl, &entityType,
603 &entityInstanceNum, &containerId));
604
605 pldm_pdr_destroy(repo);
606}
607
Pavithra Barithaya4d694342023-05-19 08:04:41 -0500608#ifdef LIBPLDM_API_TESTING
609TEST(PDRUpdate, testFindLastInRange)
610{
611 auto repo = pldm_pdr_init();
612
613 std::array<uint8_t, 10> data{};
Andrew Jefferyc79a5df2023-07-17 15:09:21 +0930614 uint32_t handle1 = 0;
Andrew Jefferyfae36412024-06-20 06:35:51 +0000615 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), false, 1, &handle1),
616 0);
Andrew Jefferyc79a5df2023-07-17 15:09:21 +0930617 uint32_t handle2 = 23;
Andrew Jefferyfae36412024-06-20 06:35:51 +0000618 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), false, 1, &handle2),
619 0);
Andrew Jefferyc79a5df2023-07-17 15:09:21 +0930620 uint32_t handle3 = 77;
Andrew Jefferyfae36412024-06-20 06:35:51 +0000621 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), false, 1, &handle3),
622 0);
Andrew Jefferyc79a5df2023-07-17 15:09:21 +0930623 uint32_t handle4 = 16777325;
Andrew Jefferyfae36412024-06-20 06:35:51 +0000624 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), true, 1, &handle4),
625 0);
Andrew Jefferyc79a5df2023-07-17 15:09:21 +0930626 uint32_t handle5 = 16777344;
Andrew Jefferyfae36412024-06-20 06:35:51 +0000627 EXPECT_EQ(pldm_pdr_add(repo, data.data(), data.size(), true, 1, &handle5),
628 0);
Pavithra Barithaya4d694342023-05-19 08:04:41 -0500629
630 auto rec1 = pldm_pdr_find_last_in_range(repo, 0, 100);
631 auto rec2 = pldm_pdr_find_last_in_range(repo, 16777300, 33554431);
632 EXPECT_NE(rec1, nullptr);
633 EXPECT_NE(rec2, nullptr);
634 EXPECT_NE(handle1, pldm_pdr_get_record_handle(repo, rec1));
635 EXPECT_NE(handle2, pldm_pdr_get_record_handle(repo, rec1));
636 EXPECT_EQ(handle3, pldm_pdr_get_record_handle(repo, rec1));
637 EXPECT_NE(handle4, pldm_pdr_get_record_handle(repo, rec2));
638 EXPECT_EQ(handle5, pldm_pdr_get_record_handle(repo, rec2));
639
640 pldm_pdr_destroy(repo);
641}
642#endif
643
Pavithra Barithaya274732f2024-07-05 16:03:01 +0530644#ifdef LIBPLDM_API_TESTING
645TEST(PDRAccess, testGetTerminusHandle)
646{
647
648 auto repo = pldm_pdr_init();
649
650 pldm_pdr_hdr hdr;
651
652 hdr.type = 1;
653 uint16_t firstTerminusHandle = 1;
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +0930654 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Andrew Jefferyf309c482024-09-07 18:45:41 +0300655 EXPECT_EQ(pldm_pdr_add(repo, reinterpret_cast<const uint8_t*>(&hdr),
656 sizeof(hdr), false, firstTerminusHandle, NULL),
Pavithra Barithaya274732f2024-07-05 16:03:01 +0530657 0);
658
659 hdr.type = 2;
660 uint16_t secondTerminusHandle = 2;
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +0930661 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Andrew Jefferyf309c482024-09-07 18:45:41 +0300662 EXPECT_EQ(pldm_pdr_add(repo, reinterpret_cast<const uint8_t*>(&hdr),
663 sizeof(hdr), true, secondTerminusHandle, NULL),
Pavithra Barithaya274732f2024-07-05 16:03:01 +0530664 0);
665
666 hdr.type = 3;
667 uint16_t thirdTerminusHandle = 3;
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +0930668 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Andrew Jefferyf309c482024-09-07 18:45:41 +0300669 EXPECT_EQ(pldm_pdr_add(repo, reinterpret_cast<const uint8_t*>(&hdr),
670 sizeof(hdr), true, thirdTerminusHandle, NULL),
Pavithra Barithaya274732f2024-07-05 16:03:01 +0530671 0);
672
673 uint8_t* outData = nullptr;
674 uint32_t size{};
675
676 auto firstRec =
677 pldm_pdr_find_record_by_type(repo, 1, nullptr, &outData, &size);
678 EXPECT_EQ(pldm_pdr_get_terminus_handle(repo, firstRec),
679 firstTerminusHandle);
680 outData = nullptr;
681
682 auto secondRec =
683 pldm_pdr_find_record_by_type(repo, 2, nullptr, &outData, &size);
684 EXPECT_EQ(pldm_pdr_get_terminus_handle(repo, secondRec),
685 secondTerminusHandle);
686 outData = nullptr;
687
688 auto thirdRec =
689 pldm_pdr_find_record_by_type(repo, 3, nullptr, &outData, &size);
690 EXPECT_EQ(pldm_pdr_get_terminus_handle(repo, thirdRec),
691 thirdTerminusHandle);
692 outData = nullptr;
693
694 pldm_pdr_destroy(repo);
695}
696#endif
697
Andrew Jeffery9c766792022-08-10 23:12:49 +0930698TEST(EntityAssociationPDR, testInit)
699{
700 auto tree = pldm_entity_association_tree_init();
701 EXPECT_NE(tree, nullptr);
702 pldm_entity_association_tree_destroy(tree);
703}
704
705TEST(EntityAssociationPDR, testBuild)
706{
707 // 1
708 // |
709 // 2--3--4
710 // |
711 // 5--6--7
712 // | |
713 // 9 8
714
715 pldm_entity entities[9]{};
716
717 entities[0].entity_type = 1;
718 entities[1].entity_type = 2;
719 entities[2].entity_type = 2;
720 entities[3].entity_type = 3;
721 entities[4].entity_type = 4;
722 entities[5].entity_type = 5;
723 entities[6].entity_type = 5;
724 entities[7].entity_type = 6;
725 entities[8].entity_type = 7;
726
727 auto tree = pldm_entity_association_tree_init();
728
729 auto l1 = pldm_entity_association_tree_add(
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -0600730 tree, &entities[0], 0xffff, nullptr, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
Andrew Jeffery9c766792022-08-10 23:12:49 +0930731 EXPECT_NE(l1, nullptr);
732 auto l2a = pldm_entity_association_tree_add(
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -0600733 tree, &entities[1], 0xffff, l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
Andrew Jeffery9c766792022-08-10 23:12:49 +0930734 EXPECT_NE(l2a, nullptr);
735 auto l2b = pldm_entity_association_tree_add(
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -0600736 tree, &entities[2], 0xffff, l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
Andrew Jeffery9c766792022-08-10 23:12:49 +0930737 EXPECT_NE(l2b, nullptr);
738 auto l2c = pldm_entity_association_tree_add(
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -0600739 tree, &entities[3], 0xffff, l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
Andrew Jeffery9c766792022-08-10 23:12:49 +0930740 EXPECT_NE(l2c, nullptr);
741 auto l3a = pldm_entity_association_tree_add(
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -0600742 tree, &entities[4], 0xffff, l2a, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
Andrew Jeffery9c766792022-08-10 23:12:49 +0930743 EXPECT_NE(l3a, nullptr);
744 auto l3b = pldm_entity_association_tree_add(
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -0600745 tree, &entities[5], 0xffff, l2a, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
Andrew Jeffery9c766792022-08-10 23:12:49 +0930746 EXPECT_NE(l3b, nullptr);
747 auto l3c = pldm_entity_association_tree_add(
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -0600748 tree, &entities[6], 0xffff, l2a, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
Andrew Jeffery9c766792022-08-10 23:12:49 +0930749 EXPECT_NE(l3b, nullptr);
750 auto l4a = pldm_entity_association_tree_add(
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -0600751 tree, &entities[7], 0xffff, l3a, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
Andrew Jeffery9c766792022-08-10 23:12:49 +0930752 EXPECT_NE(l4a, nullptr);
753 auto l4b = pldm_entity_association_tree_add(
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -0600754 tree, &entities[8], 0xffff, l3b, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
Andrew Jeffery9c766792022-08-10 23:12:49 +0930755 EXPECT_NE(l4b, nullptr);
756
757 EXPECT_EQ(pldm_entity_is_node_parent(l1), true);
758 EXPECT_EQ(pldm_entity_is_node_parent(l2a), true);
759 EXPECT_EQ(pldm_entity_is_node_parent(l3a), true);
760 EXPECT_EQ(pldm_entity_is_node_parent(l3b), true);
761
762 EXPECT_EQ(pldm_entity_is_node_parent(l2b), false);
763 EXPECT_EQ(pldm_entity_is_node_parent(l2c), false);
764 EXPECT_EQ(pldm_entity_is_node_parent(l3c), false);
765 EXPECT_EQ(pldm_entity_is_node_parent(l4a), false);
766 EXPECT_EQ(pldm_entity_is_node_parent(l4b), false);
767
768 EXPECT_EQ(pldm_entity_is_exist_parent(l1), false);
769
770 pldm_entity nodeL1 = pldm_entity_extract(l1);
771 pldm_entity parentL2a = pldm_entity_get_parent(l2a);
772 pldm_entity parentL2b = pldm_entity_get_parent(l2b);
773 pldm_entity parentL2c = pldm_entity_get_parent(l2c);
774 EXPECT_EQ(pldm_entity_is_exist_parent(l2a), true);
775 EXPECT_EQ(pldm_entity_is_exist_parent(l2b), true);
776 EXPECT_EQ(pldm_entity_is_exist_parent(l2c), true);
777 EXPECT_EQ(parentL2a.entity_type, nodeL1.entity_type);
778 EXPECT_EQ(parentL2a.entity_instance_num, nodeL1.entity_instance_num);
779 EXPECT_EQ(parentL2a.entity_container_id, nodeL1.entity_container_id);
780 EXPECT_EQ(parentL2b.entity_type, nodeL1.entity_type);
781 EXPECT_EQ(parentL2b.entity_instance_num, nodeL1.entity_instance_num);
782 EXPECT_EQ(parentL2b.entity_container_id, nodeL1.entity_container_id);
783 EXPECT_EQ(parentL2c.entity_type, nodeL1.entity_type);
784 EXPECT_EQ(parentL2c.entity_instance_num, nodeL1.entity_instance_num);
785 EXPECT_EQ(parentL2c.entity_container_id, nodeL1.entity_container_id);
786
787 pldm_entity nodeL2a = pldm_entity_extract(l2a);
788 pldm_entity parentL3a = pldm_entity_get_parent(l3a);
789 pldm_entity parentL3b = pldm_entity_get_parent(l3b);
790 pldm_entity parentL3c = pldm_entity_get_parent(l3c);
791 EXPECT_EQ(pldm_entity_is_exist_parent(l3a), true);
792 EXPECT_EQ(pldm_entity_is_exist_parent(l3b), true);
793 EXPECT_EQ(pldm_entity_is_exist_parent(l3c), true);
794 EXPECT_EQ(parentL3a.entity_type, nodeL2a.entity_type);
795 EXPECT_EQ(parentL3a.entity_instance_num, nodeL2a.entity_instance_num);
796 EXPECT_EQ(parentL3a.entity_container_id, nodeL2a.entity_container_id);
797 EXPECT_EQ(parentL3b.entity_type, nodeL2a.entity_type);
798 EXPECT_EQ(parentL3b.entity_instance_num, nodeL2a.entity_instance_num);
799 EXPECT_EQ(parentL3b.entity_container_id, nodeL2a.entity_container_id);
800 EXPECT_EQ(parentL3c.entity_type, nodeL2a.entity_type);
801 EXPECT_EQ(parentL3c.entity_instance_num, nodeL2a.entity_instance_num);
802 EXPECT_EQ(parentL3c.entity_container_id, nodeL2a.entity_container_id);
803
804 pldm_entity nodeL3a = pldm_entity_extract(l3a);
805 pldm_entity parentL4a = pldm_entity_get_parent(l4a);
806 EXPECT_EQ(pldm_entity_is_exist_parent(l4a), true);
807 EXPECT_EQ(parentL4a.entity_type, nodeL3a.entity_type);
808 EXPECT_EQ(parentL4a.entity_instance_num, nodeL3a.entity_instance_num);
809 EXPECT_EQ(parentL4a.entity_container_id, nodeL3a.entity_container_id);
810
811 pldm_entity nodeL3b = pldm_entity_extract(l3b);
812 pldm_entity parentL4b = pldm_entity_get_parent(l4b);
813 EXPECT_EQ(pldm_entity_is_exist_parent(l4b), true);
814 EXPECT_EQ(parentL4b.entity_type, nodeL3b.entity_type);
815 EXPECT_EQ(parentL4b.entity_instance_num, nodeL3b.entity_instance_num);
816 EXPECT_EQ(parentL4b.entity_container_id, nodeL3b.entity_container_id);
817
818 size_t num{};
819 pldm_entity* out = nullptr;
820 pldm_entity_association_tree_visit(tree, &out, &num);
821 EXPECT_EQ(num, 9u);
822
823 EXPECT_EQ(out[0].entity_type, 1u);
824 EXPECT_EQ(out[0].entity_instance_num, 1u);
825 EXPECT_EQ(out[0].entity_container_id, 0u);
826
827 EXPECT_EQ(out[1].entity_type, 2u);
828 EXPECT_EQ(out[1].entity_instance_num, 1u);
829 EXPECT_EQ(out[1].entity_container_id, 1u);
830 EXPECT_EQ(out[2].entity_type, 2u);
831 EXPECT_EQ(out[2].entity_instance_num, 2u);
832 EXPECT_EQ(out[2].entity_container_id, 1u);
833 EXPECT_EQ(out[3].entity_type, 3u);
834 EXPECT_EQ(out[3].entity_instance_num, 1u);
835 EXPECT_EQ(out[3].entity_container_id, 1u);
836
837 EXPECT_EQ(out[4].entity_type, 4u);
838 EXPECT_EQ(out[4].entity_instance_num, 1u);
839 EXPECT_EQ(out[4].entity_container_id, 2u);
840 EXPECT_EQ(out[5].entity_type, 5u);
841 EXPECT_EQ(out[5].entity_instance_num, 1u);
842 EXPECT_EQ(out[5].entity_container_id, 2u);
843 EXPECT_EQ(out[6].entity_type, 5u);
844 EXPECT_EQ(out[6].entity_instance_num, 2u);
845 EXPECT_EQ(out[6].entity_container_id, 2u);
846
847 EXPECT_EQ(out[7].entity_type, 7u);
848 EXPECT_EQ(out[7].entity_instance_num, 1u);
849 EXPECT_EQ(out[7].entity_container_id, 4u);
850 EXPECT_EQ(out[8].entity_type, 6u);
851 EXPECT_EQ(out[8].entity_instance_num, 1u);
852 EXPECT_EQ(out[8].entity_container_id, 3u);
853
854 free(out);
855
856 pldm_entity p1 = pldm_entity_extract(l1);
857 EXPECT_EQ(p1.entity_type, 1u);
858 EXPECT_EQ(p1.entity_instance_num, 1u);
859 EXPECT_EQ(p1.entity_container_id, 0u);
860
861 pldm_entity p2a = pldm_entity_extract(l2a);
862 EXPECT_EQ(p2a.entity_type, 2u);
863 EXPECT_EQ(p2a.entity_instance_num, 1u);
864 EXPECT_EQ(p2a.entity_container_id, 1u);
865 pldm_entity p2b = pldm_entity_extract(l2b);
866 EXPECT_EQ(p2b.entity_type, 2u);
867 EXPECT_EQ(p2b.entity_instance_num, 2u);
868 EXPECT_EQ(p2b.entity_container_id, 1u);
869 pldm_entity p2c = pldm_entity_extract(l2c);
870 EXPECT_EQ(p2c.entity_type, 3u);
871 EXPECT_EQ(p2c.entity_instance_num, 1u);
872 EXPECT_EQ(p2c.entity_container_id, 1u);
873
874 pldm_entity p3a = pldm_entity_extract(l3a);
875 EXPECT_EQ(p3a.entity_type, 4u);
876 EXPECT_EQ(p3a.entity_instance_num, 1u);
877 EXPECT_EQ(p3a.entity_container_id, 2u);
878 pldm_entity p3b = pldm_entity_extract(l3b);
879 EXPECT_EQ(p3b.entity_type, 5u);
880 EXPECT_EQ(p3b.entity_instance_num, 1u);
881 EXPECT_EQ(p3b.entity_container_id, 2u);
882 pldm_entity p3c = pldm_entity_extract(l3c);
883 EXPECT_EQ(p3c.entity_type, 5u);
884 EXPECT_EQ(p3c.entity_instance_num, 2u);
885 EXPECT_EQ(p3c.entity_container_id, 2u);
886
887 pldm_entity p4a = pldm_entity_extract(l4a);
888 EXPECT_EQ(p4a.entity_type, 6u);
889 EXPECT_EQ(p4a.entity_instance_num, 1u);
890 EXPECT_EQ(p4a.entity_container_id, 3u);
891 pldm_entity p4b = pldm_entity_extract(l4b);
892 EXPECT_EQ(p4b.entity_type, 7u);
893 EXPECT_EQ(p4b.entity_instance_num, 1u);
894 EXPECT_EQ(p4b.entity_container_id, 4u);
895
896 pldm_entity_association_tree_destroy(tree);
897}
898
Pavithra Barithaya9947f9d2023-05-18 05:20:24 -0500899#if LIBPLDM_API_TESTING
900TEST(EntityAssociationPDR, findAndAddRemotePDR)
901{
902 // Tree - 1
903 //
904 // 11521(1,0)
905 // |
906 // 45 (1,1)
907 // |
908 // 64 (1,2)
909 // |
910 // ------------------
911 // | |
912 // 67(0,3) 67(1,3)
913 // | |
914 // 135(0,4) 135(0,5)
915 // | |
916 // 32903(0,6) 32903(0,7)
917
918 pldm_entity entities[9]{};
919 entities[0].entity_type = 11521;
920 entities[1].entity_type = 45;
921 entities[2].entity_type = 64;
922 entities[3].entity_type = 67;
923 entities[4].entity_type = 67;
924 entities[5].entity_type = 135;
925 entities[5].entity_container_id = 2;
926 entities[6].entity_type = 135;
927 entities[6].entity_container_id = 3;
928 entities[7].entity_type = 32903;
929 entities[8].entity_type = 32903;
930 auto tree = pldm_entity_association_tree_init();
931 auto l1 = pldm_entity_association_tree_add_entity(
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -0600932 tree, &entities[0], 0xffff, nullptr, PLDM_ENTITY_ASSOCIAION_LOGICAL,
933 false, true, 0xffff);
Pavithra Barithaya9947f9d2023-05-18 05:20:24 -0500934 EXPECT_NE(l1, nullptr);
935 auto l2 = pldm_entity_association_tree_add_entity(
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -0600936 tree, &entities[1], 0xffff, l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL, false,
937 false, 0xffff);
Pavithra Barithaya9947f9d2023-05-18 05:20:24 -0500938 EXPECT_NE(l2, nullptr);
939 auto l3 = pldm_entity_association_tree_add_entity(
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -0600940 tree, &entities[2], 0xffff, l2, PLDM_ENTITY_ASSOCIAION_PHYSICAL, false,
941 true, 0xffff);
Pavithra Barithaya9947f9d2023-05-18 05:20:24 -0500942 EXPECT_NE(l3, nullptr);
943 auto l4a = pldm_entity_association_tree_add_entity(
944 tree, &entities[3], 0, l3, PLDM_ENTITY_ASSOCIAION_PHYSICAL, false,
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -0600945 false, 0xffff);
Pavithra Barithaya9947f9d2023-05-18 05:20:24 -0500946 EXPECT_NE(l4a, nullptr);
947 auto l4b = pldm_entity_association_tree_add_entity(
948 tree, &entities[4], 1, l3, PLDM_ENTITY_ASSOCIAION_PHYSICAL, true, true,
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -0600949 0xffff);
Pavithra Barithaya9947f9d2023-05-18 05:20:24 -0500950 EXPECT_NE(l4b, nullptr);
951 auto l5a = pldm_entity_association_tree_add_entity(
952 tree, &entities[5], 0, l4a, PLDM_ENTITY_ASSOCIAION_PHYSICAL, false,
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -0600953 false, 0xffff);
Pavithra Barithaya9947f9d2023-05-18 05:20:24 -0500954 EXPECT_NE(l5a, nullptr);
955 auto l5b = pldm_entity_association_tree_add_entity(
956 tree, &entities[6], 0, l4b, PLDM_ENTITY_ASSOCIAION_PHYSICAL, false,
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -0600957 false, 0xffff);
Pavithra Barithaya9947f9d2023-05-18 05:20:24 -0500958 EXPECT_NE(l5b, nullptr);
959 pldm_entity entity{};
960 entity.entity_type = 135;
961 entity.entity_instance_num = 0;
962 entity.entity_container_id = 2;
963 auto result1 = pldm_entity_association_tree_find(tree, &entity);
964 EXPECT_EQ(result1, l5a);
965 EXPECT_EQ(entities[5].entity_container_id, 2);
966 auto l6a = pldm_entity_association_tree_add_entity(
967 tree, &entities[7], 0, result1, PLDM_ENTITY_ASSOCIAION_PHYSICAL, false,
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -0600968 false, 0xffff);
Pavithra Barithaya9947f9d2023-05-18 05:20:24 -0500969 EXPECT_NE(l6a, nullptr);
970 entity.entity_type = 135;
971 entity.entity_instance_num = 0;
972 entity.entity_container_id = 3;
973 auto result2 = pldm_entity_association_tree_find(tree, &entity);
974 EXPECT_NE(result2, l5b);
975 EXPECT_EQ(entities[6].entity_container_id, 3);
976 auto l7a = pldm_entity_association_tree_add_entity(
977 tree, &entities[8], 0, result2, PLDM_ENTITY_ASSOCIAION_PHYSICAL, false,
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -0600978 false, 0xffff);
Pavithra Barithaya9947f9d2023-05-18 05:20:24 -0500979 EXPECT_EQ(l7a, nullptr);
980 pldm_entity_association_tree_destroy(tree);
981}
982#endif
983
Andrew Jeffery9c766792022-08-10 23:12:49 +0930984TEST(EntityAssociationPDR, testSpecialTrees)
985{
986 pldm_entity entities[3]{};
987
988 entities[0].entity_type = 1;
989 entities[1].entity_type = 2;
990 entities[2].entity_type = 1;
991
992 // A
993 auto tree = pldm_entity_association_tree_init();
994 auto node = pldm_entity_association_tree_add(
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -0600995 tree, &entities[0], 0xffff, nullptr, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
Andrew Jeffery9c766792022-08-10 23:12:49 +0930996 EXPECT_NE(node, nullptr);
997 size_t num{};
998 pldm_entity* out = nullptr;
999 pldm_entity_association_tree_visit(tree, &out, &num);
1000 EXPECT_EQ(num, 1u);
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 free(out);
1005 pldm_entity_association_tree_destroy(tree);
1006
1007 // A-A-A
1008 tree = pldm_entity_association_tree_init();
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06001009 node = pldm_entity_association_tree_add(tree, &entities[0], 0xffff, nullptr,
Andrew Jeffery9c766792022-08-10 23:12:49 +09301010 PLDM_ENTITY_ASSOCIAION_PHYSICAL);
1011 EXPECT_NE(node, nullptr);
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06001012 node = pldm_entity_association_tree_add(tree, &entities[1], 0xffff, nullptr,
Andrew Jeffery9c766792022-08-10 23:12:49 +09301013 PLDM_ENTITY_ASSOCIAION_PHYSICAL);
1014 EXPECT_NE(node, nullptr);
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06001015 node = pldm_entity_association_tree_add(tree, &entities[2], 0xffff, nullptr,
Andrew Jeffery9c766792022-08-10 23:12:49 +09301016 PLDM_ENTITY_ASSOCIAION_PHYSICAL);
1017 EXPECT_NE(node, nullptr);
1018 pldm_entity_association_tree_visit(tree, &out, &num);
1019 EXPECT_EQ(num, 3u);
1020 EXPECT_EQ(out[0].entity_type, 1u);
1021 EXPECT_EQ(out[0].entity_instance_num, 1u);
1022 EXPECT_EQ(out[0].entity_container_id, 0u);
1023 EXPECT_EQ(out[1].entity_type, 1u);
1024 EXPECT_EQ(out[1].entity_instance_num, 2u);
1025 EXPECT_EQ(out[1].entity_container_id, 0u);
1026 EXPECT_EQ(out[2].entity_type, 2u);
1027 EXPECT_EQ(out[2].entity_instance_num, 1u);
1028 EXPECT_EQ(out[2].entity_container_id, 0u);
1029 free(out);
1030 pldm_entity_association_tree_destroy(tree);
1031
1032 // A
1033 // |
1034 // A
1035 // |
1036 // A
1037 tree = pldm_entity_association_tree_init();
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06001038 node = pldm_entity_association_tree_add(tree, &entities[0], 0xffff, nullptr,
Andrew Jeffery9c766792022-08-10 23:12:49 +09301039 PLDM_ENTITY_ASSOCIAION_PHYSICAL);
1040 EXPECT_NE(node, nullptr);
1041 auto node1 = pldm_entity_association_tree_add(
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06001042 tree, &entities[1], 0xffff, node, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
Andrew Jeffery9c766792022-08-10 23:12:49 +09301043 EXPECT_NE(node1, nullptr);
1044 auto node2 = pldm_entity_association_tree_add(
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06001045 tree, &entities[2], 0xffff, node1, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
Andrew Jeffery9c766792022-08-10 23:12:49 +09301046 EXPECT_NE(node2, nullptr);
1047 pldm_entity_association_tree_visit(tree, &out, &num);
1048 EXPECT_EQ(num, 3u);
1049 EXPECT_EQ(out[0].entity_type, 1u);
1050 EXPECT_EQ(out[0].entity_instance_num, 1u);
1051 EXPECT_EQ(out[0].entity_container_id, 0u);
1052 EXPECT_EQ(out[1].entity_type, 2u);
1053 EXPECT_EQ(out[1].entity_instance_num, 1u);
1054 EXPECT_EQ(out[1].entity_container_id, 1u);
1055 EXPECT_EQ(out[2].entity_type, 1u);
1056 EXPECT_EQ(out[2].entity_instance_num, 1u);
1057 EXPECT_EQ(out[2].entity_container_id, 2u);
1058 free(out);
1059 pldm_entity_association_tree_destroy(tree);
1060
1061 // A-A
1062 // |
1063 // A-A
1064 tree = pldm_entity_association_tree_init();
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06001065 node = pldm_entity_association_tree_add(tree, &entities[0], 0xffff, nullptr,
Andrew Jeffery9c766792022-08-10 23:12:49 +09301066 PLDM_ENTITY_ASSOCIAION_PHYSICAL);
1067 EXPECT_NE(node, nullptr);
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06001068 node = pldm_entity_association_tree_add(tree, &entities[0], 0xffff, nullptr,
Andrew Jeffery9c766792022-08-10 23:12:49 +09301069 PLDM_ENTITY_ASSOCIAION_PHYSICAL);
1070 EXPECT_NE(node, nullptr);
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06001071 node1 = pldm_entity_association_tree_add(tree, &entities[1], 0xffff, node,
Andrew Jeffery9c766792022-08-10 23:12:49 +09301072 PLDM_ENTITY_ASSOCIAION_PHYSICAL);
1073 EXPECT_NE(node1, nullptr);
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06001074 node2 = pldm_entity_association_tree_add(tree, &entities[2], 0xffff, node,
Andrew Jeffery9c766792022-08-10 23:12:49 +09301075 PLDM_ENTITY_ASSOCIAION_PHYSICAL);
1076 EXPECT_NE(node2, nullptr);
1077 pldm_entity_association_tree_visit(tree, &out, &num);
1078 EXPECT_EQ(num, 4u);
1079 EXPECT_EQ(out[0].entity_type, 1u);
1080 EXPECT_EQ(out[0].entity_instance_num, 1u);
1081 EXPECT_EQ(out[0].entity_container_id, 0u);
1082 EXPECT_EQ(out[1].entity_type, 1u);
1083 EXPECT_EQ(out[1].entity_instance_num, 2u);
1084 EXPECT_EQ(out[1].entity_container_id, 0u);
1085 EXPECT_EQ(out[2].entity_type, 2u);
1086 EXPECT_EQ(out[2].entity_instance_num, 1u);
1087 EXPECT_EQ(out[2].entity_container_id, 1u);
1088 EXPECT_EQ(out[3].entity_type, 1u);
1089 EXPECT_EQ(out[3].entity_instance_num, 1u);
1090 EXPECT_EQ(out[3].entity_container_id, 1u);
1091 free(out);
1092 pldm_entity_association_tree_destroy(tree);
1093}
1094
1095TEST(EntityAssociationPDR, testPDR)
1096{
1097 // e = entity type, c = container id, i = instance num
1098
1099 // INPUT
1100 // 1(e=1)--1a(e=2)
1101 // |
1102 // 2(e=2)--3(e=2)--4(e=2)--5(e=3)
1103 // |
1104 // 6(e=4)--7(e=5)--8(e=5)--9(e=5)
1105 // | |
1106 // 11(e=6) 10(e=7)
1107
1108 // Expected OUTPUT
1109 // 1(e=1,c=0,i=1)
1110 // |
1111 // 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)
1112 // |
1113 // 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)
1114 // | |
1115 // 10(e=6,c=3,i=1) 11(e=7,c=4,i=1)
1116 pldm_entity entities[11]{};
1117
1118 entities[0].entity_type = 1;
1119 entities[1].entity_type = 2;
1120 entities[2].entity_type = 3;
1121 entities[3].entity_type = 2;
1122 entities[4].entity_type = 3;
1123 entities[5].entity_type = 4;
1124 entities[6].entity_type = 5;
1125 entities[7].entity_type = 5;
1126 entities[8].entity_type = 5;
1127 entities[9].entity_type = 6;
1128 entities[10].entity_type = 7;
1129
1130 auto tree = pldm_entity_association_tree_init();
1131
1132 auto l1 = pldm_entity_association_tree_add(
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06001133 tree, &entities[0], 0xffff, nullptr, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
Andrew Jeffery9c766792022-08-10 23:12:49 +09301134 EXPECT_NE(l1, nullptr);
1135 auto l1a = pldm_entity_association_tree_add(
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06001136 tree, &entities[1], 0xffff, nullptr, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
Andrew Jeffery9c766792022-08-10 23:12:49 +09301137 EXPECT_NE(l1a, nullptr);
1138
1139 auto l2a = pldm_entity_association_tree_add(
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06001140 tree, &entities[1], 0xffff, l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
Andrew Jeffery9c766792022-08-10 23:12:49 +09301141 EXPECT_NE(l2a, nullptr);
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06001142 auto l2b = pldm_entity_association_tree_add(tree, &entities[2], 0xffff, l1,
Andrew Jeffery9c766792022-08-10 23:12:49 +09301143 PLDM_ENTITY_ASSOCIAION_LOGICAL);
1144 EXPECT_NE(l2b, nullptr);
1145 auto l2c = pldm_entity_association_tree_add(
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06001146 tree, &entities[3], 0xffff, l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
Andrew Jeffery9c766792022-08-10 23:12:49 +09301147 EXPECT_NE(l2c, nullptr);
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06001148 auto l2d = pldm_entity_association_tree_add(tree, &entities[4], 0xffff, l1,
Andrew Jeffery9c766792022-08-10 23:12:49 +09301149 PLDM_ENTITY_ASSOCIAION_LOGICAL);
1150 EXPECT_NE(l2d, nullptr);
1151
1152 auto l3a = pldm_entity_association_tree_add(
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06001153 tree, &entities[5], 0xffff, l2a, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
Andrew Jeffery9c766792022-08-10 23:12:49 +09301154 EXPECT_NE(l3a, nullptr);
1155 auto l3b = pldm_entity_association_tree_add(
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06001156 tree, &entities[6], 0xffff, l2a, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
Andrew Jeffery9c766792022-08-10 23:12:49 +09301157 EXPECT_NE(l3b, nullptr);
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06001158 auto l3c = pldm_entity_association_tree_add(tree, &entities[7], 0xffff, l2a,
Andrew Jeffery9c766792022-08-10 23:12:49 +09301159 PLDM_ENTITY_ASSOCIAION_LOGICAL);
1160 EXPECT_NE(l3c, nullptr);
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06001161 auto l3d = pldm_entity_association_tree_add(tree, &entities[8], 0xffff, l2a,
Andrew Jeffery9c766792022-08-10 23:12:49 +09301162 PLDM_ENTITY_ASSOCIAION_LOGICAL);
1163 EXPECT_NE(l3d, nullptr);
1164
1165 auto l4a = pldm_entity_association_tree_add(
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06001166 tree, &entities[9], 0xffff, l3a, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
Andrew Jeffery9c766792022-08-10 23:12:49 +09301167 EXPECT_NE(l4a, nullptr);
1168 auto l4b = pldm_entity_association_tree_add(
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06001169 tree, &entities[10], 0xffff, l3b, PLDM_ENTITY_ASSOCIAION_LOGICAL);
Andrew Jeffery9c766792022-08-10 23:12:49 +09301170 EXPECT_NE(l4b, nullptr);
1171
1172 EXPECT_EQ(pldm_entity_get_num_children(l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL),
1173 2);
1174 EXPECT_EQ(pldm_entity_get_num_children(l1, PLDM_ENTITY_ASSOCIAION_LOGICAL),
1175 2);
1176 EXPECT_EQ(
1177 pldm_entity_get_num_children(l2a, PLDM_ENTITY_ASSOCIAION_PHYSICAL), 2);
1178 EXPECT_EQ(
1179 pldm_entity_get_num_children(l3b, PLDM_ENTITY_ASSOCIAION_PHYSICAL), 0);
1180 EXPECT_EQ(pldm_entity_get_num_children(l3b, PLDM_ENTITY_ASSOCIAION_LOGICAL),
1181 1);
1182
1183 auto repo = pldm_pdr_init();
Andrew Jefferyd72ea4b2024-06-24 21:33:33 +09301184 int rc = pldm_entity_association_pdr_add(tree, repo, false, 1);
Andrew Jeffery255f6542023-08-10 15:46:54 +09301185 ASSERT_EQ(rc, 0);
Andrew Jeffery9c766792022-08-10 23:12:49 +09301186
1187 EXPECT_EQ(pldm_pdr_get_record_count(repo), 6u);
1188
1189 uint32_t currRecHandle{};
1190 uint32_t nextRecHandle{};
1191 uint8_t* data = nullptr;
1192 uint32_t size{};
1193 uint32_t commonSize = sizeof(struct pldm_pdr_hdr) + sizeof(uint16_t) +
1194 sizeof(uint8_t) + sizeof(pldm_entity) +
1195 sizeof(uint8_t);
1196
1197 pldm_pdr_find_record(repo, currRecHandle, &data, &size, &nextRecHandle);
1198 EXPECT_EQ(size, commonSize + (pldm_entity_get_num_children(
1199 l1, PLDM_ENTITY_ASSOCIAION_LOGICAL) *
1200 sizeof(pldm_entity)));
1201 uint8_t* start = data;
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +09301202 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Andrew Jeffery9c766792022-08-10 23:12:49 +09301203 pldm_pdr_hdr* hdr = reinterpret_cast<pldm_pdr_hdr*>(start);
1204 EXPECT_EQ(le32toh(hdr->record_handle), 1u);
1205 EXPECT_EQ(hdr->type, PLDM_PDR_ENTITY_ASSOCIATION);
1206 EXPECT_EQ(le16toh(hdr->length), size - sizeof(struct pldm_pdr_hdr));
1207 start += sizeof(pldm_pdr_hdr);
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +09301208 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Andrew Jeffery9c766792022-08-10 23:12:49 +09301209 uint16_t* containerId = reinterpret_cast<uint16_t*>(start);
1210 EXPECT_EQ(le16toh(*containerId), 1u);
1211 start += sizeof(uint16_t);
1212 EXPECT_EQ(*start, PLDM_ENTITY_ASSOCIAION_LOGICAL);
1213 start += sizeof(uint8_t);
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +09301214 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Andrew Jeffery9c766792022-08-10 23:12:49 +09301215 pldm_entity* entity = reinterpret_cast<pldm_entity*>(start);
1216 EXPECT_EQ(le16toh(entity->entity_type), 1u);
1217 EXPECT_EQ(le16toh(entity->entity_instance_num), 1u);
1218 EXPECT_EQ(le16toh(entity->entity_container_id), 0u);
1219 start += sizeof(pldm_entity);
1220 EXPECT_EQ(*start,
1221 pldm_entity_get_num_children(l1, PLDM_ENTITY_ASSOCIAION_LOGICAL));
1222 start += sizeof(uint8_t);
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +09301223 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Andrew Jeffery9c766792022-08-10 23:12:49 +09301224 entity = reinterpret_cast<pldm_entity*>(start);
1225 EXPECT_EQ(le16toh(entity->entity_type), 3u);
1226 EXPECT_EQ(le16toh(entity->entity_instance_num), 1u);
1227 EXPECT_EQ(le16toh(entity->entity_container_id), 1u);
1228 start += sizeof(pldm_entity);
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +09301229 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Andrew Jeffery9c766792022-08-10 23:12:49 +09301230 entity = reinterpret_cast<pldm_entity*>(start);
1231 EXPECT_EQ(le16toh(entity->entity_type), 3u);
1232 EXPECT_EQ(le16toh(entity->entity_instance_num), 2u);
1233 EXPECT_EQ(le16toh(entity->entity_container_id), 1u);
Andrew Jeffery9c766792022-08-10 23:12:49 +09301234
1235 currRecHandle = nextRecHandle;
1236
1237 pldm_pdr_find_record(repo, currRecHandle, &data, &size, &nextRecHandle);
1238 EXPECT_EQ(size, commonSize + (pldm_entity_get_num_children(
1239 l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL) *
1240 sizeof(pldm_entity)));
1241 start = data;
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +09301242 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Andrew Jeffery9c766792022-08-10 23:12:49 +09301243 hdr = reinterpret_cast<pldm_pdr_hdr*>(start);
1244 EXPECT_EQ(le32toh(hdr->record_handle), 2u);
1245 EXPECT_EQ(hdr->type, PLDM_PDR_ENTITY_ASSOCIATION);
1246 EXPECT_EQ(le16toh(hdr->length), size - sizeof(struct pldm_pdr_hdr));
1247 start += sizeof(pldm_pdr_hdr);
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +09301248 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Andrew Jeffery9c766792022-08-10 23:12:49 +09301249 containerId = reinterpret_cast<uint16_t*>(start);
1250 EXPECT_EQ(le16toh(*containerId), 1u);
1251 start += sizeof(uint16_t);
1252 EXPECT_EQ(*start, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
1253 start += sizeof(uint8_t);
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +09301254 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Andrew Jeffery9c766792022-08-10 23:12:49 +09301255 entity = reinterpret_cast<pldm_entity*>(start);
1256 EXPECT_EQ(le16toh(entity->entity_type), 1u);
1257 EXPECT_EQ(le16toh(entity->entity_instance_num), 1u);
1258 EXPECT_EQ(le16toh(entity->entity_container_id), 0u);
1259 start += sizeof(pldm_entity);
1260 EXPECT_EQ(*start, pldm_entity_get_num_children(
1261 l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL));
1262 start += sizeof(uint8_t);
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +09301263 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Andrew Jeffery9c766792022-08-10 23:12:49 +09301264 entity = reinterpret_cast<pldm_entity*>(start);
1265 EXPECT_EQ(le16toh(entity->entity_type), 2u);
1266 EXPECT_EQ(le16toh(entity->entity_instance_num), 1u);
1267 EXPECT_EQ(le16toh(entity->entity_container_id), 1u);
1268 start += sizeof(pldm_entity);
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +09301269 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Andrew Jeffery9c766792022-08-10 23:12:49 +09301270 entity = reinterpret_cast<pldm_entity*>(start);
1271 EXPECT_EQ(le16toh(entity->entity_type), 2u);
1272 EXPECT_EQ(le16toh(entity->entity_instance_num), 2u);
1273 EXPECT_EQ(le16toh(entity->entity_container_id), 1u);
Andrew Jeffery9c766792022-08-10 23:12:49 +09301274
1275 currRecHandle = nextRecHandle;
1276
1277 pldm_pdr_find_record(repo, currRecHandle, &data, &size, &nextRecHandle);
1278 EXPECT_EQ(size, commonSize + (pldm_entity_get_num_children(
1279 l2a, PLDM_ENTITY_ASSOCIAION_LOGICAL) *
1280 sizeof(pldm_entity)));
1281 start = data;
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +09301282 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Andrew Jeffery9c766792022-08-10 23:12:49 +09301283 hdr = reinterpret_cast<pldm_pdr_hdr*>(start);
1284 EXPECT_EQ(le32toh(hdr->record_handle), 3u);
1285 EXPECT_EQ(hdr->type, PLDM_PDR_ENTITY_ASSOCIATION);
1286 EXPECT_EQ(le16toh(hdr->length), size - sizeof(struct pldm_pdr_hdr));
1287 start += sizeof(pldm_pdr_hdr);
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +09301288 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Andrew Jeffery9c766792022-08-10 23:12:49 +09301289 containerId = reinterpret_cast<uint16_t*>(start);
1290 EXPECT_EQ(le16toh(*containerId), 2u);
1291 start += sizeof(uint16_t);
1292 EXPECT_EQ(*start, PLDM_ENTITY_ASSOCIAION_LOGICAL);
1293 start += sizeof(uint8_t);
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +09301294 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Andrew Jeffery9c766792022-08-10 23:12:49 +09301295 entity = reinterpret_cast<pldm_entity*>(start);
1296 EXPECT_EQ(le16toh(entity->entity_type), 2u);
1297 EXPECT_EQ(le16toh(entity->entity_instance_num), 1u);
1298 EXPECT_EQ(le16toh(entity->entity_container_id), 1u);
1299 start += sizeof(pldm_entity);
1300 EXPECT_EQ(*start, pldm_entity_get_num_children(
1301 l2a, PLDM_ENTITY_ASSOCIAION_LOGICAL));
1302 start += sizeof(uint8_t);
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +09301303 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Andrew Jeffery9c766792022-08-10 23:12:49 +09301304 entity = reinterpret_cast<pldm_entity*>(start);
1305 EXPECT_EQ(le16toh(entity->entity_type), 5);
1306 EXPECT_EQ(le16toh(entity->entity_instance_num), 2u);
1307 EXPECT_EQ(le16toh(entity->entity_container_id), 2u);
1308 start += sizeof(pldm_entity);
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +09301309 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Andrew Jeffery9c766792022-08-10 23:12:49 +09301310 entity = reinterpret_cast<pldm_entity*>(start);
1311 EXPECT_EQ(le16toh(entity->entity_type), 5u);
1312 EXPECT_EQ(le16toh(entity->entity_instance_num), 3u);
1313 EXPECT_EQ(le16toh(entity->entity_container_id), 2u);
Andrew Jeffery9c766792022-08-10 23:12:49 +09301314
1315 currRecHandle = nextRecHandle;
1316
1317 pldm_pdr_find_record(repo, currRecHandle, &data, &size, &nextRecHandle);
1318 EXPECT_EQ(size, commonSize + (pldm_entity_get_num_children(
1319 l2a, PLDM_ENTITY_ASSOCIAION_PHYSICAL) *
1320 sizeof(pldm_entity)));
1321 start = data;
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +09301322 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Andrew Jeffery9c766792022-08-10 23:12:49 +09301323 hdr = reinterpret_cast<pldm_pdr_hdr*>(start);
1324 EXPECT_EQ(le32toh(hdr->record_handle), 4u);
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);
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +09301328 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Andrew Jeffery9c766792022-08-10 23:12:49 +09301329 containerId = reinterpret_cast<uint16_t*>(start);
1330 EXPECT_EQ(le16toh(*containerId), 2u);
1331 start += sizeof(uint16_t);
1332 EXPECT_EQ(*start, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
1333 start += sizeof(uint8_t);
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +09301334 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Andrew Jeffery9c766792022-08-10 23:12:49 +09301335 entity = reinterpret_cast<pldm_entity*>(start);
1336 EXPECT_EQ(le16toh(entity->entity_type), 2u);
1337 EXPECT_EQ(le16toh(entity->entity_instance_num), 1u);
1338 EXPECT_EQ(le16toh(entity->entity_container_id), 1u);
1339 start += sizeof(pldm_entity);
1340 EXPECT_EQ(*start, pldm_entity_get_num_children(
1341 l2a, PLDM_ENTITY_ASSOCIAION_PHYSICAL));
1342 start += sizeof(uint8_t);
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +09301343 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Andrew Jeffery9c766792022-08-10 23:12:49 +09301344 entity = reinterpret_cast<pldm_entity*>(start);
1345 EXPECT_EQ(le16toh(entity->entity_type), 4u);
1346 EXPECT_EQ(le16toh(entity->entity_instance_num), 1u);
1347 EXPECT_EQ(le16toh(entity->entity_container_id), 2u);
1348 start += sizeof(pldm_entity);
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +09301349 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Andrew Jeffery9c766792022-08-10 23:12:49 +09301350 entity = reinterpret_cast<pldm_entity*>(start);
1351 EXPECT_EQ(le16toh(entity->entity_type), 5u);
1352 EXPECT_EQ(le16toh(entity->entity_instance_num), 1u);
1353 EXPECT_EQ(le16toh(entity->entity_container_id), 2u);
Andrew Jeffery9c766792022-08-10 23:12:49 +09301354
1355 currRecHandle = nextRecHandle;
1356
1357 pldm_pdr_find_record(repo, currRecHandle, &data, &size, &nextRecHandle);
1358 EXPECT_EQ(size, commonSize + (pldm_entity_get_num_children(
1359 l3a, PLDM_ENTITY_ASSOCIAION_PHYSICAL) *
1360 sizeof(pldm_entity)));
1361 start = data;
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +09301362 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Andrew Jeffery9c766792022-08-10 23:12:49 +09301363 hdr = reinterpret_cast<pldm_pdr_hdr*>(start);
1364 EXPECT_EQ(le32toh(hdr->record_handle), 5u);
1365 EXPECT_EQ(hdr->type, PLDM_PDR_ENTITY_ASSOCIATION);
1366 EXPECT_EQ(le16toh(hdr->length), size - sizeof(struct pldm_pdr_hdr));
1367 start += sizeof(pldm_pdr_hdr);
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +09301368 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Andrew Jeffery9c766792022-08-10 23:12:49 +09301369 containerId = reinterpret_cast<uint16_t*>(start);
1370 EXPECT_EQ(le16toh(*containerId), 3u);
1371 start += sizeof(uint16_t);
1372 EXPECT_EQ(*start, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
1373 start += sizeof(uint8_t);
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +09301374 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Andrew Jeffery9c766792022-08-10 23:12:49 +09301375 entity = reinterpret_cast<pldm_entity*>(start);
1376 EXPECT_EQ(le16toh(entity->entity_type), 4u);
1377 EXPECT_EQ(le16toh(entity->entity_instance_num), 1u);
1378 EXPECT_EQ(le16toh(entity->entity_container_id), 2u);
1379 start += sizeof(pldm_entity);
1380 EXPECT_EQ(*start, pldm_entity_get_num_children(
1381 l3a, PLDM_ENTITY_ASSOCIAION_PHYSICAL));
1382 start += sizeof(uint8_t);
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +09301383 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Andrew Jeffery9c766792022-08-10 23:12:49 +09301384 entity = reinterpret_cast<pldm_entity*>(start);
1385 EXPECT_EQ(le16toh(entity->entity_type), 6u);
1386 EXPECT_EQ(le16toh(entity->entity_instance_num), 1u);
1387 EXPECT_EQ(le16toh(entity->entity_container_id), 3u);
Andrew Jeffery9c766792022-08-10 23:12:49 +09301388
1389 currRecHandle = nextRecHandle;
1390
1391 pldm_pdr_find_record(repo, currRecHandle, &data, &size, &nextRecHandle);
1392 EXPECT_EQ(size, commonSize + (pldm_entity_get_num_children(
1393 l3b, PLDM_ENTITY_ASSOCIAION_LOGICAL) *
1394 sizeof(pldm_entity)));
1395 start = data;
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +09301396 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Andrew Jeffery9c766792022-08-10 23:12:49 +09301397 hdr = reinterpret_cast<pldm_pdr_hdr*>(start);
1398 EXPECT_EQ(le32toh(hdr->record_handle), 6u);
1399 EXPECT_EQ(hdr->type, PLDM_PDR_ENTITY_ASSOCIATION);
1400 EXPECT_EQ(le16toh(hdr->length), size - sizeof(struct pldm_pdr_hdr));
1401 start += sizeof(pldm_pdr_hdr);
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +09301402 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Andrew Jeffery9c766792022-08-10 23:12:49 +09301403 containerId = reinterpret_cast<uint16_t*>(start);
1404 EXPECT_EQ(le16toh(*containerId), 4u);
1405 start += sizeof(uint16_t);
1406 EXPECT_EQ(*start, PLDM_ENTITY_ASSOCIAION_LOGICAL);
1407 start += sizeof(uint8_t);
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +09301408 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Andrew Jeffery9c766792022-08-10 23:12:49 +09301409 entity = reinterpret_cast<pldm_entity*>(start);
1410 EXPECT_EQ(le16toh(entity->entity_type), 5u);
1411 EXPECT_EQ(le16toh(entity->entity_instance_num), 1u);
1412 EXPECT_EQ(le16toh(entity->entity_container_id), 2u);
1413 start += sizeof(pldm_entity);
1414 EXPECT_EQ(*start, pldm_entity_get_num_children(
1415 l3b, PLDM_ENTITY_ASSOCIAION_LOGICAL));
1416 start += sizeof(uint8_t);
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +09301417 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Andrew Jeffery9c766792022-08-10 23:12:49 +09301418 entity = reinterpret_cast<pldm_entity*>(start);
1419 EXPECT_EQ(le16toh(entity->entity_type), 7u);
1420 EXPECT_EQ(le16toh(entity->entity_instance_num), 1u);
1421 EXPECT_EQ(le16toh(entity->entity_container_id), 4u);
1422
1423 EXPECT_EQ(nextRecHandle, 0u);
1424
1425 pldm_pdr_destroy(repo);
1426 pldm_entity_association_tree_destroy(tree);
1427}
1428
1429TEST(EntityAssociationPDR, testFind)
1430{
1431 // 1
1432 // |
1433 // 2--3--4
1434 // |
1435 // 5--6--7
1436 // | |
1437 // 8 9
1438
1439 pldm_entity entities[9]{};
1440
1441 entities[0].entity_type = 1;
1442 entities[1].entity_type = 2;
1443 entities[2].entity_type = 2;
1444 entities[3].entity_type = 3;
1445 entities[4].entity_type = 4;
1446 entities[5].entity_type = 5;
1447 entities[6].entity_type = 5;
1448 entities[7].entity_type = 6;
1449 entities[8].entity_type = 7;
1450
1451 auto tree = pldm_entity_association_tree_init();
1452
1453 auto l1 = pldm_entity_association_tree_add(
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06001454 tree, &entities[0], 0xffff, nullptr, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
Andrew Jeffery9c766792022-08-10 23:12:49 +09301455 EXPECT_NE(l1, nullptr);
1456 auto l2a = pldm_entity_association_tree_add(
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06001457 tree, &entities[1], 0xffff, l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
Andrew Jeffery9c766792022-08-10 23:12:49 +09301458 EXPECT_NE(l2a, nullptr);
1459 auto l2b = pldm_entity_association_tree_add(
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06001460 tree, &entities[2], 0xffff, l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
Andrew Jeffery9c766792022-08-10 23:12:49 +09301461 EXPECT_NE(l2b, nullptr);
1462 auto l2c = pldm_entity_association_tree_add(
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06001463 tree, &entities[3], 0xffff, l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
Andrew Jeffery9c766792022-08-10 23:12:49 +09301464 EXPECT_NE(l2c, nullptr);
1465 auto l3a = pldm_entity_association_tree_add(
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06001466 tree, &entities[4], 0xffff, l2a, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
Andrew Jeffery9c766792022-08-10 23:12:49 +09301467 EXPECT_NE(l3a, nullptr);
1468 auto l3b = pldm_entity_association_tree_add(
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06001469 tree, &entities[5], 0xffff, l2a, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
Andrew Jeffery9c766792022-08-10 23:12:49 +09301470 EXPECT_NE(l3b, nullptr);
1471 auto l3c = pldm_entity_association_tree_add(
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06001472 tree, &entities[6], 0xffff, l2a, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
Andrew Jeffery9c766792022-08-10 23:12:49 +09301473 EXPECT_NE(l3c, nullptr);
1474 auto l4a = pldm_entity_association_tree_add(
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06001475 tree, &entities[7], 0xffff, l3a, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
Andrew Jeffery9c766792022-08-10 23:12:49 +09301476 EXPECT_NE(l4a, nullptr);
1477 auto l4b = pldm_entity_association_tree_add(
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06001478 tree, &entities[8], 0xffff, l3b, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
Andrew Jeffery9c766792022-08-10 23:12:49 +09301479 EXPECT_NE(l4b, nullptr);
1480
1481 pldm_entity entity{};
1482
1483 entity.entity_type = 1;
1484 entity.entity_instance_num = 1;
1485 auto result = pldm_entity_association_tree_find(tree, &entity);
1486 EXPECT_EQ(result, l1);
1487 EXPECT_EQ(entity.entity_container_id, 0);
1488
1489 entity.entity_type = 2;
1490 entity.entity_instance_num = 1;
1491 result = pldm_entity_association_tree_find(tree, &entity);
1492 EXPECT_EQ(result, l2a);
1493 EXPECT_EQ(entity.entity_container_id, 1);
1494 entity.entity_type = 2;
1495 entity.entity_instance_num = 2;
1496 result = pldm_entity_association_tree_find(tree, &entity);
1497 EXPECT_EQ(result, l2b);
1498 EXPECT_EQ(entity.entity_container_id, 1);
1499 entity.entity_type = 3;
1500 entity.entity_instance_num = 1;
1501 result = pldm_entity_association_tree_find(tree, &entity);
1502 EXPECT_EQ(result, l2c);
1503 EXPECT_EQ(entity.entity_container_id, 1);
1504
1505 entity.entity_type = 7;
1506 entity.entity_instance_num = 1;
1507 result = pldm_entity_association_tree_find(tree, &entity);
1508 EXPECT_EQ(result, l4b);
1509 EXPECT_EQ(entity.entity_container_id, 4);
1510
1511 pldm_entity_association_tree_destroy(tree);
1512}
1513
Andrew Jeffery60582152024-09-22 21:16:38 +09301514#ifdef LIBPLDM_API_TESTING
Andrew Jeffery9c766792022-08-10 23:12:49 +09301515TEST(EntityAssociationPDR, testCopyTree)
1516{
1517 pldm_entity entities[4]{};
Andrew Jeffery60582152024-09-22 21:16:38 +09301518 int rc;
1519
Andrew Jeffery9c766792022-08-10 23:12:49 +09301520 entities[0].entity_type = 1;
1521 entities[1].entity_type = 2;
1522 entities[2].entity_type = 2;
1523 entities[3].entity_type = 3;
1524
1525 auto orgTree = pldm_entity_association_tree_init();
1526 auto newTree = pldm_entity_association_tree_init();
1527 auto l1 =
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06001528 pldm_entity_association_tree_add(orgTree, &entities[0], 0xffff, nullptr,
Andrew Jeffery9c766792022-08-10 23:12:49 +09301529 PLDM_ENTITY_ASSOCIAION_PHYSICAL);
1530 EXPECT_NE(l1, nullptr);
1531 auto l2a = pldm_entity_association_tree_add(
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06001532 orgTree, &entities[1], 0xffff, l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
Andrew Jeffery9c766792022-08-10 23:12:49 +09301533 EXPECT_NE(l2a, nullptr);
1534 auto l2b = pldm_entity_association_tree_add(
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06001535 orgTree, &entities[2], 0xffff, l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
Andrew Jeffery9c766792022-08-10 23:12:49 +09301536 EXPECT_NE(l2b, nullptr);
1537 auto l2c = pldm_entity_association_tree_add(
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06001538 orgTree, &entities[3], 0xffff, l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
Andrew Jeffery9c766792022-08-10 23:12:49 +09301539 EXPECT_NE(l2c, nullptr);
1540 size_t orgNum{};
1541 pldm_entity* orgOut = nullptr;
1542 pldm_entity_association_tree_visit(orgTree, &orgOut, &orgNum);
1543 EXPECT_EQ(orgNum, 4u);
1544
Andrew Jeffery60582152024-09-22 21:16:38 +09301545 rc = pldm_entity_association_tree_copy_root_check(orgTree, newTree);
1546 ASSERT_EQ(rc, 0);
Andrew Jeffery9c766792022-08-10 23:12:49 +09301547 size_t newNum{};
1548 pldm_entity* newOut = nullptr;
1549 pldm_entity_association_tree_visit(newTree, &newOut, &newNum);
1550 EXPECT_EQ(newNum, orgNum);
1551 EXPECT_EQ(newOut[0].entity_type, 1u);
1552 EXPECT_EQ(newOut[0].entity_instance_num, 1u);
1553 EXPECT_EQ(newOut[0].entity_container_id, 0u);
1554 free(orgOut);
1555 free(newOut);
1556 pldm_entity_association_tree_destroy(orgTree);
1557 pldm_entity_association_tree_destroy(newTree);
1558}
Andrew Jeffery60582152024-09-22 21:16:38 +09301559#endif
Andrew Jeffery9c766792022-08-10 23:12:49 +09301560
1561TEST(EntityAssociationPDR, testExtract)
1562{
1563 std::vector<uint8_t> pdr{};
1564 pdr.resize(sizeof(pldm_pdr_hdr) + sizeof(pldm_pdr_entity_association) +
Andrew Jeffery9e566592024-10-02 16:38:51 +09301565 sizeof(pldm_entity) * 5);
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +09301566 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Andrew Jeffery9c766792022-08-10 23:12:49 +09301567 pldm_pdr_hdr* hdr = reinterpret_cast<pldm_pdr_hdr*>(pdr.data());
1568 hdr->type = PLDM_PDR_ENTITY_ASSOCIATION;
1569 hdr->length =
Andrew Jeffery9e566592024-10-02 16:38:51 +09301570 htole16(sizeof(pldm_pdr_entity_association) + sizeof(pldm_entity) * 5);
Andrew Jeffery9c766792022-08-10 23:12:49 +09301571
1572 pldm_pdr_entity_association* e =
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +09301573 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Andrew Jeffery9c766792022-08-10 23:12:49 +09301574 reinterpret_cast<pldm_pdr_entity_association*>(pdr.data() +
1575 sizeof(pldm_pdr_hdr));
1576 e->container_id = htole16(1);
1577 e->num_children = 5;
1578 e->container.entity_type = htole16(1);
1579 e->container.entity_instance_num = htole16(1);
1580 e->container.entity_container_id = htole16(0);
1581
1582 pldm_entity* entity = e->children;
1583 entity->entity_type = htole16(2);
1584 entity->entity_instance_num = htole16(1);
1585 entity->entity_container_id = htole16(1);
1586 ++entity;
1587 entity->entity_type = htole16(3);
1588 entity->entity_instance_num = htole16(1);
1589 entity->entity_container_id = htole16(1);
1590 ++entity;
1591 entity->entity_type = htole16(4);
1592 entity->entity_instance_num = htole16(1);
1593 entity->entity_container_id = htole16(1);
1594 ++entity;
1595 entity->entity_type = htole16(5);
1596 entity->entity_instance_num = htole16(1);
1597 entity->entity_container_id = htole16(1);
1598 ++entity;
1599 entity->entity_type = htole16(6);
1600 entity->entity_instance_num = htole16(1);
1601 entity->entity_container_id = htole16(1);
1602
1603 size_t num{};
1604 pldm_entity* out = nullptr;
1605 pldm_entity_association_pdr_extract(pdr.data(), pdr.size(), &num, &out);
1606 EXPECT_EQ(num, (unsigned)e->num_children + 1);
1607 EXPECT_EQ(out[0].entity_type, 1u);
1608 EXPECT_EQ(out[0].entity_instance_num, 1u);
1609 EXPECT_EQ(out[0].entity_container_id, 0u);
1610 EXPECT_EQ(out[1].entity_type, 2u);
1611 EXPECT_EQ(out[1].entity_instance_num, 1u);
1612 EXPECT_EQ(out[1].entity_container_id, 1u);
1613 EXPECT_EQ(out[2].entity_type, 3u);
1614 EXPECT_EQ(out[2].entity_instance_num, 1u);
1615 EXPECT_EQ(out[2].entity_container_id, 1u);
1616 EXPECT_EQ(out[3].entity_type, 4u);
1617 EXPECT_EQ(out[3].entity_instance_num, 1u);
1618 EXPECT_EQ(out[3].entity_container_id, 1u);
1619 EXPECT_EQ(out[4].entity_type, 5u);
1620 EXPECT_EQ(out[4].entity_instance_num, 1u);
1621 EXPECT_EQ(out[4].entity_container_id, 1u);
1622 EXPECT_EQ(out[5].entity_type, 6u);
1623 EXPECT_EQ(out[5].entity_instance_num, 1u);
1624 EXPECT_EQ(out[5].entity_container_id, 1u);
1625
1626 free(out);
1627}
1628
1629TEST(EntityAssociationPDR, testGetChildren)
1630{
1631 pldm_entity entities[4]{};
1632 entities[0].entity_type = 1;
1633 entities[1].entity_type = 2;
1634 entities[2].entity_type = 2;
1635 entities[3].entity_type = 3;
1636
1637 auto tree = pldm_entity_association_tree_init();
1638 auto l1 = pldm_entity_association_tree_add(
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06001639 tree, &entities[0], 0xffff, nullptr, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
Andrew Jeffery9c766792022-08-10 23:12:49 +09301640 EXPECT_NE(l1, nullptr);
1641 auto l2a = pldm_entity_association_tree_add(
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06001642 tree, &entities[1], 0xffff, l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
Andrew Jeffery9c766792022-08-10 23:12:49 +09301643 EXPECT_NE(l2a, nullptr);
1644 auto l2b = pldm_entity_association_tree_add(
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06001645 tree, &entities[2], 0xffff, l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
Andrew Jeffery9c766792022-08-10 23:12:49 +09301646 EXPECT_NE(l2b, nullptr);
1647 auto l2c = pldm_entity_association_tree_add(
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06001648 tree, &entities[3], 0xffff, l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
Andrew Jeffery9c766792022-08-10 23:12:49 +09301649 EXPECT_NE(l2c, nullptr);
1650
1651 pldm_entity et1;
1652 et1.entity_type = 2;
1653 et1.entity_instance_num = 1;
1654 EXPECT_EQ(true, pldm_is_current_parent_child(l1, &et1));
1655
1656 pldm_entity et2;
1657 et2.entity_type = 2;
1658 et2.entity_instance_num = 2;
1659 EXPECT_EQ(true, pldm_is_current_parent_child(l1, &et2));
1660
1661 pldm_entity et3;
1662 et3.entity_type = 2;
1663 et3.entity_instance_num = 3;
1664 EXPECT_EQ(false, pldm_is_current_parent_child(l1, &et3));
1665
1666 pldm_entity_association_tree_destroy(tree);
1667}
1668
1669TEST(EntityAssociationPDR, testEntityInstanceNumber)
1670{
1671 pldm_entity entities[9]{};
1672
1673 entities[0].entity_type = 1;
1674 entities[1].entity_type = 2;
1675 entities[2].entity_type = 2;
1676 entities[3].entity_type = 2;
1677 entities[4].entity_type = 2;
1678 entities[5].entity_type = 2;
1679 entities[6].entity_type = 2;
1680 entities[7].entity_type = 3;
1681 entities[8].entity_type = 3;
1682
1683 auto tree = pldm_entity_association_tree_init();
1684 auto repo = pldm_pdr_init();
1685
1686 uint16_t terminusHdl{};
1687 uint16_t entityType{};
1688 uint16_t entityInstanceNum{};
1689 uint16_t containerId{};
1690
1691 auto node = pldm_entity_association_tree_add(
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06001692 tree, &entities[0], 0xffff, nullptr, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
Andrew Jeffery9c766792022-08-10 23:12:49 +09301693 EXPECT_NE(node, nullptr);
1694
1695 auto l1 = pldm_entity_association_tree_add(tree, &entities[1], 63, node,
1696 PLDM_ENTITY_ASSOCIAION_PHYSICAL);
Andrew Jeffery14d29842023-07-17 15:29:32 +09301697 uint32_t first = 1;
Andrew Jefferye7f55112024-06-20 16:16:01 +09301698 EXPECT_EQ(pldm_pdr_add_fru_record_set(repo, 1, 1, entities[1].entity_type,
1699 entities[1].entity_instance_num,
1700 entities[1].entity_container_id,
1701 &first),
Andrew Jeffery14d29842023-07-17 15:29:32 +09301702 0);
Andrew Jeffery9c766792022-08-10 23:12:49 +09301703 EXPECT_NE(l1, nullptr);
1704 EXPECT_EQ(entities[1].entity_instance_num, 63);
1705 EXPECT_EQ(first, pldm_pdr_get_record_handle(
1706 repo, pldm_pdr_fru_record_set_find_by_rsi(
1707 repo, 1, &terminusHdl, &entityType,
1708 &entityInstanceNum, &containerId)));
1709 EXPECT_EQ(entityType, 2);
1710 EXPECT_EQ(entityInstanceNum, 63);
1711
1712 auto l2 = pldm_entity_association_tree_add(tree, &entities[2], 37, node,
1713 PLDM_ENTITY_ASSOCIAION_PHYSICAL);
Andrew Jeffery14d29842023-07-17 15:29:32 +09301714 uint32_t second = 2;
Andrew Jefferye7f55112024-06-20 16:16:01 +09301715 EXPECT_EQ(pldm_pdr_add_fru_record_set(repo, 1, 2, entities[2].entity_type,
1716 entities[2].entity_instance_num,
1717 entities[2].entity_container_id,
1718 &second),
Andrew Jeffery14d29842023-07-17 15:29:32 +09301719 0);
Andrew Jeffery9c766792022-08-10 23:12:49 +09301720 EXPECT_NE(l2, nullptr);
1721 EXPECT_EQ(entities[2].entity_instance_num, 37);
1722 EXPECT_EQ(second, pldm_pdr_get_record_handle(
1723 repo, pldm_pdr_fru_record_set_find_by_rsi(
1724 repo, 2, &terminusHdl, &entityType,
1725 &entityInstanceNum, &containerId)));
1726 EXPECT_EQ(entityType, 2);
1727 EXPECT_EQ(entityInstanceNum, 37);
1728
1729 auto l3 = pldm_entity_association_tree_add(tree, &entities[3], 44, node,
1730 PLDM_ENTITY_ASSOCIAION_PHYSICAL);
Andrew Jeffery14d29842023-07-17 15:29:32 +09301731 uint32_t third = 3;
Andrew Jefferye7f55112024-06-20 16:16:01 +09301732 EXPECT_EQ(pldm_pdr_add_fru_record_set(repo, 1, 3, entities[3].entity_type,
1733 entities[3].entity_instance_num,
1734 entities[3].entity_container_id,
1735 &third),
Andrew Jeffery14d29842023-07-17 15:29:32 +09301736 0);
Andrew Jeffery9c766792022-08-10 23:12:49 +09301737 EXPECT_NE(l3, nullptr);
1738 EXPECT_EQ(entities[3].entity_instance_num, 44);
1739 EXPECT_EQ(third, pldm_pdr_get_record_handle(
1740 repo, pldm_pdr_fru_record_set_find_by_rsi(
1741 repo, 3, &terminusHdl, &entityType,
1742 &entityInstanceNum, &containerId)));
1743 EXPECT_EQ(entityType, 2);
1744 EXPECT_EQ(entityInstanceNum, 44);
1745
1746 auto l4 = pldm_entity_association_tree_add(tree, &entities[4], 89, node,
1747 PLDM_ENTITY_ASSOCIAION_PHYSICAL);
Andrew Jeffery14d29842023-07-17 15:29:32 +09301748 uint32_t fourth = 4;
Andrew Jefferye7f55112024-06-20 16:16:01 +09301749 EXPECT_EQ(pldm_pdr_add_fru_record_set(repo, 1, 4, entities[4].entity_type,
1750 entities[4].entity_instance_num,
1751 entities[4].entity_container_id,
1752 &fourth),
Andrew Jeffery14d29842023-07-17 15:29:32 +09301753 0);
Andrew Jeffery9c766792022-08-10 23:12:49 +09301754 EXPECT_NE(l4, nullptr);
1755 EXPECT_EQ(entities[4].entity_instance_num, 89);
1756 EXPECT_EQ(fourth, pldm_pdr_get_record_handle(
1757 repo, pldm_pdr_fru_record_set_find_by_rsi(
1758 repo, 4, &terminusHdl, &entityType,
1759 &entityInstanceNum, &containerId)));
1760 EXPECT_EQ(entityType, 2);
1761 EXPECT_EQ(entityInstanceNum, 89);
1762
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06001763 auto l5 = pldm_entity_association_tree_add(tree, &entities[5], 0xffff, node,
Andrew Jeffery9c766792022-08-10 23:12:49 +09301764 PLDM_ENTITY_ASSOCIAION_PHYSICAL);
Andrew Jeffery14d29842023-07-17 15:29:32 +09301765 uint32_t fifth = 5;
Andrew Jefferye7f55112024-06-20 16:16:01 +09301766 EXPECT_EQ(pldm_pdr_add_fru_record_set(repo, 1, 5, entities[5].entity_type,
1767 entities[5].entity_instance_num,
1768 entities[5].entity_container_id,
1769 &fifth),
Andrew Jeffery14d29842023-07-17 15:29:32 +09301770 0);
Andrew Jeffery9c766792022-08-10 23:12:49 +09301771 EXPECT_NE(l5, nullptr);
1772 EXPECT_EQ(entities[5].entity_instance_num, 90);
1773 EXPECT_EQ(fifth, pldm_pdr_get_record_handle(
1774 repo, pldm_pdr_fru_record_set_find_by_rsi(
1775 repo, 5, &terminusHdl, &entityType,
1776 &entityInstanceNum, &containerId)));
1777 EXPECT_EQ(entityType, 2);
1778 EXPECT_EQ(entityInstanceNum, 90);
1779
1780 auto l6 = pldm_entity_association_tree_add(tree, &entities[6], 90, node,
1781 PLDM_ENTITY_ASSOCIAION_PHYSICAL);
1782 EXPECT_EQ(l6, nullptr);
1783
1784 auto l7 = pldm_entity_association_tree_add(tree, &entities[7], 100, l1,
1785 PLDM_ENTITY_ASSOCIAION_PHYSICAL);
Andrew Jeffery14d29842023-07-17 15:29:32 +09301786 uint32_t seventh = 7;
Andrew Jefferye7f55112024-06-20 16:16:01 +09301787 EXPECT_EQ(pldm_pdr_add_fru_record_set(repo, 1, 7, entities[7].entity_type,
1788 entities[7].entity_instance_num,
1789 entities[7].entity_container_id,
1790 &seventh),
Andrew Jeffery14d29842023-07-17 15:29:32 +09301791 0);
Andrew Jeffery9c766792022-08-10 23:12:49 +09301792 EXPECT_NE(l7, nullptr);
1793 EXPECT_EQ(entities[7].entity_instance_num, 100);
1794 EXPECT_EQ(seventh, pldm_pdr_get_record_handle(
1795 repo, pldm_pdr_fru_record_set_find_by_rsi(
1796 repo, 7, &terminusHdl, &entityType,
1797 &entityInstanceNum, &containerId)));
1798 EXPECT_EQ(entityType, 3);
1799 EXPECT_EQ(entityInstanceNum, 100);
1800
1801 auto l8 = pldm_entity_association_tree_add(tree, &entities[8], 100, l2,
1802 PLDM_ENTITY_ASSOCIAION_PHYSICAL);
Andrew Jeffery14d29842023-07-17 15:29:32 +09301803 uint32_t eighth = 8;
Andrew Jefferye7f55112024-06-20 16:16:01 +09301804 EXPECT_EQ(pldm_pdr_add_fru_record_set(repo, 1, 8, entities[8].entity_type,
1805 entities[8].entity_instance_num,
1806 entities[8].entity_container_id,
1807 &eighth),
Andrew Jeffery14d29842023-07-17 15:29:32 +09301808 0);
Andrew Jeffery9c766792022-08-10 23:12:49 +09301809 EXPECT_NE(l8, nullptr);
1810 EXPECT_EQ(entities[8].entity_instance_num, 100);
1811 EXPECT_EQ(eighth, pldm_pdr_get_record_handle(
1812 repo, pldm_pdr_fru_record_set_find_by_rsi(
1813 repo, 8, &terminusHdl, &entityType,
1814 &entityInstanceNum, &containerId)));
1815 EXPECT_EQ(entityType, 3);
1816 EXPECT_EQ(entityInstanceNum, 100);
1817
1818 pldm_pdr_destroy(repo);
1819 pldm_entity_association_tree_destroy(tree);
1820}
Pavithra Barithaya5dc02572023-05-19 09:24:36 -05001821
Andrew Jeffery14a5fe82023-06-26 15:31:37 +09301822#ifdef LIBPLDM_API_TESTING
Pavithra Barithaya8cf70452023-06-22 04:36:19 -05001823TEST(EntityAssociationPDR, testFindChildContainerID)
Pavithra Barithaya5dc02572023-05-19 09:24:36 -05001824{
1825 pldm_entity entities[3]{};
1826 entities[0].entity_type = 1;
1827 entities[1].entity_type = 2;
1828 entities[2].entity_type = 3;
1829 entities[1].entity_container_id = 2;
1830 entities[1].entity_instance_num = 1;
1831
1832 auto tree = pldm_entity_association_tree_init();
1833 auto l1 = pldm_entity_association_tree_add_entity(
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06001834 tree, &entities[0], 0xffff, nullptr, PLDM_ENTITY_ASSOCIAION_LOGICAL,
1835 false, true, 0xffff);
Pavithra Barithaya5dc02572023-05-19 09:24:36 -05001836
1837 EXPECT_NE(l1, nullptr);
1838 auto l2 = pldm_entity_association_tree_add_entity(
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06001839 tree, &entities[1], 0xffff, l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL, false,
1840 false, 0xffff);
Pavithra Barithaya5dc02572023-05-19 09:24:36 -05001841 EXPECT_NE(l2, nullptr);
1842 auto l3 = pldm_entity_association_tree_add_entity(
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06001843 tree, &entities[2], 0xffff, l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL, false,
1844 true, 0xffff);
Pavithra Barithaya5dc02572023-05-19 09:24:36 -05001845 EXPECT_NE(l3, nullptr);
1846
1847 EXPECT_EQ(pldm_entity_get_num_children(l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL),
1848 2);
1849
1850 auto repo = pldm_pdr_init();
Andrew Jefferyd72ea4b2024-06-24 21:33:33 +09301851 int rc = pldm_entity_association_pdr_add(tree, repo, false, 1);
Andrew Jeffery255f6542023-08-10 15:46:54 +09301852 ASSERT_EQ(rc, 0);
Pavithra Barithaya5dc02572023-05-19 09:24:36 -05001853
1854 EXPECT_EQ(pldm_pdr_get_record_count(repo), 1u);
1855
1856 uint16_t container_id{};
Pavithra Barithaya8cf70452023-06-22 04:36:19 -05001857 pldm_pdr_find_child_container_id_index_range_exclude(
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06001858 repo, 1, 1, 0, 0x01000000, 0x01ffffff, &container_id);
Pavithra Barithaya5dc02572023-05-19 09:24:36 -05001859 EXPECT_EQ(container_id, 2);
1860
1861 uint16_t container_id1{};
Pavithra Barithaya8cf70452023-06-22 04:36:19 -05001862 pldm_pdr_find_child_container_id_index_range_exclude(
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06001863 repo, 1, 1, 0, 0x00000001, 0x00ffffff, &container_id1);
Pavithra Barithaya5dc02572023-05-19 09:24:36 -05001864 EXPECT_EQ(container_id1, 0);
1865
1866 pldm_pdr_destroy(repo);
1867 pldm_entity_association_tree_destroy(tree);
1868}
Andrew Jeffery14a5fe82023-06-26 15:31:37 +09301869#endif
Pavithra Barithaya39eb3222023-11-17 03:30:27 -06001870
1871TEST(EntityAssociationPDR, testNodeAddCheck)
1872{
1873 // pldm_entity entities[4]{};
1874 pldm_entity* entities = (pldm_entity*)malloc(sizeof(pldm_entity) * 4);
1875 entities[0].entity_type = 1;
1876 entities[1].entity_type = 2;
1877 entities[2].entity_type = 2;
1878 entities[3].entity_type = 3;
1879
1880 auto tree = pldm_entity_association_tree_init();
1881
1882 auto l1 = pldm_entity_association_tree_add(
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06001883 tree, &entities[0], 0xffff, nullptr, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
Pavithra Barithaya39eb3222023-11-17 03:30:27 -06001884 EXPECT_NE(l1, nullptr);
1885 auto l2a = pldm_entity_association_tree_add(
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06001886 tree, &entities[1], 0xffff, l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
Pavithra Barithaya39eb3222023-11-17 03:30:27 -06001887 EXPECT_NE(l2a, nullptr);
1888 auto l2b = pldm_entity_association_tree_add(
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06001889 tree, &entities[2], 0xffff, l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
Pavithra Barithaya39eb3222023-11-17 03:30:27 -06001890 EXPECT_NE(l2b, nullptr);
1891 auto l2c = pldm_entity_association_tree_add(
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06001892 tree, &entities[3], 0xffff, l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
Pavithra Barithaya39eb3222023-11-17 03:30:27 -06001893 EXPECT_NE(l2c, nullptr);
1894
1895 auto repo = pldm_pdr_init();
1896
1897 EXPECT_EQ(pldm_entity_association_pdr_add_from_node_with_record_handle(
1898 l1, repo, &entities, 4, false, 1, 0),
1899 0);
1900 EXPECT_EQ(pldm_entity_association_pdr_add_from_node_with_record_handle(
1901 l1, repo, &entities, 4, false, 1, 2),
1902 0);
1903 EXPECT_EQ(pldm_entity_association_pdr_add_from_node_with_record_handle(
1904 l1, repo, &entities, 4, false, 1, 23),
1905 0);
1906 EXPECT_EQ(pldm_entity_association_pdr_add_from_node_with_record_handle(
1907 l1, repo, &entities, 4, false, 1, 34),
1908 0);
1909
1910 EXPECT_EQ(pldm_pdr_get_record_count(repo), 4u);
1911
1912 uint8_t* outData = nullptr;
1913 uint32_t size{};
1914 uint32_t nextRecHdl{};
1915 auto hdl = pldm_pdr_find_record(repo, 0, &outData, &size, &nextRecHdl);
1916 EXPECT_NE(hdl, nullptr);
1917
1918 outData = nullptr;
1919 auto hdl1 = pldm_pdr_find_record(repo, 2, &outData, &size, &nextRecHdl);
1920 EXPECT_NE(hdl1, nullptr);
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +09301921 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Pavithra Barithaya39eb3222023-11-17 03:30:27 -06001922 pldm_pdr_hdr* hdr = reinterpret_cast<pldm_pdr_hdr*>(outData);
1923 EXPECT_EQ(hdr->record_handle, 2);
1924
1925 outData = nullptr;
1926 auto hdl2 = pldm_pdr_find_record(repo, 23, &outData, &size, &nextRecHdl);
1927 EXPECT_NE(hdl2, nullptr);
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +09301928 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Pavithra Barithaya39eb3222023-11-17 03:30:27 -06001929 pldm_pdr_hdr* hdr1 = reinterpret_cast<pldm_pdr_hdr*>(outData);
1930 EXPECT_EQ(hdr1->record_handle, 23);
1931
1932 outData = nullptr;
1933 auto hdl3 = pldm_pdr_find_record(repo, 3, &outData, &size, &nextRecHdl);
1934 EXPECT_EQ(hdl3, nullptr);
1935
1936 free(entities);
1937 pldm_pdr_destroy(repo);
1938 pldm_entity_association_tree_destroy(tree);
1939}
Varsha Kaverappa37552b92024-02-12 05:06:06 -06001940
Andrew Jeffery1111a972024-06-03 13:39:18 +09301941#ifdef LIBPLDM_API_TESTING
Varsha Kaverappa37552b92024-02-12 05:06:06 -06001942TEST(EntityAssociationPDR, testAddContainedEntityRemotePDR)
1943{
1944 // pldm_entity entities[5]{};
1945 pldm_entity* entities = (pldm_entity*)malloc(sizeof(pldm_entity) * 5);
1946 entities[0].entity_type = 1;
1947 entities[1].entity_type = 2;
1948 entities[2].entity_type = 3;
1949 entities[3].entity_type = 4;
1950 entities[4].entity_type = 5;
1951
1952 auto tree = pldm_entity_association_tree_init();
1953 auto l1 = pldm_entity_association_tree_add(
1954 tree, &entities[0], 0xffff, nullptr, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
1955 EXPECT_NE(l1, nullptr);
1956 auto l2a = pldm_entity_association_tree_add(
1957 tree, &entities[1], 0xffff, l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
1958 EXPECT_NE(l2a, nullptr);
1959 auto l2b = pldm_entity_association_tree_add(
1960 tree, &entities[2], 0xffff, l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
1961 EXPECT_NE(l2b, nullptr);
1962 auto l2c = pldm_entity_association_tree_add(
1963 tree, &entities[3], 0xffff, l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
1964 EXPECT_NE(l2c, nullptr);
1965 auto l3a = pldm_entity_association_tree_add(
1966 tree, &entities[4], 0xffff, l2a, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
1967 EXPECT_NE(l3a, nullptr);
1968
1969 auto repo = pldm_pdr_init();
1970
1971 EXPECT_EQ(pldm_entity_association_pdr_add_from_node_with_record_handle(
1972 l1, repo, &entities, 5, false, 1, 0),
1973 0);
1974 EXPECT_EQ(pldm_entity_association_pdr_add_from_node_with_record_handle(
1975 l1, repo, &entities, 5, false, 1, 2),
1976 0);
1977 EXPECT_EQ(pldm_entity_association_pdr_add_from_node_with_record_handle(
1978 l1, repo, &entities, 5, false, 1, 23),
1979 0);
1980 EXPECT_EQ(pldm_entity_association_pdr_add_from_node_with_record_handle(
1981 l1, repo, &entities, 5, false, 1, 34),
1982 0);
1983 EXPECT_EQ(pldm_entity_association_pdr_add_from_node_with_record_handle(
1984 l2a, repo, &entities, 5, false, 1, 3),
1985 0);
1986
1987 pldm_entity entity1[1];
1988 entity1[0].entity_type = 2;
1989
1990 EXPECT_EQ(pldm_entity_association_pdr_add_contained_entity_to_remote_pdr(
1991 repo, &entity1[0], 2),
1992 0);
1993
1994 free(entities);
1995 pldm_pdr_destroy(repo);
1996 pldm_entity_association_tree_destroy(tree);
1997}
Andrew Jeffery1111a972024-06-03 13:39:18 +09301998#endif
Varsha Kaverappa37552b92024-02-12 05:06:06 -06001999
Andrew Jeffery1111a972024-06-03 13:39:18 +09302000#ifdef LIBPLDM_API_TESTING
Varsha Kaverappa37552b92024-02-12 05:06:06 -06002001TEST(EntityAssociationPDR, testAddContainedEntityNew)
2002{
2003 // pldm_entity entities[5]{};
2004 pldm_entity* entities = (pldm_entity*)malloc(sizeof(pldm_entity) * 5);
2005 entities[0].entity_type = 1;
2006 entities[1].entity_type = 2;
2007 entities[2].entity_type = 3;
2008 entities[3].entity_type = 4;
2009 entities[4].entity_type = 5;
2010
2011 auto tree = pldm_entity_association_tree_init();
2012 auto l1 = pldm_entity_association_tree_add(
2013 tree, &entities[0], 0xffff, nullptr, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
2014 EXPECT_NE(l1, nullptr);
2015 auto l2a = pldm_entity_association_tree_add(
2016 tree, &entities[1], 0xffff, l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
2017 EXPECT_NE(l2a, nullptr);
2018 auto l2b = pldm_entity_association_tree_add(
2019 tree, &entities[2], 0xffff, l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
2020 EXPECT_NE(l2b, nullptr);
2021 auto l2c = pldm_entity_association_tree_add(
2022 tree, &entities[3], 0xffff, l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
2023 EXPECT_NE(l2c, nullptr);
2024 auto l3a = pldm_entity_association_tree_add(
2025 tree, &entities[4], 0xffff, l2a, PLDM_ENTITY_ASSOCIAION_PHYSICAL);
2026 EXPECT_NE(l3a, nullptr);
2027
2028 auto repo = pldm_pdr_init();
2029
2030 EXPECT_EQ(pldm_entity_association_pdr_add_from_node_with_record_handle(
2031 l1, repo, &entities, 5, false, 1, 0),
2032 0);
2033 EXPECT_EQ(pldm_entity_association_pdr_add_from_node_with_record_handle(
2034 l1, repo, &entities, 5, false, 1, 2),
2035 0);
2036 EXPECT_EQ(pldm_entity_association_pdr_add_from_node_with_record_handle(
2037 l1, repo, &entities, 5, false, 1, 23),
2038 0);
2039 EXPECT_EQ(pldm_entity_association_pdr_add_from_node_with_record_handle(
2040 l1, repo, &entities, 5, false, 1, 34),
2041 0);
2042 EXPECT_EQ(pldm_entity_association_pdr_add_from_node_with_record_handle(
2043 l2a, repo, &entities, 5, false, 1, 3),
2044 0);
2045
2046 uint32_t updated_record_handle = 0;
2047
2048 pldm_entity entity2[1]{};
2049 entity2[0].entity_type = 4;
2050
2051 pldm_entity entity3[1]{};
2052 entity3[0].entity_type = 4;
2053
2054 EXPECT_EQ(pldm_entity_association_pdr_create_new(
2055 repo, 34, &entity2[0], &entity3[0], &updated_record_handle),
2056 0);
2057
2058 EXPECT_EQ(updated_record_handle, 35);
2059
2060 free(entities);
2061 pldm_pdr_destroy(repo);
2062 pldm_entity_association_tree_destroy(tree);
2063}
Andrew Jeffery1111a972024-06-03 13:39:18 +09302064#endif
Varsha Kaverappab31e4c62024-06-25 06:45:46 -05002065
2066#ifdef LIBPLDM_API_TESTING
2067TEST(EntityAssociationPDR, testRemoveContainedEntity)
2068{
2069 struct pldm_entity entities[4] = {
2070 {.entity_type = 1, .entity_instance_num = 1, .entity_container_id = 2},
2071 {.entity_type = 2, .entity_instance_num = 1, .entity_container_id = 2},
2072 {.entity_type = 3, .entity_instance_num = 3, .entity_container_id = 3},
2073 {.entity_type = 4, .entity_instance_num = 1, .entity_container_id = 2}};
2074 struct pldm_entity* base = entities;
2075
2076 auto tree = pldm_entity_association_tree_init();
2077 auto l1 = pldm_entity_association_tree_add_entity(
2078 tree, &entities[0], 0xffff, nullptr, PLDM_ENTITY_ASSOCIAION_LOGICAL,
2079 false, true, 0xffff);
2080
2081 EXPECT_NE(l1, nullptr);
2082 auto l2 = pldm_entity_association_tree_add_entity(
2083 tree, &entities[1], 0xffff, l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL, false,
2084 false, 0xffff);
2085 EXPECT_NE(l2, nullptr);
2086 auto l3 = pldm_entity_association_tree_add_entity(
2087 tree, &entities[2], 0xffff, l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL, false,
2088 true, 0xffff);
2089 EXPECT_NE(l3, nullptr);
2090 auto l4 = pldm_entity_association_tree_add_entity(
2091 tree, &entities[3], 0xffff, l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL, false,
2092 true, 0xffff);
2093 EXPECT_NE(l4, nullptr);
2094
2095 EXPECT_EQ(pldm_entity_get_num_children(l1, PLDM_ENTITY_ASSOCIAION_PHYSICAL),
2096 3);
2097
2098 auto repo = pldm_pdr_init();
2099
2100 EXPECT_EQ(pldm_entity_association_pdr_add_from_node_with_record_handle(
2101 l1, repo, &base, 4, false, 1, 3),
2102 0);
2103
2104 EXPECT_EQ(pldm_pdr_get_record_count(repo), 1u);
2105
Archana Kakani94e2d752024-12-12 08:22:55 -06002106 // Remove first contained entity from the entity association PDR
Varsha Kaverappab31e4c62024-06-25 06:45:46 -05002107 uint32_t removed_record_handle{};
2108 struct pldm_entity entity[1] = {
Archana Kakani94e2d752024-12-12 08:22:55 -06002109 {.entity_type = 4, .entity_instance_num = 1, .entity_container_id = 2}};
Varsha Kaverappab31e4c62024-06-25 06:45:46 -05002110
2111 EXPECT_EQ(pldm_entity_association_pdr_remove_contained_entity(
2112 repo, entity, false, &removed_record_handle),
2113 0);
2114 EXPECT_EQ(removed_record_handle, 3);
2115
Archana Kakani94e2d752024-12-12 08:22:55 -06002116 // Remove second contained entity from the entity association PDR
2117 removed_record_handle = 0;
2118 EXPECT_EQ(pldm_entity_association_pdr_remove_contained_entity(
2119 repo, &entities[1], false, &removed_record_handle),
2120 0);
2121 EXPECT_EQ(removed_record_handle, 3);
2122
2123 // Remove third contained entity from the entity association PDR
2124 removed_record_handle = 0;
2125 EXPECT_EQ(pldm_entity_association_pdr_remove_contained_entity(
2126 repo, &entities[2], false, &removed_record_handle),
2127 0);
2128 EXPECT_EQ(removed_record_handle, 3);
2129
2130 // As all the contained entities are removed the entity association PDR
2131 // also gets deleted
2132 EXPECT_EQ(pldm_pdr_get_record_count(repo), 0u);
2133
Varsha Kaverappab31e4c62024-06-25 06:45:46 -05002134 pldm_pdr_destroy(repo);
2135 pldm_entity_association_tree_destroy(tree);
2136}
2137#endif
Varsha Kaverappa8b53ad92024-06-15 06:36:06 -05002138
2139#ifdef LIBPLDM_API_TESTING
2140TEST(PDRUpdate, testRemoveFruRecord)
2141{
2142 auto repo = pldm_pdr_init();
2143
2144 uint32_t record_handle = 1;
2145 int rc = pldm_pdr_add_fru_record_set(repo, 1, 1, 1, 0, 100, &record_handle);
2146 EXPECT_EQ(rc, 0);
2147 record_handle = 2;
2148 rc = pldm_pdr_add_fru_record_set(repo, 1, 2, 1, 1, 100, &record_handle);
2149 EXPECT_EQ(rc, 0);
2150 record_handle = 3;
2151 rc = pldm_pdr_add_fru_record_set(repo, 1, 3, 1, 2, 100, &record_handle);
2152 EXPECT_EQ(rc, 0);
2153 EXPECT_EQ(pldm_pdr_get_record_count(repo), 3);
2154
2155 uint32_t removed_record_handle{};
2156 rc = pldm_pdr_remove_fru_record_set_by_rsi(repo, 2, false,
2157 &removed_record_handle);
2158 EXPECT_EQ(rc, 0);
2159 EXPECT_EQ(removed_record_handle, 2);
2160 EXPECT_EQ(pldm_pdr_get_record_count(repo), 2);
2161
2162 uint16_t terminusHdl{};
2163 uint16_t entityType{};
2164 uint16_t entityInstanceNum{};
2165 uint16_t containerId{};
2166 auto record = pldm_pdr_fru_record_set_find_by_rsi(
2167 repo, 1, &terminusHdl, &entityType, &entityInstanceNum, &containerId);
2168 EXPECT_NE(record, nullptr);
2169 record_handle = pldm_pdr_get_record_handle(repo, record);
2170 EXPECT_EQ(record_handle, 1);
2171
2172 record = pldm_pdr_fru_record_set_find_by_rsi(
2173 repo, 3, &terminusHdl, &entityType, &entityInstanceNum, &containerId);
2174 EXPECT_NE(record, nullptr);
2175 record_handle = pldm_pdr_get_record_handle(repo, record);
2176 EXPECT_EQ(record_handle, 3);
2177
2178 record = pldm_pdr_fru_record_set_find_by_rsi(
2179 repo, 2, &terminusHdl, &entityType, &entityInstanceNum, &containerId);
2180 EXPECT_EQ(record, nullptr);
2181
2182 rc = pldm_pdr_remove_fru_record_set_by_rsi(repo, 1, false,
2183 &removed_record_handle);
2184 EXPECT_EQ(rc, 0);
2185 EXPECT_EQ(removed_record_handle, 1);
2186
2187 // remove the same record again
2188 removed_record_handle = 5;
2189 rc = pldm_pdr_remove_fru_record_set_by_rsi(repo, 1, false,
2190 &removed_record_handle);
2191 EXPECT_EQ(rc, 0);
2192 EXPECT_NE(removed_record_handle, 1);
2193 EXPECT_EQ(removed_record_handle, 5);
2194
2195 rc = pldm_pdr_remove_fru_record_set_by_rsi(repo, 3, false,
2196 &removed_record_handle);
2197 EXPECT_EQ(rc, 0);
2198 EXPECT_EQ(removed_record_handle, 3);
2199
2200 EXPECT_EQ(pldm_pdr_get_record_count(repo), 0);
2201
2202 pldm_pdr_destroy(repo);
2203}
2204#endif